[Pkg] The Trunk: Graphics-eem.371.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Mar 16 18:16:37 UTC 2017


Eliot Miranda uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-eem.371.mcz

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

Name: Graphics-eem.371
Author: eem
Time: 16 March 2017, 11:16:07.724754 am
UUID: 47843a60-a6e4-40c8-bf26-9c4d18dba3d1
Ancestors: Graphics-ul.370

Add error codes to the copy and warp bits primitives.  Respond to the #'object moved' error code by retrying.  Clean up the failure code to reduce duplication.

=============== Diff against Graphics-ul.370 ===============

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' error: ec>
- 	<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].
+ 	"Check for object movement during a surface callback, compressed source, destination or halftone forms.
+ 	 Simply retry."
+ 	(ec == #'object moved'
+ 	 or: [(sourceForm isForm and: [sourceForm unhibernate])
+ 	 or: [(destForm isForm and: [destForm unhibernate])
+ 	 or: [halftoneForm isForm and: [halftoneForm unhibernate]]]]) ifTrue:
+ 		[^self copyBits].
- 	((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].
- 	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.
- 	(colorMap notNil and:[colorMap isColormap]) ifTrue:[
- 		colorMap := colorMap colors.
  		^self copyBits].
+ 	"Check if clipping got way out of range"
+ 	self clipRange.
- 	"Check if clipping gots us way out of range"
- 	self clipRange ifTrue:[self roundVariables. ^self copyBitsAgain].
- 
  	"Convert all numeric parameters to integers and try again."
  	self roundVariables.
+ 	^self copyBitsAgain!
- 	^ self copyBitsAgain!

Item was changed:
  ----- Method: BitBlt>>copyBitsAgain (in category 'private') -----
  copyBitsAgain
  	"Primitive. See BitBlt|copyBits, also a Primitive. Essential. See Object
  	documentation whatIsAPrimitive."
  
+ 	<primitive: 'primitiveCopyBits' module: 'BitBltPlugin' error: ec>
- 	<primitive: 'primitiveCopyBits' module: 'BitBltPlugin'>
  	self primitiveFailed!

Item was changed:
  ----- Method: WarpBlt>>warpBitsSmoothing:sourceMap: (in category 'primitives') -----
  warpBitsSmoothing: n sourceMap: sourceMap
  	| deltaP12 deltaP43 pA pB deltaPAB sp fixedPtOne poker pix nSteps |
+ 	<primitive: 'primitiveWarpBits' module: 'BitBltPlugin' error: ec>
- 	<primitive: 'primitiveWarpBits' module: 'BitBltPlugin'>
  
  	"Check for compressed source, destination or halftone forms"
+ 	"Check for object movement during a surface callback, compressed source, destination or halftone forms.
+ 	 Simply retry."
+ 	(ec == #'object moved'
+ 	 or: [(sourceForm isForm and: [sourceForm unhibernate])
+ 	 or: [(destForm isForm and: [destForm unhibernate])
+ 	 or: [halftoneForm isForm and: [halftoneForm unhibernate]]]]) ifTrue:
+ 		[^self warpBitsSmoothing: n sourceMap: sourceMap].
- 	((sourceForm isForm) and: [sourceForm unhibernate])
- 		ifTrue: [^ self warpBitsSmoothing: n sourceMap: sourceMap].
- 	((destForm isForm) and: [destForm unhibernate])
- 		ifTrue: [^ self warpBitsSmoothing: n sourceMap: sourceMap].
- 	((halftoneForm isForm) and: [halftoneForm unhibernate])
- 		ifTrue: [^ self warpBitsSmoothing: n sourceMap: sourceMap].
  
  	(width < 1) | (height < 1) ifTrue: [^ self].
  	fixedPtOne := 16384.  "1.0 in fixed-pt representation"
  	n > 1 ifTrue:
  		[(destForm depth < 16 and: [colorMap == nil])
  			ifTrue: ["color map is required to smooth non-RGB dest"
  					^ self primitiveFail].
  		pix := Array new: n*n].
  
  	nSteps := height-1 max: 1.
  	deltaP12 := (self deltaFrom: p1x to: p2x nSteps: nSteps)
  			@ (self deltaFrom: p1y to: p2y nSteps: nSteps).
  	pA := (self startFrom: p1x to: p2x offset: nSteps*deltaP12 x)
  		@ (self startFrom: p1y to: p2y offset: nSteps*deltaP12 y).
  	deltaP43 := (self deltaFrom: p4x to: p3x nSteps: nSteps)
  			@ (self deltaFrom: p4y to: p3y nSteps: nSteps).
  	pB := (self startFrom: p4x to: p3x offset: nSteps*deltaP43 x)
  		@ (self startFrom: p4y to: p3y offset: nSteps*deltaP43 y).
  
  	poker := BitBlt bitPokerToForm: destForm.
  	poker clipRect: self clipRect.
  	nSteps := width-1 max: 1.
  	destY to: destY+height-1 do:
  		[:y |
  		deltaPAB := (self deltaFrom: pA x to: pB x nSteps: nSteps)
  				@ (self deltaFrom: pA y to: pB y nSteps: nSteps).
  		sp := (self startFrom: pA x to: pB x offset: nSteps*deltaPAB x)
  			@ (self startFrom: pA y to: pB y offset: nSteps*deltaPAB x).
  		destX to: destX+width-1 do:
  			[:x | 
  			n = 1
  			ifTrue:
  				[poker pixelAt: x at y
  						put: (sourceForm pixelValueAt: sp // fixedPtOne asPoint)]
  			ifFalse:
  				[0 to: n-1 do:
  					[:dx | 0 to: n-1 do:
  						[:dy |
  						pix at: dx*n+dy+1 put:
  								(sourceForm pixelValueAt: sp
  									+ (deltaPAB*dx//n)
  									+ (deltaP12*dy//n)
  										// fixedPtOne asPoint)]].
  				poker pixelAt: x at y put: (self mixPix: pix
+ 											sourceMap: sourceMap
+ 											destMap: colorMap)].
- 										sourceMap: sourceMap
- 										destMap: colorMap)].
  			sp := sp + deltaPAB].
  		pA := pA + deltaP12.
  		pB := pB + deltaP43]!



More information about the Packages mailing list