ðÝSyntax10.Scn.FntOSyntax10b.Scn.Fnt  Y¥bW¶ @ ¯ Ù „™MODULE Bitmaps; IMPORT S := SYSTEM, Kernel, Win32, Display; CONST PATCOPY = 0F00021H; PATINVERT = 5A0049H; PATAND = 0A000C9H; PATPAINT = 0FA0089H; DSTINVERT = 550009H; SRCINVERT = 660046H; SRCCOPY = 0CC0020H; SRCAND = 8800C6H; SRCPAINT = 0EE0086H; replace = Display.replace; paint = Display.paint; invert = Display.invert; TYPE Bitmap* = POINTER TO BitmapDesc; BitmapDesc* = RECORD w-, h-: LONGINT; dc: LONGINT; bm: LONGINT; (*HBITMAP*) END ; COLORREF = LONGINT; VAR Disp-: Bitmap; CreateCompatibleBitmap: PROCEDURE (hdc, w, h: LONGINT): LONGINT (*HBITMAP*); PROCEDURE Finalize (B: S.PTR); BEGIN WITH B: Bitmap DO IF B = Disp THEN RETURN END ; IF B.bm # 0 THEN Win32.DeleteObject(B.bm); B.bm := 0 END ; END END Finalize; PROCEDURE New* (w, h: LONGINT): Bitmap; VAR B: Bitmap; dmmy: LONGINT; BEGIN NEW(B); Kernel.RegisterObject(B, Finalize); B.w := w; B.h := h; B.dc := 0; B.bm := CreateCompatibleBitmap(Win32.hdcDisp, w, h); RETURN B; END New; PROCEDURE OpenDC (B: Bitmap); VAR dmmy: LONGINT; BEGIN IF B # Disp THEN B.dc := Win32.CreateCompatibleDC(Win32.hdcDisp); IF B.dc = 0 THEN HALT(101) END ; dmmy := Win32.SelectObject(B.dc, B.bm); END END OpenDC; PROCEDURE CloseDC (B: Bitmap); BEGIN IF B # Disp THEN Win32.DeleteDC(B.dc); B.dc := 0; END END CloseDC; PROCEDURE CopyBlock* (sB, dB: Bitmap; sx, sy, w, h, dx, dy, mode: INTEGER); BEGIN Win32.SetClippingArea(0, 0, Win32.DispW, Win32.DispH); OpenDC(sB); OpenDC(dB); IF Win32.lc.len > 0 THEN Win32.FlushCache END ; Win32.BitBlt(dB.dc, dx, dB.h-dy, w, -h, sB.dc, sx, sB.h-sy, SRCCOPY); CloseDC(sB); CloseDC(dB); END CopyBlock; (* PROCEDURE CopyPattern* (B: Bitmap; col: INTEGER; pat: LONGINT; x, y, mode: INTEGER); VAR colref: COLORREF; dmmy: LONGINT; dc: LONGINT; p: Win32.PatternPtr; BEGIN IF B = Disp THEN Display.CopyPattern(col, pat, x, y, mode) ELSE OpenDC(B); colref := Win32.ColorRef(col); dc := Win32.CreateCompatibleDC(B.dc); p := S.VAL(Win32.PatternPtr, pat); dmmy := Win32.SelectObject(p.bitmap, dc); CASE mode OF | invert: Win32.SetBkColor(Win32.White, B.dc); Win32.SetTextColor(Win32.Black, B.dc); Win32.BitBlt(B.dc, x, B.h-(y+p.h), p.w, p.h, dc, p.x, p.y, SRCINVERT) | replace: Win32.SetBkColor(colref, B.dc); Win32.SetTextColor(Win32.Backg, B.dc); Win32.BitBlt(B.dc, x, B.h-(y+p.h), p.w, p.h, dc, p.x, p.y, SRCCOPY); | paint: IF colref # Win32.White THEN Win32.SetBkColor(Win32.Black, B.dc); Win32.SetTextColor(Win32.White, B.dc); Win32.BitBlt(B.dc, x, B.h-(y+p.h), p.w, p.h, dc, p.x, p.y, SRCAND); END ; IF colref # Win32.Black THEN Win32.SetBkColor(colref, B.dc); Win32.SetTextColor(Win32.Black, B.dc); Win32.BitBlt(B.dc, x, B.h-(y+p.h), p.w, p.h, dc, p.x, p.y, SRCPAINT); END ; END ; Win32.DeleteDC(dc); CloseDC(B); END END CopyPattern; PROCEDURE ReplConst* (B: Bitmap; col, x, y, w, h, mode: INTEGER); VAR colref: COLORREF; br: LONGINT; BEGIN IF B = Disp THEN Display.ReplConst(col, x, y, w, h, mode) ELSE OpenDC(B); IF mode = invert THEN Win32.PatBlt(B.dc, x, B.h-y, w, -h, DSTINVERT); ELSE colref := Win32.ColorRef(col); br := Win32.SelectObject(Win32.CreateSolidBrush(colref), B.dc); Win32.DeleteObject(br); Win32.PatBlt(B.dc, x, B.h-y, w, -h, PATCOPY); END ; CloseDC(B); END END ReplConst; PROCEDURE ReplPattern* (B: Bitmap; col, pat, x, y, w, h, mode: INTEGER); VAR colref: COLORREF; br: LONGINT; p: Win32.PatternPtr; BEGIN IF B = Disp THEN Display.ReplPattern(col, pat, x, y, w, h, mode) ELSE OpenDC(B); colref := Win32.ColorRef(col); p := S.VAL(Win32.PatternPtr, pat); br := Win32.SelectObject(Win32.CreatePatternBrush(p.bitmap), B.dc); Win32.DeleteObject(br); CASE mode OF | invert: Win32.SetBkColor(Win32.White, B.dc); Win32.SetTextColor(Win32.Black, B.dc); Win32.PatBlt(B.dc, x, B.h-y-h, w, h, PATINVERT); | replace: Win32.SetBkColor(colref, B.dc); Win32.SetTextColor(Win32.Backg, B.dc); Win32.PatBlt(B.dc, x, B.h-y-h, w, h, PATCOPY); | paint: IF colref # Win32.White THEN Win32.SetBkColor(Win32.Black, B.dc); Win32.SetTextColor(Win32.White, B.dc); Win32.PatBlt(B.dc, x, B.h-y-h, w, h, PATAND); END ; IF colref # Win32.Black THEN Win32.SetBkColor(colref, B.dc); Win32.SetTextColor(Win32.Black, B.dc); Win32.PatBlt(B.dc, x, B.h-y-h, w, h, PATPAINT); END ; END ; CloseDC(B); END END ReplPattern; *) PROCEDURE Init; VAR mod: LONGINT; BEGIN mod := Kernel.LoadLibrary("GDI32"); Kernel.GetAdr(mod, "CreateCompatibleBitmap", S.VAL(LONGINT, CreateCompatibleBitmap)); NEW(Disp); Kernel.RegisterObject(Disp, Finalize); Disp.w := Win32.DispW; Disp.h := Win32.DispH; Disp.bm := 0; Disp.dc := Win32.hdcDisp; END Init; BEGIN Init; END Bitmaps.