75711bb9f91d505c4864d16fcd37288c7a202d84
[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 static inline void *
13 evas_common_convert_argb8888_to_rgb565_a5p(void *data __UNUSED__, int w __UNUSED__, int h __UNUSED__, int stride __UNUSED__, Eina_Bool has_alpha __UNUSED__)
14 {
15    return NULL;
16 }
17
18 static inline void *
19 evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, Eina_Bool has_alpha)
20 {
21    DATA16 *src, *end;
22    DATA32 *ret, *dst;
23
24    src = data;
25    end = src + (stride * h);
26    ret = malloc(w * h * sizeof(DATA32));
27
28    dst = ret;
29    if (has_alpha)
30      {
31         DATA8 *alpha;
32
33         alpha = (DATA8 *)end;
34         for (; src < end; src++, alpha++, dst++)
35           *dst = (CONVERT_A5P_TO_A8(*alpha) << 24) |
36                   CONVERT_RGB_565_TO_RGB_888(*src);
37      }
38    else
39      {
40         for (; src < end; src++, dst++)
41           *dst = CONVERT_RGB_565_TO_RGB_888(*src);
42      }
43    return ret;
44 }
45
46 EAPI void *
47 evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace)
48 {
49    switch (cspace)
50      {
51         case EVAS_COLORSPACE_RGB565_A5P:
52           return evas_common_convert_argb8888_to_rgb565_a5p(data, w, h, stride, has_alpha);
53         default:
54           break;
55      }
56    return NULL;
57 }
58
59 EAPI void *
60 evas_common_convert_rgb565_a5p_to(void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace)
61 {
62    switch (cspace)
63      {
64         case EVAS_COLORSPACE_ARGB8888:
65           return evas_common_convert_rgb565_a5p_to_argb8888(data, w, h, stride, has_alpha);
66         default:
67           break;
68      }
69    return NULL;
70 }