[squeak-dev] The Trunk: Graphics-nice.258.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Oct 9 00:10:08 UTC 2013
Nicolas Cellier uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-nice.258.mcz
==================== Summary ====================
Name: Graphics-nice.258
Author: nice
Time: 9 October 2013, 2:09:04.395 am
UUID: 6b4eb183-6c37-4b74-aaf7-025d1c6b4a6b
Ancestors: Graphics-nice.257
Take back the scanCharactersFrom:to:with:rightX:font: methods from *Collections
For some reasons (renaming a protocol) this message is also required in Symbol.
Give back those exlcusive MultiByte and Japanese CharacterScanner methods to *Multilingual.
Remove the now obsolete CharacterScanner methods which tried to pass stopConditions:kern:
Remove theFirstCharCrossedX which must be handled differently and uniformely
=============== Diff against Graphics-nice.257 ===============
Item was added:
+ ----- Method: ByteString>>scanCharactersFrom:to:with:rightX:font: (in category '*Graphics-Text') -----
+ scanCharactersFrom: startIndex to: stopIndex with: aCharacterScanner rightX: rightX font: aFont
+ "NB: strongly consider getting almost all these parameters from the scanner"
+ "Since I'm a byte char string, I know that we have to scan single-byte characters and don't have to handle encodings etc"
+ startIndex > stopIndex
+ ifTrue: [^aCharacterScanner handleEndOfRunAt: stopIndex].
+ ^aFont scanByteCharactersFrom: startIndex to: stopIndex in: self with: aCharacterScanner rightX: rightX!
Item was added:
+ ----- Method: ByteSymbol>>scanCharactersFrom:to:with:rightX:font: (in category '*Graphics-Text') -----
+ scanCharactersFrom: startIndex to: stopIndex with: aCharacterScanner rightX: rightX font: aFont
+ "NB: strongly consider getting almost all these parameters from the scanner"
+ "Since I'm a byte char string, I know that we have to scan single-byte characters and don't have to handle encodings etc"
+ startIndex > stopIndex
+ ifTrue: [^aCharacterScanner handleEndOfRunAt: stopIndex].
+ ^aFont scanByteCharactersFrom: startIndex to: stopIndex in: self with: aCharacterScanner rightX: rightX!
Item was removed:
- ----- Method: CharacterBlockScanner>>theFirstCharCrossedX (in category 'private') -----
- theFirstCharCrossedX
- "Note: it is hard to explain why, but this is required to keep selection of leftmost char possible."
- ^false!
Item was removed:
- ----- Method: CharacterScanner>>basicScanCharactersFrom:to:in:rightX:stopConditions:kern: (in category 'scanning') -----
- basicScanCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX stopConditions: stops kern: kernDelta
- "In ancient days this would have called primitive 103 to scan a string with StrikeFont, but time moves on. See historicalScanCharactersFrom:to:in:rightX:stopConditions:kern: if you're curious. This code handles the newer shape of CharacterScanner but does *no* pair kerning.
- There is a pretty deep assumption of simple ASCII strings and characters - beware"
- | 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"
- (stops at: ascii)
- ifNotNil: [^ stops 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: [^ stops crossedX].
- "update destX and incorporate thr kernDelta"
- destX := nextDestX + kernDelta.
- lastIndex := lastIndex + 1].
- lastIndex := stopIndex.
- ^ stops endOfRun!
Item was removed:
- ----- Method: CharacterScanner>>basicScanKernableCharactersFrom:to:in:rightX:stopConditions:kern: (in category 'scanning') -----
- basicScanKernableCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX stopConditions: stops kern: kernDelta
- "In ancient days this would have called primitive 103 to scan a string with StrikeFont, but time moves on. See historicalScanCharactersFrom:to:in:rightX:stopConditions:kern: if you're curious. This code handles the newer shape of CharacterScanner and provides some support for fonts that have pair-kerning; this may be removable with some better factoring.
- There is a pretty deep assumption of simple ASCII strings and characters - beware"
- | 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"
- (stops at: ascii)
- ifNotNil: [^ stops 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: [^ stops crossedX].
- "bump floatDestX by the *kerned* width of the current
- character, which is where the *next* char will go"
- floatDestX := floatDestX + kernDelta
- + (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].
- lastIndex := stopIndex.
- ^ stops endOfRun!
Item was removed:
- ----- Method: CharacterScanner>>isBreakableAt:in:in: (in category 'multilingual scanning') -----
- isBreakableAt: index in: sourceString in: encodingClass
- "check with the encoding whether the character at index is a breakable character.
- Only the JISX0208 & JapaneseEnvironments ever return true, so only the scanJapaneseCharacters... method calls this"
- ^ encodingClass isBreakableAt: index in: sourceString.
- !
Item was removed:
- ----- Method: CharacterScanner>>registerBreakableIndex (in category 'multilingual scanning') -----
- registerBreakableIndex
-
- "Record left x and character index of the line-wrappable point.
- The default implementation here does nothing."
-
- ^ false.
- !
Item was changed:
+ ----- Method: CharacterScanner>>scanByteCharactersFrom:to:in:rightX: (in category 'scanning') -----
- ----- Method: CharacterScanner>>scanByteCharactersFrom:to:in:rightX: (in category 'multilingual 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: [^ stopConditions crossedX].
"update destX and incorporate thr kernDelta"
destX := nextDestX + kern.
lastIndex := lastIndex + 1].
^self handleEndOfRunAt: stopIndex
!
Item was removed:
- ----- Method: CharacterScanner>>scanJapaneseCharactersFrom:to:in:rightX: (in category 'multilingual scanning') -----
- scanJapaneseCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX
- "this is a scanning method for
- multibyte Japanese characters in a WideString - hence the isBreakable:in:in:
- a font that does not do character-pair kerning "
-
- | ascii encoding nextDestX startEncoding char |
- lastIndex := startIndex.
- lastIndex > stopIndex ifTrue: [^self handleEndOfRunAt: stopIndex].
- startEncoding := (sourceString at: startIndex) leadingChar.
- [lastIndex <= stopIndex] whileTrue: [
- char := sourceString at: lastIndex.
- encoding := char leadingChar.
- encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stopConditions endOfRun].
- ascii := char charCode.
- (encoding = 0 and: [ascii < 256 and:[(stopConditions at: ascii + 1) notNil]])
- ifTrue: [^ stopConditions at: ascii + 1].
- (self isBreakableAt: lastIndex in: sourceString in: (EncodedCharSet charsetAt: encoding)) ifTrue: [
- self registerBreakableIndex.
- ].
- nextDestX := destX + (font widthOf: char).
- nextDestX > rightX ifTrue: [self theFirstCharCrossedX ifFalse: [^ stopConditions crossedX]].
- destX := nextDestX + kern.
- lastIndex := lastIndex + 1.
- ].
- ^self handleEndOfRunAt: stopIndex!
Item was removed:
- ----- Method: CharacterScanner>>scanJapaneseCharactersFrom:to:in:rightX:stopConditions:kern: (in category 'multilingual scanning') -----
- scanJapaneseCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX stopConditions: stops kern: kernDelta
-
- | ascii encoding nextDestX startEncoding |
- lastIndex := startIndex.
- lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops endOfRun].
- startEncoding := (sourceString at: startIndex) leadingChar.
- [lastIndex <= stopIndex] whileTrue: [
- encoding := (sourceString at: lastIndex) leadingChar.
- encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops endOfRun].
- ascii := (sourceString at: lastIndex) charCode.
- (encoding = 0 and: [ascii < 256 and:[(stops at: ascii + 1) notNil]])
- ifTrue: [^ stops at: ascii + 1].
- (self isBreakableAt: lastIndex in: sourceString in: (EncodedCharSet charsetAt: encoding)) ifTrue: [
- self registerBreakableIndex.
- ].
- nextDestX := destX + (font widthOf: (sourceString at: lastIndex)).
- nextDestX > rightX ifTrue: [self theFirstCharCrossedX ifFalse: [^ stops crossedX]].
- destX := nextDestX + kernDelta.
- lastIndex := lastIndex + 1.
- ].
- lastIndex := stopIndex.
- ^ stops endOfRun!
Item was changed:
+ ----- Method: CharacterScanner>>scanKernableByteCharactersFrom:to:in:rightX: (in category 'scanning') -----
- ----- Method: CharacterScanner>>scanKernableByteCharactersFrom:to:in:rightX: (in category 'multilingual 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: [^ 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
!
Item was removed:
- ----- Method: CharacterScanner>>scanKernableMultibyteCharactersFrom:to:in:rightX: (in category 'multilingual scanning') -----
- scanKernableMultibyteCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX
- "this is a scanning method for
- multibyte characters in a WideString
- a font that does do character-pair kerning via widthAndKernedWidthOfLeft:right:into:"
-
- | ascii encoding nextDestX startEncoding floatDestX widthAndKernedWidth nextChar atEndOfRun char |
- lastIndex := startIndex.
- lastIndex > stopIndex ifTrue: [^self handleEndOfRunAt: stopIndex].
- startEncoding := (sourceString at: startIndex) leadingChar.
- floatDestX := destX.
- widthAndKernedWidth := Array new: 2.
- atEndOfRun := false.
- [lastIndex <= stopIndex] whileTrue: [
- char := sourceString at: lastIndex.
- encoding := char leadingChar.
- encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stopConditions endOfRun].
- ascii := char charCode.
- (ascii < 256 and: [(stopConditions at: ascii + 1) ~~ nil]) ifTrue: [^ stopConditions at: ascii + 1].
- nextChar := (lastIndex + 1 <= stopIndex)
- ifTrue:[sourceString at: lastIndex + 1]
- ifFalse:[
- atEndOfRun := true.
- "if there is a next char in sourceString, then get the kern
- and store it in pendingKernX"
- lastIndex + 1 <= sourceString size
- ifTrue:[sourceString at: lastIndex + 1]
- ifFalse:[ nil]].
- font
- widthAndKernedWidthOfLeft: char
- right: nextChar
- into: widthAndKernedWidth.
- nextDestX := floatDestX + (widthAndKernedWidth at: 1).
- nextDestX > rightX ifTrue: [self theFirstCharCrossedX ifFalse: [^stopConditions crossedX]].
- floatDestX := floatDestX + kern + (widthAndKernedWidth at: 2).
- atEndOfRun
- ifTrue:[
- pendingKernX := (widthAndKernedWidth at: 2) - (widthAndKernedWidth at: 1).
- floatDestX := floatDestX - pendingKernX].
- destX := floatDestX .
- lastIndex := lastIndex + 1.
- ].
- ^self handleEndOfRunAt: stopIndex!
Item was removed:
- ----- Method: CharacterScanner>>scanMultiCharactersFrom:to:in:rightX:stopConditions:kern: (in category 'multilingual scanning') -----
- scanMultiCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX stopConditions: stops kern: kernDelta
-
- | ascii encoding nextDestX startEncoding floatDestX widthAndKernedWidth nextChar atEndOfRun |
- lastIndex := startIndex.
- lastIndex > stopIndex ifTrue: [lastIndex := stopIndex. ^ stops endOfRun].
- startEncoding := (sourceString at: startIndex) leadingChar.
- floatDestX := destX.
- widthAndKernedWidth := Array new: 2.
- atEndOfRun := false.
- [lastIndex <= stopIndex] whileTrue: [
- encoding := (sourceString at: lastIndex) leadingChar.
- encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stops endOfRun].
- ascii := (sourceString at: lastIndex) charCode.
- (ascii < 256 and: [(stops at: ascii + 1) ~~ nil]) ifTrue: [^ stops at: ascii + 1].
- nextChar := (lastIndex + 1 <= stopIndex)
- ifTrue:[sourceString at: lastIndex + 1]
- ifFalse:[
- atEndOfRun := true.
- "if there is a next char in sourceString, then get the kern
- and store it in pendingKernX"
- lastIndex + 1 <= sourceString size
- ifTrue:[sourceString at: lastIndex + 1]
- ifFalse:[ nil]].
- font
- widthAndKernedWidthOfLeft: (sourceString at: lastIndex)
- right: nextChar
- into: widthAndKernedWidth.
- nextDestX := floatDestX + (widthAndKernedWidth at: 1).
- nextDestX > rightX ifTrue: [self theFirstCharCrossedX ifFalse: [^stops crossedX]].
- floatDestX := floatDestX + kernDelta + (widthAndKernedWidth at: 2).
- atEndOfRun
- ifTrue:[
- pendingKernX := (widthAndKernedWidth at: 2) - (widthAndKernedWidth at: 1).
- floatDestX := floatDestX - pendingKernX].
- destX := floatDestX .
- lastIndex := lastIndex + 1.
- ].
- lastIndex := stopIndex.
- ^ stops endOfRun!
Item was removed:
- ----- Method: CharacterScanner>>scanMultibyteCharactersFrom:to:in:rightX: (in category 'multilingual scanning') -----
- scanMultibyteCharactersFrom: startIndex to: stopIndex in: sourceString rightX: rightX
- "this is a scanning method for
- multibyte characters in a WideString
- a font that does not do character-pair kerning"
- | char ascii encoding nextDestX startEncoding |
- lastIndex := startIndex.
- startEncoding := (sourceString at: startIndex) leadingChar.
- [lastIndex <= stopIndex] whileTrue: [
- char := sourceString at: lastIndex.
- encoding := char leadingChar.
- encoding ~= startEncoding ifTrue: [lastIndex := lastIndex - 1. ^ stopConditions endOfRun].
- ascii := char charCode.
- (ascii < 256 and: [(stopConditions at: ascii + 1) ~~ nil]) ifTrue: [^ stopConditions at: ascii + 1].
- "bump nextDestX by the width of the current character"
- nextDestX := destX + (font widthOf: char).
- nextDestX > rightX ifTrue: [self theFirstCharCrossedX ifFalse: [^stopConditions crossedX]].
- destX := nextDestX + kern .
- lastIndex := lastIndex + 1.
- ].
- ^self handleEndOfRunAt: stopIndex!
Item was removed:
- ----- Method: CharacterScanner>>theFirstCharCrossedX (in category 'private') -----
- theFirstCharCrossedX
- "Tell whether the left most char crossed the right margin boundary"
- ^destX = leftMargin!
Item was removed:
- ----- Method: CompositionScanner>>registerBreakableIndex (in category 'multilingual scanning') -----
- registerBreakableIndex
- "Record left x and character index of the line-wrappable point.
- Used for wrap-around in eastern Asian languages."
-
- spaceX := destX.
- lineHeightAtSpace := lineHeight.
- baselineAtSpace := baseline.
- spaceIndex := lastIndex.
- lastBreakIsNotASpace := true.!
Item was removed:
- ----- Method: DisplayScanner>>isBreakableAt:in:in: (in category 'multilingual scanning') -----
- isBreakableAt: index in: sourceString in: encodingClass
-
- ^ false.
- !
Item was added:
+ ----- Method: WideString>>scanCharactersFrom:to:with:rightX:font: (in category '*Graphics-Text') -----
+ scanCharactersFrom: startIndex to: stopIndex with: aCharacterScanner rightX: rightX font: aFont
+ "NB: strongly consider getting almost all these parameters from the scanner"
+ "Since I'm a wide char string, I know that we have to scan multi-byte characters and handle encodings etc"
+ | charSet |
+ startIndex > stopIndex
+ ifTrue: [^aCharacterScanner handleEndOfRunAt: stopIndex].
+ charSet := self encodedCharSetAt: startIndex.
+ ^charSet scanMultibyteCharactersFrom: startIndex to: stopIndex in: self with: aCharacterScanner rightX: rightX font: aFont !
Item was added:
+ ----- Method: WideSymbol>>scanCharactersFrom:to:with:rightX:font: (in category '*Graphics-Text') -----
+ scanCharactersFrom: startIndex to: stopIndex with: aCharacterScanner rightX: rightX font: aFont
+ "NB: strongly consider getting almost all these parameters from the scanner"
+ "Since I'm a wide char string, I know that we have to scan multi-byte characters and handle encodings etc"
+ | charSet |
+ startIndex > stopIndex
+ ifTrue: [^aCharacterScanner handleEndOfRunAt: stopIndex].
+ charSet := self encodedCharSetAt: startIndex.
+ ^charSet scanMultibyteCharactersFrom: startIndex to: stopIndex in: self with: aCharacterScanner rightX: rightX font: aFont !
More information about the Squeak-dev
mailing list
|