The Trunk: Graphics-nice.263.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Graphics-nice.263.mcz

commits-2
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
  !