[squeak-dev] The Inbox: Graphics-wiz.183.mcz

commits at source.squeak.org commits at source.squeak.org
Tue May 24 00:47:28 UTC 2011


A new version of Graphics was added to project The Inbox:
http://source.squeak.org/inbox/Graphics-wiz.183.mcz

==================== Summary ====================

Name: Graphics-wiz.183
Author: wiz
Time: 23 May 2011, 8:55:06.627 pm
UUID: de71490d-a20e-4413-b8b0-8bc9ae3bfdb9
Ancestors: Graphics-nice.182

The last of three pieces fixing M7635.

adjustOrigins and adjustExtent assure parameters are defined and not in class Fraction form.
clipRange has had lazy initialization factored out by useing the adjust methods.
copyBits now tries the two adjust methods before trying cliprange. It also now tries clipRange without the horrible roundVariables method. As a last resort it sends and error method before proceeding to try the roundVariables method.

That should do it.

Oh yeah be sure to load the other two parts first. Everything will depend on the presense of asNonFraction.

=============== Diff against Graphics-nice.182 ===============

Item was added:
+ ----- Method: BitBlt>>adjustExtents (in category 'accessing') -----
+ adjustExtents
+ "Answer if any of the extent numbers were class fraction or undefined. 
+ Assure all  extent numbers are  defined and non-fractional."
+ 
+ 	| answer |
+ 	(answer := width isFraction | height isFraction | clipWidth isFraction | clipHeight isFraction
+ 	| width isNil | height isNil | clipWidth isNil | clipHeight isNil) ifFalse: [ ^answer ] .
+ 	width := ( width ifNil: [ destForm width ] ) asNonFraction .
+ 	height := ( height ifNil: [ destForm height ] ) asNonFraction .
+ 	clipWidth := (clipWidth ifNil:[clipWidth := destForm width]) asNonFraction .
+ 	clipHeight := (clipHeight ifNil:[clipHeight := destForm height]) asNonFraction .
+ 	^answer !

Item was added:
+ ----- Method: BitBlt>>adjustOrigins (in category 'accessing') -----
+ adjustOrigins
+ "Answer if any of the origin numbers were class Fraction or undefined. Assure all  origin numbers are non-fractional and defined."
+ 
+ 	| answer |
+ 	(answer := destX isFraction 	| destY isFraction 
+ 				| sourceX isFraction | sourceY isFraction
+ 				| clipX isFraction 	| clipY isFraction
+ 				| destX isNil 		| destY isNil 
+ 				| sourceX isNil		| sourceY isNil
+ 				| clipX isNil 			| clipY isNil ) 
+ 					ifFalse: [ ^answer ] .
+ 	
+ 	destX :=( destX ifNil:[ 0]) asNonFraction .
+ 	destY := (destY  ifNil:[ 0]) asNonFraction .
+ 	sourceX := (sourceX  ifNil:[ 0]) asNonFraction .
+ 	sourceY := (sourceY  ifNil:[ 0]) asNonFraction .
+ 	clipX := (clipX  ifNil:[0]) asNonFraction .
+ 	clipY := (clipY  ifNil:[0]) asNonFraction .
+ 	^ answer!

Item was changed:
  ----- Method: BitBlt>>clipRange (in category 'private') -----
  clipRange
+ 	"Fill in the lazy state if needed and insure no numbers are class Fraction.
+ 	Clip and adjust source origin and extent appropriately"
+ 	
- 	"clip and adjust source origin and extent appropriately"
- 	"first in x"
  	| sx sy dx dy bbW bbH |
+ 	self adjustExtents | self adjustOrigins . "True when something changed."
- 	"fill in the lazy state if needed"
- 	destX ifNil:[destX := 0].
- 	destY ifNil:[destY := 0].
- 	width ifNil:[width := destForm width].
- 	height ifNil:[height := destForm height].
- 	sourceX ifNil:[sourceX := 0].
- 	sourceY ifNil:[sourceY := 0].
- 	clipX ifNil:[clipX := 0].
- 	clipY ifNil:[clipY := 0].
- 	clipWidth ifNil:[clipWidth := destForm width].
- 	clipHeight ifNil:[clipHeight := destForm height].
  
