big patch from Samsung SAIT (Advanced research group) for async multi-frame
[framework/uifw/evas.git] / src / modules / engines / cairo_x11 / evas_engine.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4 #include <X11/Xlib.h>
5 #include "evas_common.h"
6 #include "evas_private.h"
7 #include "evas_engine.h"
8 #include "Evas_Engine_Cairo_X11.h"
9 #include "evas_cairo_common.h"
10
11 /* domain for eina_log */
12 int _evas_engine_cairo_X11_log_dom = -1;
13
14 static void *eng_info(Evas *e);
15 static void eng_info_free(Evas *e, void *info);
16 static int eng_setup(Evas *e, void *info);
17 static void *eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth);
18 static void eng_output_free(void *data);
19 static void eng_output_resize(void *data, int w, int h);
20 static void eng_output_tile_size_set(void *data, int w, int h);
21 static void eng_output_redraws_rect_add(void *data, int x, int y, int w, int h);
22 static void eng_output_redraws_rect_del(void *data, int x, int y, int w, int h);
23 static void eng_output_redraws_clear(void *data);
24 static void *eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch);
25 static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h);
26 static void eng_output_flush(void *data);
27
28 static void *eng_context_new(void *data);
29 static Eina_Bool eng_canvas_alpha_get(void *data, void *context);
30 static void eng_context_free(void *data, void *context);
31 static void eng_context_clip_set(void *data, void *context, int x, int y, int w, int h);
32 static void eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h);
33 static void eng_context_clip_unset(void *data, void *context);
34 static int eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h);
35 static void eng_context_color_set(void *data, void *context, int r, int g, int b, int a);
36 static int eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a);
37 static void eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a);
38 static void eng_context_multiplier_unset(void *data, void *context);
39 static int eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a);
40 static void eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h);
41 static void eng_context_cutout_clear(void *data, void *context);
42 static void eng_context_anti_alias_set(void *data, void *context, unsigned char aa);
43 static unsigned char eng_context_anti_alias_get(void *data, void *context);
44 static void eng_context_color_interpolation_set(void *data, void *context, int color_space);
45 static int eng_context_color_interpolation_get(void *data, void *context);
46 static void eng_context_render_op_set(void *data, void *context, int op);
47 static int eng_context_render_op_get(void *data, void *context);
48
49 static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h);
50
51 static void eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2);
52
53 static void *eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y);
54 static void *eng_polygon_points_clear(void *data, void *context, void *polygon);
55 static void eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y);
56
57 static void *eng_gradient_new(void *data);
58 static void eng_gradient_free(void *data, void *gradient);
59 static void eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta);
60 static void eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta);
61 static void eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha);
62 static void eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len);
63 static void eng_gradient_clear(void *data, void *gradient);
64 static void eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h);
65 static void eng_gradient_fill_angle_set(void *data, void *gradient, double angle);
66 static void eng_gradient_fill_spread_set(void *data, void *gradient, int spread);
67 static void eng_gradient_angle_set(void *data, void *gradient, double angle);
68 static void eng_gradient_offset_set(void *data, void *gradient, float offset);
69 static void eng_gradient_direction_set(void *data, void *gradient, int direction);
70 static void eng_gradient_type_set(void *data, void *gradient, char *name, char *params);
71 static int eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h);
72 static int eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h);
73 static void eng_gradient_render_pre(void *data, void *context, void *gradient);
74 static void eng_gradient_render_post(void *data, void *gradient);
75 static void eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h);
76
77 static void *eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo);
78 static void *eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
79 static void *eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace);
80 static void eng_image_free(void *data, void *image);
81 static void eng_image_size_get(void *data, void *image, int *w, int *h);
82 static void *eng_image_size_set(void *data, void *image, int w, int h);
83 static void *eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h);
84 static void *eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data);
85 static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
86 static void eng_image_data_preload_request(void *data, void *image, const void *target);
87 static void eng_image_data_preload_cancel(void *data, void *image, const void *target);
88 static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
89 static int eng_image_alpha_get(void *data, void *image);
90 static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
91 static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b);
92 static void eng_image_draw(void *data, 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);
93 static char *eng_image_comment_get(void *data, void *image, char *key);
94 static char *eng_image_format_get(void *data, void *image);
95 static void eng_image_colorspace_set(void *data, void *image, int cspace);
96 static int eng_image_colorspace_get(void *data, void *image);
97 static void eng_image_native_set(void *data, void *image, void *native);
98 static void *eng_image_native_get(void *data, void *image);
99 static void eng_image_cache_flush(void *data);
100 static void eng_image_cache_set(void *data, int bytes);
101 static int eng_image_cache_get(void *data);
102 static void eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint);
103 static int eng_image_scale_hint_get(void *data __UNUSED__, void *image);
104     
105 static void *eng_font_load(void *data, char *name, int size);
106 static void *eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size);
107 static void *eng_font_add(void *data, void *font, char *name, int size);
108 static void *eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size);
109 static void eng_font_free(void *data, void *font);
110 static int eng_font_ascent_get(void *data, void *font);
111 static int eng_font_descent_get(void *data, void *font);
112 static int eng_font_max_ascent_get(void *data, void *font);
113 static int eng_font_max_descent_get(void *data, void *font);
114 static void eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h);
115 static int eng_font_inset_get(void *data, void *font, char *text);
116 static int eng_font_h_advance_get(void *data, void *font, char *text);
117 static int eng_font_v_advance_get(void *data, void *font, char *text);
118 static int eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch);
119 static int eng_font_char_at_coords_get(void *data, void *font, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
120 static void eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, char *text);
121 static void eng_font_cache_flush(void *data);
122 static void eng_font_cache_set(void *data, int bytes);
123 static int eng_font_cache_get(void *data);
124
125 static void eng_font_hinting_set(void *data, void *font, int hinting);
126 static int eng_font_hinting_can_hint(void *data, int hinting);
127
128 static int eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y);
129
130 typedef struct _Render_Engine Render_Engine;
131
132 struct _Render_Engine
133 {
134    Evas_Cairo_X11_Window *win;
135 };
136
137 static Evas_Func eng_func =
138 {
139    eng_info,
140      eng_info_free,
141      eng_setup,
142      eng_output_free,
143      eng_output_resize,
144      eng_output_tile_size_set,
145      eng_output_redraws_rect_add,
146      eng_output_redraws_rect_del,
147      eng_output_redraws_clear,
148      eng_output_redraws_next_update_get,
149      eng_output_redraws_next_update_push,
150      eng_output_flush,
151      /* draw context virtual methods */
152      eng_context_new,
153      eng_canvas_alpha_get,
154      eng_context_free,
155      eng_context_clip_set,
156      eng_context_clip_clip,
157      eng_context_clip_unset,
158      eng_context_clip_get,
159      eng_context_color_set,
160      eng_context_color_get,
161      eng_context_multiplier_set,
162      eng_context_multiplier_unset,
163      eng_context_multiplier_get,
164      eng_context_cutout_add,
165      eng_context_cutout_clear,
166      eng_context_anti_alias_set,
167      eng_context_anti_alias_get,
168      eng_context_color_interpolation_set,
169      eng_context_color_interpolation_get,
170      eng_context_render_op_set,
171      eng_context_render_op_get,
172      /* rectangle draw funcs */
173      eng_rectangle_draw,
174      /* line draw funcs */
175      eng_line_draw,
176      /* polygon draw funcs */
177      eng_polygon_point_add,
178      eng_polygon_points_clear,
179      eng_polygon_draw,
180      /* gradient draw funcs */
181      eng_gradient_new,
182      eng_gradient_free,
183      eng_gradient_color_stop_add,
184      eng_gradient_alpha_stop_add,
185      eng_gradient_color_data_set,
186      eng_gradient_alpha_data_set,
187      eng_gradient_clear,
188      eng_gradient_fill_set,
189      eng_gradient_fill_angle_set,
190      eng_gradient_fill_spread_set,
191      eng_gradient_angle_set,
192      eng_gradient_offset_set,
193      eng_gradient_direction_set,
194      eng_gradient_type_set,
195      eng_gradient_is_opaque,
196      eng_gradient_is_visible,
197      eng_gradient_render_pre,
198      eng_gradient_render_post,
199      eng_gradient_draw,
200      /* image draw funcs */
201      eng_image_load,
202      eng_image_new_from_data,
203      eng_image_new_from_copied_data,
204      eng_image_free,
205      eng_image_size_get,
206      eng_image_size_set,
207      NULL,
208      eng_image_dirty_region,
209      eng_image_data_get,
210      eng_image_data_put,
211      eng_image_data_preload_request,
212      eng_image_data_preload_cancel,
213      eng_image_alpha_set,
214      eng_image_alpha_get,
215      eng_image_border_set,
216      eng_image_border_get,
217      eng_image_draw,
218      eng_image_comment_get,
219      eng_image_format_get,
220      eng_image_colorspace_set,
221      eng_image_colorspace_get,
222      eng_image_native_set,
223      eng_image_native_get,
224      /* image cache funcs */
225      eng_image_cache_flush,
226      eng_image_cache_set,
227      eng_image_cache_get,
228      /* font draw functions */
229      eng_font_load,
230      eng_font_memory_load,
231      eng_font_add,
232      eng_font_memory_add,
233      eng_font_free,
234      eng_font_ascent_get,
235      eng_font_descent_get,
236      eng_font_max_ascent_get,
237      eng_font_max_descent_get,
238      eng_font_string_size_get,
239      eng_font_inset_get,
240      eng_font_h_advance_get,
241      eng_font_v_advance_get,
242      eng_font_char_coords_get,
243      eng_font_char_at_coords_get,
244      eng_font_draw,
245      /* font cache functions */
246      eng_font_cache_flush,
247      eng_font_cache_set,
248      eng_font_cache_get,
249                               
250      eng_font_hinting_set,
251      eng_font_hinting_can_hint,
252      
253      eng_image_scale_hint_set,
254      eng_image_scale_hint_get,
255      /* more font draw functions */
256      eng_font_last_up_to_pos,
257      NULL, // image_map4_draw
258      NULL, // image_map_surface_new
259      NULL // image_map_surface_free
260 };
261
262 static void *
263 eng_info(Evas *e)
264 {
265    Evas_Engine_Info_Cairo_X11 *info;
266    INF("CAIRO: create info...");
267    info = calloc(1, sizeof(Evas_Engine_Info_Cairo_X11));
268    if (!info) return NULL;
269    info->magic.magic = rand();   
270    info->render_mode = EVAS_RENDER_MODE_BLOCKING;
271    return info;
272    e = NULL;
273 }
274
275 static void
276 eng_info_free(Evas *e, void *info)
277 {
278    Evas_Engine_Info_Cairo_X11 *in;
279    in = (Evas_Engine_Info_Cairo_X11 *)info;
280    free(in);
281 }
282
283 static int
284 eng_setup(Evas *e, void *in)
285 {
286    Render_Engine *re;
287    Evas_Engine_Info_Cairo_X11 *info;
288
289    info = (Evas_Engine_Info_Cairo_X11 *)in;
290    INF("CAIRO: setup info...");
291    if (!e->engine.data.output)
292      e->engine.data.output =
293      eng_output_setup(e->output.w,
294                                         e->output.h,
295                                         info->info.display,
296                                         info->info.drawable,
297                                         info->info.visual,
298                                         info->info.colormap,
299                                         info->info.depth);
300    if (!e->engine.data.output) return 0;
301
302    if (!e->engine.data.context)
303      e->engine.data.context =
304      e->engine.func->context_new(e->engine.data.output);
305    re = e->engine.data.output;
306
307    return 1;
308 }
309
310 static void *
311 eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth)
312 {
313    Render_Engine *re;
314
315    re = calloc(1, sizeof(Render_Engine));
316    if (!re)
317      return NULL;
318    re->win = eng_window_new(disp, draw,
319                                               0 /* FIXME: screen 0 assumption */,
320                                               vis, cmap, depth, w, h);
321    if (!re->win)
322      {
323         free(re);
324         return NULL;
325      }
326    INF("CAIRO: cairo window setup done.");
327    evas_common_cpu_init();
328
329    evas_common_blend_init();
330    evas_common_image_init();
331    evas_common_convert_init();
332    evas_common_scale_init();
333    evas_common_rectangle_init();
334    evas_common_gradient_init();
335    evas_common_polygon_init();
336    evas_common_line_init();
337    evas_common_font_init();
338    evas_common_draw_init();
339    evas_common_tilebuf_init();
340
341    return re;
342 }
343
344 static void
345 eng_output_free(void *data)
346 {
347    Render_Engine *re;
348
349    re = (Render_Engine *)data;
350
351    eng_window_free(re->win);
352
353    free(re);
354
355    evas_common_font_shutdown();
356    evas_common_image_shutdown();
357 }
358
359 static void
360 eng_output_resize(void *data, int w, int h)
361 {
362    Render_Engine *re;
363
364    re = (Render_Engine *)data;
365    re->win->w = w;
366    re->win->h = h;
367
368    eng_window_size_set(re->win, w, h);
369 }
370
371 static void
372 eng_output_tile_size_set(void *data, int w, int h)
373 {
374    Render_Engine *re;
375
376    re = (Render_Engine *)data;
377    /* not used in cairo engine */
378 }
379
380 static void
381 eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
382 {
383    Render_Engine *re;
384    /* FIXME? cairo_surface_mark_dirty_rectangle */
385
386    re = (Render_Engine *)data;
387    if (!re->win->draw.redraw)
388      {
389         re->win->draw.x1 = 0;
390         re->win->draw.y1 = 0;
391         re->win->draw.x2 = re->win->w - 1;
392         re->win->draw.y2 = re->win->h - 1;
393      }
394    else
395      {
396         if (x < re->win->draw.x1) re->win->draw.x1 = x;
397         if (y < re->win->draw.y1) re->win->draw.y1 = y;
398         if ((x + w - 1) > re->win->draw.x2) re->win->draw.x2 = x + w - 1;
399         if ((y + h - 1) > re->win->draw.y2) re->win->draw.y2 = y + h - 1;
400      }
401    re->win->draw.redraw = 1;
402 }
403
404 static void
405 eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
406 {
407    Render_Engine *re;
408
409    re = (Render_Engine *)data;
410    /* not used in cairo engine */
411 }
412
413 static void
414 eng_output_redraws_clear(void *data)
415 {
416    Render_Engine *re;
417
418    re = (Render_Engine *)data;
419    re->win->draw.redraw = 0;
420 }
421
422 static void *
423 eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch)
424 {
425    Render_Engine *re;
426
427    re = (Render_Engine *)data;
428    if (!re->win->draw.redraw) return NULL;
429
430    if (x) *x = re->win->draw.x1;
431    if (y) *y = re->win->draw.y1;
432    if (w) *w = re->win->draw.x2 - re->win->draw.x1 + 1;
433    if (h) *h = re->win->draw.y2 - re->win->draw.y1 + 1;
434    if (cx) *cx = re->win->draw.x1;
435    if (cy) *cy = re->win->draw.y1;
436    if (cw) *cw = re->win->draw.x2 - re->win->draw.x1 + 1;
437    if (ch) *ch = re->win->draw.y2 - re->win->draw.y1 + 1;
438    return re;
439 }
440
441 static void
442 eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
443 {
444    Render_Engine *re;
445
446    re = (Render_Engine *)data;
447    re->win->draw.redraw = 0;
448 }
449
450 static void
451 eng_output_flush(void *data)
452 {
453    Render_Engine *re;
454    Evas_Cairo_Context *ctxt;
455    Eina_List *l;
456
457    re = (Render_Engine *)data;
458 }
459
460 static void *
461 eng_context_new(void *data)
462 {
463    Render_Engine *re;
464    Evas_Cairo_Context *ctxt;
465
466    re = (Render_Engine *)data;
467    ctxt = calloc(1, sizeof(Evas_Cairo_Context));
468    if (!ctxt) return NULL;
469
470    ctxt->cairo = cairo_create(re->win->surface);
471
472    return ctxt;
473 }
474
475 static void
476 eng_context_free(void *data, void *context)
477 {
478    Render_Engine *re;
479    Evas_Cairo_Context *ctxt;
480
481    re = (Render_Engine *)data;
482    ctxt = context;
483
484    cairo_destroy(ctxt->cairo);
485    free(ctxt);
486 }
487
488 static void
489 eng_context_clip_set(void *data, void *context, int x, int y, int w, int h)
490 {
491    Render_Engine *re;
492
493    re = (Render_Engine *)data;
494    /* not used in cairo engine */
495 }
496
497 static void
498 eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h)
499 {
500    Render_Engine *re;
501
502    re = (Render_Engine *)data;
503    /* not used in cairo engine */
504 }
505
506 static void
507 eng_context_clip_unset(void *data, void *context)
508 {
509    Render_Engine *re;
510
511    re = (Render_Engine *)data;
512    /* not used in cairo engine */
513 }
514
515 static int
516 eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h)
517 {
518    Render_Engine *re;
519
520    re = (Render_Engine *)data;
521    /* not used in cairo engine */
522    return 0;
523 }
524
525 static void
526 eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
527 {
528    Render_Engine *re;
529    Evas_Cairo_Context *ctxt;
530
531    re = (Render_Engine *)data;
532    ctxt = (Evas_Cairo_Context *)context;
533
534    ctxt->col.r = (double)r / 255.0;
535    ctxt->col.g = (double)g / 255.0;
536    ctxt->col.b = (double)b / 255.0;
537    ctxt->col.a = (double)a / 255.0;
538 }
539
540 static int
541 eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a)
542 {
543    Render_Engine *re;
544    Evas_Cairo_Context *ctxt;
545
546    re = (Render_Engine *)data;
547    ctxt = (Evas_Cairo_Context *)context;
548
549    if (r) *r = ctxt->col.r * 255;
550    if (g) *g = ctxt->col.g * 255;
551    if (b) *b = ctxt->col.b * 255;
552    if (a) *a = ctxt->col.a * 255;
553    return 1;
554 }
555
556 static void
557 eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
558 {
559    Render_Engine *re;
560    Evas_Cairo_Context *ctxt;
561
562    re = (Render_Engine *)data;
563    ctxt = (Evas_Cairo_Context *)context;
564
565    ctxt->mul.r = (double)r / 255.0;
566    ctxt->mul.g = (double)g / 255.0;
567    ctxt->mul.b = (double)b / 255.0;
568    ctxt->mul.a = (double)a / 255.0;
569    ctxt->mul.set = 1;
570 }
571
572 static void
573 eng_context_multiplier_unset(void *data, void *context)
574 {
575    Render_Engine *re;
576    Evas_Cairo_Context *ctxt;
577
578    re = (Render_Engine *)data;
579    ctxt = (Evas_Cairo_Context *)context;
580    ctxt->mul.set = 0;
581 }
582
583 static int
584 eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a)
585 {
586    Render_Engine *re;
587    Evas_Cairo_Context *ctxt;
588
589    re = (Render_Engine *)data;
590    ctxt = (Evas_Cairo_Context *)context;
591
592    if (r) *r = ctxt->mul.r * 255;
593    if (g) *g = ctxt->mul.g * 255;
594    if (b) *b = ctxt->mul.b * 255;
595    if (a) *a = ctxt->mul.a * 255;
596    return ctxt->mul.set;
597 }
598
599 static void
600 eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
601 {
602    Render_Engine *re;
603
604    re = (Render_Engine *)data;
605    /* not used in cairo engine */
606 }
607
608 static void
609 eng_context_cutout_clear(void *data, void *context)
610 {
611    Render_Engine *re;
612
613    re = (Render_Engine *)data;
614    /* not used in cairo engine */
615 }
616
617 static void
618 eng_context_anti_alias_set(void *data, void *context, unsigned char aa)
619 {
620    Render_Engine *re;
621
622    re = (Render_Engine *)data;
623 }
624
625 static unsigned char
626 eng_context_anti_alias_get(void *data, void *context)
627 {
628    Render_Engine *re;
629
630    re = (Render_Engine *)data;
631    return 1;
632 }
633
634 static void
635 eng_context_color_interpolation_set(void *data, void *context, int color_space)
636 {
637    Render_Engine *re;
638
639    re = (Render_Engine *)data;
640 }
641
642 static int
643 eng_context_color_interpolation_get(void *data, void *context)
644 {
645    Render_Engine *re;
646
647    re = (Render_Engine *)data;
648    return 0;
649 }
650
651 static void
652 eng_context_render_op_set(void *data, void *context, int op)
653 {
654    Render_Engine *re;
655
656    re = (Render_Engine *)data;
657 }
658
659 static int
660 eng_context_render_op_get(void *data, void *context)
661 {
662    Render_Engine *re;
663
664    re = (Render_Engine *)data;
665    return 0;
666 }
667
668
669 static void
670 eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
671 {
672    Render_Engine *re;
673    Evas_Cairo_Context *ctxt;
674    double r, g, b, a;
675
676    re = (Render_Engine *)data;
677    ctxt = (Evas_Cairo_Context *)context;
678
679    cairo_rectangle(ctxt->cairo, x, y, w, h);
680    r = ctxt->col.r;
681    g = ctxt->col.g;
682    b = ctxt->col.b;
683    a = ctxt->col.a;
684    if (ctxt->mul.set)
685      {
686         r *= ctxt->mul.r;
687         g *= ctxt->mul.g;
688         b *= ctxt->mul.b;
689         a *= ctxt->mul.a;
690      }
691    cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
692    cairo_fill(ctxt->cairo);
693 }
694
695 static void
696 eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
697 {
698    Render_Engine *re;
699    Evas_Cairo_Context *ctxt;
700    double r, g, b, a;
701
702    re = (Render_Engine *)data;
703    ctxt = (Evas_Cairo_Context *)context;
704
705    cairo_move_to(ctxt->cairo, x1, y1);
706    cairo_line_to(ctxt->cairo, x2, y2);
707    r = ctxt->col.r;
708    g = ctxt->col.g;
709    b = ctxt->col.b;
710    a = ctxt->col.a;
711    if (ctxt->mul.set)
712      {
713         r *= ctxt->mul.r;
714         g *= ctxt->mul.g;
715         b *= ctxt->mul.b;
716         a *= ctxt->mul.a;
717      }
718    cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
719    cairo_stroke(ctxt->cairo);
720 }
721
722 static void *
723 eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
724 {
725    Render_Engine *re;
726    Evas_Cairo_Context *ctxt;
727    Evas_Cairo_Polygon *poly;
728    Evas_Cairo_Polygon_Point *pt;
729
730    re = (Render_Engine *)data;
731    ctxt = (Evas_Cairo_Context *)context;
732    poly = (Evas_Cairo_Polygon *)polygon;
733    if (!poly) poly = calloc(1, sizeof(Evas_Cairo_Polygon));
734
735    pt = malloc(sizeof(Evas_Cairo_Polygon_Point));
736    if (pt)
737      {
738         pt->x = x;
739         pt->y = y;
740         poly->points = eina_list_append(poly->points, pt);
741      }
742    return poly;
743 }
744
745 static void *
746 eng_polygon_points_clear(void *data, void *context, void *polygon)
747 {
748    Render_Engine *re;
749    Evas_Cairo_Context *ctxt;
750    Evas_Cairo_Polygon *poly;
751
752    re = (Render_Engine *)data;
753    ctxt = (Evas_Cairo_Context *)context;
754    poly = (Evas_Cairo_Polygon *)polygon;
755    if (!poly) return NULL;
756
757    while (poly->points)
758      {
759         free(poly->points->data);
760         poly->points = eina_list_remove_list(poly->points, poly->points);
761      }
762    free(poly);
763
764    return NULL;
765 }
766
767 static void
768 eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
769 {
770    Render_Engine *re;
771    Evas_Cairo_Context *ctxt;
772    Evas_Cairo_Polygon *poly;
773    Evas_Cairo_Polygon_Point *pt;
774    double r, g, b, a;
775
776    re = (Render_Engine *)data;
777    ctxt = (Evas_Cairo_Context *)context;
778    poly = (Evas_Cairo_Polygon *)polygon;
779
780    pt = poly->points->data;
781    if (pt)
782      {
783         Eina_List *l;
784         cairo_move_to(ctxt->cairo, pt->x + x, pt->y + y);
785         EINA_LIST_FOREACH(poly->points->next, l, pt)
786           cairo_line_to(ctxt->cairo, pt->x + x, pt->y + y);
787      }
788    r = ctxt->col.r;
789    g = ctxt->col.g;
790    b = ctxt->col.b;
791    a = ctxt->col.a;
792    if (ctxt->mul.set)
793      {
794         r *= ctxt->mul.r;
795         g *= ctxt->mul.g;
796         b *= ctxt->mul.b;
797         a *= ctxt->mul.a;
798      }
799    cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
800    cairo_stroke(ctxt->cairo);
801 }
802
803 static void *
804 eng_gradient_new(void *data)
805 {
806    return evas_common_gradient_new();
807 }
808
809 static void
810 eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
811 {
812    evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
813 }
814
815 static void
816 eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
817 {
818    evas_common_gradient_alpha_stop_add(gradient, a, delta);
819 }
820
821 static void
822 eng_gradient_clear(void *data, void *gradient)
823 {
824    evas_common_gradient_clear(gradient);
825 }
826
827 static void
828 eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
829 {
830    evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
831 }
832
833 static void
834 eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
835 {
836    evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
837 }
838
839 static void
840 eng_gradient_free(void *data, void *gradient)
841 {
842    evas_common_gradient_free(gradient);
843 }
844
845 static void
846 eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
847 {
848    evas_common_gradient_fill_set(gradient, x, y, w, h);
849 }
850
851 static void
852 eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
853 {
854    evas_common_gradient_fill_angle_set(gradient, angle);
855 }
856
857 static void
858 eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
859 {
860    evas_common_gradient_fill_spread_set(gradient, spread);
861 }
862
863 static void
864 eng_gradient_angle_set(void *data, void *gradient, double angle)
865 {
866    evas_common_gradient_map_angle_set(gradient, angle);
867 }
868
869 static void
870 eng_gradient_offset_set(void *data, void *gradient, float offset)
871 {
872    evas_common_gradient_map_offset_set(gradient, offset);
873 }
874
875 static void
876 eng_gradient_direction_set(void *data, void *gradient, int direction)
877 {
878    evas_common_gradient_map_direction_set(gradient, direction);
879 }
880
881 static void
882 eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
883 {
884    evas_common_gradient_type_set(gradient, name, params);
885 }
886
887 static int
888 eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
889 {
890    return 0;
891 }
892
893 static int
894 eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
895 {
896    return 0;
897 }
898
899 static void
900 eng_gradient_render_pre(void *data, void *context, void *gradient)
901 {
902 }
903
904 static void
905 eng_gradient_render_post(void *data, void *gradient)
906 {
907 }
908
909 static void
910 eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
911 {
912 }
913
914 static void *
915 eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo)
916 {
917    Render_Engine *re;
918    Evas_Cairo_Image *im;
919
920    re = (Render_Engine *)data;
921    im = calloc(1, sizeof(Evas_Cairo_Image));
922    if (!im)
923      {
924         *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
925         return NULL;
926      }
927
928    *error = EVAS_LOAD_ERROR_NONE;
929    im->im = evas_common_load_image_from_file(file, key, lo, error);
930    if (!im->im)
931      {
932         free(im);
933         return NULL;
934      }
935    im->references = 1;
936    return im;
937 }
938
939 static void *
940 eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
941 {
942    Render_Engine *re;
943    Evas_Cairo_Image *im;
944
945    re = (Render_Engine *)data;
946
947    /* FIXME, cache! */
948    im = calloc(1, sizeof(Evas_Cairo_Image));
949    if (!im) return NULL;
950
951    im->im = evas_common_image_new();
952    if (!im->im)
953      {
954         free(im);
955         return NULL;
956      }
957    im->im->image = evas_common_image_surface_new(im->im);
958    if (!im->im->image)
959      {
960         evas_common_image_free(im->im);
961         free(im);
962         return NULL;
963      }
964
965    im->im->image->w = w;
966    im->im->image->h = h;
967    im->im->image->data = image_data;
968    im->im->image->no_free = 1;
969    im->references = 1;
970    return im;
971 }
972
973 static void *
974 eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
975 {
976    Render_Engine *re;
977    Evas_Cairo_Image *im;
978
979    re = (Render_Engine *)data;
980
981    /* FIXME, cache! */
982    im = calloc(1, sizeof(Evas_Cairo_Image));
983    if (!im) return NULL;
984    im->references = 1;
985    im->im = evas_common_image_create(w, h);
986    if (!im->im)
987      {
988         free(im);
989         return NULL;
990      }
991    if (image_data)
992      memcpy(im->im->image->data, image_data, w * h * sizeof(DATA32));
993    return im;
994 }
995
996 static void
997 eng_image_free(void *data, void *image)
998 {
999    Render_Engine *re;
1000    Evas_Cairo_Image *im;
1001
1002    re = (Render_Engine *)data;
1003    im = (Evas_Cairo_Image *)image;
1004    evas_common_image_unref(im->im);
1005    if (im->surface) cairo_surface_destroy(im->surface);
1006    if (im->pattern) cairo_pattern_destroy(im->pattern);
1007    free(im);
1008 }
1009
1010 static void
1011 eng_image_size_get(void *data, void *image, int *w, int *h)
1012 {
1013    Render_Engine *re;
1014
1015    re = (Render_Engine *)data;
1016    if (!image)
1017      {
1018         if (w) *w = 0;
1019         if (h) *h = 0;
1020      }
1021    else
1022      {
1023         Evas_Cairo_Image *im;
1024
1025         im = image;
1026         if (w) *w = im->im->image->w;
1027         if (h) *h = im->im->image->h;
1028      }
1029 }
1030
1031 static void *
1032 eng_image_size_set(void *data, void *image, int w, int h)
1033 {
1034    Render_Engine *re;
1035
1036    /* FIXME */
1037    re = (Render_Engine *)data;
1038    return image;
1039 }
1040
1041 static void *
1042 eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
1043 {
1044    Render_Engine *re;
1045
1046    /* FIXME */
1047    re = (Render_Engine *)data;
1048    return image;
1049 }
1050
1051 static void *
1052 eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
1053 {
1054    Render_Engine *re;
1055
1056    /* FIXME */
1057    re = (Render_Engine *)data;
1058    *image_data = NULL;
1059    return image;
1060 }
1061
1062 static void *
1063 eng_image_data_put(void *data, void *image, DATA32 *image_data)
1064 {
1065    Render_Engine *re;
1066
1067    /* FIXME */
1068    re = (Render_Engine *)data;
1069    return image;
1070 }
1071
1072 static void
1073 eng_image_data_preload_request(void *data, void *image, const void *target)
1074 {
1075    Render_Engine *re;
1076
1077    /* FIXME */
1078    re = (Render_Engine *)data;
1079    return image;
1080 }
1081
1082 static void
1083 eng_image_data_preload_cancel(void *data, void *image, const void *target)
1084 {
1085    Render_Engine *re;
1086
1087    /* FIXME */
1088    re = (Render_Engine *)data;
1089    return image;
1090 }
1091
1092 static void *
1093 eng_image_alpha_set(void *data, void *image, int has_alpha)
1094 {
1095    Render_Engine *re;
1096
1097    /* FIXME */
1098    re = (Render_Engine *)data;
1099    return image;
1100 }
1101
1102 static int
1103 eng_image_alpha_get(void *data, void *image)
1104 {
1105    Render_Engine *re;
1106    Evas_Cairo_Image *im;
1107
1108    re = (Render_Engine *)data;
1109    if (!image) return 0;
1110
1111    im = image;
1112    if (im->im->cache_entry.flags.alpha) return 1;
1113    return 0;
1114 }
1115
1116 static void *
1117 eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
1118 {
1119    Render_Engine *re;
1120
1121    re = (Render_Engine *)data;
1122    return image;
1123 }
1124
1125 static void
1126 eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
1127 {
1128    Render_Engine *re;
1129
1130    re = (Render_Engine *)data;
1131    return;
1132 }
1133
1134 static void
1135 eng_image_draw(void *data, 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)
1136 {
1137    Render_Engine *re;
1138    Evas_Cairo_Context *ctxt;
1139    Evas_Cairo_Image *im;
1140    DATA32 *pix;
1141
1142    re = (Render_Engine *)data;
1143    ctxt = (Evas_Cairo_Context *)context;
1144    if (!image) return;
1145
1146    im = image;
1147    evas_common_load_image_data_from_file(im->im);
1148    pix = im->im->image->data;
1149    if (pix)
1150      {
1151         if (!im->surface)
1152           {
1153              im->mulpix = malloc(im->im->image->w * im->im->image->h * sizeof(DATA32));
1154              if (im->mulpix)
1155                {
1156                   int i, n;
1157                   DATA32 *p;
1158
1159                   n = im->im->image->w * im->im->image->h;
1160                   p = im->mulpix;
1161                   for (i = 0; i < n; i++)
1162                     {
1163                        int a;
1164
1165                        a = A_VAL(pix);
1166                        R_VAL(p) = (R_VAL(pix) * a) / 255;
1167                        G_VAL(p) = (G_VAL(pix) * a) / 255;
1168                        B_VAL(p) = (B_VAL(pix) * a) / 255;
1169                        A_VAL(p) = a;
1170                        p++;
1171                        pix++;
1172                     }
1173                   im->surface = cairo_image_surface_create_for_data(im->mulpix,
1174                                                                     CAIRO_FORMAT_ARGB32,
1175                                                                     im->im->image->w,
1176                                                                     im->im->image->h,
1177                                                                     0);
1178                   im->pattern = cairo_pattern_create_for_surface(im->surface);
1179                }
1180           }
1181
1182         if (smooth)
1183           cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_BILINEAR);
1184         else
1185           cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_NEAREST);
1186         cairo_save(ctxt->cairo);
1187         cairo_translate(ctxt->cairo, dst_x, dst_y);
1188         cairo_scale(ctxt->cairo,
1189                     (double)src_w / (double)dst_w,
1190                     (double)src_h / (double)dst_h);
1191         cairo_move_to(ctxt->cairo, 0, 0);
1192         //     cairo_set_rgb_color(re->win->cairo,
1193         //                        (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0,
1194         //                        (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0,
1195         //                        (double)(R_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0);
1196         //     cairo_set_alpha(re->win->cairo,
1197         //                   (double)(A_VAL(((RGBA_Draw_Context *)context)->col.col)) / 255.0);
1198         cairo_set_source_surface(ctxt->cairo,
1199                                  im->surface,
1200                                  im->im->image->w,
1201                                  im->im->image->h);
1202         cairo_paint(ctxt->cairo);
1203         cairo_restore(ctxt->cairo);
1204      }
1205 }
1206
1207 static char *
1208 eng_image_comment_get(void *data, void *image, char *key)
1209 {
1210    Render_Engine *re;
1211
1212    /* FIXME */
1213    re = (Render_Engine *)data;
1214    return NULL;
1215 }
1216
1217 static char *
1218 eng_image_format_get(void *data, void *image)
1219 {
1220    Render_Engine *re;
1221
1222    /* FIXME */
1223    re = (Render_Engine *)data;
1224    return NULL;
1225 }
1226
1227 static void
1228 eng_image_colorspace_set(void *data, void *image, int cspace)
1229 {
1230 }
1231
1232 static int
1233 eng_image_colorspace_get(void *data, void *image)
1234 {
1235    return EVAS_COLORSPACE_ARGB8888;
1236 }
1237
1238 static void
1239 eng_image_native_set(void *data, void *image, void *native)
1240 {
1241 }
1242
1243 static void *
1244 eng_image_native_get(void *data, void *image)
1245 {
1246    return NULL;
1247 }
1248
1249 static void
1250 eng_image_cache_flush(void *data)
1251 {
1252    Render_Engine *re;
1253    int tmp_size;
1254
1255    re = (Render_Engine *)data;
1256    tmp_size = evas_common_image_get_cache();
1257    evas_common_image_set_cache(0);
1258    evas_common_image_set_cache(tmp_size);
1259 }
1260
1261 static void
1262 eng_image_cache_set(void *data, int bytes)
1263 {
1264    Render_Engine *re;
1265
1266    re = (Render_Engine *)data;
1267    evas_common_image_set_cache(bytes);
1268 }
1269
1270 static int
1271 eng_image_cache_get(void *data)
1272 {
1273    Render_Engine *re;
1274
1275    re = (Render_Engine *)data;
1276    return evas_common_image_get_cache();
1277 }
1278
1279 static void
1280 eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
1281 {
1282 }
1283
1284 static int
1285 eng_image_scale_hint_get(void *data __UNUSED__, void *image)
1286 {
1287    return EVAS_IMAGE_SCALE_HINT_NONE;
1288 }
1289
1290 static void *
1291 eng_font_load(void *data, char *name, int size)
1292 {
1293    Render_Engine *re;
1294
1295    /* FIXME, use cairo font subsystem */
1296    re = (Render_Engine *)data;
1297    return NULL;
1298 }
1299
1300 static void *
1301 eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
1302 {
1303    Render_Engine *re;
1304
1305    /* FIXME, use cairo font subsystem */
1306    re = (Render_Engine *)data;
1307    return NULL;
1308 }
1309
1310 static void *
1311 eng_font_add(void *data, void *font, char *name, int size)
1312 {
1313    Render_Engine *re;
1314
1315    /* FIXME, use cairo font subsystem */
1316    re = (Render_Engine *)data;
1317    return NULL;
1318 }
1319
1320 static void *
1321 eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size)
1322 {
1323    Render_Engine *re;
1324
1325    /* FIXME, use cairo font subsystem */
1326    re = (Render_Engine *)data;
1327    return NULL;
1328 }
1329
1330 static void
1331 eng_font_free(void *data, void *font)
1332 {
1333    Render_Engine *re;
1334
1335    /* FIXME, use cairo font subsystem */
1336    re = (Render_Engine *)data;
1337 }
1338
1339 static int
1340 eng_font_ascent_get(void *data, void *font)
1341 {
1342    Render_Engine *re;
1343
1344    /* FIXME, use cairo font subsystem */
1345    re = (Render_Engine *)data;
1346    return 0;
1347 }
1348
1349 static int
1350 eng_font_descent_get(void *data, void *font)
1351 {
1352    Render_Engine *re;
1353
1354    /* FIXME, use cairo font subsystem */
1355    re = (Render_Engine *)data;
1356    return 0;
1357 }
1358
1359 static int
1360 eng_font_max_ascent_get(void *data, void *font)
1361 {
1362    Render_Engine *re;
1363
1364    /* FIXME, use cairo font subsystem */
1365    re = (Render_Engine *)data;
1366    return 0;
1367 }
1368
1369 static int
1370 eng_font_max_descent_get(void *data, void *font)
1371 {
1372    Render_Engine *re;
1373
1374    /* FIXME, use cairo font subsystem */
1375    re = (Render_Engine *)data;
1376    return 0;
1377 }
1378
1379 static void
1380 eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h)
1381 {
1382    Render_Engine *re;
1383
1384    /* FIXME, use cairo font subsystem */
1385    re = (Render_Engine *)data;
1386 }
1387
1388 static int
1389 eng_font_inset_get(void *data, void *font, char *text)
1390 {
1391    Render_Engine *re;
1392
1393    /* FIXME, use cairo font subsystem */
1394    re = (Render_Engine *)data;
1395    return 0;
1396 }
1397
1398 static int
1399 eng_font_h_advance_get(void *data, void *font, char *text)
1400 {
1401    Render_Engine *re;
1402    int h, v;
1403
1404    /* FIXME, use cairo font subsystem */
1405    re = (Render_Engine *)data;
1406    return 0;
1407 }
1408
1409 static int
1410 eng_font_v_advance_get(void *data, void *font, char *text)
1411 {
1412    Render_Engine *re;
1413    int h, v;
1414
1415    /* FIXME, use cairo font subsystem */
1416    re = (Render_Engine *)data;
1417    return 0;
1418 }
1419
1420 static int
1421 eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch)
1422 {
1423    Render_Engine *re;
1424
1425    /* FIXME, use cairo font subsystem */
1426    re = (Render_Engine *)data;
1427    return 0;
1428 }
1429
1430 static int
1431 eng_font_char_at_coords_get(void *data, void *font, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch)
1432 {
1433    Render_Engine *re;
1434
1435    /* FIXME, use cairo font subsystem */
1436    re = (Render_Engine *)data;
1437    return 0;
1438 }
1439
1440 static void
1441 eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, char *text)
1442 {
1443    Render_Engine *re;
1444
1445    /* FIXME, use cairo font subsystem */
1446    re = (Render_Engine *)data;
1447 }
1448
1449 static void
1450 eng_font_cache_flush(void *data)
1451 {
1452    Render_Engine *re;
1453
1454    /* FIXME, use cairo font subsystem */
1455    re = (Render_Engine *)data;
1456 }
1457
1458 static void
1459 eng_font_cache_set(void *data, int bytes)
1460 {
1461    Render_Engine *re;
1462
1463    /* FIXME, use cairo font subsystem */
1464    re = (Render_Engine *)data;
1465 }
1466
1467 static int
1468 eng_font_cache_get(void *data)
1469 {
1470    Render_Engine *re;
1471
1472    /* FIXME, use cairo font subsystem */
1473    re = (Render_Engine *)data;
1474    return 0;
1475 }
1476
1477 static void
1478 eng_font_hinting_set(void *data, void *font, int hinting)
1479 {
1480    Render_Engine *re;
1481    
1482    /* FIXME, use cairo font subsystem */
1483    re = (Render_Engine *)data;
1484 }
1485
1486 static int
1487 eng_font_hinting_can_hint(void *data, int hinting)
1488 {
1489    Render_Engine *re;
1490    
1491    /* FIXME, use cairo font subsystem */
1492    re = (Render_Engine *)data;
1493 }
1494
1495 static int
1496 eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y)
1497 {
1498    return evas_common_font_query_last_up_to_pos(font, text, x, y);
1499 }
1500
1501 static Eina_Bool
1502 eng_canvas_alpha_get(void *data, void *context)
1503 {
1504    return EINA_FALSE;
1505 }
1506
1507 static int
1508 module_open(Evas_Module *em)
1509 {
1510    if (!em) return 0;
1511    _evas_engine_cairo_X11_log_dom = eina_log_domain_register("EvasCairoX11Engine", EINA_COLOR_BLUE);
1512    if(_evas_engine_cairo_X11_log_dom < 0)
1513      {
1514        EINA_LOG_ERR("Impossible to create a log doamin for the cairo (X11) engine.\n");
1515        return 0;
1516      }
1517    em->functions = (void *)(&eng_func);
1518    return 1;
1519 }
1520
1521 static void
1522 module_close(Evas_Module *em)
1523 {
1524   eina_log_domain_unregister(_evas_engine_cairo_X11_log_dom);
1525 }
1526
1527 static Evas_Module_Api evas_modapi =
1528 {
1529    EVAS_MODULE_API_VERSION,
1530    "cairo_x11",
1531    "none",
1532    {
1533      module_open,
1534      module_close
1535    }
1536 };
1537
1538 EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, cairo_x11);
1539
1540 #ifndef EVAS_STATIC_BUILD_CAIRO_X11
1541 EVAS_EINA_MODULE_DEFINE(engine, cairo_x11);
1542 #endif