(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* by Steve Glassman, Mark Manasse and Greg Nelson *) (* Last modified on Fri Oct 30 15:29:15 PST 1992 by msm *) (* modified on Mon Feb 24 13:58:12 PST 1992 by muller *) (* modified on Tue Oct 22 21:29:39 PDT 1991 by gnelson *) (* modified on Thu Apr 12 15:21:37 PDT 1990 by steveg *) <*PRAGMA LL*> MODULE ScrnPixmap; IMPORT Rect, Point, PaintPrivate, Word, Pixmap; REVEAL Private = BRANDED OBJECT END; Pixmap.Raw = Raw_Public BRANDED OBJECT END; T = Public BRANDED OBJECT END; TYPE Raw1 = Raw OBJECT OVERRIDES get := Get1; set := Set1; sub := SubN END; Raw8 = Raw OBJECT OVERRIDES get := Get8; set := Set8; sub := SubN END; RawN = Raw OBJECT OVERRIDES get := GetN; set := SetN; sub := SubN END; PROCEDURE Get1(raw: Raw1; READONLY pt: Point.T): Pixel RAISES {} = BEGIN WITH relH = pt.h - raw.westRounded, relV = pt.v - raw.bounds.north, ix = raw.offset + relV * raw.wordsPerRow + relH DIV Word.Size, word = raw.pixels[ix] DO IF raw.pixelOrder = ByteOrder.LSBFirst THEN RETURN Word.Extract(word, relH MOD Word.Size, 1) ELSE RETURN Word.Extract(word, (-1-relH) MOD Word.Size, 1) END END END Get1; PROCEDURE Set1(raw: Raw1; READONLY pt: Point.T; pix: Pixel) RAISES {} = BEGIN WITH relH = pt.h - raw.westRounded, relV = pt.v - raw.bounds.north, ix = raw.offset + relH DIV Word.Size + relV * raw.wordsPerRow, word = raw.pixels[ix] DO IF raw.pixelOrder = ByteOrder.LSBFirst THEN word := Word.Insert(word, pix, relH MOD Word.Size, 1) ELSE word := Word.Insert(word, pix, (-1-relH) MOD Word.Size, 1) END END END Set1; PROCEDURE Get8(raw: Raw8; READONLY pt: Point.T): Pixel RAISES {} = CONST PixPerWord = Word.Size DIV 8; BEGIN WITH relH = pt.h - raw.westRounded, relV = pt.v - raw.bounds.north, ix = raw.offset + relH DIV PixPerWord + relV * raw.wordsPerRow, word = raw.pixels[ix] DO IF raw.pixelOrder = ByteOrder.LSBFirst THEN RETURN Word.Extract(word, 8*(relH MOD PixPerWord), 8) ELSE RETURN Word.Extract(word, 8*((-1-relH) MOD PixPerWord), 8) END END END Get8; PROCEDURE Set8(raw: Raw8; READONLY pt: Point.T; pix: Pixel) RAISES {} = CONST PixPerWord = Word.Size DIV 8; BEGIN WITH relH = pt.h - raw.westRounded, relV = pt.v - raw.bounds.north, ix = raw.offset + relH DIV PixPerWord + relV * raw.wordsPerRow, word = raw.pixels[ix] DO IF raw.pixelOrder = ByteOrder.LSBFirst THEN word := Word.Insert(word, pix, 8*(relH MOD PixPerWord), 8) ELSE word := Word.Insert(word, pix, 8*((-1-relH) MOD PixPerWord), 8) END END END Set8; PROCEDURE GetN(raw: Raw; READONLY pt: Point.T): Pixel RAISES {} = BEGIN WITH bpp = raw.bitsPerPixel, pixPerWord = Word.Size DIV bpp, relH = pt.h - raw.westRounded, relV = pt.v - raw.bounds.north, ix = raw.offset + relH DIV pixPerWord + relV * raw.wordsPerRow, word = raw.pixels[ix] DO IF raw.pixelOrder = ByteOrder.LSBFirst THEN RETURN Word.Extract(word, bpp * (relH MOD pixPerWord), bpp) ELSE RETURN Word.Extract(word, bpp*((-1-relH) MOD pixPerWord), bpp) END END END GetN; PROCEDURE SetN(raw: Raw; READONLY pt: Point.T; pix: Pixel) RAISES {} = BEGIN WITH bpp = raw.bitsPerPixel, pixPerWord = Word.Size DIV bpp, relH = pt.h - raw.westRounded, relV = pt.v - raw.bounds.north, ix = raw.offset + relH DIV pixPerWord + relV * raw.wordsPerRow, word = raw.pixels[ix] DO IF raw.pixelOrder = ByteOrder.LSBFirst THEN word := Word.Insert(word, pix, bpp * (relH MOD pixPerWord), bpp) ELSE word := Word.Insert(word, pix, bpp*((-1-relH) MOD pixPerWord), bpp) END END END SetN; PROCEDURE SubN(raw: Raw; READONLY rect: Rect.T): Raw RAISES {} = BEGIN WITH bpp = raw.bitsPerPixel, pixPerWord = Word.Size DIV bpp, dom = Rect.Meet(rect, raw.bounds), relH = dom.west - raw.westRounded, relV = dom.north - raw.bounds.north, ix = raw.offset + relH DIV pixPerWord + relV * raw.wordsPerRow DO RETURN NEW(RawN, depth := raw.depth, bounds := dom, pixels := raw.pixels, bitsPerPixel := bpp, wordsPerRow := raw.wordsPerRow, pixelOrder := raw.pixelOrder, westRounded := dom.west - (dom.west MOD pixPerWord), offset := ix) END END SubN; VAR defaultPixelOrder: ByteOrder := PaintPrivate.HostByteOrder; PROCEDURE NewRaw (dpth: INTEGER; READONLY bnds: Rect.T): Raw RAISES {} = VAR res: Raw; BEGIN IF dpth = 1 THEN res := NEW(Raw1) ELSIF dpth = 8 THEN res := NEW(Raw8) ELSE res := NEW(RawN) END; WITH pixPerWord = Word.Size DIV dpth, westRounded = bnds.west - (bnds.west MOD pixPerWord), pixPerRow = bnds.east - westRounded, wordsPerRow = (pixPerRow + pixPerWord - 1) DIV pixPerWord DO res.depth := dpth; res.bounds := bnds; res.pixels := NEW(REF ARRAY OF Word.T, wordsPerRow * Rect.VerSize(bnds)); res.offset := 0; IF pixPerWord = 1 THEN res.bitsPerPixel := Word.Size ELSE res.bitsPerPixel := dpth END; res.wordsPerRow := wordsPerRow; res.pixelOrder := defaultPixelOrder; res.westRounded := westRounded END; RETURN res END NewRaw; BEGIN END ScrnPixmap.