2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
6 # include "config.h" /* so that EAPI in Eet.h is correctly defined */
9 #ifdef BUILD_LOADER_EET
13 #include "evas_common.h"
14 #include "evas_private.h"
15 #include "evas_image_private.h"
16 #include "evas_convert_yuv.h"
19 # include <memcheck.h>
22 static Evas_Cache_Image * eci = NULL;
23 static int reference = 0;
25 /* static RGBA_Image *evas_rgba_line_buffer = NULL; */
27 #define EVAS_RGBA_LINE_BUFFER_MIN_LEN 256
28 #define EVAS_RGBA_LINE_BUFFER_MAX_LEN 2048
30 /* static RGBA_Image *evas_alpha_line_buffer = NULL; */
32 #define EVAS_ALPHA_LINE_BUFFER_MIN_LEN 256
33 #define EVAS_ALPHA_LINE_BUFFER_MAX_LEN 2048
36 static Image_Entry *_evas_common_rgba_image_new(void);
37 static void _evas_common_rgba_image_delete(Image_Entry *ie);
39 static int _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h);
40 static void _evas_common_rgba_image_surface_delete(Image_Entry *ie);
41 static DATA32 *_evas_common_rgba_image_surface_pixels(Image_Entry *ie);
43 static void _evas_common_rgba_image_unload(Image_Entry *im);
45 static void _evas_common_rgba_image_dirty_region(Image_Entry *im, int x, int y, int w, int h);
47 static int _evas_common_rgba_image_ram_usage(Image_Entry *ie);
49 /* Only called when references > 0. Need to provide a fresh copie of im. */
50 /* The destination surface does have a surface, but no allocated pixel data. */
51 static int _evas_common_rgba_image_dirty(Image_Entry* dst, const Image_Entry* src);
54 _evas_common_rgba_image_debug(const char* context, Image_Entry *eim)
56 fprintf(stderr, "%p = [%s] {%s,%s} %i [%i|%i]\n", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h);
59 static const Evas_Cache_Image_Func _evas_common_image_func =
61 _evas_common_rgba_image_new,
62 _evas_common_rgba_image_delete,
63 _evas_common_rgba_image_surface_alloc,
64 _evas_common_rgba_image_surface_delete,
65 _evas_common_rgba_image_surface_pixels,
66 evas_common_load_rgba_image_module_from_file,
67 _evas_common_rgba_image_unload,
68 _evas_common_rgba_image_dirty_region,
69 _evas_common_rgba_image_dirty,
70 evas_common_rgba_image_size_set,
71 evas_common_rgba_image_from_copied_data,
72 evas_common_rgba_image_from_data,
73 evas_common_rgba_image_colorspace_set,
74 evas_common_load_rgba_image_data_from_file,
75 _evas_common_rgba_image_ram_usage,
76 /* _evas_common_rgba_image_debug */
81 evas_common_image_init(void)
84 eci = evas_cache_image_init(&_evas_common_image_func);
86 //// printf("REF++=%i\n", reference);
88 #ifdef BUILD_LOADER_EET
94 evas_common_image_shutdown(void)
98 //// printf("REF--=%i\n", reference);
99 // DISABLE for now - something wrong with cache shutdown freeing things
100 // still in use - rage_thumb segv's now.
102 // actually - i think i see it. cache ref goes to 0 (and thus gets freed)
103 // because in eng_setup() when a buffer changes size it is FIRST freed
104 // THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately
105 // where it should stay at 1. - see evas_engine.c in the buffer enigne for
106 // example. eng_output_free() is called BEFORE _output_setup(). although this
107 // is only a SIGNE of the problem. we can patch this up with either freeing
108 // after the setup (so we just pt a ref of 2 then back to 1), or just
109 // evas_common_image_init() at the start and evas_common_image_shutdown()
110 // after it all. really ref 0 should only be reached when no more canvases
111 // with no more objects exist anywhere.
112 // evas_cache_image_shutdown(eci);
116 #ifdef BUILD_LOADER_EET
122 _evas_common_rgba_image_new(void)
126 im = calloc(1, sizeof(RGBA_Image));
127 if (!im) return NULL;
128 im->flags = RGBA_IMAGE_NOTHING;
130 return &im->cache_entry;
134 _evas_common_rgba_image_delete(Image_Entry *ie)
136 RGBA_Image *im = (RGBA_Image *) ie;
138 evas_common_pipe_free(im);
139 if (ie->info.module) evas_module_unref((Evas_Module *)ie->info.module);
140 /* memset the image to 0x99 because i recently saw a segv where an
141 * seemed to be used BUT its contents were wrong - it looks like it was
142 * overwritten by something from efreet - as there was an execute command
143 * for a command there and some other signs - but to make sure, I am
144 * going to empty this struct out in case this happens again so i know
145 * that something else is overwritign this struct - or not */
146 memset(im, 0x99, sizeof(im));
151 _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h)
153 RGBA_Image *im = (RGBA_Image *) ie;
156 if (im->image.no_free) return 0;
158 if (im->flags & RGBA_IMAGE_ALPHA_ONLY)
159 siz = w * h * sizeof(DATA8);
161 siz = w * h * sizeof(DATA32);
163 if (im->image.data) free(im->image.data);
164 im->image.data = malloc(siz);
165 if (im->image.data == NULL) return -1;
168 # ifdef VALGRIND_MAKE_READABLE
169 VALGRIND_MAKE_READABLE(im->image.data, siz);
171 # ifdef VALGRIND_MAKE_MEM_DEFINED
172 VALGRIND_MAKE_MEM_DEFINED(im->image.data, siz);
181 _evas_common_rgba_image_surface_delete(Image_Entry *ie)
183 RGBA_Image *im = (RGBA_Image *) ie;
185 if ((im->cs.data) && (im->image.data))
187 if (im->cs.data != im->image.data)
189 if (!im->cs.no_free) free(im->cs.data);
192 else if (im->cs.data)
194 if (!im->cs.no_free) free(im->cs.data);
198 if (im->image.data && !im->image.no_free)
199 free(im->image.data);
200 im->image.data = NULL;
204 _evas_common_rgba_image_unload(Image_Entry* im)
209 _evas_common_rgba_image_dirty_region(Image_Entry* ie, int x, int y, int w, int h)
211 RGBA_Image *im = (RGBA_Image *) ie;
213 im->flags |= RGBA_IMAGE_IS_DIRTY;
216 /* Only called when references > 0. Need to provide a fresh copie of im. */
218 _evas_common_rgba_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
220 RGBA_Image *dst = (RGBA_Image *) ie_dst;
221 RGBA_Image *src = (RGBA_Image *) ie_src;
223 evas_cache_image_load_data(&src->cache_entry);
224 if (_evas_common_rgba_image_surface_alloc(&dst->cache_entry,
225 src->cache_entry.w, src->cache_entry.h))
228 evas_common_image_colorspace_normalize(src);
229 evas_common_image_colorspace_normalize(dst);
230 /* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
231 /* evas_common_cpu_end_opt(); */
237 _evas_common_rgba_image_ram_usage(Image_Entry *ie)
239 RGBA_Image *im = (RGBA_Image *) ie;
241 // ram += sizeof(struct _RGBA_Image);
242 // if (im->info.real_file) ram += strlen(im->info.real_file);
243 // if (im->info.comment) ram += strlen(im->info.comment);
244 if ((im->image.data) && (!im->image.no_free))
245 return im->cache_entry.w * im->cache_entry.h * sizeof(DATA32);
250 _evas_common_rgba_image_surface_pixels(Image_Entry *ie)
252 RGBA_Image *im = (RGBA_Image *) ie;
254 return im->image.data;
259 evas_common_image_surface_alpha_tiles_calc(RGBA_Surface *is, int tsize)
264 if (is->spans) return;
265 if (!is->im->cache_entry.flags.alpha) return;
266 /* FIXME: dont handle alpha only images yet */
267 if ((is->im->flags & RGBA_IMAGE_ALPHA_ONLY)) return;
268 if (tsize < 0) tsize = 0;
269 is->spans = calloc(1, sizeof(RGBA_Image_Span *) * is->h);
270 if (!is->spans) return;
272 for (y = 0; y < is->h; y++)
277 for (x = 0; x < is->w; x++)
286 is->spans[y] = evas_object_list_append(is->spans[y], sp);
292 if ((sp->v == 2) && (a != 255)) sp->v = 1;
299 sp = calloc(1, sizeof(RGBA_Image_Span));
306 sp = calloc(1, sizeof(RGBA_Image_Span));
316 is->spans[y] = evas_object_list_append(is->spans[y], sp);
324 /* evas_common_image_surface_dealloc(RGBA_Surface *is) */
326 /* if ((is->data) && (!is->no_free)) */
328 /* free(is->data); */
329 /* is->data = NULL; */
334 evas_common_image_create(int w, int h)
338 im = (RGBA_Image *) _evas_common_rgba_image_new();
339 if (!im) return NULL;
340 im->cache_entry.w = w;
341 im->cache_entry.h = h;
342 if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
344 _evas_common_rgba_image_delete(&im->cache_entry);
347 im->cache_entry.flags.cached = 0;
352 evas_common_image_alpha_create(int w, int h)
356 im = (RGBA_Image *) _evas_common_rgba_image_new();
357 if (!im) return NULL;
358 im->cache_entry.w = w;
359 im->cache_entry.h = h;
360 im->flags |= RGBA_IMAGE_ALPHA_ONLY;
361 if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
363 _evas_common_rgba_image_delete(&im->cache_entry);
366 im->cache_entry.flags.cached = 0;
371 evas_common_image_colorspace_normalize(RGBA_Image *im)
373 if ((!im->cs.data) ||
374 ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY)))) return;
375 switch (im->cache_entry.space)
377 case EVAS_COLORSPACE_ARGB8888:
378 if (im->image.data != im->cs.data)
380 if (!im->image.no_free) free(im->image.data);
381 im->image.data = im->cs.data;
382 im->cs.no_free = im->image.no_free;
385 case EVAS_COLORSPACE_YCBCR422P601_PL:
386 #ifdef BUILD_CONVERT_YUV
387 if ((im->image.data) && (*((unsigned char **)im->cs.data)))
388 evas_common_convert_yuv_420p_601_rgba(im->cs.data, (DATA8*) im->image.data,
389 im->cache_entry.w, im->cache_entry.h);
399 evas_common_image_colorspace_dirty(RGBA_Image *im)
405 evas_common_image_set_cache(int size)
408 evas_cache_image_set(eci, size);
412 evas_common_image_get_cache(void)
414 return evas_cache_image_get(eci);
418 evas_common_load_image_from_file(const char *file, const char *key, RGBA_Image_Loadopts *lo)
422 if (file == NULL) return NULL;
423 return (RGBA_Image *) evas_cache_image_request(eci, file, key, lo, &error);
427 evas_common_image_cache_free(void)
429 evas_common_image_set_cache(0);
432 EAPI Evas_Cache_Image*
433 evas_common_image_cache_get(void)
439 evas_common_image_line_buffer_obtain(int len)
441 if (len < 1) return NULL;
442 if (len < EVAS_RGBA_LINE_BUFFER_MIN_LEN)
443 len = EVAS_RGBA_LINE_BUFFER_MIN_LEN;
444 return evas_common_image_create(len, 1);
446 if (evas_rgba_line_buffer)
448 if (evas_rgba_line_buffer->image->w >= len)
449 return evas_rgba_line_buffer;
450 evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data, len * sizeof(DATA32));
451 if (!evas_rgba_line_buffer->image->data)
453 evas_common_image_free(evas_rgba_line_buffer);
454 evas_rgba_line_buffer = NULL;
457 evas_rgba_line_buffer->image->w = len;
458 return evas_rgba_line_buffer;
460 evas_rgba_line_buffer = evas_common_image_create(len, 1);
461 if (!evas_rgba_line_buffer) return NULL;
462 return evas_rgba_line_buffer;
467 evas_common_image_line_buffer_release(RGBA_Image *im)
469 _evas_common_rgba_image_delete(&im->cache_entry);
471 if (!evas_rgba_line_buffer) return;
472 if (EVAS_RGBA_LINE_BUFFER_MAX_LEN < evas_rgba_line_buffer->image->w)
474 evas_rgba_line_buffer->image->w = EVAS_RGBA_LINE_BUFFER_MAX_LEN;
475 evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data,
476 evas_rgba_line_buffer->image->w * sizeof(DATA32));
477 if (!evas_rgba_line_buffer->image->data)
479 evas_common_image_free(evas_rgba_line_buffer);
480 evas_rgba_line_buffer = NULL;
487 evas_common_image_line_buffer_free(RGBA_Image *im)
489 _evas_common_rgba_image_delete(&im->cache_entry);
491 if (!evas_rgba_line_buffer) return;
492 evas_common_image_free(evas_rgba_line_buffer);
493 evas_rgba_line_buffer = NULL;
498 evas_common_image_alpha_line_buffer_obtain(int len)
500 if (len < 1) return NULL;
501 if (len < EVAS_ALPHA_LINE_BUFFER_MIN_LEN)
502 len = EVAS_ALPHA_LINE_BUFFER_MIN_LEN;
503 return evas_common_image_alpha_create(len, 1);
505 if (evas_alpha_line_buffer)
507 if (evas_alpha_line_buffer->image->w >= len)
508 return evas_alpha_line_buffer;
509 evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data, len * sizeof(DATA8));
510 if (!evas_alpha_line_buffer->image->data)
512 evas_common_image_free(evas_alpha_line_buffer);
513 evas_alpha_line_buffer = NULL;
516 evas_alpha_line_buffer->image->w = len;
517 return evas_alpha_line_buffer;
519 evas_alpha_line_buffer = evas_common_image_alpha_create(len, 1);
520 return evas_alpha_line_buffer;
525 evas_common_image_alpha_line_buffer_release(RGBA_Image *im)
527 _evas_common_rgba_image_delete(&im->cache_entry);
529 if (!evas_alpha_line_buffer) return;
530 if (EVAS_ALPHA_LINE_BUFFER_MAX_LEN < evas_alpha_line_buffer->image->w)
532 evas_alpha_line_buffer->image->w = EVAS_ALPHA_LINE_BUFFER_MAX_LEN;
533 evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data,
534 evas_alpha_line_buffer->image->w * sizeof(DATA8));
535 if (!evas_alpha_line_buffer->image->data)
537 evas_common_image_free(evas_alpha_line_buffer);
538 evas_alpha_line_buffer = NULL;
545 evas_common_image_premul(Image_Entry *ie)
551 if (!evas_cache_image_pixels(ie)) return ;
552 if (!ie->flags.alpha) return;
554 s = evas_cache_image_pixels(ie);
555 se = s + (ie->w * ie->h);
558 DATA32 a = 1 + (*s >> 24);
560 *s = (*s & 0xff000000) + (((((*s) >> 8) & 0xff) * a) & 0xff00) +
561 (((((*s) & 0x00ff00ff) * a) >> 8) & 0x00ff00ff);
563 if ((a == 1) || (a == 256))
566 if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
567 ie->flags.alpha_sparse = 1;
571 evas_common_image_set_alpha_sparse(Image_Entry *ie)
577 if (!evas_cache_image_pixels(ie)) return ;
578 if (!ie->flags.alpha) return;
580 s = evas_cache_image_pixels(ie);
581 se = s + (ie->w * ie->h);
584 DATA32 p = *s & 0xff000000;
586 if (!p || (p == 0xff000000))
590 if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
591 ie->flags.alpha_sparse = 1;