[squeak-dev] The Trunk: Graphics-nice.236.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Sun Sep 29 01:51:57 UTC 2013


NOTE: I could have added baselineY: baselineY parameter to font
displayString:... like it is in MultiDispalyScanner
BUT: there is currently a workaround in StrikeFont which is found only in
the version without baselineY:
All this stuff is really getting funny...


2013/9/29 <commits at source.squeak.org>

> Nicolas Cellier uploaded a new version of Graphics to project The Trunk:
> http://source.squeak.org/trunk/Graphics-nice.236.mcz
>
> ==================== Summary ====================
>
> Name: Graphics-nice.236
> Author: nice
> Time: 29 September 2013, 3:37:33.253 am
> UUID: 38c2e6a3-d9fa-4a5b-b5e1-91a85e4afae6
> Ancestors: Graphics-nice.235
>
> Don't setStopConditions twice in CharacterBlockScanner and DisplayScanner
> in MVC compatibility methods.
> SharedPools are inherited in Squeak, so don't declare TextConstants in
> CompositionScanner.
>
> =============== Diff against Graphics-nice.235 ===============
>
> Item was changed:
>   ----- Method: CharacterBlockScanner>>buildCharacterBlockIn: (in category
> 'private') -----
>   buildCharacterBlockIn: para
> +       "This method is used by the MVC version only."
> +
> +       | lineIndex runLength lineStop stopCondition |
> -       | lineIndex runLength lineStop done stopCondition |
>         "handle nullText"
>         (para numberOfLines = 0 or: [text size = 0])
>                 ifTrue: [^ CharacterBlock new stringIndex: 1  "like being
> off end of string"
>                                         text: para text
>                                         topLeft: (para
> leftMarginForDisplayForLine: 1 alignment: (alignment ifNil:[textStyle
> alignment]))
>                                                                 @ para
> compositionRectangle top
>                                         extent: 0 @ textStyle lineGrid].
>         "find the line"
>         lineIndex := para lineIndexOfTop: characterPoint y.
>         destY := para topAtLineIndex: lineIndex.
>         line := para lines at: lineIndex.
>         lastIndex := line first.
> -
>         rightMargin := para rightMarginForDisplay.
> +       self setStopConditions.  " also loads the font, alignment and all
> emphasis attributes "
> -      self setStopConditions.  " also loads the font and loads all
> emphasis attributes "
>
> -
>         (lineIndex = para numberOfLines and:
>                 [(destY + line lineHeight) < characterPoint y])
>                         ifTrue: ["if beyond lastLine, force search to last
> character"
>                                         self characterPointSetX:
> rightMargin]
>                         ifFalse:        [characterPoint y < (para
> compositionRectangle) top
>                                                 ifTrue: ["force search to
> first line"
>
> characterPoint := (para compositionRectangle) topLeft].
>                                         characterPoint x > rightMargin
>                                                 ifTrue: [self
> characterPointSetX: rightMargin]].
> +       destX := leftMargin := para leftMarginForDisplayForLine: lineIndex
> alignment: alignment.
> +       nextLeftMargin:= para leftMarginForDisplayForLine: lineIndex+1
> alignment: alignment.
> +       runLength := text runLengthFor: line first.
> +       lineStop := characterIndex      "scanning for index"
> +               ifNil: [ line last ].                   "scanning for
> point"
> +       runStopIndex := lastIndex + (runLength - 1) min: lineStop.
> -       destX := (leftMargin := para leftMarginForDisplayForLine:
> lineIndex alignment: (alignment ifNil:[textStyle alignment])).
> -       nextLeftMargin:= para leftMarginForDisplayForLine: lineIndex+1
> alignment: (alignment ifNil:[textStyle alignment]).
> -       lastIndex := line first.
> -
> -       self setStopConditions.         "also sets font"
> -       runLength := (text runLengthFor: line first).
> -       characterIndex == nil
> -               ifTrue: [lineStop := line last  "characterBlockAtPoint"]
> -               ifFalse:        [lineStop := characterIndex
>  "characterBlockForIndex"].
> -       (runStopIndex := lastIndex + (runLength - 1)) > lineStop
> -               ifTrue: [runStopIndex := lineStop].
>         lastCharacterExtent := 0 @ line lineHeight.
> +       spaceCount := 0.
> -       spaceCount := 0. done  := false.
>         self handleIndentation.
>
> -       [done]
> -       whileFalse:
>         [stopCondition := self scanCharactersFrom: lastIndex to:
> runStopIndex
>                         in: text string rightX: characterPoint x
>                         stopConditions: stopConditions kern: kern.
> +       "see setStopConditions for stopping conditions for character block
> operations."
> -
> -       "see setStopConditions for stopping conditions for character block
>      operations."
>         self lastCharacterExtentSetX: (font widthOf: (text at: lastIndex)).
> +       self perform: stopCondition] whileFalse.
> +
> +       ^characterIndex == nil
> -       (self perform: stopCondition) ifTrue:
> -               [characterIndex == nil
>                         ifTrue: ["characterBlockAtPoint"
>                                         ^ CharacterBlock new stringIndex:
> lastIndex text: text
>                                                 topLeft: characterPoint +
> (font descentKern @ 0)
>                                                 extent:
> lastCharacterExtent]
>                         ifFalse: ["characterBlockForIndex"
>                                         ^ CharacterBlock new stringIndex:
> lastIndex text: text
>                                                 topLeft: characterPoint +
> ((font descentKern) - kern @ 0)
> +                                               extent:
> lastCharacterExtent]!
> -                                               extent:
> lastCharacterExtent]]]!
>
> Item was changed:
>   CharacterScanner subclass: #CompositionScanner
>         instanceVariableNames: 'spaceX spaceIndex lineHeight baseline
> lineHeightAtSpace baselineAtSpace'
>         classVariableNames: ''
> +       poolDictionaries: ''
> -       poolDictionaries: 'TextConstants'
>         category: 'Graphics-Text'!
>
>   !CompositionScanner commentStamp: '<historical>' prior: 0!
>   CompositionScanners are used to measure text and determine where line
> breaks and space padding should occur.!
>
> Item was changed:
>   ----- Method: DisplayScanner>>displayLines:in:clippedBy: (in category
> 'MVC-compatibility') -----
>   displayLines: linesInterval in: aParagraph clippedBy: visibleRectangle
>         "The central display routine. The call on the primitive
>         (scanCharactersFrom:to:in:rightX:) will be interrupted according
> to an
>         array of stop conditions passed to the scanner at which time the
> code to
>         handle the stop condition is run and the call on the primitive
> continued
>         until a stop condition returns true (which means the line has
>         terminated)."
>         | leftInRun |
>         "leftInRun is the # of characters left to scan in the current run;
>                 when 0, it is time to call 'self setStopConditions'"
>         morphicOffset := 0 at 0.
>         leftInRun := 0.
>         self initializeFromParagraph: aParagraph clippedBy:
> visibleRectangle.
>         ignoreColorChanges := false.
>         foregroundColor := paragraphColor := aParagraph foregroundColor.
>         backgroundColor := aParagraph backgroundColor.
>         aParagraph backgroundColor isTransparent
>                 ifTrue: [fillBlt := nil]
>                 ifFalse: [fillBlt := bitBlt copy.  "Blt to fill spaces,
> tabs, margins"
>                                 fillBlt sourceForm: nil; sourceOrigin: 0 at 0.
>                                 fillBlt fillColor: aParagraph
> backgroundColor].
>         rightMargin := aParagraph rightMarginForDisplay.
>         lineY := aParagraph topAtLineIndex: linesInterval first.
>         bitBlt destForm deferUpdatesIn: visibleRectangle while: [
>                 linesInterval do:
>                         [:lineIndex |
> +                       | string startIndex lastPos runLength
> stopCondition baselineY |
> -                       | string startIndex lastPos runLength
> stopCondition |
>                         line := aParagraph lines at: lineIndex.
>                         lastIndex := line first.
> +                       leftInRun <= 0
> +                               ifTrue: [self setStopConditions.  "also
> sets the font, alignment and emphasisCode"
> +                                               leftInRun := text
> runLengthFor: line first].
> +                       leftMargin := aParagraph
> leftMarginForDisplayForLine: lineIndex alignment: alignment.
> +                       destX := runX := leftMargin.
> -                self setStopConditions. " causes an assignment to inst
> var.  alignment "
> -
> -                       leftMargin := aParagraph
> leftMarginForDisplayForLine: lineIndex alignment: (alignment
> ifNil:[textStyle alignment]).
> -                       destX := (runX := leftMargin).
> -                       line := aParagraph lines at: lineIndex.
>                         lineHeight := line lineHeight.
>                         fillBlt == nil ifFalse:
>                                 [fillBlt destX: visibleRectangle left
> destY: lineY
>                                         width: visibleRectangle width
> height: lineHeight; copyBits].
> +                       baselineY := lineY + line baseline.
> +                       destY := baselineY - font ascent.  "Should have
> happened in setFont"
> -                       lastIndex := line first.
> -                       leftInRun <= 0
> -                               ifTrue: [self setStopConditions.  "also
> sets the font"
> -                                               leftInRun := text
> runLengthFor: line first].
> -                       destY := lineY + line baseline - font ascent.
>  "Should have happened in setFont"
>                         runLength := leftInRun.
>                         runStopIndex := lastIndex + (runLength - 1) min:
> line last.
>                         leftInRun := leftInRun - (runStopIndex - lastIndex
> + 1).
>                         spaceCount := 0.
>                         string := text string.
>                         self handleIndentation.
>                         [
>                                 startIndex := lastIndex.
>                                 lastPos := destX at destY.
>                                 stopCondition := self scanCharactersFrom:
> lastIndex to: runStopIndex
>                                                         in: string rightX:
> rightMargin stopConditions: stopConditions
>                                                         kern: kern.
>                                 lastIndex >= startIndex ifTrue:[
>                                         font displayString: string on:
> bitBlt
>                                                 from: startIndex to:
> lastIndex at: lastPos kern: kern].
>                                 "see setStopConditions for stopping
> conditions for displaying."
>                                 self perform: stopCondition
>                         ] whileFalse.
>                         fillBlt == nil ifFalse:
>                                 [fillBlt destX: destX destY: lineY width:
> visibleRectangle right-destX height: lineHeight; copyBits].
>                         lineY := lineY + lineHeight]]!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20130929/b965c0b5/attachment.htm


More information about the Squeak-dev mailing list