forked from enlightenment/efl
Ector: Move drawhelper to static_libs
Rename a few things: - draw helper -> efl_draw - Ector_Rop -> Efl.Gfx.Render_Op - ECTOR_ bla bla -> DRAW_ bla bla (base pixel ops) - ector_memfill -> draw_memset32 (and invert arg order to match memset) The main rasterizer file is now draw.h in static_libs/draw This is a non functional change, simple code refactor.
This commit is contained in:
parent
bad7911cd0
commit
615b2442b7
|
@ -90,6 +90,13 @@ lib/ector/cairo/ector_cairo_surface.c
|
|||
installed_ectorcairoheadersdir = $(includedir)/ector-@VMAJ@/cairo
|
||||
nodist_installed_ectorcairoheaders_DATA = $(ector_eolian_cairo_h)
|
||||
|
||||
# SW draw static lib
|
||||
draw_sources = \
|
||||
static_libs/draw/draw_main_sse2.c \
|
||||
static_libs/draw/draw_main.c \
|
||||
static_libs/draw/draw_main_neon.c \
|
||||
$(NULL)
|
||||
|
||||
# And the default software backend
|
||||
lib_ector_libector_la_SOURCES += \
|
||||
lib/ector/software/ector_renderer_software_gradient_linear.c \
|
||||
|
@ -103,9 +110,7 @@ lib/ector/software/ector_software_buffer.c \
|
|||
static_libs/freetype/sw_ft_math.c \
|
||||
static_libs/freetype/sw_ft_raster.c \
|
||||
static_libs/freetype/sw_ft_stroker.c \
|
||||
lib/ector/software/ector_drawhelper.c \
|
||||
lib/ector/software/ector_drawhelper_sse2.c \
|
||||
lib/ector/software/ector_drawhelper_neon.c
|
||||
$(draw_sources)
|
||||
|
||||
installed_ectorsoftwareheadersdir = $(includedir)/ector-@VMAJ@/software
|
||||
nodist_installed_ectorsoftwareheaders_DATA = $(ector_eolian_software_h)
|
||||
|
@ -115,6 +120,7 @@ lib_ector_libector_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
|
|||
-I$(top_builddir)/src/lib/ector/cairo \
|
||||
-I$(top_builddir)/src/lib/ector/software \
|
||||
-I$(top_srcdir)/src/static_libs/freetype \
|
||||
-I$(top_srcdir)/src/static_libs/draw \
|
||||
@ECTOR_CFLAGS@ \
|
||||
-DPACKAGE_BIN_DIR=\"$(bindir)\" \
|
||||
-DPACKAGE_LIB_DIR=\"$(libdir)\" \
|
||||
|
@ -165,4 +171,6 @@ lib/ector/software/ector_software_private.h \
|
|||
static_libs/freetype/sw_ft_math.h \
|
||||
static_libs/freetype/sw_ft_raster.h \
|
||||
static_libs/freetype/sw_ft_stroker.h \
|
||||
static_libs/freetype/sw_ft_types.h
|
||||
static_libs/freetype/sw_ft_types.h \
|
||||
static_libs/draw/draw.h \
|
||||
static_libs/draw/draw_private.h
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# Even though libefl is new, it contains definitions used by legacy APIs
|
||||
efl_eolian_legacy_files = \
|
||||
lib/efl/interfaces/efl_gfx_fill.eo \
|
||||
lib/efl/interfaces/efl_gfx_base.eo \
|
||||
$(NULL)
|
||||
|
||||
efl_eolian_files = \
|
||||
|
@ -10,7 +11,6 @@ efl_eolian_files = \
|
|||
lib/efl/interfaces/efl_player.eo \
|
||||
lib/efl/interfaces/efl_text.eo \
|
||||
lib/efl/interfaces/efl_text_properties.eo \
|
||||
lib/efl/interfaces/efl_gfx_base.eo \
|
||||
lib/efl/interfaces/efl_gfx_stack.eo \
|
||||
lib/efl/interfaces/efl_gfx_view.eo \
|
||||
lib/efl/interfaces/efl_gfx_shape.eo \
|
||||
|
|
|
@ -349,6 +349,7 @@ lib_evas_libevas_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
|
|||
-I$(top_srcdir)/src/lib/evas/file \
|
||||
-I$(top_srcdir)/src/lib/evas/include \
|
||||
-I$(top_srcdir)/src/static_libs/libunibreak \
|
||||
-I$(top_srcdir)/src/static_libs/draw \
|
||||
-I$(top_builddir)/src/lib/evas/canvas \
|
||||
-I$(top_builddir)/src/modules/evas/engines/software_generic \
|
||||
-I$(top_builddir)/src/modules/evas/engines/gl_generic \
|
||||
|
|
|
@ -113,16 +113,6 @@ typedef Eo Ector_Renderer;
|
|||
// FIXME: Enable that when we have merged Emile
|
||||
/* typedef Evas_Colorspace Ector_Colorspace; */
|
||||
|
||||
/**
|
||||
* Raster operations at pixel level
|
||||
*/
|
||||
typedef enum _Ector_Rop
|
||||
{
|
||||
ECTOR_ROP_BLEND, /**< D = S + D(1 - Sa) */
|
||||
ECTOR_ROP_COPY, /**< D = S */
|
||||
ECTOR_ROP_LAST
|
||||
} Ector_Rop;
|
||||
|
||||
/**
|
||||
* Quality values
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef ECTOR_CAIRO_PRIVATE_H_
|
||||
# define ECTOR_CAIRO_PRIVATE_H_
|
||||
|
||||
#include "draw.h"
|
||||
|
||||
typedef void cairo_pattern_t;
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -121,7 +121,7 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_prepare(Eo *obj, Ector_Re
|
|||
static Eina_Bool
|
||||
_ector_renderer_cairo_base_ector_renderer_generic_base_draw(Eo *obj EINA_UNUSED,
|
||||
Ector_Renderer_Cairo_Base_Data *pd,
|
||||
Ector_Rop op,
|
||||
Efl_Gfx_Render_Op op,
|
||||
Eina_Array *clips EINA_UNUSED,
|
||||
unsigned int mul_col)
|
||||
{
|
||||
|
@ -131,10 +131,10 @@ _ector_renderer_cairo_base_ector_renderer_generic_base_draw(Eo *obj EINA_UNUSED,
|
|||
|
||||
switch (op)
|
||||
{
|
||||
case ECTOR_ROP_BLEND:
|
||||
case EFL_GFX_RENDER_OP_BLEND:
|
||||
cop = CAIRO_OPERATOR_OVER;
|
||||
break;
|
||||
case ECTOR_ROP_COPY:
|
||||
case EFL_GFX_RENDER_OP_COPY:
|
||||
default:
|
||||
cop = CAIRO_OPERATOR_SOURCE;
|
||||
break;
|
||||
|
|
|
@ -64,7 +64,7 @@ _ector_renderer_cairo_gradient_linear_ector_renderer_generic_base_prepare(Eo *ob
|
|||
static Eina_Bool
|
||||
_ector_renderer_cairo_gradient_linear_ector_renderer_generic_base_draw(Eo *obj,
|
||||
Ector_Renderer_Cairo_Gradient_Linear_Data *pd,
|
||||
Ector_Rop op, Eina_Array *clips, unsigned int mul_col)
|
||||
Efl_Gfx_Render_Op op, Eina_Array *clips, unsigned int mul_col)
|
||||
{
|
||||
Ector_Renderer_Generic_Gradient_Linear_Data *gld;
|
||||
Ector_Renderer_Generic_Gradient_Data *gd;
|
||||
|
|
|
@ -68,7 +68,7 @@ _ector_renderer_cairo_gradient_radial_prepare(Eo *obj EINA_UNUSED,
|
|||
|
||||
// Clearly duplicated and should be in a common place...
|
||||
static Eina_Bool
|
||||
_ector_renderer_cairo_gradient_radial_ector_renderer_generic_base_draw(Eo *obj, Ector_Renderer_Cairo_Gradient_Radial_Data *pd, Ector_Rop op, Eina_Array *clips, unsigned int mul_col)
|
||||
_ector_renderer_cairo_gradient_radial_ector_renderer_generic_base_draw(Eo *obj, Ector_Renderer_Cairo_Gradient_Radial_Data *pd, Efl_Gfx_Render_Op op, Eina_Array *clips, unsigned int mul_col)
|
||||
{
|
||||
Ector_Renderer_Generic_Gradient_Radial_Data *grd;
|
||||
Ector_Renderer_Generic_Gradient_Data *gd;
|
||||
|
|
|
@ -153,7 +153,7 @@ _ector_renderer_cairo_shape_ector_renderer_generic_base_prepare(Eo *obj, Ector_R
|
|||
}
|
||||
|
||||
static Eina_Bool
|
||||
_ector_renderer_cairo_shape_ector_renderer_generic_base_draw(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd, Ector_Rop op, Eina_Array *clips, unsigned int mul_col)
|
||||
_ector_renderer_cairo_shape_ector_renderer_generic_base_draw(Eo *obj, Ector_Renderer_Cairo_Shape_Data *pd, Efl_Gfx_Render_Op op, Eina_Array *clips, unsigned int mul_col)
|
||||
{
|
||||
int r, g, b, a;
|
||||
unsigned i;
|
||||
|
|
|
@ -43,24 +43,6 @@ extern int _ector_log_dom_global;
|
|||
typedef unsigned char DATA8;
|
||||
typedef unsigned short DATA16;
|
||||
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
/* x86 */
|
||||
#define A_VAL(p) (((DATA8 *)(p))[3])
|
||||
#define R_VAL(p) (((DATA8 *)(p))[2])
|
||||
#define G_VAL(p) (((DATA8 *)(p))[1])
|
||||
#define B_VAL(p) (((DATA8 *)(p))[0])
|
||||
#define AR_VAL(p) ((DATA16 *)(p)[1])
|
||||
#define GB_VAL(p) ((DATA16 *)(p)[0])
|
||||
#else
|
||||
/* ppc */
|
||||
#define A_VAL(p) (((DATA8 *)(p))[0])
|
||||
#define R_VAL(p) (((DATA8 *)(p))[1])
|
||||
#define G_VAL(p) (((DATA8 *)(p))[2])
|
||||
#define B_VAL(p) (((DATA8 *)(p))[3])
|
||||
#define AR_VAL(p) ((DATA16 *)(p)[0])
|
||||
#define GB_VAL(p) ((DATA16 *)(p)[1])
|
||||
#endif
|
||||
|
||||
#define RGB_JOIN(r,g,b) \
|
||||
(((r) << 16) + ((g) << 8) + (b))
|
||||
|
||||
|
|
|
@ -105,7 +105,7 @@ abstract Ector.Renderer.Generic.Base (Eo.Base)
|
|||
draw {
|
||||
return: bool @warn_unused;
|
||||
params {
|
||||
@in op: Ector_Rop;
|
||||
@in op: Efl.Gfx.Render_Op;
|
||||
@in clips: array<Eina.Rectangle *> *; [[array of @Eina.Rectangle clip]]
|
||||
@in mul_col: uint;
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ _ector_renderer_software_gradient_linear_ector_renderer_generic_base_prepare(Eo
|
|||
static Eina_Bool
|
||||
_ector_renderer_software_gradient_linear_ector_renderer_generic_base_draw(Eo *obj EINA_UNUSED,
|
||||
Ector_Renderer_Software_Gradient_Data *pd EINA_UNUSED,
|
||||
Ector_Rop op EINA_UNUSED, Eina_Array *clips EINA_UNUSED,
|
||||
Efl_Gfx_Render_Op op EINA_UNUSED, Eina_Array *clips EINA_UNUSED,
|
||||
unsigned int mul_col EINA_UNUSED)
|
||||
{
|
||||
return EINA_TRUE;
|
||||
|
@ -57,7 +57,7 @@ static Eina_Bool
|
|||
_ector_renderer_software_gradient_linear_ector_renderer_software_base_fill(Eo *obj EINA_UNUSED,
|
||||
Ector_Renderer_Software_Gradient_Data *pd)
|
||||
{
|
||||
ector_software_rasterizer_linear_gradient_set(pd->surface->software, pd);
|
||||
ector_software_rasterizer_linear_gradient_set(pd->surface->rasterizer, pd);
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
|
|
@ -58,7 +58,7 @@ _ector_renderer_software_gradient_radial_ector_renderer_generic_base_prepare(Eo
|
|||
static Eina_Bool
|
||||
_ector_renderer_software_gradient_radial_ector_renderer_generic_base_draw(Eo *obj EINA_UNUSED,
|
||||
Ector_Renderer_Software_Gradient_Data *pd EINA_UNUSED,
|
||||
Ector_Rop op EINA_UNUSED, Eina_Array *clips EINA_UNUSED,
|
||||
Efl_Gfx_Render_Op op EINA_UNUSED, Eina_Array *clips EINA_UNUSED,
|
||||
unsigned int mul_col EINA_UNUSED)
|
||||
{
|
||||
return EINA_TRUE;
|
||||
|
@ -68,7 +68,7 @@ _ector_renderer_software_gradient_radial_ector_renderer_generic_base_draw(Eo *ob
|
|||
static Eina_Bool
|
||||
_ector_renderer_software_gradient_radial_ector_renderer_software_base_fill(Eo *obj EINA_UNUSED, Ector_Renderer_Software_Gradient_Data *pd)
|
||||
{
|
||||
ector_software_rasterizer_radial_gradient_set(pd->surface->software, pd);
|
||||
ector_software_rasterizer_radial_gradient_set(pd->surface->rasterizer, pd);
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
|
|
|
@ -536,13 +536,13 @@ _update_rle(Eo *obj, Ector_Renderer_Software_Shape_Data *pd)
|
|||
|
||||
//shape data generation
|
||||
if (_generate_shape_data(pd))
|
||||
pd->shape_data = ector_software_rasterizer_generate_rle_data(pd->surface->software,
|
||||
pd->shape_data = ector_software_rasterizer_generate_rle_data(pd->surface->rasterizer,
|
||||
&outline->ft_outline);
|
||||
|
||||
//stroke data generation
|
||||
if ( _generate_stroke_data(pd))
|
||||
{
|
||||
ector_software_rasterizer_stroke_set(pd->surface->software,
|
||||
ector_software_rasterizer_stroke_set(pd->surface->rasterizer,
|
||||
(pd->public_shape->stroke.width *
|
||||
pd->public_shape->stroke.scale),
|
||||
pd->public_shape->stroke.cap,
|
||||
|
@ -555,14 +555,14 @@ _update_rle(Eo *obj, Ector_Renderer_Software_Shape_Data *pd)
|
|||
pd->public_shape->stroke.dash,
|
||||
pd->public_shape->stroke.dash_length);
|
||||
_outline_transform(dash_outline, pd->base->m);
|
||||
pd->outline_data = ector_software_rasterizer_generate_stroke_rle_data(pd->surface->software,
|
||||
pd->outline_data = ector_software_rasterizer_generate_stroke_rle_data(pd->surface->rasterizer,
|
||||
&dash_outline->ft_outline,
|
||||
close_path);
|
||||
_outline_destroy(dash_outline);
|
||||
}
|
||||
else
|
||||
{
|
||||
pd->outline_data = ector_software_rasterizer_generate_stroke_rle_data(pd->surface->software,
|
||||
pd->outline_data = ector_software_rasterizer_generate_stroke_rle_data(pd->surface->rasterizer,
|
||||
&outline->ft_outline,
|
||||
close_path);
|
||||
}
|
||||
|
@ -593,7 +593,7 @@ _ector_renderer_software_shape_ector_renderer_generic_base_prepare(Eo *obj,
|
|||
static Eina_Bool
|
||||
_ector_renderer_software_shape_ector_renderer_generic_base_draw(Eo *obj,
|
||||
Ector_Renderer_Software_Shape_Data *pd,
|
||||
Ector_Rop op, Eina_Array *clips,
|
||||
Efl_Gfx_Render_Op op, Eina_Array *clips,
|
||||
unsigned int mul_col)
|
||||
{
|
||||
int x, y;
|
||||
|
@ -606,13 +606,13 @@ _ector_renderer_software_shape_ector_renderer_generic_base_draw(Eo *obj,
|
|||
y = pd->surface->y + (int)pd->base->origin.y;
|
||||
|
||||
// fill the span_data structure
|
||||
ector_software_rasterizer_clip_rect_set(pd->surface->software, clips);
|
||||
ector_software_rasterizer_transform_set(pd->surface->software, pd->base->m);
|
||||
ector_software_rasterizer_clip_rect_set(pd->surface->rasterizer, clips);
|
||||
ector_software_rasterizer_transform_set(pd->surface->rasterizer, pd->base->m);
|
||||
|
||||
if (pd->shape->fill)
|
||||
{
|
||||
eo_do(pd->shape->fill, ector_renderer_software_base_fill());
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->software,
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->rasterizer,
|
||||
x, y, mul_col, op,
|
||||
pd->shape_data);
|
||||
}
|
||||
|
@ -620,12 +620,12 @@ _ector_renderer_software_shape_ector_renderer_generic_base_draw(Eo *obj,
|
|||
{
|
||||
if (pd->base->color.a > 0)
|
||||
{
|
||||
ector_software_rasterizer_color_set(pd->surface->software,
|
||||
ector_software_rasterizer_color_set(pd->surface->rasterizer,
|
||||
pd->base->color.r,
|
||||
pd->base->color.g,
|
||||
pd->base->color.b,
|
||||
pd->base->color.a);
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->software,
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->rasterizer,
|
||||
x, y, mul_col, op,
|
||||
pd->shape_data);
|
||||
}
|
||||
|
@ -634,7 +634,7 @@ _ector_renderer_software_shape_ector_renderer_generic_base_draw(Eo *obj,
|
|||
if (pd->shape->stroke.fill)
|
||||
{
|
||||
eo_do(pd->shape->stroke.fill, ector_renderer_software_base_fill());
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->software,
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->rasterizer,
|
||||
x, y, mul_col, op,
|
||||
pd->outline_data);
|
||||
}
|
||||
|
@ -642,12 +642,12 @@ _ector_renderer_software_shape_ector_renderer_generic_base_draw(Eo *obj,
|
|||
{
|
||||
if (pd->public_shape->stroke.color.a > 0)
|
||||
{
|
||||
ector_software_rasterizer_color_set(pd->surface->software,
|
||||
ector_software_rasterizer_color_set(pd->surface->rasterizer,
|
||||
pd->public_shape->stroke.color.r,
|
||||
pd->public_shape->stroke.color.g,
|
||||
pd->public_shape->stroke.color.b,
|
||||
pd->public_shape->stroke.color.a);
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->software,
|
||||
ector_software_rasterizer_draw_rle_data(pd->surface->rasterizer,
|
||||
x, y, mul_col, op,
|
||||
pd->outline_data);
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "ector_software_private.h"
|
||||
#include "ector_generic_buffer.eo.h"
|
||||
#include "ector_software_buffer_base.eo.h"
|
||||
#include "draw.h"
|
||||
|
||||
#define MY_CLASS ECTOR_SOFTWARE_BUFFER_CLASS
|
||||
|
||||
|
|
|
@ -9,8 +9,7 @@
|
|||
|
||||
#include "ector_private.h"
|
||||
#include "ector_software_private.h"
|
||||
#include "ector_drawhelper_private.h"
|
||||
|
||||
#include "draw.h"
|
||||
|
||||
#define GRADIENT_STOPTABLE_SIZE 1024
|
||||
#define FIXPT_BITS 8
|
||||
|
@ -302,7 +301,7 @@ _generate_gradient_color_table(Efl_Gfx_Gradient_Stop *gradient_stops, int stop_c
|
|||
|
||||
curr = gradient_stops;
|
||||
if (curr->a != 255) alpha = EINA_TRUE;
|
||||
current_color = ECTOR_ARGB_JOIN(curr->a, curr->r, curr->g, curr->b);
|
||||
current_color = DRAW_ARGB_JOIN(curr->a, curr->r, curr->g, curr->b);
|
||||
incr = 1.0 / (double)size;
|
||||
fpos = 1.5 * incr;
|
||||
|
||||
|
@ -323,7 +322,7 @@ _generate_gradient_color_table(Efl_Gfx_Gradient_Stop *gradient_stops, int stop_c
|
|||
next = (gradient_stops + i + 1);
|
||||
delta = 1/(next->offset - curr->offset);
|
||||
if (next->a != 255) alpha = EINA_TRUE;
|
||||
next_color = ECTOR_ARGB_JOIN(next->a, next->r, next->g, next->b);
|
||||
next_color = DRAW_ARGB_JOIN(next->a, next->r, next->g, next->b);
|
||||
func = &_ease_linear;
|
||||
while (fpos < next->offset && pos < size)
|
||||
{
|
||||
|
@ -405,7 +404,7 @@ fetch_linear_gradient(uint *buffer, Span_Data *data, int y, int x, int length)
|
|||
end = buffer + length;
|
||||
if (inc > (float)(-1e-5) && inc < (float)(1e-5))
|
||||
{
|
||||
_ector_memfill(buffer, length, _gradient_pixel_fixed(g_data, (int)(t * FIXPT_SIZE)));
|
||||
draw_memset32(buffer, _gradient_pixel_fixed(g_data, (int)(t * FIXPT_SIZE)), length);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -456,7 +455,7 @@ fetch_radial_gradient(uint *buffer, Span_Data *data, int y, int x, int length)
|
|||
// avoid division by zero
|
||||
if (fabsf(g_data->radial.a) <= 0.00001f)
|
||||
{
|
||||
_ector_memfill(buffer, length, 0);
|
||||
draw_memset32(buffer, 0, length);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -495,17 +494,21 @@ fetch_radial_gradient(uint *buffer, Span_Data *data, int y, int x, int length)
|
|||
_ector_radial_helper(buffer, length, g_data, det, delta_det, delta_delta_det, b, delta_b);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
drawhelper_gradient_init()
|
||||
int
|
||||
ector_software_gradient_init(void)
|
||||
{
|
||||
_ector_radial_helper = _radial_helper_generic;
|
||||
_ector_linear_helper = _linear_helper_generic;
|
||||
#ifdef BUILD_SSE3
|
||||
if (eina_cpu_features_get() & EINA_CPU_SSE3)
|
||||
static int i = 0;
|
||||
if (!(i++))
|
||||
{
|
||||
_ector_radial_helper = _radial_helper_sse3;
|
||||
_ector_linear_helper = _linear_helper_sse3;
|
||||
}
|
||||
_ector_radial_helper = _radial_helper_generic;
|
||||
_ector_linear_helper = _linear_helper_generic;
|
||||
#ifdef BUILD_SSE3
|
||||
if (eina_cpu_features_get() & EINA_CPU_SSE3)
|
||||
{
|
||||
_ector_radial_helper = _radial_helper_sse3;
|
||||
_ector_linear_helper = _linear_helper_sse3;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ typedef struct _Span_Data
|
|||
Span_Data_Type type;
|
||||
Eina_Bool fast_matrix ;
|
||||
DATA32 mul_col;
|
||||
Ector_Rop op;
|
||||
Efl_Gfx_Render_Op op;
|
||||
union {
|
||||
DATA32 color;
|
||||
Ector_Renderer_Software_Gradient_Data *gradient;
|
||||
|
@ -112,12 +112,13 @@ struct _Software_Rasterizer
|
|||
|
||||
struct _Ector_Software_Surface_Data
|
||||
{
|
||||
Software_Rasterizer *software;
|
||||
Software_Rasterizer *rasterizer;
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
|
||||
int ector_software_gradient_init(void);
|
||||
void ector_software_rasterizer_init(Software_Rasterizer *rasterizer);
|
||||
void ector_software_rasterizer_done(Software_Rasterizer *rasterizer);
|
||||
|
||||
|
@ -137,7 +138,7 @@ void ector_software_rasterizer_clip_shape_set(Software_Rasterizer *rasterizer, S
|
|||
Shape_Rle_Data * ector_software_rasterizer_generate_rle_data(Software_Rasterizer *rasterizer, SW_FT_Outline *outline);
|
||||
Shape_Rle_Data * ector_software_rasterizer_generate_stroke_rle_data(Software_Rasterizer *rasterizer, SW_FT_Outline *outline, Eina_Bool closePath);
|
||||
|
||||
void ector_software_rasterizer_draw_rle_data(Software_Rasterizer *rasterizer, int x, int y, uint mul_col, Ector_Rop op, Shape_Rle_Data* rle);
|
||||
void ector_software_rasterizer_draw_rle_data(Software_Rasterizer *rasterizer, int x, int y, uint mul_col, Efl_Gfx_Render_Op op, Shape_Rle_Data* rle);
|
||||
|
||||
void ector_software_rasterizer_destroy_rle_data(Shape_Rle_Data *rle);
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "ector_private.h"
|
||||
#include "ector_software_private.h"
|
||||
|
||||
#include "ector_drawhelper_private.h"
|
||||
#include "draw.h"
|
||||
|
||||
static void
|
||||
_blend_color_argb(int count, const SW_FT_Span *spans, void *user_data)
|
||||
|
@ -20,8 +20,8 @@ _blend_color_argb(int count, const SW_FT_Span *spans, void *user_data)
|
|||
const int pix_stride = data->raster_buffer->stride / 4;
|
||||
|
||||
// multiply the color with mul_col if any
|
||||
color = ECTOR_MUL4_SYM(data->color, data->mul_col);
|
||||
comp_func = ector_comp_func_solid_span_get(data->op, color);
|
||||
color = DRAW_MUL4_SYM(data->color, data->mul_col);
|
||||
comp_func = efl_draw_func_solid_span_get(data->op, color);
|
||||
|
||||
// move to the offset location
|
||||
buffer = data->raster_buffer->pixels.u32 + ((pix_stride * data->offy) + data->offx);
|
||||
|
@ -55,7 +55,7 @@ _blend_gradient(int count, const SW_FT_Span *spans, void *user_data)
|
|||
if (!fetchfunc)
|
||||
return;
|
||||
|
||||
comp_func = ector_comp_func_span_get(data->op, data->mul_col, data->gradient->alpha);
|
||||
comp_func = efl_draw_func_span_get(data->op, data->mul_col, data->gradient->alpha);
|
||||
|
||||
// move to the offset location
|
||||
destbuffer = data->raster_buffer->pixels.u32 + ((pix_stride * data->offy) + data->offx);
|
||||
|
@ -102,7 +102,7 @@ _blend_image_argb(int count, const SW_FT_Span *spans, void *user_data)
|
|||
#warning FIXME: Image scaling, anyone?
|
||||
#warning FIXME: Optimize eo call with early call resolution
|
||||
|
||||
comp_func = ector_comp_func_span_get(data->op, data->mul_col, EINA_TRUE);
|
||||
comp_func = efl_draw_func_span_get(data->op, data->mul_col, EINA_TRUE);
|
||||
|
||||
buffer = data->raster_buffer->pixels.u32 + ((pix_stride * data->offy) + data->offx);
|
||||
|
||||
|
@ -368,7 +368,8 @@ void ector_software_rasterizer_init(Software_Rasterizer *rasterizer)
|
|||
rasterizer->fill_data.clip.enabled = EINA_FALSE;
|
||||
rasterizer->fill_data.unclipped_blend = 0;
|
||||
rasterizer->fill_data.blend = 0;
|
||||
draw_helper_init();
|
||||
efl_draw_init();
|
||||
ector_software_gradient_init();
|
||||
}
|
||||
|
||||
void ector_software_rasterizer_done(Software_Rasterizer *rasterizer)
|
||||
|
@ -551,7 +552,7 @@ void ector_software_rasterizer_clip_shape_set(Software_Rasterizer *rasterizer, S
|
|||
|
||||
void ector_software_rasterizer_color_set(Software_Rasterizer *rasterizer, int r, int g, int b, int a)
|
||||
{
|
||||
rasterizer->fill_data.color = ECTOR_ARGB_JOIN(a, r, g, b);
|
||||
rasterizer->fill_data.color = DRAW_ARGB_JOIN(a, r, g, b);
|
||||
rasterizer->fill_data.type = Solid;
|
||||
}
|
||||
|
||||
|
@ -578,7 +579,7 @@ void ector_software_rasterizer_buffer_set(Software_Rasterizer *rasterizer,
|
|||
|
||||
void ector_software_rasterizer_draw_rle_data(Software_Rasterizer *rasterizer,
|
||||
int x, int y, uint mul_col,
|
||||
Ector_Rop op, Shape_Rle_Data* rle)
|
||||
Efl_Gfx_Render_Op op, Shape_Rle_Data* rle)
|
||||
{
|
||||
// check for NULL rle data
|
||||
if (!rle) return;
|
||||
|
|
|
@ -35,19 +35,19 @@ static Eo *
|
|||
_ector_software_surface_eo_base_constructor(Eo *obj, Ector_Software_Surface_Data *pd)
|
||||
{
|
||||
obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
|
||||
pd->software = (Software_Rasterizer *) calloc(1, sizeof(Software_Rasterizer));
|
||||
ector_software_rasterizer_init(pd->software);
|
||||
pd->software->fill_data.raster_buffer = eo_data_ref(obj, ECTOR_SOFTWARE_BUFFER_BASE_MIXIN);
|
||||
pd->rasterizer = (Software_Rasterizer *) calloc(1, sizeof(Software_Rasterizer));
|
||||
ector_software_rasterizer_init(pd->rasterizer);
|
||||
pd->rasterizer->fill_data.raster_buffer = eo_data_ref(obj, ECTOR_SOFTWARE_BUFFER_BASE_MIXIN);
|
||||
return obj;
|
||||
}
|
||||
|
||||
static void
|
||||
_ector_software_surface_eo_base_destructor(Eo *obj, Ector_Software_Surface_Data *pd)
|
||||
{
|
||||
ector_software_rasterizer_done(pd->software);
|
||||
eo_data_unref(obj, pd->software->fill_data.raster_buffer);
|
||||
free(pd->software);
|
||||
pd->software = NULL;
|
||||
ector_software_rasterizer_done(pd->rasterizer);
|
||||
eo_data_unref(obj, pd->rasterizer->fill_data.raster_buffer);
|
||||
free(pd->rasterizer);
|
||||
pd->rasterizer = NULL;
|
||||
eo_do_super(obj, ECTOR_SOFTWARE_SURFACE_CLASS, eo_destructor());
|
||||
}
|
||||
|
||||
|
|
|
@ -196,6 +196,7 @@ EAPI extern const Eo_Event_Description _EFL_GFX_PATH_CHANGED;
|
|||
|
||||
#ifndef EFL_NOLEGACY_API_SUPPORT
|
||||
#include "interfaces/efl_gfx_fill.eo.legacy.h"
|
||||
#include "interfaces/efl_gfx_base.eo.legacy.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -3,6 +3,12 @@ enum Efl.Gfx.Colorspace {
|
|||
gry8 = 4, [[8-bit gray image, or alpha only]]
|
||||
}
|
||||
|
||||
enum Efl.Gfx.Render_Op {
|
||||
blend = 0, [[Alpha blending onto destination (default); d = d*(1-sa) + s]]
|
||||
copy = 1, [[Copy source to destination; d = s]]
|
||||
last
|
||||
}
|
||||
|
||||
interface Efl.Gfx.Base {
|
||||
legacy_prefix: null;
|
||||
eo_prefix: efl_gfx;
|
||||
|
|
|
@ -55,7 +55,6 @@
|
|||
# include <Eet.h>
|
||||
#endif
|
||||
#include "Evas.h"
|
||||
//#include "Evas_GL.h"
|
||||
|
||||
#ifdef EAPI
|
||||
# undef EAPI
|
||||
|
@ -1159,6 +1158,7 @@ struct _Convert_Pal
|
|||
/*****************************************************************************/
|
||||
#include "evas_macros.h"
|
||||
|
||||
#ifndef A_VAL
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
/* x86 */
|
||||
#define A_VAL(p) (((DATA8 *)(p))[3])
|
||||
|
@ -1176,6 +1176,7 @@ struct _Convert_Pal
|
|||
#define AR_VAL(p) ((DATA16 *)(p)[0])
|
||||
#define GB_VAL(p) ((DATA16 *)(p)[1])
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define RGB_JOIN(r,g,b) \
|
||||
(((r) << 16) + ((g) << 8) + (b))
|
||||
|
|
|
@ -2452,17 +2452,17 @@ eng_ector_destroy(void *data EINA_UNUSED, Ector_Surface *ector)
|
|||
if (ector) eo_del(ector);
|
||||
}
|
||||
|
||||
static Ector_Rop
|
||||
static Efl_Gfx_Render_Op
|
||||
_evas_render_op_to_ector_rop(Evas_Render_Op op)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case EVAS_RENDER_BLEND:
|
||||
return ECTOR_ROP_BLEND;
|
||||
return EFL_GFX_RENDER_OP_BLEND;
|
||||
case EVAS_RENDER_COPY:
|
||||
return ECTOR_ROP_COPY;
|
||||
return EFL_GFX_RENDER_OP_COPY;
|
||||
default:
|
||||
return ECTOR_ROP_BLEND;
|
||||
return EFL_GFX_RENDER_OP_BLEND;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -398,7 +398,7 @@ struct _Evas_Thread_Command_Ector
|
|||
Eina_Array *clips;
|
||||
|
||||
DATA32 mul_col;
|
||||
Ector_Rop render_op;
|
||||
Efl_Gfx_Render_Op render_op;
|
||||
|
||||
Eina_Bool free_it;
|
||||
};
|
||||
|
@ -3754,17 +3754,17 @@ eng_ector_destroy(void *data EINA_UNUSED, Ector_Surface *ector)
|
|||
if (ector) eo_del(ector);
|
||||
}
|
||||
|
||||
static Ector_Rop
|
||||
static Efl_Gfx_Render_Op
|
||||
_evas_render_op_to_ector_rop(Evas_Render_Op op)
|
||||
{
|
||||
switch (op)
|
||||
{
|
||||
case EVAS_RENDER_BLEND:
|
||||
return ECTOR_ROP_BLEND;
|
||||
return EFL_GFX_RENDER_OP_BLEND;
|
||||
case EVAS_RENDER_COPY:
|
||||
return ECTOR_ROP_COPY;
|
||||
return EFL_GFX_RENDER_OP_COPY;
|
||||
default:
|
||||
return ECTOR_ROP_BLEND;
|
||||
return EFL_GFX_RENDER_OP_BLEND;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,22 @@
|
|||
#ifndef ECTOR_DRAWHELPER_PRIVATE_H
|
||||
#define ECTOR_DRAWHELPER_PRIVATE_H
|
||||
#ifndef EFL_DRAW_H
|
||||
#define EFL_DRAW_H
|
||||
|
||||
#include "ector_private.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <Efl.h>
|
||||
|
||||
typedef void (*RGBA_Comp_Func)(uint *dest, const uint *src, int length, uint mul_col, uint const_alpha);
|
||||
typedef void (*RGBA_Comp_Func_Solid)(uint *dest, int length, uint color, uint const_alpha);
|
||||
|
||||
int efl_draw_init(void);
|
||||
|
||||
RGBA_Comp_Func_Solid efl_draw_func_solid_span_get(Efl_Gfx_Render_Op op, uint color);
|
||||
RGBA_Comp_Func efl_draw_func_span_get(Efl_Gfx_Render_Op op, uint color, Eina_Bool src_alpha);
|
||||
|
||||
|
||||
/* common sw draw helpers */
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN( a, b ) ( (a) < (b) ? (a) : (b) )
|
||||
|
@ -11,53 +26,53 @@
|
|||
#define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
|
||||
#endif
|
||||
|
||||
#ifndef uint
|
||||
typedef unsigned int uint;
|
||||
#ifndef A_VAL
|
||||
#ifndef WORDS_BIGENDIAN
|
||||
/* x86 */
|
||||
#define A_VAL(p) (((uint8_t *)(p))[3])
|
||||
#define R_VAL(p) (((uint8_t *)(p))[2])
|
||||
#define G_VAL(p) (((uint8_t *)(p))[1])
|
||||
#define B_VAL(p) (((uint8_t *)(p))[0])
|
||||
#define AR_VAL(p) ((uint16_t *)(p)[1])
|
||||
#define GB_VAL(p) ((uint16_t *)(p)[0])
|
||||
#else
|
||||
/* ppc */
|
||||
#define A_VAL(p) (((uint8_t *)(p))[0])
|
||||
#define R_VAL(p) (((uint8_t *)(p))[1])
|
||||
#define G_VAL(p) (((uint8_t *)(p))[2])
|
||||
#define B_VAL(p) (((uint8_t *)(p))[3])
|
||||
#define AR_VAL(p) ((uint16_t *)(p)[0])
|
||||
#define GB_VAL(p) ((uint16_t *)(p)[1])
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define ECTOR_ARGB_JOIN(a,r,g,b) \
|
||||
#define DRAW_ARGB_JOIN(a,r,g,b) \
|
||||
(((a) << 24) + ((r) << 16) + ((g) << 8) + (b))
|
||||
|
||||
#define ECTOR_MUL4_SYM(x, y) \
|
||||
#define DRAW_MUL4_SYM(x, y) \
|
||||
( ((((((x) >> 16) & 0xff00) * (((y) >> 16) & 0xff00)) + 0xff0000) & 0xff000000) + \
|
||||
((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \
|
||||
((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff0000) >> 16) & 0xff00) + \
|
||||
(((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) )
|
||||
|
||||
#define BYTE_MUL(c, a) \
|
||||
( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
|
||||
(((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) )
|
||||
|
||||
#define LOOP_ALIGNED_U1_A4(DEST, LENGTH, UOP, A4OP) \
|
||||
{ \
|
||||
while((uintptr_t)DEST & 0xF && LENGTH) UOP \
|
||||
\
|
||||
while(LENGTH) { \
|
||||
switch(LENGTH) { \
|
||||
case 3: \
|
||||
case 2: \
|
||||
case 1: \
|
||||
UOP \
|
||||
break; \
|
||||
default: \
|
||||
A4OP \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
static inline int
|
||||
alpha_inverse(int color)
|
||||
static inline uint
|
||||
INTERPOLATE_PIXEL_256(uint x, uint a, uint y, uint b)
|
||||
{
|
||||
color = ~color;
|
||||
return A_VAL(&color);
|
||||
uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b;
|
||||
t >>= 8;
|
||||
t &= 0xff00ff;
|
||||
x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b;
|
||||
x &= 0xff00ff00;
|
||||
x |= t;
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void
|
||||
_ector_memfill(uint *dest, int length, uint value)
|
||||
draw_memset32(uint *dest, uint value, int length)
|
||||
{
|
||||
int n;
|
||||
if (!length)
|
||||
|
||||
if (length <= 0)
|
||||
return;
|
||||
|
||||
n = (length + 7) / 8;
|
||||
|
@ -75,31 +90,4 @@ _ector_memfill(uint *dest, int length, uint value)
|
|||
}
|
||||
}
|
||||
|
||||
static inline uint
|
||||
INTERPOLATE_PIXEL_256(uint x, uint a, uint y, uint b)
|
||||
{
|
||||
uint t = (x & 0xff00ff) * a + (y & 0xff00ff) * b;
|
||||
t >>= 8;
|
||||
t &= 0xff00ff;
|
||||
x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b;
|
||||
x &= 0xff00ff00;
|
||||
x |= t;
|
||||
return x;
|
||||
}
|
||||
|
||||
typedef void (*RGBA_Comp_Func)(uint *dest, const uint *src, int length, uint mul_col, uint const_alpha);
|
||||
typedef void (*RGBA_Comp_Func_Solid)(uint *dest, int length, uint color, uint const_alpha);
|
||||
|
||||
extern RGBA_Comp_Func_Solid func_for_mode_solid[ECTOR_ROP_LAST];
|
||||
extern RGBA_Comp_Func func_for_mode[ECTOR_ROP_LAST];
|
||||
|
||||
void drawhelper_gradient_init(void);
|
||||
void draw_helper_sse2_init(void);
|
||||
void draw_helper_neon_init(void);
|
||||
|
||||
void draw_helper_init(void);
|
||||
|
||||
RGBA_Comp_Func_Solid ector_comp_func_solid_span_get(Ector_Rop op, uint color);
|
||||
RGBA_Comp_Func ector_comp_func_span_get(Ector_Rop op, uint color, Eina_Bool src_alpha);
|
||||
|
||||
#endif
|
|
@ -3,7 +3,7 @@
|
|||
#endif
|
||||
|
||||
#include <Ector.h>
|
||||
#include "ector_drawhelper_private.h"
|
||||
#include "draw_private.h"
|
||||
|
||||
/*
|
||||
s = source pixel
|
||||
|
@ -27,10 +27,10 @@ _comp_func_solid_source_over(uint *dest, int length, uint color, uint const_alph
|
|||
int ialpha, i;
|
||||
|
||||
if (const_alpha != 255)
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
ialpha = alpha_inverse(color);
|
||||
for (i = 0; i < length; ++i)
|
||||
dest[i] = color + BYTE_MUL(dest[i], ialpha);
|
||||
dest[i] = color + DRAW_BYTE_MUL(dest[i], ialpha);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -40,7 +40,7 @@ _comp_func_source_over(uint *dest, const uint *src, int length, uint color, uint
|
|||
uint s, sc, sia;
|
||||
|
||||
if (const_alpha != 255)
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
|
||||
if (color == 0xffffffff) // No color multiplier
|
||||
{
|
||||
|
@ -52,7 +52,7 @@ _comp_func_source_over(uint *dest, const uint *src, int length, uint color, uint
|
|||
else if (s != 0)
|
||||
{
|
||||
sia = alpha_inverse(s);
|
||||
dest[i] = s + BYTE_MUL(dest[i], sia);
|
||||
dest[i] = s + DRAW_BYTE_MUL(dest[i], sia);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,9 +61,9 @@ _comp_func_source_over(uint *dest, const uint *src, int length, uint color, uint
|
|||
for (i = 0; i < length; ++i)
|
||||
{
|
||||
s = src[i];
|
||||
sc = ECTOR_MUL4_SYM(color, s);
|
||||
sc = DRAW_MUL4_SYM(color, s);
|
||||
sia = alpha_inverse(sc);
|
||||
dest[i] = sc + BYTE_MUL(dest[i], sia);
|
||||
dest[i] = sc + DRAW_BYTE_MUL(dest[i], sia);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -79,14 +79,14 @@ _comp_func_solid_source(uint *dest, int length, uint color, uint const_alpha)
|
|||
|
||||
if (const_alpha == 255)
|
||||
{
|
||||
_ector_memfill(dest, length, color);
|
||||
draw_memset32(dest, color, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
ialpha = 255 - const_alpha;
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
for (i = 0; i < length; ++i)
|
||||
dest[i] = color + BYTE_MUL(dest[i], ialpha);
|
||||
dest[i] = color + DRAW_BYTE_MUL(dest[i], ialpha);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -114,54 +114,59 @@ _comp_func_source(uint *dest, const uint *src, int length, uint color, uint cons
|
|||
if (const_alpha == 255)
|
||||
{
|
||||
for (i = 0; i < length; ++i)
|
||||
dest[i] = ECTOR_MUL4_SYM(src[i], color);
|
||||
dest[i] = DRAW_MUL4_SYM(src[i], color);
|
||||
}
|
||||
else
|
||||
{
|
||||
ialpha = 255 - const_alpha;
|
||||
for (i = 0; i < length; ++i)
|
||||
{
|
||||
src_color = ECTOR_MUL4_SYM(src[i], color);
|
||||
src_color = DRAW_MUL4_SYM(src[i], color);
|
||||
dest[i] = INTERPOLATE_PIXEL_256(src_color, const_alpha, dest[i], ialpha);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RGBA_Comp_Func_Solid func_for_mode_solid[ECTOR_ROP_LAST] = {
|
||||
RGBA_Comp_Func_Solid func_for_mode_solid[EFL_GFX_RENDER_OP_LAST] = {
|
||||
_comp_func_solid_source_over,
|
||||
_comp_func_solid_source
|
||||
};
|
||||
|
||||
RGBA_Comp_Func func_for_mode[ECTOR_ROP_LAST] = {
|
||||
RGBA_Comp_Func func_for_mode[EFL_GFX_RENDER_OP_LAST] = {
|
||||
_comp_func_source_over,
|
||||
_comp_func_source
|
||||
};
|
||||
|
||||
RGBA_Comp_Func_Solid
|
||||
ector_comp_func_solid_span_get(Ector_Rop op, uint color)
|
||||
efl_draw_func_solid_span_get(Efl_Gfx_Render_Op op, uint color)
|
||||
{
|
||||
if ((color & 0xff000000) == 0xff000000)
|
||||
{
|
||||
if (op == ECTOR_ROP_BLEND) op = ECTOR_ROP_COPY;
|
||||
if (op == EFL_GFX_RENDER_OP_BLEND) op = EFL_GFX_RENDER_OP_COPY;
|
||||
}
|
||||
|
||||
return func_for_mode_solid[op];
|
||||
}
|
||||
|
||||
RGBA_Comp_Func ector_comp_func_span_get(Ector_Rop op, uint color, Eina_Bool src_alpha)
|
||||
RGBA_Comp_Func efl_draw_func_span_get(Efl_Gfx_Render_Op op, uint color, Eina_Bool src_alpha)
|
||||
{
|
||||
if (((color & 0xff000000) == 0xff000000) && !src_alpha)
|
||||
{
|
||||
if (op == ECTOR_ROP_BLEND) op = ECTOR_ROP_COPY;
|
||||
if (op == EFL_GFX_RENDER_OP_BLEND) op = EFL_GFX_RENDER_OP_COPY;
|
||||
}
|
||||
|
||||
return func_for_mode[op];
|
||||
}
|
||||
|
||||
void draw_helper_init()
|
||||
int
|
||||
efl_draw_init()
|
||||
{
|
||||
drawhelper_gradient_init();
|
||||
draw_helper_sse2_init();
|
||||
draw_helper_neon_init();
|
||||
static int i = 0;
|
||||
if (!(i++))
|
||||
{
|
||||
efl_draw_sse2_init();
|
||||
efl_draw_neon_init();
|
||||
}
|
||||
return i;
|
||||
}
|
|
@ -2,8 +2,7 @@
|
|||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <Ector.h>
|
||||
#include "ector_drawhelper_private.h"
|
||||
#include "draw_private.h"
|
||||
|
||||
#undef BUILD_NEON
|
||||
#ifdef BUILD_NEON
|
||||
|
@ -36,7 +35,7 @@ comp_func_solid_source_over_neon(uint * __restrict dest, int length, uint color,
|
|||
uint8x8_t temp11_8x8;
|
||||
|
||||
if (const_alpha != 255)
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
|
||||
// alpha can only be 0 if color is 0x0. In that case we can just return.
|
||||
// Otherwise we can assume alpha != 0. This allows more optimization in
|
||||
|
@ -140,7 +139,7 @@ comp_func_source_over_sse2(uint * __restrict dest, const uint * __restrict src,
|
|||
DATA32 *end;
|
||||
|
||||
if (const_alpha != 255)
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
|
||||
c_32x2 = vdup_n_u32(color);
|
||||
c_8x8 = vreinterpret_u8_u32(c_32x2);
|
||||
|
@ -215,18 +214,18 @@ comp_func_source_over_sse2(uint * __restrict dest, const uint * __restrict src,
|
|||
#endif
|
||||
|
||||
void
|
||||
draw_helper_neon_init()
|
||||
efl_draw_neon_init()
|
||||
{
|
||||
#ifdef BUILD_NEON
|
||||
if (eina_cpu_features_get() & EINA_CPU_NEON)
|
||||
{
|
||||
// update the comp_function table for solid color
|
||||
//func_for_mode_solid[ECTOR_ROP_COPY] = comp_func_solid_source_sse2;
|
||||
func_for_mode_solid[ECTOR_ROP_BLEND] = comp_func_solid_source_over_neon;
|
||||
//func_for_mode_solid[EFL_GFX_RENDER_OP_COPY] = comp_func_solid_source_sse2;
|
||||
func_for_mode_solid[EFL_GFX_RENDER_OP_BLEND] = comp_func_solid_source_over_neon;
|
||||
|
||||
// update the comp_function table for source data
|
||||
//func_for_mode[ECTOR_ROP_COPY] = comp_func_source_sse2;
|
||||
func_for_mode[ECTOR_ROP_BLEND] = comp_func_source_over_neon;
|
||||
//func_for_mode[EFL_GFX_RENDER_OP_COPY] = comp_func_source_sse2;
|
||||
func_for_mode[EFL_GFX_RENDER_OP_BLEND] = comp_func_source_over_neon;
|
||||
}
|
||||
#endif
|
||||
}
|
|
@ -3,7 +3,7 @@
|
|||
#endif
|
||||
|
||||
#include <Ector.h>
|
||||
#include "ector_drawhelper_private.h"
|
||||
#include "draw_private.h"
|
||||
|
||||
#ifdef BUILD_SSE3
|
||||
#include <immintrin.h>
|
||||
|
@ -125,7 +125,7 @@ comp_func_helper_sse2 (uint *dest, int length, uint color, uint alpha)
|
|||
|
||||
LOOP_ALIGNED_U1_A4(dest, length,
|
||||
{ /* UOP */
|
||||
*dest = color + BYTE_MUL(*dest, alpha);
|
||||
*dest = color + DRAW_BYTE_MUL(*dest, alpha);
|
||||
dest++; length--;
|
||||
},
|
||||
{ /* A4OP */
|
||||
|
@ -145,14 +145,14 @@ comp_func_solid_source_sse2(uint *dest, int length, uint color, uint const_alpha
|
|||
{
|
||||
if (const_alpha == 255)
|
||||
{
|
||||
_ector_memfill(dest, length, color);
|
||||
draw_memset32(dest, color, length);
|
||||
}
|
||||
else
|
||||
{
|
||||
int ialpha;
|
||||
|
||||
ialpha = 255 - const_alpha;
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
comp_func_helper_sse2(dest, length, color, ialpha);
|
||||
}
|
||||
}
|
||||
|
@ -163,7 +163,7 @@ comp_func_solid_source_over_sse2(uint *dest, int length, uint color, uint const_
|
|||
int ialpha;
|
||||
|
||||
if (const_alpha != 255)
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
ialpha = alpha_inverse(color);
|
||||
comp_func_helper_sse2(dest, length, color, ialpha);
|
||||
}
|
||||
|
@ -239,7 +239,7 @@ comp_func_source_sse2(uint *dest, const uint *src, int length, uint color, uint
|
|||
{
|
||||
LOOP_ALIGNED_U1_A4(dest, length,
|
||||
{ /* UOP */
|
||||
*dest = ECTOR_MUL4_SYM(*src, color);
|
||||
*dest = DRAW_MUL4_SYM(*src, color);
|
||||
dest++; src++; length--;
|
||||
},
|
||||
{ /* A4OP */
|
||||
|
@ -256,7 +256,7 @@ comp_func_source_sse2(uint *dest, const uint *src, int length, uint color, uint
|
|||
|
||||
LOOP_ALIGNED_U1_A4(dest, length,
|
||||
{ /* UOP */
|
||||
src_color = ECTOR_MUL4_SYM(*src, color);
|
||||
src_color = DRAW_MUL4_SYM(*src, color);
|
||||
*dest = INTERPOLATE_PIXEL_256(src_color, const_alpha, *dest, ialpha);
|
||||
dest++; src++; length--;
|
||||
},
|
||||
|
@ -277,7 +277,7 @@ comp_func_source_over_sse2(uint *dest, const uint *src, int length, uint color,
|
|||
uint s, sia;
|
||||
|
||||
if (const_alpha != 255)
|
||||
color = BYTE_MUL(color, const_alpha);
|
||||
color = DRAW_BYTE_MUL(color, const_alpha);
|
||||
|
||||
if (color == 0xffffffff) // No color multiplier
|
||||
{
|
||||
|
@ -285,7 +285,7 @@ comp_func_source_over_sse2(uint *dest, const uint *src, int length, uint color,
|
|||
{ /* UOP */
|
||||
s = *src;
|
||||
sia = alpha_inverse(s);
|
||||
*dest = s + BYTE_MUL(*dest, sia);
|
||||
*dest = s + DRAW_BYTE_MUL(*dest, sia);
|
||||
dest++; src++; length--;
|
||||
},
|
||||
{ /* A4OP */
|
||||
|
@ -301,9 +301,9 @@ comp_func_source_over_sse2(uint *dest, const uint *src, int length, uint color,
|
|||
|
||||
LOOP_ALIGNED_U1_A4(dest, length,
|
||||
{ /* UOP */
|
||||
s = ECTOR_MUL4_SYM(*src, color);
|
||||
s = DRAW_MUL4_SYM(*src, color);
|
||||
sia = alpha_inverse(s);
|
||||
*dest = s + BYTE_MUL(*dest, sia);
|
||||
*dest = s + DRAW_BYTE_MUL(*dest, sia);
|
||||
dest++; src++; length--;
|
||||
},
|
||||
{ /* A4OP */
|
||||
|
@ -319,18 +319,18 @@ comp_func_source_over_sse2(uint *dest, const uint *src, int length, uint color,
|
|||
#endif
|
||||
|
||||
void
|
||||
draw_helper_sse2_init()
|
||||
efl_draw_sse2_init()
|
||||
{
|
||||
#ifdef BUILD_SSE3
|
||||
if (eina_cpu_features_get() & EINA_CPU_SSE2)
|
||||
{
|
||||
// update the comp_function table for solid color
|
||||
func_for_mode_solid[ECTOR_ROP_COPY] = comp_func_solid_source_sse2;
|
||||
func_for_mode_solid[ECTOR_ROP_BLEND] = comp_func_solid_source_over_sse2;
|
||||
func_for_mode_solid[EFL_GFX_RENDER_OP_COPY] = comp_func_solid_source_sse2;
|
||||
func_for_mode_solid[EFL_GFX_RENDER_OP_BLEND] = comp_func_solid_source_over_sse2;
|
||||
|
||||
// update the comp_function table for source data
|
||||
func_for_mode[ECTOR_ROP_COPY] = comp_func_source_sse2;
|
||||
func_for_mode[ECTOR_ROP_BLEND] = comp_func_source_over_sse2;
|
||||
func_for_mode[EFL_GFX_RENDER_OP_COPY] = comp_func_source_sse2;
|
||||
func_for_mode[EFL_GFX_RENDER_OP_BLEND] = comp_func_source_over_sse2;
|
||||
}
|
||||
#endif
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
#ifndef EFL_DRAW_PRIVATE_H
|
||||
#define EFL_DRAW_PRIVATE_H
|
||||
|
||||
#include "draw.h"
|
||||
|
||||
#define DRAW_BYTE_MUL(c, a) \
|
||||
( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
|
||||
(((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) )
|
||||
|
||||
#define LOOP_ALIGNED_U1_A4(DEST, LENGTH, UOP, A4OP) \
|
||||
{ \
|
||||
while((uintptr_t)DEST & 0xF && LENGTH) UOP \
|
||||
\
|
||||
while(LENGTH) { \
|
||||
switch(LENGTH) { \
|
||||
case 3: \
|
||||
case 2: \
|
||||
case 1: \
|
||||
UOP \
|
||||
break; \
|
||||
default: \
|
||||
A4OP \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
static inline int
|
||||
alpha_inverse(uint32_t color)
|
||||
{
|
||||
color = ~color;
|
||||
return A_VAL(&color);
|
||||
}
|
||||
|
||||
RGBA_Comp_Func_Solid func_for_mode_solid[EFL_GFX_RENDER_OP_LAST];
|
||||
RGBA_Comp_Func func_for_mode[EFL_GFX_RENDER_OP_LAST];
|
||||
|
||||
void efl_draw_sse2_init(void);
|
||||
void efl_draw_neon_init(void);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue