ðçSyntax10.Scn.FntpK Syntax10b.Scn.FntSyntax10i.Scn.Fnt_Wž +3  Œ£ld © )y—›­§N  v y10Œ§‚'„sõçžØæLMODULE Pictures; (* RC 24.4.93, JS 6.6.94 *) (* based on X11 *) IMPORT SYSTEM ,Display,Files,Kernel,Unix,X11; (* NOTE SunPictures uses Kernel.Malloc/Free instead of Unix.malloc/free *) CONST black*=0; white*=15; replace*=0; (* The new graphical object completely replaces whatever was before in the destination area. *) paint*=1; (* The new graphical object is added to whatever was before in the dertination area. *) invert*=2; (* The new graphical object inverts whatever was before in the dertination area. The color specifies, which planes are affected (inverted) and which aren't *) PictFileId*=-4093; CacheW = 512; CacheH = 4; TYPE Picture* = POINTER TO PictureDesc; Notifier* = PROCEDURE (P: Picture; X, Y, W, H : INTEGER); PictureDesc* = RECORD width*, height*, depth*: INTEGER; notify*: Notifier; pal:ARRAY 256 OF RECORD r,g,b:CHAR; END; next: LONGINT; pixmap: X11.Pixmap; END ; TYPE Map = ARRAY 256 OF CHAR; VAR dots*: Display.Pattern; root: PictureDesc; (* dummy *) rev: ARRAY 16 OF INTEGER; Gc: X11.GC; lastcol, lastmode, col: INTEGER; pixelValues, colValues: Map; getImage: X11.Image; cacheX0, cacheX1, cacheY0, cacheY1: INTEGER; cacheP, background: LONGINT; PROCEDURE Cleanup; VAR next: LONGINT; ptr: Picture; free: Picture; BEGIN ptr := S.VAL(Picture, S.ADR(root)); next := ptr^.next; WHILE next # 0 DO IF ~S.BIT(next-4, Kernel.MarkBit) THEN (* unmarked *) free := S.VAL(Picture, next); X11.FreePixmap(X11.display, free^.pixmap); next := free^.next; ptr^.next := next ELSE ptr := S.VAL(Picture, next); next := ptr^.next END END END Cleanup; PROCEDURE Address*(P: Picture): LONGINT; VAR x, y, width, height, i, j, p: INTEGER; buf, a: LONGINT; image: X11.Image; BEGIN width := P.width; height := P.height; image := X11.GetImage(X11.display, P.pixmap, 0, 0, width, height, X11.planesMask, X11.ZPixmap); S.NEW(S.VAL(Picture, buf), ((width + 7) DIV 8)*height); y := height - 1; a := buf; WHILE y >= 0 DO x := 0; LOOP i := 8; j := SHORT(ASH(1, 7)); p := 0; REPEAT IF S.VAL(LONGINT, S.VAL(SET, X11.GetPixel(image, x, y)) * S.VAL(SET, X11.planesMask)) # background THEN INC(p, j) END ; INC(x); j := j DIV 2; DEC(i); IF x = width THEN S.PUT(a, CHR(p)); INC(a); EXIT END UNTIL i = 0; S.PUT(a, CHR(p)); INC(a) END ; DEC(y) END ; X11.DestroyImage(image); RETURN buf END Address; PROCEDURE CopyBlock*(sP, dP: Picture; SX, SY, W, H, DX, DY, mode: INTEGER); VAR gc: X11.GC; BEGIN IF cacheP = S.VAL(LONGINT, dP) THEN cacheP := 0 END ; gc := Gc; IF mode = X11.paint THEN mode := X11.replace END ; IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; X11.CopyArea(X11.display, sP.pixmap, dP.pixmap, gc, SX, sP.height-SY-H, W, H, DX, dP.height-DY-H) END CopyBlock; PROCEDURE CopyPattern*(P: Picture; col: INTEGER; pat: Display.Pattern; X, Y, mode: INTEGER); VAR p: X11.PatternPtr; gc: X11.GC; colPixel: LONGINT; BEGIN IF cacheP = S.VAL(LONGINT, P) THEN cacheP := 0 END ; p := S.VAL(X11.PatternPtr, pat); gc := Gc; IF (pat = X11.ccp) (*character cache valid*) & (X11.ccf.xid # 0) THEN (* X font present *) X11.SetFont(X11.display, gc, X11.ccf.xid); IF mode = X11.paint THEN mode := X11.replace END ; IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; IF col # lastcol THEN X11.SetForeground(X11.display, gc, X11.pixelValues[col]); lastcol := col END ; X11.DrawString(X11.display, P.pixmap, gc, X - X11.ccx, P.height-Y+X11.ccy, S.ADR(X11.ccch), 1); ELSIF mode = X11.paint THEN colPixel := X11.pixelValues[col]; IF colPixel # X11.basePixel + X11.planesMask THEN X11.SetFunction(X11.display, gc, X11.GXand); X11.SetBackground(X11.display, gc, X11.basePixel + X11.planesMask); X11.SetForeground(X11.display, gc, X11.basePixel); X11.CopyPlane(X11.display, p.pixmap, P.pixmap, gc, p.x, p.y, p.w, p.h, X, P.height-Y-p.h, 1) END ; IF colPixel # X11.basePixel THEN X11.SetFunction(X11.display, gc, X11.GXor); X11.SetBackground(X11.display, gc, X11.basePixel); X11.SetForeground(X11.display, gc, colPixel); X11.CopyPlane(X11.display, p.pixmap, P.pixmap, gc, p.x, p.y, p.w, p.h, X, P.height-Y-p.h, 1) END ; X11.SetBackground(X11.display, gc, X11.background); lastcol := -1; lastmode := -1 ELSE IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; IF col # lastcol THEN X11.SetForeground(X11.display, gc, X11.pixelValues[col]); lastcol := col END ; X11.CopyPlane(X11.display, p.pixmap, P.pixmap, gc, p.x, p.y, p.w, p.h, X, P.height-Y-p.h, 1) END END CopyPattern; PROCEDURE Dot*(P: Picture; col, X, Y, mode: INTEGER); VAR gc: X11.GC; BEGIN IF (X<0) OR (X>=P.width) OR (Y<0) OR (Y>=P.height) THEN RETURN END ; IF cacheP = S.VAL(LONGINT, P) THEN cacheP := 0 END ; gc := Gc; IF mode = X11.paint THEN mode := X11.replace END ; IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; IF col # lastcol THEN X11.SetForeground(X11.display, gc, X11.pixelValues[col]); lastcol := col END ; X11.DrawPoint(X11.display, P.pixmap, gc, X, P.height-Y-1) END Dot; PROCEDURE Get*(P: Picture; X, Y: INTEGER): INTEGER; VAR pixel: LONGINT; image: X11.Image; col: INTEGER; BEGIN IF (X<0) OR (X>=P.width) OR (Y<0) OR (Y>=P.height) THEN RETURN X11.backgroundCol END ; IF (cacheP = S.VAL(LONGINT, P)) & (X >= cacheX0) & (X < cacheX1) & (Y >= cacheY0) & (Y < cacheY1) THEN (* in cache *) ELSE cacheP := S.VAL(LONGINT, P); cacheX0 := X (*- CacheW DIV 2*); cacheY0 := Y (*- CacheH DIV 2*); IF cacheX0 < 0 THEN cacheX0 := 0 END ; IF cacheY0 < 0 THEN cacheY0 := 0 END ; cacheX1 := cacheX0 + CacheW; cacheY1 := cacheY0 + CacheH; IF cacheX1 > P.width THEN cacheX1 := P.width END ; IF cacheY1 > P.height THEN cacheY1 := P.height END ; image := X11.GetSubImage(X11.display, P.pixmap, cacheX0, P.height-cacheY1, cacheX1 - cacheX0, cacheY1 - cacheY0, X11.planesMask, X11.ZPixmap, getImage, 0, 0) END ; pixel := S.VAL(LONGINT, S.VAL(SET, X11.GetPixel(getImage, X - cacheX0, cacheY1 - Y -1)) * S.VAL(SET, X11.planesMask)); IF X11.depth > 1 THEN col := ORD(colValues[pixel]) ELSIF pixel = X11.background THEN col := X11.backgroundCol ELSE col := X11.foregroundCol END ; RETURN col END Get; PROCEDURE GetRun*(P: Picture; VAR col: INTEGER; VAR x, y: INTEGER); BEGIN col := Get(P,x,y); INC(x); WHILE (Get(P,x,y) = col) & (x < P.width) DO INC(x) END; END GetRun; PROCEDURE Copy*(sP, dP: Picture; xs, ys, ws, hs, xd, yd, wd, hd, mode: INTEGER); VAR hx, hy, wd2, ws2: LONGINT; dx, dy, xso, xdo: INTEGER; BEGIN IF cacheP = S.VAL(LONGINT, dP) THEN cacheP := 0 END ; dy := yd + hd; dx := xd + wd; xso := xs; xdo := xd; wd2 := 2*wd; ws2 := 2*ws; hy := 2*hs - hd; WHILE yd < dy DO hx := 2*ws - wd; xd := xdo; xs := xso; WHILE xd < dx DO Dot(dP, Get(sP, xs, ys), xd, yd, mode); WHILE hx > 0 DO INC(xs); DEC(hx, wd2) END; INC(xd); INC(hx, ws2) END ; WHILE hy > 0 DO INC(ys); hy := hy - 2*hd END; INC(yd); hy := hy + 2*hs END END Copy; PROCEDURE ReplConst*(P: Picture; col, X, Y, W, H, mode: INTEGER); VAR gc: X11.GC; BEGIN IF cacheP = S.VAL(LONGINT, P) THEN cacheP := 0 END ; IF (H > 0) & (W > 0) THEN (* problem in X *) gc := Gc; IF mode = X11.paint THEN mode := X11.replace END ; IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; IF col # lastcol THEN X11.SetForeground(X11.display, gc, X11.pixelValues[col]); lastcol := col END ; X11.FillRectangle(X11.display, P.pixmap, gc, X, P.height-Y-H, W, H) END END ReplConst; PROCEDURE ReplPattern*(P: Picture; col: INTEGER; pat: Display.Pattern; X, Y, W, H, mode: INTEGER); VAR gc: X11.GC; p: X11.PatternPtr; colPixel: LONGINT; BEGIN IF cacheP = S.VAL(LONGINT, P) THEN cacheP := 0 END ; IF (H > 0) & (W > 0) THEN (* problem in X *) p := S.VAL(X11.PatternPtr, pat); gc := Gc; X11.SetStipple(X11.display, gc, p.pixmap); X11.SetTSOrigin(X11.display, gc, 0, P.height); X11.SetFillStyle(X11.display, gc, X11.FillOpaqueStippled); IF mode = X11.paint THEN colPixel := X11.pixelValues[col]; IF colPixel # X11.basePixel + X11.planesMask THEN X11.SetFunction(X11.display, gc, X11.GXand); X11.SetBackground(X11.display, gc, X11.basePixel + X11.planesMask); X11.SetForeground(X11.display, gc, X11.basePixel); X11.FillRectangle(X11.display, P.pixmap, gc, X, P.height-Y-H, W, H); END ; IF colPixel # X11.basePixel THEN X11.SetFunction(X11.display, gc, X11.GXor); X11.SetBackground(X11.display, gc, X11.basePixel); X11.SetForeground(X11.display, gc, colPixel); X11.FillRectangle(X11.display, P.pixmap, gc, X, P.height-Y-H, W, H); END ; X11.SetBackground(X11.display, gc, X11.background); lastcol := -1; lastmode := -1 ELSE IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; IF col # lastcol THEN X11.SetForeground(X11.display, gc, X11.pixelValues[col]); lastcol := col END ; X11.FillRectangle(X11.display, P.pixmap, gc, X, P.height-Y-H, W, H) END ; X11.SetFillStyle(X11.display, gc, X11.FillSolid) END END ReplPattern; PROCEDURE Update*(P: Picture; X, Y , W, H: INTEGER); BEGIN IF P.notify # NIL THEN P.notify(P, X, Y, W, H) END END Update; PROCEDURE DisplayBlock*(P: Picture; X, Y, W, H, DX, DY, mode: INTEGER); VAR gc: X11.GC; window: X11.Window; BEGIN IF X11.lclen > 0 THEN X11.FlushLCache END ; gc := Gc; IF mode = X11.paint THEN mode := X11.replace END ; IF mode # lastmode THEN X11.SetFunction(X11.display, gc, X11.function[mode]); lastmode := mode END ; IF DY >= 0 THEN window := X11.primary ELSE window := X11.secondary; DEC(DY, X11.UBottom) END ; X11.CopyArea(X11.display, P.pixmap, window, gc, X, P.height-Y-H, W, H, DX, Display.Height-DY-H) END DisplayBlock; PROCEDURE ReadInt(VAR R: Files.Rider; VAR i: INTEGER); VAR hi: SHORTINT; lo: CHAR; li: LONGINT; BEGIN Files.Read(R, lo); Files.Read(R, hi); li := ORD(lo) + 256*hi; i := SHORT(li) END ReadInt; PROCEDURE WriteInt(VAR R: Files.Rider; i: INTEGER); BEGIN Files.Write(R, CHR(i MOD 256)); Files.Write(R, CHR(i DIV 256 MOD 256)) END WriteInt; PROCEDURE ReadPal(VAR R: Files.Rider; P: Picture; nofcol: LONGINT); VAR col: LONGINT; BEGIN col := 0; WHILE col < nofcol DO Files.Read(R, P.pal[col].r); Files.Read(R, P.pal[col].g); Files.Read(R, P.pal[col].b); INC(col) END END ReadPal; PROCEDURE WritePal(VAR R: Files.Rider; P: Picture; nofcol: LONGINT); VAR col: LONGINT; BEGIN col := 0; WHILE col < nofcol DO Files.Write(R, P.pal[col].r); Files.Write(R, P.pal[col].g); Files.Write(R, P.pal[col].b); INC(col) END END WritePal; PROCEDURE Define(P: Picture; width, height, depth: INTEGER); (* set width, height, depth, next, pixmap *) BEGIN IF cacheP = S.VAL(LONGINT, P) THEN cacheP := 0 END ; IF (P.width # width) OR (P.height # height) OR (P.depth # depth) OR (P.pixmap = 0) THEN IF (width = 0) OR (height = 0) OR (depth = 0) THEN HALT(50) END ; P.width := width; P.height := height; P.depth := depth; IF P.pixmap = 0 THEN P.next := root.next; root.next := S.VAL(LONGINT, P) ELSE X11.FreePixmap(X11.display, P.pixmap); END ; P.pixmap := X11.CreatePixmap(X11.display, X11.primary, width, height, X11.depth); IF P.pixmap = 0 THEN HALT(40) END END END Define; PROCEDURE ReadData(VAR R: Files.Rider; P: Picture; exp, map, rv: BOOLEAN); (* load run length encoded picture *) VAR ch, ch1: CHAR; k: INTEGER; x, y, width, height, depth, status: LONGINT; image: X11.Image; imageptr: X11.ImagePtr; m: ARRAY 256 OF CHAR; PROCEDURE Unpack(p: INTEGER); VAR i: INTEGER; pixel: LONGINT; BEGIN i := 8; REPEAT IF ODD(p) THEN pixel := X11.foreground ELSE pixel := X11.background END ; pixel := X11.PutPixel(image, x, y, pixel); INC(x); p := p DIV 2; DEC(i) UNTIL (i = 0) OR (x = width) END Unpack; BEGIN IF cacheP = S.VAL(LONGINT, P) THEN cacheP := 0 END ; height := P.height; depth := P.depth; width := P.width; image := X11.CreateImage(X11.display, X11.visualptr, X11.depth, X11.ZPixmap, 0, 0, width, height, 32, 0); IF image = 0 THEN HALT(42) END ; imageptr := S.VAL(X11.ImagePtr, image); imageptr.data := Unix.Malloc(imageptr.bytesPerLine*height); IF imageptr.data = 0 THEN HALT(41) END ; IF map THEN k := 0; WHILE k < 256 DO m[k] := CHR((k MOD 2)*15); INC(k) END ; m[12] := CHR(15); m[13] := CHR(0); m[14] := CHR(15) END ; y := 0; WHILE height > 0 DO x := 0; WHILE x < width DO Files.Read(R, ch); k := ORD(ch); IF k < 128 THEN REPEAT Files.Read(R, ch); IF exp THEN ch1 := CHR(ORD(ch) MOD 16); ch := CHR(ORD(ch) DIV 16); IF map THEN ch1 := m[ORD(ch1)]; ch := m[ORD(ch)] END ; status := X11.PutPixel(image, x, y, ORD(pixelValues[ORD(ch1)])); INC(x) ELSIF map THEN ch := m[ORD(ch)] ELSIF rv THEN ch := CHR(rev[ORD(ch) DIV 16] + rev[ORD(ch) MOD 16]*16) END ; IF x < width THEN IF (depth = 1) & ~map THEN Unpack(ORD(ch)) ELSE status := X11.PutPixel(image, x, y, ORD(pixelValues[ORD(ch)])); INC(x) END END ; DEC(k) UNTIL k < 0 ELSE k := 257 - k; Files.Read(R, ch); IF exp THEN ch1 := CHR(ORD(ch) MOD 16); ch := CHR(ORD(ch) DIV 16); IF map THEN ch1 := m[ORD(ch1)]; ch := m[ORD(ch)] END ; ch1 := pixelValues[ORD(ch1)] ELSIF map THEN ch := m[ORD(ch)] ELSIF rv THEN ch := CHR(rev[ORD(ch) DIV 16] + rev[ORD(ch) MOD 16]*16) END ; IF (depth # 1) OR map THEN ch := pixelValues[ORD(ch)] END ; REPEAT IF exp THEN status := X11.PutPixel(image, x, y, ORD(ch1)); INC(x) END ; IF x < width THEN IF (depth = 1) & ~map THEN Unpack(ORD(ch)) ELSE status := X11.PutPixel(image, x, y, ORD(ch)); INC(x) END END ; DEC(k) UNTIL k < 1 END END ; DEC(height); INC(y) END ; X11.PutImage(X11.display, P.pixmap, Gc, image, 0, 0, 0, 0, width, P.height); Unix.Free(imageptr.data); X11.Free(image) END ReadData; PROCEDURE Load*(P: Picture; F: Files.File; pos: LONGINT; VAR len: LONGINT); VAR R: Files.Rider; width, height, depth, col: INTEGER; expand, map: BOOLEAN; BEGIN Files.Set(R, F, pos); ReadInt(R, width); ReadInt(R, height); ReadInt(R, depth); ReadPal(R, P, ASH(1, depth)); expand := FALSE; map := FALSE; IF depth = 4 THEN (* Ceres color picture *) expand := TRUE; map := X11.depth = 1; depth := X11.depth ELSIF depth > X11.depth THEN map := TRUE; depth := X11.depth END ; IF (depth # X11.depth) & (depth # 1) THEN HALT(43) END ; Define(P, width, height, depth); ReadData(R, P, expand, map, FALSE); len := Files.Pos(R) - pos END Load; PROCEDURE Store*(P: Picture; F: Files.File; pos: LONGINT; VAR len: LONGINT); (* stores picture to run length encoded file F (including tag) *) VAR j, a, b, x, y, width, height, depth: INTEGER; h: CHAR; buf: ARRAY 129 OF CHAR; R: Files.Rider; image: X11.Image; imageptr: X11.ImagePtr; PROCEDURE Pack(): CHAR; VAR i, j, p: INTEGER; BEGIN i := 8; j := 1; p := 0; REPEAT IF S.VAL(LONGINT, S.VAL(SET, X11.GetPixel(image, x, y)) * S.VAL(SET, X11.planesMask)) # background THEN INC(p, j) END ; INC(x); j := j*2; DEC(i) UNTIL (i = 0) OR (x = width); RETURN CHR(p) END Pack; BEGIN Files.Set(R, F, pos); WriteInt(R, PictFileId); width := P.width; height := P.height; depth := P.depth; WriteInt(R, width); WriteInt(R, height); WriteInt(R, depth); WritePal(R, P, ASH(1, depth)); image := X11.GetImage(X11.display, P.pixmap, 0, 0, width, height, X11.planesMask, X11.ZPixmap); imageptr := S.VAL(X11.ImagePtr, image); y := 0; WHILE height > 0 DO x := 0; a := 0; j := 1; buf[0] := 0X; IF depth = 1 THEN h := Pack() ELSE h := colValues[S.VAL(LONGINT, S.VAL(SET, X11.GetPixel(image, x, y)) * S.VAL(SET, X11.planesMask))]; INC(x) END ; b := 1; buf[j] := h; WHILE x < width DO IF depth = 1 THEN h := Pack() ELSE h := colValues[S.VAL(LONGINT, S.VAL(SET, X11.GetPixel(image, x, y)) * S.VAL(SET, X11.planesMask))]; INC(x) END ; IF ((b - a) < 127) & ((buf[0] = 0X) OR ((h = buf[j]) &(j = 1)) OR ((h # buf[j]) & (j > 1))) THEN (* same run *) IF h # buf[j] THEN INC(S.VAL(SHORTINT, buf[0])); INC(j); buf[j] := h ELSE DEC(S.VAL(SHORTINT, buf[0])) END ELSE (* new run *) IF (buf[j] = h) & (b - a # 127) THEN DEC(S.VAL(SHORTINT, buf[0])); Files.WriteBytes(R, buf, j); buf[0] := 0FFX ELSE Files.WriteBytes(R, buf, j + 1); buf[0] := 0X END ; j := 1; buf[j] := h; a := b END ; INC(b) END ; Files.WriteBytes(R, buf, j + 1); DEC(height); INC(y) END ; X11.DestroyImage(image); len := Files.Pos(R) - pos END Store; PROCEDURE Create*(P: Picture; width, height, depth: INTEGER); VAR col: INTEGER; BEGIN IF (depth # X11.depth) & (depth # 1) THEN HALT(44) END ; Define(P, width, height, depth); ReplConst(P, Display.black, 0, 0, P.width, P.height, Display.replace); col := 0; WHILE col < 256 DO P.pal[col].r := 0X; P.pal[col].g := 0X; P.pal[col].b := 0X; INC(col) END END Create; PROCEDURE Open*(P: Picture; name: ARRAY OF CHAR); VAR F: Files.File; R: Files.Rider; len: LONGINT; x: INTEGER; BEGIN F := Files.Old(name); IF F # NIL THEN Files.Set(R, F, 0); x := 0; ReadInt(R, x); IF x = 0 THEN (* MacPaint format *) Define(P, 576, 720, 1); Files.Set(R, F, Files.Pos(R) + 510); ReadData(R, P, FALSE, FALSE, TRUE) ELSIF x = PictFileId THEN Load(P, F, 2, len) END ELSE Create(P, Display.Width*5 DIV 8 - 20, Display.Height - 80, X11.depth) END END Open; PROCEDURE SetColor*(P: Picture; col, red, green, blue: INTEGER); BEGIN P.pal[col].r := CHR(red); P.pal[col].g := CHR(green); P.pal[col].b := CHR(blue) END SetColor; PROCEDURE GetColor*(P: Picture; col: INTEGER; VAR red, green, blue: INTEGER); BEGIN red := ORD(P.pal[col].r); green := ORD(P.pal[col].g); blue := ORD(P.pal[col].b) END GetColor; PROCEDURE CreateGC; BEGIN Gc := X11.CreateGC(X11.display, X11.primary, 0, 0); IF Gc = 0 THEN HALT(45) END ; X11.SetPlaneMask(X11.display, Gc, X11.planesMask); X11.SetGraphicsExposures(X11.display, Gc, X11.True); X11.SetBackground(X11.display, Gc, X11.background); lastcol := -1; lastmode := -1 END CreateGC; PROCEDURE Init; VAR format, pad, maxcol: LONGINT; col: INTEGER; image: X11.ImagePtr; im: ARRAY 17 OF SET; BEGIN root.next := 0; Kernel.InstallSweep(Cleanup); rev[0] := 0; rev[1] := 8; rev[2] := 4; rev[3] := 12; rev[4] := 2; rev[5] := 10; rev[6] := 6; rev[7] := 14; rev[8] := 1; rev[9] := 9; rev[10] := 5; rev[11] := 13; rev[12] := 3; rev[13] := 11; rev[14] := 7; rev[15] := 15; CreateGC; col := 0; maxcol := 16; IF X11.nofcol > maxcol THEN maxcol := X11.nofcol END ; WHILE col < 256 DO pixelValues[col] := CHR(col); INC(col) END ; colValues := pixelValues; col := 0; WHILE col < maxcol DO pixelValues[col] := CHR(S.VAL(LONGINT, S.VAL(SET, X11.pixelValues[col]) * S.VAL(SET, X11.planesMask))); INC(col) END ; IF X11.depth > 1 THEN col := 0; WHILE col < maxcol DO colValues[ORD(pixelValues[col])] := CHR(col); INC(col) END END ; background := S.VAL(LONGINT, S.VAL(SET, X11.planesMask) * S.VAL(SET, X11.background)); getImage := X11.CreateImage(X11.display, X11.visualptr, X11.depth, X11.ZPixmap, 0, 0, CacheW, CacheH, 32, 0); IF getImage = 0 THEN HALT(46) END ; image := S.VAL(X11.ImagePtr, getImage); image.data := Unix.Malloc(image.bytesPerLine*CacheH); cacheP := 0; im[1] := {}; im[2] := {1..7,9..15}; im[3] := im[2]; im[4] := im[2]; im[5] := im[2]; im[6] := im[2]; im[7] := im[2]; im[8] := im[2]; im[9] := im[1]; im[10] := im[2]; im[11] := im[2]; im[12] := im[2]; im[13] := im[2]; im[14] := im[2]; im[15] := im[2]; im[16] := im[2]; dots := Display.NewPattern(im, 16, 16) END Init; BEGIN Init END Pictures.