2013-12-08 22:57:50 -08:00
# ifndef EVAS_FILTER_PRIVATE_H
# define EVAS_FILTER_PRIVATE_H
# include "evas_filter.h"
# include "evas_private.h"
// This is a potential optimization.
# define DIV_USING_BITSHIFT 1
# ifdef LITTLE_ENDIAN
# define ALPHA 3
# define RGB0 0
# define RGB3 3
# define RED 2
# define GREEN 1
# define BLUE 0
# else
# define ALPHA 0
# define RGB0 1
# define RGB3 4
# define RED 0
# define GREEN 1
# define BLUE 2
# endif
// RGBA = (((a) << 24) + ((r) << 16) + ((g) << 8) + (b))
# define ALPHA_OF(a) ((a) >> 24)
# define RED_OF(a) (((a) >> 16) & 0xff)
# define GREEN_OF(a) (((a) >> 8) & 0xff)
# define BLUE_OF(a) ((a) & 0xff)
// Helpers
# define ENFN ctx->evas->engine.func
# define ENDT ctx->evas->engine.data.output
2014-01-01 19:43:44 -08:00
# define BUFFERS_LOCK() do { if (cmd->input) cmd->input->locked = 1; if (cmd->output) cmd->output->locked = 1; if (cmd->mask) cmd->mask->locked = 1; } while (0)
# define BUFFERS_UNLOCK() do { if (cmd->input) cmd->input->locked = 0; if (cmd->output) cmd->output->locked = 0; if (cmd->mask) cmd->mask->locked = 0; } while (0)
2013-12-08 22:57:50 -08:00
struct _Evas_Filter_Context
{
Evas_Public_Data * evas ;
Eina_Inlist * commands ;
Eina_List * buffers ; // Evas_Filter_Buffer *
int last_buffer_id ;
int last_command_id ;
2013-12-30 19:43:03 -08:00
int w , h ; // Change at each run
2013-12-08 22:57:50 -08:00
struct
{
/** Post-processing callback. The context can be safely destroyed here. */
Evas_Filter_Cb cb ;
void * data ;
} post_run ;
} ;
struct _Evas_Filter_Command
{
EINA_INLIST ;
int id ;
Evas_Filter_Mode mode ;
Evas_Filter_Context * ctx ;
Evas_Filter_Buffer * input ;
Evas_Filter_Buffer * mask ;
Evas_Filter_Buffer * output ;
union
{
struct
{
int dx , dy ;
Evas_Filter_Blur_Type type ;
} blur ;
struct
{
DATA8 * data ; // Pointer to 256 char array
Evas_Filter_Channel channel ;
} curve ;
struct
{
// mask is an Alpha or RG(BA) texture, see flags. Must be of the same size as the input & output buffers (for now, FIXME)
Evas_Filter_Displacement_Flags flags ;
int intensity ; // Max displacement in pixels
} displacement ;
struct
{
float xyangle ; // in degrees: 0-360 (modulo)
float zangle ; // degrees: 0-90 (defaults to 0)
float specular_factor ; // range TBD: 0-...
float elevation ;
DATA32 dark ;
DATA32 color ;
DATA32 white ;
Eina_Bool compensate : 1 ; // Compensate for darkening
//Eina_Bool specular : 1; // Use specular light as well (needs specular_factor > 0)
} bump ;
} ;
struct {
int render_op ;
int R , G , B , A ;
int ox , oy ;
2013-12-09 23:20:45 -08:00
int clipx , clipy , clipw , cliph ;
2013-12-31 00:51:09 -08:00
Evas_Filter_Fill_Mode fillmode ;
2013-12-08 22:57:50 -08:00
} draw ;
} ;
struct _Evas_Filter_Buffer
{
EINA_REFCOUNT ;
int id ;
Evas_Filter_Context * ctx ;
Evas_Object * source ;
void * backing ;
int w , h ;
Eina_Bool alpha_only : 1 ; // 1 channel (A) instead of 4 (RGBA)
Eina_Bool allocated : 1 ; // allocated on demand, belongs to this context
Eina_Bool transient : 1 ; // temporary buffer (automatic allocation)
Eina_Bool locked : 1 ; // internal flag
} ;
void evas_filter_context_clear ( Evas_Filter_Context * ctx ) ;
void evas_filter_context_proxy_bind ( Evas_Filter_Context * ctx , Evas_Object * eo_proxy , Evas_Object * eo_source , int bufid ) ;
/* FIXME: CPU filters entry points. Move these to the Evas Engine itself. */
Evas_Filter_Apply_Func evas_filter_blend_cpu_func_get ( Evas_Filter_Command * cmd ) ;
Evas_Filter_Apply_Func evas_filter_blur_cpu_func_get ( Evas_Filter_Command * cmd ) ;
Evas_Filter_Apply_Func evas_filter_bump_map_cpu_func_get ( Evas_Filter_Command * cmd ) ;
Evas_Filter_Apply_Func evas_filter_curve_cpu_func_get ( Evas_Filter_Command * cmd ) ;
Evas_Filter_Apply_Func evas_filter_displace_cpu_func_get ( Evas_Filter_Command * cmd ) ;
2013-12-12 00:46:46 -08:00
Evas_Filter_Apply_Func evas_filter_fill_cpu_func_get ( Evas_Filter_Command * cmd ) ;
2013-12-08 22:57:50 -08:00
Evas_Filter_Apply_Func evas_filter_mask_cpu_func_get ( Evas_Filter_Command * cmd ) ;
/* Utility functions */
void _clip_to_target ( int * sx , int * sy , int sw , int sh , int ox , int oy , int dw , int dh , int * dx , int * dy , int * rows , int * cols ) ;
Eina_Bool evas_filter_buffer_alloc ( Evas_Filter_Buffer * fb , int w , int h ) ;
Evas_Filter_Buffer * _filter_buffer_get ( Evas_Filter_Context * ctx , int bufid ) ;
2013-12-31 02:38:58 -08:00
Evas_Filter_Buffer * evas_filter_temporary_buffer_get ( Evas_Filter_Context * ctx , int w , int h , Eina_Bool alpha_only ) ;
2014-01-01 19:43:44 -08:00
Evas_Filter_Buffer * evas_filter_buffer_scaled_get ( Evas_Filter_Context * ctx , Evas_Filter_Buffer * src , int w , int h ) ;
2013-12-08 22:57:50 -08:00
# endif // EVAS_FILTER_PRIVATE_H