DIRECTORY Basics, CD, CDCells, CDCreateLabels, CDDirectory, CDBasics, CDMenus, CDMarkObjects, CDOps, CDProperties, CDRects, CDSequencer, CornerStitching, Imager, ImagerBackdoor, ImagerFont, IO, Real, Rope, TerminalIO; CDCreateLabelsImpl: CEDAR PROGRAM IMPORTS Basics, CD, CDBasics, CDMarkObjects, CDCells, CDDirectory, CDMenus, CDOps, CDProperties, CDSequencer, CDRects, CornerStitching, Imager, ImagerBackdoor, ImagerFont, IO, Real, Rope, TerminalIO EXPORTS CDCreateLabels = BEGIN IntValue: PROC [ob: CD.Object, a: ATOM] RETURNS [i: INT_0] = BEGIN WITH CDProperties.GetPropFromObject[ob, a] SELECT FROM ri: REF INT => i _ ri^; ENDCASE => NULL; END; PutIntValue: PROC [ob: CD.Object, a: ATOM, i: INT_0] = BEGIN x: REF INT _ NIL; IF i#0 THEN x _ NEW[INT _ i]; CDProperties.PutPropOnObject[ob, a, x]; END; HashT: PROC [t: Imager.Transformation] RETURNS [Rope.ROPE] = BEGIN r: Rope.ROPE _ IO.PutFR["%g,%g,%g,%g", IO.real[t.a], IO.real[t.b], IO.real[t.c], IO.real[t.d]]; RETURN [IO.PutFR["%g,%g,%g", IO.rope[r], IO.real[t.e], IO.real[t.f]]] END; MakeName: PROC [font: Imager.Font, ch: CHAR, scale: INT, lev: CD.Layer] RETURNS [n: Rope.ROPE_NIL] = BEGIN h: Rope.ROPE _ HashT[font.charToClient]; n _ IO.PutFR["#%g[%g|%d|%g|%g]", IO.char[ch], IO.rope[font.name], IO.int[scale], IO.atom[CD.LayerKey[lev]], IO.rope[h] ]; END; MakeChar: PROC [font: Imager.Font, char: CHAR, scale: INT_1, lev: CD.Layer] RETURNS [cell: CD.Object] = BEGIN cellPtr: CD.CellPtr; vec: Imager.VEC; bitmap: ImagerBackdoor.Bitmap; context: Imager.Context; empty: BOOL _ TRUE; tes: REF CornerStitching.Tesselation; IncludeRectangle: CornerStitching.PerTileProc = BEGIN empty _ FALSE; [] _ CDCells.IncludeOb[ cell: cell, ob: CDRects.CreateRect[ size: [x: (tile.EastEdge-tile.WestEdge)*scale, y: (tile.NorthEdge-tile.SouthEdge)*scale], l: lev ], position: [ x: tile.WestEdge*scale, y: tile.SouthEdge*scale ], cellCSystem: cdCoords, obCSystem: cdCoords, mode: dontPropagate ]; END; e: ImagerFont.Extents _ ImagerFont.FontBoundingBox[font]; bitmap _ ImagerBackdoor.NewBitmap[ width: Real.RoundI[e.rightExtent+e.leftExtent], height: Real.RoundI[e.ascent+e.descent] ]; context _ ImagerBackdoor.BitmapContext[bitmap]; Imager.SetColor[context, Imager.white]; Imager.MaskRectangleI[context, 0, 0, bitmap.width, bitmap.height]; Imager.SetColor[context, Imager.black]; Imager.SetXY[context, [x: e.leftExtent, y: e.descent]]; Imager.SetFont[context, font]; Imager.ShowChar[context, char]; tes _ CornerStitching.NewTesselation[]; FOR y: CARDINAL IN [0..bitmap.height) DO FOR x: CARDINAL IN [0..bitmap.width) DO TRUSTED { bitsRef: LONG POINTER TO CARDINAL _ LOOPHOLE[bitmap.base, LONG POINTER TO CARDINAL] + LONG[y]*bitmap.wordsPerLine + LONG[x/Basics.bitsPerWord]; bits: CARDINAL _ bitsRef^; IF Basics.BITAND[8000h, Basics.BITSHIFT[bits, x MOD Basics.bitsPerWord]] # 0 THEN tes.ChangeRect[[x1: x, x2: x+1, y1: bitmap.height-y-1, y2: bitmap.height-y], $covered]; } ENDLOOP; ENDLOOP; cell _ CDCells.CreateEmptyCell[]; cellPtr _ NARROW[cell.specificRef]; [] _ tes.EnumerateArea[rect: CDBasics.universe, perTile: IncludeRectangle, data: NIL]; CornerStitching.FreeTesselation[tes]; IF empty THEN { [] _ CDCells.IncludeOb[ cell: cell, ob: CDMarkObjects.markOb, position: [0, 0], cellCSystem: originCoords, mode: dontPropagate ]; }; [] _ CDCells.RepositionCell[cell, NIL]; cellPtr.simplifyOn _ MAX[cell.size.y-1, 4]; cellPtr.origin _ CDBasics.AddSize[cellPtr.origin, CD.Position[ x: scale*Real.RoundI[e.leftExtent], y: scale*Real.RoundI[e.descent] ]]; vec _ ImagerFont.RopeWidth[font, Rope.FromChar[char]]; PutIntValue[cell, $CDxWidth, scale*(Real.RoundI[vec.x])]; PutIntValue[cell, $CDxHeight, scale*(Real.RoundI[vec.y])]; END; FindOrCreateCharCell: PUBLIC PROC [design: CD.Design, font: Imager.Font, char: CHAR, scale: INT_1, lev: CD.Layer] RETURNS [cell: CD.Object_NIL] = BEGIN hashName: Rope.ROPE _ MakeName[font, char, scale, lev]; IF design#NIL AND hashName#NIL THEN cell _ CDDirectory.Fetch[design, hashName].object; IF cell=NIL THEN { cell _ MakeChar[font, char, scale, lev]; IF design#NIL THEN { IF hashName=NIL THEN hashName _ Rope.Cat["#", Rope.FromChar[char]]; [] _ CDDirectory.Include[design, cell, hashName]; }; } END; CreateTextCell: PUBLIC PROC [design: CD.Design, text: Rope.ROPE, font: Imager.Font, scale: INT_1, lev: CD.Layer] RETURNS [cell: CD.Object] = BEGIN empty: BOOL _ TRUE; IncludeChar: PROC [c: CHAR] RETURNS [quit: BOOL _ FALSE] = BEGIN IF c=' THEN { vec: Imager.VEC _ ImagerFont.RopeWidth[font, Rope.FromChar[' ]]; x _ x + scale*Real.RoundI[vec.x]; y _ y + scale*Real.RoundI[vec.y]; } ELSE { charCell: CD.Object _ FindOrCreateCharCell[design, font, c, scale, lev]; IF charCell#NIL THEN { [] _ CDCells.IncludeOb[cell: cell, ob: charCell, position: [x, y], cellCSystem: originCoords, obCSystem: originCoords ]; empty _ FALSE; x _ x + IntValue[charCell, $CDxWidth]; y _ y + IntValue[charCell, $CDxHeight]; } } END; x: CD.Number_0; y: CD.Number_0; cell _ CDCells.CreateEmptyCell[]; IF Rope.IsEmpty[text] THEN RETURN [NIL]; [] _ Rope.Map[base: text, action: IncludeChar]; IF empty THEN RETURN [NIL]; IF design#NIL THEN [] _ CDDirectory.Include[design, cell, Rope.Cat["Label[", text, "]"]]; END; CreateTextCellComm: PROC[comm: CDSequencer.Command] = BEGIN fontName, text: Rope.ROPE; font: Imager.Font; layer: CD.Layer; scale: INT; cell: CD.Object; layer _ comm.l; TerminalIO.WriteRope[Rope.Cat["create a label (using ", CDOps.LayerName[layer], ")\n"]]; fontName _ TerminalIO.RequestRope["(tioga) font name -> "]; font _ ImagerFont.Find[fontName ! Imager.Error => { TerminalIO.WriteRope[Rope.Cat["font not loaded: ", error.explanation]]; GOTO notFound }; ]; scale _ MAX[1, TerminalIO.RequestInt["scale -> "]]; text _ TerminalIO.RequestRope["text -> "]; IF Rope.IsEmpty[text] THEN { TerminalIO.WriteRope["empty text\n"]; RETURN }; cell _ CreateTextCell[comm.design, text, font, scale, layer]; IF cell=NIL THEN { TerminalIO.WriteRope["not done\n"]; RETURN }; CDOps.AddAnObject[comm.design, cell, comm.pos]; TerminalIO.WriteRope["done\n"]; EXITS notFound => NULL; END; CDSequencer.ImplementCommand[$CreateTextCell, CreateTextCellComm]; CDMenus.CreateEntry[menu: $RectProgramMenu, entry: "Enter text", key: $CreateTextCell]; END. ÎCDCreateLabelsImpl.mesa Copyright (C) 1984, 1985 by Xerox Corporation. All rights reserved. Created by: Jacobi, March 1, 1985 4:52:57 pm PST Last Edited by: Jacobi, August 30, 1985 12:59:30 pm PDT --A NIL name should not be hashed --PROCEDURE [tile: TilePtr, data: REF ANY]; --paint character in bitmap --clear bitmap ImagerBackdoor.ViewReset[context]; --cornerstitch bitmap --create cell from tesselation --positioning and spacing --NIL if not done ÊŘšœ™J™DJ™2Jšœ9™9—J˜šÏk ˜ J˜Jšœ˜J˜Jšœ˜Jšœ ˜ J˜ Jšœ˜Jšœ˜J˜J˜ J˜J˜ J˜J˜Jšœ˜Jšœ ˜ Jšœ˜J˜J˜Jšœ ˜ J˜—šÏbœœ˜!Jšœ œ˜œ˜ÇJšœ˜—Jš˜J˜š Ïnœœœ œœœ˜Jšœ#˜#Jšœ!˜!J˜—J™Jšœ™Jšœ7˜7Jšœ9˜9Jšœ:˜:šœ˜J˜——š Ÿœ œ œ"œ œ œ˜rJšœœœ˜Jš˜Jšœœ$˜7š œœœ œœ˜$Jšœ2˜2—šœœœ˜Jšœ(˜(šœœœ˜Jšœ œœ/˜CJšœ1˜1J˜—J˜—Jšœ˜—J˜šŸœ œ œœœ œœœ ˜ŒJšœ™Jš˜Jšœœœ˜J˜š Ðbn žœœœœœœ˜:Jš˜šœœ˜Jšœ œ1˜@Jšœ!˜!Jšœ!˜!J˜—šœ˜Jšœ œ<˜Hšœ œœ˜šœœ$˜0Jšœ˜Jšœ˜Jšœ˜J˜—Jšœœ˜Jšœ&˜&Jšœ'˜'J˜—J˜—Jšœ˜—J˜Jšœœ ˜Jšœœ ˜Jšœ!˜!Jšœœœœ˜(Jšœ/˜/Jšœœœœ˜JšœœœG˜YJšœ˜—J˜šŸœœ˜6Jš˜Jšœœ˜J˜Jšœœ˜Jšœœ˜ Jšœœ˜Jšœ˜JšœX˜XJšœ;˜;šœ"˜"šœœ ˜JšœG˜GJšœ ˜ Jšœ˜—Jšœ˜—Jšœœ(˜3Jšœ*˜*šœœ˜Jšœ%˜%Jš˜J˜—Jšœ=˜=šœœœ˜Jšœ#˜#Jš˜J˜—Jšœ/˜/J˜Jšœ œ˜šœ˜J˜——JšœB˜BJšœW˜Wšœ˜˜˜J˜J˜————…—`"ó