efl/src/lib/evas/filters/evas_filter_private.h

179 lines
5.3 KiB
C

#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
#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)
typedef enum _Evas_Filter_Interpolation_Mode Evas_Filter_Interpolation_Mode;
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;
// Variables changing at each run
int w, h; // Dimensions of the input/output buffers
int padl, padt, padr, padb; // Padding in the current input/output buffers
struct
{
/** Post-processing callback. The context can be safely destroyed here. */
Evas_Filter_Cb cb;
void *data;
} post_run;
Eina_Bool gl_engine : 1;
};
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 contains the map data
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
{
Evas_Filter_Transform_Flags flags;
} transform;
};
struct {
int render_op;
int R, G, B, A;
int ox, oy;
union {
struct {
int x, y, w, h;
};
struct {
int l, r, t, b;
};
} clip;
Evas_Filter_Fill_Mode fillmode;
Eina_Bool clip_use : 1;
Eina_Bool clip_mode_lrtb : 1;
} 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
};
enum _Evas_Filter_Interpolation_Mode
{
EVAS_FILTER_INTERPOLATION_MODE_NONE,
EVAS_FILTER_INTERPOLATION_MODE_LINEAR,
EVAS_FILTER_INTERPOLATION_MODE_CUBIC
};
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);
Evas_Filter_Apply_Func evas_filter_fill_cpu_func_get(Evas_Filter_Command *cmd);
Evas_Filter_Apply_Func evas_filter_mask_cpu_func_get(Evas_Filter_Command *cmd);
Evas_Filter_Apply_Func evas_filter_transform_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);
Evas_Filter_Buffer *evas_filter_temporary_buffer_get(Evas_Filter_Context *ctx, int w, int h, Eina_Bool alpha_only);
Evas_Filter_Buffer *evas_filter_buffer_scaled_get(Evas_Filter_Context *ctx, Evas_Filter_Buffer *src, int w, int h);
Eina_Bool evas_filter_interpolate(DATA8* output /* 256 values */, DATA8* points /* pairs x + y */, int point_count, Evas_Filter_Interpolation_Mode mode);
#endif // EVAS_FILTER_PRIVATE_H