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.vlo
is 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 parameterstart
is the index of the first relevant delta pair. Finally,vhi
is 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
.