[squeak-dev] The Trunk: Graphics-nice.289.mcz
Chris Muller
asqueaker at gmail.com
Mon Feb 17 23:27:18 UTC 2014
Thanks but I wish you'd had gone to Inbox -- because we don't want to
risk "more surprises". :)
The specific bug you're fixing (display of left-arrow) is so
unimportant relative to whether this causes any other issues.
Excluding this will make building RC5 more difficult on Wednesday.
Do I need to exclude this?
On Mon, Feb 17, 2014 at 4:30 PM, <commits at source.squeak.org> wrote:
> Nicolas Cellier uploaded a new version of Graphics to project The Trunk:
> http://source.squeak.org/trunk/Graphics-nice.289.mcz
>
> ==================== Summary ====================
>
> Name: Graphics-nice.289
> Author: nice
> Time: 17 February 2014, 11:29:40.779 pm
> UUID: e809bcbf-53e1-420b-846a-9e86e0dd1f06
> Ancestors: Graphics-nice.288
>
> Fix incorrect display of underscore and caret in case of WideString displayed in DejaVu sans Strike fonts.
>
> Those fonts map caret Character (ascii 94) and underscore Character (ascii 95) to xTable at: 128 and 129 to avoid display of up and left arrow (thanks to characterToGlypMap ivar)
>
> But some StrikeFont methods did access directly the xTable, ignoring the indirection characterToGlypMap. This is incorrect, and lead to various layout problems because widthOf: correctly takes the indirection into account. Among those problems we can cite:
> - incorrect measurement of strings,
> - unconsistent placement of cursor,
> - weird text selection
>
> This fix is a serious candidate for inclusion in 4.5 release, but I let the maintainer decide...
>
> =============== Diff against Graphics-nice.288 ===============
>
> Item was changed:
> ----- Method: StrikeFont>>characterFormAt: (in category 'character shapes') -----
> characterFormAt: character
> "Answer a Form copied out of the glyphs for the argument, character."
> | ascii leftX rightX |
> + ascii := self codeForCharacter: character.
> - ascii := character charCode.
> (ascii between: minAscii and: maxAscii) ifFalse: [ascii := maxAscii + 1].
> leftX := xTable at: ascii + 1.
> rightX := xTable at: ascii + 2.
> leftX < 0 ifTrue: [^ glyphs copy: (0 at 0 corner: 0 at self height)].
> ^ glyphs copy: (leftX @ 0 corner: rightX @ self height)!
>
> Item was removed:
> - ----- Method: StrikeFont>>characterFormAtMulti: (in category 'character shapes') -----
> - characterFormAtMulti: character
> - "Answer a Form copied out of the glyphs for the argument, character."
> - | ascii leftX rightX |
> - ascii := character charCode.
> - (ascii between: minAscii and: maxAscii) ifFalse: [ascii := maxAscii + 1].
> - leftX := xTable at: ascii + 1.
> - rightX := xTable at: ascii + 2.
> - ^ glyphs copy: (leftX @ 0 corner: rightX @ self height)!
>
> Item was changed:
> ----- Method: StrikeFont>>characters:in:displayAt:clippedBy:rule:fillColor:kernDelta:on: (in category 'displaying') -----
> characters: anInterval in: sourceString displayAt: aPoint clippedBy: clippingRectangle rule: ruleInteger fillColor: aForm kernDelta: kernDelta on: aBitBlt
> "Simple, slow, primitive method for displaying a line of characters.
> No wrap-around is provided."
> | destPoint |
> destPoint := aPoint.
> anInterval do:
> [:i | | sourceRect leftX ascii rightX |
> self flag: #yoDisplay.
> "if the char is not supported, fall back to the specified fontset."
> + ascii := self codeForCharacter: (sourceString at: i).
> - ascii := (sourceString at: i) charCode.
> (ascii < minAscii or: [ascii > maxAscii])
> ifTrue: [ascii := maxAscii].
> leftX := xTable at: ascii + 1.
> rightX := xTable at: ascii + 2.
> sourceRect := leftX at 0 extent: (rightX-leftX) @ self height.
> aBitBlt copyFrom: sourceRect in: glyphs to: destPoint.
> destPoint := destPoint + ((rightX-leftX+kernDelta)@0).
> "destPoint printString displayAt: 0@(i*20)"].
> ^ destPoint!
>
> Item was added:
> + ----- Method: StrikeFont>>codeForCharacter: (in category 'private') -----
> + codeForCharacter: aCharacter
> + | code |
> + code := aCharacter charCode.
> + (self characterToGlyphMap isNil
> + or: [ characterToGlyphMap size <= code ])
> + ifTrue: [^code].
> + ^characterToGlyphMap at: code + 1!
>
> Item was changed:
> ----- Method: StrikeFont>>glyphInfoOf:into: (in category 'accessing') -----
> glyphInfoOf: aCharacter into: glyphInfoArray
> "return the glyph info for aCharacter; if I don't have such a character, try my fallback font, if I have one of those.
> Unlike some other implementors, the returned info for a missing character is not given for the question-mark but rather the zero-ascii char."
> | code |
> (self hasGlyphOf: aCharacter)
> + ifTrue: [code := self codeForCharacter: aCharacter]
> - ifTrue: [code := aCharacter charCode]
> ifFalse: [fallbackFont
> ifNotNil: [^ fallbackFont glyphInfoOf: aCharacter into: glyphInfoArray].
> code := 0].
> glyphInfoArray at: 1 put: glyphs;
> at: 2 put: (xTable at: code + 1);
> at: 3 put: (xTable at: code + 2);
> at: 4 put: (self ascentOf: aCharacter);
> at: 5 put: self.
> ^ glyphInfoArray!
>
> Item was changed:
> ----- Method: StrikeFont>>glyphOf: (in category 'accessing') -----
> glyphOf: aCharacter
> "Answer the width of the argument as a character in the receiver."
>
> | code |
> (self hasGlyphOf: aCharacter) ifFalse: [
> fallbackFont ifNotNil: [
> ^ fallbackFont glyphOf: aCharacter.
> ].
> ^ (Form extent: 1 at self height) fillColor: Color white
> ].
> + code := self codeForCharacter: aCharacter.
> - code := aCharacter charCode.
> ^ glyphs copy: (((xTable at: code + 1)@0) corner: (xTable at: code +2)@self height).
> !
>
> Item was added:
> + ----- Method: StrikeFont>>hasGlyphForCode: (in category 'multibyte character methods') -----
> + hasGlyphForCode: aCharacterCode
> +
> + ((aCharacterCode between: self minAscii and: self maxAscii) not) ifTrue: [
> + ^ false.
> + ].
> + (xTable at: aCharacterCode + 1) < 0 ifTrue: [
> + ^ false.
> + ].
> + ^ true.
> + !
>
> Item was changed:
> ----- Method: StrikeFont>>hasGlyphOf: (in category 'multibyte character methods') -----
> hasGlyphOf: aCharacter
>
> + ^self hasGlyphForCode: (self codeForCharacter: aCharacter)
> - | code |
> - code := aCharacter charCode.
> - ((code between: self minAscii and: self maxAscii) not) ifTrue: [
> - ^ false.
> - ].
> - (xTable at: code + 1) < 0 ifTrue: [
> - ^ false.
> - ].
> - ^ true.
> !
>
> Item was removed:
> - ----- Method: StrikeFont>>leftAndRighOrNilFor: (in category 'private') -----
> - leftAndRighOrNilFor: char
> -
> - | code leftX |
> - code := char charCode.
> - ((code between: self minAscii and: self maxAscii) not) ifTrue: [
> - code := $? charCode.
> - ].
> - leftX := xTable at: code + 1.
> - leftX < 0 ifTrue: [
> - code := $? charCode.
> - leftX := xTable at: code + 1.
> - ].
> - ^ Array with: leftX with: (xTable at: code + 2).
> - !
>
>
More information about the Squeak-dev
mailing list
|