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"
20 # include <memcheck.h>
23 static Evas_Cache_Image * eci = NULL;
24 static int reference = 0;
26 /* static RGBA_Image *evas_rgba_line_buffer = NULL; */
28 #define EVAS_RGBA_LINE_BUFFER_MIN_LEN 256
29 #define EVAS_RGBA_LINE_BUFFER_MAX_LEN 2048
31 /* static RGBA_Image *evas_alpha_line_buffer = NULL; */
33 #define EVAS_ALPHA_LINE_BUFFER_MIN_LEN 256
34 #define EVAS_ALPHA_LINE_BUFFER_MAX_LEN 2048
37 static Image_Entry *_evas_common_rgba_image_new(void);
38 static void _evas_common_rgba_image_delete(Image_Entry *ie);
40 static int _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h);
41 static void _evas_common_rgba_image_surface_delete(Image_Entry *ie);
42 static DATA32 *_evas_common_rgba_image_surface_pixels(Image_Entry *ie);
44 static void _evas_common_rgba_image_unload(Image_Entry *im);
46 static void _evas_common_rgba_image_dirty_region(Image_Entry *im, int x, int y, int w, int h);
48 static int _evas_common_rgba_image_ram_usage(Image_Entry *ie);
50 /* Only called when references > 0. Need to provide a fresh copie of im. */
51 /* The destination surface does have a surface, but no allocated pixel data. */
52 static int _evas_common_rgba_image_dirty(Image_Entry* dst, const Image_Entry* src);
56 _evas_common_rgba_image_debug(const char* context, Image_Entry *eim)
58 DBG("%p = [%s] {%s,%s} %i [%i|%i]", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h);
62 static const Evas_Cache_Image_Func _evas_common_image_func =
64 _evas_common_rgba_image_new,
65 _evas_common_rgba_image_delete,
66 _evas_common_rgba_image_surface_alloc,
67 _evas_common_rgba_image_surface_delete,
68 _evas_common_rgba_image_surface_pixels,
69 evas_common_load_rgba_image_module_from_file,
70 _evas_common_rgba_image_unload,
71 _evas_common_rgba_image_dirty_region,
72 _evas_common_rgba_image_dirty,
73 evas_common_rgba_image_size_set,
74 evas_common_rgba_image_from_copied_data,
75 evas_common_rgba_image_from_data,
76 evas_common_rgba_image_colorspace_set,
77 evas_common_load_rgba_image_data_from_file,
78 _evas_common_rgba_image_ram_usage,
79 /* _evas_common_rgba_image_debug */
84 evas_common_image_init(void)
87 eci = evas_cache_image_init(&_evas_common_image_func);
89 //// ERR("REF++=%i", reference);
91 #ifdef BUILD_LOADER_EET
94 evas_common_scalecache_init();
98 evas_common_image_shutdown(void)
100 if (--reference == 0)
102 //// printf("REF--=%i\n", reference);
103 // DISABLE for now - something wrong with cache shutdown freeing things
104 // still in use - rage_thumb segv's now.
106 // actually - i think i see it. cache ref goes to 0 (and thus gets freed)
107 // because in eng_setup() when a buffer changes size it is FIRST freed
108 // THEN allocated again - thus brignhjing ref to 0 then back to 1 immediately
109 // where it should stay at 1. - see evas_engine.c in the buffer enigne for
110 // example. eng_output_free() is called BEFORE _output_setup(). although this
111 // is only a SIGNE of the problem. we can patch this up with either freeing
112 // after the setup (so we just pt a ref of 2 then back to 1), or just
113 // evas_common_image_init() at the start and evas_common_image_shutdown()
114 // after it all. really ref 0 should only be reached when no more canvases
115 // with no more objects exist anywhere.
117 // ENABLE IT AGAIN, hope it is fixed. Gustavo @ January 22nd, 2009.
118 evas_cache_image_shutdown(eci);
122 #ifdef BUILD_LOADER_EET
125 evas_common_scalecache_shutdown();
129 evas_common_image_image_all_unload(void)
131 evas_common_rgba_image_scalecache_flush();
132 evas_cache_image_unload_all(eci);
136 _evas_common_rgba_image_new(void)
140 im = calloc(1, sizeof(RGBA_Image));
141 if (!im) return NULL;
142 im->flags = RGBA_IMAGE_NOTHING;
144 #ifdef EVAS_FRAME_QUEUING
147 pthread_cond_init(&(im->cond_fq_del), NULL);
150 evas_common_rgba_image_scalecache_init(&im->cache_entry);
151 return &im->cache_entry;
155 _evas_common_rgba_image_delete(Image_Entry *ie)
157 RGBA_Image *im = (RGBA_Image *) ie;
159 #ifdef BUILD_PIPE_RENDER
160 evas_common_pipe_free(im);
161 # ifdef EVAS_FRAME_QUEUING
164 pthread_cond_destroy(&(im->cond_fq_del));
167 evas_common_rgba_image_scalecache_shutdown(&im->cache_entry);
168 if (ie->info.module) evas_module_unref((Evas_Module *)ie->info.module);
169 /* memset the image to 0x99 because i recently saw a segv where an
170 * seemed to be used BUT its contents were wrong - it looks like it was
171 * overwritten by something from efreet - as there was an execute command
172 * for a command there and some other signs - but to make sure, I am
173 * going to empty this struct out in case this happens again so i know
174 * that something else is overwritign this struct - or not */
175 // memset(im, 0x99, sizeof(im));
177 if (ie->data1) evas_cserve_image_free(ie);
183 evas_common_rgba_image_free(Image_Entry *ie)
185 _evas_common_rgba_image_surface_delete(ie);
186 _evas_common_rgba_image_delete(ie);
190 evas_common_rgba_image_unload(Image_Entry *ie)
192 RGBA_Image *im = (RGBA_Image *) ie;
194 evas_cache_image_preload_cancel(ie, NULL);
196 if (!ie->flags.loaded) return;
197 if ((!ie->info.module) && (!ie->data1)) return;
198 if (!ie->file) return;
200 ie->flags.loaded = 0;
202 if ((im->cs.data) && (im->image.data))
204 if (im->cs.data != im->image.data)
206 if (!im->cs.no_free) free(im->cs.data);
209 else if (im->cs.data)
211 if (!im->cs.no_free) free(im->cs.data);
218 evas_cserve_image_useless(ie);
219 im->image.data = NULL;
226 if (im->image.data && !im->image.no_free)
227 free(im->image.data);
228 im->image.data = NULL;
234 _evas_common_rgba_image_surface_alloc(Image_Entry *ie, int w, int h)
236 RGBA_Image *im = (RGBA_Image *) ie;
240 if (ie->data1) return 0;
242 if (im->image.no_free) return 0;
244 if (im->flags & RGBA_IMAGE_ALPHA_ONLY)
245 siz = w * h * sizeof(DATA8);
247 siz = w * h * sizeof(DATA32);
249 if (im->image.data) free(im->image.data);
250 im->image.data = malloc(siz);
251 if (im->image.data == NULL) return -1;
254 # ifdef VALGRIND_MAKE_READABLE
255 VALGRIND_MAKE_READABLE(im->image.data, siz);
257 # ifdef VALGRIND_MAKE_MEM_DEFINED
258 VALGRIND_MAKE_MEM_DEFINED(im->image.data, siz);
267 _evas_common_rgba_image_surface_delete(Image_Entry *ie)
269 RGBA_Image *im = (RGBA_Image *) ie;
272 printf("unload: [%p] %s %s\n", ie, ie->file, ie->key);
273 if ((im->cs.data) && (im->image.data))
275 if (im->cs.data != im->image.data)
277 if (!im->cs.no_free) free(im->cs.data);
280 else if (im->cs.data)
282 if (!im->cs.no_free) free(im->cs.data);
286 if (im->image.data && !im->image.no_free)
287 free(im->image.data);
290 evas_cserve_image_free(ie);
292 im->image.data = NULL;
293 evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
297 _evas_common_rgba_image_unload(Image_Entry *im)
299 // printf("unload: [%p] %s %s\n", im, im->file, im->key);
300 evas_common_rgba_image_unload(im);
304 _evas_common_rgba_image_dirty_region(Image_Entry* ie, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__)
306 RGBA_Image *im = (RGBA_Image *) ie;
309 if (ie->data1) evas_cserve_image_free(ie);
311 im->flags |= RGBA_IMAGE_IS_DIRTY;
312 evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
315 /* Only called when references > 0. Need to provide a fresh copie of im. */
317 _evas_common_rgba_image_dirty(Image_Entry *ie_dst, const Image_Entry *ie_src)
319 RGBA_Image *dst = (RGBA_Image *) ie_dst;
320 RGBA_Image *src = (RGBA_Image *) ie_src;
322 evas_common_rgba_image_scalecache_dirty((Image_Entry *)ie_src);
323 evas_common_rgba_image_scalecache_dirty(ie_dst);
324 evas_cache_image_load_data(&src->cache_entry);
325 if (_evas_common_rgba_image_surface_alloc(&dst->cache_entry,
326 src->cache_entry.w, src->cache_entry.h))
329 if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src);
335 if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src);
337 evas_common_image_colorspace_normalize(src);
338 evas_common_image_colorspace_normalize(dst);
339 /* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */
340 /* evas_common_cpu_end_opt(); */
346 _evas_common_rgba_image_ram_usage(Image_Entry *ie)
348 RGBA_Image *im = (RGBA_Image *) ie;
351 // ram += sizeof(struct _RGBA_Image);
352 // if (im->info.real_file) ram += strlen(im->info.real_file);
353 // if (im->info.comment) ram += strlen(im->info.comment);
357 if ((!im->image.no_free) || (ie->data1))
359 if ((!im->image.no_free))
361 size += im->cache_entry.w * im->cache_entry.h * sizeof(DATA32);
363 size += evas_common_rgba_image_scalecache_usage_get(&im->cache_entry);
368 _evas_common_rgba_image_surface_pixels(Image_Entry *ie)
370 RGBA_Image *im = (RGBA_Image *) ie;
372 return im->image.data;
377 evas_common_image_surface_alpha_tiles_calc(RGBA_Surface *is, int tsize)
382 if (is->spans) return;
383 if (!is->im->cache_entry.flags.alpha) return;
384 /* FIXME: dont handle alpha only images yet */
385 if ((is->im->flags & RGBA_IMAGE_ALPHA_ONLY)) return;
386 if (tsize < 0) tsize = 0;
387 is->spans = calloc(1, sizeof(RGBA_Image_Span *) * is->h);
388 if (!is->spans) return;
390 for (y = 0; y < is->h; y++)
395 for (x = 0; x < is->w; x++)
404 is->spans[y] = eina_inlist_append(is->spans[y], sp);
410 if ((sp->v == 2) && (a != 255)) sp->v = 1;
417 sp = calloc(1, sizeof(RGBA_Image_Span));
424 sp = calloc(1, sizeof(RGBA_Image_Span));
434 is->spans[y] = eina_inlist_append(is->spans[y], sp);
442 /* evas_common_image_surface_dealloc(RGBA_Surface *is) */
444 /* if ((is->data) && (!is->no_free)) */
446 /* free(is->data); */
447 /* is->data = NULL; */
452 evas_common_image_create(int w, int h)
456 im = (RGBA_Image *) _evas_common_rgba_image_new();
457 if (!im) return NULL;
458 im->cache_entry.w = w;
459 im->cache_entry.h = h;
460 if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
462 _evas_common_rgba_image_delete(&im->cache_entry);
465 im->cache_entry.flags.cached = 0;
470 evas_common_image_alpha_create(int w, int h)
474 im = (RGBA_Image *) _evas_common_rgba_image_new();
475 if (!im) return NULL;
476 im->cache_entry.w = w;
477 im->cache_entry.h = h;
478 im->cache_entry.flags.alpha = 1;
479 if (_evas_common_rgba_image_surface_alloc(&im->cache_entry, w, h))
481 _evas_common_rgba_image_delete(&im->cache_entry);
484 im->cache_entry.flags.cached = 0;
489 evas_common_image_new(int w, int h, int alpha)
492 return evas_common_image_alpha_create(w, h);
493 return evas_common_image_create(w, h);
497 evas_common_image_colorspace_normalize(RGBA_Image *im)
499 if ((!im->cs.data) ||
500 ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY)))) return;
501 switch (im->cache_entry.space)
503 case EVAS_COLORSPACE_ARGB8888:
504 if (im->image.data != im->cs.data)
507 if (((Image_Entry *)im)->data1) evas_cserve_image_free(&im->cache_entry);
509 if (!im->image.no_free) free(im->image.data);
510 im->image.data = im->cs.data;
511 im->cs.no_free = im->image.no_free;
514 case EVAS_COLORSPACE_YCBCR422P601_PL:
515 #ifdef BUILD_CONVERT_YUV
516 if ((im->image.data) && (*((unsigned char **)im->cs.data)))
517 evas_common_convert_yuv_420p_601_rgba(im->cs.data, (DATA8*) im->image.data,
518 im->cache_entry.w, im->cache_entry.h);
528 evas_common_image_colorspace_dirty(RGBA_Image *im)
531 evas_common_rgba_image_scalecache_dirty(&im->cache_entry);
535 evas_common_image_set_cache(int size)
538 evas_cache_image_set(eci, size);
542 evas_common_image_get_cache(void)
544 return evas_cache_image_get(eci);
548 evas_common_load_image_from_file(const char *file, const char *key, RGBA_Image_Loadopts *lo, int *error)
552 *error = EVAS_LOAD_ERROR_GENERIC;
555 return (RGBA_Image *) evas_cache_image_request(eci, file, key, lo, error);
559 evas_common_image_cache_free(void)
561 evas_common_image_set_cache(0);
564 EAPI Evas_Cache_Image*
565 evas_common_image_cache_get(void)
571 evas_common_image_line_buffer_obtain(int len)
573 if (len < 1) return NULL;
574 if (len < EVAS_RGBA_LINE_BUFFER_MIN_LEN)
575 len = EVAS_RGBA_LINE_BUFFER_MIN_LEN;
576 return evas_common_image_create(len, 1);
578 if (evas_rgba_line_buffer)
580 if (evas_rgba_line_buffer->image->w >= len)
581 return evas_rgba_line_buffer;
582 evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data, len * sizeof(DATA32));
583 if (!evas_rgba_line_buffer->image->data)
585 evas_common_image_free(evas_rgba_line_buffer);
586 evas_rgba_line_buffer = NULL;
589 evas_rgba_line_buffer->image->w = len;
590 return evas_rgba_line_buffer;
592 evas_rgba_line_buffer = evas_common_image_create(len, 1);
593 if (!evas_rgba_line_buffer) return NULL;
594 return evas_rgba_line_buffer;
599 evas_common_image_line_buffer_release(RGBA_Image *im)
601 _evas_common_rgba_image_delete(&im->cache_entry);
603 if (!evas_rgba_line_buffer) return;
604 if (EVAS_RGBA_LINE_BUFFER_MAX_LEN < evas_rgba_line_buffer->image->w)
606 evas_rgba_line_buffer->image->w = EVAS_RGBA_LINE_BUFFER_MAX_LEN;
607 evas_rgba_line_buffer->image->data = (DATA32 *)realloc(evas_rgba_line_buffer->image->data,
608 evas_rgba_line_buffer->image->w * sizeof(DATA32));
609 if (!evas_rgba_line_buffer->image->data)
611 evas_common_image_free(evas_rgba_line_buffer);
612 evas_rgba_line_buffer = NULL;
619 evas_common_image_line_buffer_free(RGBA_Image *im)
621 _evas_common_rgba_image_delete(&im->cache_entry);
623 if (!evas_rgba_line_buffer) return;
624 evas_common_image_free(evas_rgba_line_buffer);
625 evas_rgba_line_buffer = NULL;
630 evas_common_image_alpha_line_buffer_obtain(int len)
632 if (len < 1) return NULL;
633 if (len < EVAS_ALPHA_LINE_BUFFER_MIN_LEN)
634 len = EVAS_ALPHA_LINE_BUFFER_MIN_LEN;
635 return evas_common_image_alpha_create(len, 1);
637 if (evas_alpha_line_buffer)
639 if (evas_alpha_line_buffer->image->w >= len)
640 return evas_alpha_line_buffer;
641 evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data, len * sizeof(DATA8));
642 if (!evas_alpha_line_buffer->image->data)
644 evas_common_image_free(evas_alpha_line_buffer);
645 evas_alpha_line_buffer = NULL;
648 evas_alpha_line_buffer->image->w = len;
649 return evas_alpha_line_buffer;
651 evas_alpha_line_buffer = evas_common_image_alpha_create(len, 1);
652 return evas_alpha_line_buffer;
657 evas_common_image_alpha_line_buffer_release(RGBA_Image *im)
659 _evas_common_rgba_image_delete(&im->cache_entry);
661 if (!evas_alpha_line_buffer) return;
662 if (EVAS_ALPHA_LINE_BUFFER_MAX_LEN < evas_alpha_line_buffer->image->w)
664 evas_alpha_line_buffer->image->w = EVAS_ALPHA_LINE_BUFFER_MAX_LEN;
665 evas_alpha_line_buffer->image->data = realloc(evas_alpha_line_buffer->image->data,
666 evas_alpha_line_buffer->image->w * sizeof(DATA8));
667 if (!evas_alpha_line_buffer->image->data)
669 evas_common_image_free(evas_alpha_line_buffer);
670 evas_alpha_line_buffer = NULL;
677 evas_common_image_premul(Image_Entry *ie)
682 if (!evas_cache_image_pixels(ie)) return ;
683 if (!ie->flags.alpha) return;
685 nas = evas_common_convert_argb_premul(evas_cache_image_pixels(ie), ie->w * ie->h);
686 if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
687 ie->flags.alpha_sparse = 1;
691 evas_common_image_set_alpha_sparse(Image_Entry *ie)
697 if (!evas_cache_image_pixels(ie)) return ;
698 if (!ie->flags.alpha) return;
700 s = evas_cache_image_pixels(ie);
701 se = s + (ie->w * ie->h);
704 DATA32 p = *s & 0xff000000;
706 if (!p || (p == 0xff000000))
710 if ((ALPHA_SPARSE_INV_FRACTION * nas) >= (ie->w * ie->h))
711 ie->flags.alpha_sparse = 1;