evas/cserve2: Always return FALSE to can_do_region when
[profile/ivi/evas.git] / src / modules / engines / software_generic / evas_engine.c
1 #include "evas_common.h" /* Also includes international specific stuff */
2 #include "evas_private.h"
3 #ifdef EVAS_CSERVE2
4 #include "evas_cs2_private.h"
5 #endif
6
7 #ifdef HAVE_DLSYM
8 # include <dlfcn.h>      /* dlopen,dlclose,etc */
9
10 # define EVAS_GL 1
11 # define EVAS_GL_NO_GL_H_CHECK 1
12 # include "Evas_GL.h"
13
14 #else
15 # warning software_generic will not be able to have Evas_GL API.
16 #endif
17
18 #ifdef EVAS_GL
19 //----------------------------------//
20 // OSMesa...
21
22 #define OSMESA_MAJOR_VERSION 6
23 #define OSMESA_MINOR_VERSION 5
24 #define OSMESA_PATCH_VERSION 0
25
26 /*
27  * Values for the format parameter of OSMesaCreateContext()
28  * New in version 2.0.
29  */
30 #define OSMESA_COLOR_INDEX      GL_COLOR_INDEX
31 #define OSMESA_RGBA             GL_RGBA
32 #define OSMESA_BGRA             0x1
33 #define OSMESA_ARGB             0x2
34 #define OSMESA_RGB              GL_RGB
35 #define OSMESA_BGR              0x4
36 #define OSMESA_RGB_565          0x5
37
38
39 /*
40  * OSMesaPixelStore() parameters:
41  * New in version 2.0.
42  */
43 #define OSMESA_ROW_LENGTH       0x10
44 #define OSMESA_Y_UP             0x11
45
46
47 /*
48  * Accepted by OSMesaGetIntegerv:
49  */
50 #define OSMESA_WIDTH            0x20
51 #define OSMESA_HEIGHT           0x21
52 #define OSMESA_FORMAT           0x22
53 #define OSMESA_TYPE             0x23
54 #define OSMESA_MAX_WIDTH        0x24  /* new in 4.0 */
55 #define OSMESA_MAX_HEIGHT       0x25  /* new in 4.0 */
56
57
58 typedef void (*OSMESAproc)();
59 typedef struct osmesa_context *OSMesaContext;
60 #endif
61
62 typedef struct _Render_Engine_GL_Surface    Render_Engine_GL_Surface;
63 typedef struct _Render_Engine_GL_Context    Render_Engine_GL_Context;
64
65 struct _Render_Engine_GL_Surface
66 {
67    int     initialized;
68    int     w, h;
69
70 #ifdef EVAS_GL
71    GLenum  internal_fmt;
72 #endif
73    int     internal_cpp;   // Component per pixel.  ie. RGB = 3
74
75    int     depth_bits;
76    int     stencil_bits;
77
78    // Data 
79    void   *buffer;
80
81    Render_Engine_GL_Context   *current_ctx;
82 };
83
84 #ifdef EVAS_GL
85 struct _Render_Engine_GL_Context
86 {
87    int            initialized;
88
89    OSMesaContext  context;
90
91    Render_Engine_GL_Context   *share_ctx;
92
93    Render_Engine_GL_Surface   *current_sfc;
94 };
95
96 //------------------------------------------------------//
97 typedef void                   (*_eng_fn) (void );
98 typedef _eng_fn                (*glsym_func_eng_fn) ();
99 typedef void                   (*glsym_func_void) ();
100 typedef unsigned int           (*glsym_func_uint) ();
101 typedef int                    (*glsym_func_int) ();
102 typedef unsigned char          (*glsym_func_uchar) ();
103 typedef unsigned char         *(*glsym_func_uchar_ptr) ();
104 typedef const unsigned char   *(*glsym_func_const_uchar_ptr) ();
105 typedef char const            *(*glsym_func_char_const_ptr) ();
106 typedef GLboolean              (*glsym_func_bool) ();
107 typedef OSMesaContext          (*glsym_func_osm_ctx) ();
108 //------------------------------------------------------//
109
110 /* Function table for GL APIs */
111 static Evas_GL_API gl_funcs;
112 static void *gl_lib_handle;
113 static int gl_lib_is_gles = 0;
114 static Evas_GL_API gl_funcs;
115
116 //------------------------------------------------------//
117 // OSMesa APIS...
118 static OSMesaContext (*_sym_OSMesaCreateContextExt)             (GLenum format, GLint depthBits, GLint stencilBits, GLint accumBits, OSMesaContext sharelist) = NULL;
119 static void          (*_sym_OSMesaDestroyContext)               (OSMesaContext ctx) = NULL;
120 static GLboolean     (*_sym_OSMesaMakeCurrent)                  (OSMesaContext ctx, void *buffer, GLenum type, GLsizei width, GLsizei height) = NULL;
121 static void          (*_sym_OSMesaPixelStore)                   (GLint pname, GLint value) = NULL;
122 static OSMESAproc    (*_sym_OSMesaGetProcAddress)               (const char *funcName);
123
124
125 //------------------------------------------------------//
126 // GLES 2.0 APIs...
127 static void       (*_sym_glActiveTexture)                       (GLenum texture) = NULL;
128 static void       (*_sym_glAttachShader)                        (GLuint program, GLuint shader) = NULL;
129 static void       (*_sym_glBindAttribLocation)                  (GLuint program, GLuint index, const char* name) = NULL;
130 static void       (*_sym_glBindBuffer)                          (GLenum target, GLuint buffer) = NULL;
131 static void       (*_sym_glBindFramebuffer)                     (GLenum target, GLuint framebuffer) = NULL;
132 static void       (*_sym_glBindRenderbuffer)                    (GLenum target, GLuint renderbuffer) = NULL;
133 static void       (*_sym_glBindTexture)                         (GLenum target, GLuint texture) = NULL;
134 static void       (*_sym_glBlendColor)                          (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL;
135 static void       (*_sym_glBlendEquation)                       (GLenum mode) = NULL;
136 static void       (*_sym_glBlendEquationSeparate)               (GLenum modeRGB, GLenum modeAlpha) = NULL;
137 static void       (*_sym_glBlendFunc)                           (GLenum sfactor, GLenum dfactor) = NULL;
138 static void       (*_sym_glBlendFuncSeparate)                   (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = NULL;
139 static void       (*_sym_glBufferData)                          (GLenum target, GLsizeiptr size, const void* data, GLenum usage) = NULL;
140 static void       (*_sym_glBufferSubData)                       (GLenum target, GLintptr offset, GLsizeiptr size, const void* data) = NULL;
141 static GLenum     (*_sym_glCheckFramebufferStatus)              (GLenum target) = NULL;
142 static void       (*_sym_glClear)                               (GLbitfield mask) = NULL;
143 static void       (*_sym_glClearColor)                          (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = NULL;
144 static void       (*_sym_glClearDepthf)                         (GLclampf depth) = NULL;
145 static void       (*_sym_glClearStencil)                        (GLint s) = NULL;
146 static void       (*_sym_glColorMask)                           (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = NULL;
147 static void       (*_sym_glCompileShader)                       (GLuint shader) = NULL;
148 static void       (*_sym_glCompressedTexImage2D)                (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) = NULL;
149 static void       (*_sym_glCompressedTexSubImage2D)             (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) = NULL;
150 static void       (*_sym_glCopyTexImage2D)                      (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = NULL;
151 static void       (*_sym_glCopyTexSubImage2D)                   (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
152 static GLuint     (*_sym_glCreateProgram)                       (void) = NULL;
153 static GLuint     (*_sym_glCreateShader)                        (GLenum type) = NULL;
154 static void       (*_sym_glCullFace)                            (GLenum mode) = NULL;
155 static void       (*_sym_glDeleteBuffers)                       (GLsizei n, const GLuint* buffers) = NULL;
156 static void       (*_sym_glDeleteFramebuffers)                  (GLsizei n, const GLuint* framebuffers) = NULL;
157 static void       (*_sym_glDeleteProgram)                       (GLuint program) = NULL;
158 static void       (*_sym_glDeleteRenderbuffers)                 (GLsizei n, const GLuint* renderbuffers) = NULL;
159 static void       (*_sym_glDeleteShader)                        (GLuint shader) = NULL;
160 static void       (*_sym_glDeleteTextures)                      (GLsizei n, const GLuint* textures) = NULL;
161 static void       (*_sym_glDepthFunc)                           (GLenum func) = NULL;
162 static void       (*_sym_glDepthMask)                           (GLboolean flag) = NULL;
163 static void       (*_sym_glDepthRangef)                         (GLclampf zNear, GLclampf zFar) = NULL;
164 static void       (*_sym_glDetachShader)                        (GLuint program, GLuint shader) = NULL;
165 static void       (*_sym_glDisable)                             (GLenum cap) = NULL;
166 static void       (*_sym_glDisableVertexAttribArray)            (GLuint index) = NULL;
167 static void       (*_sym_glDrawArrays)                          (GLenum mode, GLint first, GLsizei count) = NULL;
168 static void       (*_sym_glDrawElements)                        (GLenum mode, GLsizei count, GLenum type, const void* indices) = NULL;
169 static void       (*_sym_glEnable)                              (GLenum cap) = NULL;
170 static void       (*_sym_glEnableVertexAttribArray)             (GLuint index) = NULL;
171 static void       (*_sym_glFinish)                              (void) = NULL;
172 static void       (*_sym_glFlush)                               (void) = NULL;
173 static void       (*_sym_glFramebufferRenderbuffer)             (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
174 static void       (*_sym_glFramebufferTexture2D)                (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
175 static void       (*_sym_glFrontFace)                           (GLenum mode) = NULL;
176 static void       (*_sym_glGenBuffers)                          (GLsizei n, GLuint* buffers) = NULL;
177 static void       (*_sym_glGenerateMipmap)                      (GLenum target) = NULL;
178 static void       (*_sym_glGenFramebuffers)                     (GLsizei n, GLuint* framebuffers) = NULL;
179 static void       (*_sym_glGenRenderbuffers)                    (GLsizei n, GLuint* renderbuffers) = NULL;
180 static void       (*_sym_glGenTextures)                         (GLsizei n, GLuint* textures) = NULL;
181 static void       (*_sym_glGetActiveAttrib)                     (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL;
182 static void       (*_sym_glGetActiveUniform)                    (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, char* name) = NULL;
183 static void       (*_sym_glGetAttachedShaders)                  (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) = NULL;
184 static int        (*_sym_glGetAttribLocation)                   (GLuint program, const char* name) = NULL;
185 static void       (*_sym_glGetBooleanv)                         (GLenum pname, GLboolean* params) = NULL;
186 static void       (*_sym_glGetBufferParameteriv)                (GLenum target, GLenum pname, GLint* params) = NULL;
187 static GLenum     (*_sym_glGetError)                            (void) = NULL;
188 static void       (*_sym_glGetFloatv)                           (GLenum pname, GLfloat* params) = NULL;
189 static void       (*_sym_glGetFramebufferAttachmentParameteriv) (GLenum target, GLenum attachment, GLenum pname, GLint* params) = NULL;
190 static void       (*_sym_glGetIntegerv)                         (GLenum pname, GLint* params) = NULL;
191 static void       (*_sym_glGetProgramiv)                        (GLuint program, GLenum pname, GLint* params) = NULL;
192 static void       (*_sym_glGetProgramInfoLog)                   (GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) = NULL;
193 static void       (*_sym_glGetRenderbufferParameteriv)          (GLenum target, GLenum pname, GLint* params) = NULL;
194 static void       (*_sym_glGetShaderiv)                         (GLuint shader, GLenum pname, GLint* params) = NULL;
195 static void       (*_sym_glGetShaderInfoLog)                    (GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) = NULL;
196 static void       (*_sym_glGetShaderPrecisionFormat)            (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) = NULL;
197 static void       (*_sym_glGetShaderSource)                     (GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = NULL;
198 static const GLubyte *(*_sym_glGetString)                           (GLenum name) = NULL;
199 static void       (*_sym_glGetTexParameterfv)                   (GLenum target, GLenum pname, GLfloat* params) = NULL;
200 static void       (*_sym_glGetTexParameteriv)                   (GLenum target, GLenum pname, GLint* params) = NULL;
201 static void       (*_sym_glGetUniformfv)                        (GLuint program, GLint location, GLfloat* params) = NULL;
202 static void       (*_sym_glGetUniformiv)                        (GLuint program, GLint location, GLint* params) = NULL;
203 static int        (*_sym_glGetUniformLocation)                  (GLuint program, const char* name) = NULL;
204 static void       (*_sym_glGetVertexAttribfv)                   (GLuint index, GLenum pname, GLfloat* params) = NULL;
205 static void       (*_sym_glGetVertexAttribiv)                   (GLuint index, GLenum pname, GLint* params) = NULL;
206 static void       (*_sym_glGetVertexAttribPointerv)             (GLuint index, GLenum pname, void** pointer) = NULL;
207 static void       (*_sym_glHint)                                (GLenum target, GLenum mode) = NULL;
208 static GLboolean  (*_sym_glIsBuffer)                            (GLuint buffer) = NULL;
209 static GLboolean  (*_sym_glIsEnabled)                           (GLenum cap) = NULL;
210 static GLboolean  (*_sym_glIsFramebuffer)                       (GLuint framebuffer) = NULL;
211 static GLboolean  (*_sym_glIsProgram)                           (GLuint program) = NULL;
212 static GLboolean  (*_sym_glIsRenderbuffer)                      (GLuint renderbuffer) = NULL;
213 static GLboolean  (*_sym_glIsShader)                            (GLuint shader) = NULL;
214 static GLboolean  (*_sym_glIsTexture)                           (GLuint texture) = NULL;
215 static void       (*_sym_glLineWidth)                           (GLfloat width) = NULL;
216 static void       (*_sym_glLinkProgram)                         (GLuint program) = NULL;
217 static void       (*_sym_glPixelStorei)                         (GLenum pname, GLint param) = NULL;
218 static void       (*_sym_glPolygonOffset)                       (GLfloat factor, GLfloat units) = NULL;
219 static void       (*_sym_glReadPixels)                          (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) = NULL;
220 static void       (*_sym_glReleaseShaderCompiler)               (void) = NULL;
221 static void       (*_sym_glRenderbufferStorage)                 (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
222 static void       (*_sym_glSampleCoverage)                      (GLclampf value, GLboolean invert) = NULL;
223 static void       (*_sym_glScissor)                             (GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
224 static void       (*_sym_glShaderBinary)                        (GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) = NULL;
225 static void       (*_sym_glShaderSource)                        (GLuint shader, GLsizei count, const char** string, const GLint* length) = NULL;
226 static void       (*_sym_glStencilFunc)                         (GLenum func, GLint ref, GLuint mask) = NULL;
227 static void       (*_sym_glStencilFuncSeparate)                 (GLenum face, GLenum func, GLint ref, GLuint mask) = NULL;
228 static void       (*_sym_glStencilMask)                         (GLuint mask) = NULL;
229 static void       (*_sym_glStencilMaskSeparate)                 (GLenum face, GLuint mask) = NULL;
230 static void       (*_sym_glStencilOp)                           (GLenum fail, GLenum zfail, GLenum zpass) = NULL;
231 static void       (*_sym_glStencilOpSeparate)                   (GLenum face, GLenum fail, GLenum zfail, GLenum zpass) = NULL;
232 static void       (*_sym_glTexImage2D)                          (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) = NULL;
233 static void       (*_sym_glTexParameterf)                       (GLenum target, GLenum pname, GLfloat param) = NULL;
234 static void       (*_sym_glTexParameterfv)                      (GLenum target, GLenum pname, const GLfloat* params) = NULL;
235 static void       (*_sym_glTexParameteri)                       (GLenum target, GLenum pname, GLint param) = NULL;
236 static void       (*_sym_glTexParameteriv)                      (GLenum target, GLenum pname, const GLint* params) = NULL;
237 static void       (*_sym_glTexSubImage2D)                       (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) = NULL;
238 static void       (*_sym_glUniform1f)                           (GLint location, GLfloat x) = NULL;
239 static void       (*_sym_glUniform1fv)                          (GLint location, GLsizei count, const GLfloat* v) = NULL;
240 static void       (*_sym_glUniform1i)                           (GLint location, GLint x) = NULL;
241 static void       (*_sym_glUniform1iv)                          (GLint location, GLsizei count, const GLint* v) = NULL;
242 static void       (*_sym_glUniform2f)                           (GLint location, GLfloat x, GLfloat y) = NULL;
243 static void       (*_sym_glUniform2fv)                          (GLint location, GLsizei count, const GLfloat* v) = NULL;
244 static void       (*_sym_glUniform2i)                           (GLint location, GLint x, GLint y) = NULL;
245 static void       (*_sym_glUniform2iv)                          (GLint location, GLsizei count, const GLint* v) = NULL;
246 static void       (*_sym_glUniform3f)                           (GLint location, GLfloat x, GLfloat y, GLfloat z) = NULL;
247 static void       (*_sym_glUniform3fv)                          (GLint location, GLsizei count, const GLfloat* v) = NULL;
248 static void       (*_sym_glUniform3i)                           (GLint location, GLint x, GLint y, GLint z) = NULL;
249 static void       (*_sym_glUniform3iv)                          (GLint location, GLsizei count, const GLint* v) = NULL;
250 static void       (*_sym_glUniform4f)                           (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL;
251 static void       (*_sym_glUniform4fv)                          (GLint location, GLsizei count, const GLfloat* v) = NULL;
252 static void       (*_sym_glUniform4i)                           (GLint location, GLint x, GLint y, GLint z, GLint w) = NULL;
253 static void       (*_sym_glUniform4iv)                          (GLint location, GLsizei count, const GLint* v) = NULL;
254 static void       (*_sym_glUniformMatrix2fv)                    (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL;
255 static void       (*_sym_glUniformMatrix3fv)                    (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL;
256 static void       (*_sym_glUniformMatrix4fv)                    (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = NULL;
257 static void       (*_sym_glUseProgram)                          (GLuint program) = NULL;
258 static void       (*_sym_glValidateProgram)                     (GLuint program) = NULL;
259 static void       (*_sym_glVertexAttrib1f)                      (GLuint indx, GLfloat x) = NULL;
260 static void       (*_sym_glVertexAttrib1fv)                     (GLuint indx, const GLfloat* values) = NULL;
261 static void       (*_sym_glVertexAttrib2f)                      (GLuint indx, GLfloat x, GLfloat y) = NULL;
262 static void       (*_sym_glVertexAttrib2fv)                     (GLuint indx, const GLfloat* values) = NULL;
263 static void       (*_sym_glVertexAttrib3f)                      (GLuint indx, GLfloat x, GLfloat y, GLfloat z) = NULL;
264 static void       (*_sym_glVertexAttrib3fv)                     (GLuint indx, const GLfloat* values) = NULL;
265 static void       (*_sym_glVertexAttrib4f)                      (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = NULL;
266 static void       (*_sym_glVertexAttrib4fv)                     (GLuint indx, const GLfloat* values) = NULL;
267 static void       (*_sym_glVertexAttribPointer)                 (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) = NULL;
268 static void       (*_sym_glViewport)                            (GLint x, GLint y, GLsizei width, GLsizei height) = NULL;
269
270 // GLES Extensions...
271 /* static void       (*_sym_glGetProgramBinary)                    (GLuint a, GLsizei b, GLsizei* c, GLenum* d, void* e) = NULL; */
272 /* static void       (*_sym_glProgramBinary)                       (GLuint a, GLenum b, const void* c, GLint d) = NULL; */
273 /* static void       (*_sym_glProgramParameteri)                   (GLuint a, GLuint b, GLint d) = NULL; */
274 #endif
275
276 /*
277  *****
278  **
279  ** ENGINE ROUTINES
280  **
281  *****
282  */
283 static int cpunum = 0;
284 static int _evas_soft_gen_log_dom = -1;
285
286 static void
287 eng_output_dump(void *data __UNUSED__)
288 {
289    evas_common_image_image_all_unload();
290    evas_common_font_font_all_unload();
291 }
292
293 static void *
294 eng_context_new(void *data __UNUSED__)
295 {
296    return evas_common_draw_context_new();
297 }
298
299 static void
300 eng_context_free(void *data __UNUSED__, void *context)
301 {
302    evas_common_draw_context_free(context);
303 }
304
305 static void
306 eng_context_clip_set(void *data __UNUSED__, void *context, int x, int y, int w, int h)
307 {
308    evas_common_draw_context_set_clip(context, x, y, w, h);
309 }
310
311 static void
312 eng_context_clip_clip(void *data __UNUSED__, void *context, int x, int y, int w, int h)
313 {
314    evas_common_draw_context_clip_clip(context, x, y, w, h);
315 }
316
317 static void
318 eng_context_clip_unset(void *data __UNUSED__, void *context)
319 {
320    evas_common_draw_context_unset_clip(context);
321 }
322
323 static int
324 eng_context_clip_get(void *data __UNUSED__, void *context, int *x, int *y, int *w, int *h)
325 {
326    *x = ((RGBA_Draw_Context *)context)->clip.x;
327    *y = ((RGBA_Draw_Context *)context)->clip.y;
328    *w = ((RGBA_Draw_Context *)context)->clip.w;
329    *h = ((RGBA_Draw_Context *)context)->clip.h;
330    return ((RGBA_Draw_Context *)context)->clip.use;
331 }
332
333 static void
334 eng_context_color_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
335 {
336    evas_common_draw_context_set_color(context, r, g, b, a);
337 }
338
339 static int
340 eng_context_color_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
341 {
342    *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col));
343    *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col));
344    *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col));
345    *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col));
346    return 1;
347 }
348
349 static void
350 eng_context_multiplier_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
351 {
352    evas_common_draw_context_set_multiplier(context, r, g, b, a);
353 }
354
355 static void
356 eng_context_multiplier_unset(void *data __UNUSED__, void *context)
357 {
358    evas_common_draw_context_unset_multiplier(context);
359 }
360
361 static int
362 eng_context_multiplier_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
363 {
364    *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col));
365    *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col));
366    *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col));
367    *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col));
368    return ((RGBA_Draw_Context *)context)->mul.use;
369 }
370
371 static void
372 eng_context_mask_set(void *data __UNUSED__, void *context, void *mask, int x, int y, int w, int h)
373 {
374    evas_common_draw_context_set_mask(context, mask, x, y, w, h);
375 }
376
377 static void
378 eng_context_mask_unset(void *data __UNUSED__, void *context)
379 {
380    evas_common_draw_context_unset_mask(context);
381 }
382 /*
383 static void *
384 eng_context_mask_get(void *data __UNUSED__, void *context)
385 {
386    return ((RGBA_Draw_Context *)context)->mask.mask;
387 }
388 */
389
390 static void
391 eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
392 {
393    evas_common_draw_context_add_cutout(context, x, y, w, h);
394 }
395
396 static void
397 eng_context_cutout_clear(void *data __UNUSED__, void *context)
398 {
399    evas_common_draw_context_clear_cutouts(context);
400 }
401
402 static void
403 eng_context_anti_alias_set(void *data __UNUSED__, void *context, unsigned char aa)
404 {
405    evas_common_draw_context_set_anti_alias(context, aa);
406 }
407
408 static unsigned char
409 eng_context_anti_alias_get(void *data __UNUSED__, void *context)
410 {
411    return ((RGBA_Draw_Context *)context)->anti_alias;
412 }
413
414 static void
415 eng_context_color_interpolation_set(void *data __UNUSED__, void *context, int color_space)
416 {
417    evas_common_draw_context_set_color_interpolation(context, color_space);
418 }
419
420 static int
421 eng_context_color_interpolation_get(void *data __UNUSED__, void *context)
422 {
423    return ((RGBA_Draw_Context *)context)->interpolation.color_space;
424 }
425
426 static void
427 eng_context_render_op_set(void *data __UNUSED__, void *context, int op)
428 {
429    evas_common_draw_context_set_render_op(context, op);
430 }
431
432 static int
433 eng_context_render_op_get(void *data __UNUSED__, void *context)
434 {
435    return ((RGBA_Draw_Context *)context)->render_op;
436 }
437
438
439
440 static void
441 eng_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
442 {
443 #ifdef BUILD_PIPE_RENDER
444    if ((cpunum > 1))
445      evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
446    else
447 #endif
448      {
449         evas_common_rectangle_draw(surface, context, x, y, w, h);
450         evas_common_cpu_end_opt();
451      }
452 }
453
454 static void
455 eng_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
456 {
457 #ifdef BUILD_PIPE_RENDER
458    if ((cpunum > 1))
459     evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
460    else
461 #endif   
462      {
463         evas_common_line_draw(surface, context, x1, y1, x2, y2);
464         evas_common_cpu_end_opt();
465      }
466 }
467
468 static void *
469 eng_polygon_point_add(void *data __UNUSED__, void *context __UNUSED__, void *polygon, int x, int y)
470 {
471    return evas_common_polygon_point_add(polygon, x, y);
472 }
473
474 static void *
475 eng_polygon_points_clear(void *data __UNUSED__, void *context __UNUSED__, void *polygon)
476 {
477    return evas_common_polygon_points_clear(polygon);
478 }
479
480 static void
481 eng_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
482 {
483 #ifdef BUILD_PIPE_RENDER
484    if ((cpunum > 1))
485      evas_common_pipe_poly_draw(surface, context, polygon, x, y);
486    else
487 #endif
488      {
489         evas_common_polygon_draw(surface, context, polygon, x, y);
490         evas_common_cpu_end_opt();
491      }
492 }
493
494 static int
495 eng_image_alpha_get(void *data __UNUSED__, void *image)
496 {
497    Image_Entry *im;
498
499    if (!image) return 1;
500    im = image;
501    switch (im->space)
502      {
503       case EVAS_COLORSPACE_ARGB8888:
504         if (im->flags.alpha) return 1;
505       default:
506         break;
507      }
508    return 0;
509 }
510
511 static int
512 eng_image_colorspace_get(void *data __UNUSED__, void *image)
513 {
514    Image_Entry *im;
515
516    if (!image) return EVAS_COLORSPACE_ARGB8888;
517    im = image;
518    return im->space;
519 }
520
521 static Eina_Bool
522 eng_image_can_region_get(void *data __UNUSED__, void *image)
523 {
524    Image_Entry *im;
525    if (!image) return EINA_FALSE;
526 #ifdef EVAS_CSERVE2
527    if (evas_cserve2_use_get())
528      return EINA_FALSE;
529 #endif
530    im = image;
531    return ((Evas_Image_Load_Func*) im->info.loader)->do_region;
532 }
533
534 static void
535 eng_image_mask_create(void *data __UNUSED__, void *image)
536 {
537    RGBA_Image *im;
538    int sz;
539    uint8_t *dst,*end;
540    uint32_t *src;
541
542    if (!image) return;
543    im = image;
544    if (im->mask.mask && !im->mask.dirty) return;
545
546    if (im->mask.mask) free(im->mask.mask);
547    sz = im->cache_entry.w * im->cache_entry.h;
548    im->mask.mask = malloc(sz);
549    dst = im->mask.mask;
550    if (!im->image.data)
551       evas_cache_image_load_data(&im->cache_entry);
552    src = (void*) im->image.data;
553    if (!src) return;
554    for (end = dst + sz ; dst < end ; dst ++, src ++)
555       *dst = *src >> 24;
556    im->mask.dirty = 0;
557 }
558
559
560 static void *
561 eng_image_alpha_set(void *data __UNUSED__, void *image, int has_alpha)
562 {
563    RGBA_Image *im;
564
565    if (!image) return NULL;
566    im = image;
567    if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
568      {
569         im->cache_entry.flags.alpha = 0;
570         return im;
571      }
572    im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
573    im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
574    evas_common_image_colorspace_dirty(im);
575    return im;
576 }
577
578 static void *
579 eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
580 {
581    RGBA_Image *im;
582
583    im = image;
584    return im;
585 }
586
587 static void
588 eng_image_border_get(void *data __UNUSED__, void *image __UNUSED__, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
589 {
590 }
591
592 static char *
593 eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
594 {
595    RGBA_Image *im;
596
597    if (!image) return NULL;
598    im = image;
599    return im->info.comment;
600 }
601
602 static char *
603 eng_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
604 {
605    return NULL;
606 }
607
608 static void
609 eng_image_colorspace_set(void *data __UNUSED__, void *image, int cspace)
610 {
611    Image_Entry *im;
612
613    if (!image) return;
614    im = image;
615    evas_cache_image_colorspace(im, cspace);
616 }
617
618 static void *
619 eng_image_native_set(void *data __UNUSED__, void *image, void *native __UNUSED__)
620 {
621    //return image;
622    Evas_Native_Surface *ns = native;
623    Image_Entry *im = image, *im2 = NULL;
624
625    if (!im)
626      {
627         if ((!ns) && (ns->data.x11.visual))
628           {
629              im = evas_cache_image_data(evas_common_image_cache_get(),
630                                         im->w, im->h,
631                                         ns->data.x11.visual, 1,
632                                         EVAS_COLORSPACE_ARGB8888);
633              return im;
634           }
635         else
636            return NULL;
637      }
638
639    if ((!ns) && (!im)) return im;
640
641    if (!ns) return im;
642
643    im2 = evas_cache_image_data(evas_common_image_cache_get(), 
644                                im->w, im->h, 
645                                ns->data.x11.visual, 1,
646                                EVAS_COLORSPACE_ARGB8888);
647    evas_cache_image_drop(im);
648    im = im2;
649
650    return im;
651
652 }
653
654 static void *
655 eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
656 {
657    return NULL;
658 }
659
660 static void *
661 eng_image_load(void *data __UNUSED__, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
662 {
663    *error = EVAS_LOAD_ERROR_NONE;
664 #ifdef EVAS_CSERVE2
665    if (evas_cserve2_use_get())
666      {
667         Image_Entry *ie;
668         ie = evas_cache2_image_open(evas_common_image_cache2_get(),
669                                     file, key, lo, error);
670         if (ie)
671           evas_cache2_image_open_wait(ie);
672
673         return ie;
674      }
675 #endif
676    return evas_common_load_image_from_file(file, key, lo, error);
677 }
678
679 static void *
680 eng_image_new_from_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
681 {
682 #ifdef EVAS_CSERVE2
683    if (evas_cserve2_use_get())
684      {
685         Evas_Cache2 *cache = evas_common_image_cache2_get();
686         return evas_cache2_image_data(cache, w, h, image_data, alpha, cspace);
687      }
688 #endif
689    return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
690 }
691
692 static void *
693 eng_image_new_from_copied_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
694 {
695 #ifdef EVAS_CSERVE2
696    if (evas_cserve2_use_get())
697      {
698         Evas_Cache2 *cache = evas_common_image_cache2_get();
699         return evas_cache2_image_copied_data(cache, w, h, image_data, alpha,
700                                              cspace);
701      }
702 #endif
703    return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
704 }
705
706 static void
707 eng_image_free(void *data __UNUSED__, void *image)
708 {
709 #ifdef EVAS_CSERVE2
710    if (evas_cserve2_use_get())
711      {
712         evas_cache2_image_close(image);
713         return;
714      }
715 #endif
716    evas_cache_image_drop(image);
717 }
718
719 static void
720 eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
721 {
722    Image_Entry *im;
723
724    im = image;
725    if (w) *w = im->w;
726    if (h) *h = im->h;
727 }
728
729 static void *
730 eng_image_size_set(void *data __UNUSED__, void *image, int w, int h)
731 {
732    Image_Entry *im = image;
733    if (!im) return NULL;
734 #ifdef EVAS_CSERVE2
735    if (evas_cserve2_use_get())
736      return evas_cache2_image_size_set(im, w, h);
737 #endif
738    return evas_cache_image_size_set(im, w, h);
739 }
740
741 static void *
742 eng_image_dirty_region(void *data __UNUSED__, void *image, int x, int y, int w, int h)
743 {
744    Image_Entry *im = image;
745    if (!im) return NULL;
746 #ifdef EVAS_CSERVE2
747    if (evas_cserve2_use_get())
748      return evas_cache2_image_dirty(im, x, y, w, h);
749 #endif
750    return evas_cache_image_dirty(im, x, y, w, h);
751 }
752
753 static void *
754 eng_image_data_get(void *data __UNUSED__, void *image, int to_write, DATA32 **image_data, int *err)
755 {
756    RGBA_Image *im;
757    int error = EVAS_LOAD_ERROR_NONE;
758
759    if (!image)
760      {
761         *image_data = NULL;
762         return NULL;
763      }
764    im = image;
765
766 #ifdef EVAS_CSERVE2
767    if (evas_cserve2_use_get())
768      {
769         error = evas_cache2_image_load_data(&im->cache_entry);
770         if (err) *err = error;
771
772         if (to_write)
773           im = (RGBA_Image *)evas_cache2_image_writable(&im->cache_entry);
774
775         *image_data = im->image.data;
776         return im;
777      }
778 #endif
779
780    error = evas_cache_image_load_data(&im->cache_entry);
781    switch (im->cache_entry.space)
782      {
783       case EVAS_COLORSPACE_ARGB8888:
784         if (to_write)
785           im = (RGBA_Image *)evas_cache_image_alone(&im->cache_entry);
786         *image_data = im->image.data;
787         break;
788       case EVAS_COLORSPACE_YCBCR422P601_PL:
789       case EVAS_COLORSPACE_YCBCR422P709_PL:
790       case EVAS_COLORSPACE_YCBCR422601_PL:
791       case EVAS_COLORSPACE_YCBCR420NV12601_PL:
792       case EVAS_COLORSPACE_YCBCR420TM12601_PL:
793         *image_data = im->cs.data;
794         break;
795       default:
796         abort();
797         break;
798      }
799    if (err) *err = error;
800    return im;
801 }
802
803 static void *
804 eng_image_data_put(void *data, void *image, DATA32 *image_data)
805 {
806    RGBA_Image *im, *im2;
807
808    if (!image) return NULL;
809    im = image;
810    switch (im->cache_entry.space)
811      {
812       case EVAS_COLORSPACE_ARGB8888:
813         if (image_data != im->image.data)
814           {
815              int w, h;
816
817              w = im->cache_entry.w;
818              h = im->cache_entry.h;
819              im2 = eng_image_new_from_data(data, w, h, image_data,
820                                            eng_image_alpha_get(data, image),
821                                            eng_image_colorspace_get(data, image));
822 #ifdef EVAS_CSERVE2
823              if (evas_cserve2_use_get())
824                {
825                   evas_cache2_image_close(&im->cache_entry);
826                   im = im2;
827                   break;
828                }
829 #endif
830              evas_cache_image_drop(&im->cache_entry);
831              im = im2;
832           }
833         break;
834       case EVAS_COLORSPACE_YCBCR422P601_PL:
835       case EVAS_COLORSPACE_YCBCR422P709_PL:
836       case EVAS_COLORSPACE_YCBCR422601_PL:
837       case EVAS_COLORSPACE_YCBCR420NV12601_PL:
838       case EVAS_COLORSPACE_YCBCR420TM12601_PL:
839         if (image_data != im->cs.data)
840           {
841              if (im->cs.data)
842                {
843                   if (!im->cs.no_free) free(im->cs.data);
844                }
845              im->cs.data = image_data;
846           }
847         evas_common_image_colorspace_dirty(im);
848         break;
849       default:
850         abort();
851         break;
852      }
853    return im;
854 }
855
856 static void
857 eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
858 {
859    RGBA_Image *im = image;
860    if (!im) return ;
861
862 #ifdef EVAS_CSERVE2
863    if (evas_cserve2_use_get())
864      {
865         evas_cache2_image_preload_data(&im->cache_entry, target);
866         return;
867      }
868 #endif
869    evas_cache_image_preload_data(&im->cache_entry, target);
870 }
871
872 static void
873 eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
874 {
875    RGBA_Image *im = image;
876 #ifdef EVAS_CSERVE2
877    if (evas_cserve2_use_get())
878      return;
879 #endif
880
881    if (!im) return ;
882    evas_cache_image_preload_cancel(&im->cache_entry, target);
883 }
884
885 static void
886 eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
887 {
888    RGBA_Image *im;
889
890    if (!image) return;
891    im = image;
892 #ifdef BUILD_PIPE_RENDER
893    if ((cpunum > 1))
894      {
895 #ifdef EVAS_CSERVE2
896         if (evas_cserve2_use_get())
897           evas_cache2_image_load_data(&im->cache_entry);
898 #endif
899         evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im), 
900                                                   surface, context, smooth,
901                                                   src_x, src_y, src_w, src_h,
902                                                   dst_x, dst_y, dst_w, dst_h);
903         
904         evas_common_pipe_image_draw(im, surface, context, smooth,
905                                     src_x, src_y, src_w, src_h,
906                                     dst_x, dst_y, dst_w, dst_h);
907      }
908    else
909 #endif
910      {
911 #if 0
912 #ifdef EVAS_CSERVE2
913         if (evas_cserve2_use_get())
914           {
915              evas_cache2_image_load_data(&im->cache_entry);
916              goto image_loaded;
917           }
918 #endif
919         if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
920           evas_cache_image_load_data(&im->cache_entry);
921         evas_common_image_colorspace_normalize(im);
922
923 image_loaded:
924 #endif
925         evas_common_rgba_image_scalecache_prepare(&im->cache_entry, surface, context, smooth,
926                                                   src_x, src_y, src_w, src_h,
927                                                   dst_x, dst_y, dst_w, dst_h);
928         evas_common_rgba_image_scalecache_do(&im->cache_entry, surface, context, smooth,
929                                              src_x, src_y, src_w, src_h,
930                                              dst_x, dst_y, dst_w, dst_h);
931 /*        
932         if (smooth)
933           evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context,
934                                                        src_x, src_y, src_w, src_h,
935                                                        dst_x, dst_y, dst_w, dst_h);
936         else
937           evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context,
938                                                        src_x, src_y, src_w, src_h,
939                                                        dst_x, dst_y, dst_w, dst_h);
940  */
941         evas_common_cpu_end_opt();
942      }
943 }
944
945 static void
946 evas_software_image_map_draw(void *data, void *context, RGBA_Image *surface, RGBA_Image *im, RGBA_Map *m, int smooth, int level, int offset)
947 {
948    if (m->count - offset < 3) return;
949
950    if ((m->pts[0 + offset].x == m->pts[3 + offset].x) &&
951        (m->pts[1 + offset].x == m->pts[2 + offset].x) &&
952        (m->pts[0 + offset].y == m->pts[1 + offset].y) &&
953        (m->pts[3 + offset].y == m->pts[2 + offset].y) &&
954        (m->pts[0 + offset].x <= m->pts[1 + offset].x) &&
955        (m->pts[0 + offset].y <= m->pts[2 + offset].y) &&
956        (m->pts[0 + offset].u == 0) &&
957        (m->pts[0 + offset].v == 0) &&
958        (m->pts[1 + offset].u == (int)(im->cache_entry.w << FP)) &&
959        (m->pts[1 + offset].v == 0) &&
960        (m->pts[2 + offset].u == (int)(im->cache_entry.w << FP)) &&
961        (m->pts[2 + offset].v == (int)(im->cache_entry.h << FP)) &&
962        (m->pts[3 + offset].u == 0) &&
963        (m->pts[3 + offset].v == (int)(im->cache_entry.h << FP)) &&
964        (m->pts[0 + offset].col == 0xffffffff) &&
965        (m->pts[1 + offset].col == 0xffffffff) &&
966        (m->pts[2 + offset].col == 0xffffffff) &&
967        (m->pts[3 + offset].col == 0xffffffff))
968      {
969         int dx, dy, dw, dh;
970
971         dx = m->pts[0 + offset].x >> FP;
972         dy = m->pts[0 + offset].y >> FP;
973         dw = (m->pts[2 + offset].x >> FP) - dx;
974         dh = (m->pts[2 + offset].y >> FP) - dy;
975         eng_image_draw
976           (data, context, surface, im,
977            0, 0, im->cache_entry.w, im->cache_entry.h,
978            dx, dy, dw, dh, smooth);
979      }
980    else
981      {
982 #ifdef BUILD_PIPE_RENDER
983         if ((cpunum > 1))
984           {
985              evas_common_pipe_map_draw(im, surface, context, m, smooth, level);
986              return ;
987           }
988         else
989 #endif
990           {
991              evas_common_map_rgba(im, surface, context, m->count - offset, &m->pts[offset], smooth, level);
992           }
993      }
994    evas_common_cpu_end_opt();
995
996    if (m->count > 4)
997      {
998         evas_software_image_map_draw(data, context, surface, im, m, smooth, level, offset + 2);
999      }
1000 }
1001
1002 static void
1003 eng_image_map_draw(void *data, void *context, void *surface, void *image, RGBA_Map *m, int smooth, int level)
1004 {
1005    if (!image) return;
1006    if (m->count < 3) return;
1007
1008    evas_software_image_map_draw(data, context, surface, image, m, smooth, level, 0);
1009 }
1010
1011 static void
1012 eng_image_map_clean(void *data __UNUSED__, RGBA_Map *m)
1013 {
1014    evas_common_map_rgba_clean(m);
1015 }
1016
1017 static void *
1018 eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
1019 {
1020    void *surface;
1021 #ifdef EVAS_CSERVE2
1022    if (evas_cserve2_use_get())
1023      {
1024         surface = evas_cache2_image_copied_data(evas_common_image_cache2_get(),
1025                                                 w, h, NULL, alpha,
1026                                                 EVAS_COLORSPACE_ARGB8888);
1027         evas_cache2_image_pixels(surface);
1028         return surface;
1029      }
1030 #endif
1031    surface = evas_cache_image_copied_data(evas_common_image_cache_get(), 
1032                                           w, h, NULL, alpha, 
1033                                           EVAS_COLORSPACE_ARGB8888);
1034    evas_cache_image_pixels(surface);
1035    return surface;
1036 }
1037
1038 static void
1039 eng_image_map_surface_free(void *data __UNUSED__, void *surface)
1040 {
1041 #ifdef EVAS_CSERVE2
1042    if (evas_cserve2_use_get())
1043      {
1044         evas_cache2_image_unload_data(surface);
1045         return;
1046      }
1047 #endif
1048    evas_cache_image_drop(surface);
1049 }
1050
1051 static void
1052 eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
1053 {
1054    Image_Entry *im;
1055
1056    if (!image) return;
1057    im = image;
1058    im->scale_hint = hint;
1059 }
1060
1061 static int
1062 eng_image_scale_hint_get(void *data __UNUSED__, void *image)
1063 {
1064    Image_Entry *im;
1065
1066    if (!image) return EVAS_IMAGE_SCALE_HINT_NONE;
1067    im = image;
1068    return im->scale_hint;
1069 }
1070
1071 static Eina_Bool
1072 eng_image_animated_get(void *data __UNUSED__, void *image)
1073 {
1074    Image_Entry *im;
1075
1076    if (!image) return EINA_FALSE;
1077    im = image;
1078    return im->flags.animated;
1079 }
1080
1081 static int
1082 eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
1083 {
1084    Image_Entry *im;
1085
1086    if (!image) return -1;
1087    im = image;
1088    if (!im->flags.animated) return -1;
1089    return im->frame_count;
1090 }
1091
1092 static Evas_Image_Animated_Loop_Hint
1093 eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
1094 {
1095    Image_Entry *im;
1096
1097    if (!image) return EVAS_IMAGE_ANIMATED_HINT_NONE;
1098    im = image;
1099    if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
1100    return im->loop_hint;
1101 }
1102
1103 static int
1104 eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
1105 {
1106    Image_Entry *im;
1107
1108    if (!image) return -1;
1109    im = image;
1110    if (!im->flags.animated) return -1;
1111    return im->loop_count;
1112 }
1113
1114 static double
1115 eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
1116 {
1117    Image_Entry *im;
1118
1119    if (!image) return -1;
1120    im = image;
1121    if (!im->flags.animated) return -1;
1122    return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
1123 }
1124
1125 static Eina_Bool
1126 eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
1127 {
1128    Image_Entry *im;
1129
1130    if (!image) return EINA_FALSE;
1131    im = image;
1132    if (!im->flags.animated) return EINA_FALSE;
1133    if (im->cur_frame == frame_index) return EINA_FALSE;
1134    im->cur_frame = frame_index;
1135    return EINA_TRUE;
1136 }
1137
1138 static void
1139 eng_image_cache_flush(void *data __UNUSED__)
1140 {
1141    int tmp_size;
1142
1143    tmp_size = evas_common_image_get_cache();
1144    evas_common_image_set_cache(0);
1145    evas_common_rgba_image_scalecache_flush();
1146    evas_common_image_set_cache(tmp_size);
1147 }
1148
1149 static void
1150 eng_image_cache_set(void *data __UNUSED__, int bytes)
1151 {
1152    evas_common_image_set_cache(bytes);
1153    evas_common_rgba_image_scalecache_size_set(bytes);
1154 }
1155
1156 static int
1157 eng_image_cache_get(void *data __UNUSED__)
1158 {
1159    return evas_common_image_get_cache();
1160 }
1161
1162 static Evas_Font_Set *
1163 eng_font_load(void *data __UNUSED__, const char *name, int size,
1164       Font_Rend_Flags wanted_rend)
1165 {
1166    return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend);
1167 }
1168
1169 static Evas_Font_Set *
1170 eng_font_memory_load(void *data __UNUSED__, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
1171 {
1172    return (Evas_Font_Set *) evas_common_font_memory_load(source, name, size,
1173          fdata, fdata_size, wanted_rend);
1174 }
1175
1176 static Evas_Font_Set *
1177 eng_font_add(void *data __UNUSED__, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend)
1178 {
1179    return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name,
1180          size, wanted_rend);
1181 }
1182
1183 static Evas_Font_Set *
1184 eng_font_memory_add(void *data __UNUSED__, Evas_Font_Set *font, const char *source, const char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
1185 {
1186    return (Evas_Font_Set *) evas_common_font_memory_add((RGBA_Font *) font,
1187          source, name, size, fdata, fdata_size, wanted_rend);
1188 }
1189
1190 static void
1191 eng_font_free(void *data __UNUSED__, Evas_Font_Set *font)
1192 {
1193    evas_common_font_free((RGBA_Font *) font);
1194 }
1195
1196 static int
1197 eng_font_ascent_get(void *data __UNUSED__, Evas_Font_Set *font)
1198 {
1199    return evas_common_font_ascent_get((RGBA_Font *) font);
1200 }
1201
1202 static int
1203 eng_font_descent_get(void *data __UNUSED__, Evas_Font_Set *font)
1204 {
1205    return evas_common_font_descent_get((RGBA_Font *) font);
1206 }
1207
1208 static int
1209 eng_font_max_ascent_get(void *data __UNUSED__, Evas_Font_Set *font)
1210 {
1211    return evas_common_font_max_ascent_get((RGBA_Font *) font);
1212 }
1213
1214 static int
1215 eng_font_max_descent_get(void *data __UNUSED__, Evas_Font_Set *font)
1216 {
1217    return evas_common_font_max_descent_get((RGBA_Font *) font);
1218 }
1219
1220 static void
1221 eng_font_string_size_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int *w, int *h)
1222 {
1223    evas_common_font_query_size((RGBA_Font *) font, text_props, w, h);
1224 }
1225
1226 static int
1227 eng_font_inset_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
1228 {
1229    return evas_common_font_query_inset((RGBA_Font *) font, text_props);
1230 }
1231
1232 static int
1233 eng_font_right_inset_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
1234 {
1235    return evas_common_font_query_right_inset((RGBA_Font *) font, text_props);
1236 }
1237
1238 static int
1239 eng_font_h_advance_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
1240 {
1241    int h, v;
1242
1243    evas_common_font_query_advance((RGBA_Font *) font, text_props, &h, &v);
1244    return h;
1245 }
1246
1247 static int
1248 eng_font_v_advance_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
1249 {
1250    int h, v;
1251
1252    evas_common_font_query_advance((RGBA_Font *) font, text_props, &h, &v);
1253    return v;
1254 }
1255
1256 static int
1257 eng_font_pen_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int pos, int *cpen_x, int *cy, int *cadv, int *ch)
1258 {
1259    return evas_common_font_query_pen_coords((RGBA_Font *) font, text_props, pos, cpen_x, cy, cadv, ch);
1260 }
1261
1262 static Eina_Bool
1263 eng_font_text_props_info_create(void *data __UNUSED__, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, size_t par_pos, size_t len, Evas_Text_Props_Mode mode)
1264 {
1265    return evas_common_text_props_content_create((RGBA_Font_Int *) fi, text,
1266          text_props, par_props, par_pos, len, mode);
1267 }
1268
1269 static int
1270 eng_font_char_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int pos, int *cx, int *cy, int *cw, int *ch)
1271 {
1272    return evas_common_font_query_char_coords((RGBA_Font *) font, text_props, pos, cx, cy, cw, ch);
1273 }
1274
1275 static int
1276 eng_font_char_at_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int x, int y, int *cx, int *cy, int *cw, int *ch)
1277 {
1278    return evas_common_font_query_char_at_coords((RGBA_Font *) font, text_props, x, y, cx, cy, cw, ch);
1279 }
1280
1281 static int
1282 eng_font_last_up_to_pos(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int x, int y)
1283 {
1284    return evas_common_font_query_last_up_to_pos((RGBA_Font *) font, text_props, x, y);
1285 }
1286
1287 static int
1288 eng_font_run_font_end_get(void *data __UNUSED__, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len)
1289 {
1290    return evas_common_font_query_run_font_end_get((RGBA_Font *) font,
1291          (RGBA_Font_Int **) script_fi, (RGBA_Font_Int **) cur_fi,
1292          script, text, run_len);
1293 }
1294
1295 static void
1296 eng_font_draw(void *data __UNUSED__, void *context, void *surface, Evas_Font_Set *font __UNUSED__, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, Evas_Text_Props *text_props)
1297 {
1298 #ifdef BUILD_PIPE_RENDER
1299    if ((cpunum > 1))
1300      evas_common_pipe_text_draw(surface, context, x, y, text_props);
1301    else
1302 #endif   
1303      {
1304         evas_common_font_draw_prepare(text_props);
1305         evas_common_font_draw(surface, context, x, y, text_props);
1306         evas_common_cpu_end_opt();
1307      }
1308 }
1309
1310 static void
1311 eng_font_cache_flush(void *data __UNUSED__)
1312 {
1313    int tmp_size;
1314
1315    tmp_size = evas_common_font_cache_get();
1316    evas_common_font_cache_set(0);
1317    evas_common_font_flush();
1318    evas_common_font_cache_set(tmp_size);
1319 }
1320
1321 static void
1322 eng_font_cache_set(void *data __UNUSED__, int bytes)
1323 {
1324    evas_common_font_cache_set(bytes);
1325 }
1326
1327 static int
1328 eng_font_cache_get(void *data __UNUSED__)
1329 {
1330    return evas_common_font_cache_get();
1331 }
1332
1333 static void
1334 eng_font_hinting_set(void *data __UNUSED__, Evas_Font_Set *font, int hinting)
1335 {
1336    evas_common_font_hinting_set((RGBA_Font *) font, hinting);
1337 }
1338
1339 static int
1340 eng_font_hinting_can_hint(void *data __UNUSED__, int hinting)
1341 {
1342    return evas_common_hinting_available(hinting);
1343 }
1344
1345 static Eina_Bool
1346 eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
1347 {
1348    return EINA_TRUE;
1349 }
1350
1351
1352 /* Filter API */
1353 #if 0 // filtering disabled
1354 static void
1355 eng_image_draw_filtered(void *data __UNUSED__, void *context __UNUSED__,
1356                         void *surface, void *image, Evas_Filter_Info *filter)
1357 {
1358    Evas_Software_Filter_Fn fn;
1359    RGBA_Image *im = image;
1360
1361    fn = evas_filter_software_get(filter);
1362    if (!fn) return;
1363    if (im->cache_entry.cache) evas_cache_image_load_data(&im->cache_entry);
1364    fn(filter, image, surface);
1365    return;
1366 }
1367
1368 static Filtered_Image *
1369 eng_image_filtered_get(void *image, uint8_t *key, size_t keylen)
1370 {
1371    RGBA_Image *im = image;
1372    Filtered_Image *fi;
1373    Eina_List *l;
1374
1375    for (l = im->filtered ; l ; l = l->next)
1376      {
1377          fi = l->data;
1378          if (fi->keylen != keylen) continue;
1379          if (memcmp(key, fi->key, keylen) != 0) continue;
1380          fi->ref ++;
1381          return fi;
1382      }
1383
1384    return NULL;
1385 }
1386
1387 static Filtered_Image *
1388 eng_image_filtered_save(void *image, void *fimage, uint8_t *key, size_t keylen)
1389 {
1390    RGBA_Image *im = image;
1391    Filtered_Image *fi;
1392    Eina_List *l;
1393
1394    for (l = im->filtered ; l ; l = l->next)
1395      {
1396         fi = l->data;
1397         if (fi->keylen != keylen) continue;
1398         if (memcmp(key, fi->key, keylen) == 0) continue;
1399         evas_cache_image_drop((void *)fi->image);
1400         fi->image = fimage;
1401         return fi;
1402      }
1403
1404    fi = calloc(1,sizeof(Filtered_Image));
1405    if (!fi) return NULL;
1406
1407    fi->keylen = keylen;
1408    fi->key = malloc(keylen);
1409    memcpy(fi->key, key, keylen);
1410    fi->image = fimage;
1411    fi->ref = 1;
1412
1413    im->filtered = eina_list_prepend(im->filtered, fi);
1414
1415    return fi;
1416 }
1417
1418 static void
1419 eng_image_filtered_free(void *image, Filtered_Image *fi)
1420 {
1421    RGBA_Image *im = image;
1422
1423    fi->ref --;
1424    if (fi->ref) return;
1425
1426    free(fi->key);
1427    evas_cache_image_drop(&fi->image->cache_entry);
1428    fi->image = NULL;
1429
1430    im->filtered = eina_list_remove(im->filtered, fi);
1431 }
1432 #endif
1433
1434 static int
1435 eng_image_load_error_get(void *data __UNUSED__, void *image)
1436 {
1437    RGBA_Image *im;
1438    
1439    if (!image) return EVAS_LOAD_ERROR_NONE;
1440    im = image;
1441    return im->cache_entry.load_error;
1442 }
1443
1444 //------------ Evas GL engine code ---------------//
1445 static void *
1446 eng_gl_surface_create(void *data __UNUSED__, void *config, int w, int h)
1447 {
1448 #ifdef EVAS_GL
1449    Render_Engine_GL_Surface *sfc;
1450    Evas_GL_Config *cfg;
1451
1452    sfc = calloc(1, sizeof(Render_Engine_GL_Surface));
1453    if (!sfc) return NULL;
1454
1455    cfg = (Evas_GL_Config *)config;
1456
1457    sfc->initialized  = 0;
1458    sfc->w            = w;
1459    sfc->h            = h;
1460
1461    // Color Format
1462    switch (cfg->color_format)
1463      {
1464
1465       case EVAS_GL_RGB_888:
1466          sfc->internal_fmt = OSMESA_RGB;
1467          sfc->internal_cpp = 3;
1468          break;
1469       case EVAS_GL_RGBA_8888:
1470          sfc->internal_fmt = OSMESA_BGRA;
1471          sfc->internal_cpp = 4;
1472          break;
1473       default:
1474          sfc->internal_fmt = OSMESA_RGBA;
1475          sfc->internal_cpp = 4;
1476          break;
1477      }
1478
1479    // Depth Bits
1480    switch (cfg->depth_bits)
1481      {
1482       case EVAS_GL_DEPTH_BIT_8:
1483          sfc->depth_bits = 8;
1484          break;
1485       case EVAS_GL_DEPTH_BIT_16:
1486          sfc->depth_bits = 16;
1487          break;
1488       case EVAS_GL_DEPTH_BIT_24:
1489          sfc->depth_bits = 24;
1490          break;
1491       case EVAS_GL_DEPTH_BIT_32:
1492          sfc->depth_bits = 32;
1493          break;
1494       case EVAS_GL_DEPTH_NONE:
1495       default:
1496          sfc->depth_bits = 0;
1497          break;
1498      }
1499    
1500    // Stencil Bits
1501    switch (cfg->stencil_bits)
1502      {
1503       case EVAS_GL_STENCIL_BIT_1:
1504          sfc->stencil_bits = 1;
1505          break;
1506       case EVAS_GL_STENCIL_BIT_2:
1507          sfc->stencil_bits = 2;
1508          break;
1509       case EVAS_GL_STENCIL_BIT_4:
1510          sfc->stencil_bits = 4;
1511          break;
1512       case EVAS_GL_STENCIL_BIT_8:
1513          sfc->stencil_bits = 8;
1514          break;
1515       case EVAS_GL_STENCIL_BIT_16:
1516          sfc->stencil_bits = 16;
1517          break;
1518       case EVAS_GL_STENCIL_NONE:
1519       default:
1520          sfc->stencil_bits = 0;
1521          break;
1522      }
1523
1524    sfc->buffer = malloc(sizeof(unsigned char)*sfc->internal_cpp*w*h);
1525
1526    if (!sfc->buffer)
1527      {
1528         free(sfc);
1529         return NULL;
1530      }
1531
1532    return sfc;
1533 #else
1534    (void) config;
1535    (void) w;
1536    (void) h;
1537    return NULL;
1538 #endif
1539 }
1540
1541 static int
1542 eng_gl_surface_destroy(void *data __UNUSED__, void *surface)
1543 {
1544 #ifdef EVAS_GL
1545    Render_Engine_GL_Surface *sfc;
1546
1547    sfc = (Render_Engine_GL_Surface*)surface;
1548
1549    if (!sfc) return 0;
1550
1551    if (sfc->buffer) free(sfc->buffer);
1552
1553    free(sfc);
1554
1555    surface = NULL;
1556
1557    return 1;
1558 #else
1559    (void) surface;
1560    return 1;
1561 #endif
1562 }
1563
1564 static void *
1565 eng_gl_context_create(void *data __UNUSED__, void *share_context)
1566 {
1567 #ifdef EVAS_GL
1568    Render_Engine_GL_Context *ctx;
1569    Render_Engine_GL_Context *share_ctx;
1570
1571    ctx = calloc(1, sizeof(Render_Engine_GL_Context));
1572
1573    if (!ctx) return NULL;
1574
1575    share_ctx = (Render_Engine_GL_Context *)share_context;
1576
1577    ctx->share_ctx = share_ctx;
1578
1579    /*
1580    if (share_ctx)
1581       ctx->context = OSMesaCreateContextExt( OSMESA_RGBA, 8, 0, 0, share_ctx->context );
1582    else
1583       ctx->context = OSMesaCreateContextExt( OSMESA_RGBA, 8, 0, 0, NULL );
1584
1585
1586    if (!ctx->context)
1587      {
1588         ERR("Error creating OSMesa Context.");
1589         free(ctx);
1590         return NULL;
1591      }
1592      */
1593
1594    ctx->initialized = 0;
1595
1596    return ctx;
1597 #else
1598    (void) share_context;
1599    return NULL;
1600 #endif
1601 }
1602
1603 static int
1604 eng_gl_context_destroy(void *data __UNUSED__, void *context)
1605 {
1606 #ifdef EVAS_GL
1607    Render_Engine_GL_Context *ctx;
1608
1609    ctx = (Render_Engine_GL_Context*)context;
1610
1611    if (!ctx) return 0;
1612
1613    _sym_OSMesaDestroyContext(ctx->context);
1614
1615    free(ctx);
1616    context = NULL;
1617
1618    return 1;
1619 #else
1620    (void) context;
1621    return 0;
1622 #endif
1623 }
1624
1625 static int
1626 eng_gl_make_current(void *data __UNUSED__, void *surface, void *context)
1627 {
1628 #ifdef EVAS_GL
1629    Render_Engine_GL_Surface *sfc;
1630    Render_Engine_GL_Context *ctx;
1631    OSMesaContext share_ctx;
1632    GLboolean ret;
1633
1634    sfc = (Render_Engine_GL_Surface*)surface;
1635    ctx = (Render_Engine_GL_Context*)context;
1636
1637    // Unset surface/context
1638    if ((!sfc) || (!ctx))
1639      {
1640         if (ctx) ctx->current_sfc = NULL;
1641         if (sfc) sfc->current_ctx = NULL;
1642         return 1;
1643      }
1644
1645    // Initialize Context if it hasn't been.
1646    if (!ctx->initialized)
1647      {
1648         if (ctx->share_ctx)
1649            share_ctx = ctx->share_ctx->context;
1650         else
1651            share_ctx = NULL;
1652
1653         ctx->context =  _sym_OSMesaCreateContextExt(sfc->internal_fmt, 
1654                                                sfc->depth_bits,
1655                                                sfc->stencil_bits, 
1656                                                0,
1657                                                share_ctx);
1658         if (!ctx->context)
1659           {
1660              ERR("Error initializing context.");
1661              return 0;
1662           }
1663
1664         ctx->initialized = 1;
1665      }
1666
1667
1668    // Call MakeCurrent
1669    ret = _sym_OSMesaMakeCurrent(ctx->context, sfc->buffer, GL_UNSIGNED_BYTE, 
1670                            sfc->w, sfc->h);
1671
1672    if (ret == GL_FALSE)
1673      {
1674         ERR("Error doing MakeCurrent.");
1675         return 0;
1676      }
1677
1678    _sym_OSMesaPixelStore(OSMESA_Y_UP, 0);
1679
1680    // Set the current surface/context
1681    ctx->current_sfc = sfc;
1682    sfc->current_ctx = ctx;
1683
1684    return 1;
1685 #else
1686    (void) surface;
1687    (void) context;
1688    return 1;
1689 #endif
1690 }
1691
1692 // FIXME!!! Implement later
1693 static void *
1694 eng_gl_string_query(void *data __UNUSED__, int name __UNUSED__)
1695 {
1696    return NULL;
1697 }
1698
1699 static void *
1700 eng_gl_proc_address_get(void *data __UNUSED__, const char *name)
1701 {
1702 #ifdef EVAS_GL
1703    if (_sym_OSMesaGetProcAddress) return _sym_OSMesaGetProcAddress(name);
1704    return dlsym(RTLD_DEFAULT, name);
1705 #else
1706    (void) name;
1707    return NULL;
1708 #endif
1709 }
1710
1711 static int
1712 eng_gl_native_surface_get(void *data __UNUSED__, void *surface, void *native_surface)
1713 {
1714 #ifdef EVAS_GL
1715    Render_Engine_GL_Surface *sfc;
1716    Evas_Native_Surface *ns;
1717
1718    sfc = (Render_Engine_GL_Surface*)surface;
1719    ns  = (Evas_Native_Surface*)native_surface;
1720
1721    if (!sfc) return 0;
1722
1723    ns->type = EVAS_NATIVE_SURFACE_OPENGL;
1724    ns->version = EVAS_NATIVE_SURFACE_VERSION;
1725    ns->data.x11.visual = sfc->buffer;
1726
1727    return 1;
1728 #else
1729    (void) surface;
1730    (void) native_surface;
1731    return 1;
1732 #endif
1733 }
1734
1735
1736 static void *
1737 eng_gl_api_get(void *data __UNUSED__)
1738 {
1739 #ifdef EVAS_GL
1740    return &gl_funcs;
1741 #else
1742    return NULL;
1743 #endif
1744 }
1745
1746 //------------------------------------------------//
1747
1748
1749 /*
1750  *****
1751  **
1752  ** ENGINE API
1753  **
1754  *****
1755  */
1756
1757 static Evas_Func func =
1758 {
1759    NULL,
1760      NULL,
1761      NULL,
1762      NULL,
1763      NULL,
1764      NULL,
1765      NULL,
1766      NULL,
1767      NULL,
1768      NULL,
1769      NULL,
1770      NULL,
1771      NULL,
1772      eng_output_dump,
1773      /* draw context virtual methods */
1774      eng_context_new,
1775      eng_canvas_alpha_get,
1776      eng_context_free,
1777      eng_context_clip_set,
1778      eng_context_clip_clip,
1779      eng_context_clip_unset,
1780      eng_context_clip_get,
1781      eng_context_mask_set,
1782      eng_context_mask_unset,
1783      eng_context_color_set,
1784      eng_context_color_get,
1785      eng_context_multiplier_set,
1786      eng_context_multiplier_unset,
1787      eng_context_multiplier_get,
1788      eng_context_cutout_add,
1789      eng_context_cutout_clear,
1790      eng_context_anti_alias_set,
1791      eng_context_anti_alias_get,
1792      eng_context_color_interpolation_set,
1793      eng_context_color_interpolation_get,
1794      eng_context_render_op_set,
1795      eng_context_render_op_get,
1796      /* rect draw funcs */
1797      eng_rectangle_draw,
1798      /* line draw funcs */
1799      eng_line_draw,
1800      /* polygon draw funcs */
1801      eng_polygon_point_add,
1802      eng_polygon_points_clear,
1803      eng_polygon_draw,
1804      /* image draw funcs */
1805      eng_image_load,
1806      eng_image_new_from_data,
1807      eng_image_new_from_copied_data,
1808      eng_image_free,
1809      eng_image_size_get,
1810      eng_image_size_set,
1811      NULL,
1812      eng_image_dirty_region,
1813      eng_image_data_get,
1814      eng_image_data_put,
1815      eng_image_data_preload_request,
1816      eng_image_data_preload_cancel,
1817      eng_image_alpha_set,
1818      eng_image_alpha_get,
1819      eng_image_border_set,
1820      eng_image_border_get,
1821      eng_image_draw,
1822      eng_image_comment_get,
1823      eng_image_format_get,
1824      eng_image_colorspace_set,
1825      eng_image_colorspace_get,
1826      eng_image_can_region_get,
1827      eng_image_mask_create,
1828      eng_image_native_set,
1829      eng_image_native_get,
1830      /* image cache funcs */
1831      eng_image_cache_flush,
1832      eng_image_cache_set,
1833      eng_image_cache_get,
1834      /* font draw functions */
1835      eng_font_load,
1836      eng_font_memory_load,
1837      eng_font_add,
1838      eng_font_memory_add,
1839      eng_font_free,
1840      eng_font_ascent_get,
1841      eng_font_descent_get,
1842      eng_font_max_ascent_get,
1843      eng_font_max_descent_get,
1844      eng_font_string_size_get,
1845      eng_font_inset_get,
1846      eng_font_h_advance_get,
1847      eng_font_v_advance_get,
1848      eng_font_char_coords_get,
1849      eng_font_char_at_coords_get,
1850      eng_font_draw,
1851      /* font cache functions */
1852      eng_font_cache_flush,
1853      eng_font_cache_set,
1854      eng_font_cache_get,
1855      /* font hinting functions */
1856      eng_font_hinting_set,
1857      eng_font_hinting_can_hint,
1858      eng_image_scale_hint_set,
1859      eng_image_scale_hint_get,
1860      /* more font draw functions */
1861      eng_font_last_up_to_pos,
1862      eng_image_map_draw,
1863      eng_image_map_surface_new,
1864      eng_image_map_surface_free,
1865      eng_image_map_clean,
1866      NULL, // eng_image_content_hint_set - software doesn't use it
1867      NULL, // eng_image_content_hint_get - software doesn't use it
1868      eng_font_pen_coords_get,
1869      eng_font_text_props_info_create,
1870      eng_font_right_inset_get,
1871 #if 0 // filtering disabled
1872      eng_image_draw_filtered,
1873      eng_image_filtered_get,
1874      eng_image_filtered_save,
1875      eng_image_filtered_free,
1876 #endif   
1877      NULL, // need software mesa for gl rendering <- gl_surface_create
1878      NULL, // need software mesa for gl rendering <- gl_surface_destroy
1879      NULL, // need software mesa for gl rendering <- gl_context_create
1880      NULL, // need software mesa for gl rendering <- gl_context_destroy
1881      NULL, // need software mesa for gl rendering <- gl_make_current
1882      NULL, // need software mesa for gl rendering <- gl_string_query
1883      NULL, // need software mesa for gl rendering <- gl_proc_address_get
1884      NULL, // need software mesa for gl rendering <- gl_native_surface_get
1885      NULL, // need software mesa for gl rendering <- gl_api_get
1886      NULL, // need software mesa for gl rendering <- gl_img_obj_set
1887      eng_image_load_error_get,
1888      eng_font_run_font_end_get,
1889      eng_image_animated_get,
1890      eng_image_animated_frame_count_get,
1891      eng_image_animated_loop_type_get,
1892      eng_image_animated_loop_count_get,
1893      eng_image_animated_frame_duration_get,
1894      eng_image_animated_frame_set,
1895      NULL
1896    /* FUTURE software generic calls go here */
1897 };
1898
1899
1900 //----------------------------------------------------------------//
1901 //                                                                //
1902 //                      Load Symbols                              //
1903 //                                                                //
1904 //----------------------------------------------------------------//
1905 #ifdef EVAS_GL
1906 static void
1907 sym_missing(void)
1908 {
1909    ERR("GL symbols missing!\n");
1910 }
1911
1912 static int
1913 glue_sym_init(void)
1914 {
1915    //------------------------------------------------//
1916    // Use eglGetProcAddress
1917 #define FINDSYM(dst, sym, typ) \
1918    if (!dst) dst = (typeof(dst))dlsym(gl_lib_handle, sym); \
1919    if (!dst)  \
1920      { \
1921         ERR("Symbol not found %s\n", sym); \
1922         return 0; \
1923      }
1924 #define FALLBAK(dst, typ) if (!dst) dst = (typeof(dst))sym_missing;
1925
1926     //------------------------------------------------------//
1927    // OSMesa APIs...
1928    FINDSYM(_sym_OSMesaCreateContextExt, "OSMesaCreateContextExt", glsym_func_osm_ctx);
1929    FALLBAK(_sym_OSMesaCreateContextExt, glsym_func_void);
1930
1931    FINDSYM(_sym_OSMesaDestroyContext, "OSMesaDestroyContext", glsym_func_void);
1932    FALLBAK(_sym_OSMesaDestroyContext, glsym_func_void);
1933
1934    FINDSYM(_sym_OSMesaMakeCurrent, "OSMesaMakeCurrent", glsym_func_bool);
1935    FALLBAK(_sym_OSMesaMakeCurrent, glsym_func_void);
1936
1937    FINDSYM(_sym_OSMesaPixelStore, "OSMesaPixelStore", glsym_func_void);
1938    FALLBAK(_sym_OSMesaPixelStore, glsym_func_void);
1939
1940    FINDSYM(_sym_OSMesaGetProcAddress, "OSMesaGetProcAddress", glsym_func_eng_fn);
1941    FALLBAK(_sym_OSMesaGetProcAddress, glsym_func_void);
1942
1943 #undef FINDSYM
1944 #undef FALLBAK
1945
1946    return 1;
1947 }
1948
1949 static int
1950 gl_sym_init(void)
1951 {
1952    //------------------------------------------------//
1953 #define FINDSYM(dst, sym, typ) \
1954    if (!dst) dst = (typeof(dst))dlsym(gl_lib_handle, sym); \
1955    if (!dst) DBG("Symbol not found %s\n", sym);
1956 #define FALLBAK(dst, typ) if (!dst) dst = (typeof(dst))sym_missing;
1957
1958
1959    //------------------------------------------------------//
1960    // GLES 2.0 APIs...
1961    FINDSYM(_sym_glActiveTexture, "glActiveTexture", glsym_func_void);
1962    FALLBAK(_sym_glActiveTexture, glsym_func_void);
1963
1964    FINDSYM(_sym_glAttachShader, "glAttachShader", glsym_func_void);
1965    FALLBAK(_sym_glAttachShader, glsym_func_void);
1966
1967    FINDSYM(_sym_glBindAttribLocation, "glBindAttribLocation", glsym_func_void);
1968    FALLBAK(_sym_glBindAttribLocation, glsym_func_void);
1969
1970    FINDSYM(_sym_glBindBuffer, "glBindBuffer", glsym_func_void);
1971    FALLBAK(_sym_glBindBuffer, glsym_func_void);
1972
1973    FINDSYM(_sym_glBindFramebuffer, "glBindFramebuffer", glsym_func_void);
1974    FALLBAK(_sym_glBindFramebuffer, glsym_func_void);
1975
1976    FINDSYM(_sym_glBindRenderbuffer, "glBindRenderbuffer", glsym_func_void);
1977    FALLBAK(_sym_glBindRenderbuffer, glsym_func_void);
1978
1979    FINDSYM(_sym_glBindTexture, "glBindTexture", glsym_func_void);
1980    FALLBAK(_sym_glBindTexture, glsym_func_void);
1981
1982    FINDSYM(_sym_glBlendColor, "glBlendColor", glsym_func_void);
1983    FALLBAK(_sym_glBlendColor, glsym_func_void);
1984
1985    FINDSYM(_sym_glBlendEquation, "glBlendEquation", glsym_func_void);
1986    FALLBAK(_sym_glBlendEquation, glsym_func_void);
1987
1988    FINDSYM(_sym_glBlendEquationSeparate, "glBlendEquationSeparate", glsym_func_void);
1989    FALLBAK(_sym_glBlendEquationSeparate, glsym_func_void);
1990
1991    FINDSYM(_sym_glBlendFunc, "glBlendFunc", glsym_func_void);
1992    FALLBAK(_sym_glBlendFunc, glsym_func_void);
1993
1994    FINDSYM(_sym_glBlendFuncSeparate, "glBlendFuncSeparate", glsym_func_void);
1995    FALLBAK(_sym_glBlendFuncSeparate, glsym_func_void);
1996
1997    FINDSYM(_sym_glBufferData, "glBufferData", glsym_func_void);
1998    FALLBAK(_sym_glBufferData, glsym_func_void);
1999
2000    FINDSYM(_sym_glBufferSubData, "glBufferSubData", glsym_func_void);
2001    FALLBAK(_sym_glBufferSubData, glsym_func_void);
2002
2003    FINDSYM(_sym_glCheckFramebufferStatus, "glCheckFramebufferStatus", glsym_func_uint);
2004    FALLBAK(_sym_glCheckFramebufferStatus, glsym_func_uint);
2005
2006    FINDSYM(_sym_glClear, "glClear", glsym_func_void);
2007    FALLBAK(_sym_glClear, glsym_func_void);
2008
2009    FINDSYM(_sym_glClearColor, "glClearColor", glsym_func_void);
2010    FALLBAK(_sym_glClearColor, glsym_func_void);
2011
2012    FINDSYM(_sym_glClearDepthf, "glClearDepthf", glsym_func_void);
2013    FINDSYM(_sym_glClearDepthf, "glClearDepth", glsym_func_void);
2014    FALLBAK(_sym_glClearDepthf, glsym_func_void);
2015
2016    FINDSYM(_sym_glClearStencil, "glClearStencil", glsym_func_void);
2017    FALLBAK(_sym_glClearStencil, glsym_func_void);
2018
2019    FINDSYM(_sym_glColorMask, "glColorMask", glsym_func_void);
2020    FALLBAK(_sym_glColorMask, glsym_func_void);
2021
2022    FINDSYM(_sym_glCompileShader, "glCompileShader", glsym_func_void);
2023    FALLBAK(_sym_glCompileShader, glsym_func_void);
2024
2025    FINDSYM(_sym_glCompressedTexImage2D, "glCompressedTexImage2D", glsym_func_void);
2026    FALLBAK(_sym_glCompressedTexImage2D, glsym_func_void);
2027
2028    FINDSYM(_sym_glCompressedTexSubImage2D, "glCompressedTexSubImage2D", glsym_func_void);
2029    FALLBAK(_sym_glCompressedTexSubImage2D, glsym_func_void);
2030
2031    FINDSYM(_sym_glCopyTexImage2D, "glCopyTexImage2D", glsym_func_void);
2032    FALLBAK(_sym_glCopyTexImage2D, glsym_func_void);
2033
2034    FINDSYM(_sym_glCopyTexSubImage2D, "glCopyTexSubImage2D", glsym_func_void);
2035    FALLBAK(_sym_glCopyTexSubImage2D, glsym_func_void);
2036
2037    FINDSYM(_sym_glCreateProgram, "glCreateProgram", glsym_func_uint);
2038    FALLBAK(_sym_glCreateProgram, glsym_func_uint);
2039
2040    FINDSYM(_sym_glCreateShader, "glCreateShader", glsym_func_uint);
2041    FALLBAK(_sym_glCreateShader, glsym_func_uint);
2042
2043    FINDSYM(_sym_glCullFace, "glCullFace", glsym_func_void);
2044    FALLBAK(_sym_glCullFace, glsym_func_void);
2045
2046    FINDSYM(_sym_glDeleteBuffers, "glDeleteBuffers", glsym_func_void);
2047    FALLBAK(_sym_glDeleteBuffers, glsym_func_void);
2048
2049    FINDSYM(_sym_glDeleteFramebuffers, "glDeleteFramebuffers", glsym_func_void);
2050    FALLBAK(_sym_glDeleteFramebuffers, glsym_func_void);
2051
2052    FINDSYM(_sym_glDeleteProgram, "glDeleteProgram", glsym_func_void);
2053    FALLBAK(_sym_glDeleteProgram, glsym_func_void);
2054
2055    FINDSYM(_sym_glDeleteRenderbuffers, "glDeleteRenderbuffers", glsym_func_void);
2056    FALLBAK(_sym_glDeleteRenderbuffers, glsym_func_void);
2057
2058    FINDSYM(_sym_glDeleteShader, "glDeleteShader", glsym_func_void);
2059    FALLBAK(_sym_glDeleteShader, glsym_func_void);
2060
2061    FINDSYM(_sym_glDeleteTextures, "glDeleteTextures", glsym_func_void);
2062    FALLBAK(_sym_glDeleteTextures, glsym_func_void);
2063
2064    FINDSYM(_sym_glDepthFunc, "glDepthFunc", glsym_func_void);
2065    FALLBAK(_sym_glDepthFunc, glsym_func_void);
2066
2067    FINDSYM(_sym_glDepthMask, "glDepthMask", glsym_func_void);
2068    FALLBAK(_sym_glDepthMask, glsym_func_void);
2069
2070    FINDSYM(_sym_glDepthRangef, "glDepthRangef", glsym_func_void);
2071    FINDSYM(_sym_glDepthRangef, "glDepthRange", glsym_func_void);
2072    FALLBAK(_sym_glDepthRangef, glsym_func_void);
2073
2074    FINDSYM(_sym_glDetachShader, "glDetachShader", glsym_func_void);
2075    FALLBAK(_sym_glDetachShader, glsym_func_void);
2076
2077    FINDSYM(_sym_glDisable, "glDisable", glsym_func_void);
2078    FALLBAK(_sym_glDisable, glsym_func_void);
2079
2080    FINDSYM(_sym_glDisableVertexAttribArray, "glDisableVertexAttribArray", glsym_func_void);
2081    FALLBAK(_sym_glDisableVertexAttribArray, glsym_func_void);
2082
2083    FINDSYM(_sym_glDrawArrays, "glDrawArrays", glsym_func_void);
2084    FALLBAK(_sym_glDrawArrays, glsym_func_void);
2085
2086    FINDSYM(_sym_glDrawElements, "glDrawElements", glsym_func_void);
2087    FALLBAK(_sym_glDrawElements, glsym_func_void);
2088
2089    FINDSYM(_sym_glEnable, "glEnable", glsym_func_void);
2090    FALLBAK(_sym_glEnable, glsym_func_void);
2091
2092    FINDSYM(_sym_glEnableVertexAttribArray, "glEnableVertexAttribArray", glsym_func_void);
2093    FALLBAK(_sym_glEnableVertexAttribArray, glsym_func_void);
2094
2095    FINDSYM(_sym_glFinish, "glFinish", glsym_func_void);
2096    FALLBAK(_sym_glFinish, glsym_func_void);
2097
2098    FINDSYM(_sym_glFlush, "glFlush", glsym_func_void);
2099    FALLBAK(_sym_glFlush, glsym_func_void);
2100
2101    FINDSYM(_sym_glFramebufferRenderbuffer, "glFramebufferRenderbuffer", glsym_func_void);
2102    FALLBAK(_sym_glFramebufferRenderbuffer, glsym_func_void);
2103
2104    FINDSYM(_sym_glFramebufferTexture2D, "glFramebufferTexture2D", glsym_func_void);
2105    FALLBAK(_sym_glFramebufferTexture2D, glsym_func_void);
2106
2107    FINDSYM(_sym_glFrontFace, "glFrontFace", glsym_func_void);
2108    FALLBAK(_sym_glFrontFace, glsym_func_void);
2109
2110    FINDSYM(_sym_glGenBuffers, "glGenBuffers", glsym_func_void);
2111    FALLBAK(_sym_glGenBuffers, glsym_func_void);
2112
2113    FINDSYM(_sym_glGenerateMipmap, "glGenerateMipmap", glsym_func_void);
2114    FALLBAK(_sym_glGenerateMipmap, glsym_func_void);
2115
2116    FINDSYM(_sym_glGenFramebuffers, "glGenFramebuffers", glsym_func_void);
2117    FALLBAK(_sym_glGenFramebuffers, glsym_func_void);
2118
2119    FINDSYM(_sym_glGenRenderbuffers, "glGenRenderbuffers", glsym_func_void);
2120    FALLBAK(_sym_glGenRenderbuffers, glsym_func_void);
2121
2122    FINDSYM(_sym_glGenTextures, "glGenTextures", glsym_func_void);
2123    FALLBAK(_sym_glGenTextures, glsym_func_void);
2124
2125    FINDSYM(_sym_glGetActiveAttrib, "glGetActiveAttrib", glsym_func_void);
2126    FALLBAK(_sym_glGetActiveAttrib, glsym_func_void);
2127
2128    FINDSYM(_sym_glGetActiveUniform, "glGetActiveUniform", glsym_func_void);
2129    FALLBAK(_sym_glGetActiveUniform, glsym_func_void);
2130
2131    FINDSYM(_sym_glGetAttachedShaders, "glGetAttachedShaders", glsym_func_void);
2132    FALLBAK(_sym_glGetAttachedShaders, glsym_func_void);
2133
2134    FINDSYM(_sym_glGetAttribLocation, "glGetAttribLocation", glsym_func_int);
2135    FALLBAK(_sym_glGetAttribLocation, glsym_func_int);
2136
2137    FINDSYM(_sym_glGetBooleanv, "glGetBooleanv", glsym_func_void);
2138    FALLBAK(_sym_glGetBooleanv, glsym_func_void);
2139
2140    FINDSYM(_sym_glGetBufferParameteriv, "glGetBufferParameteriv", glsym_func_void);
2141    FALLBAK(_sym_glGetBufferParameteriv, glsym_func_void);
2142
2143    FINDSYM(_sym_glGetError, "glGetError", glsym_func_uint);
2144    FALLBAK(_sym_glGetError, glsym_func_uint);
2145
2146    FINDSYM(_sym_glGetFloatv, "glGetFloatv", glsym_func_void);
2147    FALLBAK(_sym_glGetFloatv, glsym_func_void);
2148
2149    FINDSYM(_sym_glGetFramebufferAttachmentParameteriv, "glGetFramebufferAttachmentParameteriv", glsym_func_void);
2150    FALLBAK(_sym_glGetFramebufferAttachmentParameteriv, glsym_func_void);
2151
2152    FINDSYM(_sym_glGetIntegerv, "glGetIntegerv", glsym_func_void);
2153    FALLBAK(_sym_glGetIntegerv, glsym_func_void);
2154
2155    FINDSYM(_sym_glGetProgramiv, "glGetProgramiv", glsym_func_void);
2156    FALLBAK(_sym_glGetProgramiv, glsym_func_void);
2157
2158    FINDSYM(_sym_glGetProgramInfoLog, "glGetProgramInfoLog", glsym_func_void);
2159    FALLBAK(_sym_glGetProgramInfoLog, glsym_func_void);
2160
2161    FINDSYM(_sym_glGetRenderbufferParameteriv, "glGetRenderbufferParameteriv", glsym_func_void);
2162    FALLBAK(_sym_glGetRenderbufferParameteriv, glsym_func_void);
2163
2164    FINDSYM(_sym_glGetShaderiv, "glGetShaderiv", glsym_func_void);
2165    FALLBAK(_sym_glGetShaderiv, glsym_func_void);
2166
2167    FINDSYM(_sym_glGetShaderInfoLog, "glGetShaderInfoLog", glsym_func_void);
2168    FALLBAK(_sym_glGetShaderInfoLog, glsym_func_void);
2169
2170    FINDSYM(_sym_glGetShaderPrecisionFormat, "glGetShaderPrecisionFormat", glsym_func_void);
2171    FALLBAK(_sym_glGetShaderPrecisionFormat, glsym_func_void);
2172
2173    FINDSYM(_sym_glGetShaderSource, "glGetShaderSource", glsym_func_void);
2174    FALLBAK(_sym_glGetShaderSource, glsym_func_void);
2175
2176    FINDSYM(_sym_glGetString, "glGetString", glsym_func_uchar_ptr);
2177    FALLBAK(_sym_glGetString, glsym_func_const_uchar_ptr);
2178
2179    FINDSYM(_sym_glGetTexParameterfv, "glGetTexParameterfv", glsym_func_void);
2180    FALLBAK(_sym_glGetTexParameterfv, glsym_func_void);
2181
2182    FINDSYM(_sym_glGetTexParameteriv, "glGetTexParameteriv", glsym_func_void);
2183    FALLBAK(_sym_glGetTexParameteriv, glsym_func_void);
2184
2185    FINDSYM(_sym_glGetUniformfv, "glGetUniformfv", glsym_func_void);
2186    FALLBAK(_sym_glGetUniformfv, glsym_func_void);
2187
2188    FINDSYM(_sym_glGetUniformiv, "glGetUniformiv", glsym_func_void);
2189    FALLBAK(_sym_glGetUniformiv, glsym_func_void);
2190
2191    FINDSYM(_sym_glGetUniformLocation, "glGetUniformLocation", glsym_func_int);
2192    FALLBAK(_sym_glGetUniformLocation, glsym_func_int);
2193
2194    FINDSYM(_sym_glGetVertexAttribfv, "glGetVertexAttribfv", glsym_func_void);
2195    FALLBAK(_sym_glGetVertexAttribfv, glsym_func_void);
2196
2197    FINDSYM(_sym_glGetVertexAttribiv, "glGetVertexAttribiv", glsym_func_void);
2198    FALLBAK(_sym_glGetVertexAttribiv, glsym_func_void);
2199
2200    FINDSYM(_sym_glGetVertexAttribPointerv, "glGetVertexAttribPointerv", glsym_func_void);
2201    FALLBAK(_sym_glGetVertexAttribPointerv, glsym_func_void);
2202
2203    FINDSYM(_sym_glHint, "glHint", glsym_func_void);
2204    FALLBAK(_sym_glHint, glsym_func_void);
2205
2206    FINDSYM(_sym_glIsBuffer, "glIsBuffer", glsym_func_uchar);
2207    FALLBAK(_sym_glIsBuffer, glsym_func_uchar);
2208
2209    FINDSYM(_sym_glIsEnabled, "glIsEnabled", glsym_func_uchar);
2210    FALLBAK(_sym_glIsEnabled, glsym_func_uchar);
2211
2212    FINDSYM(_sym_glIsFramebuffer, "glIsFramebuffer", glsym_func_uchar);
2213    FALLBAK(_sym_glIsFramebuffer, glsym_func_uchar);
2214
2215    FINDSYM(_sym_glIsProgram, "glIsProgram", glsym_func_uchar);
2216    FALLBAK(_sym_glIsProgram, glsym_func_uchar);
2217
2218    FINDSYM(_sym_glIsRenderbuffer, "glIsRenderbuffer", glsym_func_uchar);
2219    FALLBAK(_sym_glIsRenderbuffer, glsym_func_uchar);
2220
2221    FINDSYM(_sym_glIsShader, "glIsShader", glsym_func_uchar);
2222    FALLBAK(_sym_glIsShader, glsym_func_uchar);
2223
2224    FINDSYM(_sym_glIsTexture, "glIsTexture", glsym_func_uchar);
2225    FALLBAK(_sym_glIsTexture, glsym_func_uchar);
2226
2227    FINDSYM(_sym_glLineWidth, "glLineWidth", glsym_func_void);
2228    FALLBAK(_sym_glLineWidth, glsym_func_void);
2229
2230    FINDSYM(_sym_glLinkProgram, "glLinkProgram", glsym_func_void);
2231    FALLBAK(_sym_glLinkProgram, glsym_func_void);
2232
2233    FINDSYM(_sym_glPixelStorei, "glPixelStorei", glsym_func_void);
2234    FALLBAK(_sym_glPixelStorei, glsym_func_void);
2235
2236    FINDSYM(_sym_glPolygonOffset, "glPolygonOffset", glsym_func_void);
2237    FALLBAK(_sym_glPolygonOffset, glsym_func_void);
2238
2239    FINDSYM(_sym_glReadPixels, "glReadPixels", glsym_func_void);
2240    FALLBAK(_sym_glReadPixels, glsym_func_void);
2241
2242    FINDSYM(_sym_glReleaseShaderCompiler, "glReleaseShaderCompiler", glsym_func_void);
2243    FALLBAK(_sym_glReleaseShaderCompiler, glsym_func_void);
2244
2245    FINDSYM(_sym_glRenderbufferStorage, "glRenderbufferStorage", glsym_func_void);
2246    FALLBAK(_sym_glRenderbufferStorage, glsym_func_void);
2247
2248    FINDSYM(_sym_glSampleCoverage, "glSampleCoverage", glsym_func_void);
2249    FALLBAK(_sym_glSampleCoverage, glsym_func_void);
2250
2251    FINDSYM(_sym_glScissor, "glScissor", glsym_func_void);
2252    FALLBAK(_sym_glScissor, glsym_func_void);
2253
2254    FINDSYM(_sym_glShaderBinary, "glShaderBinary", glsym_func_void);
2255    FALLBAK(_sym_glShaderBinary, glsym_func_void);
2256
2257    FINDSYM(_sym_glShaderSource, "glShaderSource", glsym_func_void);
2258    FALLBAK(_sym_glShaderSource, glsym_func_void);
2259
2260    FINDSYM(_sym_glStencilFunc, "glStencilFunc", glsym_func_void);
2261    FALLBAK(_sym_glStencilFunc, glsym_func_void);
2262
2263    FINDSYM(_sym_glStencilFuncSeparate, "glStencilFuncSeparate", glsym_func_void);
2264    FALLBAK(_sym_glStencilFuncSeparate, glsym_func_void);
2265
2266    FINDSYM(_sym_glStencilMask, "glStencilMask", glsym_func_void);
2267    FALLBAK(_sym_glStencilMask, glsym_func_void);
2268
2269    FINDSYM(_sym_glStencilMaskSeparate, "glStencilMaskSeparate", glsym_func_void);
2270    FALLBAK(_sym_glStencilMaskSeparate, glsym_func_void);
2271
2272    FINDSYM(_sym_glStencilOp, "glStencilOp", glsym_func_void);
2273    FALLBAK(_sym_glStencilOp, glsym_func_void);
2274
2275    FINDSYM(_sym_glStencilOpSeparate, "glStencilOpSeparate", glsym_func_void);
2276    FALLBAK(_sym_glStencilOpSeparate, glsym_func_void);
2277
2278    FINDSYM(_sym_glTexImage2D, "glTexImage2D", glsym_func_void);
2279    FALLBAK(_sym_glTexImage2D, glsym_func_void);
2280
2281    FINDSYM(_sym_glTexParameterf, "glTexParameterf", glsym_func_void);
2282    FALLBAK(_sym_glTexParameterf, glsym_func_void);
2283
2284    FINDSYM(_sym_glTexParameterfv, "glTexParameterfv", glsym_func_void);
2285    FALLBAK(_sym_glTexParameterfv, glsym_func_void);
2286
2287    FINDSYM(_sym_glTexParameteri, "glTexParameteri", glsym_func_void);
2288    FALLBAK(_sym_glTexParameteri, glsym_func_void);
2289
2290    FINDSYM(_sym_glTexParameteriv, "glTexParameteriv", glsym_func_void);
2291    FALLBAK(_sym_glTexParameteriv, glsym_func_void);
2292
2293    FINDSYM(_sym_glTexSubImage2D, "glTexSubImage2D", glsym_func_void);
2294    FALLBAK(_sym_glTexSubImage2D, glsym_func_void);
2295
2296    FINDSYM(_sym_glUniform1f, "glUniform1f", glsym_func_void);
2297    FALLBAK(_sym_glUniform1f, glsym_func_void);
2298
2299    FINDSYM(_sym_glUniform1fv, "glUniform1fv", glsym_func_void);
2300    FALLBAK(_sym_glUniform1fv, glsym_func_void);
2301
2302    FINDSYM(_sym_glUniform1i, "glUniform1i", glsym_func_void);
2303    FALLBAK(_sym_glUniform1i, glsym_func_void);
2304
2305    FINDSYM(_sym_glUniform1iv, "glUniform1iv", glsym_func_void);
2306    FALLBAK(_sym_glUniform1iv, glsym_func_void);
2307
2308    FINDSYM(_sym_glUniform2f, "glUniform2f", glsym_func_void);
2309    FALLBAK(_sym_glUniform2f, glsym_func_void);
2310
2311    FINDSYM(_sym_glUniform2fv, "glUniform2fv", glsym_func_void);
2312    FALLBAK(_sym_glUniform2fv, glsym_func_void);
2313
2314    FINDSYM(_sym_glUniform2i, "glUniform2i", glsym_func_void);
2315    FALLBAK(_sym_glUniform2i, glsym_func_void);
2316
2317    FINDSYM(_sym_glUniform2iv, "glUniform2iv", glsym_func_void);
2318    FALLBAK(_sym_glUniform2iv, glsym_func_void);
2319
2320    FINDSYM(_sym_glUniform3f, "glUniform3f", glsym_func_void);
2321    FALLBAK(_sym_glUniform3f, glsym_func_void);
2322
2323    FINDSYM(_sym_glUniform3fv, "glUniform3fv", glsym_func_void);
2324    FALLBAK(_sym_glUniform3fv, glsym_func_void);
2325
2326    FINDSYM(_sym_glUniform3i, "glUniform3i", glsym_func_void);
2327    FALLBAK(_sym_glUniform3i, glsym_func_void);
2328
2329    FINDSYM(_sym_glUniform3iv, "glUniform3iv", glsym_func_void);
2330    FALLBAK(_sym_glUniform3iv, glsym_func_void);
2331
2332    FINDSYM(_sym_glUniform4f, "glUniform4f", glsym_func_void);
2333    FALLBAK(_sym_glUniform4f, glsym_func_void);
2334
2335    FINDSYM(_sym_glUniform4fv, "glUniform4fv", glsym_func_void);
2336    FALLBAK(_sym_glUniform4fv, glsym_func_void);
2337
2338    FINDSYM(_sym_glUniform4i, "glUniform4i", glsym_func_void);
2339    FALLBAK(_sym_glUniform4i, glsym_func_void);
2340
2341    FINDSYM(_sym_glUniform4iv, "glUniform4iv", glsym_func_void);
2342    FALLBAK(_sym_glUniform4iv, glsym_func_void);
2343
2344    FINDSYM(_sym_glUniformMatrix2fv, "glUniformMatrix2fv", glsym_func_void);
2345    FALLBAK(_sym_glUniformMatrix2fv, glsym_func_void);
2346
2347    FINDSYM(_sym_glUniformMatrix3fv, "glUniformMatrix3fv", glsym_func_void);
2348    FALLBAK(_sym_glUniformMatrix3fv, glsym_func_void);
2349
2350    FINDSYM(_sym_glUniformMatrix4fv, "glUniformMatrix4fv", glsym_func_void);
2351    FALLBAK(_sym_glUniformMatrix4fv, glsym_func_void);
2352
2353    FINDSYM(_sym_glUseProgram, "glUseProgram", glsym_func_void);
2354    FALLBAK(_sym_glUseProgram, glsym_func_void);
2355
2356    FINDSYM(_sym_glValidateProgram, "glValidateProgram", glsym_func_void);
2357    FALLBAK(_sym_glValidateProgram, glsym_func_void);
2358
2359    FINDSYM(_sym_glVertexAttrib1f, "glVertexAttrib1f", glsym_func_void);
2360    FALLBAK(_sym_glVertexAttrib1f, glsym_func_void);
2361
2362    FINDSYM(_sym_glVertexAttrib1fv, "glVertexAttrib1fv", glsym_func_void);
2363    FALLBAK(_sym_glVertexAttrib1fv, glsym_func_void);
2364
2365    FINDSYM(_sym_glVertexAttrib2f, "glVertexAttrib2f", glsym_func_void);
2366    FALLBAK(_sym_glVertexAttrib2f, glsym_func_void);
2367
2368    FINDSYM(_sym_glVertexAttrib2fv, "glVertexAttrib2fv", glsym_func_void);
2369    FALLBAK(_sym_glVertexAttrib2fv, glsym_func_void);
2370
2371    FINDSYM(_sym_glVertexAttrib3f, "glVertexAttrib3f", glsym_func_void);
2372    FALLBAK(_sym_glVertexAttrib3f, glsym_func_void);
2373
2374    FINDSYM(_sym_glVertexAttrib3fv, "glVertexAttrib3fv", glsym_func_void);
2375    FALLBAK(_sym_glVertexAttrib3fv, glsym_func_void);
2376
2377    FINDSYM(_sym_glVertexAttrib4f, "glVertexAttrib4f", glsym_func_void);
2378    FALLBAK(_sym_glVertexAttrib4f, glsym_func_void);
2379
2380    FINDSYM(_sym_glVertexAttrib4fv, "glVertexAttrib4fv", glsym_func_void);
2381    FALLBAK(_sym_glVertexAttrib4fv, glsym_func_void);
2382
2383    FINDSYM(_sym_glVertexAttribPointer, "glVertexAttribPointer", glsym_func_void);
2384    FALLBAK(_sym_glVertexAttribPointer, glsym_func_void);
2385
2386    FINDSYM(_sym_glViewport, "glViewport", glsym_func_void);
2387    FALLBAK(_sym_glViewport, glsym_func_void);
2388
2389 #undef FINDSYM
2390 #undef FALLBAK
2391
2392    // Checking to see if this function exists is a poor but reasonable way to 
2393    // check if it's gles but it works for now
2394    if (_sym_glGetShaderPrecisionFormat != (typeof(_sym_glGetShaderPrecisionFormat))sym_missing ) 
2395      {
2396         DBG("GL Library is GLES.");
2397         gl_lib_is_gles = 1;
2398      }
2399
2400    return 1;
2401 }
2402
2403 //--------------------------------------------------------------//
2404 // Wrapped GL APIs to handle desktop compatibility
2405
2406 // Stripping precision code from GLES shader for desktop compatibility
2407 // Code adopted from Meego GL code. Temporary Fix.  
2408 static const char *
2409 opengl_strtok(const char *s, int *n, char **saveptr, char *prevbuf)
2410 {
2411    char *start;
2412    char *ret;
2413    char *p;
2414    int retlen;
2415    static const char *delim = " \t\n\r/";
2416
2417    if (prevbuf) free(prevbuf);
2418
2419    if (s) 
2420       *saveptr = (char *)s;
2421    else 
2422      {
2423         if (!(*saveptr) || !(*n))
2424            return NULL;
2425         s = *saveptr;
2426      }
2427
2428    for (; *n && strchr(delim, *s); s++, (*n)--) 
2429      {
2430         if (*s == '/' && *n > 1) 
2431           {
2432              if (s[1] == '/') 
2433                {
2434                   do 
2435                     {
2436                        s++, (*n)--;
2437                     } 
2438                   while (*n > 1 && s[1] != '\n' && s[1] != '\r');
2439                } 
2440              else if (s[1] == '*') 
2441                {
2442                   do 
2443                     {
2444                        s++, (*n)--;
2445                     } 
2446                   while (*n > 2 && (s[1] != '*' || s[2] != '/'));
2447                   s++, (*n)--;
2448                }
2449           }
2450      }
2451
2452    start = (char *)s;
2453    for (; *n && *s && !strchr(delim, *s); s++, (*n)--);
2454    if (*n > 0) s++, (*n)--;
2455
2456    *saveptr = (char *)s;
2457
2458    retlen = s - start;
2459    ret = malloc(retlen + 1);
2460    p = ret;
2461
2462    while (retlen > 0) 
2463      {
2464         if (*start == '/' && retlen > 1) 
2465           {
2466              if (start[1] == '/') 
2467                {
2468                   do 
2469                     {
2470                        start++, retlen--;
2471                     } 
2472                   while (retlen > 1 && start[1] != '\n' && start[1] != '\r');
2473                   start++, retlen--;
2474                   continue;
2475                } 
2476              else if (start[1] == '*') 
2477                {
2478                   do 
2479                     {
2480                        start++, retlen--;
2481                     } 
2482                   while (retlen > 2 && (start[1] != '*' || start[2] != '/'));
2483                   start += 3, retlen -= 3;
2484                   continue;
2485                }
2486           }
2487         *(p++) = *(start++), retlen--;
2488      }
2489
2490    *p = 0;
2491    return ret;
2492 }       
2493
2494 static char *
2495 patch_gles_shader(const char *source, int length, int *patched_len)
2496 {
2497    char *saveptr = NULL;
2498    char *sp;
2499    char *p = NULL;
2500
2501    if (!length) length = strlen(source);
2502
2503    *patched_len = 0;
2504    int patched_size = length;
2505    char *patched = malloc(patched_size + 1);
2506
2507    if (!patched) return NULL;
2508
2509    p = (char *)opengl_strtok(source, &length, &saveptr, NULL);
2510    for (; p; p = (char *)opengl_strtok(0, &length, &saveptr, p)) 
2511      {
2512         if (!strncmp(p, "lowp", 4) || !strncmp(p, "mediump", 7) || !strncmp(p, "highp", 5)) 
2513           {
2514              continue;
2515           } 
2516         else if (!strncmp(p, "precision", 9)) 
2517           {
2518              while ((p = (char *)opengl_strtok(0, &length, &saveptr, p)) && !strchr(p, ';'));
2519           } 
2520         else 
2521           {
2522              if (!strncmp(p, "gl_MaxVertexUniformVectors", 26)) 
2523                {
2524                   p = "(gl_MaxVertexUniformComponents / 4)";
2525                } 
2526              else if (!strncmp(p, "gl_MaxFragmentUniformVectors", 28)) 
2527                {
2528                   p = "(gl_MaxFragmentUniformComponents / 4)";
2529                } 
2530              else if (!strncmp(p, "gl_MaxVaryingVectors", 20)) 
2531                {
2532                   p = "(gl_MaxVaryingFloats / 4)";
2533                }
2534
2535              int new_len = strlen(p);
2536              if (*patched_len + new_len > patched_size) 
2537                {
2538                   patched_size *= 2;
2539                   patched = realloc(patched, patched_size + 1);
2540
2541                   if (!patched) 
2542                      return NULL;
2543                }
2544
2545              memcpy(patched + *patched_len, p, new_len);
2546              *patched_len += new_len;
2547           }     
2548      }
2549
2550    patched[*patched_len] = 0;
2551    /* check that we don't leave dummy preprocessor lines */
2552    for (sp = patched; *sp;) 
2553      {
2554         for (; *sp == ' ' || *sp == '\t'; sp++);
2555         if (!strncmp(sp, "#define", 7)) 
2556           {
2557              for (p = sp + 7; *p == ' ' || *p == '\t'; p++);
2558              if (*p == '\n' || *p == '\r' || *p == '/') 
2559                {
2560                   memset(sp, 0x20, 7);
2561                }
2562           }
2563         for (; *sp && *sp != '\n' && *sp != '\r'; sp++);
2564         for (; *sp == '\n' || *sp == '\r'; sp++);
2565      }
2566    return patched;
2567 }
2568
2569 static void
2570 evgl_glShaderSource(GLuint shader, GLsizei count, const char** string, const GLint* length)
2571 {
2572    int i = 0, len = 0;
2573
2574    char **s = malloc(count * sizeof(char*));
2575    GLint *l = malloc(count * sizeof(GLint));
2576
2577    memset(s, 0, count * sizeof(char*));
2578    memset(l, 0, count * sizeof(GLint));
2579
2580    for (i = 0; i < count; ++i) 
2581      {
2582         if (length) 
2583           {
2584              len = length[i];
2585              if (len < 0) 
2586                 len = string[i] ? strlen(string[i]) : 0;
2587           }
2588         else
2589            len = string[i] ? strlen(string[i]) : 0;
2590
2591         if (string[i]) 
2592           {
2593              s[i] = patch_gles_shader(string[i], len, &l[i]);
2594              if (!s[i]) 
2595                {
2596                   while(i)
2597                      free(s[--i]);
2598                   free(l);
2599                   free(s);
2600
2601                   DBG("Patching Shader Failed.");
2602                   return;
2603                }
2604           } 
2605         else 
2606           {
2607              s[i] = NULL;
2608              l[i] = 0;
2609           }
2610      }
2611
2612    _sym_glShaderSource(shader, count, (const char **)s, l);
2613
2614    while(i)
2615       free(s[--i]);
2616    free(l);
2617    free(s);
2618 }
2619
2620
2621 static void
2622 evgl_glGetShaderPrecisionFormat(GLenum shadertype __UNUSED__, GLenum precisiontype __UNUSED__, GLint* range, GLint* precision)
2623 {
2624    if (range)
2625      {
2626         range[0] = -126; // floor(log2(FLT_MIN))
2627         range[1] = 127; // floor(log2(FLT_MAX))
2628      }
2629    if (precision)
2630      {
2631         precision[0] = 24; // floor(-log2((1.0/16777218.0)));
2632      }
2633    return;
2634 }
2635
2636 static void
2637 evgl_glReleaseShaderCompiler(void)
2638 {
2639    DBG("Not supported in Desktop GL");
2640    return;
2641 }
2642
2643 static void
2644 evgl_glShaderBinary(GLsizei n __UNUSED__, const GLuint* shaders __UNUSED__, GLenum binaryformat __UNUSED__, const void* binary __UNUSED__, GLsizei length __UNUSED__)
2645 {
2646    // FIXME: need to dlsym/getprocaddress for this
2647    DBG("Not supported in Desktop GL");
2648    return;
2649    //n = binaryformat = length = 0;
2650    //shaders = binary = 0;
2651 }
2652 #endif
2653 //--------------------------------------------------------------//
2654
2655
2656 #ifdef EVAS_GL
2657 static void
2658 override_gl_apis(Evas_GL_API *api)
2659 {
2660
2661    api->version = EVAS_GL_API_VERSION;
2662
2663 #define ORD(f) EVAS_API_OVERRIDE(f, api, _sym_)
2664    // GLES 2.0
2665    ORD(glActiveTexture);
2666    ORD(glAttachShader);
2667    ORD(glBindAttribLocation);
2668    ORD(glBindBuffer);
2669    ORD(glBindFramebuffer);
2670    ORD(glBindRenderbuffer);
2671    ORD(glBindTexture);
2672    ORD(glBlendColor);
2673    ORD(glBlendEquation);
2674    ORD(glBlendEquationSeparate);
2675    ORD(glBlendFunc);
2676    ORD(glBlendFuncSeparate);
2677    ORD(glBufferData);
2678    ORD(glBufferSubData);
2679    ORD(glCheckFramebufferStatus);
2680    ORD(glClear);
2681    ORD(glClearColor);
2682    ORD(glClearDepthf);     
2683    ORD(glClearStencil);
2684    ORD(glColorMask);
2685    ORD(glCompileShader);
2686    ORD(glCompressedTexImage2D);
2687    ORD(glCompressedTexSubImage2D);
2688    ORD(glCopyTexImage2D);
2689    ORD(glCopyTexSubImage2D);
2690    ORD(glCreateProgram);
2691    ORD(glCreateShader);
2692    ORD(glCullFace);
2693    ORD(glDeleteBuffers);
2694    ORD(glDeleteFramebuffers);
2695    ORD(glDeleteProgram);
2696    ORD(glDeleteRenderbuffers);
2697    ORD(glDeleteShader);
2698    ORD(glDeleteTextures);
2699    ORD(glDepthFunc);
2700    ORD(glDepthMask);
2701    ORD(glDepthRangef);     
2702    ORD(glDetachShader);
2703    ORD(glDisable);
2704    ORD(glDisableVertexAttribArray);
2705    ORD(glDrawArrays);
2706    ORD(glDrawElements);
2707    ORD(glEnable);
2708    ORD(glEnableVertexAttribArray);
2709    ORD(glFinish);
2710    ORD(glFlush);
2711    ORD(glFramebufferRenderbuffer);
2712    ORD(glFramebufferTexture2D);
2713    ORD(glFrontFace);
2714    ORD(glGenBuffers);
2715    ORD(glGenerateMipmap);
2716    ORD(glGenFramebuffers);
2717    ORD(glGenRenderbuffers);
2718    ORD(glGenTextures);
2719    ORD(glGetActiveAttrib);
2720    ORD(glGetActiveUniform);
2721    ORD(glGetAttachedShaders);
2722    ORD(glGetAttribLocation);
2723    ORD(glGetBooleanv);
2724    ORD(glGetBufferParameteriv);
2725    ORD(glGetError);
2726    ORD(glGetFloatv);
2727    ORD(glGetFramebufferAttachmentParameteriv);
2728    ORD(glGetIntegerv);
2729    ORD(glGetProgramiv);
2730    ORD(glGetProgramInfoLog);
2731    ORD(glGetRenderbufferParameteriv);
2732    ORD(glGetShaderiv);
2733    ORD(glGetShaderInfoLog);
2734    ORD(glGetShaderPrecisionFormat);  
2735    ORD(glGetShaderSource);
2736    ORD(glGetString);             // FIXME
2737    ORD(glGetTexParameterfv);
2738    ORD(glGetTexParameteriv);
2739    ORD(glGetUniformfv);
2740    ORD(glGetUniformiv);
2741    ORD(glGetUniformLocation);
2742    ORD(glGetVertexAttribfv);
2743    ORD(glGetVertexAttribiv);
2744    ORD(glGetVertexAttribPointerv);
2745    ORD(glHint);
2746    ORD(glIsBuffer);
2747    ORD(glIsEnabled);
2748    ORD(glIsFramebuffer);
2749    ORD(glIsProgram);
2750    ORD(glIsRenderbuffer);
2751    ORD(glIsShader);
2752    ORD(glIsTexture);
2753    ORD(glLineWidth);
2754    ORD(glLinkProgram);
2755    ORD(glPixelStorei);
2756    ORD(glPolygonOffset);
2757    ORD(glReadPixels);
2758    ORD(glReleaseShaderCompiler); 
2759    ORD(glRenderbufferStorage);
2760    ORD(glSampleCoverage);
2761    ORD(glScissor);
2762    ORD(glShaderBinary); 
2763    ORD(glShaderSource);
2764    ORD(glStencilFunc);
2765    ORD(glStencilFuncSeparate);
2766    ORD(glStencilMask);
2767    ORD(glStencilMaskSeparate);
2768    ORD(glStencilOp);
2769    ORD(glStencilOpSeparate);
2770    ORD(glTexImage2D);
2771    ORD(glTexParameterf);
2772    ORD(glTexParameterfv);
2773    ORD(glTexParameteri);
2774    ORD(glTexParameteriv);
2775    ORD(glTexSubImage2D);
2776    ORD(glUniform1f);
2777    ORD(glUniform1fv);
2778    ORD(glUniform1i);
2779    ORD(glUniform1iv);
2780    ORD(glUniform2f);
2781    ORD(glUniform2fv);
2782    ORD(glUniform2i);
2783    ORD(glUniform2iv);
2784    ORD(glUniform3f);
2785    ORD(glUniform3fv);
2786    ORD(glUniform3i);
2787    ORD(glUniform3iv);
2788    ORD(glUniform4f);
2789    ORD(glUniform4fv);
2790    ORD(glUniform4i);
2791    ORD(glUniform4iv);
2792    ORD(glUniformMatrix2fv);
2793    ORD(glUniformMatrix3fv);
2794    ORD(glUniformMatrix4fv);
2795    ORD(glUseProgram);
2796    ORD(glValidateProgram);
2797    ORD(glVertexAttrib1f);
2798    ORD(glVertexAttrib1fv);
2799    ORD(glVertexAttrib2f);
2800    ORD(glVertexAttrib2fv);
2801    ORD(glVertexAttrib3f);
2802    ORD(glVertexAttrib3fv);
2803    ORD(glVertexAttrib4f);
2804    ORD(glVertexAttrib4fv);
2805    ORD(glVertexAttribPointer);
2806    ORD(glViewport);
2807 #undef ORD
2808
2809 #define ORD(f) EVAS_API_OVERRIDE(f, &gl_funcs, evgl_)
2810    if (!gl_lib_is_gles)
2811      {
2812         // Override functions wrapped by Evas_GL
2813         // GLES2.0 API compat on top of desktop gl
2814         ORD(glGetShaderPrecisionFormat);
2815         ORD(glReleaseShaderCompiler);
2816         ORD(glShaderBinary);
2817      }
2818
2819    ORD(glShaderSource);    // Do precision stripping in both cases
2820 #undef ORD
2821 }
2822 #endif
2823
2824 //-------------------------------------------//
2825 static int
2826 gl_lib_init(void)
2827 {
2828 #ifdef EVAS_GL
2829    // dlopen OSMesa 
2830    gl_lib_handle = dlopen("libOSMesa.so.1", RTLD_NOW);
2831    if (!gl_lib_handle) gl_lib_handle = dlopen("libOSMesa.so", RTLD_NOW);
2832    if (!gl_lib_handle)
2833      {
2834         DBG("Unable to open libOSMesa:  %s", dlerror());
2835         return 0;
2836      }
2837
2838    //------------------------------------------------//
2839    if (!glue_sym_init()) return 0;
2840    if (!gl_sym_init()) return 0;
2841
2842    override_gl_apis(&gl_funcs);
2843
2844    return 1;
2845 #else
2846    return 0;
2847 #endif
2848 }
2849
2850
2851 static void
2852 init_gl(void)
2853 {
2854    DBG("Initializing Software OpenGL APIs...\n");
2855
2856    if (!gl_lib_init())
2857       DBG("Unable to support EvasGL in this engine module. Install OSMesa to get it running");
2858    else
2859      {
2860 #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
2861         ORD(gl_surface_create);
2862         ORD(gl_surface_destroy);
2863         ORD(gl_context_create);
2864         ORD(gl_context_destroy);
2865         ORD(gl_make_current);
2866         ORD(gl_string_query);           // FIXME: Need to implement
2867         ORD(gl_proc_address_get);       // FIXME: Need to implement
2868         ORD(gl_native_surface_get);
2869         ORD(gl_api_get);
2870 #undef ORD
2871      }
2872 }
2873
2874
2875 /*
2876  *****
2877  **
2878  ** MODULE ACCESSIBLE API API
2879  **
2880  *****
2881  */
2882
2883 static int
2884 module_open(Evas_Module *em)
2885 {
2886    if (!em) return 0;
2887    _evas_soft_gen_log_dom = eina_log_domain_register
2888      ("evas-software_generic", EVAS_DEFAULT_LOG_COLOR);
2889    if(_evas_soft_gen_log_dom<0)
2890      {
2891         EINA_LOG_ERR("Can not create a module log domain.");
2892         return 0;
2893      }
2894
2895    init_gl();
2896    evas_common_pipe_init();
2897
2898    em->functions = (void *)(&func);
2899    cpunum = eina_cpu_count();
2900    return 1;
2901 }
2902
2903 static void
2904 module_close(Evas_Module *em __UNUSED__)
2905 {
2906   eina_log_domain_unregister(_evas_soft_gen_log_dom);
2907 }
2908
2909 static Evas_Module_Api evas_modapi =
2910 {
2911    EVAS_MODULE_API_VERSION,
2912    "software_generic",
2913    "none",
2914    {
2915      module_open,
2916      module_close
2917    }
2918 };
2919
2920 EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_generic);
2921
2922 #ifndef EVAS_STATIC_BUILD_SOFTWARE_GENERIC
2923 EVAS_EINA_MODULE_DEFINE(engine, software_generic);
2924 #endif