From 7b88f0d723dcce9731fe1c9d5fa0c3d141c00cca Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 20 Apr 2011 07:35:18 +0000 Subject: [PATCH] more fixme fixes of filter SVN revision: 58744 --- legacy/evas/src/lib/canvas/evas_filter.c | 214 ++++++++++++----------- 1 file changed, 111 insertions(+), 103 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_filter.c b/legacy/evas/src/lib/canvas/evas_filter.c index fb9926132e..37a7ac7adb 100644 --- a/legacy/evas/src/lib/canvas/evas_filter.c +++ b/legacy/evas/src/lib/canvas/evas_filter.c @@ -6,7 +6,7 @@ #include "evas_common.h" #include "evas_private.h" -#include "assert.h" +#include #ifdef BUILD_NEON # define BUILD_NEON0 1 @@ -70,8 +70,6 @@ static Eina_Bool greyscale_filter(Evas_Filter_Info*, RGBA_Image*, RGBA_Image*); static Eina_Bool brightness_filter(Evas_Filter_Info*, RGBA_Image*, RGBA_Image*); static Eina_Bool contrast_filter(Evas_Filter_Info *, RGBA_Image*, RGBA_Image*); -static Eina_Bool negation_filter_neon(Evas_Filter_Info *, RGBA_Image *src, RGBA_Image *); - struct filterinfo filterinfo[] = { /* None */ @@ -110,11 +108,13 @@ static struct fieldinfo greyfields[] = { "all", TYPE_FLOAT, offsetof(Evas_Filter_Info_GreyScale, b) }, { NULL, 0, 0 }, }; + static struct fieldinfo brightnessfields[] = { { "adjust", TYPE_FLOAT, offsetof(Evas_Filter_Info_Brightness, adjust) }, { NULL, 0, 0 }, }; + static struct fieldinfo contrastfields[] = { { "adjust", TYPE_FLOAT, offsetof(Evas_Filter_Info_Contrast, adjust) }, @@ -139,8 +139,9 @@ evas_object_filter_mode_set(Evas_Object *o, Evas_Filter_Mode mode) { Evas_Filter_Info *info; - // FIXME: do real magic check - if (!o) return EINA_FALSE; /* nash: do Magic check */ + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EINA_FALSE; + MAGIC_CHECK_END(); if (mode != EVAS_FILTER_MODE_OBJECT && mode != EVAS_FILTER_MODE_BELOW) return EINA_FALSE; @@ -161,8 +162,10 @@ evas_object_filter_mode_set(Evas_Object *o, Evas_Filter_Mode mode) EAPI Evas_Filter_Mode evas_object_filter_mode_get(Evas_Object *o) { - // FIXME: do real magic check - if (!o) return EVAS_FILTER_MODE_OBJECT; /* nash magic */ + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EVAS_FILTER_MODE_OBJECT; + MAGIC_CHECK_END(); + if (!o->filter) filter_alloc(o); if (!o->filter) return EVAS_FILTER_MODE_OBJECT; return o->filter->mode; @@ -174,8 +177,9 @@ evas_object_filter_set(Evas_Object *o, Evas_Filter filter) Evas_Filter_Info *info; struct filterinfo *finfo; - // FIXME: do real magic check - if (!o) return EINA_FALSE; /* nash: magic */ + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EINA_FALSE; + MAGIC_CHECK_END(); /* force filter to be signed: else gcc complains, but enums may always be * signed */ @@ -213,8 +217,11 @@ evas_object_filter_set(Evas_Object *o, Evas_Filter filter) EAPI Evas_Filter evas_object_filter_get(Evas_Object *o) { - // FIXME: do real magic check - if (!o || !o->filter) return EVAS_FILTER_NONE; + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EVAS_FILTER_NONE; + MAGIC_CHECK_END(); + + if (!o->filter) return EVAS_FILTER_NONE; return o->filter->filter; } @@ -226,14 +233,15 @@ evas_object_filter_param_set_int(Evas_Object *o, const char *param, int val) Eina_Bool found; int i; - // FIXME: do real magic check - if (!o || !o->filter || !o->filter->data) return EINA_FALSE; + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EINA_FALSE; + MAGIC_CHECK_END(); + + if ((!o->filter) || (!o->filter->data)) return EINA_FALSE; fields = filterfields[o->filter->filter]; data = o->filter->data; - - found = EINA_FALSE; - + found = EINA_FALSE; for (i = 0; fields[i].field; i++) { if (!strcmp(fields[i].field, param)) @@ -256,8 +264,11 @@ evas_object_filter_param_get_int(Evas_Object *o, const char *param) int val; int i; - // FIXME: do real magic check - if (!o || !o->filter || !o->filter->data) return -1; + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EINA_FALSE; + MAGIC_CHECK_END(); + + if ((!o->filter) || (!o->filter->data)) return -1; fields = blurfields; data = o->filter->data; @@ -271,7 +282,6 @@ evas_object_filter_param_get_int(Evas_Object *o, const char *param) return val; } } - return -1; } @@ -300,8 +310,11 @@ evas_object_filter_param_set_float(Evas_Object *o, const char *param, int i; Eina_Bool rv; - // FIXME: do real magic check - if (!o || !o->filter || !o->filter->data) return EINA_FALSE; + MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ); + return EINA_FALSE; + MAGIC_CHECK_END(); + + if ((!o->filter) || (!o->filter->data)) return EINA_FALSE; rv = EINA_FALSE; fields = blurfields; @@ -386,7 +399,8 @@ evas_filter_key_get(const Evas_Filter_Info *info, uint32_t *lenp) static int -blur_size_get(Evas_Filter_Info *info, int inw, int inh, int *outw, int *outh, Eina_Bool inv) +blur_size_get(Evas_Filter_Info *info, int inw, int inh, int *outw, int *outh, + Eina_Bool inv) { Evas_Filter_Info_Blur *blur = info->data; @@ -421,7 +435,7 @@ gaussian_key_get(const Evas_Filter_Info *info, uint32_t *lenp) struct Evas_Filter_Info_Blur *blur; uint8_t *key; - if (!info || !info->data) return NULL; + if ((!info) || (!info->data)) return NULL; blur = info->data; if (lenp) *lenp = 4; @@ -450,6 +464,7 @@ filter_alloc(Evas_Object *o) Evas_Filter_Info *info; if (!o) return NULL; + // FIXME: handle alloc failure info = calloc(1,sizeof(struct Evas_Filter_Info)); info->dirty = 1; info->filter = EVAS_FILTER_NONE; @@ -482,18 +497,18 @@ filter_alloc(Evas_Object *o) typedef int (*FilterH)(int, uint32_t *, int, uint32_t *); typedef int (*FilterV)(int, uint32_t *, int, int, uint32_t *); -int gaussian_filter_h(int rad, uint32_t *in, int w, uint32_t *out); -int gaussian_filter_h64(int rad, uint32_t *in, int w, uint32_t *out); -int gaussian_filter_hd(int rad, uint32_t *in, int w, uint32_t *out); -int gaussian_filter_v(int rad, uint32_t *in, int h, int skip, uint32_t *out); -int gaussian_filter_v64(int rad, uint32_t *in, int h, int skip, uint32_t *out); -int gaussian_filter_vd(int rad, uint32_t *in, int h, int skip, uint32_t *out); -const uint32_t *gaussian_row_get(int row, int *npoints, uint32_t *weight); -const uint64_t *gaussian_row_get64(int row, int *npoints, uint64_t *weight); -const double *gaussian_row_getd(int row, int *npoints, double *weight); -// FIXME: why not static? -Eina_Bool +static int gaussian_filter_h(int rad, uint32_t *in, int w, uint32_t *out); +static int gaussian_filter_h64(int rad, uint32_t *in, int w, uint32_t *out); +static int gaussian_filter_hd(int rad, uint32_t *in, int w, uint32_t *out); +static int gaussian_filter_v(int rad, uint32_t *in, int h, int skip, uint32_t *out); +static int gaussian_filter_v64(int rad, uint32_t *in, int h, int skip, uint32_t *out); +static int gaussian_filter_vd(int rad, uint32_t *in, int h, int skip, uint32_t *out); +static const uint32_t *gaussian_row_get(int row, int *npoints, uint32_t *weight); +static const uint64_t *gaussian_row_get64(int row, int *npoints, uint64_t *weight); +static const double *gaussian_row_getd(int row, int *npoints, double *weight); + +static Eina_Bool gaussian_filter(Evas_Filter_Info *filter, RGBA_Image *src, RGBA_Image *dst) { int i; @@ -544,8 +559,7 @@ gaussian_filter(Evas_Filter_Info *filter, RGBA_Image *src, RGBA_Image *dst) } /* Blur only horizontally */ -// FIXME: why not static? -int +static int gaussian_filter_h(int rad, uint32_t *in, int w, uint32_t *out) { const uint32_t *points; @@ -577,8 +591,7 @@ gaussian_filter_h(int rad, uint32_t *in, int w, uint32_t *out) } /* Blur only horizontally */ -// FIXME: why not static? -int +static int gaussian_filter_hd(int rad, uint32_t *in, int w, uint32_t *out) { const double *points; @@ -611,8 +624,7 @@ gaussian_filter_hd(int rad, uint32_t *in, int w, uint32_t *out) /* Blur only horizontally */ -// FIXME: why not static? -int +static int gaussian_filter_h64(int rad, uint32_t *in, int w, uint32_t *out) { const uint64_t *points; @@ -641,8 +653,7 @@ gaussian_filter_h64(int rad, uint32_t *in, int w, uint32_t *out) return 0; } -// FIXME: why not static? -int +static int gaussian_filter_v(int rad, uint32_t *in, int h, int skip, uint32_t *out) { const uint32_t *points; @@ -676,8 +687,7 @@ gaussian_filter_v(int rad, uint32_t *in, int h, int skip, uint32_t *out) return 0; } -// FIXME: why not static? -int +static int gaussian_filter_v64(int rad, uint32_t *in, int h, int skip, uint32_t *out) { const uint64_t *points; @@ -711,8 +721,7 @@ gaussian_filter_v64(int rad, uint32_t *in, int h, int skip, uint32_t *out) return 0; } -// FIXME: why not static? -int +static int gaussian_filter_vd(int rad, uint32_t *in, int h, int skip, uint32_t *out) { const double *points; @@ -746,8 +755,7 @@ gaussian_filter_vd(int rad, uint32_t *in, int h, int skip, uint32_t *out) return 0; } -// FIXME: why not static? -const uint32_t * +static const uint32_t * gaussian_row_get(int row, int *npoints, uint32_t *weight) { static uint32_t *points = NULL; @@ -786,8 +794,7 @@ gaussian_row_get(int row, int *npoints, uint32_t *weight) return points; } -// FIXME: why not static? -const uint64_t * +static const uint64_t * gaussian_row_get64(int row, int *npoints, uint64_t *weight) { static uint64_t *points = NULL; @@ -827,8 +834,7 @@ gaussian_row_get64(int row, int *npoints, uint64_t *weight) return points; } -// FIXME: why not static? -const double * +static const double * gaussian_row_getd(int row, int *npoints, double *weight) { static double *points = NULL; @@ -869,58 +875,10 @@ gaussian_row_getd(int row, int *npoints, double *weight) return points; } -static Eina_Bool -negation_filter(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst) -{ - uint32_t *in, *out; - int i,j; - int w,h; - uint32_t mask,a; - - // FIXME: dont call if img has alpha - if (BUILD_NEON0 && evas_common_cpu_has_feature(CPU_FEATURE_NEON)) - return negation_filter_neon(info, src, dst); - - in = src->image.data; - out = dst->image.data; - w = src->cache_entry.w; - h = src->cache_entry.h; - - if (src->cache_entry.flags.alpha) - { - for (i = 0; i < h; i++) - { - for (j = 0; j < w; j++) - { - a = (*in >> 24) & 0xff; - mask = a | (a << 8) | (a << 16); - // FIXME: use *out = ARGB_JOIN(a, r, g, b); - *out = (mask - (*in & 0xffffff)) | (a << 24); - out++; - in++; - } - } - } - else - { - for (i = 0; i < h; i++) - { - for (j = 0; j < w; j++) - { - // FIXME: use *out = ARGB_JOIN(a, r, g, b); - *out = ~(*in & ~0xff000000) | ((*in) & 0xff000000); - out++; - in++; - } - } - } - return EINA_TRUE; -} - +#if BUILD_NEON0 static Eina_Bool negation_filter_neon(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst) { -#if BUILD_NEON0 uint32_t tmp; if (src->cache_entry.flags.alpha) @@ -971,9 +929,59 @@ negation_filter_neon(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst) ); #undef AP } -#endif return EINA_TRUE; - info = NULL; src = NULL; dst = NULL; +} +#endif + +static Eina_Bool +negation_filter(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst) +{ + uint32_t *in, *out; + int i,j; + int w,h; + uint32_t mask,a; + +#if BUILD_NEON0 + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON) && + (!src->cache_entry.flags.alpha)) + return negation_filter_neon(info, src, dst); +#endif + + in = src->image.data; + out = dst->image.data; + w = src->cache_entry.w; + h = src->cache_entry.h; + + if (src->cache_entry.flags.alpha) + { + for (i = 0; i < h; i++) + { + for (j = 0; j < w; j++) + { + a = (*in >> 24) & 0xff; + mask = a | (a << 8) | (a << 16); + // FIXME: use *out = ARGB_JOIN(a, r, g, b); + *out = (mask - (*in & 0xffffff)) | (a << 24); + out++; + in++; + } + } + } + else + { + for (i = 0; i < h; i++) + { + for (j = 0; j < w; j++) + { + // FIXME: use *out = ARGB_JOIN(a, r, g, b); + *out = ~(*in & ~0xff000000) | ((*in) & 0xff000000); + out++; + in++; + } + } + } + return EINA_TRUE; + info = NULL; } static Eina_Bool