move around - flatter.
[profile/ivi/evas.git] / src / modules / engines / software_generic / evas_engine.c
1 #include "evas_common.h"
2 #include "evas_private.h"
3
4 /*
5  *****
6  **
7  ** ENGINE ROUTINES
8  **
9  *****
10  */
11
12 static int cpunum = 0;
13
14 static void *
15 eng_context_new(void *data)
16 {
17    return evas_common_draw_context_new();
18 }
19
20 static void
21 eng_context_free(void *data, void *context)
22 {
23    evas_common_draw_context_free(context);
24 }
25
26 static void
27 eng_context_clip_set(void *data, void *context, int x, int y, int w, int h)
28 {
29    evas_common_draw_context_set_clip(context, x, y, w, h);
30 }
31
32 static void
33 eng_context_clip_clip(void *data, void *context, int x, int y, int w, int h)
34 {
35    evas_common_draw_context_clip_clip(context, x, y, w, h);
36 }
37
38 static void
39 eng_context_clip_unset(void *data, void *context)
40 {
41    evas_common_draw_context_unset_clip(context);
42 }
43
44 static int
45 eng_context_clip_get(void *data, void *context, int *x, int *y, int *w, int *h)
46 {
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;
52 }
53
54 static void
55 eng_context_color_set(void *data, void *context, int r, int g, int b, int a)
56 {
57    evas_common_draw_context_set_color(context, r, g, b, a);
58 }
59
60 static int
61 eng_context_color_get(void *data, void *context, int *r, int *g, int *b, int *a)
62 {
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));
67    return 1;
68 }
69
70 static void
71 eng_context_multiplier_set(void *data, void *context, int r, int g, int b, int a)
72 {
73    evas_common_draw_context_set_multiplier(context, r, g, b, a);
74 }
75
76 static void
77 eng_context_multiplier_unset(void *data, void *context)
78 {
79    evas_common_draw_context_unset_multiplier(context);
80 }
81
82 static int
83 eng_context_multiplier_get(void *data, void *context, int *r, int *g, int *b, int *a)
84 {
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;
90 }
91
92 static void
93 eng_context_cutout_add(void *data, void *context, int x, int y, int w, int h)
94 {
95    evas_common_draw_context_add_cutout(context, x, y, w, h);
96 }
97
98 static void
99 eng_context_cutout_clear(void *data, void *context)
100 {
101    evas_common_draw_context_clear_cutouts(context);
102 }
103
104 static void
105 eng_context_anti_alias_set(void *data, void *context, unsigned char aa)
106 {
107    evas_common_draw_context_set_anti_alias(context, aa);
108 }
109
110 static unsigned char
111 eng_context_anti_alias_get(void *data, void *context)
112 {
113    return ((RGBA_Draw_Context *)context)->anti_alias;
114 }
115
116 static void
117 eng_context_color_interpolation_set(void *data, void *context, int color_space)
118 {
119    evas_common_draw_context_set_color_interpolation(context, color_space);
120 }
121
122 static int
123 eng_context_color_interpolation_get(void *data, void *context)
124 {
125    return ((RGBA_Draw_Context *)context)->interpolation.color_space;
126 }
127
128 static void
129 eng_context_render_op_set(void *data, void *context, int op)
130 {
131    evas_common_draw_context_set_render_op(context, op);
132 }
133
134 static int
135 eng_context_render_op_get(void *data, void *context)
136 {
137    return ((RGBA_Draw_Context *)context)->render_op;
138 }
139
140
141
142 static void
143 eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
144 {
145 #ifdef BUILD_PTHREAD
146    if (cpunum > 1)
147      evas_common_pipe_rectangle_draw(surface, context, x, y, w, h);
148    else
149 #endif
150      {
151         evas_common_rectangle_draw(surface, context, x, y, w, h);
152         evas_common_cpu_end_opt();
153      }
154 }
155
156 static void
157 eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
158 {
159 #ifdef BUILD_PTHREAD
160    if (cpunum > 1)
161      evas_common_pipe_line_draw(surface, context, x1, y1, x2, y2);
162    else
163 #endif   
164      {
165         evas_common_line_draw(surface, context, x1, y1, x2, y2);
166         evas_common_cpu_end_opt();
167      }
168 }
169
170 static void *
171 eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
172 {
173    return evas_common_polygon_point_add(polygon, x, y);
174 }
175
176 static void *
177 eng_polygon_points_clear(void *data, void *context, void *polygon)
178 {
179    return evas_common_polygon_points_clear(polygon);
180 }
181
182 static void
183 eng_polygon_draw(void *data, void *context, void *surface, void *polygon)
184 {
185 #ifdef BUILD_PTHREAD
186    if (cpunum > 1)
187      evas_common_pipe_poly_draw(surface, context, polygon);
188    else
189 #endif
190      {
191         evas_common_polygon_draw(surface, context, polygon);
192         evas_common_cpu_end_opt();
193      }
194 }
195
196 static void *
197 eng_gradient_new(void *data)
198 {
199    return evas_common_gradient_new();
200 }
201
202 static void
203 eng_gradient_free(void *data, void *gradient)
204 {
205    evas_common_gradient_free(gradient);
206 }
207
208 static void
209 eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
210 {
211    evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
212 }
213
214 static void
215 eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
216 {
217    evas_common_gradient_alpha_stop_add(gradient, a, delta);
218 }
219
220 static void
221 eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
222 {
223    evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
224 }
225
226 static void
227 eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
228 {
229    evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
230 }
231
232 static void
233 eng_gradient_clear(void *data, void *gradient)
234 {
235    evas_common_gradient_clear(gradient);
236 }
237
238 static void
239 eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
240 {
241    evas_common_gradient_fill_set(gradient, x, y, w, h);
242 }
243
244 static void
245 eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
246 {
247    evas_common_gradient_fill_angle_set(gradient, angle);
248 }
249
250 static void
251 eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
252 {
253    evas_common_gradient_fill_spread_set(gradient, spread);
254 }
255
256 static void
257 eng_gradient_angle_set(void *data, void *gradient, double angle)
258 {
259    evas_common_gradient_map_angle_set(gradient, angle);
260 }
261
262 static void
263 eng_gradient_offset_set(void *data, void *gradient, float offset)
264 {
265    evas_common_gradient_map_offset_set(gradient, offset);
266 }
267
268 static void
269 eng_gradient_direction_set(void *data, void *gradient, int direction)
270 {
271    evas_common_gradient_map_direction_set(gradient, direction);
272 }
273
274 static void
275 eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
276 {
277    evas_common_gradient_type_set(gradient, name, params);
278 }
279
280 static int
281 eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
282 {
283    RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
284    RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
285
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));
289 }
290
291 static int
292 eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
293 {
294    RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
295
296    if (!dc || !gradient)  return 0;
297    return 1;
298 }
299
300 static void
301 eng_gradient_render_pre(void *data, void *context, void *gradient)
302 {
303    RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
304    RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
305    int  len;
306
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);
311 }
312
313 static void
314 eng_gradient_render_post(void *data, void *gradient)
315 {
316 }
317
318 static void
319 eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int x, int y, int w, int h)
320 {
321 #ifdef BUILD_PTHREAD
322    if (cpunum > 1)
323      evas_common_pipe_grad_draw(surface, context, x, y, w, h, gradient);
324    else
325 #endif   
326      {
327         evas_common_gradient_draw(surface, context, x, y, w, h, gradient);
328         evas_common_cpu_end_opt();
329      }
330 }
331
332 static int
333 eng_image_alpha_get(void *data, void *image)
334 {
335    Image_Entry *im;
336
337    if (!image) return 1;
338    im = image;
339    switch (im->space)
340      {
341       case EVAS_COLORSPACE_ARGB8888:
342         if (im->flags.alpha) return 1;
343       default:
344         break;
345      }
346    return 0;
347 }
348
349 static int
350 eng_image_colorspace_get(void *data, void *image)
351 {
352    Image_Entry *im;
353
354    if (!image) return EVAS_COLORSPACE_ARGB8888;
355    im = image;
356    return im->space;
357 }
358
359 static void *
360 eng_image_alpha_set(void *data, void *image, int has_alpha)
361 {
362    RGBA_Image *im;
363
364    if (!image) return NULL;
365    im = image;
366    if (im->cache_entry.space != EVAS_COLORSPACE_ARGB8888)
367      {
368         im->cache_entry.flags.alpha = 0;
369         return im;
370      }
371    im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
372    evas_common_image_colorspace_dirty(im);
373
374    im->cache_entry.flags.alpha = has_alpha ? 1 : 0;
375    return im;
376 }
377
378 static void *
379 eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
380 {
381    RGBA_Image *im;
382
383    im = image;
384    return im;
385 }
386
387 static void
388 eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
389 {
390    RGBA_Image *im;
391
392    im = image;
393 }
394
395 static char *
396 eng_image_comment_get(void *data, void *image, char *key)
397 {
398    RGBA_Image *im;
399
400    if (!image) return NULL;
401    im = image;
402    return im->info.comment;
403 }
404
405 static char *
406 eng_image_format_get(void *data, void *image)
407 {
408    return NULL;
409 }
410
411 static void
412 eng_image_colorspace_set(void *data, void *image, int cspace)
413 {
414    Image_Entry *im;
415
416    if (!image) return;
417    im = image;
418    evas_cache_image_colorspace(im, cspace);
419 }
420
421 static void
422 eng_image_native_set(void *data, void *image, void *native)
423 {
424 }
425
426 static void *
427 eng_image_native_get(void *data, void *image)
428 {
429    return NULL;
430 }
431
432 static void *
433 eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
434 {
435    *error = 0;
436    return evas_common_load_image_from_file(file, key, lo);
437 }
438
439 static void *
440 eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
441 {
442    return evas_cache_image_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
443 }
444
445 static void *
446 eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
447 {
448    return evas_cache_image_copied_data(evas_common_image_cache_get(), w, h, image_data, alpha, cspace);
449 }
450
451 static void
452 eng_image_free(void *data, void *image)
453 {
454    evas_cache_image_drop(image);
455 }
456
457 static void
458 eng_image_size_get(void *data, void *image, int *w, int *h)
459 {
460    Image_Entry *im;
461
462    im = image;
463    if (w) *w = im->w;
464    if (h) *h = im->h;
465 }
466
467 static void *
468 eng_image_size_set(void *data, void *image, int w, int h)
469 {
470    Image_Entry *im;
471
472    im = image;
473    return evas_cache_image_size_set(image, w, h);
474 }
475
476 static void *
477 eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
478 {
479    Image_Entry *im = image;
480
481    if (!image) return NULL;
482    return evas_cache_image_dirty(im, x, y, w, h);
483 }
484
485 static void *
486 eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
487 {
488    RGBA_Image *im;
489
490    if (!image)
491      {
492         *image_data = NULL;
493         return NULL;
494      }
495    im = image;
496    evas_cache_image_load_data(&im->cache_entry);
497    switch (im->cache_entry.space)
498      {
499       case EVAS_COLORSPACE_ARGB8888:
500         if (to_write)
501           im = (RGBA_Image *) evas_cache_image_alone(&im->cache_entry);
502         *image_data = im->image.data;
503         break;
504       case EVAS_COLORSPACE_YCBCR422P601_PL:
505       case EVAS_COLORSPACE_YCBCR422P709_PL:
506         *image_data = im->cs.data;
507         break;
508       default:
509         abort();
510         break;
511      }
512    return im;
513 }
514
515 static void *
516 eng_image_data_put(void *data, void *image, DATA32 *image_data)
517 {
518    RGBA_Image *im, *im2;
519
520    if (!image) return NULL;
521    im = image;
522    switch (im->cache_entry.space)
523      {
524       case EVAS_COLORSPACE_ARGB8888:
525         if (image_data != im->image.data)
526           {
527              int w, h;
528
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);
535              im = im2;
536           }
537         break;
538       case EVAS_COLORSPACE_YCBCR422P601_PL:
539       case EVAS_COLORSPACE_YCBCR422P709_PL:
540         if (image_data != im->cs.data)
541           {
542              if (im->cs.data)
543                {
544                   if (!im->cs.no_free) free(im->cs.data);
545                }
546              im->cs.data = image_data;
547              evas_common_image_colorspace_dirty(im);
548           }
549         break;
550       default:
551         abort();
552         break;
553      }
554    return im;
555 }
556
557 static void
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)
559 {
560    RGBA_Image *im;
561
562    if (!image) return;
563    im = image;
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);
567 #ifdef BUILD_PTHREAD
568    if (cpunum > 1)
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);
572    else
573 #endif
574      {
575         if (smooth)
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);
579         else
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();
584      }
585 }
586
587 static void
588 eng_image_cache_flush(void *data)
589 {
590    int tmp_size;
591
592    tmp_size = evas_common_image_get_cache();
593    evas_common_image_set_cache(0);
594    evas_common_image_set_cache(tmp_size);
595 }
596
597 static void
598 eng_image_cache_set(void *data, int bytes)
599 {
600    evas_common_image_set_cache(bytes);
601 }
602
603 static int
604 eng_image_cache_get(void *data)
605 {
606    return evas_common_image_get_cache();
607 }
608
609 static void *
610 eng_font_load(void *data, const char *name, int size)
611 {
612    return evas_common_font_load(name, size);
613 }
614
615 static void *
616 eng_font_memory_load(void *data, char *name, int size, const void *fdata, int fdata_size)
617 {
618    return evas_common_font_memory_load(name, size, fdata, fdata_size);
619 }
620
621 static void *
622 eng_font_add(void *data, void *font, const char *name, int size)
623 {
624    return evas_common_font_add(font, name, size);
625 }
626
627 static void *
628 eng_font_memory_add(void *data, void *font, char *name, int size, const void *fdata, int fdata_size)
629 {
630    return evas_common_font_memory_add(font, name, size, fdata, fdata_size);
631 }
632
633 static void
634 eng_font_free(void *data, void *font)
635 {
636    evas_common_font_free(font);
637 }
638
639 static int
640 eng_font_ascent_get(void *data, void *font)
641 {
642    return evas_common_font_ascent_get(font);
643 }
644
645 static int
646 eng_font_descent_get(void *data, void *font)
647 {
648    return evas_common_font_descent_get(font);
649 }
650
651 static int
652 eng_font_max_ascent_get(void *data, void *font)
653 {
654    return evas_common_font_max_ascent_get(font);
655 }
656
657 static int
658 eng_font_max_descent_get(void *data, void *font)
659 {
660    return evas_common_font_max_descent_get(font);
661 }
662
663 static void
664 eng_font_string_size_get(void *data, void *font, const char *text, int *w, int *h)
665 {
666    evas_common_font_query_size(font, text, w, h);
667 }
668
669 static int
670 eng_font_inset_get(void *data, void *font, const char *text)
671 {
672    return evas_common_font_query_inset(font, text);
673 }
674
675 static int
676 eng_font_h_advance_get(void *data, void *font, const char *text)
677 {
678    int h, v;
679
680    evas_common_font_query_advance(font, text, &h, &v);
681    return h;
682 }
683
684 static int
685 eng_font_v_advance_get(void *data, void *font, const char *text)
686 {
687    int h, v;
688
689    evas_common_font_query_advance(font, text, &h, &v);
690    return v;
691 }
692
693 static int
694 eng_font_char_coords_get(void *data, void *font, const char *text, int pos, int *cx, int *cy, int *cw, int *ch)
695 {
696    return evas_common_font_query_char_coords(font, text, pos, cx, cy, cw, ch);
697 }
698
699 static int
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)
701 {
702    return evas_common_font_query_text_at_pos(font, text, x, y, cx, cy, cw, ch);
703 }
704
705 static void
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)
707 {
708 #ifdef BUILD_PTHREAD
709    if (cpunum > 1)
710      evas_common_pipe_text_draw(surface, context, font, x, y, text);
711    else
712 #endif   
713      {
714         evas_common_font_draw(surface, context, font, x, y, text);
715         evas_common_cpu_end_opt();
716      }
717 }
718
719 static void
720 eng_font_cache_flush(void *data)
721 {
722    evas_common_font_flush();
723 }
724
725 static void
726 eng_font_cache_set(void *data, int bytes)
727 {
728    evas_common_font_cache_set(bytes);
729 }
730
731 static int
732 eng_font_cache_get(void *data)
733 {
734    return evas_common_font_cache_get();
735 }
736
737 static void
738 eng_font_hinting_set(void *data, void *font, int hinting)
739 {
740    evas_common_font_hinting_set(font, hinting);
741 }
742
743 static int
744 eng_font_hinting_can_hint(void *data, int hinting)
745 {
746    return evas_common_hinting_available(hinting);
747 }
748
749
750 /*
751  *****
752  **
753  ** ENGINE API
754  **
755  *****
756  */
757
758 static Evas_Func func =
759 {
760    NULL,
761      NULL,
762      NULL,
763      NULL,
764      NULL,
765      NULL,
766      NULL,
767      NULL,
768      NULL,
769      NULL,
770      NULL,
771      NULL,
772      NULL,
773      /* draw context virtual methods */
774      eng_context_new,
775      eng_context_free,
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 */
794      eng_rectangle_draw,
795      /* line draw funcs */
796      eng_line_draw,
797      /* polygon draw funcs */
798      eng_polygon_point_add,
799      eng_polygon_points_clear,
800      eng_polygon_draw,
801      /* gradient draw funcs */
802      eng_gradient_new,
803      eng_gradient_free,
804      eng_gradient_color_stop_add,
805      eng_gradient_alpha_stop_add,
806      eng_gradient_color_data_set,
807      eng_gradient_alpha_data_set,
808      eng_gradient_clear,
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,
820      eng_gradient_draw,
821      /* image draw funcs */
822      eng_image_load,
823      eng_image_new_from_data,
824      eng_image_new_from_copied_data,
825      eng_image_free,
826      eng_image_size_get,
827      eng_image_size_set,
828      NULL,
829      eng_image_dirty_region,
830      eng_image_data_get,
831      eng_image_data_put,
832      eng_image_alpha_set,
833      eng_image_alpha_get,
834      eng_image_border_set,
835      eng_image_border_get,
836      eng_image_draw,
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,
845      eng_image_cache_set,
846      eng_image_cache_get,
847      /* font draw functions */
848      eng_font_load,
849      eng_font_memory_load,
850      eng_font_add,
851      eng_font_memory_add,
852      eng_font_free,
853      eng_font_ascent_get,
854      eng_font_descent_get,
855      eng_font_max_ascent_get,
856      eng_font_max_descent_get,
857      eng_font_string_size_get,
858      eng_font_inset_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,
863      eng_font_draw,
864      /* font cache functions */
865      eng_font_cache_flush,
866      eng_font_cache_set,
867      eng_font_cache_get,
868      /* font hinting functions */
869      eng_font_hinting_set,
870      eng_font_hinting_can_hint
871      /* FUTURE software generic calls go here */
872 };
873
874 /*
875  *****
876  **
877  ** MODULE ACCESSIBLE API API
878  **
879  *****
880  */
881
882 EAPI int
883 module_open(Evas_Module *em)
884 {
885    if (!em) return 0;
886    em->functions = (void *)(&func);
887    cpunum = evas_common_cpu_count();
888    return 1;
889 }
890
891 EAPI void
892 module_close(void)
893 {
894 }
895
896 EAPI Evas_Module_Api evas_modapi = 
897 {
898    EVAS_MODULE_API_VERSION, 
899      EVAS_MODULE_TYPE_ENGINE,
900      "software_generic",
901      "none"
902 };