[Pkg] The Trunk: Graphics-nice.374.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Apr 26 21:03:57 UTC 2017
Nicolas Cellier uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-nice.374.mcz
==================== Summary ====================
Name: Graphics-nice.374
Author: nice
Time: 26 April 2017, 11:03:04.6544 pm
UUID: 7b1aeafa-4b31-4143-9add-cba95d9617f1
Ancestors: Graphics-ul.373
Classify a few 'as yet unclassified' methods
=============== Diff against Graphics-ul.373 ===============
Item was changed:
+ ----- Method: Color>>alpha (in category 'accessing') -----
- ----- Method: Color>>alpha (in category 'access') -----
alpha
"Return the opacity ('alpha') value of opaque so that normal colors can be compared to TransparentColors."
^ 1.0
!
Item was changed:
+ ----- Method: Color>>blue (in category 'accessing') -----
- ----- Method: Color>>blue (in category 'access') -----
blue
"Return the blue component of this color, a float in the range [0.0..1.0]."
^ self privateBlue asFloat / ComponentMax!
Item was changed:
+ ----- Method: Color>>brightness (in category 'accessing') -----
- ----- Method: Color>>brightness (in category 'access') -----
brightness
"Return the brightness of this color, a float in the range [0.0..1.0]."
^ ((self privateRed max:
self privateGreen) max:
self privateBlue) asFloat / ComponentMax!
Item was changed:
+ ----- Method: Color>>green (in category 'accessing') -----
- ----- Method: Color>>green (in category 'access') -----
green
"Return the green component of this color, a float in the range [0.0..1.0]."
^ self privateGreen asFloat / ComponentMax!
Item was changed:
+ ----- Method: Color>>hue (in category 'accessing') -----
- ----- Method: Color>>hue (in category 'access') -----
hue
"Return the hue of this color, an angle in the range [0.0..360.0]."
| r g b max min span h |
r := self privateRed.
g := self privateGreen.
b := self privateBlue.
max := ((r max: g) max: b).
min := ((r min: g) min: b).
span := (max - min) asFloat.
span = 0.0 ifTrue: [ ^ 0.0 ].
r = max ifTrue: [
h := ((g - b) asFloat / span) * 60.0.
] ifFalse: [
g = max
ifTrue: [ h := 120.0 + (((b - r) asFloat / span) * 60.0). ]
ifFalse: [ h := 240.0 + (((r - g) asFloat / span) * 60.0). ].
].
h < 0.0 ifTrue: [ h := 360.0 + h ].
^ h!
Item was changed:
+ ----- Method: Color>>luminance (in category 'accessing') -----
- ----- Method: Color>>luminance (in category 'access') -----
luminance
"Return the luminance of this color, a brightness value weighted by the human eye's color sensitivity."
^ ((299 * self privateRed) +
(587 * self privateGreen) +
(114 * self privateBlue)) / (1000 * ComponentMax)
!
Item was changed:
+ ----- Method: Color>>red (in category 'accessing') -----
- ----- Method: Color>>red (in category 'access') -----
red
"Return the red component of this color, a float in the range [0.0..1.0]."
^ self privateRed asFloat / ComponentMax!
Item was changed:
+ ----- Method: Color>>saturation (in category 'accessing') -----
- ----- Method: Color>>saturation (in category 'access') -----
saturation
"Return the saturation of this color, a value between 0.0 and 1.0."
| r g b max min |
r := self privateRed.
g := self privateGreen.
b := self privateBlue.
max := min := r.
g > max ifTrue: [max := g].
b > max ifTrue: [max := b].
g < min ifTrue: [min := g].
b < min ifTrue: [min := b].
max = 0
ifTrue: [ ^ 0.0 ]
ifFalse: [ ^ (max - min) asFloat / max asFloat ].
!
Item was changed:
+ ----- Method: FormSetFont>>displayString:on:from:to:at:kern: (in category 'displaying') -----
- ----- Method: FormSetFont>>displayString:on:from:to:at:kern: (in category 'as yet unclassified') -----
displayString: aString on: aBitBlt from: startIndex to: stopIndex at: aPoint kern: kernDelta
"Draw the given string from startIndex to stopIndex "
combinationRule ifNotNil: [:r | aBitBlt combinationRule: r].
tintable == false ifTrue: [aBitBlt colorMap: nil].
^ super displayString: aString on: aBitBlt from: startIndex to: stopIndex at: aPoint kern: kernDelta!
Item was changed:
+ ----- Method: FormSetFont>>fromFormArray:asciiStart:ascent: (in category 'initialize-release') -----
- ----- Method: FormSetFont>>fromFormArray:asciiStart:ascent: (in category 'as yet unclassified') -----
fromFormArray: formArray asciiStart: asciiStart ascent: ascentVal
| height width x badChar |
type := 2.
name := 'aFormFont'.
minAscii := asciiStart.
maxAscii := minAscii + formArray size - 1.
ascent := ascentVal.
subscript := superscript := emphasis := 0.
height := width := 0.
maxWidth := 0.
formArray do:
[:f | width := width + f width.
maxWidth := maxWidth max: f width.
height := height max: f height + f offset y].
badChar := (Form extent: 7 at height) borderWidth: 1.
width := width + badChar width.
descent := height - ascent.
pointSize := height.
glyphs := Form extent: width @ height depth: formArray first depth.
xTable := Array new: maxAscii + 3 withAll: 0.
x := 0.
formArray doWithIndex:
[:f :i | f displayOn: glyphs at: x at 0.
xTable at: minAscii + i+1 put: (x := x + f width)].
badChar displayOn: glyphs at: x at 0.
xTable at: maxAscii + 3 put: x + badChar width.
characterToGlyphMap := nil.!
Item was changed:
+ ----- Method: FormSetFont>>initialize (in category 'initialize-release') -----
- ----- Method: FormSetFont>>initialize (in category 'as yet unclassified') -----
initialize
super initialize.
self preserveColors.!
Item was changed:
+ ----- Method: FormSetFont>>reset (in category 'emphasis') -----
- ----- Method: FormSetFont>>reset (in category 'as yet unclassified') -----
reset "Ignored by FormSetFonts"!
Item was changed:
+ ----- Method: IdentityGlyphMap>>at: (in category 'accessing') -----
- ----- Method: IdentityGlyphMap>>at: (in category 'as yet unclassified') -----
at: index
^ index - 1.
!
Item was changed:
+ ----- Method: InfiniteForm>>addFillStyleMenuItems:hand:from: (in category 'Morphic menu') -----
- ----- Method: InfiniteForm>>addFillStyleMenuItems:hand:from: (in category 'as yet unclassified') -----
addFillStyleMenuItems: aMenu hand: aHand from: aMorph
"Add the items for changing the current fill style of the receiver"
"prevents a walkback when control menu is built for morph with me as color"!
Item was changed:
+ ----- Method: StaticForm>>isStatic (in category 'testing') -----
- ----- Method: StaticForm>>isStatic (in category 'as yet unclassified') -----
isStatic
^true!
Item was changed:
+ ----- Method: TextComposer>>addNullLineForIndex: (in category 'private') -----
- ----- Method: TextComposer>>addNullLineForIndex: (in category 'as yet unclassified') -----
addNullLineForIndex: index
"This awful bit is to ensure that if we have scanned all the text and the last character is a CR that there is a null line at the end of lines. Sometimes this was not happening which caused anomalous selections when selecting all the text. This is implemented as a post-composition fixup because I couldn't figure out where to put it in the main logic."
| oldLastLine r |
oldLastLine := lines last.
oldLastLine last - oldLastLine first >= 0 ifFalse: [^self].
oldLastLine last = (index - 1) ifFalse: [^self].
r := oldLastLine left @ oldLastLine bottom
extent: 0@(oldLastLine bottom - oldLastLine top).
"Even though we may be below the bottom of the container,
it is still necessary to compose the last line for consistency..."
self addNullLineWithIndex: index andRectangle: r.
!
Item was changed:
+ ----- Method: TextComposer>>addNullLineWithIndex:andRectangle: (in category 'private') -----
- ----- Method: TextComposer>>addNullLineWithIndex:andRectangle: (in category 'as yet unclassified') -----
addNullLineWithIndex: index andRectangle: r
lines addLast: (
(
TextLine
start: index
stop: index - 1
internalSpaces: 0
paddingWidth: 0
)
rectangle: r;
lineHeight: defaultLineHeight baseline: theTextStyle baseline
)
!
Item was changed:
+ ----- Method: TextComposer>>checkIfReadyToSlide (in category 'private') -----
- ----- Method: TextComposer>>checkIfReadyToSlide (in category 'as yet unclassified') -----
checkIfReadyToSlide
"Check whether we are now in sync with previously composed lines"
(possibleSlide and: [currCharIndex > stopCharIndex]) ifFalse: [^self].
[prevIndex < prevLines size
and: [(prevLines at: prevIndex) first < (currCharIndex - deltaCharIndex)]]
whileTrue: [prevIndex := prevIndex + 1].
(prevLines at: prevIndex) first = (currCharIndex - deltaCharIndex) ifTrue: [
"Yes -- next line will have same start as prior line."
prevIndex := prevIndex - 1.
possibleSlide := false.
nowSliding := true
] ifFalse: [
prevIndex = prevLines size ifTrue: [
"Weve reached the end of prevLines, so no use to keep looking for lines to slide."
possibleSlide := false
]
]!
Item was changed:
+ ----- Method: TextComposer>>composeAllLines (in category 'private') -----
- ----- Method: TextComposer>>composeAllLines (in category 'as yet unclassified') -----
composeAllLines
[currCharIndex <= theText size and:
[(currentY + defaultLineHeight) <= theContainer bottom]] whileTrue: [
nowSliding ifTrue: [
self slideOneLineDown ifNil: [^nil].
] ifFalse: [
self composeOneLine ifNil: [^nil].
]
].
!
Item was changed:
+ ----- Method: TextComposer>>composeAllRectangles: (in category 'private') -----
- ----- Method: TextComposer>>composeAllRectangles: (in category 'as yet unclassified') -----
composeAllRectangles: rectangles
| charIndexBeforeLine numberOfLinesBefore reasonForStopping |
actualHeight := defaultLineHeight.
charIndexBeforeLine := currCharIndex.
numberOfLinesBefore := lines size.
reasonForStopping := self composeEachRectangleIn: rectangles.
currentY := currentY + actualHeight.
currentY > theContainer bottom ifTrue: [
"Oops -- the line is really too high to fit -- back out"
currCharIndex := charIndexBeforeLine.
lines size - numberOfLinesBefore timesRepeat: [lines removeLast].
^self
].
"It's OK -- the line still fits."
maxRightX := maxRightX max: scanner rightX.
1 to: rectangles size - 1 do: [ :i | |lineIndex|
"Adjust heights across rectangles if necessary"
lineIndex:=lines size - rectangles size + i.
(lines size between: 1 and: lineIndex) ifTrue:
[(lines at: lineIndex)
lineHeight: lines last lineHeight
baseline: lines last baseline]
].
isFirstLine := false.
reasonForStopping == #columnBreak ifTrue: [^nil].
currCharIndex > theText size ifTrue: [
^nil "we are finished composing"
].
!
Item was changed:
+ ----- Method: TextComposer>>composeEachRectangleIn: (in category 'private') -----
- ----- Method: TextComposer>>composeEachRectangleIn: (in category 'as yet unclassified') -----
composeEachRectangleIn: rectangles
| myLine lastChar |
1 to: rectangles size do: [:i |
currCharIndex <= theText size ifFalse: [^false].
myLine := scanner
composeFrom: currCharIndex
inRectangle: (rectangles at: i)
firstLine: isFirstLine
leftSide: i=1
rightSide: i=rectangles size.
lines addLast: myLine.
actualHeight := actualHeight max: myLine lineHeight. "includes font changes"
currCharIndex := myLine last + 1.
lastChar := theText at: myLine last.
(CharacterSet crlf includes: lastChar) ifTrue: [^#cr].
wantsColumnBreaks ifTrue: [
lastChar = Character characterForColumnBreak ifTrue: [^#columnBreak].
].
].
^false!
Item was changed:
+ ----- Method: TextComposer>>composeLinesFrom:to:delta:into:priorLines:atY:textStyle:text:container:wantsColumnBreaks: (in category 'composing') -----
- ----- Method: TextComposer>>composeLinesFrom:to:delta:into:priorLines:atY:textStyle:text:container:wantsColumnBreaks: (in category 'as yet unclassified') -----
composeLinesFrom: argStart to: argStop delta: argDelta into: argLinesCollection priorLines: argPriorLines atY: argStartY textStyle: argTextStyle text: argText container: argContainer wantsColumnBreaks: argWantsColumnBreaks
wantsColumnBreaks := argWantsColumnBreaks.
lines := argLinesCollection.
theTextStyle := argTextStyle.
theText := argText.
theContainer := argContainer.
deltaCharIndex := argDelta.
currCharIndex := startCharIndex := argStart.
stopCharIndex := argStop.
prevLines := argPriorLines.
currentY := argStartY.
maxRightX := theContainer left.
possibleSlide := stopCharIndex < theText size and: [theContainer isMemberOf: Rectangle].
nowSliding := false.
prevIndex := 1.
"choose an appropriate scanner - should go away soon, when they can be unified"
scanner := CompositionScanner new.
scanner text: theText textStyle: theTextStyle.
scanner wantsColumnBreaks: wantsColumnBreaks.
defaultLineHeight := scanner computeDefaultLineHeight.
isFirstLine := true.
self composeAllLines.
isFirstLine ifTrue: ["No space in container or empty text"
self
addNullLineWithIndex: startCharIndex
andRectangle: (theContainer left @ theContainer top extent: 0 at defaultLineHeight)
] ifFalse: [
(lines last last = theText size and: [scanner doesTheLineBreaksAfterLastChar])
ifTrue: [self addNullLineForIndex: theText size + 1]
].
^{lines asArray. maxRightX}
!
Item was changed:
+ ----- Method: TextComposer>>composeOneLine (in category 'private') -----
- ----- Method: TextComposer>>composeOneLine (in category 'as yet unclassified') -----
composeOneLine
| rectangles |
rectangles := theContainer rectanglesAt: currentY height: defaultLineHeight.
rectangles notEmpty
ifTrue: [(self composeAllRectangles: rectangles) ifNil: [^nil]]
ifFalse: [currentY := currentY + defaultLineHeight].
self checkIfReadyToSlide!
Item was changed:
+ ----- Method: TextComposer>>slideOneLineDown (in category 'private') -----
- ----- Method: TextComposer>>slideOneLineDown (in category 'as yet unclassified') -----
slideOneLineDown
| priorLine |
"Having detected the end of rippling recoposition, we are only sliding old lines"
prevIndex < prevLines size ifFalse: [
"There are no more prevLines to slide."
^nowSliding := possibleSlide := false
].
"Adjust and re-use previously composed line"
prevIndex := prevIndex + 1.
priorLine := (prevLines at: prevIndex)
slideIndexBy: deltaCharIndex andMoveTopTo: currentY.
lines addLast: priorLine.
currentY := priorLine bottom.
currCharIndex := priorLine last + 1.
wantsColumnBreaks ifTrue: [
priorLine first to: priorLine last do: [ :i |
(theText at: i) = Character characterForColumnBreak ifTrue: [
nowSliding := possibleSlide := false.
^nil
].
].
].
!
More information about the Packages
mailing list