2 # include "config.h" /* so that EAPI in Eet.h is correctly defined */
5 #ifdef BUILD_LOADER_EET
9 #include "evas_common.h"
10 #include "evas_private.h"
11 #include "evas_image_private.h"
12 #include "evas_convert_yuv.h"
16 # include <memcheck.h>
19 static Evas_Cache_Image * eci = NULL;
20 static int reference = 0;
22 /* static RGBA_Image *evas_rgba_line_buffer = NULL; */
24 #define EVAS_RGBA_LINE_BUFFER_MIN_LEN 256
25 #define EVAS_RGBA_LINE_BUFFER_MAX_LEN 2048
27 /* static RGBA_Image *evas_alpha_line_buffer = NULL; */
29 #define EVAS_ALPHA_LINE_BUFFER_MIN_LEN 256
30 #define EVAS_ALPHA_LINE_BUFFER_MAX_LEN 2048
33 static Image_Entry *_evas_common_rgba_image_new(void);
34 static void _evas_common_rgba_image_delete(Image_Entry *ie);
36 static int _evas_common_rgba_image_surface_alloc(Image_Entry *ie, unsigned int w, unsigned int h);
37 static void _evas_common_rgba_image_surface_delete(Image_Entry *ie);
38 static DATA32 *_evas_common_rgba_image_surface_pixels(Image_Entry *ie);
40 static void _evas_common_rgba_image_unload(Image_Entry *im);
42 static void _evas_common_rgba_image_dirty_region(Image_Entry *im, unsigned int x, unsigned int y, unsigned int w, unsigned int h);
44 static int _evas_common_rgba_image_ram_usage(Image_Entry *ie);
46 /* Only called when references > 0. Need to provide a fresh copie of im. */
47 /* The destination surface does have a surface, but no allocated pixel data. */
48 static int _evas_common_rgba_image_dirty(Image_Entry* dst, const Image_Entry* src);
52 _evas_common_rgba_image_debug(const char* context, Image_Entry *eim)
54 DBG("%p = [%s] {%s,%s} %i [%i|%i]", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h);
58 static const Evas_Cache_Image_Func _evas_common_image_func =
60 _evas_common_rgba_image_new,
61 _evas_common_rgba_image_delete,
62 _evas_common_rgba_image_surface_alloc,
63 _evas_common_rgba_image_surface_delete,
64 _evas_common_rgba_image_surface_pixels,
65 evas_common_load_rgba_image_module_from_file,
66 _evas_common_rgba_image_unload,
67 _evas_common_rgba_image_dirty_region,
68 _evas_common_rgba_image_dirty,
69 evas_common_rgba_image_size_set,
70 evas_common_rgba_image_from_copied_data,
71 evas_common_rgba_image_from_data,
72 evas_common_rgba_image_colorspace_set,
73 evas_common_load_rgba_image_data_from_file,
74 _evas_common_rgba_image_ram_usage,
75 /* _evas_common_rgba_image_debug */
80 evas_common_image_init(void)
83 eci = evas_cache_image_init(&_evas_common_image_func);
85 //// ERR("REF++=%i", reference);
87 #ifdef BUILD_LOADER_EET
90 evas_common_scalecache_init();
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.
113 // ENABLE IT AGAIN, hope it is fixed. Gustavo @ January 22nd, 2009.
114 evas_cache_image_shutdown(eci);
118 #ifdef BUILD_LOADER_EET
121 evas_common_scalecache_shutdown();
125 evas_common_image_image_all_unload(void)
127 evas_common_rgba_image_scalecache_dump();
128 evas_cache_image_unload_all(eci);
132 _evas_common_rgba_image_new(void)
136 im = calloc(1, sizeof(RGBA_Image));
137 if (!im) return NULL;
138 im->flags = RGBA_IMAGE_NOTHING;
140 #ifdef EVAS_FRAME_QUEUING
141 LKI(im->cache_entry.ref_fq_add);
142 LKI(im->cache_entry.ref_fq_del);
143 eina_condition_new(&(im->cache_entry.cond_fq_del),
144 &(im->cache_entry.ref_fq_del));
147 evas_common_rgba_image_scalecache_init(&im->cache_entry);
149 return &im->cache_entry;
153 _evas_common_rgba_image_delete(Image_Entry *ie)
155 RGBA_Image *im = (RGBA_Image *)ie;
157 #ifdef BUILD_PIPE_RENDER
158 evas_common_pipe_free(im);
159 # ifdef EVAS_FRAME_QUEUING
160 LKD(im->cache_entry.ref_fq_add);
161 LKD(im->cache_entry.ref_fq_del);
162 eina_condition_free(&(im->cache_entry.cond_fq_del));
165 evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);
166 if (ie->info.module) evas_module_unref((Evas_Module *)ie->info.module);
167 /* memset the image to 0x99 because i recently saw a segv where an
168 * seemed to be used BUT its contents were wrong - it looks like it was
169 * overwritten by something from efreet - as there was an execute command
170 * for a command there and some other signs - but to make sure, I am
171 * going to empty this struct out in case this happens again so i know
172 * that something else is overwritign this struct - or not */
173 // memset(im, 0x99, sizeof(im));
175 if (ie->data1) evas_cserve_image_free(ie);
178 * FIXME: This doesn't seem to be needed... But I'm not sure why.
183 EINA_LIST_FREE(im->filtered, fi)
186 _evas_common_rgba_image_delete((Image_Entry *)(fi->image));
194 Image_Entry_Frame *frame;
195 EINA_LIST_FOREACH(ie->frames, l, frame)
199 if (frame->data) free(frame->data);
200 if (frame->info) free(frame->info);
209 evas_common_rgba_image_free(Image_Entry *ie)
211 _evas_common_rgba_image_surface_delete(ie);
212 _evas_common_rgba_image_delete(ie);
216 evas_common_rgba_image_unload(Image_Entry *ie)
218 RGBA_Image *im = (RGBA_Image *) ie;
220 if (!ie->flags.loaded) return;
221 if ((!ie->info.module) && (!ie->data1)) return;
222 if (!ie->file) return;
224 ie->flags.loaded = 0;
226 if ((im->cs.data) && (im->image.data))
228 if (im->cs.data != im->image.data)
230 if (!im->cs.no_free) free(im->cs.data);
233 else if (im->cs.data)
235 if (!im->cs.no_free) free(im->cs.data);
242 evas_cserve_image_useless(ie);
243 im->image.data = NULL;
246 ie->flags.loaded = 0;
247 #ifdef BUILD_ASYNC_PRELOAD
248 ie->flags.preload_done = 0;
254 if (im->image.data && !im->image.no_free)
255 free(im->image.data);
256 im->image.data = NULL;
259 ie->flags.loaded = 0;
260 #ifdef BUILD_ASYNC_PRELOAD
261 ie->flags.preload_done = 0;
266 _evas_common_rgba_image_post_surface(Image_Entry *ie)
269 RGBA_Image *im = (RGBA_Image *) ie;
271 if (im->pixman.im) pixman_image_unref(im->pixman.im);
272 if (im->cache_entry.flags.alpha)
274 im->pixman.im = pixman_image_create_bits
276 // FIXME: endianess determines this
279 im->cache_entry.w, im->cache_entry.h,
281 im->cache_entry.w * 4
286 im->pixman.im = pixman_image_create_bits
288 // FIXME: endianess determines this
291 im->cache_entry.w, im->cache_entry.h,
293 im->cache_entry.w * 4
302 _evas_common_rgba_image_surface_alloc(Image_Entry *ie, unsigned int w, unsigned int h)
304 RGBA_Image *im = (RGBA_Image *) ie;
308 if (ie->data1) return 0;
310 if (im->image.no_free) return 0;
312 if (im->flags & RGBA_IMAGE_ALPHA_ONLY)
313 siz = w * h * sizeof(DATA8);
315 siz = w * h * sizeof(DATA32);
317 if (im->image.data) free(im->image.data);
318 im->image.data = malloc(siz);
319 if (!im->image.data) return -1;
322 # ifdef VALGRIND_MAKE_READABLE
323 VALGRIND_MAKE_READABLE(im->image.data, siz);
325 # ifdef VALGRIND_MAKE_MEM_DEFINED
326 VALGRIND_MAKE_MEM_DEFINED(im->image.data, siz);
330 _evas_common_rgba_image_post_surface(ie);
336 _evas_common_rgba_image_surface_delete(Image_Entry *ie)
338 RGBA_Image *im = (RGBA_Image *) ie;
343 pixman_image_unref(im->pixman.im);
344 im->pixman.im = NULL;
348 DBG("unload: [%p] %s %s", ie, ie->file, ie->key);
349 if ((im->cs.data) && (im->image.data))
351 if (im->cs.data != im->image.data)
353 if (!im->cs.no_free) free(im->cs.data);
356 else if (im->cs.data)
358 if (!im->cs.no_free) free(im->cs.data);
362 if (im->image.data && !im->image.no_free)
363 free(im->image.data);
366 evas_cserve_image_free(ie);
369 im->image.data = NULL;
372 #ifdef BUILD_ASYNC_PRELOAD
373 ie->flags.preload_done = 0;
375 ie->flags.loaded = 0;
376 evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
380 _evas_common_rgba_image_unload(Image_Entry *im)
382 // DBG("unload: [%p] %s %s", im, im->file, im->key);
383 evas_common_rgba_image_scalecache_dirty(im);
384 evas_common_rgba_image_unload(im);
388 _evas_common_rgba_image_dirty_region(Image_Entry* ie, unsigned int x __UNUSED__, unsigned int y __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__)
390 RGBA_Image *im = (RGBA_Image *) ie;
393 if (ie->data1) evas_cserve_image_free(ie);
395 im->flags |= RGBA_IMAGE_IS_DIRTY;
396 evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
399 /* Only called when references > 0. Need to provide a fresh copie of im. */
401 _evas_common_rgba_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
403 RGBA_Image *dst = (RGBA_Image *) ie_dst;
404 RGBA_Image *src = (RGBA_Image *) ie_src;
406 evas_common_rgba_image_scalecache_dirty((Image_Entry *)ie_src);
407 evas_common_rgba_image_scalecache_dirty(ie_dst);
408 evas_cache_image_load_data(&src->cache_entry);
409 if (_evas_common_rgba_image_surface_alloc(&dst->cache_entry,
410 src->cache_entry.w, src->cache_entry.h))
413 if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src);
419 if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src);
421 evas_common_image_colorspace_normalize(src);
422 evas_common_image_colorspace_normalize(dst);
423 /* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
424 /* evas_common_cpu_end_opt(); */
430 _evas_common_rgba_image_ram_usage(Image_Entry *ie)
432 RGBA_Image *im = (RGBA_Image *)ie;
433 int size = sizeof(struct _RGBA_Image);
435 if (ie->cache_key) size += strlen(ie->cache_key);
436 if (ie->file) size += strlen(ie->file);
437 if (ie->key) size += strlen(ie->key);
442 if ((!im->image.no_free) || (ie->data1))
444 if ((!im->image.no_free))
446 size += im->cache_entry.w * im->cache_entry.h * sizeof(DATA32);
448 size += evas_common_rgba_image_scalecache_usage_get(&im->cache_entry);
453 _evas_common_rgba_image_surface_pixels(Image_Entry *ie)
455 RGBA_Image *im = (RGBA_Image *) ie;
457 return im->image.data;
462 evas_common_image_surface_alpha_tiles_calc(RGBA_Surface *is, int tsize)
467 if (is->spans) return;
468 if (!is->im->cache_entry.flags.alpha) return;
469 /* FIXME: dont handle alpha only images yet */
470 if ((is->im->flags & RGBA_IMAGE_ALPHA_ONLY)) return;
471 if (tsize < 0) tsize = 0;
472 is->spans = calloc(1, sizeof(RGBA_Image_Span *) * is->h);
473 if (!is->spans) return;
475 for (y = 0; y < is->h; y++)
480 for (x = 0; x < is->w; x++)
489 is->spans[y] = eina_inlist_append(is->spans[y], sp);
495 if ((sp->v == 2) && (a != 255)) sp->v = 1;
502 sp = calloc(1, sizeof(RGBA_Image_Span));
509 sp = calloc(1, sizeof(RGBA_Image_Span));
519 is->spans[y] = eina_inlist_append(is->spans[y], sp);
527 /* evas_common_image_surface_dealloc(RGBA_Surface *is) */
529 /* if ((is->data) && (!is->no_free)) */
531 /* free(is->data); */
532 /* is->data = NULL; */
537 evas_common_image_create(unsigned int w, unsigned int h)
541 im = (RGBA_Image *) _evas_common_rgba_image_new();
542 if (!im) return NULL;
543 im->cache_entry.w = w;
544 im->cache_entry.h = h;
545 if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
547 _evas_common_rgba_image_delete(&im->cache_entry);
550 im->cache_entry.flags.cached = 0;
555 evas_common_image_alpha_create(unsigned int w, unsigned int h)
559 im = (RGBA_Image *) _evas_common_rgba_image_new();
560 if (!im) return NULL;
561 im->cache_entry.w = w;
562 im->cache_entry.h = h;
563 im->cache_entry.flags.alpha = 1;
564 if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
566 _evas_common_rgba_image_delete(&im->cache_entry);
569 im->cache_entry.flags.cached = 0;
574 evas_common_image_new(unsigned int w, unsigned int h, unsigned int alpha)
577 return evas_common_image_alpha_create(w, h);
578 return evas_common_image_create(w, h);
582 evas_common_image_colorspace_normalize(RGBA_Image *im)
584 if ((!im->cs.data) ||
585 ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY)))) return;
586 switch (im->cache_entry.space)
588 case EVAS_COLORSPACE_ARGB8888:
589 if (im->image.data != im->cs.data)
592 if (((Image_Entry *)im)->data1) evas_cserve_image_free(&im->cache_entry);
594 if (!im->image.no_free) free(im->image.data);
595 im->image.data = im->cs.data;
596 im->cs.no_free = im->image.no_free;
599 case EVAS_COLORSPACE_YCBCR422P601_PL:
600 #ifdef BUILD_CONVERT_YUV
601 if ((im->image.data) && (*((unsigned char **)im->cs.data)))
602 evas_common_convert_yuv_420p_601_rgba(im->cs.data, (DATA8*) im->image.data,
603 im->cache_entry.w, im->cache_entry.h);
606 case EVAS_COLORSPACE_YCBCR422601_PL:
607 #ifdef BUILD_CONVERT_YUV
608 if ((im->image.data) && (*((unsigned char **)im->cs.data)))
609 evas_common_convert_yuv_422_601_rgba(im->cs.data, (DATA8*) im->image.data,
610 im->cache_entry.w, im->cache_entry.h);
620 evas_common_image_colorspace_dirty(RGBA_Image *im)
623 evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
627 evas_common_image_set_cache(unsigned int size)
630 evas_cache_image_set(eci, size);
634 evas_common_image_get_cache(void)
636 return evas_cache_image_get(eci);
640 evas_common_load_image_from_file(const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error)
644 *error = EVAS_LOAD_ERROR_GENERIC;
647 return (RGBA_Image *) evas_cache_image_request(eci, file, key, lo, error);
651 evas_common_image_cache_free(void)
653 evas_common_image_set_cache(0);
656 EAPI Evas_Cache_Image*
657 evas_common_image_cache_get(void)
663 evas_common_image_line_buffer_obtain(int len)
665 if (len < 1) return NULL;
666 if (len < EVAS_RGBA_LINE_BUFFER_MIN_LEN)
667 len = EVAS_RGBA_LINE_BUFFER_MIN_LEN;
668 return evas_common_image_create(len, 1);
670 if (evas_rgba_line_buffer)
672 if (evas_rgba_line_buffer->image->w >= len)
673 return evas_rgba_line_buffer;
674 evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data, len * sizeof(DATA32));
675 if (!evas_rgba_line_buffer->image->data)
677 evas_common_image_free(evas_rgba_line_buffer);
678 evas_rgba_line_buffer = NULL;
681 evas_rgba_line_buffer->image->w = len;
682 return evas_rgba_line_buffer;
684 evas_rgba_line_buffer = evas_common_image_create(len, 1);
685 if (!evas_rgba_line_buffer) return NULL;
686 return evas_rgba_line_buffer;
691 evas_common_image_line_buffer_release(RGBA_Image *im)
693 _evas_common_rgba_image_delete(&im->cache_entry);
695 if (!evas_rgba_line_buffer) return;
696 if (EVAS_RGBA_LINE_BUFFER_MAX_LEN < evas_rgba_line_buffer->image->w)
698 evas_rgba_line_buffer->image->w = EVAS_RGBA_LINE_BUFFER_MAX_LEN;
699 evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data,
700 evas_rgba_line_buffer->image->w * sizeof(DATA32));
701 if (!evas_rgba_line_buffer->image->data)
703 evas_common_image_free(evas_rgba_line_buffer);
704 evas_rgba_line_buffer = NULL;
711 evas_common_image_line_buffer_free(RGBA_Image *im)
713 _evas_common_rgba_image_delete(&im->cache_entry);
715 if (!evas_rgba_line_buffer) return;
716 evas_common_image_free(evas_rgba_line_buffer);
717 evas_rgba_line_buffer = NULL;
722 evas_common_image_alpha_line_buffer_obtain(int len)
724 if (len < 1) return NULL;
725 if (len < EVAS_ALPHA_LINE_BUFFER_MIN_LEN)
726 len = EVAS_ALPHA_LINE_BUFFER_MIN_LEN;
727 return evas_common_image_alpha_create(len, 1);
729 if (evas_alpha_line_buffer)
731 if (evas_alpha_line_buffer->image->w >= len)
732 return evas_alpha_line_buffer;
733 evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data, len * sizeof(DATA8));
734 if (!evas_alpha_line_buffer->image->data)
736 evas_common_image_free(evas_alpha_line_buffer);
737 evas_alpha_line_buffer = NULL;
740 evas_alpha_line_buffer->image->w = len;
741 return evas_alpha_line_buffer;
743 evas_alpha_line_buffer = evas_common_image_alpha_create(len, 1);
744 return evas_alpha_line_buffer;
749 evas_common_image_alpha_line_buffer_release(RGBA_Image *im)
751 _evas_common_rgba_image_delete(&im->cache_entry);
753 if (!evas_alpha_line_buffer) return;
754 if (EVAS_ALPHA_LINE_BUFFER_MAX_LEN < evas_alpha_line_buffer->image->w)
756 evas_alpha_line_buffer->image->w = EVAS_ALPHA_LINE_BUFFER_MAX_LEN;
757 evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data,
758 evas_alpha_line_buffer->image->w * sizeof(DATA8));
759 if (!evas_alpha_line_buffer->image->data)
761 evas_common_image_free(evas_alpha_line_buffer);
762 evas_alpha_line_buffer = NULL;
769 evas_common_image_premul(Image_Entry *ie)
774 if (!evas_cache_image_pixels(ie)) return ;
775 if (!ie->flags.alpha) return;
777 nas = evas_common_convert_argb_premul(evas_cache_image_pixels(ie), ie->w * ie->h);
778 if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
779 ie->flags.alpha_sparse = 1;
783 evas_common_image_set_alpha_sparse(Image_Entry *ie)
789 if (!evas_cache_image_pixels(ie)) return ;
790 if (!ie->flags.alpha) return;
792 s = evas_cache_image_pixels(ie);
793 se = s + (ie->w * ie->h);
796 DATA32 p = *s & 0xff000000;
798 if (!p || (p == 0xff000000))
802 if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
803 ie->flags.alpha_sparse = 1;