Pixel operations
FillConstantTrap: PROC [destination: PixelMap, -- trapezoid, constant color
top, bottom, leftTop, leftBot, rightTop, rightBot: NAT,
pxlValue: CARDINAL, function: Function ← [null, null]];
FillSmoothTrap: PROC [ destination: PixelMap, -- trapezoid, bilinear interpolated 8-bit color
top, bottom, leftTop, leftBot, rightTop, rightBot: NAT,
leftTopVal, leftBotVal, rightTopVal, rightBotVal: NAT ];
DrawLine: PUBLIC PROC [destination: PixelMap, -- fast line, constant color
p1, p2: IntPair,
pxlValue: NAT, function: Function ← [null, null]];
DrawBltLine: PUBLIC PROC [destination: PixelMap, -- fast line using BitBLT, constant color
p1, p2: IntPair,
pxlValue: NAT, function: Function ← [null, null]];
LoadScanSeg: PUBLIC PROC[destination: PixelMap,
s, f: INTEGER, length: NAT,
segment: LONG POINTER, offset: NAT ← 0];
StoreScanSeg: PUBLIC PROC [source: PixelMap,
s, f: INTEGER, length: NAT,
segment: LONG POINTER, offset: NAT ← 0];
SetPixel:
PROC [destination: PixelMap, s, f:
INTEGER, value:
NAT];
Raises bounds fault if the point is not in the window.
The following inline versions of SetPixel assume that the client already knows the number of bits per pixel, and they do not do a bounds check, since the worst that can happen is an address fault.
SetBit:
PROC [dest: PixelMap, s, f:
INTEGER, value:
CARDINAL] ~
TRUSTED
INLINE {
LOOPHOLE[
dest.refRep.pointer + Basics.LongMult[(s - dest.sOrigin), dest.refRep.rast],
LONG POINTER TO PACKED ARRAY [0..0) OF [0..2)]
[f - dest.fOrigin] ← value;
};
Set2Bits:
PROC [dest: PixelMap, s, f:
INTEGER, value:
CARDINAL] ~
TRUSTED
INLINE {
LOOPHOLE[
dest.refRep.pointer + Basics.LongMult[(s - dest.sOrigin), dest.refRep.rast],
LONG POINTER TO PACKED ARRAY [0..0) OF [0..4)]
[f - dest.fOrigin] ← value;
};
Set4Bits:
PROC [dest: PixelMap, s, f:
INTEGER, value:
CARDINAL] ~
TRUSTED
INLINE {
LOOPHOLE[
dest.refRep.pointer + Basics.LongMult[(s - dest.sOrigin), dest.refRep.rast],
LONG POINTER TO PACKED ARRAY [0..0) OF [0..16)]
[f - dest.fOrigin] ← value;
};
Set8Bits:
PROC [dest: PixelMap, s, f:
INTEGER, value:
CARDINAL] ~
TRUSTED
INLINE {
LOOPHOLE[
dest.refRep.pointer + Basics.LongMult[(s - dest.sOrigin), dest.refRep.rast],
LONG POINTER TO PACKED ARRAY [0..0) OF [0..256)]
[f - dest.fOrigin] ← value;
};
Set16Bits:
PROC [dest: PixelMap, s, f:
INTEGER, value:
CARDINAL] ~
TRUSTED
INLINE {
LOOPHOLE[
dest.refRep.pointer + Basics.LongMult[(s - dest.sOrigin), dest.refRep.rast],
LONG POINTER TO PACKED ARRAY [0..0) OF CARDINAL]
[f - dest.fOrigin] ← value;
};