diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c index dd5668c69b..aac4e6e059 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c @@ -97,7 +97,7 @@ evas_gl_common_context_use(Evas_GL_Context *gc) void evas_gl_common_context_resize(Evas_GL_Context *gc, int w, int h) { - if ((gc->w == w) && (gc->h == h)) return; + //if ((gc->w == w) && (gc->h == h)) return; gc->change.size = 1; gc->w = w; gc->h = h; diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_image.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_image.c index d3f97dae36..0ec490972a 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_image.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_image.c @@ -140,6 +140,7 @@ evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, int im->im->image->data = NULL; if (im->tex) evas_gl_common_texture_free(im->tex); im->tex = NULL; + im->cs.no_free = 0; im->cs.data = calloc(1, im->im->image->h * sizeof(unsigned char *) * 2); if ((data) && (im->cs.data)) memcpy(im->cs.data, data, im->im->image->h * sizeof(unsigned char *) * 2); @@ -254,10 +255,20 @@ evas_gl_common_image_draw(Evas_GL_Context *gc, Evas_GL_Image *im, int sx, int sy if (!im->tex) return; ow = (dw * im->tex->tw) / sw; oh = (dh * im->tex->th) / sh; - tx1 = (double)(sx ) / (double)(im->tex->w); - ty1 = (double)(sy ) / (double)(im->tex->h); - tx2 = (double)(sx + sw) / (double)(im->tex->w); - ty2 = (double)(sy + sh) / (double)(im->tex->h); + if (im->tex->rectangle) + { + tx1 = sx; + ty1 = sy; + tx2 = sx + sw; + ty2 = sy + sh; + } + else + { + tx1 = (double)(sx ) / (double)(im->tex->w); + ty1 = (double)(sy ) / (double)(im->tex->h); + tx2 = (double)(sx + sw) / (double)(im->tex->w); + ty2 = (double)(sy + sh) / (double)(im->tex->h); + } evas_gl_common_context_texture_set(gc, im->tex, smooth, ow, oh); break; default: diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c index a88a66b297..1a4621c87a 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c @@ -419,8 +419,9 @@ evas_gl_common_ycbcr601pl_texture_new(Evas_GL_Context *gc, unsigned char **rows, int im_w, im_h, tw, th, y; GLenum texfmt; GLhandleARB fshad; - - if (!gc->ext.arb_texture_non_power_of_two) return NULL; + +// on an nv 6600gt this is fast - but on a 5500fx its DEAD SLOW!!!!! +// if (!gc->ext.arb_texture_non_power_of_two) return NULL; tex = calloc(1, sizeof(Evas_GL_Texture)); if (!tex) return NULL; diff --git a/legacy/evas/src/modules/engines/gl_x11/evas_engine.c b/legacy/evas/src/modules/engines/gl_x11/evas_engine.c index 41a150878b..3cb81f18b4 100644 --- a/legacy/evas/src/modules/engines/gl_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/gl_x11/evas_engine.c @@ -150,6 +150,7 @@ eng_output_redraws_rect_add(void *data, int x, int y, int w, int h) Render_Engine *re; re = (Render_Engine *)data; + evas_gl_common_context_resize(re->win->gl_context, re->win->w, re->win->h); /* smple bounding box */ if (!re->win->draw.redraw) { @@ -747,9 +748,10 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) eng_image_colorspace_get(data, image)); if (!im_new) { - return im; *image_data = NULL; + return im; } + evas_gl_common_image_free(im); im = im_new; } else @@ -790,6 +792,7 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data) im2 = eng_image_new_from_data(data, w, h, image_data, eng_image_alpha_get(data, image), eng_image_colorspace_get(data, image)); + if (!im2) return im; evas_gl_common_image_free(im); im = im2; } diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c index d9141dbd00..29cc969a8a 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c @@ -462,6 +462,130 @@ eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int _xre_gradient_draw(surface, context, gradient, x, y, w, h); } +static int +eng_image_alpha_get(void *data, void *image) +{ + if (!image) return 0; + return _xre_image_alpha_get((XR_Image *)image); +} + +static int +eng_image_colorspace_get(void *data, void *image) +{ + if (!image) return EVAS_COLORSPACE_ARGB8888; + return ((XR_Image *)image)->cs.space; +} + +static void * +eng_image_alpha_set(void *data, void *image, int has_alpha) +{ + XR_Image *im; + + im = (XR_Image *)image; + if (!im) return im; + if (im->cs.space != EVAS_COLORSPACE_ARGB8888) return im; + if (((im->alpha) && (has_alpha)) || ((!im->alpha) && (!has_alpha))) + return im; + if (im->references > 1) + { + XR_Image *old_im; + + old_im = im; + im = _xre_image_copy(old_im); + if (im) + { + im->alpha = old_im->alpha; + _xre_image_free(old_im); + } + else + im = old_im; + } + else + _xre_image_dirty(im); + _xre_image_alpha_set(im, has_alpha); + return im; +} + +static void * +eng_image_border_set(void *data, void *image, int l, int r, int t, int b) +{ + if (!image) return image; + _xre_image_border_set((XR_Image *)image, l, r, t, b); + return image; +} + +static void +eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) +{ + if (!image) return; + _xre_image_border_get((XR_Image *)image, l, r, t, b); +} + +static const char * +eng_image_comment_get(void *data, void *image, char *key) +{ + if (!image) return NULL; + return ((XR_Image *)image)->comment; +} + +static char * +eng_image_format_get(void *data, void *image) +{ + if (!image) return NULL; + return ((XR_Image *)image)->format; +} + +static void +eng_image_colorspace_set(void *data, void *image, int cspace) +{ + XR_Image *im; + + if (!image) return; + im = (XR_Image *)image; + if (im->cs.space == cspace) return; + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + im->cs.data = NULL; + im->cs.no_free = 0; + } + if (im->im) evas_common_image_unref(im->im); + im->im = NULL; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (im->im) evas_common_image_unref(im->im); + im->im = NULL; + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = calloc(1, im->h * sizeof(unsigned char *) * 2); + im->cs.no_free = 0; + break; + default: + abort(); + break; + } + im->cs.space = cspace; + _xre_image_dirty(im); + _xre_image_region_dirty(im, 0, 0, im->w, im->h); +} + +static void +eng_image_native_set(void *data, void *image, void *native) +{ +} + +static void * +eng_image_native_get(void *data, void *image) +{ + return NULL; +} + static void * eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo) { @@ -514,29 +638,35 @@ eng_image_size_get(void *data, void *image, int *w, int *h) static void * eng_image_size_set(void *data, void *image, int w, int h) { - if (!image) return image; + XR_Image *im, *im_old; + + if (!image) return NULL; + im_old = image; + if ((im_old) && (im_old->w == w) && (im_old->h == h)) + return image; if ((w <= 0) || (h <= 0)) { _xre_image_free((XR_Image *)image); return NULL; } - if (((XR_Image *)image)->references > 1) + if (im_old) { - XR_Image *old_image; - - old_image = (XR_Image *)image; - image = _xre_image_copy((XR_Image *)old_image); - if (image) + if (im_old->references > 1) { - ((XR_Image *)image)->alpha = old_image->alpha; - _xre_image_free(old_image); + im = _xre_image_copy(im_old); + if (im) + { + _xre_image_free(im_old); + return im; + } + return image; } - else - image = old_image; } else - _xre_image_dirty((XR_Image *)image); - _xre_image_resize((XR_Image *)image, w, h); + { + _xre_image_dirty((XR_Image *)image); + _xre_image_resize((XR_Image *)image, w, h); + } return image; } @@ -552,115 +682,113 @@ eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h) static void * eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) { - if (!image) return image; - if (to_write) + XR_Image *im; + + if (!image) { - if (((XR_Image *)image)->references > 1) + *image_data = NULL; + return NULL; + } + im = (XR_Image *)image; + if (im->im) + evas_common_load_image_data_from_file(im->im); + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + if (to_write) { - XR_Image *old_image; - - old_image = (XR_Image *)image; - image = _xre_image_copy((XR_Image *)old_image); - if (image) + if (im->references > 1) { - ((XR_Image *)image)->alpha = old_image->alpha; - _xre_image_free(old_image); + XR_Image *im_old; + + im_old = im; + im = _xre_image_copy(im_old); + if (im) + _xre_image_free(im_old); + else + im = im_old; } else - image = old_image; + _xre_image_dirty(im); } - else - _xre_image_dirty((XR_Image *)image); + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + break; + default: + abort(); + break; } - if (image_data) *image_data = _xre_image_data_get((XR_Image *)image); - return image; + if (image_data) *image_data = _xre_image_data_get(im); + return im; } static void * eng_image_data_put(void *data, void *image, DATA32 *image_data) { + XR_Image *im; + if (!image) return image; - if (_xre_image_data_get((XR_Image *)image) != image_data) + im = (XR_Image *)image; + + switch (im->cs.space) { - XR_Image *old_image; - - old_image = (XR_Image *)image; - image = _xre_image_data_find(image_data); - if (image != old_image) + case EVAS_COLORSPACE_ARGB8888: + if (_xre_image_data_get(im) != image_data) { - if (!image) + XR_Image *im_old; + + im_old = im; + image = _xre_image_data_find(image_data); + if (image != im_old) { - image = _xre_image_new_from_data(old_image->xinf, old_image->w, old_image->h, image_data, old_image->alpha, EVAS_COLORSPACE_ARGB8888); - if (image) + if (!image) { - ((XR_Image *)image)->alpha = old_image->alpha; - _xre_image_free(old_image); + image = _xre_image_new_from_data(im_old->xinf, im_old->w, im_old->h, image_data, im_old->alpha, EVAS_COLORSPACE_ARGB8888); + if (image) + { + ((XR_Image *)image)->alpha = im_old->alpha; + _xre_image_free(im_old); + } + else + image = im_old; } else - image = old_image; + { + _xre_image_free(im_old); + } } else { - _xre_image_free(old_image); + _xre_image_free(image); + image = im_old; } } - else - { - _xre_image_free(image); + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + if (_xre_image_data_get(im) != image_data) + { + if (im->data) + { + if (im->free_data) free(im->data); + im->data = NULL; + } + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } + im->cs.data = image_data; + _xre_image_dirty(im); } + break; + default: + abort(); + break; } return image; } -static void * -eng_image_alpha_set(void *data, void *image, int has_alpha) -{ - if (!image) return image; - if (((((XR_Image *)image)->alpha) && (has_alpha)) || - ((!((XR_Image *)image)->alpha) && (!has_alpha))) - return image; - if (((XR_Image *)image)->references > 1) - { - XR_Image *old_image; - - old_image = (XR_Image *)image; - image = _xre_image_copy((XR_Image *)old_image); - if (image) - { - ((XR_Image *)image)->alpha = old_image->alpha; - _xre_image_free(old_image); - } - else - image = old_image; - } - else - _xre_image_dirty((XR_Image *)image); - _xre_image_alpha_set((XR_Image *)image, has_alpha); - return image; -} - -static int -eng_image_alpha_get(void *data, void *image) -{ - if (!image) return 0; - return _xre_image_alpha_get((XR_Image *)image); -} - -static void * -eng_image_border_set(void *data, void *image, int l, int r, int t, int b) -{ - if (!image) return image; - _xre_image_border_set((XR_Image *)image, l, r, t, b); - return image; -} - -static void -eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b) -{ - if (!image) return; - _xre_image_border_get((XR_Image *)image, l, r, t, b); -} - static void eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h, int smooth) { @@ -675,42 +803,6 @@ eng_image_draw(void *data, void *context, void *surface, void *image, int src_x, smooth); } -static const char * -eng_image_comment_get(void *data, void *image, char *key) -{ - if (!image) return NULL; - return ((XR_Image *)image)->comment; -} - -static char * -eng_image_format_get(void *data, void *image) -{ - if (!image) return NULL; - return ((XR_Image *)image)->format; -} - -static void -eng_image_colorspace_set(void *data, void *image, int cspace) -{ -} - -static int -eng_image_colorspace_get(void *data, void *image) -{ - return EVAS_COLORSPACE_ARGB8888; -} - -static void -eng_image_native_set(void *data, void *image, void *native) -{ -} - -static void * -eng_image_native_get(void *data, void *image) -{ - return NULL; -} - static void eng_image_cache_flush(void *data) { diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h index a99fca0d5b..40683e7483 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h @@ -100,6 +100,11 @@ struct _XR_Image const char *comment; Tilebuf *updates; RGBA_Image_Loadopts load_opts; + struct { + int space; + void *data; + unsigned char no_free : 1; + } cs; unsigned char alpha : 1; unsigned char dirty : 1; unsigned char free_data : 1; diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c index 8ae9b684cb..3ddd7e9864 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c @@ -102,6 +102,7 @@ _xre_image_load(Ximage_Info *xinf, const char *file, const char *key, Evas_Image } im->xinf = xinf; im->xinf->references++; + im->cs.space = EVAS_COLORSPACE_ARGB8888; im->fkey = strdup(buf); im->file = evas_stringshare_add(file); if (key) im->key = evas_stringshare_add(key); @@ -125,11 +126,25 @@ _xre_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data, int alpha, if (!im) return NULL; im->xinf = xinf; im->xinf->references++; + im->cs.space = cspace; im->w = w; im->h = h; im->references = 1; - im->data = data; - im->alpha = alpha; + switch (im->cs.space) + { + case EVAS_COLORSPACE_ARGB8888: + im->data = data; + im->alpha = alpha; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + im->cs.data = data; + im->cs.no_free = 1; + break; + default: + abort(); + break; + } im->dirty = 1; __xre_image_dirty_hash_add(im); return im; @@ -142,27 +157,43 @@ _xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data, int im = calloc(1, sizeof(XR_Image)); if (!im) return NULL; - im->data = malloc(w * h * 4); - if (!im->data) + im->cs.space = cspace; + switch (im->cs.space) { - free(im); - return NULL; - } - if (data) - { - Gfx_Func_Copy func; - - func = evas_common_draw_func_copy_get(w * h, 0); - if (func) func(data, im->data, w * h); - evas_common_cpu_end_opt(); + case EVAS_COLORSPACE_ARGB8888: + im->data = malloc(w * h * 4); + if (!im->data) + { + free(im); + return NULL; + } + if (data) + { + Gfx_Func_Copy func; + + func = evas_common_draw_func_copy_get(w * h, 0); + if (func) func(data, im->data, w * h); + evas_common_cpu_end_opt(); + } + im->alpha = alpha; + im->free_data = 1; + break; + case EVAS_COLORSPACE_YCBCR422P601_PL: + case EVAS_COLORSPACE_YCBCR422P709_PL: + im->cs.no_free = 0; + im->cs.data = calloc(1, h * sizeof(unsigned char *) * 2); + if ((data) && (im->cs.data)) + memcpy(im->cs.data, data, h * sizeof(unsigned char *) * 2); + break; + default: + abort(); + break; } im->w = w; im->h = h; im->references = 1; im->xinf = xinf; im->xinf->references++; - im->free_data = 1; - im->alpha = alpha; im->dirty = 1; __xre_image_dirty_hash_add(im); return im; @@ -184,6 +215,7 @@ _xre_image_new(Ximage_Info *xinf, int w, int h) im->w = w; im->h = h; im->references = 1; + im->cs.space = EVAS_COLORSPACE_ARGB8888; im->xinf = xinf; im->xinf->references++; im->free_data = 1; @@ -196,6 +228,10 @@ _xre_image_new(Ximage_Info *xinf, int w, int h) static void __xre_image_real_free(XR_Image *im) { + if (im->cs.data) + { + if (!im->cs.no_free) free(im->cs.data); + } if (im->file) evas_stringshare_del(im->file); if (im->key) evas_stringshare_del(im->key); if (im->fkey) free(im->fkey); @@ -257,6 +293,7 @@ _xre_image_copy(XR_Image *im) XR_Image *im2; void *data = NULL; + /* FIXME: colorspace support */ if (im->data) data = im->data; else { @@ -281,6 +318,7 @@ _xre_image_copy(XR_Image *im) void _xre_image_resize(XR_Image *im, int w, int h) { + /* FIXME: colorspace support */ /* FIXME: ... */ if ((w == im->w) && (h == im->h)) return; if (im->surface) @@ -389,6 +427,7 @@ _xre_image_data_get(XR_Image *im) { void *data = NULL; + /* FIXME: colorspace support */ if (im->data) data = im->data; else { @@ -420,6 +459,7 @@ _xre_image_data_put(XR_Image *im, void *data) { void *imdata = NULL; + /* FIXME: colorspace support */ if (!data) return; if (im->data) { @@ -462,6 +502,7 @@ _xre_image_data_put(XR_Image *im, void *data) void _xre_image_alpha_set(XR_Image *im, int alpha) { + /* FIXME: colorspace support */ if (im->alpha == alpha) return; im->alpha = alpha; if (im->surface) @@ -488,6 +529,10 @@ _xre_image_alpha_set(XR_Image *im, int alpha) int _xre_image_alpha_get(XR_Image *im) { + if (im->im) + { + if (im->im->cs.space != EVAS_COLORSPACE_ARGB8888) return 0; + } return im->alpha; } @@ -519,6 +564,7 @@ _xre_image_surface_gen(XR_Image *im) { void *data = NULL; + /* FIXME: colorspace support */ if ((im->surface) && (!im->updates)) return; if (im->data) data = im->data; else