2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
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"
11 /* domain for eina_log */
12 int _evas_engine_cairo_X11_log_dom = -1;
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);
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);
49 static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h);
51 static void eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2);
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);
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);
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);
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);
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);
128 static int eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y);
130 typedef struct _Render_Engine Render_Engine;
132 struct _Render_Engine
134 Evas_Cairo_X11_Window *win;
137 static Evas_Func eng_func =
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,
151 /* draw context virtual methods */
153 eng_canvas_alpha_get,
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 */
174 /* line draw funcs */
176 /* polygon draw funcs */
177 eng_polygon_point_add,
178 eng_polygon_points_clear,
180 /* gradient draw funcs */
183 eng_gradient_color_stop_add,
184 eng_gradient_alpha_stop_add,
185 eng_gradient_color_data_set,
186 eng_gradient_alpha_data_set,
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,
200 /* image draw funcs */
202 eng_image_new_from_data,
203 eng_image_new_from_copied_data,
208 eng_image_dirty_region,
211 eng_image_data_preload_request,
212 eng_image_data_preload_cancel,
215 eng_image_border_set,
216 eng_image_border_get,
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,
228 /* font draw functions */
230 eng_font_memory_load,
235 eng_font_descent_get,
236 eng_font_max_ascent_get,
237 eng_font_max_descent_get,
238 eng_font_string_size_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,
245 /* font cache functions */
246 eng_font_cache_flush,
250 eng_font_hinting_set,
251 eng_font_hinting_can_hint,
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
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;
276 eng_info_free(Evas *e, void *info)
278 Evas_Engine_Info_Cairo_X11 *in;
279 in = (Evas_Engine_Info_Cairo_X11 *)info;
284 eng_setup(Evas *e, void *in)
287 Evas_Engine_Info_Cairo_X11 *info;
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,
300 if (!e->engine.data.output) return 0;
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;
311 eng_output_setup(int w, int h, Display *disp, Drawable draw, Visual *vis, Colormap cmap, int depth)
315 re = calloc(1, sizeof(Render_Engine));
318 re->win = eng_window_new(disp, draw,
319 0 /* FIXME: screen 0 assumption */,
320 vis, cmap, depth, w, h);
326 INF("CAIRO: cairo window setup done.");
327 evas_common_cpu_init();
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();
345 eng_output_free(void *data)
349 re = (Render_Engine *)data;
351 eng_window_free(re->win);
355 evas_common_font_shutdown();
356 evas_common_image_shutdown();
360 eng_output_resize(void *data, int w, int h)
364 re = (Render_Engine *)data;
368 eng_window_size_set(re->win, w, h);
372 eng_output_tile_size_set(void *data, int w, int h)
376 re = (Render_Engine *)data;
377 /* not used in cairo engine */
381 eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
384 /* FIXME? cairo_surface_mark_dirty_rectangle */
386 re = (Render_Engine *)data;
387 if (!re->win->draw.redraw)
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;
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;
401 re->win->draw.redraw = 1;
405 eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
409 re = (Render_Engine *)data;
410 /* not used in cairo engine */
414 eng_output_redraws_clear(void *data)
418 re = (Render_Engine *)data;
419 re->win->draw.redraw = 0;
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)
427 re = (Render_Engine *)data;
428 if (!re->win->draw.redraw) return NULL;
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;
442 eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
446 re = (Render_Engine *)data;
447 re->win->draw.redraw = 0;
451 eng_output_flush(void *data)
454 Evas_Cairo_Context *ctxt;
457 re = (Render_Engine *)data;
461 eng_context_new(void *data)
464 Evas_Cairo_Context *ctxt;
466 re = (Render_Engine *)data;
467 ctxt = calloc(1, sizeof(Evas_Cairo_Context));
468 if (!ctxt) return NULL;
470 ctxt->cairo = cairo_create(re->win->surface);
476 eng_context_free(void *data, void *context)
479 Evas_Cairo_Context *ctxt;
481 re = (Render_Engine *)data;
484 cairo_destroy(ctxt->cairo);
489 eng_context_clip_set(void *data, void *context, int x, int y, int w, int h)
493 re = (Render_Engine *)data;
494 /* not used in cairo engine */
498 eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h)
502 re = (Render_Engine *)data;
503 /* not used in cairo engine */
507 eng_context_clip_unset(void *data, void *context)
511 re = (Render_Engine *)data;
512 /* not used in cairo engine */
516 eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h)
520 re = (Render_Engine *)data;
521 /* not used in cairo engine */
526 eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
529 Evas_Cairo_Context *ctxt;
531 re = (Render_Engine *)data;
532 ctxt = (Evas_Cairo_Context *)context;
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;
541 eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a)
544 Evas_Cairo_Context *ctxt;
546 re = (Render_Engine *)data;
547 ctxt = (Evas_Cairo_Context *)context;
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;
557 eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
560 Evas_Cairo_Context *ctxt;
562 re = (Render_Engine *)data;
563 ctxt = (Evas_Cairo_Context *)context;
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;
573 eng_context_multiplier_unset(void *data, void *context)
576 Evas_Cairo_Context *ctxt;
578 re = (Render_Engine *)data;
579 ctxt = (Evas_Cairo_Context *)context;
584 eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a)
587 Evas_Cairo_Context *ctxt;
589 re = (Render_Engine *)data;
590 ctxt = (Evas_Cairo_Context *)context;
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;
600 eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
604 re = (Render_Engine *)data;
605 /* not used in cairo engine */
609 eng_context_cutout_clear(void *data, void *context)
613 re = (Render_Engine *)data;
614 /* not used in cairo engine */
618 eng_context_anti_alias_set(void *data, void *context, unsigned char aa)
622 re = (Render_Engine *)data;
626 eng_context_anti_alias_get(void *data, void *context)
630 re = (Render_Engine *)data;
635 eng_context_color_interpolation_set(void *data, void *context, int color_space)
639 re = (Render_Engine *)data;
643 eng_context_color_interpolation_get(void *data, void *context)
647 re = (Render_Engine *)data;
652 eng_context_render_op_set(void *data, void *context, int op)
656 re = (Render_Engine *)data;
660 eng_context_render_op_get(void *data, void *context)
664 re = (Render_Engine *)data;
670 eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
673 Evas_Cairo_Context *ctxt;
676 re = (Render_Engine *)data;
677 ctxt = (Evas_Cairo_Context *)context;
679 cairo_rectangle(ctxt->cairo, x, y, w, h);
691 cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
692 cairo_fill(ctxt->cairo);
696 eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
699 Evas_Cairo_Context *ctxt;
702 re = (Render_Engine *)data;
703 ctxt = (Evas_Cairo_Context *)context;
705 cairo_move_to(ctxt->cairo, x1, y1);
706 cairo_line_to(ctxt->cairo, x2, y2);
718 cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
719 cairo_stroke(ctxt->cairo);
723 eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
726 Evas_Cairo_Context *ctxt;
727 Evas_Cairo_Polygon *poly;
728 Evas_Cairo_Polygon_Point *pt;
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));
735 pt = malloc(sizeof(Evas_Cairo_Polygon_Point));
740 poly->points = eina_list_append(poly->points, pt);
746 eng_polygon_points_clear(void *data, void *context, void *polygon)
749 Evas_Cairo_Context *ctxt;
750 Evas_Cairo_Polygon *poly;
752 re = (Render_Engine *)data;
753 ctxt = (Evas_Cairo_Context *)context;
754 poly = (Evas_Cairo_Polygon *)polygon;
755 if (!poly) return NULL;
759 free(poly->points->data);
760 poly->points = eina_list_remove_list(poly->points, poly->points);
768 eng_polygon_draw(void *data, void *context, void *surface, void *polygon, int x, int y)
771 Evas_Cairo_Context *ctxt;
772 Evas_Cairo_Polygon *poly;
773 Evas_Cairo_Polygon_Point *pt;
776 re = (Render_Engine *)data;
777 ctxt = (Evas_Cairo_Context *)context;
778 poly = (Evas_Cairo_Polygon *)polygon;
780 pt = poly->points->data;
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);
799 cairo_set_source_rgba(ctxt->cairo, r, g, b, a);
800 cairo_stroke(ctxt->cairo);
804 eng_gradient_new(void *data)
806 return evas_common_gradient_new();
810 eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
812 evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
816 eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
818 evas_common_gradient_alpha_stop_add(gradient, a, delta);
822 eng_gradient_clear(void *data, void *gradient)
824 evas_common_gradient_clear(gradient);
828 eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
830 evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
834 eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
836 evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
840 eng_gradient_free(void *data, void *gradient)
842 evas_common_gradient_free(gradient);
846 eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
848 evas_common_gradient_fill_set(gradient, x, y, w, h);
852 eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
854 evas_common_gradient_fill_angle_set(gradient, angle);
858 eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
860 evas_common_gradient_fill_spread_set(gradient, spread);
864 eng_gradient_angle_set(void *data, void *gradient, double angle)
866 evas_common_gradient_map_angle_set(gradient, angle);
870 eng_gradient_offset_set(void *data, void *gradient, float offset)
872 evas_common_gradient_map_offset_set(gradient, offset);
876 eng_gradient_direction_set(void *data, void *gradient, int direction)
878 evas_common_gradient_map_direction_set(gradient, direction);
882 eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
884 evas_common_gradient_type_set(gradient, name, params);
888 eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
894 eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
900 eng_gradient_render_pre(void *data, void *context, void *gradient)
905 eng_gradient_render_post(void *data, void *gradient)
910 eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
915 eng_image_load(void *data, char *file, char *key, int *error, Evas_Image_Load_Opts *lo)
918 Evas_Cairo_Image *im;
920 re = (Render_Engine *)data;
921 im = calloc(1, sizeof(Evas_Cairo_Image));
924 *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
928 *error = EVAS_LOAD_ERROR_NONE;
929 im->im = evas_common_load_image_from_file(file, key, lo, error);
940 eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
943 Evas_Cairo_Image *im;
945 re = (Render_Engine *)data;
948 im = calloc(1, sizeof(Evas_Cairo_Image));
949 if (!im) return NULL;
951 im->im = evas_common_image_new();
957 im->im->image = evas_common_image_surface_new(im->im);
960 evas_common_image_free(im->im);
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;
974 eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
977 Evas_Cairo_Image *im;
979 re = (Render_Engine *)data;
982 im = calloc(1, sizeof(Evas_Cairo_Image));
983 if (!im) return NULL;
985 im->im = evas_common_image_create(w, h);
992 memcpy(im->im->image->data, image_data, w * h * sizeof(DATA32));
997 eng_image_free(void *data, void *image)
1000 Evas_Cairo_Image *im;
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);
1011 eng_image_size_get(void *data, void *image, int *w, int *h)
1015 re = (Render_Engine *)data;
1023 Evas_Cairo_Image *im;
1026 if (w) *w = im->im->image->w;
1027 if (h) *h = im->im->image->h;
1032 eng_image_size_set(void *data, void *image, int w, int h)
1037 re = (Render_Engine *)data;
1042 eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
1047 re = (Render_Engine *)data;
1052 eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
1057 re = (Render_Engine *)data;
1063 eng_image_data_put(void *data, void *image, DATA32 *image_data)
1068 re = (Render_Engine *)data;
1073 eng_image_data_preload_request(void *data, void *image, const void *target)
1078 re = (Render_Engine *)data;
1083 eng_image_data_preload_cancel(void *data, void *image, const void *target)
1088 re = (Render_Engine *)data;
1093 eng_image_alpha_set(void *data, void *image, int has_alpha)
1098 re = (Render_Engine *)data;
1103 eng_image_alpha_get(void *data, void *image)
1106 Evas_Cairo_Image *im;
1108 re = (Render_Engine *)data;
1109 if (!image) return 0;
1112 if (im->im->cache_entry.flags.alpha) return 1;
1117 eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
1121 re = (Render_Engine *)data;
1126 eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
1130 re = (Render_Engine *)data;
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)
1138 Evas_Cairo_Context *ctxt;
1139 Evas_Cairo_Image *im;
1142 re = (Render_Engine *)data;
1143 ctxt = (Evas_Cairo_Context *)context;
1147 evas_common_load_image_data_from_file(im->im);
1148 pix = im->im->image->data;
1153 im->mulpix = malloc(im->im->image->w * im->im->image->h * sizeof(DATA32));
1159 n = im->im->image->w * im->im->image->h;
1161 for (i = 0; i < n; i++)
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;
1173 im->surface = cairo_image_surface_create_for_data(im->mulpix,
1174 CAIRO_FORMAT_ARGB32,
1178 im->pattern = cairo_pattern_create_for_surface(im->surface);
1183 cairo_pattern_set_filter(im->pattern, CAIRO_FILTER_BILINEAR);
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,
1202 cairo_paint(ctxt->cairo);
1203 cairo_restore(ctxt->cairo);
1208 eng_image_comment_get(void *data, void *image, char *key)
1213 re = (Render_Engine *)data;
1218 eng_image_format_get(void *data, void *image)
1223 re = (Render_Engine *)data;
1228 eng_image_colorspace_set(void *data, void *image, int cspace)
1233 eng_image_colorspace_get(void *data, void *image)
1235 return EVAS_COLORSPACE_ARGB8888;
1239 eng_image_native_set(void *data, void *image, void *native)
1244 eng_image_native_get(void *data, void *image)
1250 eng_image_cache_flush(void *data)
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);
1262 eng_image_cache_set(void *data, int bytes)
1266 re = (Render_Engine *)data;
1267 evas_common_image_set_cache(bytes);
1271 eng_image_cache_get(void *data)
1275 re = (Render_Engine *)data;
1276 return evas_common_image_get_cache();
1280 eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
1285 eng_image_scale_hint_get(void *data __UNUSED__, void *image)
1287 return EVAS_IMAGE_SCALE_HINT_NONE;
1291 eng_font_load(void *data, char *name, int size)
1295 /* FIXME, use cairo font subsystem */
1296 re = (Render_Engine *)data;
1301 eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
1305 /* FIXME, use cairo font subsystem */
1306 re = (Render_Engine *)data;
1311 eng_font_add(void *data, void *font, char *name, int size)
1315 /* FIXME, use cairo font subsystem */
1316 re = (Render_Engine *)data;
1321 eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size)
1325 /* FIXME, use cairo font subsystem */
1326 re = (Render_Engine *)data;
1331 eng_font_free(void *data, void *font)
1335 /* FIXME, use cairo font subsystem */
1336 re = (Render_Engine *)data;
1340 eng_font_ascent_get(void *data, void *font)
1344 /* FIXME, use cairo font subsystem */
1345 re = (Render_Engine *)data;
1350 eng_font_descent_get(void *data, void *font)
1354 /* FIXME, use cairo font subsystem */
1355 re = (Render_Engine *)data;
1360 eng_font_max_ascent_get(void *data, void *font)
1364 /* FIXME, use cairo font subsystem */
1365 re = (Render_Engine *)data;
1370 eng_font_max_descent_get(void *data, void *font)
1374 /* FIXME, use cairo font subsystem */
1375 re = (Render_Engine *)data;
1380 eng_font_string_size_get(void *data, void *font, char *text, int *w, int *h)
1384 /* FIXME, use cairo font subsystem */
1385 re = (Render_Engine *)data;
1389 eng_font_inset_get(void *data, void *font, char *text)
1393 /* FIXME, use cairo font subsystem */
1394 re = (Render_Engine *)data;
1399 eng_font_h_advance_get(void *data, void *font, char *text)
1404 /* FIXME, use cairo font subsystem */
1405 re = (Render_Engine *)data;
1410 eng_font_v_advance_get(void *data, void *font, char *text)
1415 /* FIXME, use cairo font subsystem */
1416 re = (Render_Engine *)data;
1421 eng_font_char_coords_get(void *data, void *font, char *text, int pos, int *cx, int *cy, int *cw, int *ch)
1425 /* FIXME, use cairo font subsystem */
1426 re = (Render_Engine *)data;
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)
1435 /* FIXME, use cairo font subsystem */
1436 re = (Render_Engine *)data;
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)
1445 /* FIXME, use cairo font subsystem */
1446 re = (Render_Engine *)data;
1450 eng_font_cache_flush(void *data)
1454 /* FIXME, use cairo font subsystem */
1455 re = (Render_Engine *)data;
1459 eng_font_cache_set(void *data, int bytes)
1463 /* FIXME, use cairo font subsystem */
1464 re = (Render_Engine *)data;
1468 eng_font_cache_get(void *data)
1472 /* FIXME, use cairo font subsystem */
1473 re = (Render_Engine *)data;
1478 eng_font_hinting_set(void *data, void *font, int hinting)
1482 /* FIXME, use cairo font subsystem */
1483 re = (Render_Engine *)data;
1487 eng_font_hinting_can_hint(void *data, int hinting)
1491 /* FIXME, use cairo font subsystem */
1492 re = (Render_Engine *)data;
1496 eng_font_last_up_to_pos(void *data __UNUSED__, void *font, const char *text, int x, int y)
1498 return evas_common_font_query_last_up_to_pos(font, text, x, y);
1502 eng_canvas_alpha_get(void *data, void *context)
1508 module_open(Evas_Module *em)
1511 _evas_engine_cairo_X11_log_dom = eina_log_domain_register("EvasCairoX11Engine", EINA_COLOR_BLUE);
1512 if(_evas_engine_cairo_X11_log_dom < 0)
1514 EINA_LOG_ERR("Impossible to create a log doamin for the cairo (X11) engine.\n");
1517 em->functions = (void *)(&eng_func);
1522 module_close(Evas_Module *em)
1524 eina_log_domain_unregister(_evas_engine_cairo_X11_log_dom);
1527 static Evas_Module_Api evas_modapi =
1529 EVAS_MODULE_API_VERSION,
1538 EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, cairo_x11);
1540 #ifndef EVAS_STATIC_BUILD_CAIRO_X11
1541 EVAS_EINA_MODULE_DEFINE(engine, cairo_x11);