merged evas image masking code from brett
[framework/uifw/evas.git] / src / lib / engines / common / evas_convert_colorspace.c
1 #include "evas_common.h"
2 #include "evas_convert_colorspace.h"
3
4 #define CONVERT_RGB_565_TO_RGB_888(s) \
5         (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
6          ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
7          ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
8
9 #define CONVERT_A5P_TO_A8(s) \
10         ((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7))
11
12 #define CONVERT_ARGB_8888_TO_A_8(s)     ((s) >> 24)
13
14
15 static inline void *
16 evas_common_convert_argb8888_to_rgb565_a5p(void *data __UNUSED__, int w __UNUSED__, int h __UNUSED__, int stride __UNUSED__, Eina_Bool has_alpha __UNUSED__)
17 {
18    return NULL;
19 }
20
21 static inline void *
22 evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, Eina_Bool has_alpha)
23 {
24    DATA16 *src, *end;
25    DATA32 *ret, *dst;
26
27    src = data;
28    end = src + (stride * h);
29    ret = malloc(w * h * sizeof(DATA32));
30
31    dst = ret;
32    if (has_alpha)
33      {
34         DATA8 *alpha;
35
36         alpha = (DATA8 *)end;
37         for (; src < end; src++, alpha++, dst++)
38           *dst = (CONVERT_A5P_TO_A8(*alpha) << 24) |
39                   CONVERT_RGB_565_TO_RGB_888(*src);
40      }
41    else
42      {
43         for (; src < end; src++, dst++)
44           *dst = CONVERT_RGB_565_TO_RGB_888(*src);
45      }
46    return ret;
47 }
48
49 static inline void *
50 evas_common_convert_argb8888_to_a8(void *data, int w, int h, int stride, Eina_Bool has_alpha)
51 {
52    uint32_t *src, *end;
53    uint8_t *ret, *dst;
54
55    src = data;
56    end = src + (stride * h);
57    ret = malloc(w * h);
58
59    if (!has_alpha)
60      {
61         return memset(ret,0xff, w * h);
62      }
63
64    for ( ; src < end ; src ++, dst ++)
65       *dst = CONVERT_ARGB_8888_TO_A_8(*src);
66    return ret;
67 }
68
69
70
71 EAPI void *
72 evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace)
73 {
74    switch (cspace)
75      {
76         case EVAS_COLORSPACE_RGB565_A5P:
77           return evas_common_convert_argb8888_to_rgb565_a5p(data, w, h, stride, has_alpha);
78         default:
79           break;
80      }
81    return NULL;
82 }
83
84 EAPI void *
85 evas_common_convert_rgb565_a5p_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace)
86 {
87    switch (cspace)
88      {
89         case EVAS_COLORSPACE_ARGB8888:
90           return evas_common_convert_rgb565_a5p_to_argb8888(data, w, h, stride, has_alpha);
91         default:
92           break;
93      }
94    return NULL;
95 }
96
97
98 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/