The Trunk: Multilingual-tpr.167.mcz

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

The Trunk: Multilingual-tpr.167.mcz

commits-2
tim Rowledge uploaded a new version of Multilingual to project The Trunk:
http://source.squeak.org/trunk/Multilingual-tpr.167.mcz

==================== Summary ====================

Name: Multilingual-tpr.167
Author: tpr
Time: 3 September 2013, 5:02:14.904 pm
UUID: 370d09db-992b-4348-9062-79cfaacf0e5e
Ancestors: Multilingual-fbs.166

Provide a sensible implementation of #characterToGlyphMap to allow the intended primitive to do what it primitively does.
Add some comments to a few important methods to, y'know, actually help readers understand WTF is going on.
Part of fixing Mantis-01781 7 years after it was reported.

=============== Diff against Multilingual-fbs.166 ===============

Item was added:
+ ----- Method: StrikeFontSet>>characterToGlyphMap (in category 'accessing') -----
+ characterToGlyphMap
+ "return the mapping for my first font; this follows the general form of all the other accessing methods but since we can't specifically find a font for a particualr character her we devolve to the first font in the fontArray - just like the other non-character-specific messages (#ascent etc).
+ This is only sent by the BitBlt>primDisplayString:from:to:map:xTable: method (other than internally by StrikeFont)"
+ ^fontArray first characterToGlyphMap!

Item was changed:
  ----- Method: StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY: (in category 'displaying') -----
  displayMultiString: aString on: aBitBlt from: startIndex to: stopIndex at: aPoint kern: kernDelta baselineY: baselineY
+ "display a multi-byte characterset string; each character may require swapping to a new strikefont as discovered by glyphInfoOf:"
-
  | destPoint leftX rightX glyphInfo g destY |
  destPoint := aPoint.
  glyphInfo := Array new: 5.
  startIndex to: stopIndex do: [:charIndex |
  self glyphInfoOf: (aString at: charIndex) into: glyphInfo.
  g := glyphInfo at:1.
  leftX := glyphInfo at:2.
  rightX := glyphInfo at:3.
  ((glyphInfo at:5) ~= aBitBlt lastFont) ifTrue: [
  (glyphInfo at:5) installOn: aBitBlt.
  ].
  aBitBlt sourceForm: g.
  destY := baselineY - (glyphInfo at:4).
  aBitBlt destX: (destPoint x) destY: destY width: (rightX - leftX) height: (self height).
  aBitBlt sourceOrigin: leftX @ 0.
  aBitBlt copyBits.
  destPoint := destPoint x + (rightX - leftX + kernDelta) @ destPoint y.
  ].
  ^ destPoint.!

Item was changed:
  ----- Method: StrikeFontSet>>glyphInfoOf:into: (in category 'private') -----
  glyphInfoOf: aCharacter into: glyphInfoArray
+ "return glyph info for the character; it can get complicated."
-
  | index f code leftX |
+ "the leadingChar gives us an encoding. if that is outside the range of fonts in my fontArray, just return the default glyphInfo for a question-mark"
  index := aCharacter leadingChar + 1.
  fontArray size < index ifTrue: [^ self questionGlyphInfoInto: glyphInfoArray].
  (f := fontArray at: index) ifNil: [^ self questionGlyphInfoInto: glyphInfoArray].
 
+ "if the actual character is not in the range supported by the chosen font, return that default question-mark info "
  code := aCharacter charCode.
  ((code between: f minAscii and: f maxAscii) not) ifTrue: [
  ^ self questionGlyphInfoInto: glyphInfoArray.
  ].
+
+ "if the xTable doesn't like the character, return that question-mark default info"
  leftX := f xTable at: code + 1.
  leftX < 0 ifTrue: [
  ^ self questionGlyphInfoInto: glyphInfoArray.
  ].
+
+ "finally, we have an ok font and character to return glyph info about"
  glyphInfoArray at: 1 put: f glyphs;
  at: 2 put: leftX;
  at: 3 put: (f xTable at: code + 2);
  at: 4 put: (f ascentOf: aCharacter);
  at: 5 put: self.
  ^ glyphInfoArray.
  !

