DIRECTORY Atom, CD, CDCallSpecific, CDInline, CDIO, CDLRUCache, CDOrient, CDProperties, CDRects, CDTechnology, Rope, SafeStorage, TokenIO; CDRectsImpl: CEDAR MONITOR IMPORTS Atom, CD, CDCallSpecific, CDInline, CDIO, CDLRUCache, CDOrient, CDProperties, CDTechnology, Rope, SafeStorage, TokenIO EXPORTS CDRects SHARES CD = BEGIN permanent: ZONE = SafeStorage.GetPermanentZone[]; lambda: CD.DesignNumber = CD.lambda; dummyRectPtr: CD.RectPtr = permanent.NEW[CD.RectRecord _ [filler: NIL]]; bCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 50, newProc: New]; sCache: CDLRUCache.LRUCache = CDLRUCache.Create[size: 30, newProc: New]; New: PROC [] RETURNS [CD.ObPtr] = { ob: CD.ObPtr _ NEW[CD.ObjectDefinition]; ob.specificRef _ dummyRectPtr; RETURN [ob] }; CreateRectProc: TYPE = PROC [size: CD.DesignPosition, l: CD.Level] RETURNS [CD.ObPtr] _ CreateBareRect; createRectArray: REF ARRAY CD.Level OF CreateRectProc = permanent.NEW[ARRAY CD.Level OF CreateRectProc]; -- initialized by default CreateRect: PUBLIC PROC [size: CD.DesignPosition, l: CD.Level] RETURNS [CD.ObPtr] = BEGIN RETURN [createRectArray[l][size, l]] END; HangExtensionsOn: PROC[on: REF CD.ObjectProcs] = BEGIN CDCallSpecific.Register[$Lengthen, on, Lengthen]; CDCallSpecific.Register[$Default, on, Defaulten]; END; UseAsCreateRect: PUBLIC PROC [ l: CD.Level, createRect: PROC [size: CD.DesignPosition, l: CD.Level] RETURNS [CD.ObPtr], hangExtensionsOn: REF CD.ObjectProcs ] = BEGIN IF createRect=NIL THEN createRect _ CreateBareRect; createRectArray[l] _ createRect; IF hangExtensionsOn#NIL THEN HangExtensionsOn[hangExtensionsOn]; CDProperties.PutPropOnLevel[onto: l, prop: $CDxRectCreation, val: $CDxUser]; END; CreateBareRect: PUBLIC PROC [size: CD.DesignPosition, l: CD.Level] RETURNS [CD.ObPtr] = BEGIN rp: CD.ObPtr ~ bCache.UnusedOrNew[]; rp.p _ pForRects; rp.size _ CDInline.MaxPoint[size, [lambda, lambda]]; rp.level _ l; RETURN [bCache.ReplaceByAequivalent[rp]] END; CreateSaveRect: PUBLIC PROC [size: CD.DesignPosition, l: CD.Level] RETURNS [CD.ObPtr] = BEGIN rp: CD.ObPtr ~ sCache.UnusedOrNew[]; rp.p _ pForSaveRects; rp.size _ CDInline.MaxPoint[size, [lambda, lambda]]; rp.level _ l; RETURN [sCache.ReplaceByAequivalent[rp]] END; pForRects: REF CD.ObjectProcs; pForSaveRects: REF CD.ObjectProcs; Init: PROC [] = BEGIN pForRects _ CD.RegisterObjectType[$Rect]; pForRects.drawMe _ DrawMeForRects; pForRects.internalRead _ ReadBareRect; pForRects.internalWrite _ WriteBareRect; pForRects.describe _ Describe; pForRects.wireTyped _ TRUE; HangExtensionsOn[pForRects]; pForSaveRects _ CD.RegisterObjectType[$SaveRect]; pForSaveRects.drawMe _ DrawMeForSaveRects; pForSaveRects.internalRead _ ReadBareRect; pForSaveRects.internalWrite _ WriteBareRect; pForSaveRects.describe _ Describe; pForSaveRects.wireTyped _ TRUE; HangExtensionsOn[pForSaveRects]; END; Describe: PROC[me: CD.ObPtr] RETURNS [Rope.ROPE] = BEGIN RETURN [Rope.Concat["rect ", Atom.GetPName[CD.LevelKey[me.level]]]] END; DrawMeForRects: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN pr.drawRect[CDOrient.RectAt[pos, aptr.ob.size, orient], aptr.ob.level, pr] END; DrawMeForSaveRects: PROC [aptr: CD.ApplicationPtr, pos: CD.DesignPosition, orient: CD.Orientation, pr: CD.DrawRef] = BEGIN pr.saveRect[CDOrient.RectAt[pos, aptr.ob.size, orient], aptr.ob.level, pr] END; Lengthen: CDCallSpecific.CallProc = BEGIN sz: CD.DesignPosition _ CDInline.SizeOfRect[aptr.ob.p.insideRect[aptr.ob]]; amount: CD.DesignPosition; IF x=NIL THEN amount _ [0, lambda] ELSE IF ISTYPE [x, REF CD.DesignPosition] THEN amount _ NARROW[x, REF CD.DesignPosition]^ ELSE {done_FALSE; RETURN}; sz _ CDInline.AddPoints[sz, amount]; IF sz.x<=0 OR sz.y<=0 THEN {done _ FALSE; RETURN}; aptr.ob _ CreateRect[sz, aptr.ob.level]; repaintMe _ TRUE; END; Defaulten: CDCallSpecific.CallProc = BEGIN sz: CD.DesignPosition _ CDInline.SizeOfRect[aptr.ob.p.insideRect[aptr.ob]]; w: CD.DesignNumber _ CDTechnology.LevelWidth[design, aptr.ob.level]; IF w<=0 THEN {done _ FALSE; RETURN}; sz.x _ w; aptr.ob _ CreateRect[sz, aptr.ob.level]; repaintMe _TRUE; END; SetLength: CDCallSpecific.CallProc = BEGIN newLength: CD.DesignNumber _ NARROW[x, REF CD.DesignNumber]^; sz: CD.DesignPosition _ aptr.ob.size; IF sz.ysz.x THEN sz.x _ newWidth ELSE sz.y _ newWidth; aptr.ob _ CreateRect[sz, aptr.ob.level]; repaintMe _ TRUE; END; WriteBareRect: CD.InternalWriteProc -- PROC [me: ObPtr] -- = BEGIN sz: CD.DesignPosition = CDInline.SizeOfRect[me.p.insideRect[me]]; TokenIO.WriteInt[sz.x]; TokenIO.WriteInt[sz.y]; CDIO.WriteLevel[me.level]; END; ReadBareRect: CD.InternalReadProc --PROC [] RETURNS [ObPtr]-- = BEGIN x: INT = TokenIO.ReadInt[]; y: INT = TokenIO.ReadInt[]; l: CD.Level = CDIO.ReadLevel[]; ob: CD.ObPtr = CreateRect[CD.DesignPosition[x, y], l]; RETURN [ob] END; Init[]; END. PCDRectsImpl.mesa (part of Chipndale) by Christian Jacobi June 24, 1983 4:58 pm last edited Christian Jacobi December 14, 1983 2:27 pm --???setWidth: REF CDCallSpecific.CallProc_permanent.NEW[CDCallSpecific.CallProc_SetWidth]; --???setLength: REF CDCallSpecific.CallProc_permanent.NEW[CDCallSpecific.CallProc_SetLength]; ΚV˜Jšœ&™&Jšœ,™,Jšœ8™8J˜šΟk ˜ Jšœ˜Jšœ˜J˜J˜ J˜Jšœ ˜ J˜ J˜ J˜J˜Jšœ˜Jšœ ˜ J˜J˜—šΟb œœœ˜JšœœœN˜~Jšœ ˜Jšœœ˜ —Jš˜J˜Jšœ œ"˜1Jšœœœ˜$Jš œœœœœ˜HJ˜JšœH˜HJšœH˜HJ˜šΟnœœœœ ˜#Jšœœ œœ˜(Jšœ˜Jšœ˜ J˜—J˜šŸœœœœœœœ˜UJšœ˜—J˜š œœœœœ˜7Jš œ œœœœΟc˜JJ˜—šŸ œœœœœœœ ˜SJš˜Jšœ˜$Jšœ˜J˜—šŸœœœ˜0Jš˜Jšœ1˜1Jšœ1˜1Jšœ˜—J˜šŸœœœ˜Jšœœ˜ Jš œ œœœœœ˜KJšœœ ˜$Jšœ˜Jš˜Jšœ œœ˜3Jšœ ˜ Jšœœœ$˜@JšœL˜LJšœ˜J˜—šŸœœœœœœœ ˜WJš˜Jšœœ˜$J˜J˜4J˜ Jšœ"˜(Jšœ˜J˜—š Ÿœ œœœœœ ˜WJš˜Jšœœ˜$J˜J˜4J˜ Jšœ"˜(Jšœ˜J˜—Jšœ œ ˜Jšœœ ˜"Jšœœ"œ$™\Jšœœ"œ%™^J˜šŸœœ˜Jš˜Jšœ œ˜)J˜"Jšœ&˜&Jšœ(˜(Jšœ˜Jšœœ˜Jšœ˜J˜Jšœœ˜1Jšœ*˜*Jšœ*˜*Jšœ,˜,Jšœ"˜"Jšœœ˜Jšœ ˜ Jšœ˜J˜—šŸœœœœ˜2Jš˜Jšœ&œ˜DJšœ˜—J˜šŸœœ œœ ˜^Jšœœ ˜Jš˜JšœJ˜JJšœ˜J˜—šŸœœ œœ ˜bJšœœ ˜Jš˜JšœJ˜JJšœ˜J˜—šžœ˜#Jš˜JšœœE˜KJšœœ˜Jšœœœ˜"Jšœœœœœœ œœœ˜YJšœœœ˜Jšœ$˜$Jš œ œ œœœ˜2Jšœ(˜(Jšœ œ˜Jšœ˜J˜—šŸ œ˜$Jš˜JšœœE˜KJšœœ?˜DJšœœœœ˜$Jšœ ˜ Jšœ(˜(Jšœ œ˜Jšœ˜J˜—šŸ œ˜$Jš˜Jš œ œœœœ˜=Jšœœ˜%Jšœ œ˜#Jšœ˜Jšœ(˜(Jšœ œ˜Jšœ˜J˜—šŸœ˜#Jš˜Jš œ œœœœ˜