Make evas quit barfing on gles11 and gles20
[profile/ivi/evas.git] / src / lib / include / evas_common.h
1 #ifndef EVAS_COMMON_H
2 #define EVAS_COMMON_H
3
4 //#ifdef HAVE_CONFIG_H
5 #include "config.h"  /* so that EAPI in Evas.h is correctly defined */
6 //#endif
7
8 #ifdef STDC_HEADERS
9 # include <stdlib.h>
10 # include <stddef.h>
11 #else
12 # ifdef HAVE_STDLIB_H
13 #  include <stdlib.h>
14 # endif
15 #endif
16 #ifdef HAVE_ALLOCA_H
17 # include <alloca.h>
18 #elif !defined alloca
19 # ifdef __GNUC__
20 #  define alloca __builtin_alloca
21 # elif defined _AIX
22 #  define alloca __alloca
23 # elif defined _MSC_VER
24 #  include <malloc.h>
25 #  define alloca _alloca
26 # elif !defined HAVE_ALLOCA
27 #  ifdef  __cplusplus
28 extern "C"
29 #  endif
30 void *alloca (size_t);
31 # endif
32 #endif
33
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <string.h>
37 #include <sys/types.h>
38 #include <sys/stat.h>
39 #include <time.h>
40 #include <ctype.h>
41
42 #ifndef _MSC_VER
43 # include <stdint.h>
44 #include <unistd.h>
45 #endif
46
47 #ifdef HAVE_EVIL
48 # include <Evil.h>
49 #endif
50
51 #ifdef HAVE_ESCAPE
52 # include <Escape.h>
53 #endif
54
55 #ifdef HAVE_PIXMAN
56 #include <pixman.h>
57 #endif
58
59 #include <sys/types.h>
60 #include <sys/stat.h>
61 #include <unistd.h>
62
63 #ifdef HAVE_EXOTIC
64 # include <Exotic.h>
65 #endif
66
67 #include <Eina.h>
68 #include "Evas.h"
69 //#include "Evas_GL.h"
70
71 #ifndef HAVE_LROUND
72 /* right now i dont care about rendering bugs on platforms without lround
73  (e.g. windows/vc++... yay!)
74  FIXME: http://cgit.freedesktop.org/cairo/tree/src/cairo-misc.c#n487
75 */
76 #define lround(x) (((x) < 0) ? (long int)ceil((x) - 0.5) : (long int)floor((x) + 0.5))
77 #endif
78
79 /* macros needed to log message through eina_log */
80 extern EAPI int _evas_log_dom_global;
81 #ifdef  _EVAS_DEFAULT_LOG_DOM
82 # undef _EVAS_DEFAULT_LOG_DOM
83 #endif
84 #define _EVAS_DEFAULT_LOG_DOM _evas_log_dom_global
85
86 #ifdef EVAS_DEFAULT_LOG_COLOR
87 # undef EVAS_DEFAULT_LOG_COLOR
88 #endif
89 #define EVAS_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
90
91 #ifdef ERR
92 # undef ERR
93 #endif
94 #define ERR(...) EINA_LOG_DOM_ERR(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
95
96 #ifdef DBG
97 # undef DBG
98 #endif
99 #define DBG(...) EINA_LOG_DOM_DBG(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
100
101 #ifdef INF
102 # undef INF
103 #endif
104 #define INF(...) EINA_LOG_DOM_INFO(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
105
106 #ifdef WRN
107 # undef WRN
108 #endif
109 #define WRN(...) EINA_LOG_DOM_WARN(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
110
111 #ifdef CRIT
112 # undef CRIT
113 #endif
114 #define CRIT(...) EINA_LOG_DOM_CRIT(_EVAS_DEFAULT_LOG_DOM, __VA_ARGS__)
115
116 #include "evas_options.h"
117
118 #if defined(__ARM_ARCH_3M__)
119 # define __ARM_ARCH__ 40
120 #endif
121 #if defined(__ARM_ARCH_4__)
122 # define __ARM_ARCH__ 40
123 #endif
124 #if defined(__ARM_ARCH_4T__)
125 # define __ARM_ARCH__ 41
126 #endif
127
128 #if defined(__ARM_ARCH_5__)
129 # define __ARM_ARCH__ 50
130 #endif
131 #if defined(__ARM_ARCH_5T__)
132 # define __ARM_ARCH__ 51
133 #endif
134 #if defined(__ARM_ARCH_5E__)
135 # define __ARM_ARCH__ 52
136 #endif
137 #if defined(__ARM_ARCH_5TE__)
138 # define __ARM_ARCH__ 53
139 #endif
140 #if defined(__ARM_ARCH_5TEJ__)
141 # define __ARM_ARCH__ 54
142 #endif
143
144 #if defined(__ARM_ARCH_6__)
145 # define __ARM_ARCH__ 60
146 #endif
147 #if defined(__ARM_ARCH_6J__)
148 # define __ARM_ARCH__ 61
149 #endif
150 #if defined(__ARM_ARCH_6K__)
151 # define __ARM_ARCH__ 62
152 #endif
153 #if defined(__ARM_ARCH_6Z__)
154 # define __ARM_ARCH__ 63
155 #endif
156 #if defined(__ARM_ARCH_6ZK__)
157 # define __ARM_ARCH__ 64
158 #endif
159 #if defined(__ARM_ARCH_6T2__)
160 # define __ARM_ARCH__ 65
161 #endif
162
163 #if defined(__ARM_ARCH_7__)
164 # define __ARM_ARCH__ 70
165 #endif
166 #if defined(__ARM_ARCH_7A__)
167 # define __ARM_ARCH__ 71
168 #endif
169 #if defined(__ARM_ARCH_7R__)
170 # define __ARM_ARCH__ 72
171 #endif
172 #if defined(__ARM_ARCH_7M__)
173 # define __ARM_ARCH__ 73
174 #endif
175
176 #ifndef BUILD_PTHREAD
177 # undef BUILD_PIPE_RENDER
178 #endif
179
180 #if defined(BUILD_ASYNC_PRELOAD) && !defined(BUILD_PTHREAD)
181 # define BUILD_PTHREAD
182 #endif
183
184 #define LK(x)  Eina_Lock x
185 #define LKI(x) eina_lock_new(&(x))
186 #define LKD(x) eina_lock_free(&(x))
187 #define LKL(x) eina_lock_take(&(x))
188 #define LKT(x) eina_lock_take_try(&(x))
189 #define LKU(x) eina_lock_release(&(x))
190 #define LKDBG(x) eina_lock_debug(&(x))
191
192 /* for rwlocks */
193 #define RWLK(x) Eina_RWLock x
194 #define RWLKI(x) eina_rwlock_new(&(x))
195 #define RWLKD(x) eina_rwlock_free(&(x))
196 #define RDLKL(x) eina_rwlock_take_read(&(x))
197 #define WRLKL(x) eina_rwlock_take_write(&(x))
198 #define RWLKU(x) eina_rwlock_release(&(x))
199
200 #ifdef BUILD_PTHREAD
201
202 # define TH(x)  pthread_t x
203 # define THI(x) int x
204 # define TH_MAX 8
205
206 #else
207 # define TH(x)
208 # define THI(x)
209 # define TH_MAX 0
210
211 #endif
212
213 #include <ft2build.h>
214 #include FT_FREETYPE_H
215 #include FT_GLYPH_H
216 #include FT_SIZES_H
217 #include FT_MODULE_H
218
219 #ifdef __GNUC__
220 # if __GNUC__ >= 4
221 // BROKEN in gcc 4 on amd64
222 //#  pragma GCC visibility push(hidden)
223 # endif
224 #define LIKELY(x)   __builtin_expect(!!(x), 1)
225 #define UNLIKELY(x) __builtin_expect(!!(x), 0)
226 #else
227 #define LIKELY(x)   (x)
228 #define UNLIKELY(x) (x)
229 #endif
230
231 /*****************************************************************************/
232
233 /* use exact rects for updates not tiles */
234 /* #define RECTUPDATE */
235 #define TILESIZE 8
236 #define IMG_MAX_SIZE 65000
237
238 #define IMG_TOO_BIG(w, h) \
239    ((((unsigned long long)w) * ((unsigned long long)h)) >= \
240        ((1ULL << (29 * (sizeof(void *) / 4))) - 2048))
241
242 #ifdef BUILD_SMALL_DITHER_MASK
243 # define DM_TABLE     _evas_dither_44
244 # define DM_SIZE      4
245 # define DM_BITS      4
246 # define DM_DIV       16
247 # define USE_DITHER_44 1
248 #else
249 # define DM_TABLE     _evas_dither_128128
250 # define DM_SIZE      128
251 # define DM_BITS      6
252 # define DM_DIV       64
253 # define USE_DITHER_128128 1
254 #endif
255
256 #define DM_MSK       (DM_SIZE - 1)
257 #define DM_SHF(_b)   (DM_BITS - (8 - _b))
258 /* Supports negative right shifts */
259 #define DM_SHR(x, _b)   ((DM_SHF(_b) >= 0) ? \
260       ((x) >> DM_SHF(_b)) : ((x) << -DM_SHF(_b)))
261
262 /* if more than 1/ALPHA_SPARSE_INV_FRACTION is "alpha" (1-254) then sparse
263  * alpha flag gets set */
264 #define ALPHA_SPARSE_INV_FRACTION 3
265
266 /*****************************************************************************/
267
268 #if defined(__ARM_ARCH_3M__)
269 # define __ARM_ARCH__ 40
270 #endif
271 #if defined(__ARM_ARCH_4__)
272 # define __ARM_ARCH__ 40
273 #endif
274 #if defined(__ARM_ARCH_4T__)
275 # define __ARM_ARCH__ 41
276 #endif
277
278 #if defined(__ARM_ARCH_5__)
279 # define __ARM_ARCH__ 50
280 #endif
281 #if defined(__ARM_ARCH_5T__)
282 # define __ARM_ARCH__ 51
283 #endif
284 #if defined(__ARM_ARCH_5E__)
285 # define __ARM_ARCH__ 52
286 #endif
287 #if defined(__ARM_ARCH_5TE__)
288 # define __ARM_ARCH__ 53
289 #endif
290 #if defined(__ARM_ARCH_5TEJ__)
291 # define __ARM_ARCH__ 54
292 #endif
293
294 #if defined(__ARM_ARCH_6__)
295 # define __ARM_ARCH__ 60
296 #endif
297 #if defined(__ARM_ARCH_6J__)
298 # define __ARM_ARCH__ 61
299 #endif
300 #if defined(__ARM_ARCH_6K__)
301 # define __ARM_ARCH__ 62
302 #endif
303 #if defined(__ARM_ARCH_6Z__)
304 # define __ARM_ARCH__ 63
305 #endif
306 #if defined(__ARM_ARCH_6ZK__)
307 # define __ARM_ARCH__ 64
308 #endif
309 #if defined(__ARM_ARCH_6T2__)
310 # define __ARM_ARCH__ 65
311 #endif
312
313 #if defined(__ARM_ARCH_7__)
314 # define __ARM_ARCH__ 70
315 #endif
316 #if defined(__ARM_ARCH_7A__)
317 # define __ARM_ARCH__ 71
318 #endif
319 #if defined(__ARM_ARCH_7R__)
320 # define __ARM_ARCH__ 72
321 #endif
322 #if defined(__ARM_ARCH_7M__)
323 # define __ARM_ARCH__ 73
324 #endif
325
326 #if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 52)
327 /* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */
328 #define pld(addr, off)                                                  \
329    __asm__("pld [%[address], %[offset]]"::                              \
330            [address] "r" (addr), [offset] "i" (off))
331 #else
332 #define pld(addr, off)
333 #endif /* __ARMEL__ */
334
335 // these here are in config.h - just here for documentation
336 //#ifdef __ARM_ARCH__
337 // *IF* you enable pixman, this determines which things pixman will do
338 ////#define PIXMAN_FONT               1
339 ////#define PIXMAN_RECT               1
340 ////#define PIXMAN_LINE               1
341 ////#define PIXMAN_POLY               1
342 //#define PIXMAN_IMAGE              1
343 //#define PIXMAN_IMAGE_SCALE_SAMPLE 1
344 //#endif
345 // not related to pixman but an alternate rotate code
346 //#define TILE_ROTATE               1
347
348 #define TILE_CACHE_LINE_SIZE      64
349
350 /*****************************************************************************/
351
352 #define UNROLL2(op...) op op
353 #define UNROLL4(op...) UNROLL2(op) UNROLL2(op)
354 #define UNROLL8(op...) UNROLL4(op) UNROLL4(op)
355 #define UNROLL16(op...) UNROLL8(op) UNROLL8(op)
356
357 #define UNROLL8_PLD_WHILE(start, size, end, op)         \
358     pld(start, 0);                                      \
359     end = start + (size & ~7);                          \
360     while (start < end)                                 \
361         {                                               \
362             pld(start, 32);                             \
363             UNROLL8(op);                                \
364         }                                               \
365     end += (size & 7);                                  \
366     pld(start, 32);                                     \
367     while (start <  end)                                \
368         {                                               \
369         op;                                             \
370         }
371
372 /*****************************************************************************/
373
374 typedef unsigned long long              DATA64;
375 typedef unsigned int                    DATA32;
376 typedef unsigned short                  DATA16;
377 typedef unsigned char                   DATA8;
378
379 typedef struct _Image_Entry             Image_Entry;
380 typedef struct _Image_Entry_Flags       Image_Entry_Flags;
381 typedef struct _Image_Entry_Frame       Image_Entry_Frame;
382 typedef struct _Image_Timestamp         Image_Timestamp;
383 typedef struct _Engine_Image_Entry      Engine_Image_Entry;
384 typedef struct _Evas_Cache_Target       Evas_Cache_Target;
385 typedef struct _Evas_Preload_Pthread    Evas_Preload_Pthread;
386
387 typedef struct _RGBA_Image_Loadopts   RGBA_Image_Loadopts;
388 #ifdef BUILD_PIPE_RENDER
389 typedef struct _RGBA_Pipe_Op          RGBA_Pipe_Op;
390 typedef struct _RGBA_Pipe             RGBA_Pipe;
391 typedef struct _RGBA_Pipe_Thread_Info RGBA_Pipe_Thread_Info;
392 #endif
393 typedef struct _RGBA_Image            RGBA_Image;
394 typedef struct _RGBA_Image_Span       RGBA_Image_Span;
395 typedef struct _RGBA_Draw_Context     RGBA_Draw_Context;
396 typedef struct _RGBA_Polygon_Point    RGBA_Polygon_Point;
397 typedef struct _RGBA_Map_Point        RGBA_Map_Point;
398 typedef struct _RGBA_Map              RGBA_Map;
399 typedef struct _RGBA_Font             RGBA_Font;
400 typedef struct _RGBA_Font_Int         RGBA_Font_Int;
401 typedef struct _RGBA_Font_Source      RGBA_Font_Source;
402 typedef struct _RGBA_Font_Glyph       RGBA_Font_Glyph;
403 typedef struct _RGBA_Font_Glyph_Out   RGBA_Font_Glyph_Out;
404 typedef struct _RGBA_Gfx_Compositor   RGBA_Gfx_Compositor;
405
406 typedef struct _Cutout_Rect           Cutout_Rect;
407 typedef struct _Cutout_Rects            Cutout_Rects;
408
409 typedef struct _Convert_Pal             Convert_Pal;
410
411 typedef struct _Tilebuf                 Tilebuf;
412 typedef struct _Tilebuf_Tile            Tilebuf_Tile;
413 typedef struct _Tilebuf_Rect            Tilebuf_Rect;
414
415 typedef struct _Evas_Common_Transform        Evas_Common_Transform;
416
417 // RGBA_Map_Point
418 // all coords are 20.12
419 // fp type - an int for now
420 typedef int FPc;
421 // fp # of bits of float accuracy
422 #define FP 8
423 // fp half (half of an fp unit)
424 #define FPH (1 << (FP - 1))
425 // one fp unit
426 #define FP1 (1 << (FP))
427
428 /*
429 typedef struct _Regionbuf             Regionbuf;
430 typedef struct _Regionspan            Regionspan;
431 */
432
433 typedef void (*RGBA_Gfx_Func)    (DATA32 *src, DATA8 *mask, DATA32 col, DATA32 *dst, int len);
434 typedef void (*RGBA_Gfx_Pt_Func) (DATA32 src, DATA8 mask, DATA32 col, DATA32 *dst);
435 typedef void (*Gfx_Func_Copy)    (DATA32 *src, DATA32 *dst, int len);
436
437 typedef void (*Gfx_Func_Convert) (DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x, int dith_y, DATA8 *pal);
438
439 #include "../cache/evas_cache.h"
440 #ifdef EVAS_CSERVE2
441 #include "../cache2/evas_cache2.h"
442 #endif
443
444 /*****************************************************************************/
445
446 typedef enum _RGBA_Image_Flags
447 {
448    RGBA_IMAGE_NOTHING       = (0),
449 /*    RGBA_IMAGE_HAS_ALPHA     = (1 << 0), */
450    RGBA_IMAGE_IS_DIRTY      = (1 << 1),
451    RGBA_IMAGE_INDEXED       = (1 << 2),
452    RGBA_IMAGE_ALPHA_ONLY    = (1 << 3),
453    RGBA_IMAGE_ALPHA_TILES   = (1 << 4),
454 /*    RGBA_IMAGE_ALPHA_SPARSE  = (1 << 5), */
455 /*    RGBA_IMAGE_LOADED        = (1 << 6), */
456 /*    RGBA_IMAGE_NEED_DATA     = (1 << 7) */
457    RGBA_IMAGE_TODO_LOAD     = (1 << 8),
458 } RGBA_Image_Flags;
459
460 typedef enum _Convert_Pal_Mode
461 {
462    PAL_MODE_NONE,
463    PAL_MODE_MONO,
464    PAL_MODE_GRAY4,
465    PAL_MODE_GRAY16,
466    PAL_MODE_GRAY64,
467    PAL_MODE_GRAY256,
468    PAL_MODE_RGB111,
469    PAL_MODE_RGB121,
470    PAL_MODE_RGB221,
471    PAL_MODE_RGB222,
472    PAL_MODE_RGB232,
473    PAL_MODE_RGB332,
474    PAL_MODE_RGB666,
475    PAL_MODE_LAST
476 } Convert_Pal_Mode;
477
478 typedef enum _CPU_Features
479 {
480    CPU_FEATURE_C       = 0,
481    CPU_FEATURE_MMX     = (1 << 0),
482    CPU_FEATURE_MMX2    = (1 << 1),
483    CPU_FEATURE_SSE     = (1 << 2),
484    CPU_FEATURE_ALTIVEC = (1 << 3),
485    CPU_FEATURE_VIS     = (1 << 4),
486    CPU_FEATURE_VIS2    = (1 << 5),
487    CPU_FEATURE_NEON    = (1 << 6),
488    CPU_FEATURE_SSE3    = (1 << 7)
489 } CPU_Features;
490
491 typedef enum _Font_Hint_Flags
492 {
493    FONT_NO_HINT,
494    FONT_AUTO_HINT,
495    FONT_BYTECODE_HINT
496 } Font_Hint_Flags;
497
498 typedef enum _Font_Rend_Flags
499 {
500    FONT_REND_REGULAR   = 0,
501    FONT_REND_SLANT     = (1 << 0),
502    FONT_REND_WEIGHT    = (1 << 1),
503 } Font_Rend_Flags;
504
505 /*****************************************************************************/
506
507 #if 0 // filtering disabled
508 typedef struct _Filtered_Image Filtered_Image;
509 #endif
510
511 struct _RGBA_Image_Loadopts
512 {
513    int                  scale_down_by; // if > 1 then use this
514    double               dpi; // if > 0.0 use this
515    unsigned int         w, h; // if > 0 use this
516    unsigned int         degree;//if>0 there is some info related with rotation
517    struct {
518       unsigned int      x, y, w, h;
519    } region;
520
521    Eina_Bool            orientation; // if EINA_TRUE => should honor orientation information provided by file (like jpeg exif info)
522 };
523
524 struct _Image_Entry_Flags
525 {
526    Eina_Bool loaded       : 1;
527    Eina_Bool in_progress  : 1;
528    Eina_Bool dirty        : 1;
529    Eina_Bool activ        : 1;
530
531    Eina_Bool need_data    : 1;
532    Eina_Bool lru_nodata   : 1;
533    Eina_Bool cached       : 1;
534    Eina_Bool alpha        : 1;
535
536    Eina_Bool lru          : 1;
537    Eina_Bool alpha_sparse : 1;
538 #ifdef BUILD_ASYNC_PRELOAD
539    Eina_Bool preload_done : 1;
540    Eina_Bool delete_me    : 1;
541    Eina_Bool pending      : 1;
542 #endif
543    Eina_Bool animated     : 1;
544    Eina_Bool rotated      : 1;
545 };
546
547 struct _Image_Entry_Frame
548 {
549    int       index;
550    DATA32   *data;     /* frame decoding data */
551    void     *info;     /* special image type info */
552    Eina_Bool loaded       : 1;
553 };
554
555 struct _Evas_Cache_Target
556 {
557   EINA_INLIST;
558   const void *target;
559   void *data;
560 };
561
562 struct _Image_Timestamp
563 {
564    time_t mtime;
565    off_t  size;
566    ino_t  ino;
567 #ifdef _STAT_VER_LINUX
568    unsigned long int mtime_nsec;
569 #endif
570 };
571
572 struct _Image_Entry
573 {
574    EINA_INLIST;
575
576    Evas_Cache_Image      *cache;
577 #ifdef EVAS_CSERVE2
578    Evas_Cache2           *cache2;
579 #endif
580
581    const char            *cache_key;
582
583    const char            *file;
584    const char            *key;
585
586    Evas_Cache_Target     *targets;
587    Evas_Preload_Pthread  *preload;
588
589    Image_Timestamp        tstamp;
590
591    int                    references;
592
593 #ifdef BUILD_PIPE_RENDER
594    RGBA_Pipe           *pipe;
595 #endif
596
597    unsigned char          scale;
598
599    RGBA_Image_Loadopts    load_opts;
600    int                    space;
601    unsigned int           w;
602    unsigned int           h;
603
604    struct
605      {
606         unsigned int w;
607         unsigned int h;
608      } allocated;
609
610    struct
611      {
612         void            *module;
613         void            *loader;
614      } info;
615
616 #ifdef BUILD_ASYNC_PRELOAD
617    LK(lock);
618    LK(lock_cancel);
619    Eina_Bool unload_cancel : 1;
620 #endif
621
622    Image_Entry_Flags      flags;
623    Evas_Image_Scale_Hint  scale_hint;
624    void                  *data1, *data2;
625 #ifdef EVAS_CSERVE2
626    unsigned int           open_rid, load_rid, preload_rid;
627 #endif
628    int                    server_id;
629    int                    connect_num;
630    int                    channel;
631    int                    load_error;
632
633    /* for animation feature */
634    int                    frame_count;
635    Evas_Image_Animated_Loop_Hint loop_hint;
636    int                    loop_count;
637    int                    cur_frame;
638    Eina_List             *frames;
639 };
640
641 struct _Engine_Image_Entry
642 {
643    EINA_INLIST;
644
645    /* Upper Engine data. */
646    Image_Entry                  *src;
647
648    /* Cache stuff. */
649    Evas_Cache_Engine_Image      *cache;
650    const char                   *cache_key;
651
652    struct
653    {
654      Eina_Bool                   cached : 1;
655      Eina_Bool                   activ : 1;
656      Eina_Bool                   dirty : 1;
657      Eina_Bool                   loaded : 1;
658      Eina_Bool                   need_parent : 1;
659    } flags;
660
661    int                           references;
662    int                           w;
663    int                           h;
664 };
665
666 struct _Cutout_Rect
667 {
668    int               x, y, w, h;
669 };
670
671 struct _Cutout_Rects
672 {
673    Cutout_Rect*      rects;
674    int               active;
675    int               max;
676 };
677
678 struct _Evas_Common_Transform
679 {
680    float  mxx, mxy, mxz;
681    float  myx, myy, myz;
682    float  mzx, mzy, mzz;
683 };
684
685 struct _RGBA_Draw_Context
686 {
687    struct {
688       Eina_Bool use : 1;
689       DATA32 col;
690    } mul;
691    struct {
692 #ifdef HAVE_PIXMAN
693    pixman_image_t  *pixman_color_image;
694 #endif
695       DATA32 col;
696    } col;
697    struct RGBA_Draw_Context_clip {
698       int    x, y, w, h;
699       Eina_Bool use : 1;
700    } clip;
701    struct {
702       int x, y, w, h;
703       RGBA_Image *mask;
704    } mask;
705    Cutout_Rects cutout;
706    struct {
707       struct {
708          void *(*gl_new)  (void *data, RGBA_Font_Glyph *fg);
709          void  (*gl_free) (void *ext_dat);
710          void  (*gl_draw) (void *data, void *dest, void *context, RGBA_Font_Glyph *fg, int x, int y);
711       } func;
712       void *data;
713    } font_ext;
714    struct {
715       int color_space;
716    } interpolation;
717    struct {
718       int y, h;
719    } sli;
720    int            render_op;
721    Eina_Bool anti_alias : 1;
722 };
723
724 #ifdef BUILD_PIPE_RENDER
725 #include "../engines/common/evas_map_image.h"
726 #include "../engines/common/evas_text_utils.h"
727
728 struct _RGBA_Pipe_Op
729 {
730    RGBA_Draw_Context         context;
731    Eina_Bool               (*prepare_func) (void *data, RGBA_Image *dst, RGBA_Pipe_Op *op);
732    void                    (*op_func) (RGBA_Image *dst, const RGBA_Pipe_Op *op, const RGBA_Pipe_Thread_Info *info);
733    void                    (*free_func) (RGBA_Pipe_Op *op);
734    Cutout_Rects             *rects;
735
736    union {
737       struct {
738          int                 x, y, w, h;
739       } rect;
740       struct {
741          int                 x0, y0, x1, y1;
742       } line;
743       struct {
744          int                 x, y;
745          RGBA_Polygon_Point *points;
746       } poly;
747       struct {
748          int                 x, y;
749          Evas_Text_Props    *intl_props;
750          RGBA_Gfx_Func       func;
751       } text;
752       struct {
753          RGBA_Image         *src;
754          int                 sx, sy, sw, sh, dx, dy, dw, dh;
755          int                 smooth;
756          char               *text;
757       } image;
758       struct {
759          RGBA_Image         *src;
760          RGBA_Map           *m;
761          int                 npoints;
762          int                 smooth;
763          int                 level;
764       } map;
765    } op;
766
767    Eina_Bool                 render : 1;
768 };
769
770 #define PIPE_LEN 256
771
772 struct _RGBA_Pipe
773 {
774    EINA_INLIST;
775    int               op_num;
776    RGBA_Pipe_Op      op[PIPE_LEN];
777 };
778
779 struct _RGBA_Pipe_Thread_Info
780 {
781    EINA_INLIST;
782    Eina_Rectangle area;
783 };
784 #endif
785
786 struct _RGBA_Image
787 {
788    Image_Entry          cache_entry;
789
790    RGBA_Image_Flags     flags;
791    struct
792      {
793 /*      void           *module; */
794 /*      void           *loader; */
795 /*      char           *real_file; */
796         char           *comment;
797 //      int             format;
798      } info;
799
800    void                *extended_info;
801    int                  ref;
802
803 /*    unsigned char        scale; */
804
805    /* Colorspace stuff. */
806    struct {
807       void              *data;
808       Eina_Bool          no_free : 1;
809       Eina_Bool          dirty : 1;
810    } cs;
811
812    /* RGBA stuff */
813    struct {
814       DATA32            *data;
815       Eina_Bool          no_free : 1;
816    } image;
817
818    struct {
819       DATA8             *mask;
820       Eina_Bool          dirty: 1;
821    } mask;
822
823 #if 0 // filtering disabled
824    Eina_List            *filtered;
825 #endif
826
827    struct {
828       LK(lock);
829       Eina_List *list;
830       unsigned long long orig_usage;
831       unsigned long long usage_count;
832       int populate_count;
833       unsigned long long newest_usage;
834       unsigned long long newest_usage_count;
835    } cache;
836
837 #ifdef HAVE_PIXMAN
838    struct {
839       pixman_image_t *im;
840    } pixman;
841 #endif
842 };
843
844 struct _RGBA_Polygon_Point
845 {
846    EINA_INLIST;
847    int               x, y;
848 };
849
850 struct _RGBA_Map_Point
851 {
852    FPc x, y; // x, y screenspace
853    float fx, fy, fz; // x, y, z in floats
854 //   FPc x3, y3; // x, y 3d space
855    FPc z; // z in world space. optional
856    FPc u, v; // u, v in tex coords
857    DATA32 col; // color at this point
858    // for perspective correctness - only point 0 has relevant info
859    FPc px, py, z0, foc;
860 };
861
862 struct _RGBA_Map
863 {
864    void *engine_data;
865
866    struct {
867       int w, h;
868    } image, uv;
869
870    int x, y;
871    int count;
872
873    RGBA_Map_Point pts[1];
874 };
875
876 #if 0 // filtering disabled
877 struct _Filtered_Image
878 {
879    void       *key;
880    size_t      keylen;
881    RGBA_Image *image;
882    int ref;
883 };
884 #endif
885
886 // for fonts...
887 /////
888 typedef struct _Fash_Item_Index_Map Fash_Item_Index_Map;
889 typedef struct _Fash_Int_Map        Fash_Int_Map;
890 typedef struct _Fash_Int_Map2       Fash_Int_Map2;
891 typedef struct _Fash_Int            Fash_Int;
892 struct _Fash_Item_Index_Map
893 {
894    RGBA_Font_Int *fint;
895    int            index;
896 };
897 struct _Fash_Int_Map
898 {
899   Fash_Item_Index_Map item[256];
900 };
901 struct _Fash_Int_Map2
902 {
903    Fash_Int_Map *bucket[256];
904 };
905 struct _Fash_Int
906 {
907    Fash_Int_Map2 *bucket[256];
908    void (*freeme) (Fash_Int *fash);
909 };
910
911 /////
912 typedef struct _Fash_Glyph_Map  Fash_Glyph_Map;
913 typedef struct _Fash_Glyph_Map2 Fash_Glyph_Map2;
914 typedef struct _Fash_Glyph      Fash_Glyph;
915 struct _Fash_Glyph_Map
916 {
917    RGBA_Font_Glyph *item[256];
918 };
919 struct _Fash_Glyph_Map2
920 {
921    Fash_Glyph_Map *bucket[256];
922 };
923 struct _Fash_Glyph
924 {
925    Fash_Glyph_Map2 *bucket[256];
926    void (*freeme) (Fash_Glyph *fash);
927 };
928 /////
929
930 struct _RGBA_Font
931 {
932    Eina_List       *fonts;
933    Fash_Int        *fash;
934    Font_Hint_Flags  hinting;
935    int              references;
936    LK(lock);
937    unsigned char    sizeok : 1;
938 };
939
940 #include "../engines/common/evas_font_ot.h"
941
942 struct _RGBA_Font_Int
943 {
944    EINA_INLIST;
945    RGBA_Font_Source *src;
946    Eina_Hash        *kerning;
947    Fash_Glyph       *fash;
948    unsigned int      size;
949    int               real_size;
950    int               max_h;
951    int               references;
952    int               usage;
953    struct {
954       FT_Size       size;
955 #ifdef USE_HARFBUZZ
956       void         *hb_font;
957 #endif
958    } ft;
959    LK(ft_mutex);
960    Font_Hint_Flags  hinting;
961    Font_Rend_Flags  wanted_rend; /* The wanted rendering style */
962    Font_Rend_Flags  runtime_rend; /* The rendering we need to do on runtime
963                                      in order to comply with the wanted_rend. */
964
965    Eina_List       *task;
966 #ifdef EVAS_CSERVE2
967    void            *cs2_handler;
968 #endif
969
970    int              generation;
971
972    unsigned char    sizeok : 1;
973    unsigned char    inuse : 1;
974 };
975
976 struct _RGBA_Font_Source
977 {
978    const char       *name;
979    const char       *file;
980    void             *data;
981    unsigned int      current_size;
982    int               data_size;
983    int               references;
984    struct {
985       int            orig_upem;
986       FT_Face        face;
987    } ft;
988 };
989
990 /*
991  * laziness wins for now. The parts used from the freetpye struct are
992  * kept intact to avoid changing the code using it until we know exactly
993  * what needs to be changed
994  */
995 struct _RGBA_Font_Glyph_Out
996 {
997    struct {
998       int rows;
999       int width;
1000       int pitch;
1001       unsigned char *buffer;
1002       short num_grays;
1003       char pixel_mode;
1004    } bitmap;
1005 };
1006
1007 struct _RGBA_Font_Glyph
1008 {
1009    FT_UInt         index;
1010    Evas_Coord      width;
1011    Evas_Coord      x_bear;
1012    Evas_Coord      y_bear;
1013    FT_Glyph        glyph;
1014    RGBA_Font_Glyph_Out *glyph_out;
1015    void            (*glyph_out_free)(void *);
1016    /* this is a problem - only 1 engine at a time can extend such a font... grrr */
1017    void           *ext_dat;
1018    void           (*ext_dat_free) (void *ext_dat);
1019    RGBA_Font_Int   *fi;
1020 };
1021
1022 struct _RGBA_Gfx_Compositor
1023 {
1024    const char *name;
1025
1026    void              (*init)(void);
1027    void              (*shutdown)(void);
1028
1029    RGBA_Gfx_Func  (*composite_pixel_span_get)(RGBA_Image *src, RGBA_Image *dst, int pixels);
1030    RGBA_Gfx_Func  (*composite_color_span_get)(DATA32 col, RGBA_Image *dst, int pixels);
1031    RGBA_Gfx_Func  (*composite_pixel_color_span_get)(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels);
1032    RGBA_Gfx_Func  (*composite_mask_color_span_get)(DATA32 col, RGBA_Image *dst, int pixels);
1033    RGBA_Gfx_Func  (*composite_pixel_mask_span_get)(RGBA_Image *src, RGBA_Image *dst, int pixels);
1034
1035    RGBA_Gfx_Pt_Func  (*composite_pixel_pt_get)(Image_Entry_Flags src_flags, RGBA_Image *dst);
1036    RGBA_Gfx_Pt_Func  (*composite_color_pt_get)(DATA32 col, RGBA_Image *dst);
1037    RGBA_Gfx_Pt_Func  (*composite_pixel_color_pt_get)(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst);
1038    RGBA_Gfx_Pt_Func  (*composite_mask_color_pt_get)(DATA32 col, RGBA_Image *dst);
1039    RGBA_Gfx_Pt_Func  (*composite_pixel_mask_pt_get)(Image_Entry_Flags src_flags, RGBA_Image *dst);
1040 };
1041
1042 #define EVAS_RECT_SPLIT 1
1043 #ifdef EVAS_RECT_SPLIT
1044 typedef struct list_node list_node_t;
1045 typedef struct list list_t;
1046 typedef struct rect rect_t;
1047 typedef struct rect_node rect_node_t;
1048
1049 struct list_node
1050 {
1051     struct list_node *next;
1052 };
1053
1054 struct list
1055 {
1056     struct list_node *head;
1057     struct list_node *tail;
1058 };
1059
1060 struct rect
1061 {
1062     int left;
1063     int top;
1064     int right;
1065     int bottom;
1066     int width;
1067     int height;
1068     int area;
1069 };
1070
1071 struct rect_node
1072 {
1073     struct list_node _lst;
1074     struct rect rect;
1075 };
1076 #endif /* EVAS_RECT_SPLIT */
1077
1078 struct _Tilebuf
1079 {
1080    int outbuf_w;
1081    int outbuf_h;
1082
1083    struct {
1084       int           w, h;
1085    } tile_size;
1086
1087    struct {
1088       int x, y, w, h;
1089    } prev_add, prev_del;
1090 #ifdef RECTUPDATE
1091 /*
1092    Regionbuf *rb;
1093  */
1094 #elif defined(EVAS_RECT_SPLIT)
1095    int need_merge;
1096    list_t rects;
1097 #else
1098 /*
1099    struct {
1100       int           w, h;
1101       Tilebuf_Tile *tiles;
1102    } tiles;
1103  */
1104 #endif
1105 };
1106
1107 struct _Tilebuf_Tile
1108 {
1109    Eina_Bool redraw : 1;
1110 /* FIXME: need these flags later - but not now */
1111 /*
1112    Eina_Bool done   : 1;
1113    Eina_Bool edge   : 1;
1114    Eina_Bool from   : 1;
1115
1116    struct {
1117       int dx, dy;
1118    } vector;
1119  */
1120 };
1121
1122 struct _Tilebuf_Rect
1123 {
1124    EINA_INLIST;
1125    int               x, y, w, h;
1126 };
1127 /*
1128 struct _Regionbuf
1129 {
1130    int w, h;
1131    Regionspan **spans;
1132 };
1133
1134 struct _Regionspan
1135 {
1136   EINA_INLIST;
1137    int x1, x2;
1138 };
1139 */
1140
1141 struct _Convert_Pal
1142 {
1143    int               references;
1144    int               count;
1145    Convert_Pal_Mode  colors;
1146    DATA8            *lookup;
1147    void             *data;
1148 };
1149
1150 /****/
1151
1152 /*****************************************************************************/
1153 #include "evas_macros.h"
1154
1155 #ifndef WORDS_BIGENDIAN
1156 /* x86 */
1157 #define A_VAL(p) (((DATA8 *)(p))[3])
1158 #define R_VAL(p) (((DATA8 *)(p))[2])
1159 #define G_VAL(p) (((DATA8 *)(p))[1])
1160 #define B_VAL(p) (((DATA8 *)(p))[0])
1161 #define AR_VAL(p) ((DATA16 *)(p)[1])
1162 #define GB_VAL(p) ((DATA16 *)(p)[0])
1163 #else
1164 /* ppc */
1165 #define A_VAL(p) (((DATA8 *)(p))[0])
1166 #define R_VAL(p) (((DATA8 *)(p))[1])
1167 #define G_VAL(p) (((DATA8 *)(p))[2])
1168 #define B_VAL(p) (((DATA8 *)(p))[3])
1169 #define AR_VAL(p) ((DATA16 *)(p)[0])
1170 #define GB_VAL(p) ((DATA16 *)(p)[1])
1171 #endif
1172
1173 #define RGB_JOIN(r,g,b) \
1174         (((r) << 16) + ((g) << 8) + (b))
1175
1176 #define ARGB_JOIN(a,r,g,b) \
1177         (((a) << 24) + ((r) << 16) + ((g) << 8) + (b))
1178
1179 #include "evas_blend_ops.h"
1180
1181 #define _EVAS_RENDER_FILL        -1
1182 #define _EVAS_RENDER_BLEND        0
1183 #define _EVAS_RENDER_BLEND_REL    1
1184 #define _EVAS_RENDER_COPY         2
1185 #define _EVAS_RENDER_COPY_REL     3
1186 #define _EVAS_RENDER_ADD          4
1187 #define _EVAS_RENDER_ADD_REL      5
1188 #define _EVAS_RENDER_SUB          6
1189 #define _EVAS_RENDER_SUB_REL      7
1190 #define _EVAS_RENDER_TINT         8
1191 #define _EVAS_RENDER_TINT_REL     9
1192 #define _EVAS_RENDER_MASK         10
1193 #define _EVAS_RENDER_MUL          11
1194 #define _EVAS_RENDER_CLIP         12
1195
1196 #define _EVAS_TEXTURE_REFLECT           0
1197 #define _EVAS_TEXTURE_REPEAT            1
1198 #define _EVAS_TEXTURE_RESTRICT          2
1199 #define _EVAS_TEXTURE_RESTRICT_REFLECT  3
1200 #define _EVAS_TEXTURE_RESTRICT_REPEAT   4
1201 #define _EVAS_TEXTURE_PAD               5
1202
1203 #define _EVAS_COLOR_SPACE_ARGB    0
1204 #define _EVAS_COLOR_SPACE_AHSV    1
1205
1206 /*****************************************************************************/
1207
1208 #define SCALE_SIZE_MAX ((1 << 15) - 1)
1209
1210 #ifdef __cplusplus
1211 extern "C" {
1212 #endif
1213
1214 /****/
1215 void evas_common_init                                   (void);
1216 void evas_common_shutdown                               (void);
1217
1218 EAPI void evas_common_cpu_init                          (void);
1219
1220 int  evas_common_cpu_have_cpuid                         (void);
1221 int  evas_common_cpu_has_feature                        (unsigned int feature);
1222 EAPI void evas_common_cpu_can_do                        (int *mmx, int *sse, int *sse2);
1223 EAPI void evas_common_cpu_end_opt                       (void);
1224
1225 /****/
1226 #include "../engines/common/evas_blend.h"
1227
1228 EAPI Gfx_Func_Copy        evas_common_draw_func_copy_get        (int pixels, int reverse);
1229
1230 /****/
1231 #include "../engines/common/evas_convert_color.h"
1232 #include "../engines/common/evas_convert_colorspace.h"
1233 #include "../engines/common/evas_convert_main.h"
1234 #include "../engines/common/evas_convert_yuv.h"
1235 #include "../engines/common/evas_scale_main.h"
1236 #include "../engines/common/evas_scale_smooth.h"
1237 #include "../engines/common/evas_scale_span.h"
1238
1239 /****/
1240 #include "../engines/common/evas_image.h"
1241
1242 /****/
1243 #include "../engines/common/evas_line.h"
1244 #include "../engines/common/evas_polygon.h"
1245 #include "../engines/common/evas_rectangle.h"
1246
1247 /****/
1248 EAPI void     evas_common_blit_init               (void);
1249
1250 EAPI void     evas_common_blit_rectangle          (const RGBA_Image *src, RGBA_Image *dst, int src_x, int src_y, int w, int h, int dst_x, int dst_y);
1251
1252 /****/
1253 #include "../engines/common/evas_font.h"
1254
1255 /****/
1256 EAPI void          evas_common_tilebuf_init               (void);
1257
1258 EAPI Tilebuf      *evas_common_tilebuf_new               (int w, int h);
1259 EAPI void          evas_common_tilebuf_free              (Tilebuf *tb);
1260 EAPI void          evas_common_tilebuf_set_tile_size     (Tilebuf *tb, int tw, int th);
1261 EAPI void          evas_common_tilebuf_get_tile_size     (Tilebuf *tb, int *tw, int *th);
1262 EAPI int           evas_common_tilebuf_add_redraw        (Tilebuf *tb, int x, int y, int w, int h);
1263 EAPI int           evas_common_tilebuf_del_redraw        (Tilebuf *tb, int x, int y, int w, int h);
1264 EAPI int           evas_common_tilebuf_add_motion_vector (Tilebuf *tb, int x, int y, int w, int h, int dx, int dy, int alpha);
1265 EAPI void          evas_common_tilebuf_clear             (Tilebuf *tb);
1266 EAPI Tilebuf_Rect *evas_common_tilebuf_get_render_rects  (Tilebuf *tb);
1267 EAPI void          evas_common_tilebuf_free_render_rects (Tilebuf_Rect *rects);
1268
1269 /*
1270 Regionbuf    *evas_common_regionbuf_new       (int w, int h);
1271 void          evas_common_regionbuf_free      (Regionbuf *rb);
1272 void          evas_common_regionbuf_clear     (Regionbuf *rb);
1273 void          evas_common_regionbuf_span_add  (Regionbuf *rb, int x1, int x2, int y);
1274 void          evas_common_regionbuf_span_del  (Regionbuf *rb, int x1, int x2, int y);
1275 Tilebuf_Rect *evas_common_regionbuf_rects_get (Regionbuf *rb);
1276 */
1277
1278 /****/
1279 #include "../engines/common/evas_draw.h"
1280
1281 #include "../engines/common/evas_map_image.h"
1282
1283 /****/
1284 #include "../engines/common/evas_pipe.h"
1285
1286 void              evas_font_dir_cache_free(void);
1287
1288 /****/
1289
1290 /*****************************************************************************/
1291
1292 #ifdef __cplusplus
1293 }
1294 #endif
1295
1296 #endif