2013-12-08 22:54:48 -08:00
# ifndef _EVAS_FILTER_H
# define _EVAS_FILTER_H
# include "evas_common_private.h"
typedef struct _Evas_Filter_Context Evas_Filter_Context ;
typedef struct _Evas_Filter_Command Evas_Filter_Command ;
typedef struct _Evas_Filter_Program Evas_Filter_Program ;
typedef struct _Evas_Filter_Instruction Evas_Filter_Instruction ;
typedef struct _Evas_Filter_Buffer Evas_Filter_Buffer ;
typedef enum _Evas_Filter_Mode Evas_Filter_Mode ;
typedef enum _Evas_Filter_Blur_Type Evas_Filter_Blur_Type ;
typedef enum _Evas_Filter_Channel Evas_Filter_Channel ;
typedef enum _Evas_Filter_Displacement_Flags Evas_Filter_Displacement_Flags ;
typedef enum _Evas_Filter_Bump_Flags Evas_Filter_Bump_Flags ;
2013-12-30 23:01:06 -08:00
typedef enum _Evas_Filter_Fill_Mode Evas_Filter_Fill_Mode ;
2014-01-06 23:44:10 -08:00
typedef enum _Evas_Filter_Transform_Flags Evas_Filter_Transform_Flags ;
2013-12-08 22:54:48 -08:00
typedef Eina_Bool ( * Evas_Filter_Apply_Func ) ( Evas_Filter_Command * cmd ) ;
typedef void ( * Evas_Filter_Cb ) ( Evas_Filter_Context * ctx , void * data ) ;
# define EVAS_FILTER_BUFFER_RGBA EINA_FALSE
# define EVAS_FILTER_BUFFER_ALPHA EINA_TRUE
enum _Evas_Filter_Mode
{
EVAS_FILTER_MODE_BLEND , /**< Blend with current context render_op */
EVAS_FILTER_MODE_BLUR , /**< @see Evas_Filter_Blur_Type */
EVAS_FILTER_MODE_CURVE , /**< Apply color curve */
EVAS_FILTER_MODE_DISPLACE , /**< Apply XY displacement based on RG mask */
2013-12-12 00:46:46 -08:00
EVAS_FILTER_MODE_FILL , /**< Fill a buffer with a solid color */
2013-12-08 22:54:48 -08:00
EVAS_FILTER_MODE_MASK , /**< Apply Alpha or RGBA texture on image */
EVAS_FILTER_MODE_BUMP , /**< Apply bump mapping (light effect) */
2014-01-06 23:44:10 -08:00
EVAS_FILTER_MODE_TRANSFORM , /**< Apply a simple geometrical transformation */
2013-12-08 22:54:48 -08:00
EVAS_FILTER_MODE_LAST
} ;
enum _Evas_Filter_Blur_Type
{
EVAS_FILTER_BLUR_GAUSSIAN = 0x0 , // Gaussian or sine curve. O(nm)
EVAS_FILTER_BLUR_BOX = 0x1 , // Optimizable. But, UGLY. O(n)
EVAS_FILTER_BLUR_MOTION = 0x2 , // Not implemented
EVAS_FILTER_BLUR_LAST ,
EVAS_FILTER_BLUR_DEFAULT = EVAS_FILTER_BLUR_GAUSSIAN
} ;
enum _Evas_Filter_Channel
{
EVAS_FILTER_CHANNEL_ALPHA = 0 ,
EVAS_FILTER_CHANNEL_RED = 1 ,
EVAS_FILTER_CHANNEL_GREEN = 2 ,
EVAS_FILTER_CHANNEL_BLUE = 3 ,
EVAS_FILTER_CHANNEL_RGB = 4
} ;
enum _Evas_Filter_Displacement_Flags
{
EVAS_FILTER_DISPLACE_NEAREST = 0x0 , /**< Interpolate between pixels (linear interpolation) */
2014-01-06 17:16:39 -08:00
EVAS_FILTER_DISPLACE_LINEAR = 0x1 , /**< Interpolate between pixels (linear interpolation) */
2013-12-08 22:54:48 -08:00
EVAS_FILTER_DISPLACE_BLACK = 0x0 , /**< Use black (or transparent) when going out of bounds) */
2014-01-06 17:16:39 -08:00
EVAS_FILTER_DISPLACE_STRETCH = 0x2 , /**< Stretch border pixels when going out of bounds */
EVAS_FILTER_DISPLACE_BITMASK = 0x3
2013-12-08 22:54:48 -08:00
} ;
enum _Evas_Filter_Bump_Flags
{
EVAS_FILTER_BUMP_NORMAL = 0x0 ,
EVAS_FILTER_BUMP_COMPENSATE = 0x1 /**< Compensate for darkening (diffuse light) or brightening (specular light) of zero gradient surfaces */
} ;
2013-12-30 23:01:06 -08:00
enum _Evas_Filter_Fill_Mode
{
EVAS_FILTER_FILL_MODE_NONE = 0x0 ,
EVAS_FILTER_FILL_MODE_STRETCH_X = 0x1 ,
EVAS_FILTER_FILL_MODE_STRETCH_Y = 0x2 ,
EVAS_FILTER_FILL_MODE_REPEAT_X = 0x4 ,
EVAS_FILTER_FILL_MODE_REPEAT_Y = 0x8 ,
EVAS_FILTER_FILL_MODE_REPEAT_X_STRETCH_Y = EVAS_FILTER_FILL_MODE_REPEAT_X | EVAS_FILTER_FILL_MODE_STRETCH_Y ,
EVAS_FILTER_FILL_MODE_REPEAT_Y_STRETCH_X = EVAS_FILTER_FILL_MODE_REPEAT_Y | EVAS_FILTER_FILL_MODE_STRETCH_X ,
EVAS_FILTER_FILL_MODE_REPEAT_XY = EVAS_FILTER_FILL_MODE_REPEAT_X | EVAS_FILTER_FILL_MODE_REPEAT_Y ,
EVAS_FILTER_FILL_MODE_STRETCH_XY = EVAS_FILTER_FILL_MODE_STRETCH_X | EVAS_FILTER_FILL_MODE_STRETCH_Y
} ;
2014-01-06 23:44:10 -08:00
enum _Evas_Filter_Transform_Flags
{
EVAS_FILTER_TRANSFORM_VFLIP = 1
} ;
2013-12-08 22:54:48 -08:00
/* Parser stuff (high level API) */
Evas_Filter_Program * evas_filter_program_new ( const char * name ) ;
Eina_Bool evas_filter_program_parse ( Evas_Filter_Program * pgm , const char * str ) ;
void evas_filter_program_del ( Evas_Filter_Program * pgm ) ;
Eina_Bool evas_filter_context_program_use ( Evas_Filter_Context * ctx , Evas_Object * eo_obj , Evas_Filter_Program * pgm ) ;
Eina_Bool evas_filter_program_padding_get ( Evas_Filter_Program * pgm , int * l , int * r , int * t , int * b ) ;
void evas_filter_program_proxy_source_bind ( Evas_Filter_Program * pgm , const char * name , Evas_Object * object ) ;
Evas_Object * evas_filter_program_proxy_source_get ( Evas_Filter_Program * pgm , const char * name ) ;
void evas_filter_context_proxy_render_all ( Evas_Filter_Context * ctx , Eo * eo_obj , Eina_Bool do_async ) ;
/* Filter context (low level) */
Evas_Filter_Context * evas_filter_context_new ( Evas_Public_Data * evas ) ;
void evas_filter_context_destroy ( Evas_Filter_Context * ctx ) ;
void evas_filter_context_post_run_callback_set ( Evas_Filter_Context * ctx , Evas_Filter_Cb cb , void * data ) ;
# define evas_filter_context_autodestroy(ctx) evas_filter_context_post_run_callback_set(ctx, ((Evas_Filter_Cb) evas_filter_context_destroy), ctx)
int evas_filter_buffer_empty_new ( Evas_Filter_Context * ctx , Eina_Bool alpha_only ) ;
int evas_filter_buffer_image_new ( Evas_Filter_Context * ctx , RGBA_Image * image ) ;
int evas_filter_buffer_data_new ( Evas_Filter_Context * ctx , void * data , int w , int h , Eina_Bool alpha_only ) ;
# define evas_filter_buffer_alloc_new(ctx, w, h, a) evas_filter_buffer_data_new(ctx, NULL, w, h, a)
void * evas_filter_buffer_backing_get ( Evas_Filter_Context * ctx , int bufid ) ;
Eina_Bool evas_filter_buffer_data_set ( Evas_Filter_Context * ctx , int bufid , void * data , int w , int h , Eina_Bool alpha_only ) ;
Eina_Bool evas_filter_run ( Evas_Filter_Context * ctx , Eina_Bool do_async ) ;
/**
* @ brief Blend a source buffer into a destination buffer , allowing X , Y offsets , Alpha to RGBA conversion with color
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context . Current color is used when inbuf is ALPHA and outbuf is RGBA .
* @ param inbuf Source buffer : ALPHA or RGBA
* @ param outbuf Destination buffer : ALPHA or RGBA ( note : must be RGBA if inbuf is RGBA )
* @ param ox X offset in the destination buffer
* @ param oy Y offset in the destination buffer
2013-12-31 00:51:09 -08:00
* @ param fillmode Specifies whether to repeat or stretch the input onto its destination , and on which axes
2013-12-08 22:54:48 -08:00
* @ return Filter command ID or - 1 in case of error
*/
2013-12-31 00:51:09 -08:00
int evas_filter_command_blend_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int outbuf , int ox , int oy , Evas_Filter_Fill_Mode fillmode ) ;
2013-12-08 22:54:48 -08:00
/**
* @ brief Apply a blur effect on a buffer
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context . Current color is used when inbuf is ALPHA and outbuf is RGBA .
* @ param inbuf Source buffer : ALPHA or RGBA
* @ param outbuf Destination buffer : ALPHA or RGBA ( note : must be RGBA if inbuf is RGBA )
* @ param type Type of blur : BOX , GAUSSIAN or MOTION
* @ param dx X radius of blur . Can be negative ONLY for MOTION blur
* @ param dy Y radius of blur . Can be negative ONLY for MOTION blur
* @ param ox X offset in the destination buffer
* @ param oy Y offset in the destination buffer
* @ return Filter command ID or - 1 in case of error
*/
int evas_filter_command_blur_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int outbuf , Evas_Filter_Blur_Type type , int dx , int dy , int ox , int oy ) ;
2013-12-12 00:46:46 -08:00
/**
* @ brief Fill a buffer with the current color
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context . Current color is used when buf is RGBA , and clip is used to specify the fill area .
* @ param buf Buffer : ALPHA or RGBA
* @ return Filter command ID or - 1 in case of error
* @ note The current draw context ' s render operation is ignored ( always uses COPY mode ) .
*/
int evas_filter_command_fill_add ( Evas_Filter_Context * ctx , void * draw_context , int buf ) ;
2014-01-01 22:57:44 -08:00
/**
* @ brief evas_filter_command_curve_add
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context . Current color is used when buf is RGBA , and clip is used to specify the fill area .
* @ param inbuf Input buffer , ALPHA or RGBA .
* @ param outbuf Output buffer , must have same colorspace as inbuf .
* @ param curve The data points to use , must contain 256 values .
* @ param channel Which channel to apply the curve ( red , green , blue , alpha or RGB )
* @ return Filter command ID or - 1 in case of error
*/
2013-12-12 00:46:46 -08:00
int evas_filter_command_curve_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int outbuf , DATA8 * curve /* 256 elements */ , Evas_Filter_Channel channel ) ;
2013-12-08 22:54:48 -08:00
/**
* @ brief Grow / Shrink an image , as defined in image processing ( this is not a scale algorithm ! )
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context . Current color is used when inbuf is ALPHA and outbuf is RGBA .
* @ param inbuf Source buffer : ALPHA or RGBA
* @ param outbuf Destination buffer : ALPHA or RGBA ( note : must be RGBA if inbuf is RGBA )
* @ param radius Number of pixels to grow by . If negative , shrink instead of grow
* @ param smooth Use smooth blur and curve for grow ( default : true )
* @ return Filter command ID or - 1 in case of error
*/
int evas_filter_command_grow_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int outbuf , int radius , Eina_Bool smooth ) ;
/**
* @ brief Apply a displacement map to a buffer . This will move pixels from the source to the destination based on pixel per pixel offset , as defined in the displacement map
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context ( ignored )
* @ param inbuf Input buffer ( Alpha or RGBA )
* @ param outbuf Output buffer ( Alpha or RGBA ) , same size as inbuf
* @ param dispbuf Displacement map . Should be an RGBA buffer , where the Red and Green channels are the displacement maps for X and Y . Can be also ALPHA buffer , in which case only one dimension can be specified ( X or Y ) .
* @ param flags Alters how the map is interpreted , @ see Evas_Filter_Displacement_Flags
* @ param intensity Maximum offset possible , if the map ' s value is maximal at this point ( ie . 0 or 255 )
2013-12-31 00:51:09 -08:00
* @ param fillmode Specifies how to repeat and stretch the map to fit the target size
2013-12-08 22:54:48 -08:00
* @ return Filter command ID or - 1 in case of error
*/
2013-12-31 00:51:09 -08:00
int evas_filter_command_displacement_map_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int outbuf , int dispbuf , Evas_Filter_Displacement_Flags flags , int intensity , Evas_Filter_Fill_Mode fillmode ) ;
2013-12-08 22:54:48 -08:00
/**
* @ brief Apply a texture to a buffer
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context ( ignored )
* @ param inbuf Input buffer ( Alpha or RGBA )
* @ param maskbuf Texture buffer ( Alpha or RGBA )
* @ param outbuf Output buffer ( Alpha or RGBA )
2013-12-31 00:51:09 -08:00
* @ param fillmode Specifies how to repeat and stretch the mask to fit the target size
2013-12-08 22:54:48 -08:00
* @ return Filter command ID or - 1 in case of error
* @ note For the moment , inbuf can only be ALPHA , and output must be RGBA if mask is RGBA as well
*/
2013-12-31 00:51:09 -08:00
int evas_filter_command_mask_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int maskbuf , int outbuf , Evas_Filter_Fill_Mode fillmode ) ;
2013-12-08 22:54:48 -08:00
/**
* @ brief Apply a relief effect based on a bump map ( Z map )
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context ( ignored )
* @ param inbuf Input buffer ( Alpha or RGBA )
* @ param bumpbuf Bump map ( Alpha only ) , same size as inbuf . By definition , lows are black ( alpha 0 ) and highs are white ( alpha 255 ) .
* @ param outbuf Output buffer ( Alpha or RGBA ) , same size as inbuf
* @ param azimuth CCW angle in degrees from the X axis of the light direction . 0 is light from the right , 90 from the top , 180 from the left , 270 from the bottom . All values are valid .
* @ param elevation Angle in degrees between the XY plane and the light . Only values from 0 ( light is perfectly horizontal ) to 90 ( light comes from the viewer herself ) are acceptable .
* @ param depth Max depth in the bump map . Default value is 10.
* @ param specular_factor Factor for the specular light effect ( shininess ) . Ranges from 1.0 to 1000 + with logarithmic effects
* @ param black Darkest color , defines the ambiant light
* @ param color Light ' s normal color
* @ param white Brightest color , used in the shininess effect
* @ param flags Optional flags : compensation for darkening
2013-12-31 00:51:09 -08:00
* @ param fillmode Specifies how to repeat and stretch the map to fit the target size
2013-12-08 22:54:48 -08:00
* @ return Filter command ID or - 1 in case of error
*/
2013-12-31 00:51:09 -08:00
int evas_filter_command_bump_map_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int bumpbuf , int outbuf , float azimuth , float elevation , float depth , float specular_factor , DATA32 black , DATA32 color , DATA32 white , Evas_Filter_Bump_Flags flags , Evas_Filter_Fill_Mode fillmode ) ;
2013-12-08 22:54:48 -08:00
2014-01-06 23:44:10 -08:00
/**
* @ brief Apply a geometrical transformation to the buffer
* @ param ctx Current filter chain
* @ param draw_context Current Evas draw context ( ignored )
* @ param inbuf Input buffer ( Alpha or RGBA )
* @ param outbuf Output buffer ( Alpha or RGBA ) , same size as inbuf
* @ param flags Specifies the operation to apply ( eg . vflip )
* @ return Filter command ID or - 1 in case of error
*/
int evas_filter_command_transform_add ( Evas_Filter_Context * ctx , void * draw_context , int inbuf , int outbuf , Evas_Filter_Transform_Flags flags ) ;
2013-12-08 22:54:48 -08:00
# endif