1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include "evas_engine_filter.h"
static Eina_Bool
_fill_cpu(Evas_Filter_Command *cmd)
{
Evas_Filter_Buffer *fb = cmd->output;
int step = fb->alpha_only ? sizeof(uint8_t) : sizeof(uint32_t);
int x = MAX(0, cmd->draw.clip.x);
int y = MAX(0, cmd->draw.clip.y);
uint32_t color = ARGB_JOIN(cmd->draw.A, cmd->draw.R, cmd->draw.G, cmd->draw.B);
unsigned int stride, len;
int w, h, k;
uint8_t *ptr;
if (!cmd->draw.clip_mode_lrtb)
{
if (cmd->draw.clip.w)
w = MIN(cmd->draw.clip.w, fb->w - x);
else
w = fb->w - x;
if (cmd->draw.clip.h)
h = MIN(cmd->draw.clip.h, fb->h - y);
else
h = fb->h - y;
}
else
{
x = MAX(0, cmd->draw.clip.l);
y = MAX(0, cmd->draw.clip.t);
w = CLAMP(0, fb->w - x - cmd->draw.clip.r, fb->w - x);
h = CLAMP(0, fb->h - y - cmd->draw.clip.b, fb->h - y);
}
ptr = _buffer_map_all(fb->buffer, &len, E_WRITE, fb->alpha_only ? E_ALPHA : E_ARGB, &stride);
if (!ptr) return EINA_FALSE;
ptr += y * stride;
if (fb->alpha_only)
{
for (k = 0; k < h; k++)
{
memset(ptr + (x * step), cmd->draw.A, step * w);
ptr += stride;
}
}
else
{
for (k = 0; k < h; k++)
{
uint32_t *dst = ((uint32_t *) (ptr + (y + k) * stride)) + x;
draw_memset32(dst, color, w);
}
}
ector_buffer_unmap(fb->buffer, ptr, len);
return EINA_TRUE;
}
Software_Filter_Func
eng_filter_fill_func_get(Evas_Filter_Command *cmd)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(cmd, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(cmd->output, NULL);
return _fill_cpu;
}
|