[squeak-dev] The Trunk: Multilingual-nice.179.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Fri Sep 27 20:54:22 UTC 2013
...were computed,...
The last two different inst. vars. are:
1) firstDestX seems to be used when a single Character of embedded Morph
does not fit in composition width.
2) lastWidth used only in Combining pre-composed unicode
IMO, we should totally rewrite the combining stuff. We could then remove
lastWidth...
2013/9/27 <commits at source.squeak.org>
> Nicolas Cellier uploaded a new version of Multilingual to project The
> Trunk:
> http://source.squeak.org/trunk/Multilingual-nice.179.mcz
>
> ==================== Summary ====================
>
> Name: Multilingual-nice.179
> Author: nice
> Time: 27 September 2013, 10:50:01.56 pm
> UUID: db50e584-fe6f-4a0c-b200-72b2e6074e5c
> Ancestors: Multilingual-nice.178
>
> Remove usage of baselineY inst. var. (I did not removed the inst var yet).
> The inst var. where always computed where used, so it can become temp.
> This makes one difference less with CharacterScanner hierarchy.
>
> =============== Diff against Multilingual-nice.178 ===============
>
> Item was changed:
> ----- Method: MultiCanvasCharacterScanner>>setFont (in category
> 'private') -----
> setFont
> + | baselineY |
> foregroundColor ifNil: [foregroundColor := Color black].
> super setFont.
> baselineY := lineY + line baseline.
> destY := baselineY - font ascent.!
>
> Item was changed:
> ----- Method: MultiCharacterBlockScanner>>cr (in category 'stop
> conditions') -----
> cr
> "Answer a CharacterBlock that specifies the current location of
> the mouse
> relative to a carriage return stop condition that has just been
> encountered. The ParagraphEditor convention is to denote
> selections by
> CharacterBlocks, sometimes including the carriage return (cursor
> is at
> the end) and sometimes not (cursor is in the middle of the text)."
>
> ((characterIndex ~= nil
> and: [characterIndex > text size])
> or: [(line last = text size)
> and: [(destY + line lineHeight) <
> characterPoint y]])
> ifTrue: ["When off end of string, give data for next
> character"
> destY := destY + line lineHeight.
> - baselineY := line lineHeight.
> lastCharacter := nil.
> characterPoint := (nextLeftMargin ifNil:
> [leftMargin]) @ destY.
> (lastIndex < text size and: [(text at:
> lastIndex) = CR and: [(text at: lastIndex+1) = Character lf]])
> ifTrue: [lastIndex := lastIndex +
> 2]
> ifFalse: [lastIndex := lastIndex +
> 1].
> self lastCharacterExtentSetX: 0.
> ^ true].
> lastCharacter := CR.
> characterPoint := destX @ destY.
> self lastCharacterExtentSetX: rightMargin - destX.
> ^true!
>
> Item was changed:
> ----- Method: MultiCharacterScanner>>measureString:inFont:from:to: (in
> category 'scanning') -----
> measureString: aString inFont: aFont from: startIndex to: stopIndex
> "WARNING: In order to use this method the receiver has to be set
> up using #initializeStringMeasurer"
> destX := destY := lastIndex := 0.
> - baselineY := aFont ascent.
> font := aFont.
> pendingKernX := 0.
> kern := 0 - font baseKern.
> spaceWidth := font widthOf: Space.
>
> self scanCharactersFrom: startIndex to: stopIndex in: aString
> rightX: 999999 stopConditions: stopConditions kern: kern.
> ^destX!
>
> Item was changed:
> ----- Method: MultiDisplayScanner>>displayLine:offset:leftInRun: (in
> category 'scanning') -----
> displayLine: textLine offset: offset leftInRun: leftInRun
> "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 is the # of characters left to
> scan in the current run; when 0, it is time to call setStopConditions."
> + | stopCondition nowLeftInRun startIndex string lastPos baselineY |
> - | stopCondition nowLeftInRun startIndex string lastPos |
> line := textLine.
> morphicOffset := offset.
> lineY := line top + offset y.
> lineHeight := line lineHeight.
> rightMargin := line rightMargin + offset x.
> lastIndex := line first.
> leftInRun <= 0 ifTrue: [self setStopConditions].
> leftMargin := (line leftMarginForAlignment: alignment) + offset x.
> destX := runX := leftMargin.
> fillBlt == nil ifFalse:
> ["Not right"
> fillBlt destX: line left destY: lineY
> width: line width left height: lineHeight;
> copyBits].
> lastIndex := line first.
> leftInRun <= 0
> ifTrue: [nowLeftInRun := text runLengthFor: lastIndex]
> ifFalse: [nowLeftInRun := leftInRun].
> baselineY := lineY + line baseline.
> destY := baselineY - font ascent.
> runStopIndex := lastIndex + (nowLeftInRun - 1) min: line last.
> spaceCount := 0.
> string := text string.
> [
> startIndex := lastIndex.
> lastPos := destX at destY.
> stopCondition := self scanCharactersFrom: lastIndex to:
> runStopIndex
> in: string rightX:
> rightMargin stopConditions: stopConditions
> kern: kern.
> lastIndex >= startIndex ifTrue:[
> bitBlt displayString: string
> from: startIndex
> "XXXX: The following is an interesting bug. All stopConditions
> exept #endOfRun
> have lastIndex past the last character displayed.
> #endOfRun sets it *on* the character.
> If we display up until lastIndex then we will also display
> invisible characters like
> CR and tab. This problem should be fixed in the scanner
> (i.e., position lastIndex
> consistently) but I don't want to deal with the fallout
> right now so we keep the
> fix minimally invasive."
> to: (stopCondition == #endOfRun
> ifTrue:[lastIndex] ifFalse:[lastIndex-1])
> at: lastPos kern: kern baselineY:
> baselineY font: font].
> (emphasisCode allMask: 4) ifTrue:[
> font displayUnderlineOn: bitBlt from: lastPos
> x at baselineY to: destX at baselineY.
> ].
> (emphasisCode allMask: 16) ifTrue:[
> font displayStrikeoutOn: bitBlt from: lastPos
> x at baselineY to: destX at baselineY.
> ].
> "see setStopConditions for stopping conditions for
> displaying."
> self perform: stopCondition.
> "or: [lastIndex > runStopIndex]."
> ] whileFalse.
> ^ runStopIndex - lastIndex "Number of characters remaining in
> the current run"!
>
> Item was changed:
> ----- Method: MultiDisplayScanner>>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 |
> + | runLength stopCondition startIndex string
> lastPos baselineY |
> - | runLength stopCondition startIndex string
> lastPos |
> 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].
> lastIndex := line first.
> leftInRun <= 0
> ifTrue: [self setStopConditions. "also
> sets the font"
> leftInRun := text
> runLengthFor: line first].
> baselineY := lineY + line baseline.
> destY := baselineY - 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 baselineY: baselineY].
> "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]]!
>
> Item was changed:
> ----- Method: MultiDisplayScanner>>placeEmbeddedObject: (in category
> 'scanning') -----
> placeEmbeddedObject: anchoredMorph
> anchoredMorph relativeTextAnchorPosition ifNotNil:[
> anchoredMorph position:
> anchoredMorph relativeTextAnchorPosition +
> (anchoredMorph owner textBounds origin x @ 0)
> - (0 at morphicOffset y) + (0 at lineY).
> ^true
> ].
> (super placeEmbeddedObject: anchoredMorph) ifFalse: [^ false].
> (anchoredMorph isMorph or: [anchoredMorph isPrimitiveCostume])
> ifTrue: [
> anchoredMorph position: ((destX - anchoredMorph
> width)@lineY) - morphicOffset
> + ] ifFalse: [| baselineY |
> - ] ifFalse: [
> destY := lineY.
> baselineY := lineY + anchoredMorph height..
> runX := destX.
> anchoredMorph
> displayOn: bitBlt destForm
> at: destX - anchoredMorph width @ destY
> clippingBox: bitBlt clipRect
> rule: Form blend
> fillColor: Color white
> ].
> ^ true!
>
> Item was changed:
> ----- Method: MultiDisplayScanner>>setFont (in category 'private') -----
> setFont
> foregroundColor := paragraphColor.
> super setFont. "Sets font and emphasis bits, and maybe
> foregroundColor"
> font installOn: bitBlt foregroundColor: foregroundColor
> backgroundColor: Color transparent.
> + text ifNotNil:[| baselineY |
> - text ifNotNil:[
> baselineY := lineY + line baseline.
> destY := baselineY - font ascent].
> !
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20130927/ec92b0d8/attachment.htm
More information about the Squeak-dev
mailing list
|