DIRECTORY TSTypes, TSObject, TSFont, TSGlue, TSOps; TSBreakUpImpl: CEDAR PROGRAM IMPORTS TSObject, TSTypes, TSFont, TSGlue, TSOps EXPORTS TSOps = BEGIN OPEN TSTypes; BreakUp: PUBLIC PROCEDURE [ list: TSObject.ItemList, direction: TSObject.Direction, size: Dimn ] RETURNS [new: TSObject.ItemList] = { brokenList: REF BrokenListRec _ NEW[BrokenListRec]; opposite: Direction _ SELECT direction FROM right => left, down => up, left => right, up => down, ENDCASE => ERROR; brokenList.source _ list.CreateReader[]; brokenList.direction _ direction; brokenList.size _ [nilDimn, nilDimn, nilDimn, nilDimn]; brokenList.size[direction] _ size; brokenList.size[opposite] _ zeroDimn; new _ TSObject.CreateItemList[ producer: BrokenListProducer, writerData: brokenList ]; }; BrokenListRec: TYPE = RECORD [ source: TSObject.ListReader, direction: TSObject.Direction, size: Dimensions, front: LIST OF REF ANY _ NIL ]; BrokenListProducer: TSObject.ProducerProc = { r: REF BrokenListRec _ NARROW[listWriter.writerData]; IF r.source.End[] THEN { listWriter.ProduceEnd[]; r.source.DestroyReader[]; r.source _ NIL } ELSE { box: TSObject.Box; markList: TSObject.MarkList; amount: INT; rear: LIST OF REF ANY; tempReader: TSObject.ListReader _ r.source.CopyReader[]; [amount, rear] _ MeasureOff[tempReader, r.direction, r.size[r.direction], r.front]; tempReader.DestroyReader[]; [box, markList] _ TSOps.Package[ source: r.source, direction: r.direction, desired: r.size, itemCount: amount, front: r.front, rear: rear ]; listWriter.ProduceItem[markList]; listWriter.ProduceItem[box]; r.front _ Postbreak[r.source]; }; }; Postbreak: PROCEDURE [ source: TSObject.ListReader ] RETURNS [postbreak: LIST OF REF ANY _ NIL] = { SELECT source.CurrentTag[] FROM space => { postbreak _ source.listParameter[leftfill]; source.Next[]; WHILE source.CurrentTag[] = space DO source.Next[] ENDLOOP; }; hyphen => { postbreak _ source.listParameter[leftfill]; source.Next[]; }; exception => { SELECT TRUE FROM ISTYPE[source.CurrentItem[], TSObject.Kerf] => { postbreak _ NARROW[source.CurrentItem[], TSObject.Kerf]^.postbreak; source.Next[] }; ENDCASE => {}; }; ENDCASE; }; MeasureOff: PROCEDURE [ list: TSObject.ListReader, direction: TSObject.Direction, size: Dimn, front: LIST OF REF ANY _ NIL ] RETURNS [ bestNumberOfItems: INT _ 0, rear: LIST OF REF ANY ] = { totGlue: TSGlue.GlueSum _ TSGlue.zeroGlueSum; AddGlue: PROC [glue: TSGlue.Glue] = INLINE {OPEN TSGlue; totGlue.space.texPts _ totGlue.space.texPts + glue.space.texPts; SELECT ABS[glue.stretch.texPts] FROM < fil.texPts => totGlue.stretch[0].texPts _ totGlue.stretch[0].texPts + glue.stretch.texPts; < fill.texPts => totGlue.stretch[1].texPts _ totGlue.stretch[1].texPts + glue.stretch.texPts; < filll.texPts => totGlue.stretch[2].texPts _ totGlue.stretch[2].texPts + glue.stretch.texPts; ENDCASE => totGlue.stretch[3].texPts _ totGlue.stretch[3].texPts + glue.stretch.texPts; SELECT ABS[glue.shrink.texPts] FROM < fil.texPts => totGlue.shrink[0].texPts _ totGlue.shrink[0].texPts + glue.shrink.texPts; < fill.texPts => totGlue.shrink[1].texPts _ totGlue.shrink[1].texPts + glue.shrink.texPts; < filll.texPts => totGlue.shrink[2].texPts _ totGlue.shrink[2].texPts + glue.shrink.texPts; ENDCASE => totGlue.shrink[3].texPts _ totGlue.shrink[3].texPts + glue.shrink.texPts; }; itemCount: INT _ 0; prebreak: LIST OF REF ANY; lowBad: Badness _ infBadness*2; oldTot: TSGlue.GlueSum; overfull: BOOLEAN _ FALSE; opposite: TSObject.Direction _ SELECT direction FROM right => left, down => up, left => right, up => down, ENDCASE => ERROR; CalculateBadness: PROC [hyphen: BOOLEAN _ FALSE] = INLINE { glueSet: TSGlue.GlueSet _ TSGlue.SetGlue[size, TSGlue.GlueFromSum[totGlue]]; curBad: Badness; overfull _ (glueSet = TSGlue.overfullGlueSet); curBad _ TSGlue.GlueBadness[glueSet]; IF curBad < lowBad THEN { lowBad _ curBad; bestNumberOfItems _ itemCount; rear _ prebreak; IF hyphen THEN rear _ CONS[NEW[TSObject.BoxRec _ [ list.currentFont.CharDimensions['-], char [list.currentFont, '-] ]], rear] }; totGlue _ oldTot; }; MeasureException: PROC[x: REF ANY] = { SELECT TRUE FROM ISTYPE[x, TSObject.Glue] => { g: TSObject.Glue _ NARROW[x]; AddGlue[g^]; }; ISTYPE[x, TSObject.Box] => { b: TSObject.Box _ NARROW[x]; totGlue.space _ AddDimn[totGlue.space, AddDimn[b.extent[opposite], b.extent[direction]]]; }; ISTYPE[x, TSObject.Kerf] => { p: LIST OF REF ANY; oldTot _ totGlue; prebreak _ p _ NARROW[x, TSObject.Kerf].prebreak; WHILE p # NIL DO MeasureException[p.first]; p _ p.rest; ENDLOOP; CalculateBadness[]; totGlue _ oldTot; p _ NARROW[x, TSObject.Kerf].join; WHILE p # NIL DO MeasureException[p.first]; p _ p.rest; ENDLOOP; }; ISTYPE[x, TSObject.Kern] => { totGlue.space _ AddDimn[totGlue.space, NARROW[x, TSObject.Kern]^]; }; ENDCASE => {}; }; WHILE front # NIL DO MeasureException[front.first]; front _ front.rest; ENDLOOP; UNTIL list.End[] OR overfull DO SELECT list.CurrentTag[] FROM char => { extent: Dimensions _ list.currentFont.CharDimensions[list.CurrentChar[]]; totGlue.space _ AddDimn[totGlue.space, AddDimn[extent[direction], extent[opposite]]]; list.Next[]; itemCount _ itemCount + 1; }; space => { oldTot _ totGlue; prebreak _ list.listParameter[rightfill]; -- measure right glue FOR p: LIST OF REF ANY _ prebreak, p.rest UNTIL p=NIL DO MeasureException[p.first]; ENDLOOP; CalculateBadness[]; totGlue _ oldTot; WHILE list.CurrentTag[] = space DO AddGlue[list.currentFont.SpaceGlue[]]; list.Next[]; itemCount _ itemCount + 1; ENDLOOP; }; hyphen => { extent: Dimensions _ list.currentFont.CharDimensions['-]; oldTot _ totGlue; totGlue.space _ AddDimn[totGlue.space, AddDimn[extent[direction], extent[opposite]]]; prebreak _ list.listParameter[rightfill]; -- measure right glue FOR p: LIST OF REF ANY _ prebreak, p.rest UNTIL p=NIL DO MeasureException[p.first]; ENDLOOP; CalculateBadness[TRUE]; totGlue _ oldTot; list.Next[]; itemCount _ itemCount + 1; }; exception => { MeasureException[list.CurrentItem[]]; list.Next[]; itemCount _ itemCount + 1; }; ENDCASE => ERROR; ENDLOOP; IF list.End[] THEN { prebreak _ NIL; CalculateBadness[]; }; }; END. Michael Plass, September 1, 1982 9:35 pm: Put in calls to TSObject.DestroyReader. Michael Plass, November 2, 1982 10:34 am. CEDARized. Rick Beach, May 13, 1983 1:54 pm. Package now returns marks to BrokenListProducer. ’TSBreakUpImpl.mesa Breaking lists into lists of boxes Michael Plass, November 2, 1982 10:34 am Last Edited by: Beach, May 24, 1983 9:11 am Κi– "cedar" style˜JšΟc™Jš"™"Jš)™)J™+JšΟk œ*˜3J˜šœžœž˜Jšžœ)˜0Jšžœ˜—Jšžœžœ ˜J˜šΟnœžœž œ˜J˜J˜J˜ Jšœžœ˜&Jšœ žœžœ˜3šœžœ ž˜+Jšœ6žœžœ˜G—J˜(J˜!J˜7J˜"J˜%˜J˜J˜J˜—J˜J˜—šœžœžœ˜J˜J˜J˜Jš œžœžœžœžœž˜J˜J˜—šŸœ˜-Jšœžœžœ˜5šžœžœ˜J˜Jšœ%ž˜(J˜—šžœ˜Jšœ˜Jšœ˜Jšœžœ˜ Jš œžœžœžœžœ˜J˜8J˜SJ˜˜ J˜J˜J˜J˜J˜J˜ J˜—J˜!J˜J˜J˜—J˜J˜—šŸ œž œ˜J˜Jš œžœ žœžœžœžœžœ˜0šžœž˜˜ J˜+J˜Jšžœžœžœ˜;J˜—˜ J˜+J˜J˜—˜šžœžœž˜šžœ*˜0Jšœ žœ1˜CJ˜ J˜—Jšžœ˜—J˜—Jšžœ˜—J˜J˜—šŸ œž œ˜J˜J˜J˜ Jš œžœžœžœžœž˜šœžœ˜ Jšœžœ˜Jšœžœžœžœž˜J˜—J˜-šŸœžœžœžœ˜8J˜@šžœžœž˜$J˜\J˜]J˜^JšžœP˜W—šžœžœž˜#J˜YJ˜ZJ˜[JšžœM˜T—J˜—Jšœ žœ˜Jš œ žœžœžœžœ˜J˜J˜Jšœ žœžœ˜šœžœ ž˜4Jšœ6žœžœ˜G—š Ÿœžœ žœžœžœ˜;J˜LJ˜J˜.J˜%šžœžœ˜J˜@šžœžœžœžœ˜2J˜$J˜J˜ —J˜—J˜J˜—šŸœžœžœžœ˜&šžœžœž˜šžœ˜Jšœžœ˜J˜ J˜—šžœ˜Jšœžœ˜J˜YJ˜—šžœ˜Jš œžœžœžœžœ˜J˜Jšœžœ˜1šžœžœž˜J˜J˜ Jšžœ˜—J˜J˜Jšœžœ˜"šžœžœž˜J˜J˜ Jšžœ˜—J˜—šžœ˜Jšœ'žœ˜BJ˜—Jšžœ˜—J˜—šžœ žœž˜J˜J˜Jšžœ˜—šžœ žœ ž˜šžœž˜˜ J˜IJ˜UJ˜ J˜J˜—˜ J˜Jšœ*˜?šžœžœžœžœžœžœžœž˜8J˜Jšžœ˜—J˜J˜šžœž˜"J˜&J˜ J˜Jšžœ˜—J˜—˜ J˜9J˜J˜UJšœ*˜?šžœžœžœžœžœžœžœž˜8J˜Jšžœ˜—Jšœžœ˜J˜J˜ J˜J˜—˜J˜%J˜ J˜J˜—Jšžœžœ˜—Jšžœ˜—šžœ žœ˜Jšœ žœ˜J˜J˜—J˜J˜—Jšžœ˜J˜J˜RJ˜4J˜R—…—š•