[squeak-dev] Graphical oddities across image save (squeak 5.1)

Bob Arning arning315 at comcast.net
Sat Oct 7 12:15:34 UTC 2017


A bit more on what's happening

If the font used (the default font in the example below) is a 
StrikeFont, then this

f1 _ Form extent: 100 at 100 depth: 32.
f1 fillColor: Color green.
Form allInstancesDo: [ :f | f hibernate].
f1 getCanvas drawString: 'Black on green' in: (0 at 0 extent: 100 at 100) 
font: nil color: Color black.
f1 asMorph openInWorld.

draws black text on a white rectangle on a larger green rectangle. 
StrikeFonts are drawn (in depth 32, anyway) by a primitive using rule 
34. If the primitive fails, then #copyBits is used character by character.

primDisplayString: aString from: startIndex to: stopIndex map: glyphMap 
xTable: xTable kern: kernDelta
     | ascii |
     <primitive:'primitiveDisplayString' module:'BitBltPlugin'>
     startIndex to: stopIndex do:[:charIndex|
         ascii := (aString at: charIndex) asciiValue.
         glyphMap ifNotNil:[ascii := glyphMap at: ascii+1].
         sourceX := xTable at: ascii + 1.
         width := (xTable at: ascii + 2) - sourceX.
         self copyBits.
         destX := destX + width + kernDelta.
     ].

It seems like rule 34 is handled differently by primitiveDisplayString 
and primitiveCopyBits. If I add code as exists elsewhere to unhibernate 
forms and retry, all is working as expected:

primDisplayString: aString from: startIndex to: stopIndex map: glyphMap 
xTable: xTable kern: kernDelta
     | ascii |
     <primitive:'primitiveDisplayString' module:'BitBltPlugin'>
     (sourceForm isForm and: [sourceForm unhibernate]) ifTrue: [
         ^self primDisplayString: aString from: startIndex to: stopIndex 
map: glyphMap xTable: xTable kern: kernDelta
     ].
     (destForm isForm and: [destForm unhibernate]) ifTrue: [
         ^self primDisplayString: aString from: startIndex to: stopIndex 
map: glyphMap xTable: xTable kern: kernDelta
     ].
     (halftoneForm isForm and: [halftoneForm unhibernate]) ifTrue: [
         ^self primDisplayString: aString from: startIndex to: stopIndex 
map: glyphMap xTable: xTable kern: kernDelta
     ].
     startIndex to: stopIndex do:[:charIndex|
         ascii := (aString at: charIndex) asciiValue.
         glyphMap ifNotNil:[ascii := glyphMap at: ascii+1].
         sourceX := xTable at: ascii + 1.
         width := (xTable at: ascii + 2) - sourceX.
         self copyBits.
         destX := destX + width + kernDelta.
     ].

On 10/6/17 10:59 PM, Bob Arning wrote:
>
> Here is a strange one. I noticed a few morphs changing appearance 
> after saving the image. It seems to be related to the hibernation of 
> Forms which happens prior to saving the image. This snippet
>
> (m := SimpleButtonMorph new)
>     label: 'Black on yellow';
>     color: Color yellow.
> Form allInstancesDo: [ :f | f hibernate].    "this happens when saving 
> image"
> m imageForm asMorph openInWorld
>
> has a white background for the text with a bit of yellow surrounding 
> it. Running it in a clean 5.1 image gets the expected result: black 
> text on a yellow background. However, if I load the preferences from 
> my current image into the clean image, then the problem occurs: black 
> on white on yellow. My prefs are attached if you would like to take a 
> stab at it (and if it isn't too large an attachment).
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20171007/e03d83a2/attachment.html>


More information about the Squeak-dev mailing list