-- IconConvert.mesa; Edited by McGregor on June 7, 1982 3:32 pm DIRECTORY Directory USING [Error, Lookup], IOStream USING [Close, CreateFileStream, Handle, UnsafePutBlock], File USING [Capability, GetSize, PageCount], Runtime USING [CallDebugger], Space USING [Create, Delete, Handle, LongPointer, Map, PageCount, virtualMemory]; IconConvert: PROGRAM IMPORTS Directory, File, IOStream, Runtime, Space = BEGIN iconH, iconW: INTEGER = 64; OldIconRep: TYPE = ARRAY [0..iconH*iconW/16) OF UNSPECIFIED; OldIconRef: TYPE = REF OldIconRep; oldIcons: ARRAY OldIconFlavor OF OldIconRef; OldIconFlavor: TYPE = MACHINE DEPENDENT { document(0), filecabinet(1), inoutbasket(2), inoutletter(3), formspad(4), printer(5), calendar(6), help(7), folder(8), records(9), calculator(10), proofreader(11), magnifier(12), recorder(13), telephone(14), teleconference(15), floppy(16), typescript(17), private(18) -- will cause call of viewer paintProc to paint icon }; NewIconFlavor: TYPE = MACHINE DEPENDENT { -- pre-defined icons document(0), dirtyDocument(1), fileCabinet(2), tool(3), typescript(4), private(177776B), -- will cause call of viewer paintProc to paint icon unInit(177777B) -- private flag for unitialised icon type }; NewIcon: TYPE = REF NewIconFileFormat; NewIconFileFormat: TYPE = MACHINE DEPENDENT RECORD [ bits: ARRAY [0..iconH*iconW/16) OF UNSPECIFIED _ ALL[0], label: BOOL _ FALSE, filler: [0..32768) _ 0, lx, ly, lw, lh: INTEGER _ 0, empty: ARRAY [0..251) OF UNSPECIFIED _ ALL[0] ]; LoadOldIcons: PROC = BEGIN ENABLE Directory.Error => GOTO Punt; iconBase: LONG POINTER TO OldIconRep; file: File.Capability _ Directory.Lookup[fileName: "Old.icons"L]; pages: File.PageCount _ File.GetSize[file]; size: Space.PageCount _ IF pages<30 THEN pages ELSE ERROR; space: Space.Handle _ Space.Create[size: size, parent: Space.virtualMemory]; Space.Map[space: space, window: [file: file, base: 1]]; -- first page is 1! iconBase _ Space.LongPointer[space]; FOR f: OldIconFlavor IN [document..typescript] DO oldIcons[f] _ NEW[OldIconRep _ iconBase^]; iconBase _ iconBase+SIZE[OldIconRep]; ENDLOOP; Space.Delete[space]; EXITS Punt => Runtime.CallDebugger["Needs Old.icons to run!"L]; END; WriteNewIcons: PROC = BEGIN OPEN IOStream; newFile: Handle _ CreateFileStream["New.icons"]; newIcon: NewIcon _ NEW[NewIconFileFormat]; WriteIcon: PROC = BEGIN UnsafePutBlock[newFile, [LOOPHOLE[newIcon], 0, SIZE[NewIconFileFormat]*2]]; newIcon.label _ FALSE; newIcon.lx _ newIcon.ly _ newIcon.lw _ newIcon.lh _ 0; END; -- document newIcon.bits _ oldIcons[document]^; newIcon.label _ TRUE; newIcon.lx _ 1; newIcon.ly _ 2; newIcon.lw _ 49; newIcon.lh _ 50; WriteIcon[]; -- dirtyDocument newIcon.bits _ oldIcons[document]^; FOR i: INTEGER IN [0..iconH) DO -- hack a diagonal line to distinguish from document index: INTEGER = (4*i) + (i/16); newIcon.bits[index] _ newIcon.bits[index] + (SELECT i MOD 16 FROM 0 => 100000B, 1 => 040000B, 2 => 020000B, 3 => 010000B, 4 => 004000B, 5 => 002000B, 6 => 001000B, 7 => 000400B, 8 => 000200B, 9 => 000100B, 10 => 000040B, 11 => 000020B, 12 => 000010B, 13 => 000004B, 14 => 000002B, ENDCASE => 000001B); ENDLOOP; newIcon.label _ TRUE; newIcon.lx _ 1; newIcon.ly _ 2; newIcon.lw _ 49; newIcon.lh _ 50; WriteIcon[]; -- fileCabinet newIcon.bits _ oldIcons[filecabinet]^; WriteIcon[]; -- tool newIcon.bits _ oldIcons[records]^; newIcon.label _ TRUE; newIcon.lx _ 6; newIcon.ly _ 27; newIcon.lw _ 41; newIcon.lh _ 25; WriteIcon[]; -- typescript newIcon.bits _ oldIcons[typescript]^; newIcon.label _ TRUE; newIcon.lx _ 11; newIcon.ly _ 17; newIcon.lw _ 44; newIcon.lh _ 30; WriteIcon[]; Close[newFile]; END; LoadOldIcons[]; WriteNewIcons[]; END. ΚΟ– "Mesa" style˜IprocšΚΟc@œΟk œ žœžœ;žœ-žœžœUžœžœ.žœžœžœžœžœž œžœžœžœžœžœžœž œ’5œžœžœž œœ_5œ*œžœžœ'žœžœž œžœ žœžœž œžœ žœžœ,žœžœ žœž œžœ Οn œžœžœžœžœžœžœžœ–žœ žœžœžœ‰œ'žœžœžœžœ0žœžœžœ<žœŸ œžœžœžœQžœŸ œžœžœžœžœ+žœ>žœ œ6žœZœ&žœžœžœ žœ5œ žœBžœžœžœ¦žœžœžœYœ9œ5žœYœ8žœlžœ%žœ˜ —…—"χ