+ 	"first in x"
  	destX >= clipX
  		ifTrue: [sx := sourceX.
  				dx := destX.
  				bbW := width]
  		ifFalse: [sx := sourceX + (clipX - destX).
  				bbW := width - (clipX - destX).
  				dx := clipX].
  	(dx + bbW) > (clipX + clipWidth)
  		ifTrue: [bbW := bbW - ((dx + bbW) - (clipX + clipWidth))].
  	"then in y"
  	destY >= clipY
  		ifTrue: [sy := sourceY.
  				dy := destY.
  				bbH := height]
  		ifFalse: [sy := sourceY + clipY - destY.
  				bbH := height - (clipY - destY).
  				dy := clipY].
  	(dy + bbH) > (clipY + clipHeight)
  		ifTrue: [bbH := bbH - ((dy + bbH) - (clipY + clipHeight))].
  	sourceForm ifNotNil:[
  		sx < 0
  			ifTrue: [dx := dx - sx.
  					bbW := bbW + sx.
  					sx := 0].
  		sx + bbW > sourceForm width
  			ifTrue: [bbW := bbW - (sx + bbW - sourceForm width)].
  		sy < 0
  			ifTrue: [dy := dy - sy.
  					bbH := bbH + sy.
  					sy := 0].
  		sy + bbH > sourceForm height
  			ifTrue: [bbH := bbH - (sy + bbH - sourceForm height)].
  	].
  	(bbW <= 0 or:[bbH <= 0]) ifTrue:[
  		sourceX := sourceY := destX := destY := clipX := clipY := width := height := 0.
  		^true].
  	(sx = sourceX 
  		and:[sy = sourceY 
  		and:[dx = destX 
  		and:[dy = destY 
  		and:[bbW = width 
  		and:[bbH = height]]]]]) ifTrue:[^false].
  	sourceX := sx.
  	sourceY := sy.
  	destX := dx.
  	destY := dy.
  	width := bbW.
  	height := bbH.
  	^true!

Item was changed:
  ----- Method: BitBlt>>copyBits (in category 'copying') -----
  copyBits
  	"Primitive. Perform the movement of bits from the source form to the 
  	destination form. Fail if any variables are not of the right type (Integer, 
  	Float, or Form) or if the combination rule is not implemented. 
  	In addition to the original 16 combination rules, this BitBlt supports
  	16	fail (to simulate paint)
  	17	fail (to simulate mask)
  	18	sourceWord + destinationWord
  	19	sourceWord - destinationWord
  	20	rgbAdd: sourceWord with: destinationWord
  	21	rgbSub: sourceWord with: destinationWord
  	22	rgbDiff: sourceWord with: destinationWord
  	23	tallyIntoMap: destinationWord
  	24	alphaBlend: sourceWord with: destinationWord
  	25	pixPaint: sourceWord with: destinationWord
  	26	pixMask: sourceWord with: destinationWord
  	27	rgbMax: sourceWord with: destinationWord
  	28	rgbMin: sourceWord with: destinationWord
  	29	rgbMin: sourceWord bitInvert32 with: destinationWord
  "
  	<primitive: 'primitiveCopyBits' module: 'BitBltPlugin'>
  
  	"Check for compressed source, destination or halftone forms"
  	(combinationRule >= 30 and: [combinationRule <= 31]) ifTrue:
  		["No alpha specified -- re-run with alpha = 1.0"
  		^ self copyBitsTranslucent: 255].
  	((sourceForm isForm) and: [sourceForm unhibernate])
  		ifTrue: [^ self copyBits].
  	((destForm isForm) and: [destForm unhibernate])
  		ifTrue: [^ self copyBits].
  	((halftoneForm isForm) and: [halftoneForm unhibernate])
  		ifTrue: [^ self copyBits].
  
  	"Check for unimplmented rules"
  	combinationRule = Form oldPaint ifTrue: [^ self paintBits].
  	combinationRule = Form oldErase1bitShape ifTrue: [^ self eraseBits].
  
  	"Check if BitBlt doesn't support full color maps"
  	(colorMap notNil and:[colorMap isColormap]) ifTrue:[
  		colorMap := colorMap colors.
  		^self copyBits].
+ 	"Check for class Fraction numbers and undefined paramenters."
+ 	self adjustExtents ifTrue: [ ^self copyBits ].
+ 	self adjustOrigins ifTrue: [ ^self copyBits ].
+ 	
  	"Check if clipping gots us way out of range"
+ 	self clipRange ifTrue:[ ^self copyBits].
- 	self clipRange ifTrue:[self roundVariables. ^self copyBitsAgain].
  
+ 	self error: 'Bad BitBlt arg; proceed to round args..'.
- 	self error: 'Bad BitBlt arg (Fraction?); proceed to convert.'.
  	"Convert all numeric parameters to integers and try again."
  	self roundVariables.
  	^ self copyBitsAgain!




More information about the Squeak-dev mailing list