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@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@y put: (self mixPix: pix + sourceMap: sourceMap + destMap: colorMap)]. - sourceMap: sourceMap - destMap: colorMap)]. sp := sp + deltaPAB]. pA := pA + deltaP12. pB := pB + deltaP43]! |
Free forum by Nabble | Edit this page |