Item was changed:
  ----- Method: StrikeFontSet>>questionGlyphInfoInto: (in category 'private') -----
  questionGlyphInfoInto: glyphInfoArray
+ "return glyph info for the question mark character in the first font of the fontArray -sort of a default set of info"
-
  | f ascii |
  f := fontArray at: 1.
  ascii := $? asciiValue.
  glyphInfoArray at: 1 put: f glyphs;
  at: 2 put: (f xTable at: ascii + 1);
  at: 3 put: (f xTable at: ascii + 2);
  at: 4 put: (self ascentOf: $?);
  at: 5 put: self.
  ^ glyphInfoArray.
  !


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Multilingual-tpr.167.mcz

Hannes Hirzel
Great to have these additional comments on the methods

StrikeFontSet>>characterToGlyphMap
StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY:
StrikeFontSet>>glyphInfoOf:into:
StrikeFontSet>>questionGlyphInfoInto:

--Hannes

On Wed, 4 Sep 2013 00:02:21.542 0000, [hidden email]
<[hidden email]> wrote:

> tim Rowledge uploaded a new version of Multilingual to project The Trunk:
> http://source.squeak.org/trunk/Multilingual-tpr.167.mcz
>
> ==================== Summary ====================
>
> Name: Multilingual-tpr.167
> Author: tpr
> Time: 3 September 2013, 5:02:14.904 pm
> UUID: 370d09db-992b-4348-9062-79cfaacf0e5e
> Ancestors: Multilingual-fbs.166
>
> Provide a sensible implementation of #characterToGlyphMap to allow the
> intended primitive to do what it primitively does.
> Add some comments to a few important methods to, y'know, actually help
> readers understand WTF is going on.
> Part of fixing Mantis-01781 7 years after it was reported.
>
> =============== Diff against Multilingual-fbs.166 ===============
>
> Item was added:
> + ----- Method: StrikeFontSet>>characterToGlyphMap (in category 'accessing')
> -----
> + characterToGlyphMap
> + "return the mapping for my first font; this follows the general form of
> all the other accessing methods but since we can't specifically find a font
> for a particualr character her we devolve to the first font in the fontArray
> - just like the other non-character-specific messages (#ascent etc).
> + This is only sent by the BitBlt>primDisplayString:from:to:map:xTable:
> method (other than internally by StrikeFont)"
> + ^fontArray first characterToGlyphMap!
>
> Item was changed:
>   ----- Method:
> StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY: (in category
> 'displaying') -----
>   displayMultiString: aString on: aBitBlt from: startIndex to: stopIndex at:
> aPoint kern: kernDelta baselineY: baselineY
> + "display a multi-byte characterset string; each character may require
> swapping to a new strikefont as discovered by glyphInfoOf:"
> -
>   | destPoint leftX rightX glyphInfo g destY |
>   destPoint := aPoint.
>   glyphInfo := Array new: 5.
>   startIndex to: stopIndex do: [:charIndex |
>   self glyphInfoOf: (aString at: charIndex) into: glyphInfo.
>   g := glyphInfo at:1.
>   leftX := glyphInfo at:2.
>   rightX := glyphInfo at:3.
>   ((glyphInfo at:5) ~= aBitBlt lastFont) ifTrue: [
>   (glyphInfo at:5) installOn: aBitBlt.
>   ].
>   aBitBlt sourceForm: g.
>   destY := baselineY - (glyphInfo at:4).
>   aBitBlt destX: (destPoint x) destY: destY width: (rightX - leftX)
> height: (self height).
>   aBitBlt sourceOrigin: leftX @ 0.
>   aBitBlt copyBits.
>   destPoint := destPoint x + (rightX - leftX + kernDelta) @ destPoint y.
>   ].
>   ^ destPoint.!
>
> Item was changed:
>   ----- Method: StrikeFontSet>>glyphInfoOf:into: (in category 'private')
> -----
>   glyphInfoOf: aCharacter into: glyphInfoArray
> + "return glyph info for the character; it can get complicated."
> -
>   | index f code leftX |
> + "the leadingChar gives us an encoding. if that is outside the range of
> fonts in my fontArray, just return the default glyphInfo for a
> question-mark"
>   index := aCharacter leadingChar + 1.
>   fontArray size < index ifTrue: [^ self questionGlyphInfoInto:
> glyphInfoArray].
>   (f := fontArray at: index) ifNil: [^ self questionGlyphInfoInto:
> glyphInfoArray].
>
> + "if the actual character is not in the range supported by the chosen
> font, return that default question-mark info "
>   code := aCharacter charCode.
>   ((code between: f minAscii and: f maxAscii) not) ifTrue: [
>   ^ self questionGlyphInfoInto: glyphInfoArray.
>   ].
> +
> + "if the xTable doesn't like the character, return that question-mark
> default info"
>   leftX := f xTable at: code + 1.
>   leftX < 0 ifTrue: [
>   ^ self questionGlyphInfoInto: glyphInfoArray.
>   ].
> +
> + "finally, we have an ok font and character to return glyph info about"
>   glyphInfoArray at: 1 put: f glyphs;
>   at: 2 put: leftX;
>   at: 3 put: (f xTable at: code + 2);
>   at: 4 put: (f ascentOf: aCharacter);
>   at: 5 put: self.
>   ^ glyphInfoArray.
>   !
>
> Item was changed:
>   ----- Method: StrikeFontSet>>questionGlyphInfoInto: (in category
> 'private') -----
>   questionGlyphInfoInto: glyphInfoArray
> + "return glyph info for the question mark character in the first font of
> the fontArray -sort of a default set of info"
> -
>   | f ascii |
>   f := fontArray at: 1.
>   ascii := $? asciiValue.
>   glyphInfoArray at: 1 put: f glyphs;
>   at: 2 put: (f xTable at: ascii + 1);
>   at: 3 put: (f xTable at: ascii + 2);
>   at: 4 put: (self ascentOf: $?);
>   at: 5 put: self.
>   ^ glyphInfoArray.
>   !
>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Multilingual-tpr.167.mcz

Hannes Hirzel
In addition to these method comments fixed here

StrikeFontSet>>characterToGlyphMap
StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY:
StrikeFontSet>>glyphInfoOf:into:
StrikeFontSet>>questionGlyphInfoInto:


With http://source.squeak.org/trunk/TrueType-tpr.26.mcz

comments added to

TTCFontSet>>questionGlyphInfoInto:
TTCFontSet>>glyphInfoOf:into:
TTCFont>>glyphInfoOf:into:
MultiTTCFont>>glyphInfoOf:into:


With http://source.squeak.org/trunk/Graphics-tpr.222.mcz
comments added to

FixedFaceFont>>glyphInfoOf:into:
StrikeFont>>displayMultiString:on:from:to:at:kern:baselineY:
StrikeFont>>glyphInfoOf:into:


On 9/4/13, H. Hirzel <[hidden email]> wrote:

> Great to have these additional comments on the methods
>
> StrikeFontSet>>characterToGlyphMap
> StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY:
> StrikeFontSet>>glyphInfoOf:into:
> StrikeFontSet>>questionGlyphInfoInto:
>
> --Hannes
>
> On Wed, 4 Sep 2013 00:02:21.542 0000, [hidden email]
> <[hidden email]> wrote:
>> tim Rowledge uploaded a new version of Multilingual to project The Trunk:
>> http://source.squeak.org/trunk/Multilingual-tpr.167.mcz
>>
>> ==================== Summary ====================
>>
>> Name: Multilingual-tpr.167
>> Author: tpr
>> Time: 3 September 2013, 5:02:14.904 pm
>> UUID: 370d09db-992b-4348-9062-79cfaacf0e5e
>> Ancestors: Multilingual-fbs.166
>>
>> Provide a sensible implementation of #characterToGlyphMap to allow the
>> intended primitive to do what it primitively does.
>> Add some comments to a few important methods to, y'know, actually help
>> readers understand WTF is going on.
>> Part of fixing Mantis-01781 7 years after it was reported.
>>
>> =============== Diff against Multilingual-fbs.166 ===============
>>
>> Item was added:
>> + ----- Method: StrikeFontSet>>characterToGlyphMap (in category
>> 'accessing')
>> -----
>> + characterToGlyphMap
>> + "return the mapping for my first font; this follows the general form
>> of
>> all the other accessing methods but since we can't specifically find a
>> font
>> for a particualr character her we devolve to the first font in the
>> fontArray
>> - just like the other non-character-specific messages (#ascent etc).
>> + This is only sent by the BitBlt>primDisplayString:from:to:map:xTable:
>> method (other than internally by StrikeFont)"
>> + ^fontArray first characterToGlyphMap!
>>
>> Item was changed:
>>   ----- Method:
>> StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY: (in
>> category
>> 'displaying') -----
>>   displayMultiString: aString on: aBitBlt from: startIndex to: stopIndex
>> at:
>> aPoint kern: kernDelta baselineY: baselineY
>> + "display a multi-byte characterset string; each character may require
>> swapping to a new strikefont as discovered by glyphInfoOf:"
>> -
>>   | destPoint leftX rightX glyphInfo g destY |
>>   destPoint := aPoint.
>>   glyphInfo := Array new: 5.
>>   startIndex to: stopIndex do: [:charIndex |
>>   self glyphInfoOf: (aString at: charIndex) into: glyphInfo.
>>   g := glyphInfo at:1.
>>   leftX := glyphInfo at:2.
>>   rightX := glyphInfo at:3.
>>   ((glyphInfo at:5) ~= aBitBlt lastFont) ifTrue: [
>>   (glyphInfo at:5) installOn: aBitBlt.
>>   ].
>>   aBitBlt sourceForm: g.
>>   destY := baselineY - (glyphInfo at:4).
>>   aBitBlt destX: (destPoint x) destY: destY width: (rightX - leftX)
>> height: (self height).
>>   aBitBlt sourceOrigin: leftX @ 0.
>>   aBitBlt copyBits.
>>   destPoint := destPoint x + (rightX - leftX + kernDelta) @ destPoint
>> y.
>>   ].
>>   ^ destPoint.!
>>
>> Item was changed:
>>   ----- Method: StrikeFontSet>>glyphInfoOf:into: (in category 'private')
>> -----
>>   glyphInfoOf: aCharacter into: glyphInfoArray
>> + "return glyph info for the character; it can get complicated."
>> -
>>   | index f code leftX |
>> + "the leadingChar gives us an encoding. if that is outside the range of
>> fonts in my fontArray, just return the default glyphInfo for a
>> question-mark"
>>   index := aCharacter leadingChar + 1.
>>   fontArray size < index ifTrue: [^ self questionGlyphInfoInto:
>> glyphInfoArray].
>>   (f := fontArray at: index) ifNil: [^ self questionGlyphInfoInto:
>> glyphInfoArray].
>>
>> + "if the actual character is not in the range supported by the chosen
>> font, return that default question-mark info "
>>   code := aCharacter charCode.
>>   ((code between: f minAscii and: f maxAscii) not) ifTrue: [
>>   ^ self questionGlyphInfoInto: glyphInfoArray.
>>   ].
>> +
>> + "if the xTable doesn't like the character, return that question-mark
>> default info"
>>   leftX := f xTable at: code + 1.
>>   leftX < 0 ifTrue: [
>>   ^ self questionGlyphInfoInto: glyphInfoArray.
>>   ].
>> +
>> + "finally, we have an ok font and character to return glyph info about"
>>   glyphInfoArray at: 1 put: f glyphs;
>>   at: 2 put: leftX;
>>   at: 3 put: (f xTable at: code + 2);
>>   at: 4 put: (f ascentOf: aCharacter);
>>   at: 5 put: self.
>>   ^ glyphInfoArray.
>>   !
>>
>> Item was changed:
>>   ----- Method: StrikeFontSet>>questionGlyphInfoInto: (in category
>> 'private') -----
>>   questionGlyphInfoInto: glyphInfoArray
>> + "return glyph info for the question mark character in the first font of
>> the fontArray -sort of a default set of info"
>> -
>>   | f ascii |
>>   f := fontArray at: 1.
>>   ascii := $? asciiValue.
>>   glyphInfoArray at: 1 put: f glyphs;
>>   at: 2 put: (f xTable at: ascii + 1);
>>   at: 3 put: (f xTable at: ascii + 2);
>>   at: 4 put: (self ascentOf: $?);
>>   at: 5 put: self.
>>   ^ glyphInfoArray.
>>   !
>>
>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Multilingual-tpr.167.mcz

Hannes Hirzel
I think it would be good if somebody can check what Pharo has as
additional comments in this area (I do not have a Pharo image ready at
the machine I am writing this email).

On 9/4/13, H. Hirzel <[hidden email]> wrote:

> In addition to these method comments fixed here
>
> StrikeFontSet>>characterToGlyphMap
> StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY:
> StrikeFontSet>>glyphInfoOf:into:
> StrikeFontSet>>questionGlyphInfoInto:
>
>
> With http://source.squeak.org/trunk/TrueType-tpr.26.mcz
>
> comments added to
>
> TTCFontSet>>questionGlyphInfoInto:
> TTCFontSet>>glyphInfoOf:into:
> TTCFont>>glyphInfoOf:into:
> MultiTTCFont>>glyphInfoOf:into:
>
>
> With http://source.squeak.org/trunk/Graphics-tpr.222.mcz
> comments added to
>
> FixedFaceFont>>glyphInfoOf:into:
> StrikeFont>>displayMultiString:on:from:to:at:kern:baselineY:
> StrikeFont>>glyphInfoOf:into:
>
>
> On 9/4/13, H. Hirzel <[hidden email]> wrote:
>> Great to have these additional comments on the methods
>>
>> StrikeFontSet>>characterToGlyphMap
>> StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY:
>> StrikeFontSet>>glyphInfoOf:into:
>> StrikeFontSet>>questionGlyphInfoInto:
>>
>> --Hannes
>>
>> On Wed, 4 Sep 2013 00:02:21.542 0000, [hidden email]
>> <[hidden email]> wrote:
>>> tim Rowledge uploaded a new version of Multilingual to project The
>>> Trunk:
>>> http://source.squeak.org/trunk/Multilingual-tpr.167.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: Multilingual-tpr.167
>>> Author: tpr
>>> Time: 3 September 2013, 5:02:14.904 pm
>>> UUID: 370d09db-992b-4348-9062-79cfaacf0e5e
>>> Ancestors: Multilingual-fbs.166
>>>
>>> Provide a sensible implementation of #characterToGlyphMap to allow the
>>> intended primitive to do what it primitively does.
>>> Add some comments to a few important methods to, y'know, actually help
>>> readers understand WTF is going on.
>>> Part of fixing Mantis-01781 7 years after it was reported.
>>>
>>> =============== Diff against Multilingual-fbs.166 ===============
>>>
>>> Item was added:
>>> + ----- Method: StrikeFontSet>>characterToGlyphMap (in category
>>> 'accessing')
>>> -----
>>> + characterToGlyphMap
>>> + "return the mapping for my first font; this follows the general form
>>> of
>>> all the other accessing methods but since we can't specifically find a
>>> font
>>> for a particualr character her we devolve to the first font in the
>>> fontArray
>>> - just like the other non-character-specific messages (#ascent etc).
>>> + This is only sent by the BitBlt>primDisplayString:from:to:map:xTable:
>>> method (other than internally by StrikeFont)"
>>> + ^fontArray first characterToGlyphMap!
>>>
>>> Item was changed:
>>>   ----- Method:
>>> StrikeFontSet>>displayMultiString:on:from:to:at:kern:baselineY: (in
>>> category
>>> 'displaying') -----
>>>   displayMultiString: aString on: aBitBlt from: startIndex to: stopIndex
>>> at:
>>> aPoint kern: kernDelta baselineY: baselineY
>>> + "display a multi-byte characterset string; each character may require
>>> swapping to a new strikefont as discovered by glyphInfoOf:"
>>> -
>>>   | destPoint leftX rightX glyphInfo g destY |
>>>   destPoint := aPoint.
>>>   glyphInfo := Array new: 5.
>>>   startIndex to: stopIndex do: [:charIndex |
>>>   self glyphInfoOf: (aString at: charIndex) into: glyphInfo.
>>>   g := glyphInfo at:1.
>>>   leftX := glyphInfo at:2.
>>>   rightX := glyphInfo at:3.
>>>   ((glyphInfo at:5) ~= aBitBlt lastFont) ifTrue: [
>>>   (glyphInfo at:5) installOn: aBitBlt.
>>>   ].
>>>   aBitBlt sourceForm: g.
>>>   destY := baselineY - (glyphInfo at:4).
>>>   aBitBlt destX: (destPoint x) destY: destY width: (rightX - leftX)
>>> height: (self height).
>>>   aBitBlt sourceOrigin: leftX @ 0.
>>>   aBitBlt copyBits.
>>>   destPoint := destPoint x + (rightX - leftX + kernDelta) @ destPoint
>>> y.
>>>   ].
>>>   ^ destPoint.!
>>>
>>> Item was changed:
>>>   ----- Method: StrikeFontSet>>glyphInfoOf:into: (in category 'private')
>>> -----
>>>   glyphInfoOf: aCharacter into: glyphInfoArray
>>> + "return glyph info for the character; it can get complicated."
>>> -
>>>   | index f code leftX |
>>> + "the leadingChar gives us an encoding. if that is outside the range
>>> of
>>> fonts in my fontArray, just return the default glyphInfo for a
>>> question-mark"
>>>   index := aCharacter leadingChar + 1.
>>>   fontArray size < index ifTrue: [^ self questionGlyphInfoInto:
>>> glyphInfoArray].
>>>   (f := fontArray at: index) ifNil: [^ self questionGlyphInfoInto:
>>> glyphInfoArray].
>>>
>>> + "if the actual character is not in the range supported by the chosen
>>> font, return that default question-mark info "
>>>   code := aCharacter charCode.
>>>   ((code between: f minAscii and: f maxAscii) not) ifTrue: [
>>>   ^ self questionGlyphInfoInto: glyphInfoArray.
>>>   ].
>>> +
>>> + "if the xTable doesn't like the character, return that question-mark
>>> default info"
>>>   leftX := f xTable at: code + 1.
>>>   leftX < 0 ifTrue: [
>>>   ^ self questionGlyphInfoInto: glyphInfoArray.
>>>   ].
>>> +
>>> + "finally, we have an ok font and character to return glyph info
>>> about"
>>>   glyphInfoArray at: 1 put: f glyphs;
>>>   at: 2 put: leftX;
>>>   at: 3 put: (f xTable at: code + 2);
>>>   at: 4 put: (f ascentOf: aCharacter);
>>>   at: 5 put: self.
>>>   ^ glyphInfoArray.
>>>   !
>>>
>>> Item was changed:
>>>   ----- Method: StrikeFontSet>>questionGlyphInfoInto: (in category
>>> 'private') -----
>>>   questionGlyphInfoInto: glyphInfoArray
>>> + "return glyph info for the question mark character in the first font
>>> of
>>> the fontArray -sort of a default set of info"
>>> -
>>>   | f ascii |
>>>   f := fontArray at: 1.
>>>   ascii := $? asciiValue.
>>>   glyphInfoArray at: 1 put: f glyphs;
>>>   at: 2 put: (f xTable at: ascii + 1);
>>>   at: 3 put: (f xTable at: ascii + 2);
>>>   at: 4 put: (self ascentOf: $?);
>>>   at: 5 put: self.
>>>   ^ glyphInfoArray.
>>>   !
>>>
>>>
>>>
>>
>