forked from enlightenment/efl
Evas: Filters:
More work, proudly supported by Samsung. Filters! So now you can apply a whole host of cheesy visual effects to objects at runtime. This is the first commit, there are a couple of more to come as I tweak the filters, and fix blur with GL[1]. Please direct bugs to me nash@nash.id.au. [1] You'd think shaders would be good at this.. but no, generic blur and GL are like trying to get an apple product to work with Linux. SVN revision: 58726
This commit is contained in:
parent
36370ae91e
commit
9eaea94252
|
@ -255,3 +255,10 @@
|
||||||
useful for "to" field of email/sms applications where ',' is used to
|
useful for "to" field of email/sms applications where ',' is used to
|
||||||
separate different text entities.
|
separate different text entities.
|
||||||
|
|
||||||
|
2011-04-19 Brett Nash (nash)
|
||||||
|
|
||||||
|
* Filters: So filtering of various flavours. They work only on images
|
||||||
|
(use a proxy if you want it on other objects). Documentation inline.
|
||||||
|
Supports a filter object or filter under (the area where the object
|
||||||
|
is filtered). Various parameters to tweak, and potential for
|
||||||
|
additional filters (but you get to write the shader ;-)
|
||||||
|
|
|
@ -7879,6 +7879,51 @@ EAPI Eina_Accessor *evas_object_table_accessor_new (cons
|
||||||
EAPI Eina_List *evas_object_table_children_get (const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
|
EAPI Eina_List *evas_object_table_children_get (const Evas_Object *o) EINA_WARN_UNUSED_RESULT EINA_ARG_NONNULL(1) EINA_MALLOC;
|
||||||
EAPI Evas_Object *evas_object_table_child_get (const Evas_Object *o, unsigned short col, unsigned short row) EINA_ARG_NONNULL(1);
|
EAPI Evas_Object *evas_object_table_child_get (const Evas_Object *o, unsigned short col, unsigned short row) EINA_ARG_NONNULL(1);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
EAPI Eina_Bool evas_object_filter_mode_set (Evas_Object *o, Evas_Filter_Mode mode);
|
||||||
|
EAPI Evas_Filter_Mode evas_object_filter_mode_get (Evas_Object *o);
|
||||||
|
EAPI Eina_Bool evas_object_filter_set (Evas_Object *o, Evas_Filter filter);
|
||||||
|
EAPI Evas_Filter evas_object_filter_get (Evas_Object *o);
|
||||||
|
EAPI Eina_Bool evas_object_filter_param_set_int (Evas_Object *o, const char *param, int val);
|
||||||
|
EAPI int evas_object_filter_param_get_int (Evas_Object *o, const char *param);
|
||||||
|
EAPI Eina_Bool evas_object_filter_param_set_str (Evas_Object *o, const char *param, const char *val);
|
||||||
|
EAPI Eina_Bool evas_object_filter_param_set_obj (Evas_Object *o, const char *param, Evas_Object *);
|
||||||
|
EAPI Eina_Bool evas_object_filter_param_set_float(Evas_Object *o, const char *param, double val);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup Evas_Cserve Shared Image Cache Server
|
* @defgroup Evas_Cserve Shared Image Cache Server
|
||||||
|
|
|
@ -21,6 +21,7 @@ evas_callbacks.c \
|
||||||
evas_clip.c \
|
evas_clip.c \
|
||||||
evas_data.c \
|
evas_data.c \
|
||||||
evas_events.c \
|
evas_events.c \
|
||||||
|
evas_filter.c \
|
||||||
evas_focus.c \
|
evas_focus.c \
|
||||||
evas_key.c \
|
evas_key.c \
|
||||||
evas_key_grab.c \
|
evas_key_grab.c \
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -151,6 +151,7 @@ static void
|
||||||
_evas_common_rgba_image_delete(Image_Entry *ie)
|
_evas_common_rgba_image_delete(Image_Entry *ie)
|
||||||
{
|
{
|
||||||
RGBA_Image *im = (RGBA_Image *) ie;
|
RGBA_Image *im = (RGBA_Image *) ie;
|
||||||
|
Filtered_Image *fi;
|
||||||
|
|
||||||
#ifdef BUILD_PIPE_RENDER
|
#ifdef BUILD_PIPE_RENDER
|
||||||
evas_common_pipe_free(im);
|
evas_common_pipe_free(im);
|
||||||
|
@ -172,6 +173,14 @@ _evas_common_rgba_image_delete(Image_Entry *ie)
|
||||||
#ifdef EVAS_CSERVE
|
#ifdef EVAS_CSERVE
|
||||||
if (ie->data1) evas_cserve_image_free(ie);
|
if (ie->data1) evas_cserve_image_free(ie);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
EINA_LIST_FREE(im->filtered, fi)
|
||||||
|
{
|
||||||
|
free(fi->key);
|
||||||
|
_evas_common_rgba_image_delete((Image_Entry *)(fi->image));
|
||||||
|
free(fi);
|
||||||
|
}
|
||||||
|
|
||||||
free(im);
|
free(im);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -519,6 +519,8 @@ typedef enum _Font_Rend_Flags
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
typedef struct _Filtered_Image Filtered_Image;
|
||||||
|
|
||||||
struct _RGBA_Image_Loadopts
|
struct _RGBA_Image_Loadopts
|
||||||
{
|
{
|
||||||
int scale_down_by; // if > 1 then use this
|
int scale_down_by; // if > 1 then use this
|
||||||
|
@ -803,6 +805,8 @@ struct _RGBA_Image
|
||||||
Eina_Bool dirty: 1;
|
Eina_Bool dirty: 1;
|
||||||
} mask;
|
} mask;
|
||||||
|
|
||||||
|
Eina_List *filtered;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
LK(lock);
|
LK(lock);
|
||||||
Eina_List *list;
|
Eina_List *list;
|
||||||
|
@ -832,6 +836,14 @@ struct _RGBA_Map_Point
|
||||||
FPc px, py, z0, foc;
|
FPc px, py, z0, foc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _Filtered_Image
|
||||||
|
{
|
||||||
|
void *key;
|
||||||
|
size_t keylen;
|
||||||
|
RGBA_Image *image;
|
||||||
|
int ref;
|
||||||
|
};
|
||||||
|
|
||||||
// for fonts...
|
// for fonts...
|
||||||
/////
|
/////
|
||||||
typedef struct _Fash_Item_Index_Map Fash_Item_Index_Map;
|
typedef struct _Fash_Item_Index_Map Fash_Item_Index_Map;
|
||||||
|
|
|
@ -381,6 +381,30 @@ struct _Evas_Map
|
||||||
Evas_Map_Point points[]; // actual points
|
Evas_Map_Point points[]; // actual points
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* 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 *);
|
||||||
|
|
||||||
|
Evas_Software_Filter_Fn evas_filter_software_get(Evas_Filter_Info *info);
|
||||||
|
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);
|
||||||
|
|
||||||
struct _Evas_Object
|
struct _Evas_Object
|
||||||
{
|
{
|
||||||
EINA_INLIST;
|
EINA_INLIST;
|
||||||
|
@ -449,6 +473,8 @@ struct _Evas_Object
|
||||||
Eina_Bool redraw;
|
Eina_Bool redraw;
|
||||||
} proxy;
|
} proxy;
|
||||||
|
|
||||||
|
Evas_Filter_Info *filter;
|
||||||
|
|
||||||
Evas_Size_Hints *size_hints;
|
Evas_Size_Hints *size_hints;
|
||||||
|
|
||||||
int last_mouse_down_counter;
|
int last_mouse_down_counter;
|
||||||
|
@ -689,6 +715,11 @@ struct _Evas_Func
|
||||||
Eina_Bool (*font_text_props_info_create) (void *data __UNUSED__, void *font, const Eina_Unicode *text, Evas_Text_Props *intl_props, const Evas_BiDi_Paragraph_Props *par_props, size_t pos, size_t len);
|
Eina_Bool (*font_text_props_info_create) (void *data __UNUSED__, void *font, const Eina_Unicode *text, Evas_Text_Props *intl_props, const Evas_BiDi_Paragraph_Props *par_props, size_t pos, size_t len);
|
||||||
int (*font_right_inset_get) (void *data, void *font, const Evas_Text_Props *text_props);
|
int (*font_right_inset_get) (void *data, void *font, const Evas_Text_Props *text_props);
|
||||||
|
|
||||||
|
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 *);
|
||||||
|
|
||||||
/* EFL-GL Glue Layer */
|
/* EFL-GL Glue Layer */
|
||||||
void *(*gl_surface_create) (void *data, void *config, int w, int h);
|
void *(*gl_surface_create) (void *data, void *config, int w, int h);
|
||||||
int (*gl_surface_destroy) (void *data, void *surface);
|
int (*gl_surface_destroy) (void *data, void *surface);
|
||||||
|
|
|
@ -22,6 +22,7 @@ evas_gl_image.c \
|
||||||
evas_gl_font.c \
|
evas_gl_font.c \
|
||||||
evas_gl_polygon.c \
|
evas_gl_polygon.c \
|
||||||
evas_gl_line.c \
|
evas_gl_line.c \
|
||||||
|
evas_gl_filter.c \
|
||||||
shader/rect_frag.h \
|
shader/rect_frag.h \
|
||||||
shader/rect_frag_bin_s3c6410.h \
|
shader/rect_frag_bin_s3c6410.h \
|
||||||
shader/rect_vert.h \
|
shader/rect_vert.h \
|
||||||
|
@ -61,7 +62,25 @@ shader/tex_vert_bin_s3c6410.h \
|
||||||
shader/tex_nomul_frag.h \
|
shader/tex_nomul_frag.h \
|
||||||
shader/tex_nomul_frag_bin_s3c6410.h \
|
shader/tex_nomul_frag_bin_s3c6410.h \
|
||||||
shader/tex_nomul_vert.h \
|
shader/tex_nomul_vert.h \
|
||||||
shader/tex_nomul_vert_bin_s3c6410.h
|
shader/tex_nomul_vert_bin_s3c6410.h \
|
||||||
|
shader/filter_invert.h \
|
||||||
|
shader/filter_invert_nomul.h \
|
||||||
|
shader/filter_invert_bgra.h \
|
||||||
|
shader/filter_invert_bgra_nomul.h \
|
||||||
|
shader/filter_sepia.h \
|
||||||
|
shader/filter_sepia_nomul.h \
|
||||||
|
shader/filter_sepia_bgra.h \
|
||||||
|
shader/filter_sepia_bgra_nomul.h \
|
||||||
|
shader/filter_greyscale.h \
|
||||||
|
shader/filter_greyscale_nomul.h \
|
||||||
|
shader/filter_greyscale_bgra.h \
|
||||||
|
shader/filter_greyscale_bgra_nomul.h \
|
||||||
|
shader/filter_blur.h \
|
||||||
|
shader/filter_blur_nomul.h \
|
||||||
|
shader/filter_blur_bgra.h \
|
||||||
|
shader/filter_blur_bgra_nomul.h
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
libevas_engine_gl_common_la_LIBADD = @EINA_LIBS@ @evas_engine_gl_common_libs@ @dlopen_libs@
|
libevas_engine_gl_common_la_LIBADD = @EINA_LIBS@ @evas_engine_gl_common_libs@ @dlopen_libs@
|
||||||
endif
|
endif
|
||||||
|
@ -96,4 +115,21 @@ shader/tex_frag.shd \
|
||||||
shader/tex_frag_s3c6410.asm \
|
shader/tex_frag_s3c6410.asm \
|
||||||
shader/tex_vert.shd \
|
shader/tex_vert.shd \
|
||||||
shader/tex_nomul_frag.shd \
|
shader/tex_nomul_frag.shd \
|
||||||
shader/tex_nomul_vert.shd
|
shader/tex_nomul_vert.shd \
|
||||||
|
shader/filter_invert.shd \
|
||||||
|
shader/filter_invert_nomul.shd \
|
||||||
|
shader/filter_invert_bgra.shd \
|
||||||
|
shader/filter_invert_bgra_nomul.shd \
|
||||||
|
shader/filter_greyscale.shd \
|
||||||
|
shader/filter_greyscale_nomul.shd \
|
||||||
|
shader/filter_greyscale_bgra.shd \
|
||||||
|
shader/filter_greyscale_bgra_nomul.shd \
|
||||||
|
shader/filter_sepia.shd \
|
||||||
|
shader/filter_sepia_nomul.shd \
|
||||||
|
shader/filter_sepia_bgra.shd \
|
||||||
|
shader/filter_sepia_bgra_nomul.shd \
|
||||||
|
shader/filter_blur.shd \
|
||||||
|
shader/filter_blur_nomul.shd \
|
||||||
|
shader/filter_blur_bgra.shd \
|
||||||
|
shader/filter_blur_bgra_nomul.shd
|
||||||
|
|
||||||
|
|
|
@ -196,6 +196,18 @@ struct _Evas_GL_Shared
|
||||||
Evas_GL_Program img_mask;
|
Evas_GL_Program img_mask;
|
||||||
Evas_GL_Program yuv, yuv_nomul;
|
Evas_GL_Program yuv, yuv_nomul;
|
||||||
Evas_GL_Program tex, tex_nomul;
|
Evas_GL_Program tex, tex_nomul;
|
||||||
|
|
||||||
|
Evas_GL_Program filter_invert, filter_invert_nomul;
|
||||||
|
Evas_GL_Program filter_invert_bgra, filter_invert_bgra_nomul;
|
||||||
|
Evas_GL_Program filter_greyscale, filter_greyscale_nomul;
|
||||||
|
Evas_GL_Program filter_greyscale_bgra, filter_greyscale_bgra_nomul;
|
||||||
|
Evas_GL_Program filter_sepia, filter_sepia_nomul;
|
||||||
|
Evas_GL_Program filter_sepia_bgra, filter_sepia_bgra_nomul;
|
||||||
|
#if 0
|
||||||
|
Evas_GL_Program filter_blur_vert;
|
||||||
|
Evas_GL_Program filter_blur, filter_blur_nomul;
|
||||||
|
Evas_GL_Program filter_blur_bgra, filter_blur_bgra_nomul;
|
||||||
|
#endif
|
||||||
} shader;
|
} shader;
|
||||||
int references;
|
int references;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
@ -286,6 +298,9 @@ struct _Evas_Engine_GL_Context
|
||||||
|
|
||||||
Evas_GL_Image *def_surface;
|
Evas_GL_Image *def_surface;
|
||||||
|
|
||||||
|
/* If this is set: Force drawing with a particular filter */
|
||||||
|
GLuint filter_prog;
|
||||||
|
|
||||||
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
#if defined (GLES_VARIETY_S3C6410) || defined (GLES_VARIETY_SGX)
|
||||||
// FIXME: hack. expose egl display to gl core for egl image sec extn.
|
// FIXME: hack. expose egl display to gl core for egl image sec extn.
|
||||||
void *egldisp;
|
void *egldisp;
|
||||||
|
@ -357,6 +372,8 @@ struct _Evas_GL_Image
|
||||||
int scale_hint, content_hint;
|
int scale_hint, content_hint;
|
||||||
int csize;
|
int csize;
|
||||||
|
|
||||||
|
Eina_List *filtered;
|
||||||
|
|
||||||
unsigned char dirty : 1;
|
unsigned char dirty : 1;
|
||||||
unsigned char cached : 1;
|
unsigned char cached : 1;
|
||||||
unsigned char alpha : 1;
|
unsigned char alpha : 1;
|
||||||
|
@ -405,6 +422,27 @@ 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_frag_src;
|
||||||
extern Evas_GL_Program_Source shader_tex_nomul_vert_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;
|
||||||
|
#if 0
|
||||||
|
/* 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 glerr(int err, const char *file, const char *func, int line, const char *op);
|
||||||
|
|
||||||
Evas_Engine_GL_Context *evas_gl_common_context_new(void);
|
Evas_Engine_GL_Context *evas_gl_common_context_new(void);
|
||||||
|
@ -497,6 +535,7 @@ void evas_gl_common_image_cache_flush(Evas_Engine_GL_Context *gc);
|
||||||
void evas_gl_common_image_free(Evas_GL_Image *im);
|
void evas_gl_common_image_free(Evas_GL_Image *im);
|
||||||
Evas_GL_Image *evas_gl_common_image_surface_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha);
|
Evas_GL_Image *evas_gl_common_image_surface_new(Evas_Engine_GL_Context *gc, unsigned int w, unsigned int h, int alpha);
|
||||||
void evas_gl_common_image_dirty(Evas_GL_Image *im, unsigned int x, unsigned int y, unsigned int w, unsigned int h);
|
void evas_gl_common_image_dirty(Evas_GL_Image *im, unsigned int x, unsigned int y, unsigned int w, unsigned int h);
|
||||||
|
void evas_gl_common_image_update(Evas_Engine_GL_Context *gc, Evas_GL_Image *im);
|
||||||
void evas_gl_common_image_map_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int npoints, RGBA_Map_Point *p, int smooth, int level);
|
void evas_gl_common_image_map_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int npoints, RGBA_Map_Point *p, int smooth, int level);
|
||||||
void evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth);
|
void evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int sx, int sy, int sw, int sh, int dx, int dy, int dw, int dh, int smooth);
|
||||||
|
|
||||||
|
@ -510,6 +549,12 @@ void evas_gl_common_poly_draw(Evas_Engine_GL_Context *gc, Evas_GL_P
|
||||||
|
|
||||||
void evas_gl_common_line_draw(Evas_Engine_GL_Context *gc, int x1, int y1, int x2, int y2);
|
void evas_gl_common_line_draw(Evas_Engine_GL_Context *gc, int x1, int y1, int x2, int y2);
|
||||||
|
|
||||||
|
void evas_gl_common_filter_draw(void *data, Evas_Engine_GL_Context *context, void *image, 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 *);
|
||||||
|
|
||||||
|
|
||||||
extern void (*glsym_glGenFramebuffers) (GLsizei a, GLuint *b);
|
extern void (*glsym_glGenFramebuffers) (GLsizei a, GLuint *b);
|
||||||
extern void (*glsym_glBindFramebuffer) (GLenum 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);
|
extern void (*glsym_glFramebufferTexture2D) (GLenum a, GLenum b, GLenum c, GLuint d, GLint e);
|
||||||
|
|
|
@ -470,7 +470,91 @@ _evas_gl_common_viewport_set(Evas_Engine_GL_Context *gc)
|
||||||
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_mask.prog, "mvp"), 1,
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.img_mask.prog, "mvp"), 1,
|
||||||
GL_FALSE, proj);
|
GL_FALSE, proj);
|
||||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_invert.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_invert.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_invert_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_invert_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_invert_bgra.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_invert_bgra.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_invert_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_invert_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
|
||||||
|
glUseProgram(gc->shared->shader.filter_greyscale.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_greyscale.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_greyscale_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_greyscale_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_greyscale_bgra.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_greyscale_bgra.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_greyscale_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_greyscale_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
|
||||||
|
glUseProgram(gc->shared->shader.filter_sepia.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_sepia.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_sepia_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_sepia_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_sepia_bgra.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_sepia_bgra.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_sepia_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_sepia_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
glUseProgram(gc->shared->shader.filter_blur_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_blur_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_blur_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_blur_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_blur_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_blur_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUseProgram(gc->shared->shader.filter_blur_bgra_nomul.prog);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(gc->shared->shader.filter_blur_bgra_nomul.prog, "mvp"), 1,
|
||||||
|
GL_FALSE, proj);
|
||||||
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
glUseProgram(gc->pipe[0].shader.cur_prog);
|
glUseProgram(gc->pipe[0].shader.cur_prog);
|
||||||
|
@ -726,6 +810,78 @@ evas_gl_common_context_new(void)
|
||||||
&(shader_yuv_nomul_frag_src),
|
&(shader_yuv_nomul_frag_src),
|
||||||
"yuv_nomul")) goto error;
|
"yuv_nomul")) goto error;
|
||||||
|
|
||||||
|
/* Most of the filters use the image fragment shader */
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_invert),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_invert_frag_src),
|
||||||
|
"filter_invert")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_invert_nomul),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_invert_nomul_frag_src),
|
||||||
|
"filter_invert_nomul")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_invert_bgra),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_invert_bgra_frag_src),
|
||||||
|
"filter_invert_bgra")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_invert_bgra_nomul),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_invert_bgra_nomul_frag_src),
|
||||||
|
"filter_invert_bgra_nomul")) goto error;
|
||||||
|
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_sepia),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_sepia_frag_src),
|
||||||
|
"filter_sepia")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_sepia_nomul),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_sepia_nomul_frag_src),
|
||||||
|
"filter_sepia_nomul")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_sepia_bgra),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_sepia_bgra_frag_src),
|
||||||
|
"filter_sepia_bgra")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_sepia_bgra_nomul),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_sepia_bgra_nomul_frag_src),
|
||||||
|
"filter_sepia_bgra_nomul")) goto error;
|
||||||
|
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_greyscale),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_greyscale_frag_src),
|
||||||
|
"filter_greyscale")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_greyscale_nomul),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_greyscale_nomul_frag_src),
|
||||||
|
"filter_greyscale_nomul")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_greyscale_bgra),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_greyscale_bgra_frag_src),
|
||||||
|
"filter_greyscale_bgra")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_greyscale_bgra_nomul),
|
||||||
|
&(shader_img_vert_src),
|
||||||
|
&(shader_filter_greyscale_bgra_nomul_frag_src),
|
||||||
|
"filter_greyscale_bgra_nomul")) goto error;
|
||||||
|
#if 0
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_blur),
|
||||||
|
&(shader_filter_blur_vert_src),
|
||||||
|
&(shader_filter_blur_frag_src),
|
||||||
|
"filter_blur")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_blur_nomul),
|
||||||
|
&(shader_filter_blur_vert_src),
|
||||||
|
&(shader_filter_blur_nomul_frag_src),
|
||||||
|
"filter_blur_nomul")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_blur_bgra),
|
||||||
|
&(shader_filter_blur_vert_src),
|
||||||
|
&(shader_filter_blur_bgra_frag_src),
|
||||||
|
"filter_blur_bgra")) goto error;
|
||||||
|
if (!evas_gl_common_shader_program_init(&(shared->shader.filter_blur_bgra_nomul),
|
||||||
|
&(shader_filter_blur_vert_src),
|
||||||
|
&(shader_filter_blur_bgra_nomul_frag_src),
|
||||||
|
"filter_blur_bgra_nomul")) goto error;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
glUseProgram(shared->shader.yuv.prog);
|
glUseProgram(shared->shader.yuv.prog);
|
||||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||||
glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "tex"), 0);
|
glUniform1i(glGetUniformLocation(shared->shader.yuv.prog, "tex"), 0);
|
||||||
|
@ -821,6 +977,8 @@ evas_gl_common_context_free(Evas_Engine_GL_Context *gc)
|
||||||
evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex));
|
evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex));
|
||||||
evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex_nomul));
|
evas_gl_common_shader_program_shutdown(&(gc->shared->shader.tex_nomul));
|
||||||
|
|
||||||
|
evas_gl_common_shader_program_shutdown(&(gc->shared->shader.filter_invert));
|
||||||
|
|
||||||
while (gc->shared->images)
|
while (gc->shared->images)
|
||||||
{
|
{
|
||||||
evas_gl_common_image_free(gc->shared->images->data);
|
evas_gl_common_image_free(gc->shared->images->data);
|
||||||
|
@ -1367,7 +1525,11 @@ evas_gl_common_context_image_push(Evas_Engine_GL_Context *gc,
|
||||||
if (!tex->alpha) blend = 0;
|
if (!tex->alpha) blend = 0;
|
||||||
if (a < 255) blend = 1;
|
if (a < 255) blend = 1;
|
||||||
|
|
||||||
if (tex_only)
|
if (gc->filter_prog)
|
||||||
|
{
|
||||||
|
prog = gc->filter_prog;
|
||||||
|
}
|
||||||
|
else if (tex_only)
|
||||||
{
|
{
|
||||||
if (tex->pt->dyn.img)
|
if (tex->pt->dyn.img)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
#include "evas_gl_private.h"
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
evas_gl_common_filter_draw(void *data, Evas_Engine_GL_Context *gc,
|
||||||
|
void *image, Evas_Filter_Info *filter)
|
||||||
|
{
|
||||||
|
Evas_GL_Image *im = image;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
|
|
@ -433,6 +433,9 @@ evas_gl_common_image_cache_flush(Evas_Engine_GL_Context *gc)
|
||||||
void
|
void
|
||||||
evas_gl_common_image_free(Evas_GL_Image *im)
|
evas_gl_common_image_free(Evas_GL_Image *im)
|
||||||
{
|
{
|
||||||
|
Filtered_Image *fi;
|
||||||
|
|
||||||
|
evas_gl_common_context_flush(im->gc);
|
||||||
im->references--;
|
im->references--;
|
||||||
if (im->references > 0) return;
|
if (im->references > 0) return;
|
||||||
|
|
||||||
|
@ -449,6 +452,15 @@ evas_gl_common_image_free(Evas_GL_Image *im)
|
||||||
}
|
}
|
||||||
if (im->im) evas_cache_image_drop(&im->im->cache_entry);
|
if (im->im) evas_cache_image_drop(&im->im->cache_entry);
|
||||||
if (im->tex) evas_gl_common_texture_free(im->tex);
|
if (im->tex) evas_gl_common_texture_free(im->tex);
|
||||||
|
|
||||||
|
EINA_LIST_FREE(im->filtered, fi)
|
||||||
|
{
|
||||||
|
free(fi->key);
|
||||||
|
evas_gl_common_image_free((Evas_GL_Image *)fi->image);
|
||||||
|
free(fi);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
free(im);
|
free(im);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -485,8 +497,8 @@ evas_gl_common_image_dirty(Evas_GL_Image *im, unsigned int x, unsigned int y, un
|
||||||
im->dirty = 1;
|
im->dirty = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
_evas_gl_common_image_update(Evas_Engine_GL_Context *gc, Evas_GL_Image *im)
|
evas_gl_common_image_update(Evas_Engine_GL_Context *gc, Evas_GL_Image *im)
|
||||||
{
|
{
|
||||||
if (!im->im) return;
|
if (!im->im) return;
|
||||||
/*
|
/*
|
||||||
|
@ -574,7 +586,7 @@ evas_gl_common_image_map_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im,
|
||||||
r = g = b = a = 255;
|
r = g = b = a = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
_evas_gl_common_image_update(gc, im);
|
evas_gl_common_image_update(gc, im);
|
||||||
|
|
||||||
c = gc->dc->clip.use;
|
c = gc->dc->clip.use;
|
||||||
cx = gc->dc->clip.x; cy = gc->dc->clip.y;
|
cx = gc->dc->clip.x; cy = gc->dc->clip.y;
|
||||||
|
@ -616,7 +628,7 @@ evas_gl_common_image_draw(Evas_Engine_GL_Context *gc, Evas_GL_Image *im, int sx,
|
||||||
r = g = b = a = 255;
|
r = g = b = a = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
_evas_gl_common_image_update(gc, im);
|
evas_gl_common_image_update(gc, im);
|
||||||
if (!im->tex)
|
if (!im->tex)
|
||||||
{
|
{
|
||||||
evas_gl_common_rect_draw(gc, dx, dy, dw, dh);
|
evas_gl_common_rect_draw(gc, dx, dy, dw, dh);
|
||||||
|
|
|
@ -442,6 +442,167 @@ Evas_GL_Program_Source shader_img_bgra_nomul_vert_src =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
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
|
static void
|
||||||
gl_compile_link_error(GLuint target, const char *action)
|
gl_compile_link_error(GLuint target, const char *action)
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\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"
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\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"
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\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"
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump float;\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"
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
"#ifdef GL_ES\n"
|
||||||
|
"precision mediump 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 shoudl 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"
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump 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 shoudl 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;
|
||||||
|
}
|
|
@ -1557,6 +1557,40 @@ eng_image_native_get(void *data __UNUSED__, void *image)
|
||||||
return &(n->ns);
|
return &(n->ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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(data, 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -2596,6 +2630,10 @@ module_open(Evas_Module *em)
|
||||||
ORD(image_mask_create);
|
ORD(image_mask_create);
|
||||||
ORD(image_native_set);
|
ORD(image_native_set);
|
||||||
ORD(image_native_get);
|
ORD(image_native_get);
|
||||||
|
ORD(image_draw_filtered);
|
||||||
|
ORD(image_filtered_get);
|
||||||
|
ORD(image_filtered_save);
|
||||||
|
ORD(image_filtered_free);
|
||||||
|
|
||||||
ORD(font_draw);
|
ORD(font_draw);
|
||||||
|
|
||||||
|
|
|
@ -855,6 +855,88 @@ eng_canvas_alpha_get(void *data __UNUSED__, void *info __UNUSED__)
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Filter API */
|
||||||
|
static void
|
||||||
|
eng_image_draw_filtered(void *data, void *context, 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);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*****
|
*****
|
||||||
**
|
**
|
||||||
|
@ -975,6 +1057,10 @@ static Evas_Func func =
|
||||||
eng_font_pen_coords_get,
|
eng_font_pen_coords_get,
|
||||||
eng_font_text_props_info_create,
|
eng_font_text_props_info_create,
|
||||||
eng_font_right_inset_get,
|
eng_font_right_inset_get,
|
||||||
|
eng_image_draw_filtered,
|
||||||
|
eng_image_filtered_get,
|
||||||
|
eng_image_filtered_save,
|
||||||
|
eng_image_filtered_free,
|
||||||
NULL, // FIXME: need software mesa for gl rendering <- gl_surface_create
|
NULL, // FIXME: need software mesa for gl rendering <- gl_surface_create
|
||||||
NULL, // FIXME: need software mesa for gl rendering <- gl_surface_destroy
|
NULL, // FIXME: need software mesa for gl rendering <- gl_surface_destroy
|
||||||
NULL, // FIXME: need software mesa for gl rendering <- gl_context_create
|
NULL, // FIXME: need software mesa for gl rendering <- gl_context_create
|
||||||
|
|
Loading…
Reference in New Issue