Nicolas Cellier uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-nice.263.mcz ==================== Summary ==================== Name: Graphics-nice.263 Author: nice Time: 10 October 2013, 2:37:14.887 am UUID: 1abc4a7b-b316-4839-b6e0-0760988fc284 Ancestors: Graphics-nice.262 Hardcode [^#endOfRun] and [^#crossedX] instead of [^stopConditions endOfRun] and [^stopConditions crossedX]. The possibility of having a different symbol are never used and cost an indirection in character scanning inner loop. They also are a barrier to the restoring of primitive 103 for slow machines. Initialize DefaulStopConditions and friends with an Array. We'll then can get rid of TextStopConditions. =============== Diff against Graphics-nice.262 =============== Item was changed: Object subclass: #CharacterScanner instanceVariableNames: 'destX lastIndex destY stopConditions text textStyle alignment leftMargin rightMargin font line runStopIndex spaceCount spaceWidth emphasisCode kern indentationLevel wantsColumnBreaks pendingKernX' classVariableNames: 'ColumnBreakStopConditions CompositionStopConditions DefaultStopConditions MeasuringStopConditions PaddedSpaceCondition' poolDictionaries: 'TextConstants' category: 'Graphics-Text'! + !CharacterScanner commentStamp: 'nice 10/10/2013 02:32' prior: 0! - !CharacterScanner commentStamp: 'nice 10/6/2013 23:18' prior: 0! A CharacterScanner holds the state associated with scanning text. Subclasses scan characters for specified purposes, such as computing a CharacterBlock or placing characters into Forms. Instance Variables alignment: <Integer> destX: <Number> destY: <Number> emphasisCode: <Object> font: <AbstractFont> indentationLevel: <Integer> kern: <Number> lastIndex: <Integer> leftMargin: <Number> line: <TextLine> pendingKernX: <Number> rightMargin: <Number> runStopIndex: <Integer> spaceCount: <Integer> spaceWidth: <Number> + stopConditions: <Array> - stopConditions: <TextStopConditions> text: <Text> textStyle: <TextStyle> wantsColumnBreaks: <Boolean> alignment - an Integer encoding the alignment of text destX - horizontal position for next character (distance from left of composition area) destY - vertical position for next character (distance from top of composition area) emphasisCode - an Integer encoding the current text emphasis to use (bold, italic, ...) font - the current font used for measuring/composing/displaying characters indentationLevel - an Integer specifying a number of leading tabs to be inserted at beginning of new lines kern - a Number specifying additional horizontal spacing to place between characters (spacing is reduced when kern is negative) lastIndex - the Integer index of next character to be processed in the text leftMargin - a Number specifying the distance between left of composition zone and left of first character in the line. line - an object holding information about the line currently being displayed (like first and last index in text). Note: this is either a TextLine in Morphic, or TextLineInterval for ST80 compatibility pendingKernX - a Number to be added to horizontal spacing of next char if ever it is in the same font than previous one. The inner scan loop is interrupted by a change of text run. But some changes won't change the font, so the kerning must be remembered and applied later. rightMargin - a Number specifying the distance between right of composition zone and right of last character in the line. runStopIndex - the Integer index of last character in current text run. spaceCount - the number of spaces encoutered so far in current line. This is useful for adjusting the spacing in cas of Justified alignment. spaceWidth - the width of space character in current font. stopConditions + - an Array mapping a table of characters codes for which special actions are to be taken. - - an object holding a table of characters for which special actions are to be taken. These are typically control characters like carriage return or horizontal tab. text - the text to be measured/composed/displayed textStyle - an object holding a context for the text style (which set of font to use, which margins, etc...) wantsColumnBreaks - a Boolean indicating whether some special handling for multiple columns is requested. THIS ONLY MAKES SENSE IN CompositionScanner AND SHOULD BE MOVED TO THE SUBCLASS ! Item was changed: ----- Method: CharacterScanner class>>initialize (in category 'class initialization') ----- initialize " CharacterScanner initialize " | a | + a := Array new: 256. - a := TextStopConditions new. a at: 1 + 1 put: #embeddedObject. a at: Tab asciiValue + 1 put: #tab. a at: CR asciiValue + 1 put: #cr. a at: Character lf asciiValue + 1 put: #cr. DefaultStopConditions := a copy. CompositionStopConditions := a copy. CompositionStopConditions at: Space asciiValue + 1 put: #space. ColumnBreakStopConditions := CompositionStopConditions copy. ColumnBreakStopConditions at: Character characterForColumnBreak asciiValue + 1 put: #columnBreak. PaddedSpaceCondition := a copy. PaddedSpaceCondition at: Space asciiValue + 1 put: #paddedSpace. + MeasuringStopConditions := Array new: 256! - MeasuringStopConditions := TextStopConditions new! Item was changed: ----- Method: CharacterScanner>>handleEndOfRunAt: (in category 'scanner methods') ----- handleEndOfRunAt: stopIndex " make sure the lastIndex is set to stopIndex and then return the stopCondition for endOfRun; important for a couple of outside users" lastIndex := stopIndex. + ^#endOfRun! - ^ stopConditions endOfRun! Item was changed: ----- Method: CharacterScanner>>scanByteCharactersFrom:to:in:rightX: (in category 'scanning') ----- scanByteCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX "this is a scanning method for single byte characters in a ByteString a font that does not do character-pair kerning" | ascii nextDestX char | lastIndex := startIndex. [lastIndex <= stopIndex] whileTrue: [ "get the character value" char := sourceString at: lastIndex. ascii := char asciiValue + 1. "if there is an entry in 'stops' for this value, return it" (stopConditions at: ascii) ifNotNil: [^ stopConditions at: ascii]. "bump nextDestX by the width of the current character" nextDestX := destX + (font widthOf: char). "if the next x is past the right edge, return crossedX" nextDestX > rightX + ifTrue: [^#crossedX]. - ifTrue: [^ stopConditions crossedX]. "update destX and incorporate thr kernDelta" destX := nextDestX + kern. lastIndex := lastIndex + 1]. ^self handleEndOfRunAt: stopIndex ! Item was changed: ----- Method: CharacterScanner>>scanKernableByteCharactersFrom:to:in:rightX: (in category 'scanning') ----- scanKernableByteCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX "this is a scanning method for single byte characters in a ByteString a font that does do character-pair kerning via widthAndKernedWidthOfLeft:right:into:" | ascii nextDestX char floatDestX widthAndKernedWidth nextCharOrNil atEndOfRun | lastIndex := startIndex. floatDestX := destX. widthAndKernedWidth := Array new: 2. atEndOfRun := false. [lastIndex <= stopIndex] whileTrue: [ "get the character value" char := sourceString at: lastIndex. ascii := char asciiValue + 1. "if there is an entry in 'stops' for this value, return it" (stopConditions at: ascii) ifNotNil: [^ stopConditions at: ascii]. "get the next character..." nextCharOrNil := lastIndex + 1 <= stopIndex ifTrue: [sourceString at: lastIndex + 1] ifFalse: ["if we're at or past the stopIndex, see if there is anything in the full string" atEndOfRun := true. lastIndex + 1 <= sourceString size ifTrue: [sourceString at: lastIndex + 1]]. "get the font's kerning info for the pair of current character and next character" "for almost all fonts in common use this is a waste of time since they don't support pair kerning and both values are #widthOf: char" font widthAndKernedWidthOfLeft: char right: nextCharOrNil into: widthAndKernedWidth. "bump nextDestX by the width of the current character" nextDestX := floatDestX + (widthAndKernedWidth at: 1). "if the next x is past the right edge, return crossedX" nextDestX > rightX + ifTrue: [^ #crossedX]. - ifTrue: [^ stopConditions crossedX]. "bump floatDestX by the *kerned* width of the current character, which is where the *next* char will go" floatDestX := floatDestX + kern + (widthAndKernedWidth at: 2). "if we are at the end of this run we keep track of the character-kern-delta for possible later use and then rather insanely remove that character-kern-delta from floatDestX, making it equivalent to (old floatDestX) + kernDelta + width-of-character - no idea why" atEndOfRun ifTrue: [pendingKernX := (widthAndKernedWidth at: 2) - (widthAndKernedWidth at: 1). floatDestX := floatDestX - pendingKernX]. "save the next x for next time around the loop" destX := floatDestX. lastIndex := lastIndex + 1]. ^self handleEndOfRunAt: stopIndex ! |
Free forum by Nabble | Edit this page |