[ENH] Displaying undefined glyphs ([closed] on Mantis 1062)
Larry Trutter
ltrutter at onemain.com
Tue Apr 12 03:30:22 UTC 2005
Larry Trutter wrote:
> Thank you for your report. I have transferred your report to Squeak's
> Mantis Database and you can followup on the issue if desired by going to
> http://bugs.impara.de/view.php?id=1062.
>
> In the future please report new issues on Squeak's Mantis Database at
> http://bugs.impara.de/ .
>
> Thanks!
>
>
> Andreas Raab wrote:
>
>> Folks -
>>
>> It has annoyed me for a long time that MultiCharacters are often only
>> displayed as question marks which makes it very simple to confuse
>> them with a real question mark. The attached changes fix this so that
>> e.g., "Character value: 500" is printed as \u1F4. The attached images
>> illustrate the difference. How the undefined character is displayed
>> can be changed in Character>>asUndefinedGlyph (so if you prefer to
>> prefer <Character value: 500> instead you are free to do this ;-)
>>
>> Cheers,
>> - Andreas
>>
>> ------------------------------------------------------------------------
>>
>> 'From Squeak3.8gamma of ''24 November 2004'' [latest update: #6643]
>> on 10 April 2005 at 3:34:54 am'!
>> "Change Set: DisplayUndefined
>> Date: 10 April 2005
>> Author: Andreas Raab
>>
>> Change the display of undefined characters from a question mark to a
>> \uXYZ format. E.g., instead of
>>
>> Character value: 500 -> $?
>> Character value: 500 -> $\u1F4
>> "!
>>
>>
>> !AbstractFont methodsFor: 'measuring' stamp: 'ar 4/10/2005 03:14'!
>> widthOf: aCharacter "Answer the width of the argument as a
>> character in the receiver."
>> ^self widthOf: aCharacter ifAbsent:[self widthOfString:
>> aCharacter asUndefinedGlyph].! !
>>
>> !AbstractFont methodsFor: 'measuring' stamp: 'ar 4/10/2005 03:02'!
>> widthOf: aCharacter ifAbsent: aBlock
>> "Return the width of the given character if defined in the font.
>> If absent evaluate aBlock."
>> ^self subclassResponsibility! !
>>
>>
>> !Character methodsFor: 'printing' stamp: 'ar 4/10/2005 03:00'!
>> asUndefinedGlyph
>> ^'\u', (value printStringBase: 16)! !
>>
>>
>> !FixedFaceFont methodsFor: 'measuring' stamp: 'ar 4/10/2005 03:03'!
>> widthOf: aCharacter ifAbsent: aBlock
>> "Characters are always defined in a fixed face font"
>> ^ baseFont widthOf: substitutionCharacter! !
>>
>>
>> !StrikeFont methodsFor: 'accessing' stamp: 'ar 4/10/2005 03:04'!
>> widthOf: aCharacter ifAbsent: aBlock
>> "Characters are always defined in a fixed face font"
>> | code |
>> code := aCharacter class == Character
>> ifTrue: [aCharacter asciiValue]
>> ifFalse: [aCharacter charCode].
>> ((code < minAscii or: [maxAscii < code]) or: [(xTable at: code +
>> 1) < 0])
>> ifTrue: [^aBlock value].
>> ^(xTable at: code + 2) - (xTable at: code + 1)! !
>>
>> !StrikeFont methodsFor: 'displaying' stamp: 'ar 4/10/2005 03:20'!
>> displayMultiString: aString on: aBitBlt from: startIndex to:
>> stopIndex at: aPoint kern: kernDelta baselineY: baselineY
>>
>> | destPoint leftX rightX glyphInfo char destY str |
>> destPoint _ aPoint.
>> charIndex _ startIndex.
>> glyphInfo _ Array new: 5.
>> [charIndex <= stopIndex] whileTrue: [
>> char _ aString at: charIndex.
>> (self hasGlyphOf: char) not ifTrue: [
>> str := char asUndefinedGlyph.
>> destPoint := self displayString: str on: aBitBlt from: 1
>> to: str size at: destPoint kern: kernDelta baselineY: baselineY.
>> charIndex _ charIndex + 1.
>> ] ifFalse: [
>> self glyphInfoOf: char into: glyphInfo.
>> leftX _ glyphInfo second.
>> rightX _ glyphInfo third.
>> (glyphInfo fifth ~= aBitBlt lastFont) ifTrue: [
>> glyphInfo fifth installOn: aBitBlt.
>> ].
>> aBitBlt sourceForm: glyphInfo first.
>> destY _ baselineY - glyphInfo fourth. aBitBlt
>> destX: destPoint x.
>> aBitBlt destY: destY.
>> aBitBlt sourceOrigin: leftX @ 0.
>> aBitBlt width: rightX - leftX.
>> aBitBlt height: self height.
>> aBitBlt copyBits.
>> destPoint _ destPoint + (rightX - leftX + kernDelta @ 0).
>> charIndex _ charIndex + 1.
>> ].
>> ].
>> ^destPoint.
>> ! !
>>
>>
>> !StrikeFontSet methodsFor: 'accessing' stamp: 'ar 4/10/2005 03:09'!
>> widthOf: aCharacter ifAbsent: aBlock
>> "Answer the width of the argument as a character in the receiver."
>> "1: optimizing"
>> | encoding f |
>> aCharacter class == Character
>> ifTrue: [^ (fontArray at: 1) widthOf: aCharacter].
>> "2: other case"
>> encoding := aCharacter leadingChar + 1.
>> f := ((((aCharacter isMemberOf: Character) not
>> and: [encoding > 1])
>> and: [encoding <= fontArray size])
>> and: [(fontArray at: encoding) notNil])
>> ifTrue: [fontArray at: encoding]
>> ifFalse: [^aBlock value].
>> ^ f widthOf: aCharacter ifAbsent: aBlock! !
>>
>> !StrikeFontSet methodsFor: 'displaying' stamp: 'ar 4/10/2005 03:27'!
>> displayString: aString on: aBitBlt from: startIndex to: stopIndex at:
>> aPoint kern: kernDelta baselineY: baselineY
>>
>> | destPoint leftX rightX glyphInfo g destY ch str |
>> destPoint _ aPoint.
>> glyphInfo _ Array new: 5.
>> startIndex to: stopIndex do: [:charIndex |
>> ch _ aString at: charIndex.
>> (self hasGlyphOf: ch) ifTrue:[
>> self glyphInfoOf: ch into: glyphInfo.
>> g _ glyphInfo first.
>> leftX _ glyphInfo second.
>> rightX _ glyphInfo third.
>> (glyphInfo fifth ~= aBitBlt lastFont) ifTrue: [
>> glyphInfo fifth installOn: aBitBlt.
>> ].
>> aBitBlt sourceForm: g.
>> destY _ baselineY - glyphInfo fourth. aBitBlt
>> destX: destPoint x.
>> aBitBlt destY: destY.
>> aBitBlt sourceOrigin: leftX @ 0.
>> aBitBlt width: rightX - leftX.
>> aBitBlt height: self height.
>> aBitBlt copyBits.
>> destPoint _ destPoint + (rightX - leftX + kernDelta @ 0).
>> ] ifFalse:[
>> str _ ch asUndefinedGlyph.
>> destPoint _ self displayString: str on: aBitBlt from: 1
>> to: str size at: destPoint kern: kernDelta baselineY: baselineY.
>> ].
>> ].
>> ^ destPoint.
>>
>> ! !
>>
>> !StrikeFontSet methodsFor: 'private' stamp: 'ar 4/10/2005 03:26'!
>> hasGlyphOf: aCharacter
>>
>> | index f code leftX |
>> index _ aCharacter leadingChar + 1.
>> fontArray size < index ifTrue: [^false].
>> (f _ fontArray at: index) ifNil: [^false].
>>
>> code _ aCharacter charCode.
>> ((code between: f minAscii and: f maxAscii) not) ifTrue: [^false].
>> leftX _ f xTable at: code + 1.
>> leftX < 0 ifTrue: [^ false].
>> ^true! !
>>
>>
>> !TTCFont methodsFor: 'friend' stamp: 'ar 4/10/2005 03:28'!
>> displayString: aString on: aBitBlt from: startIndex to: stopIndex at:
>> aPoint kern: kernDelta baselineY: baselineY
>>
>> | destPoint form glyphInfo destY ch str |
>> destPoint _ aPoint.
>> glyphInfo _ Array new: 5.
>> startIndex to: stopIndex do: [:charIndex |
>> ch _ aString at: charIndex.
>> (self hasGlyphOf: ch) ifTrue:[
>> self glyphInfoOf: ch into: glyphInfo.
>> form _ glyphInfo first.
>> (glyphInfo fifth ~= aBitBlt lastFont) ifTrue: [
>> glyphInfo fifth installOn: aBitBlt.
>> ].
>> destY _ baselineY - glyphInfo fourth. aBitBlt
>> sourceForm: form.
>> aBitBlt destX: destPoint x.
>> aBitBlt destY: destY.
>> aBitBlt sourceOrigin: (glyphInfo second) @ 0.
>> aBitBlt width: glyphInfo third - glyphInfo second.
>> aBitBlt height: form height.
>> aBitBlt copyBits.
>> destPoint _ destPoint + ((glyphInfo third - glyphInfo
>> second) + kernDelta @ 0).
>> ] ifFalse:[
>> str _ ch asUndefinedGlyph.
>> destPoint _ self displayString: str on: aBitBlt from: 1
>> to: str size at: destPoint kern: kernDelta baselineY: baselineY.
>> ].
>> ].
>> ^ destPoint.
>> ! !
>>
>> !TTCFont methodsFor: 'public' stamp: 'ar 4/10/2005 03:11'!
>> widthOf: aCharacter ifAbsent: aBlock
>>
>> "This method cannot use #formOf: because formOf: discriminates
>> the color and causes unnecessary bitmap creation."
>>
>> | f assoc |
>> aCharacter charCode > 255 ifTrue: [^aBlock value].
>> assoc _ self cache at: (aCharacter charCode + 1).
>> assoc ifNotNil: [
>> ^ assoc value width
>> ].
>>
>> f _ self computeForm: aCharacter.
>> self at: aCharacter charCode put: f.
>> ^ f width.
>> ! !
>>
>>
>> !MultiTTCFont methodsFor: 'as yet unclassified' stamp: 'ar 4/10/2005
>> 03:13'!
>> widthOf: aCharacter ifAbsent: aBlock
>> "ar 4/10/2005: This is odd - it looks like this assumes that all
>> MultiTTCFonts define glyphs for all characters (which is rather
>> unlikely...)"
>> "This method cannot use #formOf: because formOf: discriminates
>> the color and causes unnecessary bitmap creation."
>>
>> | newForm |
>> self hasCached: aCharacter ifTrue: [:form :index |
>> self access: aCharacter at: index.
>> ^ form width.
>> ].
>>
>> newForm _ self computeForm: aCharacter.
>> self at: aCharacter put: newForm.
>> ^ newForm width.
>>
>> ! !
>>
>>
>> !TTCFontSet methodsFor: 'as yet unclassified' stamp: 'ar 4/10/2005
>> 03:30'!
>> displayString: aString on: aBitBlt from: startIndex to: stopIndex at:
>> aPoint kern: kernDelta baselineY: baselineY
>>
>> | destPoint font form encoding glyphInfo char charCode destY str |
>> destPoint _ aPoint.
>> glyphInfo _ Array new: 5.
>> startIndex to: stopIndex do: [:charIndex |
>> char _ aString at: charIndex.
>> encoding _ char leadingChar + 1.
>> charCode _ char charCode.
>> font _ fontArray at: encoding.
>> ((charCode between: font minAscii and: font maxAscii) not)
>> ifTrue: [charCode _ nil].
>> charCode ifNil:[
>> str _ char asUndefinedGlyph.
>> destPoint _ self displayString: str on: aBitBlt from: 1
>> to: str size at: destPoint kern: kernDelta baselineY: baselineY.
>> ] ifNotNil:[
>> self glyphInfoOf: char into: glyphInfo.
>> form _ glyphInfo first.
>> (glyphInfo fifth ~= aBitBlt lastFont) ifTrue: [
>> glyphInfo fifth installOn: aBitBlt.
>> ].
>> destY _ baselineY - glyphInfo fourth. aBitBlt
>> sourceForm: form.
>> aBitBlt destX: destPoint x.
>> aBitBlt destY: destY.
>> aBitBlt sourceOrigin: 0 @ 0.
>> aBitBlt width: form width.
>> aBitBlt height: form height.
>> aBitBlt copyBits.
>> destPoint _ destPoint + (form width + kernDelta @ 0).
>> ].
>> ].
>> ^ destPoint.
>> ! !
>>
>> !TTCFontSet methodsFor: 'as yet unclassified' stamp: 'ar 4/10/2005
>> 03:14'!
>> widthOf: aCharacter ifAbsent: aBlock
>>
>> | encoding |
>> encoding _ aCharacter leadingChar.
>> ^ (fontArray at: encoding + 1) widthOf: aCharacter ifAbsent:
>> aBlock! !
>>
>> TTCFontSet removeSelector: #widthOf:!
>> MultiTTCFont removeSelector: #widthOf:!
>> TTCFont removeSelector: #widthOf:!
>> StrikeFontSet removeSelector: #widthOf:!
>> StrikeFont removeSelector: #widthOf:!
>> FixedFaceFont removeSelector: #widthOf:!
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>> ------------------------------------------------------------------------
>>
>> ------------------------------------------------------------------------
>>
>>
>>
>>
>
>
>
More information about the Squeak-dev
mailing list
|