DIRECTORY Atom USING [GetPName], CGContext USING [Ref], Graphics USING [Color, Context, SetColor], IPBasic USING [Any, Identifier, Integer, Operator, Vector, VectorShape], IPConvert USING [AnyToIdentifier, AnyToInteger, AnyToOperator, AnyToVector], IPErrors USING [AppearanceWarning, MasterWarning], IPExec USING [Do, FGet], IPFont USING [FontKey, Modify, New], IPImager USING [CachedFont, CachedFontRep, Imager, Vars], IPImagerBasic USING [ConstantColor, Pair, Transformation], IPImagerOps USING [ConcatT, Restore, Save, Trans], IPState USING [State, StateRep], IPTransform USING [Concat, DRound, InverseTransform, Transform, TransformVec], IPVector USING [Get, Shape], Rope USING [ActionType, Concat, ROPE, Size], RopeReader USING [FreeRopeReader, Get, GetRopeReader, Ref, SetPosition], Scaled USING [Float, FromReal, Value, zero], UnifiedFonts USING [Create, DrawCharSeq, FixedUnit, FONT, GetWidthArray, Positioning, Transformation, WidthArray]; IPShowImpl: CEDAR PROGRAM IMPORTS Atom, Graphics, IPConvert, IPErrors, IPExec, IPFont, IPImagerOps, IPTransform, IPVector, Rope, RopeReader, Scaled, UnifiedFonts EXPORTS IPImagerOps, IPBasic = BEGIN OPEN IPImagerBasic, IPBasic; FONT: TYPE = UnifiedFonts.FONT; ROPE: TYPE = Rope.ROPE; State: TYPE = IPState.State; StateRep: PUBLIC TYPE = IPState.StateRep; -- export to IPBasic Imager: TYPE = IPImager.Imager; Vars: TYPE = IPImager.Vars; FontKey: TYPE = IPFont.FontKey; VFont: TYPE = REF VFontRep; VFontRep: TYPE = RECORD[vector: Vector, m: Transformation]; SetColor: PROC[imager: Imager] = INLINE { icolor: ConstantColor = NARROW[imager.vars.color]; Graphics.SetColor[imager.context, [r: icolor.r/256, g: icolor.g/256, b: icolor.b/256]]; }; ufDeviceType: ATOM _ $Interpress; ufPositioning: UnifiedFonts.Positioning _ rounded; GetFont: PROC[imager: Imager] RETURNS[FONT] = INLINE { RETURN[ IF imager.font=NIL THEN (imager.font _ LookupFont[imager.vars]) ELSE imager.font] }; LookupFont: PROC[vars: Vars] RETURNS[FONT] = { font: FONT _ NIL; WITH vars.showVec SELECT FROM key: FontKey => { FOR f: IPImager.CachedFont _ vars.fontList, f.link UNTIL f=NIL DO IF f.key=key THEN { font _ f.font; EXIT }; ENDLOOP; IF font=NIL THEN { font _ CreateFont[key, vars.T]; vars.fontList _ NEW[IPImager.CachedFontRep _ [ link: vars.fontList, key: key, font: font]]; }; }; ENDCASE; RETURN[font]; }; CreateFont: PROC[key: FontKey, T: Transformation] RETURNS[FONT] = { fontTransformation: UnifiedFonts.Transformation; IF T.d=0 THEN { -- assume uniform scaling fontTransformation _ [scale: T.a*key.m.a, rotation: 0]; } ELSE { -- assume 90 degree rotation fontTransformation _ [scale: ABS[T.d]*key.m.a, rotation: 90]; }; RETURN[UnifiedFonts.Create[key.name, fontTransformation, ufDeviceType]]; }; Show: PUBLIC PROC[self: State, v: Vector] = { imager: Imager = self.imager; vars: Vars = imager.vars; IF vars.np.noImage=0 THEN { font: FONT = GetFont[imager]; SetColor[imager]; IF font#NIL THEN { widths: UnifiedFonts.WidthArray = font.GetWidthArray[]; spaceX: Scaled.Value _ Scaled.FromReal[Scaled.Float[widths[' ]]*vars.np.amplifySpace]; context: Graphics.Context = imager.context; ref: CGContext.Ref = NARROW[context.data]; ref.cp.x _ vars.p.cpx; ref.cp.y _ vars.p.cpy; WITH v SELECT FROM rope: ROPE => TRUSTED { count: INT _ rope.Size[]; Char: TYPE = MACHINE DEPENDENT RECORD[ c(0:0..15): CHAR, width(1:0..31): Scaled.Value]; seqSize: NAT = 50; seq: ARRAY [0..seqSize) OF Char; reader: RopeReader.Ref = RopeReader.GetRopeReader[]; reader.SetPosition[rope, 0]; WHILE count>0 DO p: POINTER TO Char _ @seq[0]; zero: UnifiedFonts.FixedUnit _ Scaled.zero; n: NAT _ seqSize; IF n>count THEN n _ count; THROUGH [0..n) DO p.c _ reader.Get[]; p.width _ IF p.c=' THEN spaceX ELSE widths[p.c]; p _ p+SIZE[Char]; ENDLOOP; font.DrawCharSeq[context: context, count: n, charPtr: @seq[0].c, charIncrement: SIZE[Char], deltaXptr: @seq[0].width, deltaXincrement: SIZE[Char], deltaYptr: @zero, deltaYincrement: 0, positioning: ufPositioning]; count _ count-n; ENDLOOP; RopeReader.FreeRopeReader[reader]; }; ENDCASE => { SIGNAL IPErrors.AppearanceWarning[Unimplemented]; }; vars.p.cpx _ ref.cp.x; vars.p.cpy _ ref.cp.y; } ELSE { shape: VectorShape = IPVector.Shape[v]; showVec: Vector _ vars.showVec; m: Transformation _ NIL; WITH showVec SELECT FROM vfont: VFont => { showVec _ vfont.vector; m _ vfont.m }; ENDCASE; FOR i: Integer IN[shape.l..shape.l+shape.n) DO index: Integer; op: Operator; IPImagerOps.Save[self, FALSE]; IPImagerOps.Trans[self]; index _ IPConvert.AnyToInteger[IPVector.Get[v, i]]; op _ IPConvert.AnyToOperator[IPVector.Get[showVec, index]]; IF m#NIL THEN IPImagerOps.ConcatT[self, m]; IPExec.Do[self, op]; IPImagerOps.Restore[self]; ENDLOOP; }; }; }; ShowAndXRel: PUBLIC PROC[self: State, v: Vector] = { SIGNAL IPErrors.MasterWarning[Unimplemented]; }; SetXY: PUBLIC PROC[self: State, p: Pair] = { imager: Imager = self.imager; vars: Vars = imager.vars; dp: Pair = IPTransform.Transform[vars.T, p]; vars.p.cpx _ dp.x; vars.p.cpy _ dp.y; }; SetXYRel: PUBLIC PROC[self: State, v: Pair] = { imager: Imager = self.imager; vars: Vars = imager.vars; dv: Pair = IPTransform.TransformVec[vars.T, v]; vars.p.cpx _ vars.p.cpx + dv.x; vars.p.cpy _ vars.p.cpy + dv.y; }; SetXRel: PUBLIC PROC[self: State, x: REAL] = { SetXYRel[self, [x, 0]]; }; SetYRel: PUBLIC PROC[self: State, y: REAL] = { SetXYRel[self, [0, y]]; }; GetCP: PUBLIC PROC[self: State, rounded: BOOL _ FALSE] RETURNS[Pair] = { imager: Imager = self.imager; vars: Vars = imager.vars; dp: Pair _ [vars.p.cpx, vars.p.cpy]; IF rounded THEN dp _ IPTransform.DRound[dp]; RETURN[IPTransform.InverseTransform[vars.T, dp]]; }; HierarchicalName: PROC[v: Vector] RETURNS[ROPE] = { shape: VectorShape = IPVector.Shape[v]; rope: ROPE _ NIL; FOR i: Integer IN[shape.l..shape.l+shape.n) DO x: Any = IPVector.Get[v, i]; id: ROPE = Atom.GetPName[IPConvert.AnyToIdentifier[x]]; IF rope=NIL THEN rope _ id ELSE rope _ rope.Concat["/"].Concat[id]; ENDLOOP; RETURN[rope]; }; FontKeyToVector: PROC[f: FontKey] RETURNS[Vector] = INLINE { RETURN[f] }; VFontToVector: PROC[f: VFont] RETURNS[Vector] = INLINE { RETURN[f] }; FindFont: PUBLIC PROC[self: State, v: Vector] RETURNS[Vector] = { name: ROPE = HierarchicalName[v]; RETURN[FontKeyToVector[IPFont.New[name]]]; }; ModifyFont: PUBLIC PROC[v: Vector, m: Transformation] RETURNS[Vector] = { WITH v SELECT FROM old: FontKey => { RETURN[FontKeyToVector[IPFont.Modify[old, m]]]; }; old: VFont => { new: VFont = NEW[VFontRep _ [vector: old.vector, m: IPTransform.Concat[m, old.m]]]; RETURN[VFontToVector[new]]; }; ENDCASE => { new: VFont = NEW[VFontRep _ [vector: v, m: m]]; RETURN[VFontToVector[new]]; }; }; SetFont: PUBLIC PROC[self: State, n: Integer] = { imager: Imager = self.imager; vars: Vars = imager.vars; v: Vector = IPConvert.AnyToVector[IPExec.FGet[self, n]]; vars.showVec _ v; imager.font _ NIL; }; END. LIPShowImpl.mesa Last edited by: Doug Wyatt, July 8, 1983 10:12 am Κ1˜headšœ™šœ™Jšœ!™!—J˜šΟk ˜ Jšœœ ˜Jšœ œ˜Jšœ œ˜*Jšœœ;˜HJšœ œ=˜LJšœ œ$˜2Jšœœ ˜Jšœœ˜$Jšœ œ+˜9Jšœœ'˜:Jšœ œ!˜2Jšœœ˜ Jšœ œ=˜NJšœ œ˜Jšœœœ˜,Jšœ œ8˜HJšœœ ˜,Jšœ œ"œ:˜r—J˜—šœ œ˜Jšœ€˜‡Jšœ˜Jšœœœ˜$J˜Jšœœœ˜Jšœœœ˜J˜Jšœœ˜Jšœ œœΟc˜>J˜Jšœœ˜Jšœœ˜J˜Jšœ œ˜J˜Jšœœœ ˜Jšœ œœ$˜;J˜šΟnœœœ˜)Jšœœ˜2J˜WJ˜—J˜Jšœœ˜!Jšœ2˜2J˜š Ÿœœœœœœ˜>Jšœ œœ)œ˜T—J˜šŸ œœ œœ˜.Jšœœœ˜šœœ˜˜šœ0œœ˜AJšœ œœ˜*Jšœ˜—šœœœ˜Jšœœ˜šœœ˜.Jšœ,˜,—J˜—J˜—Jšœ˜—Jšœ˜ J˜—J˜š Ÿ œœœœœ˜CJšœ0˜0šœœœž˜)Jšœœ˜7J˜—šœž˜#Jšœœœ˜=J˜—JšœB˜HJ˜—J˜šŸœœœ˜-J˜J˜šœœ˜Jšœœ˜J˜šœœœ˜J˜7JšœV˜VJ˜+Jšœœ˜*J˜J˜šœœ˜šœœœ˜Jšœœ˜š œœœ œœ˜&Jšœ œ ˜0—Jšœ œ˜Jšœœœ˜ J˜4J˜šœ ˜Jšœœœ˜Jšœ+˜+Jšœœ ˜Jšœ œ ˜šœ˜J˜Jšœ œœœ ˜0Jšœœ˜Jšœ˜—šœ,˜,Jšœ#œ˜.Jšœ+œ˜6Jšœ%˜%Jšœ˜—J˜Jšœ˜—J˜"J˜—šœ˜ Jšœ+˜1J˜——J˜J˜J˜—šœ˜J˜'J˜Jšœœ˜šœ œ˜J˜8Jšœ˜—šœ œ˜.J˜Jšœœ˜J˜J˜3J˜;Jšœœœ˜+J˜Jšœ˜Jšœ˜—J˜—J˜—J˜—J˜šŸ œœœ˜4Jšœ'˜-J˜—J™šŸœœœ˜,J˜J˜Jšœ&œ˜,J˜J˜J˜—J˜šŸœœœ˜/J˜J˜Jšœ)œ˜/J˜J˜J˜—J˜šŸœœœœ˜.J˜J˜—J˜šŸœœœœ˜.J˜J˜—J˜š Ÿœœœœœœ ˜HJ˜J˜J˜$Jšœ œ˜,Jšœ#œ˜1J˜—J™šŸœœ œœ˜3J˜'Jšœœœ˜šœ œ˜.J˜Jšœœ/˜7Jšœœœ ˜Jšœ$˜(Jšœ˜—Jšœ˜ J˜—J˜Jš Ÿœœ œ œœ˜IJš Ÿ œœ œ œœ˜EJ˜šŸœœœœ ˜AJšœœ˜!Jšœ$˜*J˜—J˜šŸ œœœœ ˜Išœœ˜šœ˜Jšœ)˜/J˜—šœ˜Jšœ œC˜SJšœ˜J˜—šœ˜ Jšœ œ˜/Jšœ˜Jšœ˜——J˜—J˜šŸœœœ˜1J˜J˜J˜8Jšœ œ˜$J˜—J™Jšœ˜——…—Ό#9