1 diff -upNr evas/src/lib/Evas.h evas.new/src/lib/Evas.h
2 --- evas/src/lib/Evas.h 2008-05-07 15:06:26.000000000 -0300
3 +++ evas.new/src/lib/Evas.h 2008-05-07 15:07:35.000000000 -0300
4 @@ -532,6 +532,7 @@ extern "C" {
5 EAPI int evas_object_image_stride_get (const Evas_Object *obj);
6 EAPI int evas_object_image_load_error_get (const Evas_Object *obj);
7 EAPI void evas_object_image_data_set (Evas_Object *obj, void *data);
8 + EAPI void *evas_object_image_data_convert (Evas_Object *obj, Evas_Colorspace to_cspace);
9 EAPI void *evas_object_image_data_get (const Evas_Object *obj, Evas_Bool for_writing);
10 EAPI void evas_object_image_data_copy_set (Evas_Object *obj, void *data);
11 EAPI void evas_object_image_data_update_add (Evas_Object *obj, int x, int y, int w, int h);
12 diff -upNr evas/src/lib/canvas/evas_object_image.c evas.new/src/lib/canvas/evas_object_image.c
13 --- evas/src/lib/canvas/evas_object_image.c 2008-05-07 15:06:26.000000000 -0300
14 +++ evas.new/src/lib/canvas/evas_object_image.c 2008-05-07 15:07:35.000000000 -0300
15 @@ -67,6 +67,8 @@ static int evas_object_image_is_opaque(E
16 static int evas_object_image_was_opaque(Evas_Object *obj);
17 static int evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
19 +static void *evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace);
21 static const Evas_Object_Func object_func =
23 /* methods (compulsory) */
24 @@ -706,6 +708,46 @@ evas_object_image_load_error_get(const E
28 + * Converts the raw image data of the given image object to the
29 + * specified colorspace.
31 + * Note that this function does not modify the raw image data.
32 + * If the requested colorspace is the same as the image colorspace
33 + * nothing is done and NULL is returned. You should use
34 + * evas_object_image_colorspace_get() to check the current image
37 + * See @ref evas_object_image_colorspace_get.
39 + * @param obj The given image object.
40 + * @param to_cspace The colorspace to which the image raw data will be converted.
41 + * @return data A newly allocated data in the format specified by to_cspace.
42 + * @ingroup Evas_Object_Image_Data
45 +evas_object_image_data_convert(Evas_Object *obj, Evas_Colorspace to_cspace)
47 + Evas_Object_Image *o;
50 + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
53 + o = (Evas_Object_Image *)(obj->object_data);
54 + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
57 + if (!o->engine_data) return NULL;
58 + if (!o->cur.cspace == to_cspace) return NULL;
60 + o->engine_data = obj->layer->evas->engine.func->image_data_get(obj->layer->evas->engine.data.output,
64 + return evas_object_image_data_convert_internal(o, data, to_cspace);
68 * Sets the raw image data of the given image object.
70 * Note that the raw data must be of the same size and colorspace
71 @@ -1127,7 +1169,19 @@ evas_object_image_save(const Evas_Object
72 EVAS_COLORSPACE_ARGB8888);
75 - ok = evas_common_save_image_to_file(im, file, key, quality, compress);
76 + if (o->cur.cspace == EVAS_COLORSPACE_ARGB8888)
77 + im->image.data = data;
79 + im->image.data = evas_object_image_data_convert_internal(o,
81 + EVAS_COLORSPACE_ARGB8888);
84 + ok = evas_common_save_image_to_file(im, file, key, quality, compress);
86 + if (o->cur.cspace != EVAS_COLORSPACE_ARGB8888)
87 + free(im->image.data);
90 evas_cache_image_drop(&im->cache_entry);
92 @@ -2373,3 +2427,36 @@ evas_object_image_is_inside(Evas_Object
98 +evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace)
105 + switch (o->cur.cspace)
107 + case EVAS_COLORSPACE_ARGB8888:
108 + out = evas_common_convert_argb8888_to(data,
111 + o->cur.image.stride,
115 + case EVAS_COLORSPACE_RGB565_A5P:
116 + out = evas_common_convert_rgb565_a5p_to(data,
119 + o->cur.image.stride,
129 diff -upNr evas/src/lib/engines/common/Makefile.am evas.new/src/lib/engines/common/Makefile.am
130 --- evas/src/lib/engines/common/Makefile.am 2008-05-07 15:06:27.000000000 -0300
131 +++ evas.new/src/lib/engines/common/Makefile.am 2008-05-07 15:07:35.000000000 -0300
132 @@ -24,6 +24,7 @@ evas_op_mul_main_.c \
135 evas_convert_color.c \
136 +evas_convert_colorspace.c \
137 evas_convert_gry_1.c \
138 evas_convert_gry_4.c \
139 evas_convert_gry_8.c \
140 diff -upNr evas/src/lib/engines/common/Makefile.in evas.new/src/lib/engines/common/Makefile.in
141 --- evas/src/lib/engines/common/Makefile.in 2008-05-07 15:08:04.000000000 -0300
142 +++ evas.new/src/lib/engines/common/Makefile.in 2008-05-07 15:08:32.000000000 -0300
143 @@ -48,13 +48,14 @@ am_libevas_engine_common_la_OBJECTS = ev
144 evas_op_blend_main_.lo evas_op_add_main_.lo \
145 evas_op_sub_main_.lo evas_op_mask_main_.lo \
146 evas_op_mul_main_.lo evas_blend_main.lo evas_blit_main.lo \
147 - evas_convert_color.lo evas_convert_gry_1.lo \
148 - evas_convert_gry_4.lo evas_convert_gry_8.lo \
149 - evas_convert_main.lo evas_convert_rgb_16.lo \
150 - evas_convert_rgb_24.lo evas_convert_rgb_32.lo \
151 - evas_convert_rgb_8.lo evas_convert_yuv.lo evas_cpu.lo \
152 - evas_draw_main.lo evas_font_draw.lo evas_font_load.lo \
153 - evas_font_main.lo evas_font_query.lo evas_gradient_main.lo \
154 + evas_convert_color.lo evas_convert_colorspace.lo \
155 + evas_convert_gry_1.lo evas_convert_gry_4.lo \
156 + evas_convert_gry_8.lo evas_convert_main.lo \
157 + evas_convert_rgb_16.lo evas_convert_rgb_24.lo \
158 + evas_convert_rgb_32.lo evas_convert_rgb_8.lo \
159 + evas_convert_yuv.lo evas_cpu.lo evas_draw_main.lo \
160 + evas_font_draw.lo evas_font_load.lo evas_font_main.lo \
161 + evas_font_query.lo evas_gradient_main.lo \
162 evas_gradient_linear.lo evas_gradient_radial.lo \
163 evas_gradient_angular.lo evas_gradient_rectangular.lo \
164 evas_gradient_sinusoidal.lo evas_image_load.lo \
165 @@ -293,6 +294,7 @@ evas_op_mul_main_.c \
168 evas_convert_color.c \
169 +evas_convert_colorspace.c \
170 evas_convert_gry_1.c \
171 evas_convert_gry_4.c \
172 evas_convert_gry_8.c \
173 @@ -397,6 +399,7 @@ distclean-compile:
174 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_blend_main.Plo@am__quote@
175 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_blit_main.Plo@am__quote@
176 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_color.Plo@am__quote@
177 +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_colorspace.Plo@am__quote@
178 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_gry_1.Plo@am__quote@
179 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_gry_4.Plo@am__quote@
180 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_gry_8.Plo@am__quote@
181 diff -upNr evas/src/lib/engines/common/evas_convert_colorspace.c evas.new/src/lib/engines/common/evas_convert_colorspace.c
182 --- evas/src/lib/engines/common/evas_convert_colorspace.c 1969-12-31 21:00:00.000000000 -0300
183 +++ evas.new/src/lib/engines/common/evas_convert_colorspace.c 2008-05-07 15:07:35.000000000 -0300
185 +#include "evas_common.h"
187 +#define CONVERT_RGB_565_TO_RGB_888(s) \
188 + (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
189 + ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
190 + ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
192 +#define CONVERT_A5P_TO_A8(s) \
193 + ((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7))
195 +static inline void *
196 +evas_common_convert_argb8888_to_rgb565_a5p(void *data, int w, int h, int stride, Evas_Bool has_alpha)
200 +static inline void *
201 +evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, Evas_Bool has_alpha)
208 + end = src + (stride * h);
209 + ret = malloc(w * h * sizeof(DATA32));
217 + for (; src < end; src++, alpha++, dst++)
218 + *dst = (CONVERT_A5P_TO_A8(*alpha) << 24) |
219 + CONVERT_RGB_565_TO_RGB_888(*src);
223 + for (; src < end; src++, dst++)
224 + *dst = CONVERT_RGB_565_TO_RGB_888(*src);
230 +evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace)
234 + case EVAS_COLORSPACE_RGB565_A5P:
235 + return evas_common_convert_argb8888_to_rgb565_a5p(data, w, h, stride, has_alpha);
243 +evas_common_convert_rgb565_a5p_to(void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace)
247 + case EVAS_COLORSPACE_ARGB8888:
248 + return evas_common_convert_rgb565_a5p_to_argb8888(data, w, h, stride, has_alpha);
254 diff -upNr evas/src/lib/include/evas_common.h evas.new/src/lib/include/evas_common.h
255 --- evas/src/lib/include/evas_common.h 2008-05-07 15:06:27.000000000 -0300
256 +++ evas.new/src/lib/include/evas_common.h 2008-05-07 15:07:35.000000000 -0300
257 @@ -1039,6 +1039,9 @@ EAPI void evas_common_convert_color_rgb_
258 EAPI void evas_common_convert_color_hsv_to_rgb_int (int h, int s, int v, int *r, int *g, int *b);
259 EAPI void evas_common_convert_color_rgb_to_hsv_int (int r, int g, int b, int *h, int *s, int *v);
261 +EAPI void *evas_common_convert_argb8888_to (void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace);
262 +EAPI void *evas_common_convert_rgb565_a5p_to (void *data, int w, int h, int stride, Evas_Bool has_alpha, Evas_Colorspace cspace);
265 EAPI void evas_common_scale_init (void);