aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/modules/engines/software_generic/evas_engine.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/modules/engines/software_generic/evas_engine.c')
-rw-r--r--libraries/evas/src/modules/engines/software_generic/evas_engine.c1230
1 files changed, 1230 insertions, 0 deletions
diff --git a/libraries/evas/src/modules/engines/software_generic/evas_engine.c b/libraries/evas/src/modules/engines/software_generic/evas_engine.c
new file mode 100644
index 0000000..b2c53c5
--- /dev/null
+++ b/libraries/evas/src/modules/engines/software_generic/evas_engine.c
@@ -0,0 +1,1230 @@
1#include "evas_common.h" /* Also includes international specific stuff */
2#include "evas_private.h"
3
4/*
5 *****
6 **
7 ** ENGINE ROUTINES
8 **
9 *****
10 */
11static int cpunum = 0;
12static int _evas_soft_gen_log_dom = -1;
13
14static void
15eng_output_dump(void *data __UNUSED__)
16{
17 evas_common_image_image_all_unload();
18 evas_common_font_font_all_unload();
19}
20
21static void *
22eng_context_new(void *data __UNUSED__)
23{
24 return evas_common_draw_context_new();
25}
26
27static void
28eng_context_free(void *data __UNUSED__, void *context)
29{
30 evas_common_draw_context_free(context);
31}
32
33static void
34eng_context_clip_set(void *data __UNUSED__, void *context, int x, int y, int w, int h)
35{
36 evas_common_draw_context_set_clip(context, x, y, w, h);
37}
38
39static void
40eng_context_clip_clip(void *data __UNUSED__, void *context, int x, int y, int w, int h)
41{
42 evas_common_draw_context_clip_clip(context, x, y, w, h);
43}
44
45static void
46eng_context_clip_unset(void *data __UNUSED__, void *context)
47{
48 evas_common_draw_context_unset_clip(context);
49}
50
51static int
52eng_context_clip_get(void *data __UNUSED__, void *context, int *x, int *y, int *w, int *h)
53{
54 *x = ((RGBA_Draw_Context *)context)->clip.x;
55 *y = ((RGBA_Draw_Context *)context)->clip.y;
56 *w = ((RGBA_Draw_Context *)context)->clip.w;
57 *h = ((RGBA_Draw_Context *)context)->clip.h;
58 return ((RGBA_Draw_Context *)context)->clip.use;
59}
60
61static void
62eng_context_color_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
63{
64 evas_common_draw_context_set_color(context, r, g, b, a);
65}
66
67static int
68eng_context_color_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
69{
70 *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->col.col));
71 *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->col.col));
72 *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->col.col));
73 *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->col.col));
74 return 1;
75}
76
77static void
78eng_context_multiplier_set(void *data __UNUSED__, void *context, int r, int g, int b, int a)
79{
80 evas_common_draw_context_set_multiplier(context, r, g, b, a);
81}
82
83static void
84eng_context_multiplier_unset(void *data __UNUSED__, void *context)
85{
86 evas_common_draw_context_unset_multiplier(context);
87}
88
89static int
90eng_context_multiplier_get(void *data __UNUSED__, void *context, int *r, int *g, int *b, int *a)
91{
92 *r = (int)(R_VAL(&((RGBA_Draw_Context *)context)->mul.col));
93 *g = (int)(G_VAL(&((RGBA_Draw_Context *)context)->mul.col));
94 *b = (int)(B_VAL(&((RGBA_Draw_Context *)context)->mul.col));
95 *a = (int)(A_VAL(&((RGBA_Draw_Context *)context)->mul.col));
96 return ((RGBA_Draw_Context *)context)->mul.use;
97}
98
99static void
100eng_context_mask_set(void *data __UNUSED__, void *context, void *mask, int x, int y, int w, int h)
101{
102 evas_common_draw_context_set_mask(context, mask, x, y, w, h);
103}
104
105static void
106eng_context_mask_unset(void *data __UNUSED__, void *context)
107{
108 evas_common_draw_context_unset_mask(context);
109}
110/*
111static void *
112eng_context_mask_get(void *data __UNUSED__, void *context)
113{
114 return ((RGBA_Draw_Context *)context)->mask.mask;
115}
116*/
117
118static void
119eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
120{
121 evas_common_draw_context_add_cutout(context, x, y, w, h);
122}
123
124static void
125eng_context_cutout_clear(void *data __UNUSED__, void *context)
126{
127 evas_common_draw_context_clear_cutouts(context);
128}
129
130static void
131eng_context_anti_alias_set(void *data __UNUSED__, void *context, unsigned char aa)
132{
133 evas_common_draw_context_set_anti_alias(context, aa);
134}
135
136static unsigned char
137eng_context_anti_alias_get(void *data __UNUSED__, void *context)
138{
139 return ((RGBA_Draw_Context *)context)->anti_alias;
140}
141
142static void
143eng_context_color_interpolation_set(void *data __UNUSED__, void *context, int color_space)
144{
145 evas_common_draw_context_set_color_interpolation(context, color_space);
146}
147
148static int
149eng_context_color_interpolation_get(void *data __UNUSED__, void *context)
150{
151 return ((RGBA_Draw_Context *)context)->interpolation.color_space;
152}
153
154static void
155eng_context_render_op_set(void *data __UNUSED__, void *context, int op)
156{
157 evas_common_draw_context_set_render_op(context, op);
158}
159
160static int
161eng_context_render_op_get(void *data __UNUSED__, void *context)
162{
163 return ((RGBA_Draw_Context *)context)->render_op;
164}
165
166
167
168static void
169eng_rectangle_draw(void *data __UNUSED__, void *context, void *surface, int x, int y, int w, int h)
170{
171#ifdef BUILD_PIPE_RENDER
172 if ((cpunum > 1)
173#ifdef EVAS_FRAME_QUEUING
174 && evas_common_frameq_enabled()
175#endif
176 )
177 evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
178 else
179#endif
180 {
181 evas_common_rectangle_draw(surface, context, x, y, w, h);
182 evas_common_cpu_end_opt();
183 }
184}
185
186static void
187eng_line_draw(void *data __UNUSED__, void *context, void *surface, int x1, int y1, int x2, int y2)
188{
189#ifdef BUILD_PIPE_RENDER
190 if ((cpunum > 1)
191 #ifdef EVAS_FRAME_QUEUING
192 && evas_common_frameq_enabled()
193#endif
194 )
195 evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
196 else
197#endif
198 {
199 evas_common_line_draw(surface, context, x1, y1, x2, y2);
200 evas_common_cpu_end_opt();
201 }
202}
203
204static void *
205eng_polygon_point_add(void *data __UNUSED__, void *context __UNUSED__, void *polygon, int x, int y)
206{
207 return evas_common_polygon_point_add(polygon, x, y);
208}
209
210static void *
211eng_polygon_points_clear(void *data __UNUSED__, void *context __UNUSED__, void *polygon)
212{
213 return evas_common_polygon_points_clear(polygon);
214}
215
216static void
217eng_polygon_draw(void *data __UNUSED__, void *context, void *surface, void *polygon, int x, int y)
218{
219#ifdef BUILD_PIPE_RENDER
220 if ((cpunum > 1)
221#ifdef EVAS_FRAME_QUEUING
222 && evas_common_frameq_enabled()
223#endif
224 )
225 evas_common_pipe_poly_draw(surface, context, polygon, x, y);
226 else
227#endif
228 {
229 evas_common_polygon_draw(surface, context, polygon, x, y);
230 evas_common_cpu_end_opt();
231 }
232}
233
234static int
235eng_image_alpha_get(void *data __UNUSED__, void *image)
236{
237 Image_Entry *im;
238
239 if (!image) return 1;
240 im = image;
241 switch (im->space)
242 {
243 case EVAS_COLORSPACE_ARGB8888:
244 if (im->flags.alpha) return 1;
245 default:
246 break;
247 }
248 return 0;
249}
250
251static int
252eng_image_colorspace_get(void *data __UNUSED__, void *image)
253{
254 Image_Entry *im;
255
256 if (!image) return EVAS_COLORSPACE_ARGB8888;
257 im = image;
258 return im->space;
259}
260
261static void
262eng_image_mask_create(void *data __UNUSED__, void *image)
263{
264 RGBA_Image *im;
265 int sz;
266 uint8_t *dst,*end;
267 uint32_t *src;
268
269 if (!image) return;
270 im = image;
271 if (im->mask.mask && !im->mask.dirty) return;
272
273 if (im->mask.mask) free(im->mask.mask);
274 sz = im->cache_entry.w * im->cache_entry.h;
275 im->mask.mask = malloc(sz);
276 dst = im->mask.mask;
277 if (!im->image.data)
278 evas_cache_image_load_data(&im->cache_entry);
279 src = (void*) im->image.data;
280 if (!src) return;
281 for (end = dst + sz ; dst < end ; dst ++, src ++)
282 *dst = *src >> 24;
283 im->mask.dirty = 0;
284}
285
286
287static void *
288eng_image_alpha_set(void *data __UNUSED__, void *image, int has_alpha)
289{
290 RGBA_Image *im;
291
292 if (!image) return NULL;
293 im = image;
294 if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
295 {
296 im->cache_entry.flags.alpha = 0;
297 return im;
298 }
299 im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
300 evas_common_image_colorspace_dirty(im);
301
302 im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
303 return im;
304}
305
306static void *
307eng_image_border_set(void *data __UNUSED__, void *image, int l __UNUSED__, int r __UNUSED__, int t __UNUSED__, int b __UNUSED__)
308{
309 RGBA_Image *im;
310
311 im = image;
312 return im;
313}
314
315static void
316eng_image_border_get(void *data __UNUSED__, void *image, int *l __UNUSED__, int *r __UNUSED__, int *t __UNUSED__, int *b __UNUSED__)
317{
318 RGBA_Image *im;
319
320 im = image;
321}
322
323static char *
324eng_image_comment_get(void *data __UNUSED__, void *image, char *key __UNUSED__)
325{
326 RGBA_Image *im;
327
328 if (!image) return NULL;
329 im = image;
330 return im->info.comment;
331}
332
333static char *
334eng_image_format_get(void *data __UNUSED__, void *image __UNUSED__)
335{
336 return NULL;
337}
338
339static void
340eng_image_colorspace_set(void *data __UNUSED__, void *image, int cspace)
341{
342 Image_Entry *im;
343
344 if (!image) return;
345 im = image;
346 evas_cache_image_colorspace(im, cspace);
347}
348
349static void *
350eng_image_native_set(void *data __UNUSED__, void *image, void *native __UNUSED__)
351{
352 return image;
353}
354
355static void *
356eng_image_native_get(void *data __UNUSED__, void *image __UNUSED__)
357{
358 return NULL;
359}
360
361static void *
362eng_image_load(void *data __UNUSED__, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
363{
364 *error = EVAS_LOAD_ERROR_NONE;
365 return evas_common_load_image_from_file(file, key, lo, error);
366}
367
368static void *
369eng_image_new_from_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
370{
371 return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
372}
373
374static void *
375eng_image_new_from_copied_data(void *data __UNUSED__, int w, int h, DATA32 *image_data, int alpha, int cspace)
376{
377 return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
378}
379
380static void
381eng_image_free(void *data __UNUSED__, void *image)
382{
383 evas_cache_image_drop(image);
384}
385
386static void
387eng_image_size_get(void *data __UNUSED__, void *image, int *w, int *h)
388{
389 Image_Entry *im;
390
391 im = image;
392 if (w) *w = im->w;
393 if (h) *h = im->h;
394}
395
396static void *
397eng_image_size_set(void *data __UNUSED__, void *image, int w, int h)
398{
399 Image_Entry *im;
400
401 im = image;
402 return evas_cache_image_size_set(image, w, h);
403}
404
405static void *
406eng_image_dirty_region(void *data __UNUSED__, void *image, int x, int y, int w, int h)
407{
408 Image_Entry *im = image;
409
410 if (!image) return NULL;
411 return evas_cache_image_dirty(im, x, y, w, h);
412}
413
414static void *
415eng_image_data_get(void *data __UNUSED__, void *image, int to_write, DATA32 **image_data, int *err)
416{
417 RGBA_Image *im;
418 int error;
419
420 if (!image)
421 {
422 *image_data = NULL;
423 return NULL;
424 }
425 im = image;
426 error = evas_cache_image_load_data(&im->cache_entry);
427 switch (im->cache_entry.space)
428 {
429 case EVAS_COLORSPACE_ARGB8888:
430 if (to_write)
431 im = (RGBA_Image *)evas_cache_image_alone(&im->cache_entry);
432 *image_data = im->image.data;
433 break;
434 case EVAS_COLORSPACE_YCBCR422P601_PL:
435 case EVAS_COLORSPACE_YCBCR422P709_PL:
436 case EVAS_COLORSPACE_YCBCR422601_PL:
437 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
438 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
439 *image_data = im->cs.data;
440 break;
441 default:
442 abort();
443 break;
444 }
445 if (err) *err = error;
446 return im;
447}
448
449static void *
450eng_image_data_put(void *data, void *image, DATA32 *image_data)
451{
452 RGBA_Image *im, *im2;
453
454 if (!image) return NULL;
455 im = image;
456 switch (im->cache_entry.space)
457 {
458 case EVAS_COLORSPACE_ARGB8888:
459 if (image_data != im->image.data)
460 {
461 int w, h;
462
463 w = im->cache_entry.w;
464 h = im->cache_entry.h;
465 im2 = eng_image_new_from_data(data, w, h, image_data,
466 eng_image_alpha_get(data, image),
467 eng_image_colorspace_get(data, image));
468 evas_cache_image_drop(&im->cache_entry);
469 im = im2;
470 }
471 break;
472 case EVAS_COLORSPACE_YCBCR422P601_PL:
473 case EVAS_COLORSPACE_YCBCR422P709_PL:
474 case EVAS_COLORSPACE_YCBCR422601_PL:
475 case EVAS_COLORSPACE_YCBCR420NV12601_PL:
476 case EVAS_COLORSPACE_YCBCR420TM12601_PL:
477 if (image_data != im->cs.data)
478 {
479 if (im->cs.data)
480 {
481 if (!im->cs.no_free) free(im->cs.data);
482 }
483 im->cs.data = image_data;
484 }
485 evas_common_image_colorspace_dirty(im);
486 break;
487 default:
488 abort();
489 break;
490 }
491 return im;
492}
493
494static void
495eng_image_data_preload_request(void *data __UNUSED__, void *image, const void *target)
496{
497 RGBA_Image *im = image;
498
499 if (!im) return ;
500 evas_cache_image_preload_data(&im->cache_entry, target);
501}
502
503static void
504eng_image_data_preload_cancel(void *data __UNUSED__, void *image, const void *target)
505{
506 RGBA_Image *im = image;
507
508 if (!im) return ;
509 evas_cache_image_preload_cancel(&im->cache_entry, target);
510}
511
512static void
513eng_image_draw(void *data __UNUSED__, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth)
514{
515 RGBA_Image *im;
516
517 if (!image) return;
518 im = image;
519#ifdef BUILD_PIPE_RENDER
520 if ((cpunum > 1)
521#ifdef EVAS_FRAME_QUEUING
522 && evas_common_frameq_enabled()
523#endif
524 )
525 {
526 evas_common_rgba_image_scalecache_prepare((Image_Entry *)(im),
527 surface, context, smooth,
528 src_x, src_y, src_w, src_h,
529 dst_x, dst_y, dst_w, dst_h);
530
531 evas_common_pipe_image_draw(im, surface, context, smooth,
532 src_x, src_y, src_w, src_h,
533 dst_x, dst_y, dst_w, dst_h);
534 }
535 else
536#endif
537 {
538// if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888)
539// evas_cache_image_load_data(&im->cache_entry);
540// evas_common_image_colorspace_normalize(im);
541 evas_common_rgba_image_scalecache_prepare(&im->cache_entry, surface, context, smooth,
542 src_x, src_y, src_w, src_h,
543 dst_x, dst_y, dst_w, dst_h);
544 evas_common_rgba_image_scalecache_do(&im->cache_entry, surface, context, smooth,
545 src_x, src_y, src_w, src_h,
546 dst_x, dst_y, dst_w, dst_h);
547/*
548 if (smooth)
549 evas_common_scale_rgba_in_to_out_clip_smooth(im, surface, context,
550 src_x, src_y, src_w, src_h,
551 dst_x, dst_y, dst_w, dst_h);
552 else
553 evas_common_scale_rgba_in_to_out_clip_sample(im, surface, context,
554 src_x, src_y, src_w, src_h,
555 dst_x, dst_y, dst_w, dst_h);
556 */
557 evas_common_cpu_end_opt();
558 }
559}
560
561static void
562eng_image_map_draw(void *data __UNUSED__, void *context, void *surface, void *image, int npoints, RGBA_Map_Point *p, int smooth, int level)
563{
564 RGBA_Image *im;
565
566 if (!image) return;
567 if (npoints < 3) return;
568 im = image;
569
570 if ((p[0].x == p[3].x) &&
571 (p[1].x == p[2].x) &&
572 (p[0].y == p[1].y) &&
573 (p[3].y == p[2].y) &&
574 (p[0].x <= p[1].x) &&
575 (p[0].y <= p[2].y) &&
576 (p[0].u == 0) &&
577 (p[0].v == 0) &&
578 (p[1].u == (int)(im->cache_entry.w << FP)) &&
579 (p[1].v == 0) &&
580 (p[2].u == (int)(im->cache_entry.w << FP)) &&
581 (p[2].v == (int)(im->cache_entry.h << FP)) &&
582 (p[3].u == 0) &&
583 (p[3].v == (int)(im->cache_entry.h << FP)) &&
584 (p[0].col == 0xffffffff) &&
585 (p[1].col == 0xffffffff) &&
586 (p[2].col == 0xffffffff) &&
587 (p[3].col == 0xffffffff))
588 {
589 int dx, dy, dw, dh;
590
591 dx = p[0].x >> FP;
592 dy = p[0].y >> FP;
593 dw = (p[2].x >> FP) - dx;
594 dh = (p[2].y >> FP) - dy;
595 eng_image_draw
596 (data, context, surface, image,
597 0, 0, im->cache_entry.w, im->cache_entry.h,
598 dx, dy, dw, dh, smooth);
599 }
600 else
601 {
602#ifdef BUILD_PIPE_RENDER
603 if ((cpunum > 1)
604# ifdef EVAS_FRAME_QUEUING
605 && evas_common_frameq_enabled()
606# endif
607 )
608 evas_common_pipe_map_draw(im, surface, context, npoints, p, smooth, level);
609 else
610#endif
611 evas_common_map_rgba(im, surface, context, npoints, p, smooth, level);
612 }
613 evas_common_cpu_end_opt();
614
615 if (npoints > 4)
616 {
617 eng_image_map_draw(data, context, surface, image, npoints - 2, p + 2,
618 smooth, level);
619 }
620}
621
622static void *
623eng_image_map_surface_new(void *data __UNUSED__, int w, int h, int alpha)
624{
625 void *surface;
626 DATA32 *pixels;
627 surface = evas_cache_image_copied_data(evas_common_image_cache_get(),
628 w, h, NULL, alpha,
629 EVAS_COLORSPACE_ARGB8888);
630 pixels = evas_cache_image_pixels(surface);
631 return surface;
632}
633
634static void
635eng_image_map_surface_free(void *data __UNUSED__, void *surface)
636{
637 evas_cache_image_drop(surface);
638}
639
640static void
641eng_image_scale_hint_set(void *data __UNUSED__, void *image, int hint)
642{
643 Image_Entry *im;
644
645 if (!image) return;
646 im = image;
647 im->scale_hint = hint;
648}
649
650static int
651eng_image_scale_hint_get(void *data __UNUSED__, void *image)
652{
653 Image_Entry *im;
654
655 if (!image) return EVAS_IMAGE_SCALE_HINT_NONE;
656 im = image;
657 return im->scale_hint;
658}
659
660static Eina_Bool
661eng_image_animated_get(void *data __UNUSED__, void *image)
662{
663 Image_Entry *im;
664
665 if (!image) return EINA_FALSE;
666 im = image;
667 return im->flags.animated;
668}
669
670static int
671eng_image_animated_frame_count_get(void *data __UNUSED__, void *image)
672{
673 Image_Entry *im;
674
675 if (!image) return -1;
676 im = image;
677 if (!im->flags.animated) return -1;
678 return im->frame_count;
679}
680
681static Evas_Image_Animated_Loop_Hint
682eng_image_animated_loop_type_get(void *data __UNUSED__, void *image)
683{
684 Image_Entry *im;
685
686 if (!image) return EVAS_IMAGE_ANIMATED_HINT_NONE;
687 im = image;
688 if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
689 return im->loop_hint;
690}
691
692static int
693eng_image_animated_loop_count_get(void *data __UNUSED__, void *image)
694{
695 Image_Entry *im;
696
697 if (!image) return -1;
698 im = image;
699 if (!im->flags.animated) return -1;
700 return im->loop_count;
701}
702
703static double
704eng_image_animated_frame_duration_get(void *data __UNUSED__, void *image, int start_frame, int frame_num)
705{
706 Image_Entry *im;
707
708 if (!image) return -1;
709 im = image;
710 if (!im->flags.animated) return -1;
711 return evas_common_load_rgba_image_frame_duration_from_file(im, start_frame, frame_num);
712}
713
714static Eina_Bool
715eng_image_animated_frame_set(void *data __UNUSED__, void *image, int frame_index)
716{
717 Image_Entry *im;
718
719 if (!image) return EINA_FALSE;
720 im = image;
721 if (!im->flags.animated) return EINA_FALSE;
722 if (im->cur_frame == frame_index) return EINA_FALSE;
723 im->cur_frame = frame_index;
724 return EINA_TRUE;
725}
726
727static void
728eng_image_cache_flush(void *data __UNUSED__)
729{
730 int tmp_size;
731
732 tmp_size = evas_common_image_get_cache();
733 evas_common_image_set_cache(0);
734 evas_common_rgba_image_scalecache_flush();
735 evas_common_image_set_cache(tmp_size);
736}
737
738static void
739eng_image_cache_set(void *data __UNUSED__, int bytes)
740{
741 evas_common_image_set_cache(bytes);
742 evas_common_rgba_image_scalecache_size_set(bytes);
743}
744
745static int
746eng_image_cache_get(void *data __UNUSED__)
747{
748 return evas_common_image_get_cache();
749}
750
751static Evas_Font_Set *
752eng_font_load(void *data __UNUSED__, const char *name, int size,
753 Font_Rend_Flags wanted_rend)
754{
755 return (Evas_Font_Set *) evas_common_font_load(name, size, wanted_rend);
756}
757
758static Evas_Font_Set *
759eng_font_memory_load(void *data __UNUSED__, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
760{
761 return (Evas_Font_Set *) evas_common_font_memory_load(name, size, fdata,
762 fdata_size, wanted_rend);
763}
764
765static Evas_Font_Set *
766eng_font_add(void *data __UNUSED__, Evas_Font_Set *font, const char *name, int size, Font_Rend_Flags wanted_rend)
767{
768 return (Evas_Font_Set *) evas_common_font_add((RGBA_Font *) font, name,
769 size, wanted_rend);
770}
771
772static Evas_Font_Set *
773eng_font_memory_add(void *data __UNUSED__, Evas_Font_Set *font, char *name, int size, const void *fdata, int fdata_size, Font_Rend_Flags wanted_rend)
774{
775 return (Evas_Font_Set *) evas_common_font_memory_add((RGBA_Font *) font,
776 name, size, fdata, fdata_size, wanted_rend);
777}
778
779static void
780eng_font_free(void *data __UNUSED__, Evas_Font_Set *font)
781{
782 evas_common_font_free((RGBA_Font *) font);
783}
784
785static int
786eng_font_ascent_get(void *data __UNUSED__, Evas_Font_Set *font)
787{
788 return evas_common_font_ascent_get((RGBA_Font *) font);
789}
790
791static int
792eng_font_descent_get(void *data __UNUSED__, Evas_Font_Set *font)
793{
794 return evas_common_font_descent_get((RGBA_Font *) font);
795}
796
797static int
798eng_font_max_ascent_get(void *data __UNUSED__, Evas_Font_Set *font)
799{
800 return evas_common_font_max_ascent_get((RGBA_Font *) font);
801}
802
803static int
804eng_font_max_descent_get(void *data __UNUSED__, Evas_Font_Set *font)
805{
806 return evas_common_font_max_descent_get((RGBA_Font *) font);
807}
808
809static void
810eng_font_string_size_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int *w, int *h)
811{
812 evas_common_font_query_size((RGBA_Font *) font, text_props, w, h);
813}
814
815static int
816eng_font_inset_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
817{
818 return evas_common_font_query_inset((RGBA_Font *) font, text_props);
819}
820
821static int
822eng_font_right_inset_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
823{
824 return evas_common_font_query_right_inset((RGBA_Font *) font, text_props);
825}
826
827static int
828eng_font_h_advance_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
829{
830 int h, v;
831
832 evas_common_font_query_advance((RGBA_Font *) font, text_props, &h, &v);
833 return h;
834}
835
836static int
837eng_font_v_advance_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props)
838{
839 int h, v;
840
841 evas_common_font_query_advance((RGBA_Font *) font, text_props, &h, &v);
842 return v;
843}
844
845static int
846eng_font_pen_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int pos, int *cpen_x, int *cy, int *cadv, int *ch)
847{
848 return evas_common_font_query_pen_coords((RGBA_Font *) font, text_props, pos, cpen_x, cy, cadv, ch);
849}
850
851static Eina_Bool
852eng_font_text_props_info_create(void *data __UNUSED__, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, size_t par_pos, size_t len)
853{
854 return evas_common_text_props_content_create((RGBA_Font_Int *) fi, text,
855 text_props, par_props, par_pos, len);
856}
857
858static int
859eng_font_char_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int pos, int *cx, int *cy, int *cw, int *ch)
860{
861 return evas_common_font_query_char_coords((RGBA_Font *) font, text_props, pos, cx, cy, cw, ch);
862}
863
864static int
865eng_font_char_at_coords_get(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int x, int y, int *cx, int *cy, int *cw, int *ch)
866{
867 return evas_common_font_query_char_at_coords((RGBA_Font *) font, text_props, x, y, cx, cy, cw, ch);
868}
869
870static int
871eng_font_last_up_to_pos(void *data __UNUSED__, Evas_Font_Set *font, const Evas_Text_Props *text_props, int x, int y)
872{
873 return evas_common_font_query_last_up_to_pos((RGBA_Font *) font, text_props, x, y);
874}
875
876static int
877eng_font_run_font_end_get(void *data __UNUSED__, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len)
878{
879 return evas_common_font_query_run_font_end_get((RGBA_Font *) font,
880 (RGBA_Font_Int **) script_fi, (RGBA_Font_Int **) cur_fi,
881 script, text, run_len);
882}
883
884static void
885eng_font_draw(void *data __UNUSED__, void *context, void *surface, Evas_Font_Set *font, int x, int y, int w __UNUSED__, int h __UNUSED__, int ow __UNUSED__, int oh __UNUSED__, const Evas_Text_Props *text_props)
886{
887#ifdef BUILD_PIPE_RENDER
888 if ((cpunum > 1)
889#ifdef EVAS_FRAME_QUEUING
890 && evas_common_frameq_enabled()
891#endif
892 )
893 evas_common_pipe_text_draw(surface, context, (RGBA_Font *) font, x, y,
894 text_props);
895 else
896#endif
897 {
898 evas_common_font_draw(surface, context, (RGBA_Font *) font, x, y,
899 text_props);
900 evas_common_cpu_end_opt();
901 }
902}
903
904static void
905eng_font_cache_flush(void *data __UNUSED__)
906{
907 int tmp_size;
908
909 tmp_size = evas_common_font_cache_get();
910 evas_common_font_cache_set(0);
911 evas_common_font_flush();
912 evas_common_font_cache_set(tmp_size);
913}
914
915static void
916eng_font_cache_set(void *data __UNUSED__, int bytes)
917{
918 evas_common_font_cache_set(bytes);
919}
920
921static int
922eng_font_cache_get(void *data __UNUSED__)
923{
924 return evas_common_font_cache_get();
925}
926
927static void
928eng_font_hinting_set(void *data __UNUSED__, Evas_Font_Set *font, int hinting)
929{
930 evas_common_font_hinting_set((RGBA_Font *) font, hinting);
931}
932
933static int
934eng_font_hinting_can_hint(void *data __UNUSED__, int hinting)
935{
936 return evas_common_hinting_available(hinting);
937}
938
939static Eina_Bool
940eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
941{
942 return EINA_TRUE;
943}
944
945
946/* Filter API */
947#if 0 // filtering disabled
948static void
949eng_image_draw_filtered(void *data __UNUSED__, void *context __UNUSED__,
950 void *surface, void *image, Evas_Filter_Info *filter)
951{
952 Evas_Software_Filter_Fn fn;
953 RGBA_Image *im = image;
954
955 fn = evas_filter_software_get(filter);
956 if (!fn) return;
957 if (im->cache_entry.cache) evas_cache_image_load_data(&im->cache_entry);
958 fn(filter, image, surface);
959 return;
960}
961
962static Filtered_Image *
963eng_image_filtered_get(void *image, uint8_t *key, size_t keylen)
964{
965 RGBA_Image *im = image;
966 Filtered_Image *fi;
967 Eina_List *l;
968
969 for (l = im->filtered ; l ; l = l->next)
970 {
971 fi = l->data;
972 if (fi->keylen != keylen) continue;
973 if (memcmp(key, fi->key, keylen) != 0) continue;
974 fi->ref ++;
975 return fi;
976 }
977
978 return NULL;
979}
980
981static Filtered_Image *
982eng_image_filtered_save(void *image, void *fimage, uint8_t *key, size_t keylen)
983{
984 RGBA_Image *im = image;
985 Filtered_Image *fi;
986 Eina_List *l;
987
988 for (l = im->filtered ; l ; l = l->next)
989 {
990 fi = l->data;
991 if (fi->keylen != keylen) continue;
992 if (memcmp(key, fi->key, keylen) == 0) continue;
993 evas_cache_image_drop((void *)fi->image);
994 fi->image = fimage;
995 return fi;
996 }
997
998 fi = calloc(1,sizeof(Filtered_Image));
999 if (!fi) return NULL;
1000
1001 fi->keylen = keylen;
1002 fi->key = malloc(keylen);
1003 memcpy(fi->key, key, keylen);
1004 fi->image = fimage;
1005 fi->ref = 1;
1006
1007 im->filtered = eina_list_prepend(im->filtered, fi);
1008
1009 return fi;
1010}
1011
1012static void
1013eng_image_filtered_free(void *image, Filtered_Image *fi)
1014{
1015 RGBA_Image *im = image;
1016
1017 fi->ref --;
1018 if (fi->ref) return;
1019
1020 free(fi->key);
1021 evas_cache_image_drop(&fi->image->cache_entry);
1022 fi->image = NULL;
1023
1024 im->filtered = eina_list_remove(im->filtered, fi);
1025}
1026#endif
1027
1028static int
1029eng_image_load_error_get(void *data __UNUSED__, void *image)
1030{
1031 RGBA_Image *im;
1032
1033 if (!image) return EVAS_LOAD_ERROR_NONE;
1034 im = image;
1035 return im->cache_entry.load_error;
1036}
1037
1038/*
1039 *****
1040 **
1041 ** ENGINE API
1042 **
1043 *****
1044 */
1045
1046static Evas_Func func =
1047{
1048 NULL,
1049 NULL,
1050 NULL,
1051 NULL,
1052 NULL,
1053 NULL,
1054 NULL,
1055 NULL,
1056 NULL,
1057 NULL,
1058 NULL,
1059 NULL,
1060 NULL,
1061 eng_output_dump,
1062 /* draw context virtual methods */
1063 eng_context_new,
1064 eng_canvas_alpha_get,
1065 eng_context_free,
1066 eng_context_clip_set,
1067 eng_context_clip_clip,
1068 eng_context_clip_unset,
1069 eng_context_clip_get,
1070 eng_context_mask_set,
1071 eng_context_mask_unset,
1072 eng_context_color_set,
1073 eng_context_color_get,
1074 eng_context_multiplier_set,
1075 eng_context_multiplier_unset,
1076 eng_context_multiplier_get,
1077 eng_context_cutout_add,
1078 eng_context_cutout_clear,
1079 eng_context_anti_alias_set,
1080 eng_context_anti_alias_get,
1081 eng_context_color_interpolation_set,
1082 eng_context_color_interpolation_get,
1083 eng_context_render_op_set,
1084 eng_context_render_op_get,
1085 /* rect draw funcs */
1086 eng_rectangle_draw,
1087 /* line draw funcs */
1088 eng_line_draw,
1089 /* polygon draw funcs */
1090 eng_polygon_point_add,
1091 eng_polygon_points_clear,
1092 eng_polygon_draw,
1093 /* image draw funcs */
1094 eng_image_load,
1095 eng_image_new_from_data,
1096 eng_image_new_from_copied_data,
1097 eng_image_free,
1098 eng_image_size_get,
1099 eng_image_size_set,
1100 NULL,
1101 eng_image_dirty_region,
1102 eng_image_data_get,
1103 eng_image_data_put,
1104 eng_image_data_preload_request,
1105 eng_image_data_preload_cancel,
1106 eng_image_alpha_set,
1107 eng_image_alpha_get,
1108 eng_image_border_set,
1109 eng_image_border_get,
1110 eng_image_draw,
1111 eng_image_comment_get,
1112 eng_image_format_get,
1113 eng_image_colorspace_set,
1114 eng_image_colorspace_get,
1115 eng_image_mask_create,
1116 eng_image_native_set,
1117 eng_image_native_get,
1118 /* image cache funcs */
1119 eng_image_cache_flush,
1120 eng_image_cache_set,
1121 eng_image_cache_get,
1122 /* font draw functions */
1123 eng_font_load,
1124 eng_font_memory_load,
1125 eng_font_add,
1126 eng_font_memory_add,
1127 eng_font_free,
1128 eng_font_ascent_get,
1129 eng_font_descent_get,
1130 eng_font_max_ascent_get,
1131 eng_font_max_descent_get,
1132 eng_font_string_size_get,
1133 eng_font_inset_get,
1134 eng_font_h_advance_get,
1135 eng_font_v_advance_get,
1136 eng_font_char_coords_get,
1137 eng_font_char_at_coords_get,
1138 eng_font_draw,
1139 /* font cache functions */
1140 eng_font_cache_flush,
1141 eng_font_cache_set,
1142 eng_font_cache_get,
1143 /* font hinting functions */
1144 eng_font_hinting_set,
1145 eng_font_hinting_can_hint,
1146 eng_image_scale_hint_set,
1147 eng_image_scale_hint_get,
1148 /* more font draw functions */
1149 eng_font_last_up_to_pos,
1150 eng_image_map_draw,
1151 eng_image_map_surface_new,
1152 eng_image_map_surface_free,
1153 NULL, // eng_image_content_hint_set - software doesn't use it
1154 NULL, // eng_image_content_hint_get - software doesn't use it
1155 eng_font_pen_coords_get,
1156 eng_font_text_props_info_create,
1157 eng_font_right_inset_get,
1158#if 0 // filtering disabled
1159 eng_image_draw_filtered,
1160 eng_image_filtered_get,
1161 eng_image_filtered_save,
1162 eng_image_filtered_free,
1163#endif
1164 NULL, // FIXME: need software mesa for gl rendering <- gl_surface_create
1165 NULL, // FIXME: need software mesa for gl rendering <- gl_surface_destroy
1166 NULL, // FIXME: need software mesa for gl rendering <- gl_context_create
1167 NULL, // FIXME: need software mesa for gl rendering <- gl_context_destroy
1168 NULL, // FIXME: need software mesa for gl rendering <- gl_make_current
1169 NULL, // FIXME: need software mesa for gl rendering <- gl_string_query
1170 NULL, // FIXME: need software mesa for gl rendering <- gl_proc_address_get
1171 NULL, // FIXME: need software mesa for gl rendering <- gl_native_surface_get
1172 NULL, // FIXME: need software mesa for gl rendering <- gl_api_get
1173 eng_image_load_error_get,
1174 eng_font_run_font_end_get,
1175 eng_image_animated_get,
1176 eng_image_animated_frame_count_get,
1177 eng_image_animated_loop_type_get,
1178 eng_image_animated_loop_count_get,
1179 eng_image_animated_frame_duration_get,
1180 eng_image_animated_frame_set,
1181 NULL
1182 /* FUTURE software generic calls go here */
1183};
1184
1185/*
1186 *****
1187 **
1188 ** MODULE ACCESSIBLE API API
1189 **
1190 *****
1191 */
1192
1193static int
1194module_open(Evas_Module *em)
1195{
1196 if (!em) return 0;
1197 _evas_soft_gen_log_dom = eina_log_domain_register
1198 ("evas-software_generic", EVAS_DEFAULT_LOG_COLOR);
1199 if(_evas_soft_gen_log_dom<0)
1200 {
1201 EINA_LOG_ERR("Can not create a module log domain.");
1202 return 0;
1203 }
1204 em->functions = (void *)(&func);
1205 cpunum = eina_cpu_count();
1206 return 1;
1207}
1208
1209static void
1210module_close(Evas_Module *em __UNUSED__)
1211{
1212 eina_log_domain_unregister(_evas_soft_gen_log_dom);
1213}
1214
1215static Evas_Module_Api evas_modapi =
1216{
1217 EVAS_MODULE_API_VERSION,
1218 "software_generic",
1219 "none",
1220 {
1221 module_open,
1222 module_close
1223 }
1224};
1225
1226EVAS_MODULE_DEFINE(EVAS_MODULE_TYPE_ENGINE, engine, software_generic);
1227
1228#ifndef EVAS_STATIC_BUILD_SOFTWARE_GENERIC
1229EVAS_EINA_MODULE_DEFINE(engine, software_generic);
1230#endif