1 #include "evas_common.h"
2 #include "evas_private.h"
12 static int cpunum = 0;
15 eng_context_new(void *data)
17 return evas_common_draw_context_new();
21 eng_context_free(void *data, void *context)
23 evas_common_draw_context_free(context);
27 eng_context_clip_set(void *data, void *context, int x, int y, int w, int h)
29 evas_common_draw_context_set_clip(context, x, y, w, h);
33 eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h)
35 evas_common_draw_context_clip_clip(context, x, y, w, h);
39 eng_context_clip_unset(void *data, void *context)
41 evas_common_draw_context_unset_clip(context);
45 eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h)
47 *x = ((RGBA_Draw_Context *)context)->clip.x;
48 *y = ((RGBA_Draw_Context *)context)->clip.y;
49 *w = ((RGBA_Draw_Context *)context)->clip.w;
50 *h = ((RGBA_Draw_Context *)context)->clip.h;
51 return ((RGBA_Draw_Context *)context)->clip.use;
55 eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
57 evas_common_draw_context_set_color(context, r, g, b, a);
61 eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a)
63 *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col));
64 *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col));
65 *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col));
66 *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col));
71 eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
73 evas_common_draw_context_set_multiplier(context, r, g, b, a);
77 eng_context_multiplier_unset(void *data, void *context)
79 evas_common_draw_context_unset_multiplier(context);
83 eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a)
85 *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col));
86 *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col));
87 *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col));
88 *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col));
89 return ((RGBA_Draw_Context *)context)->mul.use;
93 eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
95 evas_common_draw_context_add_cutout(context, x, y, w, h);
99 eng_context_cutout_clear(void *data, void *context)
101 evas_common_draw_context_clear_cutouts(context);
105 eng_context_anti_alias_set(void *data, void *context, unsigned char aa)
107 evas_common_draw_context_set_anti_alias(context, aa);
111 eng_context_anti_alias_get(void *data, void *context)
113 return ((RGBA_Draw_Context *)context)->anti_alias;
117 eng_context_color_interpolation_set(void *data, void *context, int color_space)
119 evas_common_draw_context_set_color_interpolation(context, color_space);
123 eng_context_color_interpolation_get(void *data, void *context)
125 return ((RGBA_Draw_Context *)context)->interpolation.color_space;
129 eng_context_render_op_set(void *data, void *context, int op)
131 evas_common_draw_context_set_render_op(context, op);
135 eng_context_render_op_get(void *data, void *context)
137 return ((RGBA_Draw_Context *)context)->render_op;
143 eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
147 evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
151 evas_common_rectangle_draw(surface, context, x, y, w, h);
152 evas_common_cpu_end_opt();
157 eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
161 evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
165 evas_common_line_draw(surface, context, x1, y1, x2, y2);
166 evas_common_cpu_end_opt();
171 eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
173 return evas_common_polygon_point_add(polygon, x, y);
177 eng_polygon_points_clear(void *data, void *context, void *polygon)
179 return evas_common_polygon_points_clear(polygon);
183 eng_polygon_draw(void *data, void *context, void *surface, void *polygon)
187 evas_common_pipe_poly_draw(surface, context, polygon);
191 evas_common_polygon_draw(surface, context, polygon);
192 evas_common_cpu_end_opt();
197 eng_gradient_new(void *data)
199 return evas_common_gradient_new();
203 eng_gradient_free(void *data, void *gradient)
205 evas_common_gradient_free(gradient);
209 eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
211 evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
215 eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
217 evas_common_gradient_alpha_stop_add(gradient, a, delta);
221 eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
223 evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
227 eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
229 evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
233 eng_gradient_clear(void *data, void *gradient)
235 evas_common_gradient_clear(gradient);
239 eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
241 evas_common_gradient_fill_set(gradient, x, y, w, h);
245 eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
247 evas_common_gradient_fill_angle_set(gradient, angle);
251 eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
253 evas_common_gradient_fill_spread_set(gradient, spread);
257 eng_gradient_angle_set(void *data, void *gradient, double angle)
259 evas_common_gradient_map_angle_set(gradient, angle);
263 eng_gradient_offset_set(void *data, void *gradient, float offset)
265 evas_common_gradient_map_offset_set(gradient, offset);
269 eng_gradient_direction_set(void *data, void *gradient, int direction)
271 evas_common_gradient_map_direction_set(gradient, direction);
275 eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
277 evas_common_gradient_type_set(gradient, name, params);
281 eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
283 RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
284 RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
286 if (!dc || !gr || !gr->type.geometer) return 0;
287 return !(gr->type.geometer->has_alpha(gr, dc->render_op) |
288 gr->type.geometer->has_mask(gr, dc->render_op));
292 eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
294 RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
296 if (!dc || !gradient) return 0;
301 eng_gradient_render_pre(void *data, void *context, void *gradient)
303 RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
304 RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
307 if (!dc || !gr || !gr->type.geometer) return;
308 gr->type.geometer->geom_set(gr);
309 len = gr->type.geometer->get_map_len(gr);
310 evas_common_gradient_map(dc, gr, len);
314 eng_gradient_render_post(void *data, void *gradient)
319 eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
323 evas_common_pipe_grad_draw(surface, context, x, y, w, h, gradient);
327 evas_common_gradient_draw(surface, context, x, y, w, h, gradient);
328 evas_common_cpu_end_opt();
333 eng_image_alpha_get(void *data, void *image)
337 if (!image) return 1;
341 case EVAS_COLORSPACE_ARGB8888:
342 if (im->flags.alpha) return 1;
350 eng_image_colorspace_get(void *data, void *image)
354 if (!image) return EVAS_COLORSPACE_ARGB8888;
360 eng_image_alpha_set(void *data, void *image, int has_alpha)
364 if (!image) return NULL;
366 if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
368 im->cache_entry.flags.alpha = 0;
371 im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
372 evas_common_image_colorspace_dirty(im);
374 im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
379 eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
388 eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
396 eng_image_comment_get(void *data, void *image, char *key)
400 if (!image) return NULL;
402 return im->info.comment;
406 eng_image_format_get(void *data, void *image)
412 eng_image_colorspace_set(void *data, void *image, int cspace)
418 evas_cache_image_colorspace(im, cspace);
422 eng_image_native_set(void *data, void *image, void *native)
427 eng_image_native_get(void *data, void *image)
433 eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
436 return evas_common_load_image_from_file(file, key, lo);
440 eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
442 return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
446 eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
448 return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
452 eng_image_free(void *data, void *image)
454 evas_cache_image_drop(image);
458 eng_image_size_get(void *data, void *image, int *w, int *h)
468 eng_image_size_set(void *data, void *image, int w, int h)
473 return evas_cache_image_size_set(image, w, h);
477 eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
479 Image_Entry *im = image;
481 if (!image) return NULL;
482 return evas_cache_image_dirty(im, x, y, w, h);
486 eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
496 evas_cache_image_load_data(&im->cache_entry);
497 switch (im->cache_entry.space)
499 case EVAS_COLORSPACE_ARGB8888:
501 im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
502 *image_data = im->image.data;
504 case EVAS_COLORSPACE_YCBCR422P601_PL:
505 case EVAS_COLORSPACE_YCBCR422P709_PL:
506 *image_data = im->cs.data;
516 eng_image_data_put(void *data, void *image, DATA32 *image_data)
518 RGBA_Image *im, *im2;
520 if (!image) return NULL;
522 switch (im->cache_entry.space)
524 case EVAS_COLORSPACE_ARGB8888:
525 if (image_data != im->image.data)
529 w = im->cache_entry.w;
530 h = im->cache_entry.h;
531 im2 = eng_image_new_from_data(data, w, h, image_data,
532 eng_image_alpha_get(data, image),
533 eng_image_colorspace_get(data, image));
534 evas_cache_image_drop(&im->cache_entry);
538 case EVAS_COLORSPACE_YCBCR422P601_PL:
539 case EVAS_COLORSPACE_YCBCR422P709_PL:
540 if (image_data != im->cs.data)
544 if (!im->cs.no_free) free(im->cs.data);
546 im->cs.data = image_data;
547 evas_common_image_colorspace_dirty(im);
558 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)
564 if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
565 evas_cache_image_load_data(&im->cache_entry);
566 evas_common_image_colorspace_normalize(im);
569 evas_common_pipe_image_draw(im, surface, context, smooth,
570 src_x, src_y, src_w, src_h,
571 dst_x, dst_y, dst_w, dst_h);
576 evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context,
577 src_x, src_y, src_w, src_h,
578 dst_x, dst_y, dst_w, dst_h);
580 evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context,
581 src_x, src_y, src_w, src_h,
582 dst_x, dst_y, dst_w, dst_h);
583 evas_common_cpu_end_opt();
588 eng_image_cache_flush(void *data)
592 tmp_size = evas_common_image_get_cache();
593 evas_common_image_set_cache(0);
594 evas_common_image_set_cache(tmp_size);
598 eng_image_cache_set(void *data, int bytes)
600 evas_common_image_set_cache(bytes);
604 eng_image_cache_get(void *data)
606 return evas_common_image_get_cache();
610 eng_font_load(void *data, const char *name, int size)
612 return evas_common_font_load(name, size);
616 eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
618 return evas_common_font_memory_load(name, size, fdata, fdata_size);
622 eng_font_add(void *data, void *font, const char *name, int size)
624 return evas_common_font_add(font, name, size);
628 eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size)
630 return evas_common_font_memory_add(font, name, size, fdata, fdata_size);
634 eng_font_free(void *data, void *font)
636 evas_common_font_free(font);
640 eng_font_ascent_get(void *data, void *font)
642 return evas_common_font_ascent_get(font);
646 eng_font_descent_get(void *data, void *font)
648 return evas_common_font_descent_get(font);
652 eng_font_max_ascent_get(void *data, void *font)
654 return evas_common_font_max_ascent_get(font);
658 eng_font_max_descent_get(void *data, void *font)
660 return evas_common_font_max_descent_get(font);
664 eng_font_string_size_get(void *data, void *font, const char *text, int *w, int *h)
666 evas_common_font_query_size(font, text, w, h);
670 eng_font_inset_get(void *data, void *font, const char *text)
672 return evas_common_font_query_inset(font, text);
676 eng_font_h_advance_get(void *data, void *font, const char *text)
680 evas_common_font_query_advance(font, text, &h, &v);
685 eng_font_v_advance_get(void *data, void *font, const char *text)
689 evas_common_font_query_advance(font, text, &h, &v);
694 eng_font_char_coords_get(void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch)
696 return evas_common_font_query_char_coords(font, text, pos, cx, cy, cw, ch);
700 eng_font_char_at_coords_get(void *data, void *font, const char *text, int x, int y, int *cx, int *cy, int *cw, int *ch)
702 return evas_common_font_query_text_at_pos(font, text, x, y, cx, cy, cw, ch);
706 eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text)
710 evas_common_pipe_text_draw(surface, context, font, x, y, text);
714 evas_common_font_draw(surface, context, font, x, y, text);
715 evas_common_cpu_end_opt();
720 eng_font_cache_flush(void *data)
722 evas_common_font_flush();
726 eng_font_cache_set(void *data, int bytes)
728 evas_common_font_cache_set(bytes);
732 eng_font_cache_get(void *data)
734 return evas_common_font_cache_get();
738 eng_font_hinting_set(void *data, void *font, int hinting)
740 evas_common_font_hinting_set(font, hinting);
744 eng_font_hinting_can_hint(void *data, int hinting)
746 return evas_common_hinting_available(hinting);
758 static Evas_Func func =
773 /* draw context virtual methods */
776 eng_context_clip_set,
777 eng_context_clip_clip,
778 eng_context_clip_unset,
779 eng_context_clip_get,
780 eng_context_color_set,
781 eng_context_color_get,
782 eng_context_multiplier_set,
783 eng_context_multiplier_unset,
784 eng_context_multiplier_get,
785 eng_context_cutout_add,
786 eng_context_cutout_clear,
787 eng_context_anti_alias_set,
788 eng_context_anti_alias_get,
789 eng_context_color_interpolation_set,
790 eng_context_color_interpolation_get,
791 eng_context_render_op_set,
792 eng_context_render_op_get,
793 /* rect draw funcs */
795 /* line draw funcs */
797 /* polygon draw funcs */
798 eng_polygon_point_add,
799 eng_polygon_points_clear,
801 /* gradient draw funcs */
804 eng_gradient_color_stop_add,
805 eng_gradient_alpha_stop_add,
806 eng_gradient_color_data_set,
807 eng_gradient_alpha_data_set,
809 eng_gradient_fill_set,
810 eng_gradient_fill_angle_set,
811 eng_gradient_fill_spread_set,
812 eng_gradient_angle_set,
813 eng_gradient_offset_set,
814 eng_gradient_direction_set,
815 eng_gradient_type_set,
816 eng_gradient_is_opaque,
817 eng_gradient_is_visible,
818 eng_gradient_render_pre,
819 eng_gradient_render_post,
821 /* image draw funcs */
823 eng_image_new_from_data,
824 eng_image_new_from_copied_data,
829 eng_image_dirty_region,
834 eng_image_border_set,
835 eng_image_border_get,
837 eng_image_comment_get,
838 eng_image_format_get,
839 eng_image_colorspace_set,
840 eng_image_colorspace_get,
841 eng_image_native_set,
842 eng_image_native_get,
843 /* image cache funcs */
844 eng_image_cache_flush,
847 /* font draw functions */
849 eng_font_memory_load,
854 eng_font_descent_get,
855 eng_font_max_ascent_get,
856 eng_font_max_descent_get,
857 eng_font_string_size_get,
859 eng_font_h_advance_get,
860 eng_font_v_advance_get,
861 eng_font_char_coords_get,
862 eng_font_char_at_coords_get,
864 /* font cache functions */
865 eng_font_cache_flush,
868 /* font hinting functions */
869 eng_font_hinting_set,
870 eng_font_hinting_can_hint
871 /* FUTURE software generic calls go here */
877 ** MODULE ACCESSIBLE API API
883 module_open(Evas_Module *em)
886 em->functions = (void *)(&func);
887 cpunum = evas_common_cpu_count();
896 EAPI Evas_Module_Api evas_modapi =
898 EVAS_MODULE_API_VERSION,
899 EVAS_MODULE_TYPE_ENGINE,