summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHermet Park <hermetpark@gmail.com>2019-08-30 13:42:54 +0900
committerHermet Park <hermetpark@gmail.com>2019-08-30 13:44:56 +0900
commite4b9807ee3e7b0feb4d80b80d112bf838f49dbd0 (patch)
tree4a9bb191ff7f054b3b6aad3bb7bb454e5dbf4b7a
parent17320a13180fdfbf75f5648d2f06a8d2155c8a0d (diff)
downloadefl-e4b9807ee3e7b0feb4d80b80d112bf838f49dbd0.tar.gz
ector: remove unnecessary blending processing.
gradient buffer in masking doesn't need to apply anti-aliasing since it would be taken by masking buffer. This also fixes memory overflow case if the tbuffer is lack of size.
-rw-r--r--src/lib/ector/software/ector_software_rasterizer.c28
1 files changed, 6 insertions, 22 deletions
diff --git a/src/lib/ector/software/ector_software_rasterizer.c b/src/lib/ector/software/ector_software_rasterizer.c
index bd8055f80a..447598c1d5 100644
--- a/src/lib/ector/software/ector_software_rasterizer.c
+++ b/src/lib/ector/software/ector_software_rasterizer.c
@@ -296,12 +296,11 @@ _blend_gradient(int count, const SW_FT_Span *spans, void *user_data)
static void
_blend_gradient_alpha(int count, const SW_FT_Span *spans, void *user_data)
{
- RGBA_Comp_Func comp_func;
Span_Data *sd = (Span_Data *)(user_data);
src_fetch fetchfunc = NULL;
uint32_t *buffer;
const int pix_stride = sd->raster_buffer->stride / 4;
- uint32_t gradientbuffer[BLEND_GRADIENT_BUFFER_SIZE];
+ uint32_t gbuffer[BLEND_GRADIENT_BUFFER_SIZE]; //gradient buffer
// FIXME: Get the proper composition function using ,color, ECTOR_OP etc.
if (sd->type == LinearGradient) fetchfunc = &fetch_linear_gradient;
@@ -312,11 +311,6 @@ _blend_gradient_alpha(int count, const SW_FT_Span *spans, void *user_data)
Ector_Software_Buffer_Base_Data *mask = sd->mask;
uint32_t *mbuffer = mask->pixels.u32;
- //Temp buffer for intermediate processing
- uint32_t *tbuffer = malloc(sizeof(uint32_t) * sd->raster_buffer->generic->w);
-
- comp_func = efl_draw_func_span_get(sd->op, sd->mul_col, sd->gradient->alpha);
-
// move to the offset location
buffer = sd->raster_buffer->pixels.u32 + ((pix_stride * sd->offy) + sd->offx);
@@ -324,14 +318,13 @@ _blend_gradient_alpha(int count, const SW_FT_Span *spans, void *user_data)
{
uint32_t *target = buffer + ((sd->raster_buffer->generic->w * spans->y) + spans->x);
uint32_t *mtarget = mbuffer + ((mask->generic->w * spans->y) + spans->x);
- uint32_t *temp = tbuffer;
+ uint32_t *temp = gbuffer;
int length = spans->len;
memset(temp, 0x00, sizeof(uint32_t) * spans->len);
while (length)
{
int l = MIN(length, BLEND_GRADIENT_BUFFER_SIZE);
- fetchfunc(gradientbuffer, sd, spans->y, spans->x, l);
- comp_func(temp, gradientbuffer, l, sd->mul_col, spans->coverage);
+ fetchfunc(temp, sd, spans->y, spans->x, l);
for (int i = 0; i < l; i++)
{
@@ -346,18 +339,16 @@ _blend_gradient_alpha(int count, const SW_FT_Span *spans, void *user_data)
}
++spans;
}
- free(tbuffer);
}
static void
_blend_gradient_alpha_inv(int count, const SW_FT_Span *spans, void *user_data)
{
- RGBA_Comp_Func comp_func;
Span_Data *sd = (Span_Data *)(user_data);
src_fetch fetchfunc = NULL;
uint32_t *buffer;
const int pix_stride = sd->raster_buffer->stride / 4;
- uint32_t gradientbuffer[BLEND_GRADIENT_BUFFER_SIZE];
+ uint32_t gbuffer[BLEND_GRADIENT_BUFFER_SIZE]; //gradient buffer
// FIXME: Get the proper composition function using ,color, ECTOR_OP etc.
if (sd->type == LinearGradient) fetchfunc = &fetch_linear_gradient;
@@ -368,11 +359,6 @@ _blend_gradient_alpha_inv(int count, const SW_FT_Span *spans, void *user_data)
Ector_Software_Buffer_Base_Data *mask = sd->mask;
uint32_t *mbuffer = mask->pixels.u32;
- //Temp buffer for intermediate processing
- uint32_t *tbuffer = malloc(sizeof(uint32_t) * sd->raster_buffer->generic->w);
-
- comp_func = efl_draw_func_span_get(sd->op, sd->mul_col, sd->gradient->alpha);
-
// move to the offset location
buffer = sd->raster_buffer->pixels.u32 + ((pix_stride * sd->offy) + sd->offx);
@@ -380,14 +366,13 @@ _blend_gradient_alpha_inv(int count, const SW_FT_Span *spans, void *user_data)
{
uint32_t *target = buffer + ((sd->raster_buffer->generic->w * spans->y) + spans->x);
uint32_t *mtarget = mbuffer + ((mask->generic->w * spans->y) + spans->x);
- uint32_t *temp = tbuffer;
+ uint32_t *temp = gbuffer;
int length = spans->len;
memset(temp, 0x00, sizeof(uint32_t) * spans->len);
while (length)
{
int l = MIN(length, BLEND_GRADIENT_BUFFER_SIZE);
- fetchfunc(gradientbuffer, sd, spans->y, spans->x, l);
- comp_func(temp, gradientbuffer, l, sd->mul_col, spans->coverage);
+ fetchfunc(temp, sd, spans->y, spans->x, l);
for (int i = 0; i < l; i++)
{
@@ -403,7 +388,6 @@ _blend_gradient_alpha_inv(int count, const SW_FT_Span *spans, void *user_data)
}
++spans;
}
- free(tbuffer);
}
/*!
\internal