Copyright (C) 1994, Digital Equipment Corp.
\subsection{Texturing irregular patches}
TYPE
DeltaPair = RECORD dl, dr: BITS 8 FOR [-128 .. 127] END;
PROCEDURE PaintPatch(
v: Leaf;
READONLY clip: Rect.T;
hl, hr, vlo, vhi, start: INTEGER;
READONLY deltaArray: ARRAY OF DeltaPair;
op: PaintOp.T := PaintOp.BgFg;
src: Pixmap.T := Pixmap.Solid;
READONLY delta: Point.T := Point.Origin); <* LL.sup < v *>
This is likePaintTexture, except that the region to be textured is a ``patch'' instead of a rectangle. A patch is region that intersects each horizontal line in a single interval.vlois the index of the first (i.e., northernmost) scan line that intersects the patch, and[hl .. hr)is the intersection of the patch with this scan line. The intersections of the patch with the following scan lines are represented indeltaArray. Since the interval for any scan line is likely to be close to the interval for the previous scan line, the entries in the array are not the interval endpoints themselves, but the deltas from the previous endpoints. The information can begin anywhere indeltaArray; the parameterstartis the index of the first relevant delta pair. Finally,vhiis the index of the first scan line that passes below the patch.
More precisely,
for each pair of points p, q such that
p is in the patch (see below), p is in clip, and
p = q + delta,
assign
v[p] := op(v[p], src[Rect.Mod(q, domain(src))]).
The patch contains p if:
p.v IN [vlo .. vhi) AND p.h IN [hl + DL .. hr + DR)
where
DL = sum of deltaArray[start + i - vlo].dl and
DR = sum of deltaArray[start + i - vlo].dr
for i in [vlo .. p.v).
The value of start must be non-negative.
The patch is clipped vertically to exclude any rows for which DL and
DR are undefined due to exhaustion of deltaArray.