lib/evas/canvas/evas_data.c \
lib/evas/canvas/evas_device.c \
lib/evas/canvas/evas_events.c \
-lib/evas/canvas/evas_filter.c \
lib/evas/canvas/evas_focus.c \
lib/evas/canvas/evas_key.c \
lib/evas/canvas/evas_key_grab.c \
modules/evas/engines/gl_common/evas_gl_font.c \
modules/evas/engines/gl_common/evas_gl_polygon.c \
modules/evas/engines/gl_common/evas_gl_line.c \
-modules/evas/engines/gl_common/evas_gl_filter.c \
modules/evas/engines/gl_common/evas_gl_core.c \
modules/evas/engines/gl_common/evas_gl_api_ext.h \
modules/evas/engines/gl_common/evas_gl_api_ext_def.h \
modules/evas/engines/gl_common/shader/tex_vert.h \
modules/evas/engines/gl_common/shader/tex_nomul_frag.h \
modules/evas/engines/gl_common/shader/tex_nomul_vert.h \
-modules/evas/engines/gl_common/shader/filter_invert.h \
-modules/evas/engines/gl_common/shader/filter_invert_nomul.h \
-modules/evas/engines/gl_common/shader/filter_invert_bgra.h \
-modules/evas/engines/gl_common/shader/filter_invert_bgra_nomul.h \
-modules/evas/engines/gl_common/shader/filter_sepia.h \
-modules/evas/engines/gl_common/shader/filter_sepia_nomul.h \
-modules/evas/engines/gl_common/shader/filter_sepia_bgra.h \
-modules/evas/engines/gl_common/shader/filter_sepia_bgra_nomul.h \
-modules/evas/engines/gl_common/shader/filter_greyscale.h \
-modules/evas/engines/gl_common/shader/filter_greyscale_nomul.h \
-modules/evas/engines/gl_common/shader/filter_greyscale_bgra.h \
-modules/evas/engines/gl_common/shader/filter_greyscale_bgra_nomul.h \
-modules/evas/engines/gl_common/shader/filter_blur.h \
-modules/evas/engines/gl_common/shader/filter_blur_nomul.h \
-modules/evas/engines/gl_common/shader/filter_blur_bgra.h \
-modules/evas/engines/gl_common/shader/filter_blur_bgra_nomul.h \
modules/evas/engines/gl_common/shader/yuy2_frag.h \
modules/evas/engines/gl_common/shader/yuy2_vert.h \
modules/evas/engines/gl_common/shader/yuy2_nomul_frag.h \
modules/evas/engines/gl_common/shader/tex_vert.shd \
modules/evas/engines/gl_common/shader/tex_nomul_frag.shd \
modules/evas/engines/gl_common/shader/tex_nomul_vert.shd \
-modules/evas/engines/gl_common/shader/filter_invert.shd \
-modules/evas/engines/gl_common/shader/filter_invert_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_invert_bgra.shd \
-modules/evas/engines/gl_common/shader/filter_invert_bgra_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_greyscale.shd \
-modules/evas/engines/gl_common/shader/filter_greyscale_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_greyscale_bgra.shd \
-modules/evas/engines/gl_common/shader/filter_greyscale_bgra_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_sepia.shd \
-modules/evas/engines/gl_common/shader/filter_sepia_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_sepia_bgra.shd \
-modules/evas/engines/gl_common/shader/filter_sepia_bgra_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_blur.shd \
-modules/evas/engines/gl_common/shader/filter_blur_nomul.shd \
-modules/evas/engines/gl_common/shader/filter_blur_bgra.shd \
-modules/evas/engines/gl_common/shader/filter_blur_bgra_nomul.shd \
modules/evas/engines/gl_common/shader/nv12_frag.h \
modules/evas/engines/gl_common/shader/nv12_frag.shd \
modules/evas/engines/gl_common/shader/nv12_nomul_frag.h \
+++ /dev/null
-/*
- * Filter implementation for evas
- */
-
-#if 0 // filtering disabled
-typedef enum
-{
- /** Apply any filter effects to this object (Default) */
- EVAS_FILTER_MODE_OBJECT,
- /** Filter all objects beneath this object on the canvas */
- EVAS_FILTER_MODE_BELOW,
-} Evas_Filter_Mode;
-typedef enum
-{
- /** No filter: Default */
- EVAS_FILTER_NONE,
- /** A blur filter. Params are quality (float), and radius (int). */
- EVAS_FILTER_BLUR,
- /** Negates the colors of an image. Also called solarize */
- EVAS_FILTER_INVERT,
- EVAS_FILTER_SOLARIZE = EVAS_FILTER_INVERT,
- /** Makes a sepia version of the image. */
- EVAS_FILTER_SEPIA,
- /** Makes a greyscale version of the image. Params are 'red',
- * 'green', 'blue' (all floats) which must add to 1. The defaults are
- * 0.3, 0.59 and 0.11 which approximates human vision. Setting 'all'
- * sets rgb to the same value. */
- EVAS_FILTER_GREYSCALE,
- EVAS_FILTER_GRAYSCALE = EVAS_FILTER_GREYSCALE,
- /** Brighten (or darken) image. Param 'adjust' float (-1.0 to 1.0)
- * amount to adjust. */
- EVAS_FILTER_BRIGHTNESS,
- /** Enhance contrast on image. Param 'adjust' float (-1.0 to 1.0)
- * amount to adjust. */
- EVAS_FILTER_CONTRAST,
-
- EVAS_FILTER_LAST = EVAS_FILTER_CONTRAST
-} Evas_Filter;
-
-/**
- * Set the filter mode for an object.
- *
- * There are two valid filtering modes currently:
- * - EVAS_FILTER_MODE_OBJECT: which applies the filter to the object itself
- * - EVAS_FILTER_MODE_BELOW: which makes the object invisible and filters
- * what is below the object.
- *
- * The default filter mode is EVAS_FILTER_MODE_OBJECT.
- *
- * @param o Object to set filter mode on.
- * @param mode Mode to set.
- * @return @c EINA_TRUE on success, @c EINA_FALSE otherwise.
- */
- EAPI Eina_Bool evas_object_filter_mode_set (Evas_Object *o, Evas_Filter_Mode mode);
-
-/**
- * Get the current filtering mode for an object.
- *
- * By default all objects are in object filtering mode, even if no filter is
- * set.
- *
- * @param o Object to get filter mode of.
- * @return Filter mode (default EVAS_FILTER_MODE_OBJECT)
- */
- EAPI Evas_Filter_Mode evas_object_filter_mode_get (Evas_Object *o);
-
-/**
- * Set the current filter type.
- *
- * This sets the filter type, whether a blur, color filter or some other type
- * of filter. This is normally the only filter call necessary, although some
- * filters require additional parameters.
- *
- * If the object has a filter already, and existing parameters will be
- * cleared.
- *
- * Setting the blur to EVAS_FILTER_NONE removes any filter.
- *
- * @param o Object to set the filter on.
- * @param filter Filter to set.
- * @return @c EINA_TRUE on success.
- */
- EAPI Eina_Bool evas_object_filter_set (Evas_Object *o, Evas_Filter filter);
-
-/**
- * Get the current filter.
- *
- * @param o Object to get filter of.
- * @return The filter if set, or EVAS_FILTER_NONE.
- */
- EAPI Evas_Filter evas_object_filter_get (Evas_Object *o);
-
-/**
- * Set an integer parameter of a filter.
- *
- * This sets an integer parameter of a filter, if such parameter is known to
- * the filter. Note that some parameters may actually set multiple fields.
- * The individual filters define the specific parameters available.
- *
- * It should be noted that filter parameters are lost after the filter type
- * changes, so set the filter type, then the parameters.
- *
- * @param o Object to set parameter on.
- * @param param Name of parameter to set.
- * @param val Value to set.
- * @return @c EINA_TRUE if at least one parameter was set, @c EINA_FALSE
- * otherwise.
- */
- EAPI Eina_Bool evas_object_filter_param_int_set (Evas_Object *o, const char *param, int val);
-
-/**
- * Get an integer value parameter from a filter.
- *
- * Gets the first matching parameter for a filter. Note there is no way to
- * later fields if they do not have their own accessor name.
- *
- * Also note that there is no way to tell the difference between a -1 as a
- * value, and the error code. Ask your filter writer to use a different
- * range.
- *
- * @param o The object.
- * @Param param Name of the parameter to get.
- * @return The value, or -1 on error.
- */
- EAPI int evas_object_filter_param_int_get (Evas_Object *o, const char *param);
-
-/**
- * Set a string parameter on a filter
- *
- * Currently unimplemented as no filters use this yet
- */
- EAPI Eina_Bool evas_object_filter_param_str_set (Evas_Object *o, const char *param, const char *val);
-
-/**
- * Get a string parameter from a filter
- *
- * Currently unimplemented as no filters use this yet
- */
- EAPI const char *evas_object_filter_param_str_get (Evas_Object *o, const char *param);
-
-/**
- * Set an object parameter on a filter
- *
- * Currently unimplemented as no filters use this yet
- */
- EAPI Eina_Bool evas_object_filter_param_obj_set (Evas_Object *o, const char *param, Evas_Object *val);
-
-/**
- * get an object parameter from a filter
- *
- * Currently unimplemented as no filters use this yet
- */
- EAPI Evas_Object *evas_object_filter_param_obj_get (Evas_Object *o, const char *param);
-
-/**
- * Set a float parameter of a filter.
- *
- * This is the same as evas_object_filter_param_int_set(), but for floating
- * point values.
- *
- * @param o Object to set value on.
- * @param param Name of the parameter to set.
- * @param @c EINA_TRUE if at least one parameter was set, @c EINA_FALSE
- * otherwise.
- */
- EAPI Eina_Bool evas_object_filter_param_float_set(Evas_Object *o, const char *param, double val);
-
-/**
- * Get a float parameter of a filter.
- *
- * This is the same as evas_object_filter_param_int_get(), but for floating
- * point values.
- *
- * @param o Object to set value on.
- * @param param Name of the parameter to set.
- * @return The value, or -1 on error.
- */
- EAPI double evas_object_filter_param_float_get(Evas_Object *o, const char *param);
-
-#include <stddef.h> // offsetof
-
-#include "evas_common.h"
-#include "evas_private.h"
-
-#include <assert.h>
-/* disable neon - even after fixes:
- * Error: ARM register expected -- vdup.u32 q14,$0xff000000'
- * not going to fix now
-#ifdef BUILD_NEON
-# define BUILD_NEON0 1
-#else
-# define BUILD_NEON0 0
-#endif
-*/
-
-#define BUILD_NEON0 0
-
-typedef struct Evas_Filter_Info_Blur
-{
- double quality;
- int radius;
-} Evas_Filter_Info_Blur;
-
-typedef struct Evas_Filter_Info_GreyScale
-{
- double r,g,b;
-} Evas_Filter_Info_GreyScale;
-
-typedef struct Evas_Filter_Info_Brightness
-{
- double adjust;
-} Evas_Filter_Info_Brightness;
-
-typedef struct Evas_Filter_Info_Contrast
-{
- double adjust;
-} Evas_Filter_Info_Contrast;
-
-typedef int (*Filter_Size_FN)(Evas_Filter_Info *,int,int,int*,int*,Eina_Bool);
-typedef uint8_t *(*Key_FN)(const Evas_Filter_Info *, uint32_t *);
-
-struct fieldinfo
-{
- const char *field;
- int type;
- size_t offset;
-};
-
-struct filterinfo
-{
- Evas_Software_Filter_Fn filter;
- const size_t datasize;
- Filter_Size_FN sizefn;
- Key_FN keyfn;
- Eina_Bool alwaysalpha;
-};
-
-enum
-{
- TYPE_INT,
- TYPE_FLOAT
-};
-
-static int blur_size_get(Evas_Filter_Info*, int, int, int *, int *, Eina_Bool);
-static uint8_t *gaussian_key_get(const Evas_Filter_Info *, uint32_t *);
-
-static Eina_Bool gaussian_filter(Evas_Filter_Info *, RGBA_Image*, RGBA_Image*);
-static Eina_Bool negation_filter(Evas_Filter_Info *, RGBA_Image*, RGBA_Image*);
-static Eina_Bool sepia_filter(Evas_Filter_Info *, RGBA_Image*, RGBA_Image*);
-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*);
-
-struct filterinfo filterinfo[] =
-{
- /* None */
- { NULL, 0, NULL, NULL, EINA_FALSE},
- /* Blur */
- { gaussian_filter, sizeof(Evas_Filter_Info_Blur), blur_size_get, gaussian_key_get, EINA_TRUE },
- /* Negation */
- { negation_filter, 0, NULL, NULL, EINA_FALSE },
- /* Sepia */
- { sepia_filter, 0, NULL, NULL, EINA_FALSE },
- /* Greyscale */
- { greyscale_filter, sizeof(Evas_Filter_Info_GreyScale), NULL, NULL, EINA_FALSE },
- /* Brightness */
- { brightness_filter, sizeof(Evas_Filter_Info_Brightness), NULL, NULL, EINA_FALSE },
- /* Contrast */
- { contrast_filter, sizeof(Evas_Filter_Info_Contrast), NULL, NULL, EINA_FALSE},
-};
-
-
-static struct fieldinfo blurfields[] =
-{
- { "quality", TYPE_FLOAT, offsetof(Evas_Filter_Info_Blur, quality) },
- { "radius", TYPE_INT, offsetof(Evas_Filter_Info_Blur, radius) },
- { NULL, 0, 0 },
-};
-
-static struct fieldinfo greyfields[] =
-{
- { "red", TYPE_FLOAT, offsetof(Evas_Filter_Info_GreyScale, r) },
- { "green", TYPE_FLOAT, offsetof(Evas_Filter_Info_GreyScale, g) },
- { "blue", TYPE_FLOAT, offsetof(Evas_Filter_Info_GreyScale, b) },
-
- { "all", TYPE_FLOAT, offsetof(Evas_Filter_Info_GreyScale, r) },
- { "all", TYPE_FLOAT, offsetof(Evas_Filter_Info_GreyScale, g) },
- { "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) },
- { NULL, 0, 0 },
-};
-
-static struct fieldinfo *filterfields[] =
-{
- NULL,
- blurfields,
- NULL,
- NULL,
- greyfields,
- brightnessfields,
- contrastfields,
-};
-
-static Evas_Filter_Info *filter_alloc(Evas_Object *o);
-
-EAPI Eina_Bool
-evas_object_filter_mode_set(Evas_Object *o, Evas_Filter_Mode mode)
-{
- Evas_Filter_Info *info;
-
- 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;
-
- if (!o->filter)
- {
- filter_alloc(o);
- }
- if (!o->filter) return EINA_FALSE;
- info = o->filter;
-
- if (info->mode == mode) return EINA_TRUE; /* easy case */
- info->mode = mode;
- info->dirty = 1;
- return EINA_TRUE;
-}
-
-EAPI Evas_Filter_Mode
-evas_object_filter_mode_get(Evas_Object *o)
-{
- MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ);
- return EVAS_FILTER_MODE_OBJECT;
- MAGIC_CHECK_END();
-
- if (!o->filter) return EVAS_FILTER_MODE_OBJECT;
- return o->filter->mode;
-}
-
-EAPI Eina_Bool
-evas_object_filter_set(Evas_Object *o, Evas_Filter filter)
-{
- Evas_Filter_Info *info;
- struct filterinfo *finfo;
-
- 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 */
- if (((int)filter < (int)EVAS_FILTER_NONE) || (filter > EVAS_FILTER_LAST))
- return EINA_FALSE;
-
- /* Don't alloc on no-op */
- if (!o-filter && filter == EVAS_FILTER_NONE) return EINA_TRUE;
-
- if (!o->filter) filter_alloc(o);
- if (!o->filter) return EINA_FALSE;
-
- info = o->filter;
-
- if (info->filter == filter) return EINA_TRUE;
-
- finfo = filterinfo + filter;
- info->filter = filter;
- info->dirty = 1;
- if (info->data)
- {
- if (info->data_free)
- info->data_free(info->data);
- else
- free(info->data);
- }
- info->datalen = finfo->datasize;
- if (finfo->datasize)
- {
- info->data = calloc(1, finfo->datasize);
- if (!info->data)
- {
- o->filter = EVAS_FILTER_NONE;
- return EINA_FALSE;
- }
- }
- else
- info->data = NULL;
- info->data_free = NULL;
-
- return EINA_TRUE;
-}
-
-EAPI Evas_Filter
-evas_object_filter_get(Evas_Object *o)
-{
- 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;
-}
-
-EAPI Eina_Bool
-evas_object_filter_param_int_set(Evas_Object *o, const char *param, int val)
-{
- char *data;
- const struct fieldinfo *fields;
- Eina_Bool found;
- int i;
-
- 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;
- for (i = 0; fields[i].field; i++)
- {
- if (!strcmp(fields[i].field, param))
- {
- if (fields[i].type != TYPE_INT) continue;
- *(int *)(data + fields[i].offset) = val;
- o->filter->dirty = 1;
- evas_object_change(o);
- found = EINA_TRUE;
- }
- }
- return found;
-}
-
-EAPI int
-evas_object_filter_param_int_get(Evas_Object *o, const char *param)
-{
- char *data;
- const struct fieldinfo *fields;
- int val;
- int i;
-
- MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ);
- return -1;
- MAGIC_CHECK_END();
-
- if ((!o->filter) || (!o->filter->data)) return -1;
-
- fields = filterfields[o->filter->filter];
- if (!fields) return -1;
- data = o->filter->data;
-
- for (i = 0; fields[i].field; i++)
- {
- if (!strcmp(fields[i].field, param))
- {
- if (fields[i].type != TYPE_INT) continue;
- val = *(int *)(data + fields[i].offset);
- return val;
- }
- }
- return -1;
-}
-
-EAPI Eina_Bool
-evas_object_filter_param_str_set(Evas_Object *o EINA_UNUSED,
- const char *param EINA_UNUSED,
- const char *val EINA_UNUSED)
-{
- return EINA_FALSE;
-}
-
-EAPI const char *
-evas_object_filter_param_str_get(Evas_Object *o EINA_UNUSED,
- const char *param EINA_UNUSED)
-{
- return NULL;
-}
-
-EAPI Eina_Bool
-evas_object_filter_param_obj_set(Evas_Object *o EINA_UNUSED,
- const char *param EINA_UNUSED,
- Evas_Object *val EINA_UNUSED)
-{
- return EINA_FALSE;
-}
-
-EAPI Evas_Object *
-evas_object_filter_param_obj_get(Evas_Object *o EINA_UNUSED,
- const char *param EINA_UNUSED)
-{
- return NULL;
-}
-
-EAPI Eina_Bool
-evas_object_filter_param_float_set(Evas_Object *o, const char *param,
- double val)
-{
- char *data;
- const struct fieldinfo *fields;
- int i;
- Eina_Bool rv;
-
- 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 = filterfields[o->filter->filter];
- if (!fields) return EINA_FALSE;
-
- data = o->filter->data;
-
- for (i = 0; fields[i].field; i++)
- {
- if (!strcmp(fields[i].field, param))
- {
- if (fields[i].type != TYPE_FLOAT) continue;
- *(double *)(data + fields[i].offset) = val;
- o->filter->dirty = 1;
- o->changed = 1;
- evas_object_change(o);
- rv = EINA_TRUE;
- }
- }
- return rv;
-}
-
-EAPI double
-evas_object_filter_param_float_get(Evas_Object *o, const char *param)
-{
- char *data;
- const struct fieldinfo *fields;
- double val;
- int i;
-
- MAGIC_CHECK(o, Evas_Object, MAGIC_OBJ);
- return -1;
- MAGIC_CHECK_END();
-
- if ((!o->filter) || (!o->filter->data)) return -1;
-
- fields = filterfields[o->filter->filter];
- if (!fields) return -1;
- data = o->filter->data;
-
- for (i = 0; fields[i].field; i++)
- {
- if (!strcmp(fields[i].field, param))
- {
- if (fields[i].type != TYPE_FLOAT) continue;
- val = *(double *)(data + fields[i].offset);
- return val;
- }
- }
- return -1;
-}
-
-
-
-
-
-/*
- * Internal call
- */
-int
-evas_filter_get_size(Evas_Filter_Info *info, int inw, int inh,
- int *outw, int *outh, Eina_Bool inv)
-{
- if (!info) return -1;
- if ((!outw) && (!outh)) return 0;
-
- if (filterinfo[info->filter].sizefn)
- return filterinfo[info->filter].sizefn(info, inw, inh, outw, outh, inv);
-
- if (outw) *outw = inw;
- if (outh) *outh = inh;
- return 0;
-}
-
-Eina_Bool
-evas_filter_always_alpha(Evas_Filter_Info *info)
-{
- if (!info) return EINA_FALSE;
- return filterinfo[info->filter].alwaysalpha;
-}
-
-/*
- * Another internal call:
- * Given a filterinfo, generate a unique key for it
- *
- * For simple filters, it's just the filter type.
- * for more complex filters, it's the type, with it's params.
- *
- * Note management of the key data is up to the caller, that is it should
- * probably be freed after use.
- *
- * Note the automatic fallback generation places the single byte at the end so
- * the memcpy will be aligned. Micro-optimisations FTW!
- *
- * @param info Filter info to generate from
- * @param len Length of the buffer returned.
- * @return key Key buffer
- */
-uint8_t *
-evas_filter_key_get(const Evas_Filter_Info *info, uint32_t *lenp)
-{
- struct filterinfo *finfo;
- uint8_t *key;
- int len;
-
- if (!info) return NULL;
-
- finfo = filterinfo + info->filter;
- if (finfo->keyfn) return finfo->keyfn(info, lenp);
-
- len = 1 + finfo->datasize;
- key = malloc(len);
- if (!key) return NULL;
- if (finfo->datasize) memcpy(key, info->data, finfo->datasize);
- key[finfo->datasize] = info->filter;
- if (lenp) *lenp = len;
- return key;
-}
-
-Evas_Software_Filter_Fn
-evas_filter_software_get(Evas_Filter_Info *info)
-{
- return filterinfo[info->filter].filter;
-}
-
-void
-evas_filter_free(Evas_Object *o)
-{
- if (!o->filter) return;
- if (o->filter->key) free(o->filter->key);
- free(o->filter);
- o->filter = NULL;
-}
-
-
-
-
-/*
- * Private calls
- */
-static Evas_Filter_Info *
-filter_alloc(Evas_Object *o)
-{
- Evas_Filter_Info *info;
-
- if (!o) return NULL;
- info = calloc(1,sizeof(struct Evas_Filter_Info));
- if (!info) return NULL;
- info->dirty = 1;
- info->filter = EVAS_FILTER_NONE;
- info->mode = EVAS_FILTER_MODE_OBJECT;
- info->datalen = 0;
-
- o->filter = info;
-
- return info;
-}
-
-static int
-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;
-
- if (inv)
- {
- if (outw) *outw = MAX(inw - (blur->radius * 2), 0);
- if (outh) *outh = MAX(inh - (blur->radius * 2), 0);
- }
- else
- {
- if (outw) *outw = inw + (blur->radius * 2);
- if (outh) *outh = inh + (blur->radius * 2);
- }
- return 0;
-}
-
-/*
- * Generate a key for the Gaussian generator.
- *
- * The size is:
- * - 1 byte for the type (blur)
- * - 1 byte for the quality (0-1 -> 0-255)
- * - 2 bytes for radius (max is 508 anyway)
- *
- * @param info Filter info
- * @param len Length of the returned buffer
- * @return new buffer
- */
-static uint8_t *
-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;
- blur = info->data;
-
- if (lenp) *lenp = 4;
- key = malloc(4);
- if (!key) return NULL;
- key[0] = EVAS_FILTER_BLUR;
- key[1] = blur->quality * 255;
- key[2] = blur->radius >> 8;
- key[3] = blur->radius;
-
- return key;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/**
- * Software implementations
- */
-#define all(OP, A, R, G, B, W, I) \
- do { \
- A OP A_VAL(I) * W; \
- R OP R_VAL(I) * W; \
- G OP G_VAL(I) * W; \
- B OP B_VAL(I) * W; \
- } while (0)
-#define wavg(x,n) (((x) / (n)) & 0xff)
-#define wavgd(x,n) ((uint32_t)((x) / (n)) & 0xff)
-
-typedef int (*FilterH)(int, uint32_t *, int, uint32_t *);
-typedef int (*FilterV)(int, uint32_t *, int, int, uint32_t *);
-
-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;
- uint32_t nw, nh;
- uint32_t *in, *tmp, *out;
- FilterV filter_v = gaussian_filter_v;
- FilterH filter_h = gaussian_filter_h;
- Evas_Filter_Info_Blur *blur;
- int w, h;
-
- blur = filter->data;
-
- /* Use 64 bit version if we are going to overflow */
- if (blur->radius > 508) /** too big for doubles: Bail out */
- return EINA_FALSE;
- else if (blur->radius > 28)
- {
- filter_v = gaussian_filter_vd;
- filter_h = gaussian_filter_hd;
- }
- else if (blur->radius > 12)
- {
- filter_v = gaussian_filter_v64;
- filter_h = gaussian_filter_h64;
- }
-
- w = src->cache_entry.w;
- h = src->cache_entry.h;
- in = src->image.data;
-
- if (!in) return EINA_FALSE;
-
- nw = w + (2 * blur->radius);
- nh = h + (2 * blur->radius);
-
- out = dst->image.data;
- if (!out) return EINA_FALSE;
- tmp = malloc(nw * h * sizeof(uint32_t));
-
- for (i = 0; i < h; i++)
- filter_h(blur->radius,in + (i * w), w, tmp + (i * nw));
-
- for (i = 0; i < (int)nw; i++)
- filter_v(blur->radius,tmp + i, h, nw, out + i);
-
- free(tmp);
- return EINA_TRUE;
-}
-
-/* Blur only horizontally */
-static int
-gaussian_filter_h(int rad, uint32_t *in, int w, uint32_t *out)
-{
- const uint32_t *points;
- int npoints = 0;
- uint32_t weight = 0;
- int i = 0, k = 0;
- uint32_t r, g, b, a;
-
- /* Get twice the radius: even rows have 1 element */
- points = gaussian_row_get(rad * 2, &npoints, &weight);
- for (i = -rad; i < (w + rad); i++)
- {
- r = g = b = a = 0;
- for (k = -rad; k <= rad; k++)
- {
- if ((k + i) < 0) continue;
- if ((k + i) >= w) continue;
- all(+=, a, r, g, b, points[k + rad], in + k + i);
- }
- *(out) = ARGB_JOIN(wavg(a, weight),
- wavg(r, weight),
- wavg(g, weight),
- wavg(b, weight));
- out++;
- }
- return 0;
-}
-
-/* Blur only horizontally */
-static int
-gaussian_filter_hd(int rad, uint32_t *in, int w, uint32_t *out)
-{
- const double *points;
- int npoints = 0;
- double weight = 0.0;
- int i = 0, k = 0;
- double r, g, b, a;
-
- /* Get twice the radius: even rows have 1 element */
- points = gaussian_row_getd(rad * 2, &npoints, &weight);
- for (i = -rad; i < (w + rad); i++)
- {
- r = g = b = a = 0;
- for (k = -rad; k <= rad; k++)
- {
- if ((k + i) < 0) continue;
- if ((k + i) >= w) continue;
- all(+=, a, r, g, b, points[k + rad], in + k + i);
- }
- *(out) = ARGB_JOIN(wavgd(a, weight),
- wavgd(r, weight),
- wavgd(g, weight),
- wavgd(b, weight));
- out++;
- }
- return 0;
-}
-
-
-/* Blur only horizontally */
-static int
-gaussian_filter_h64(int rad, uint32_t *in, int w, uint32_t *out)
-{
- const uint64_t *points;
- int npoints = 0;
- uint64_t weight = 0;
- int i = 0, k = 0;
- uint64_t r, g, b, a;
-
- /* Get twice the radius: even rows have 1 element */
- points = gaussian_row_get64(rad * 2, &npoints, &weight);
- for (i = -rad ; i < w + rad; i ++){
- r = g = b = a = 0;
- for (k = -rad ; k <= rad ; k ++){
- if ((k + i) < 0) continue;
- if ((k + i) >= w) continue;
- all(+=, a, r, g, b, points[k + rad], in + k + i);
- }
- *(out) = ARGB_JOIN(wavg(a, weight),
- wavg(r, weight),
- wavg(g, weight),
- wavg(b, weight));
- out++;
- }
- return 0;
-}
-
-static int
-gaussian_filter_v(int rad, uint32_t *in, int h, int skip, uint32_t *out)
-{
- const uint32_t *points;
- int npoints = 0;
- uint32_t weight = 0;
- int i = 0, k = 0;
- uint32_t r, g, b, a;
-
- /* Get twice the radius: even rows have 1 element */
- points = gaussian_row_get(rad * 2, &npoints, &weight);
- weight = 0;
- for (i = 0; i < npoints; i++) weight += points[i];
-
- for (i = -rad; i < (h + rad); i++)
- {
- r = g = b = a = 0;
- for (k = -rad; k <= rad; k++)
- {
- if ((k + i) < 0) continue;
- if ((k + i) >= h) continue;
- all(+=, a, r, g, b, points[k + rad], in + (skip * (k + i)));
- }
- *(out) = ARGB_JOIN(wavg(a, weight),
- wavg(r, weight),
- wavg(g, weight),
- wavg(b, weight));
- out += skip;
- }
- return 0;
-}
-
-static int
-gaussian_filter_v64(int rad, uint32_t *in, int h, int skip, uint32_t *out)
-{
- const uint64_t *points;
- int npoints = 0;
- uint64_t weight;
- int i = 0, k = 0;
- uint64_t r, g, b, a;
-
- /* Get twice the radius: even rows have 1 element */
- points = gaussian_row_get64(rad * 2, &npoints, &weight);
- weight = 0;
- for (i = 0; i < npoints; i++) weight += points[i];
-
- for (i = -rad; i < (h + rad); i++)
- {
- r = g = b = a = 0;
- for (k = -rad ; k <= rad ; k++)
- {
- if ((k + i) < 0) continue;
- if ((k + i) >= h) continue;
- all(+=, a, r, g, b, points[k + rad], in + (skip * (k + i)));
- }
- *(out) = ARGB_JOIN(wavg(a, weight),
- wavg(r, weight),
- wavg(g, weight),
- wavg(b, weight));
- out += skip;
- }
- return 0;
-}
-
-static int
-gaussian_filter_vd(int rad, uint32_t *in, int h, int skip, uint32_t *out)
-{
- const double *points;
- int npoints = 0;
- double weight = 0.0;
- int i = 0, k = 0;
- double r, g, b, a;
-
- /* Get twice the radius: even rows have 1 element */
- points = gaussian_row_getd(rad * 2, &npoints, &weight);
- weight = 0;
- for (i = 0 ; i < npoints ; i ++) weight += points[i];
-
- for (i = -rad ; i < h + rad; i ++)
- {
- r = g = b = a = 0;
- for (k = -rad ; k <= rad ; k ++)
- {
- if ((k + i) < 0) continue;
- if ((k + i) >= h) continue;
- all(+=, a, r, g, b, points[k + rad], in + (skip * (k + i)));
- }
- *(out) = ARGB_JOIN(wavgd(a, weight),
- wavgd(r, weight),
- wavgd(g, weight),
- wavgd(b, weight));
- out += skip;
- }
- return 0;
-}
-
-static const uint32_t *
-gaussian_row_get(int row, int *npoints, uint32_t *weight)
-{
- static uint32_t *points = NULL;
- static int last = -1;
- static uint32_t lastweight = -1;
- int c, k;
-
- if (row < 0) return NULL;
-
- if (npoints) *npoints = row + 1;
-
- if (last == row)
- {
- if (weight) *weight = lastweight;
- return points;
- }
- if (points) free(points);
-
- points = malloc((row + 1) * sizeof(uint32_t));
- if (!points)
- {
- last = -1;
- return NULL;
- }
- last = row;
-
- c = 1;
- for (k = 0; k <= row; k++)
- {
- points[k] = c;
- c = c * (row - k) / (k + 1);
- }
-
- for (k = 0, lastweight = 0; k <= row; k++) lastweight += points[k];
- if (weight) *weight = lastweight;
- return points;
-}
-
-static const uint64_t *
-gaussian_row_get64(int row, int *npoints, uint64_t *weight)
-{
- static uint64_t *points = NULL;
- static int last = -1;
- static uint64_t lastweight = -1;
- uint64_t c;
- int k;
-
- if (row < 0) return NULL;
-
- if (npoints) *npoints = row + 1;
- if (last == row)
- {
- if (weight) *weight = lastweight;
- return points;
- }
- if (points) free(points);
-
- points = malloc((row + 1) * sizeof(uint64_t));
- if (!points)
- {
- last = -1;
- return NULL;
- }
- last = row;
-
- c = 1;
- for (k = 0; k <= row; k++)
- {
- points[k] = c;
- c = c * (row - k) / (k + 1);
- }
-
- for (k = 0, lastweight = 0; k <= row; k ++) lastweight += points[k];
- if (weight) *weight = lastweight;
-
- return points;
-}
-
-static const double *
-gaussian_row_getd(int row, int *npoints, double *weight)
-{
- static double *points = NULL;
- static int last = -1;
- static double lastweight = -1;
- double c;
- int k;
-
- if (row < 0) return NULL;
-
- if (last == row)
- {
- if (weight) *weight = lastweight;
- return points;
- }
-
- if (points) free(points);
- points = malloc((row + 1) * sizeof(double));
- if (!points)
- {
- last = -1;
- return NULL;
- }
- last = row;
-
- if (npoints) *npoints = row + 1;
-
- c = 1;
- for (k = 0; k <= row; k++)
- {
- points[k] = c;
- c = c * (row - k) / (k + 1);
- }
-
- for (k = 0, lastweight = 0; k <= row; k++) lastweight += points[k];
- if (weight) *weight = lastweight;
-
- return points;
-}
-
-#if BUILD_NEON0
-static Eina_Bool
-negation_filter_neon(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst)
-{
- uint32_t tmp;
-
- if (src->cache_entry.flags.alpha)
- {
- // FIXME: not implemented
- }
- else
- {
- /* No alpha */
-#define AP "NEG_FILTER_NA"
- asm volatile (
-
- ".fpu neon \n\t"
- "vdup.u32 q14, $0xff000000 \n\t"
- "vmvn.u32 q15, q1 \n\t"
-
- // fixme: do check for small loops
- AP"loopinit: \n\t"
- "sub %[tmp], %[e], #31 \n\t"
-
- AP"loop: \n\t"
- "vldm %[s]!, {d0,d1,d2,d3} \n\t"
- "vand q2, q0, q15 \n\t"
- "vand q3, q1, q15 \n\t"
- "vand q4, q0, q14 \n\t"
- "vand q5, q1, q14 \n\t"
- // fixme: can i do this with xor
- "cmp %[tmp], %[s] \n\t"
-
- "vmvn q6, q2 \n\t"
- "vmvn q7, q3 \n\t"
-
- "vorr q0, q6,q4 \n\t"
- "vorr q1, q7,q5 \n\t"
-
- "vstm %[d]!, {d0,d1,d2,d3} \n\t"
-
- "bhi "AP"loop \n\t"
-
- : // no out
- : // input
- [e] "r" (src->image.data+ src->cache_entry.w*src->cache_entry.h),
- [s] "r" (src->image.data),
- [tmp] "r" (tmp),
- [d] "r" (dst->image.data)
- : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q14", "q15",
- "memory"
- );
-#undef AP
- }
- return EINA_TRUE;
-}
-#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 a;
- uint8_t r,g,b;
-
-#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 = A_VAL(in);
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- *out = ARGB_JOIN(a, a - r, a - g, a - b);
- out++;
- in++;
- }
- }
- }
- else
- {
- for (i = 0; i < h; i++)
- {
- for (j = 0; j < w; j++)
- {
- a = A_VAL(in);
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- *out = ARGB_JOIN(a, ~r, ~g, ~b);
- out++;
- in++;
- }
- }
- }
- return EINA_TRUE;
- info = NULL;
-}
-
-static Eina_Bool
-sepia_filter(Evas_Filter_Info *info EINA_UNUSED, RGBA_Image *src, RGBA_Image *dst)
-{
- uint32_t *in, *out;
- int i, j;
- int w, h;
- uint32_t a, r, g, b, nr, ng, nb;
-
- in = src->image.data;
- out = dst->image.data;
- w = src->cache_entry.w;
- h = src->cache_entry.h;
-
- for (i = 0; i < h; i++)
- {
- for (j = 0; j < w; j++)
- {
- a = A_VAL(in);
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- nr = ((uint32_t)((r * 0.393) + (g * 0.769) + (b * 0.189)));
- ng = ((uint32_t)((r * 0.349) + (g * 0.686) + (b * 0.168)));
- nb = ((uint32_t)((r * 0.272) + (g * 0.534) + (b * 0.131)));
- if (nr > 255) nr = 255;
- if (ng > 255) ng = 255;
- if (nb > 255) nb = 255;
- *out = ARGB_JOIN(a, nr, ng, nb);
- out++;
- in++;
- }
- }
-
- return EINA_TRUE;
-
-}
-
-static Eina_Bool
-greyscale_filter(Evas_Filter_Info *info EINA_UNUSED, RGBA_Image *src, RGBA_Image *dst)
-{
- uint32_t *in, *out;
- int i, j;
- int w, h;
- uint32_t cur;
- uint32_t a, r, g, b;
-
- 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 = A_VAL(in);
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- cur = (r * 0.3) + (g * 0.59) + (b * 0.11);
- *out = ARGB_JOIN(a, r, g, b);
- out++;
- in++;
- }
- }
- }
- else
- {
- for (i = 0 ; i < h ; i ++)
- {
- for (j = 0; j < w ; j ++)
- {
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- cur = r * 0.3 + g * 0.59 + b * 0.11;
- *out = ARGB_JOIN(255, r, g, b);
- out++;
- in++;
- }
- }
- }
- return EINA_TRUE;
-}
-
-static Eina_Bool
-brightness_filter(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst)
-{
- uint32_t *in, *out;
- int i, j;
- int w, h;
- int a,r,g,b;
- int delta;
- int adjdelta;
- Evas_Filter_Info_Brightness *bness;
-
- in = src->image.data;
- out = dst->image.data;
- w = src->cache_entry.w;
- h = src->cache_entry.h;
- bness = info->data;
-
- delta = bness->adjust * 255;
- if (delta > 255)
- delta = 255;
- else if (delta < -255)
- delta = -255;
-
- /* Note we could optimise the -255, 0 and 255 cases, but why would people
- * be doing that */
- if (delta >= 0)
- {
- for (i = 0; i < h; i++)
- {
- for (j = 0; j < w; j++)
- {
- a = A_VAL(in);
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- adjdelta = (a * delta) >> 8;
- r = MIN(r + adjdelta, a);
- g = MIN(g + adjdelta, a);
- b = MIN(b + adjdelta, a);
- *out = ARGB_JOIN(a, r ,g, b);
- out++;
- in++;
- }
- }
- }
- else
- {
- /* Delta negative */
- for (i = 0; i < h; i++)
- {
- for (j = 0; j < w; j++)
- {
- a = A_VAL(in);
- r = R_VAL(in);
- g = G_VAL(in);
- b = B_VAL(in);
- adjdelta = (a * delta) >> 8;
- r = MAX(r + adjdelta, 0);
- g = MAX(g + adjdelta, 0);
- b = MAX(b + adjdelta, 0);
- *out = ARGB_JOIN(a, r ,g, b);
- out++;
- in++;
- }
- }
- }
-
- return EINA_TRUE;
-
-}
-
-static Eina_Bool
-contrast_filter(Evas_Filter_Info *info EINA_UNUSED, RGBA_Image *src, RGBA_Image *dst)
-{
- uint32_t *in, *out;
- int i, j;
- int w, h;
-
- in = src->image.data;
- out = dst->image.data;
- w = src->cache_entry.w;
- h = src->cache_entry.h;
-
- for (i = 0; i < h; i++)
- {
- for (j = 0; j < w; j++)
- {
- // FIXME: not even implemented
- out++;
- in++;
- }
- }
-
- return EINA_TRUE;
-
-}
-#endif
-
-/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
*/
}
-#if 0 // filtering disabled
-/*
- *
- * Note that this is similar to proxy_subrender_recurse. It should be
- * possible to merge I guess
- */
-static void
-image_filter_draw_under_recurse(Evas *eo_e, Evas_Object *eo_obj, Evas_Object *stop,
- void *output, void *ctx, void *surface,
- int x, int y)
-{
- Evas_Object *eo_obj2;
-
- if (obj->clip.clipees) return;
- /* FIXME: Doing bounding box test */
- if (!evas_object_is_in_output_rect(eo_obj, stop->cur.geometry.x,
- stop->cur.geometry.y,
- stop->cur.geometry.w,
- stop->cur.geometry.h))
- return;
-
- if (!evas_object_is_visible(eo_obj)) return;
- obj->pre_render_done = 1;
- ctx = e->engine.func->context_new(output);
-
- if (obj->is_smart)
- {
- EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(eo_obj), obj2)
- {
- if (obj2 == stop) return;
- image_filter_draw_under_recurse(e, obj2, stop, output, surface,
- ctx, x, y);
- }
- }
- else
- obj->func->render(eo_obj, output, ctx, surface, x ,y);
- e->engine.func->context_free(output, ctx);
-}
-
-/*
- * Draw all visible objects intersecting an object which are _beneath_ it.
- */
-static void
-image_filter_draw_under(Evas *eo_e, Evas_Object *stop, void *output, void *ctx, void *surface, int dx, int dy)
-{
- Evas_Layer *lay;
- int x, y;
-
- x = stop->cur.geometry.x - dx;
- y = stop->cur.geometry.y - dy;
-
- EINA_INLIST_FOREACH(e->layers, lay)
- {
- Evas_Object *eo_obj;
- EINA_INLIST_FOREACH(lay->objects, obj)
- {
- if (obj->delete_me) continue;
- if (obj == stop) return;
- /* FIXME: Do bounding box check */
- image_filter_draw_under_recurse(e, obj, stop, output, ctx,
- surface, -x, -y);
- }
- }
- e->engine.func->image_dirty_region(output, surface, 0, 0, 300, 300);
- e->engine.func->output_flush(output);
-}
-
-/*
- * Update the filtered object.
- *
- * Creates a new context, and renders stuff (filtered) onto that.
- */
-Filtered_Image *
-image_filter_update(Evas *eo_e, Evas_Object *eo_obj, void *src, int imagew, int imageh, int *outw, int *outh)
-{
- int w, h;
- void *ctx;
- Evas_Filter_Info *info;
- void *surface;
- Eina_Bool alpha;
-
- info = obj->filter;
-
- if (info->mode == EVAS_FILTER_MODE_BELOW)
- {
- w = obj->cur.geometry.w;
- h = obj->cur.geometry.h;
- evas_filter_get_size(info, w, h, &imagew, &imageh, EINA_TRUE);
- alpha = EINA_FALSE;
- }
- else
- {
- evas_filter_get_size(info, imagew, imageh, &w, &h, EINA_FALSE);
- alpha = e->engine.func->image_alpha_get(e->engine.data.output, src);
- }
-
- /* Certain filters may make alpha images anyway */
- if (alpha == EINA_FALSE) alpha = evas_filter_always_alpha(info);
-
- surface = e->engine.func->image_map_surface_new(e->engine.data.output, w, h,
- alpha);
-
- if (info->mode == EVAS_FILTER_MODE_BELOW)
- {
- void *subsurface;
- int disw, dish;
- int dx, dy;
- disw = obj->cur.geometry.w;
- dish = obj->cur.geometry.h;
- dx = (imagew - w) >> 1;
- dy = (imageh - h) >> 1;
- subsurface = e->engine.func->image_map_surface_new
- (e->engine.data.output, imagew, imageh, 1);
- ctx = e->engine.func->context_new(e->engine.data.output);
- e->engine.func->context_color_set(e->engine.data.output, ctx, 0, 255, 0, 255);
- e->engine.func->context_render_op_set(e->engine.data.output, ctx, EVAS_RENDER_COPY);
- e->engine.func->rectangle_draw(e->engine.data.output, ctx,
- subsurface, 0, 0, imagew, imageh);
-
- image_filter_draw_under(e, obj, e->engine.data.output, ctx,
- subsurface, dx, dy);
-
- e->engine.func->context_free(e->engine.data.output, ctx);
-
- ctx = e->engine.func->context_new(e->engine.data.output);
-
- e->engine.func->image_draw_filtered(e->engine.data.output,
- ctx, surface, subsurface, info);
-
- e->engine.func->context_free(e->engine.data.output, ctx);
-
- e->engine.func->image_map_surface_free(e->engine.data.output,
- subsurface);
- }
- else
- {
- ctx = e->engine.func->context_new(e->engine.data.output);
- e->engine.func->image_draw_filtered(e->engine.data.output,
- ctx, surface, src, info);
- e->engine.func->context_free(e->engine.data.output, ctx);
- }
-
- e->engine.func->image_dirty_region(e->engine.data.output, surface,
- 0, 0, w, h);
- if (outw) *outw = w;
- if (outh) *outh = h;
- return e->engine.func->image_filtered_save(src, surface,
- obj->filter->key,
- obj->filter->len);
-}
-#endif
-
static void
evas_object_image_unload(Evas_Object *eo_obj, Eina_Bool dirty)
{
o->proxyrendering = EINA_FALSE;
}
-#if 0 // filtering disabled
- /* Now check/update filter */
- if (obj->filter && obj->filter->filter)
- {
- Filtered_Image *fi = NULL;
- //printf("%p has filter: %s\n", obj,obj->filter->dirty?"dirty":"clean");
- if (obj->filter->dirty)
- {
- if (obj->filter->mode != EVAS_FILTER_MODE_BELOW)
- {
- uint32_t len;
- uint8_t *key;
-
- if (obj->filter->key) free(obj->filter->key);
- obj->filter->key = NULL;
- obj->filter->len = 0;
- key = evas_filter_key_get(obj->filter, &len);
- if (key)
- {
- obj->filter->key = key;
- obj->filter->len = len;
- fi = obj->layer->evas->engine.func->image_filtered_get
- (o->engine_data, key, len);
- if (obj->filter->cached && fi != obj->filter->cached)
- {
- obj->layer->evas->engine.func->image_filtered_free
- (o->engine_data, obj->filter->cached);
- obj->filter->cached = NULL;
- }
- }
- }
- else if (obj->filter->cached)
- {
- obj->layer->evas->engine.func->image_filtered_free
- (o->engine_data, obj->filter->cached);
- }
- if (!fi)
- fi = image_filter_update(obj->layer->evas, obj, pixels,
- imagew, imageh, &imagew, &imageh);
- pixels = fi->image;
- obj->filter->dirty = 0;
- obj->filter->cached = fi;
- }
- else
- {
- fi = obj->filter->cached;
- pixels = fi->image;
- }
- }
-#endif
-
if (pixels)
{
Evas_Coord idw, idh, idx, idy;
}
}
}
-#if 0 // filtering disabled
- if (obj->filter && obj->filter->dirty)
- {
- evas_object_render_pre_prev_cur_add(&e->clip_changes, obj);
- }
-#endif
/* it obviously didn't change - add a NO obscure - this "unupdates" this */
/* area so if there were updates for it they get wiped. don't do it if we */
/* aren't fully opaque and we are visible */
int was_smart_child = 0;
-#if 0 // filtering disabled
- evas_filter_free(eo_obj);
-#endif
if (!strcmp(obj->type, "image")) evas_object_image_video_surface_set(eo_obj, NULL);
evas_object_map_set(eo_obj, NULL);
if (obj->prev.map) evas_map_free(obj->prev.map);
ie->file, ie->key);
// if (ie->data1) evas_cserve2_image_free(ie);
#endif
-/*
- * FIXME: This doesn't seem to be needed... But I'm not sure why.
- * -- nash
- {
- Filtered_Image *fi;
- EINA_LIST_FREE(im->filtered, fi)
- {
- free(fi->key);
- _evas_common_rgba_image_delete((Image_Entry *)(fi->image));
- free(fi);
- }
- }
-*/
if (ie->frames)
{
Eina_List *l;
/*****************************************************************************/
-#if 0 // filtering disabled
-typedef struct _Filtered_Image Filtered_Image;
-#endif
-
struct _RGBA_Image_Loadopts
{
int scale_down_by; // if > 1 then use this
Eina_Bool dirty: 1;
} mask;
-#if 0 // filtering disabled
- Eina_List *filtered;
-#endif
-
struct {
LK(lock);
Eina_List *list;
RGBA_Map_Point pts[1];
};
-#if 0 // filtering disabled
-struct _Filtered_Image
-{
- void *key;
- size_t keylen;
- RGBA_Image *image;
- int ref;
-};
-#endif
-
// for fonts...
/////
typedef struct _Fash_Item_Index_Map Fash_Item_Index_Map;
Evas_Map_Point points[]; // actual points
};
-#if 0 // filtering disabled
-/* nash: Split into two bits */
-typedef struct Evas_Filter_Info
-{
- Evas_Filter filter;
- Evas_Filter_Mode mode;
-
- Eina_Bool dirty : 1;
-
- int datalen;
- void *data;
- void (*data_free)(void *);
-
- uint8_t *key;
- uint32_t len;
- Filtered_Image *cached;
-} Evas_Filter_Info;
-
-typedef Eina_Bool (*Evas_Software_Filter_Fn)(Evas_Filter_Info *, RGBA_Image *, RGBA_Image *);
-
-int evas_filter_get_size(Evas_Filter_Info *info, int inw, int inh,
- int *outw, int *outh, Eina_Bool inv);
-Eina_Bool evas_filter_always_alpha(Evas_Filter_Info *info);
-uint8_t *evas_filter_key_get(const Evas_Filter_Info *info, uint32_t *lenp);
-// expose for use in engines
-EAPI Evas_Software_Filter_Fn evas_filter_software_get(Evas_Filter_Info *info);
-void evas_filter_free(Evas_Object *o);
-#endif
-
struct _Evas_Object_Protected_Data
{
EINA_INLIST;
// Pointer to the Evas_Object itself
Evas_Object *object;
-#if 0 // filtering disabled
- Evas_Filter_Info *filter;
-#endif
Evas_Size_Hints *size_hints;
Eina_Bool (*font_text_props_info_create) (void *data, Evas_Font_Instance *fi, const Eina_Unicode *text, Evas_Text_Props *intl_props, const Evas_BiDi_Paragraph_Props *par_props, size_t pos, size_t len, Evas_Text_Props_Mode mode);
int (*font_right_inset_get) (void *data, Evas_Font_Set *font, const Evas_Text_Props *text_props);
-#if 0 // filtering disabled
- void (*image_draw_filtered) (void *data, void *context, void *surface, void *image, Evas_Filter_Info *filter);
- Filtered_Image *(*image_filtered_get) (void *image, uint8_t *key, size_t len);
- Filtered_Image *(*image_filtered_save) (void *image, void *filtered, uint8_t *key, size_t len);
- void (*image_filtered_free) (void *image, Filtered_Image *);
-#endif
-
/* EFL-GL Glue Layer */
void *(*gl_surface_create) (void *data, void *config, int w, int h);
int (*gl_surface_destroy) (void *data, void *surface);
// drivers?
//
//#define GLX_TEX_PIXMAP_RECREATE 1
-#if 0
-static void
-eng_image_draw_filtered(void *data, void *context, void *surface,
- void *image, Evas_Filter_Info *filter)
-{
- Render_Engine *re = data;
-
- if (!image) return;
- eng_window_use(re->win);
- evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
- re->win->gl_context->dc = context;
-
- evas_gl_common_filter_draw(re->win->gl_context, image, filter);
-}
-
-static Filtered_Image *
-eng_image_filtered_get(void *im, uint8_t *key, size_t keylen)
-{
- return evas_gl_common_image_filtered_get(im, key, keylen);
-}
-
-static Filtered_Image *
-eng_image_filtered_save(void *im, void *fim, uint8_t *key, size_t keylen)
-{
- return evas_gl_common_image_filtered_save(im, fim, key, keylen);
-}
-
-static void
-eng_image_filtered_free(void *im, Filtered_Image *fim)
-{
- evas_gl_common_image_filtered_free(im, fim);
-}
-
-#endif
//
//
ORD(image_mask_create);
// ORD(image_native_set);
// ORD(image_native_get);
- // ORD(image_draw_filtered);
- // ORD(image_filtered_get);
- // ORD(image_filtered_save);
- // ORD(image_filtered_free);
ORD(font_draw);
extern Evas_GL_Program_Source shader_tex_vert_src;
extern Evas_GL_Program_Source shader_tex_nomul_frag_src;
extern Evas_GL_Program_Source shader_tex_nomul_vert_src;
-
-extern Evas_GL_Program_Source shader_filter_invert_frag_src;
-extern Evas_GL_Program_Source shader_filter_invert_nomul_frag_src;
-extern Evas_GL_Program_Source shader_filter_invert_bgra_frag_src;
-extern Evas_GL_Program_Source shader_filter_invert_bgra_nomul_frag_src;
-extern Evas_GL_Program_Source shader_filter_sepia_frag_src;
-extern Evas_GL_Program_Source shader_filter_sepia_nomul_frag_src;
-extern Evas_GL_Program_Source shader_filter_sepia_bgra_frag_src;
-extern Evas_GL_Program_Source shader_filter_sepia_bgra_nomul_frag_src;
-extern Evas_GL_Program_Source shader_filter_greyscale_frag_src;
-extern Evas_GL_Program_Source shader_filter_greyscale_nomul_frag_src;
-extern Evas_GL_Program_Source shader_filter_greyscale_bgra_frag_src;
-extern Evas_GL_Program_Source shader_filter_greyscale_bgra_nomul_frag_src;
-/* blur (annoyingly) needs (aka is faster with) a vertex shader */
-extern Evas_GL_Program_Source shader_filter_blur_vert_src;
-extern Evas_GL_Program_Source shader_filter_blur_frag_src;
-extern Evas_GL_Program_Source shader_filter_blur_nomul_frag_src;
-extern Evas_GL_Program_Source shader_filter_blur_bgra_frag_src;
-extern Evas_GL_Program_Source shader_filter_blur_bgra_nomul_frag_src;
#endif
void glerr(int err, const char *file, const char *func, int line, const char *op);
void evas_gl_common_line_draw(Evas_Engine_GL_Context *gc, int x1, int y1, int x2, int y2);
-#if 0 // filtering disabled
-void evas_gl_common_filter_draw(Evas_Engine_GL_Context *context, Evas_GL_Image *im, Evas_Filter_Info *filter);
-Filtered_Image *evas_gl_common_image_filtered_get(Evas_GL_Image *im, uint8_t *key, size_t keylen);
-Filtered_Image *evas_gl_common_image_filtered_save(Evas_GL_Image *im, Evas_GL_Image *fimage, uint8_t *key, size_t keylen);
-void evas_gl_common_image_filtered_free(Evas_GL_Image *im, Filtered_Image *);
-#endif
-
extern void (*glsym_glGenFramebuffers) (GLsizei a, GLuint *b);
extern void (*glsym_glBindFramebuffer) (GLenum a, GLuint b);
extern void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e);
+++ /dev/null
-#include "evas_gl_private.h"
-
-#if 0 // filtering disabled
-void
-evas_gl_common_filter_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, Evas_Filter_Info *filter)
-{
- RGBA_Draw_Context *dc;
- GLuint prog;
- int r,g,b,a;
- int nomul, bgra;
-
- dc = gc->dc;
-
- if (dc->mul.use)
- {
- a = (dc->mul.col >> 24) & 0xff;
- r = (dc->mul.col >> 16) & 0xff;
- g = (dc->mul.col >> 8 ) & 0xff;
- b = (dc->mul.col ) & 0xff;
- }
- else
- {
- r = g = b = a = 255;
- }
-
- nomul = (a == 255 && r == 255 && g == 255 && b == 255) ? 1 : 0;
- bgra = (gc->shared->info.bgra) ? 1 : 0;
-
- /* FIXME: This should so be a table */
-#if 0
- if (filter->filter == EVAS_FILTER_BLUR)
- {
- if (bgra)
- {
- if (nomul)
- prog = gc->shared->shader.filter_blur_bgra_nomul.prog;
- else
- prog = gc->shared->shader.filter_blur_bgra.prog;
- }
- else
- {
- if (a == 255 && r == 255 && g == 255 && b == 255)
- prog = gc->shared->shader.filter_blur_nomul.prog;
- else
- prog = gc->shared->shader.filter_blur.prog;
- }
- }
- else
-#endif
- if (filter->filter == EVAS_FILTER_INVERT)
- {
- if (bgra)
- {
- if (nomul)
- prog = gc->shared->shader.filter_invert_bgra_nomul.prog;
- else
- prog = gc->shared->shader.filter_invert_bgra.prog;
- }
- else
- {
- if (a == 255 && r == 255 && g == 255 && b == 255)
- prog = gc->shared->shader.filter_invert_nomul.prog;
- else
- prog = gc->shared->shader.filter_invert.prog;
- }
- }
- else if (filter->filter == EVAS_FILTER_SEPIA)
- {
- if (bgra)
- {
- if (nomul)
- prog = gc->shared->shader.filter_sepia_bgra_nomul.prog;
- else
- prog = gc->shared->shader.filter_sepia_bgra.prog;
- }
- else
- {
- if (nomul)
- prog = gc->shared->shader.filter_sepia_nomul.prog;
- else
- prog = gc->shared->shader.filter_sepia.prog;
- }
-
- }
- else /*if (filter->filter == EVAS_FILTER_GREYSCALE)*/
- {
- printf("BGRA: %s Nomul: %s\n",bgra?"true":"false",nomul?"nomul":"mul");
- if (bgra)
- {
- if (nomul)
- prog = gc->shared->shader.filter_greyscale_bgra_nomul.prog;
- else
- prog = gc->shared->shader.filter_greyscale_bgra.prog;
- }
- else
- {
- if (nomul)
- prog = gc->shared->shader.filter_greyscale_nomul.prog;
- else
- prog = gc->shared->shader.filter_greyscale.prog;
- }
-
- }
-
- printf("Prog: %d %d %d\n",prog,im->w,im->h);
- gc->filter_prog = prog;
- evas_gl_common_image_update(gc, im);
- evas_gl_common_context_image_push(gc, im->tex, 0, 0, im->w, im->h,
- 0, 0, im->w, im->h,
- r,g,b,a,
- 1, im->tex_only);
- gc->filter_prog = 0;
-}
-
-
-Filtered_Image *
-evas_gl_common_image_filtered_get(Evas_GL_Image *im, uint8_t *key, size_t len)
-{
- Filtered_Image *fi;
- Eina_List *l;
-
- for (l = im->filtered ; l ; l = l->next)
- {
- fi = l->data;
- if (fi->keylen != len) continue;
- if (memcmp(key, fi->key, len) != 0) continue;
- fi->ref ++;
- return fi;
- }
-
- return NULL;
-}
-
-Filtered_Image *
-evas_gl_common_image_filtered_save(Evas_GL_Image *im, Evas_GL_Image *fimage,
- uint8_t *key, size_t keylen)
-{
- Filtered_Image *fi;
- Eina_List *l;
-
- for (l = im->filtered ; l ; l = l->next)
- {
- fi = l->data;
- if (fi->keylen != keylen) continue;
- if (memcmp(key, fi->key, keylen) != 0) continue;
-
- fi->image = (void *)fimage;
- fi->ref ++;
- return fi;
- }
-
- fi = calloc(1,sizeof(Filtered_Image));
- if (!fi) return NULL;
-
- fi->keylen = keylen;
- fi->key = malloc(keylen);
- memcpy(fi->key, key, keylen);
- fi->image = (void *)fimage;
- fi->ref = 1;
-
- im->filtered = eina_list_prepend(im->filtered, fi);
-
- return fi;
-}
-
-void
-evas_gl_common_image_filtered_free(Evas_GL_Image *image, Filtered_Image *fi)
-{
- fi->ref --;
- if (fi->ref) return;
-
- free(fi->key);
- evas_gl_common_image_free((void *)fi->image);
- fi->image = NULL;
-
- image->filtered = eina_list_remove(image->filtered, fi);
-}
-#endif
-
-
-/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
void
evas_gl_common_image_free(Evas_GL_Image *im)
{
-#if 0 // filtering disabled
- Filtered_Image *fi;
-#endif
-
evas_gl_common_context_flush(im->gc);
im->references--;
if (im->references > 0) return;
if (im->im) evas_cache_image_drop(&im->im->cache_entry);
if (im->tex) evas_gl_common_texture_free(im->tex);
-#if 0 // filtering disabled
- EINA_LIST_FREE(im->filtered, fi)
- {
- free(fi->key);
- evas_gl_common_image_free((Evas_GL_Image *)fi->image);
- free(fi);
- }
-#endif
-
free(im);
}
NULL, 0
};
-/////////////////////////////////////////////
-const char filter_invert_frag_glsl[] =
-#include "shader/filter_invert.h"
- ;
-Evas_GL_Program_Source shader_filter_invert_frag_src =
-{
- filter_invert_frag_glsl,
- NULL, 0
-};
-
-const char filter_invert_nomul_frag_glsl[] =
-#include "shader/filter_invert_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_invert_nomul_frag_src =
-{
- filter_invert_nomul_frag_glsl,
- NULL, 0
-};
-
-const char filter_invert_bgra_frag_glsl[] =
-#include "shader/filter_invert_bgra.h"
- ;
-Evas_GL_Program_Source shader_filter_invert_bgra_frag_src =
-{
- filter_invert_bgra_frag_glsl,
- NULL, 0
-};
-
-const char filter_invert_bgra_nomul_frag_glsl[] =
-#include "shader/filter_invert_bgra_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_invert_bgra_nomul_frag_src =
-{
- filter_invert_bgra_nomul_frag_glsl,
- NULL, 0
-};
-
-/////////////////////////////////////////////
-const char filter_greyscale_frag_glsl[] =
-#include "shader/filter_greyscale.h"
- ;
-Evas_GL_Program_Source shader_filter_greyscale_frag_src =
-{
- filter_greyscale_frag_glsl,
- NULL, 0
-};
-
-const char filter_greyscale_nomul_frag_glsl[] =
-#include "shader/filter_greyscale_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_greyscale_nomul_frag_src =
-{
- filter_greyscale_nomul_frag_glsl,
- NULL, 0
-};
-
-const char filter_greyscale_bgra_frag_glsl[] =
-#include "shader/filter_greyscale_bgra.h"
- ;
-Evas_GL_Program_Source shader_filter_greyscale_bgra_frag_src =
-{
- filter_greyscale_bgra_frag_glsl,
- NULL, 0
-};
-const char filter_greyscale_bgra_nomul_frag_glsl[] =
-#include "shader/filter_greyscale_bgra_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_greyscale_bgra_nomul_frag_src =
-{
- filter_greyscale_bgra_nomul_frag_glsl,
- NULL, 0
-};
-
-/////////////////////////////////////////////
-const char filter_sepia_frag_glsl[] =
-#include "shader/filter_sepia.h"
- ;
-Evas_GL_Program_Source shader_filter_sepia_frag_src =
-{
- filter_sepia_frag_glsl,
- NULL, 0
-};
-
-const char filter_sepia_nomul_frag_glsl[] =
-#include "shader/filter_sepia_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_sepia_nomul_frag_src =
-{
- filter_sepia_nomul_frag_glsl,
- NULL, 0
-};
-
-const char filter_sepia_bgra_frag_glsl[] =
-#include "shader/filter_sepia_bgra.h"
- ;
-Evas_GL_Program_Source shader_filter_sepia_bgra_frag_src =
-{
- filter_sepia_bgra_frag_glsl,
- NULL, 0
-};
-const char filter_sepia_bgra_nomul_frag_glsl[] =
-#include "shader/filter_sepia_bgra_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_sepia_bgra_nomul_frag_src =
-{
- filter_sepia_bgra_nomul_frag_glsl,
- NULL, 0
-};
-
-/////////////////////////////////////////////
-#if 0
- Blur is a work in progress currently.
- Mostly because GPUs are so hopeless.
-const char filter_blur_vert_glsl[] =
-#include "shader/filter_blur_vert.h"
- ;
-
-Evas_GL_Program_Source shader_filter_blur_vert_src =
-{
- filter_blur_vert_glsl,
- NULL, 0
-};
-
-const char filter_blur_frag_glsl[] =
-#include "shader/filter_blur.h"
- ;
-Evas_GL_Program_Source shader_filter_blur_frag_src =
-{
- filter_blur_frag_glsl,
- NULL, 0
-};
-
-const char filter_blur_nomul_frag_glsl[] =
-#include "shader/filter_blur_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_blur_nomul_frag_src =
-{
- filter_blur_nomul_frag_glsl,
- NULL, 0
-};
-
-const char filter_blur_bgra_frag_glsl[] =
-#include "shader/filter_blur_bgra.h"
- ;
-Evas_GL_Program_Source shader_filter_blur_bgra_frag_src =
-{
- filter_blur_bgra_frag_glsl,
- NULL, 0
-};
-const char filter_blur_bgra_nomul_frag_glsl[] =
-#include "shader/filter_blur_bgra_nomul.h"
- ;
-Evas_GL_Program_Source shader_filter_blur_bgra_nomul_frag_src =
-{
- filter_blur_bgra_nomul_frag_glsl,
- NULL, 0
-};
-
-#endif
-
-
/////////////////////////////////////////////
static void
SHADER_SOURCE_LINE(NV12_NOMUL, nv12_nomul),
SHADER_SOURCE_LINE(TEX, tex),
SHADER_SOURCE_LINE(TEX_NOMUL, tex_nomul),
- /* Most of the filters use the image fragment shader */
- SHADER_SOURCE_FILTER_LINE(FILTER_INVERT, filter_invert),
- SHADER_SOURCE_FILTER_LINE(FILTER_INVERT_NOMUL, filter_invert_nomul),
- SHADER_SOURCE_FILTER_LINE(FILTER_INVERT_BGRA, filter_invert_bgra),
- SHADER_SOURCE_FILTER_LINE(FILTER_INVERT_BGRA_NOMUL, filter_invert_bgra_nomul),
- SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE, filter_greyscale),
- SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE_NOMUL, filter_greyscale_nomul),
- SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE_BGRA, filter_greyscale_bgra),
- SHADER_SOURCE_FILTER_LINE(FILTER_GREYSCALE_BGRA_NOMUL, filter_greyscale_bgra_nomul),
- SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA, filter_sepia),
- SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA_NOMUL, filter_sepia_nomul),
- SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA_BGRA, filter_sepia_bgra),
- SHADER_SOURCE_FILTER_LINE(FILTER_SEPIA_BGRA_NOMUL, filter_sepia_bgra_nomul)/* , */
- /* SHADER_SOURCE_LINE(FILTER_BLUR, filter_blur), */
- /* SHADER_SOURCE_LINE(FILTER_BLUR_NOMUL, filter_blur_nomul), */
- /* SHADER_SOURCE_LINE(FILTER_BLUR_BGRA, filter_blur_bgra), */
- /* SHADER_SOURCE_LINE(FILTER_BLUR_BGRA_NOMUL, filter_blur_bgra_nomul) */
};
static int
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"uniform sampler1D gaussian;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"varying weight;\n"
-"uniform radius;\n"
-"void main()\n"
-"{\n"
-" int i;\n"
-" vec4 fc = vec4(0,0,0,0);\n"
-" \n"
-" for (i = 0 ; i < radius ; i ++){\n"
-" fc += texture2D(tex, tex_c.xy).rgba *\n"
-" texture1D(gaussian,i/radius).aaaa;\n"
-" }\n"
-" gl_FragColor = fc / 4 * col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-uniform sampler1D gaussian;
-varying vec4 col;
-varying vec2 tex_c;
-varying weight;
-uniform radius;
-void main()
-{
- int i;
- vec4 fc = vec4(0,0,0,0);
-
- for (i = 0 ; i < radius ; i ++){
- fc += texture2D(tex, tex_c.xy).rgba *
- texture1D(gaussian,i/radius).aaaa;
- }
- gl_FragColor = fc / 4 * col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"uniform sampler1D gaussian;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"varying weight;\n"
-"uniform radius;\n"
-"void main()\n"
-"{\n"
-" int i;\n"
-" vec4 fc = vec4(0,0,0,0);\n"
-" \n"
-" for (i = 0 ; i < radius ; i ++){\n"
-" fc += texture2D(tex, tex_c.xy).rgba *\n"
-" texture1D(gaussian,i/radius).aaaa;\n"
-" }\n"
-" gl_FragColor = fc / 4;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-uniform sampler1D gaussian;
-varying vec4 col;
-varying vec2 tex_c;
-varying weight;
-uniform radius;
-void main()
-{
- int i;
- vec4 fc = vec4(0,0,0,0);
-
- for (i = 0 ; i < radius ; i ++){
- fc += texture2D(tex, tex_c.xy).rgba *
- texture1D(gaussian,i/radius).aaaa;
- }
- gl_FragColor = fc / 4;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"uniform sampler1D gaussian;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"varying weight;\n"
-"uniform radius;\n"
-"void main()\n"
-"{\n"
-" int i;\n"
-" vec4 fc = vec4(0,0,0,0);\n"
-" \n"
-" for (i = 0 ; i < radius ; i ++){\n"
-" fc += texture2D(tex, tex_c.xy).rgba *\n"
-" texture1D(gaussian,i/radius).aaaa;\n"
-" }\n"
-" gl_FragColor = fc / 4;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-uniform sampler1D gaussian;
-varying vec4 col;
-varying vec2 tex_c;
-varying weight;
-uniform radius;
-void main()
-{
- int i;
- vec4 fc = vec4(0,0,0,0);
-
- for (i = 0 ; i < radius ; i ++){
- fc += texture2D(tex, tex_c.xy).rgba *
- texture1D(gaussian,i/radius).aaaa;
- }
- gl_FragColor = fc / 4;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"uniform sampler1D gaussian;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"varying weight;\n"
-"uniform radius;\n"
-"void main()\n"
-"{\n"
-" int i;\n"
-" vec4 fc = vec4(0,0,0,0);\n"
-" \n"
-" for (i = 0 ; i < radius ; i ++){\n"
-" fc += texture2D(tex, tex_c.xy).rgba *\n"
-" texture1D(gaussian,i/radius).aaaa;\n"
-" }\n"
-" gl_FragColor = fc / 4;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-uniform sampler1D gaussian;
-varying vec4 col;
-varying vec2 tex_c;
-varying weight;
-uniform radius;
-void main()
-{
- int i;
- vec4 fc = vec4(0,0,0,0);
-
- for (i = 0 ; i < radius ; i ++){
- fc += texture2D(tex, tex_c.xy).rgba *
- texture1D(gaussian,i/radius).aaaa;
- }
- gl_FragColor = fc / 4;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"precision highp float;\n"
-"#endif\n"
-"attribute vec4 vertex;\n"
-"attribute vec4 color;\n"
-"attribute vec2 tex_coord;\n"
-"attribute float r;\n"
-"uniform mat4 mvp;\n"
-"uniform sampler1D tex_blur;\n"
-"varying float weight;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"\n"
-"void main(){\n"
-" /* FIXME: This index should be tweaked so for \n"
-" radius 1, I want 3 points at 1/4, 2/4, 3/4 */\n"
-" /*\n"
-" for (float i = 0 ; i <= radius * 2 ; i ++){\n"
-" float pos = i;\n"
-" float r = float(radius);\n"
-" weight += sampler1D(tex_blur, 1.0 / (r * 2.0 * pos));\n"
-" }*/\n"
-" for (float i = 0.0 ; i < r * 2.0 ; i += 1.0){\n"
-" weight += sampler1D(tex_blur, 1.0 / (r * 2.0 * i));\n"
-" }\n"
-" gl_Position = mvp * vertex;\n"
-" col = color;\n"
-" tex_c = tex_coord;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-precision highp float;
-#endif
-attribute vec4 vertex;
-attribute vec4 color;
-attribute vec2 tex_coord;
-attribute float r;
-uniform mat4 mvp;
-uniform sampler1D tex_blur;
-varying float weight;
-varying vec4 col;
-varying vec2 tex_c;
-
-void main(){
- /* FIXME: This index should be tweaked so for
- radius 1, I want 3 points at 1/4, 2/4, 3/4 */
- /*
- for (float i = 0 ; i <= radius * 2 ; i ++){
- float pos = i;
- float r = float(radius);
- weight += sampler1D(tex_blur, 1.0 / (r * 2.0 * pos));
- }*/
- for (float i = 0.0 ; i < r * 2.0 ; i += 1.0){
- weight += sampler1D(tex_blur, 1.0 / (r * 2.0 * i));
- }
- gl_Position = mvp * vertex;
- col = color;
- tex_c = tex_coord;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" float inten = dot(texture2D(tex,tex_c.xy).agb,vec3(.3, .59, .11));\n"
-" gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).r) * col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- float inten = dot(texture2D(tex,tex_c.xy).agb,vec3(.3, .59, .11));
- gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).r) * col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" float inten = dot(texture2D(tex,tex_c.xy).rgb,vec3(.3, .59, .11));\n"
-" gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).a) * col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- float inten = dot(texture2D(tex,tex_c.xy).rgb,vec3(.3, .59, .11));
- gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).a) * col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" float inten = dot(texture2D(tex,tex_c.xy).rgb,vec3(.3, .59, .11));\n"
-" gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).a);\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec2 tex_c;
-void main()
-{
- float inten = dot(texture2D(tex,tex_c.xy).rgb,vec3(.3, .59, .11));
- gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).a);
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" float inten = dot(texture2D(tex,tex_c.xy).abg,vec3(.3, .59, .11));\n"
-" gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).r);\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec2 tex_c;
-void main()
-{
- float inten = dot(texture2D(tex,tex_c.xy).abg,vec3(.3, .59, .11));
- gl_FragColor = vec4(inten, inten, inten, texture2D(tex,tex_c.xy).r);
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = (vec4(0, 1.0, 1.0, 1.0) - texture2D(tex, tex_c.xy).bgra)*col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- gl_FragColor = (vec4(0, 1.0, 1.0, 1.0) - texture2D(tex, tex_c.xy).bgra)*col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = (vec4(1.0, 1.0, 1.0, 1.0) - texture2D(tex, tex_c.xy))*col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- gl_FragColor = (vec4(1.0, 1.0, 1.0, 1.0) - texture2D(tex, tex_c.xy))*col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" vec3 inv = vec3(1.0, 1.0, 1.0) - texture2D(tex,tex_c.xy).rgb;\n"
-" gl_FragColor = vec4(inv.r, inv.g, inv.b, 1.0);\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- vec3 inv = vec3(1.0, 1.0, 1.0) - texture2D(tex,tex_c.xy).rgb;
- gl_FragColor = vec4(inv.r, inv.g, inv.b, 1.0);
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" gl_FragColor = (vec4(0, 1.0, 1.0, 1.0) - texture2D(tex, tex_c.xy).bgra)*col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- gl_FragColor = (vec4(0, 1.0, 1.0, 1.0) - texture2D(tex, tex_c.xy).bgra)*col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" vec3 inp = texture2D(tex,tex_c.xy).abg;\n"
-" vec4 sep;\n"
-" sep.r = dot(inp, vec3(.393, .769, .189));\n"
-" sep.g = dot(inp, vec3(.349, .686, .168));\n"
-" sep.b = dot(inp, vec3(.272, .534, .131));\n"
-" sep.a = texture2D(tex,tex_c.xy).r;\n"
-" gl_FragColor = sep * col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- vec3 inp = texture2D(tex,tex_c.xy).abg;
- vec4 sep;
- sep.r = dot(inp, vec3(.393, .769, .189));
- sep.g = dot(inp, vec3(.349, .686, .168));
- sep.b = dot(inp, vec3(.272, .534, .131));
- sep.a = texture2D(tex,tex_c.xy).r;
- gl_FragColor = sep * col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" vec3 inp = texture2D(tex,tex_c.xy).rgb;\n"
-" vec4 sep;\n"
-" sep.r = dot(inp, vec3(.393, .769, .189));\n"
-" sep.g = dot(inp, vec3(.349, .686, .168));\n"
-" sep.b = dot(inp, vec3(.272, .534, .131));\n"
-" sep.a = texture2D(tex,tex_c.xy).a;\n"
-" gl_FragColor = sep * col;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- vec3 inp = texture2D(tex,tex_c.xy).rgb;
- vec4 sep;
- sep.r = dot(inp, vec3(.393, .769, .189));
- sep.g = dot(inp, vec3(.349, .686, .168));
- sep.b = dot(inp, vec3(.272, .534, .131));
- sep.a = texture2D(tex,tex_c.xy).a;
- gl_FragColor = sep * col;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" vec3 inp = texture2D(tex,tex_c.xy).rgb;\n"
-" gl_FragColor.r = dot(inp, vec3(.393, .769, .189));\n"
-" gl_FragColor.g = dot(inp, vec3(.349, .686, .168));\n"
-" gl_FragColor.b = dot(inp, vec3(.272, .534, .131));\n"
-" gl_FragColor.a = texture2D(tex,tex_c.xy).a;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- vec3 inp = texture2D(tex,tex_c.xy).rgb;
- gl_FragColor.r = dot(inp, vec3(.393, .769, .189));
- gl_FragColor.g = dot(inp, vec3(.349, .686, .168));
- gl_FragColor.b = dot(inp, vec3(.272, .534, .131));
- gl_FragColor.a = texture2D(tex,tex_c.xy).a;
-}
+++ /dev/null
-"#ifdef GL_ES\n"
-"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-"precision highp float;\n"
-"#else\n"
-"precision mediump float;\n"
-"#endif\n"
-"#endif\n"
-"uniform sampler2D tex;\n"
-"varying vec4 col;\n"
-"varying vec2 tex_c;\n"
-"void main()\n"
-"{\n"
-" vec3 inp = texture2D(tex,tex_c.xy).abg;\n"
-" gl_FragColor.r = dot(inp, vec3(.393, .769, .189));\n"
-" gl_FragColor.g = dot(inp, vec3(.349, .686, .168));\n"
-" gl_FragColor.b = dot(inp, vec3(.272, .534, .131));\n"
-" gl_FragColor.a = texture2D(tex,tex_c.xy).r;\n"
-"}\n"
+++ /dev/null
-#ifdef GL_ES
-#ifdef GL_FRAGMENT_PRECISION_HIGH
-precision highp float;
-#else
-precision mediump float;
-#endif
-#endif
-uniform sampler2D tex;
-varying vec4 col;
-varying vec2 tex_c;
-void main()
-{
- vec3 inp = texture2D(tex,tex_c.xy).abg;
- gl_FragColor.r = dot(inp, vec3(.393, .769, .189));
- gl_FragColor.g = dot(inp, vec3(.349, .686, .168));
- gl_FragColor.b = dot(inp, vec3(.272, .534, .131));
- gl_FragColor.a = texture2D(tex,tex_c.xy).r;
-}
ORD(image_colorspace_get);
ORD(image_native_set);
ORD(image_native_get);
-#if 0 // filtering disabled
-// ORD(image_draw_filtered);
-// ORD(image_filtered_get);
-// ORD(image_filtered_save);
-// ORD(image_filtered_free);
-#endif
ORD(font_draw);
ORD(image_scale_hint_set);
return &(n->ns);
}
-#if 0 // filtering disabled
-static void
-eng_image_draw_filtered(void *data, void *context, void *surface,
- void *image, Evas_Filter_Info *filter)
-{
- Render_Engine *re = data;
-
- if (!image) return;
- eng_window_use(re->win);
- evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
- re->win->gl_context->dc = context;
-
- evas_gl_common_filter_draw(re->win->gl_context, image, filter);
-}
-
-static Filtered_Image *
-eng_image_filtered_get(void *im, uint8_t *key, size_t keylen)
-{
- return evas_gl_common_image_filtered_get(im, key, keylen);
-}
-
-static Filtered_Image *
-eng_image_filtered_save(void *im, void *fim, uint8_t *key, size_t keylen)
-{
- return evas_gl_common_image_filtered_save(im, fim, key, keylen);
-}
-
-static void
-eng_image_filtered_free(void *im, Filtered_Image *fim)
-{
- evas_gl_common_image_filtered_free(im, fim);
-}
-#endif
-
//
//
ORD(image_mask_create);
ORD(image_native_set);
ORD(image_native_get);
-#if 0 // filtering disabled
- ORD(image_draw_filtered);
- ORD(image_filtered_get);
- ORD(image_filtered_save);
- ORD(image_filtered_free);
-#endif
ORD(font_draw);
}
-/* Filter API */
-#if 0 // filtering disabled
-static void
-eng_image_draw_filtered(void *data EINA_UNUSED, void *context EINA_UNUSED,
- void *surface, void *image, Evas_Filter_Info *filter)
-{
- Evas_Software_Filter_Fn fn;
- RGBA_Image *im = image;
-
- fn = evas_filter_software_get(filter);
- if (!fn) return;
- if (im->cache_entry.cache) evas_cache_image_load_data(&im->cache_entry);
- fn(filter, image, surface);
- return;
-}
-
-static Filtered_Image *
-eng_image_filtered_get(void *image, uint8_t *key, size_t keylen)
-{
- RGBA_Image *im = image;
- Filtered_Image *fi;
- Eina_List *l;
-
- for (l = im->filtered ; l ; l = l->next)
- {
- fi = l->data;
- if (fi->keylen != keylen) continue;
- if (memcmp(key, fi->key, keylen) != 0) continue;
- fi->ref ++;
- return fi;
- }
-
- return NULL;
-}
-
-static Filtered_Image *
-eng_image_filtered_save(void *image, void *fimage, uint8_t *key, size_t keylen)
-{
- RGBA_Image *im = image;
- Filtered_Image *fi;
- Eina_List *l;
-
- for (l = im->filtered ; l ; l = l->next)
- {
- fi = l->data;
- if (fi->keylen != keylen) continue;
- if (memcmp(key, fi->key, keylen) == 0) continue;
- evas_cache_image_drop((void *)fi->image);
- fi->image = fimage;
- return fi;
- }
-
- fi = calloc(1,sizeof(Filtered_Image));
- if (!fi) return NULL;
-
- fi->keylen = keylen;
- fi->key = malloc(keylen);
- memcpy(fi->key, key, keylen);
- fi->image = fimage;
- fi->ref = 1;
-
- im->filtered = eina_list_prepend(im->filtered, fi);
-
- return fi;
-}
-
-static void
-eng_image_filtered_free(void *image, Filtered_Image *fi)
-{
- RGBA_Image *im = image;
-
- fi->ref --;
- if (fi->ref) return;
-
- free(fi->key);
- evas_cache_image_drop(&fi->image->cache_entry);
- fi->image = NULL;
-
- im->filtered = eina_list_remove(im->filtered, fi);
-}
-#endif
-
static int
eng_image_load_error_get(void *data EINA_UNUSED, void *image)
{
eng_font_pen_coords_get,
eng_font_text_props_info_create,
eng_font_right_inset_get,
-#if 0 // filtering disabled
- eng_image_draw_filtered,
- eng_image_filtered_get,
- eng_image_filtered_save,
- eng_image_filtered_free,
-#endif
NULL, // need software mesa for gl rendering <- gl_surface_create
NULL, // need software mesa for gl rendering <- gl_surface_destroy
NULL, // need software mesa for gl rendering <- gl_context_create
return &(n->ns);
}
-#if 0 // filtering disabled
-static void
-eng_image_draw_filtered(void *data, void *context, void *surface,
- void *image, Evas_Filter_Info *filter)
-{
- Render_Engine *re = data;
-
- if (!image) return;
- eng_window_use(re->win);
- evas_gl_common_context_target_surface_set(re->win->gl_context, surface);
- re->win->gl_context->dc = context;
-
- evas_gl_common_filter_draw(re->win->gl_context, image, filter);
-}
-
-static Filtered_Image *
-eng_image_filtered_get(void *im, uint8_t *key, size_t keylen)
-{
- return evas_gl_common_image_filtered_get(im, key, keylen);
-}
-
-static Filtered_Image *
-eng_image_filtered_save(void *im, void *fim, uint8_t *key, size_t keylen)
-{
- return evas_gl_common_image_filtered_save(im, fim, key, keylen);
-}
-
-static void
-eng_image_filtered_free(void *im, Filtered_Image *fim)
-{
- evas_gl_common_image_filtered_free(im, fim);
-}
-#endif
-
static void *
eng_image_load(void *data, const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo)
{
ORD(image_mask_create);
ORD(image_native_set);
ORD(image_native_get);
-#if 0 // filtering disabled
- ORD(image_draw_filtered);
- ORD(image_filtered_get);
- ORD(image_filtered_save);
- ORD(image_filtered_free);
-#endif
ORD(font_draw);