ref: d695590dcbf447bee5b1a5c31ead95bc6412621c
parent: c0421231374a55b38075f98f0ebf4afcd338d49a
author: rodri <rgl@antares-labs.eu>
date: Sat Mar 14 15:05:27 EDT 2026
libmemdraw: clean up some parts of draw.c
--- a/sys/src/libmemdraw/draw.c
+++ b/sys/src/libmemdraw/draw.c
@@ -108,7 +108,7 @@
if(drawclip(dst, &r, src, &p0, mask, &p1, &par.sr, &par.mr) == 0)
return;
- if(op < Clear || op > SoverD)
+ if(op < 0 || op >= Ncomp)
return;
par.op = op;
@@ -196,7 +196,7 @@
if(badrect(*r))
return 0;
- splitcoords = (p0->x!=p1->x) || (p0->y!=p1->y);
+ splitcoords = (p0->x != p1->x) || (p0->y != p1->y);
/* clip to destination */
rmin = r->min;
if(!rectclip(r, dst->r) || !rectclip(r, dst->clipr))
@@ -269,20 +269,15 @@
int
drawclip(Memimage *dst, Rectangle *r, Memimage *src, Point *p0, Memimage *mask, Point *p1, Rectangle *sr, Rectangle *mr)
{- Point delta;
-
if(!drawclipnorepl(dst, r, src, p0, mask, p1, sr, mr))
return 0;
/* move source rectangle so sr->min is in src->r */
if(src->flags&Frepl) {- delta.x = drawreplxy(src->r.min.x, src->r.max.x, sr->min.x) - sr->min.x;
- delta.y = drawreplxy(src->r.min.y, src->r.max.y, sr->min.y) - sr->min.y;
- sr->min.x += delta.x;
- sr->min.y += delta.y;
- sr->max.x += delta.x;
- sr->max.y += delta.y;
- *p0 = sr->min;
+ *p0 = drawrepl(src->r, sr->min);
+ sr->max.x += p0->x - sr->min.x;
+ sr->max.y += p0->y - sr->min.y;
+ sr->min = *p0;
}
/* move mask point so it is in mask->r */
@@ -1009,15 +1004,13 @@
}
}
-/*
-not used yet
-source and mask alpha 1
+/* source and mask alpha 1 */
static void
alphacalcS0(Buffer bdst, Buffer bsrc, Buffer bmask, int dx, int grey, int op)
{int i;
- USED(op);
+ USED(bmask, op);
if(bsrc.delta == bdst.delta){memmove(bdst.rgba, bsrc.rgba, dx*bdst.delta);
return;
@@ -1044,7 +1037,6 @@
}
}
}
-*/
/* source alpha 1 */
static void
@@ -2079,18 +2071,19 @@
case 4:
for(d=dst->depth; d<8; d*=2)
v |= (v<<d);
- ppb = 8/dst->depth; /* pixels per byte */
+ ppb = 8/dst->depth; /* pixels per byte */
m = ppb-1;
+
/* left edge */
np = par->r.min.x&m; /* no. pixels unused on left side of word */
dx -= (ppb-np);
- nb = 8 - np * dst->depth; /* no. bits used on right side of word */
+ nb = 8 - np * dst->depth; /* no. bits used on right side of word */
lm = (1<<nb)-1;
/* right edge */
- np = par->r.max.x&m; /* no. pixels used on left side of word */
+ np = par->r.max.x&m; /* no. pixels used on left side of word */
dx -= np;
- nb = 8 - np * dst->depth; /* no. bits unused on right side of word */
+ nb = 8 - np * dst->depth; /* no. bits unused on right side of word */
rm = ~((1<<nb)-1);
/* lm, rm are masks that are 1 where we should touch the bits */
@@ -2157,18 +2150,13 @@
&& src->chan == dst->chan && !(src->flags&Falpha) && (op == S || op == SoverD)){uchar *sp, *dp;
long swid, dwid, nb;
- int dir;
- if(src->data == dst->data && byteaddr(dst, par->r.min) > byteaddr(src, par->sr.min))
- dir = -1;
- else
- dir = 1;
-
swid = src->width*sizeof(ulong);
dwid = dst->width*sizeof(ulong);
sp = byteaddr(src, par->sr.min);
dp = byteaddr(dst, par->r.min);
- if(dir == -1){+ if(src->data == dst->data && dp > sp){+ /* walk scanlines in the opposite direction */
sp += (dy-1)*swid;
dp += (dy-1)*dwid;
swid = -swid;
@@ -2199,12 +2187,8 @@
swid = src->width*sizeof(ulong);
dwid = dst->width*sizeof(ulong);
mwid = par->mask->width*sizeof(ulong);
+ dir = src->data == dst->data && dp > sp ? -1 : 1;
- if(src->data == dst->data && byteaddr(dst, par->r.min) > byteaddr(src, par->sr.min)){- dir = -1;
- }else
- dir = 1;
-
lm = 0xFF>>(par->r.min.x&7);
rm = 0xFF<<(8-(par->r.max.x&7));
dx -= (8-(par->r.min.x&7)) + (par->r.max.x&7);
@@ -2302,7 +2286,7 @@
op = par->op;
if((par->state&(Replsrc|Simplesrc|Replmask)) != (Replsrc|Simplesrc)
- || mask->depth != 1 || src->flags&Falpha || dst->depth<8 || dst->data==src->data
+ || mask->chan != GREY1 || src->flags&Falpha || dst->depth<8 || dst->data==src->data
|| op != SoverD)
return 0;
--
⑨