efl/legacy/evas/src/lib/engines/common_8/evas_soft8_rectangle.c

125 lines
3.2 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)
{
static Cutout_Rects *rects = NULL;
Eina_Rectangle dr;
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, rects);
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);
}
dc->clip = c_bkp;
}