forked from enlightenment/efl
126 lines
3.3 KiB
C
126 lines
3.3 KiB
C
#include "evas_common_soft8.h"
|
|
#include "evas_soft8_scanline_fill.c"
|
|
|
|
static inline int
|
|
_is_empty_rectangle(const Eina_Rectangle * r)
|
|
{
|
|
return (r->w < 1) || (r->h < 1);
|
|
}
|
|
|
|
static inline void
|
|
_soft8_rectangle_draw_solid_solid(Soft8_Image * dst, int offset, int w, int h,
|
|
DATA8 gry8)
|
|
{
|
|
DATA8 *dst_itr;
|
|
int i;
|
|
|
|
dst_itr = dst->pixels + offset;
|
|
|
|
for (i = 0; i < h; i++, dst_itr += dst->stride)
|
|
_soft8_scanline_fill_solid_solid(dst_itr, w, gry8);
|
|
}
|
|
|
|
static inline void
|
|
_soft8_rectangle_draw_transp_solid(Soft8_Image * dst, int offset, int w, int h,
|
|
DATA8 gry8, DATA8 alpha)
|
|
{
|
|
DATA8 *dst_itr;
|
|
int i;
|
|
|
|
dst_itr = dst->pixels + offset;
|
|
alpha++;
|
|
|
|
for (i = 0; i < h; i++, dst_itr += dst->stride)
|
|
_soft8_scanline_fill_transp_solid(dst_itr, w, gry8, alpha);
|
|
}
|
|
|
|
static void
|
|
_soft8_rectangle_draw_int(Soft8_Image * dst, RGBA_Draw_Context * dc,
|
|
Eina_Rectangle dr)
|
|
{
|
|
int dst_offset;
|
|
|
|
if (_is_empty_rectangle(&dr))
|
|
return;
|
|
RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w,
|
|
dst->cache_entry.h);
|
|
if (_is_empty_rectangle(&dr))
|
|
return;
|
|
|
|
if (dc->clip.use)
|
|
RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x,
|
|
dc->clip.y, dc->clip.w, dc->clip.h);
|
|
if (_is_empty_rectangle(&dr))
|
|
return;
|
|
if (A_VAL(&dc->col.col) == 0)
|
|
return;
|
|
|
|
dst_offset = dr.x + (dr.y * dst->stride);
|
|
|
|
if (!dst->cache_entry.flags.alpha)
|
|
{
|
|
DATA8 gry8;
|
|
DATA8 alpha;
|
|
|
|
alpha = A_VAL(&dc->col.col);
|
|
gry8 = GRY_8_FROM_RGB(&dc->col.col);
|
|
|
|
if (alpha == 0xff)
|
|
_soft8_rectangle_draw_solid_solid(dst, dst_offset, dr.w, dr.h, gry8);
|
|
else if (alpha > 0)
|
|
_soft8_rectangle_draw_transp_solid
|
|
(dst, dst_offset, dr.w, dr.h, gry8, alpha);
|
|
}
|
|
else
|
|
ERR("Unsupported feature: drawing rectangle to non-opaque destination.");
|
|
}
|
|
|
|
void
|
|
evas_common_soft8_rectangle_draw(Soft8_Image * dst, RGBA_Draw_Context * dc,
|
|
int x, int y, int w, int h)
|
|
{
|
|
Eina_Rectangle dr;
|
|
Cutout_Rects *rects;
|
|
Cutout_Rect *r;
|
|
struct RGBA_Draw_Context_clip c_bkp;
|
|
int i;
|
|
|
|
/* handle cutouts here! */
|
|
EINA_RECTANGLE_SET(&dr, x, y, w, h);
|
|
|
|
if (_is_empty_rectangle(&dr))
|
|
return;
|
|
if (!
|
|
(RECTS_INTERSECT
|
|
(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->cache_entry.w, dst->cache_entry.h)))
|
|
return;
|
|
|
|
/* no cutouts - cut right to the chase */
|
|
if (!dc->cutout.rects)
|
|
{
|
|
_soft8_rectangle_draw_int(dst, dc, dr);
|
|
return;
|
|
}
|
|
|
|
c_bkp = dc->clip;
|
|
|
|
evas_common_draw_context_clip_clip(dc, 0, 0, dst->cache_entry.w,
|
|
dst->cache_entry.h);
|
|
evas_common_draw_context_clip_clip(dc, x, y, w, h);
|
|
/* our clip is 0 size.. abort */
|
|
if ((dc->clip.w <= 0) || (dc->clip.h <= 0))
|
|
{
|
|
dc->clip = c_bkp;
|
|
return;
|
|
}
|
|
rects = evas_common_draw_context_apply_cutouts(dc);
|
|
for (i = 0; i < rects->active; ++i)
|
|
{
|
|
r = rects->rects + i;
|
|
evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h);
|
|
_soft8_rectangle_draw_int(dst, dc, dr);
|
|
}
|
|
evas_common_draw_context_apply_clear_cutouts(rects);
|
|
dc->clip = c_bkp;
|
|
}
|