Author: Lars Wassermann <[email protected]>
Branch:
Changeset: r284:35b6ae515ed9
Date: 2013-04-16 16:15 +0200
http://bitbucket.org/pypy/lang-smalltalk/changeset/35b6ae515ed9/
Log: reverted the optimization to the copyLoop because it introduced
clipping errors
diff --git a/BitBltSim.19.cs b/BitBltSim.19.cs
--- a/BitBltSim.19.cs
+++ b/BitBltSim.19.cs
@@ -13,33 +13,33 @@
!BitBlt methodsFor: 'private'!
clipRange
destX >= clipX
- ifTrue:
+ ifTrue:
[simSx _ sourceX.
simDx _ destX.
simW _ width]
- ifFalse:
+ ifFalse:
[simSx _ sourceX + (clipX - destX).
simW _ width - (clipX - destX).
simDx _ clipX].
simDx + simW > (clipX + clipWidth) ifTrue: [simW _ simW - (simDx + simW
- (clipX + clipWidth))].
destY >= clipY
- ifTrue:
+ ifTrue:
[simSy _ sourceY.
simDy _ destY.
simH _ height]
- ifFalse:
+ ifFalse:
[simSy _ sourceY + clipY - destY.
simH _ height - (clipY - destY).
simDy _ clipY].
simDy + simH > (clipY + clipHeight) ifTrue: [simH _ simH - (simDy +
simH - (clipY + clipHeight))].
simSx < 0
- ifTrue:
+ ifTrue:
[simDx _ simDx - simSx.
simW _ simW + simSx.
simSx _ 0].
simSx + simW > sourceForm width ifTrue: [simW _ simW - (simSx + simW -
sourceForm width)].
simSy < 0
- ifTrue:
+ ifTrue:
[simDy _ simDy - simSy.
simH _ simH + simSy.
simSy _ 0].
@@ -121,33 +121,38 @@
copyLoop
| prevWord thisWord skewWord mergeMask halftoneWord mergeWord
noSimSkewMask |
noSimSkewMask _ simSkewMask bitInvert32.
- 1 to: simH do:
- [:i |
+ 1 to: simH do:
+ [:i |
halftoneForm notNil
- ifTrue:
+ ifTrue:
[halftoneWord _ simHalftoneBits at: 1 + (simDy
\\ simHalftoneBits size).
simDy _ simDy + simVDir]
ifFalse: [halftoneWord _ AllOnes].
skewWord _ halftoneWord.
simPreload
- ifTrue:
+ ifTrue:
[prevWord _ simSourceBits at: simSourceIndex +
1.
simSourceIndex _ simSourceIndex + simHDir]
ifFalse: [prevWord _ 0].
mergeMask _ simMask1.
- 1 to: simNWords do:
- [:word |
+ 1 to: simNWords do:
+ [:word |
sourceForm notNil
- ifTrue:
- [thisWord _ (simSourceIndex <= 0 or:
[simSourceIndex >= simSourceBits size])
+ ifTrue:
+ [prevWord _ prevWord bitAnd:
simSkewMask.
+ "XXX: Hack to work around
out-of-bounds access"
+ thisWord := (simSourceIndex < 0 or:
[simSourceIndex >= simSourceBits size])
ifTrue:
[simSourceBits at: 1]
ifFalse:
[simSourceBits at: simSourceIndex + 1].
- prevWord _ (prevWord bitAnd:
simSkewMask) bitShift: simSkew.
- skewWord _ prevWord bitOr: ((thisWord
bitAnd: noSimSkewMask) bitShift: simSkew - WordSize).
- prevWord _ thisWord].
- halftoneForm notNil
- ifTrue: [mergeWord _ self merge: (skewWord
bitAnd: halftoneWord)
- with: (simDestBits at:
simDestIndex + 1)].
+
"pick up next word"
+ skewWord _
+ prevWord bitOr:
(thisWord bitAnd: simSkewMask bitInvert32).
+ prevWord _ thisWord.
+ "Change from BB: bitAnd: AllOnes to
stay in word bounds"
+ skewWord _ ((skewWord bitShift:
simSkew) bitAnd: AllOnes) bitOr:
+
(skewWord bitShift: simSkew - WordSize)].
+ mergeWord _ self merge: (skewWord bitAnd: halftoneWord)
+ with: (simDestBits at: simDestIndex +
1).
simDestBits at: simDestIndex + 1 put: ((mergeMask
bitAnd: mergeWord)
bitOr: (mergeMask bitInvert32 bitAnd:
(simDestBits at: simDestIndex + 1))).
simSourceIndex _ simSourceIndex + simHDir.
@@ -298,19 +303,19 @@
extent: f extent
clipRect: Display computeBoundingBox.
"paint the gray Form on the screen for a while. "
- [Sensor anyButtonPressed] whileFalse:
+ [Sensor anyButtonPressed] whileFalse:
[aBitBlt destOrigin: Sensor cursorPoint.
aBitBlt simulateCopyBits].
Display newDepth: displayDepth.
"BitBlt exampleTwo"! !
!BitBlt class methodsFor: 'private' stamp: 'tfel 3/15/2013 14:32'!
-exampleAt: originPoint rule: rule fillColor: mask
+exampleAt: originPoint rule: rule fillColor: mask
"This builds a source and destination form and copies the source to the
destination using the specifed rule and mask. It is called from the
method
named exampleOne. Only works with Display depth of 1"
- | s d border aBitBlt |
+ | s d border aBitBlt |
border:=Form extent: 32@32.
border fillBlack.
border fill: (1@1 extent: 30@30) fillColor: Color white.
@@ -326,7 +331,7 @@
d displayOn: Display at: originPoint + (s width @0).
border displayOn: Display at: originPoint + (s width @0) rule: Form
under.
- d displayOn: Display at: originPoint + (s extent // (2 @ 1)).
+ d displayOn: Display at: originPoint + (s extent // (2 @ 1)).
aBitBlt := BitBlt
destForm: Display
sourceForm: s
@@ -337,7 +342,7 @@
extent: s extent
clipRect: Display computeBoundingBox.
aBitBlt simulateCopyBits.
- border
+ border
displayOn: Display at: originPoint + (s extent // (2 @ 1))
rule: Form under.
@@ -468,7 +473,7 @@
| results |
results := #(
#(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0)
-
+
#(0 0 0 0 0 0 0 33554304 33554304 33554304 33554304 33554304
33554304 33554304 33554304 33554304 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
#(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33554304 33554304 33554304
33554304 33554304 33554304 33554304 33554304 33554304 0 0 0 0 0 0 0)
@@ -511,7 +516,7 @@
!BitBltSimTest methodsFor: 'running-modes' stamp: 'tfel 3/15/2013 14:37'!
runTestDark: index
- | s d rule |
+ | s d rule |
rule := index - 1.
s := self sourceForm.
d := self destForm.
@@ -530,7 +535,7 @@
!BitBltSimTest methodsFor: 'running-modes' stamp: 'tfel 3/15/2013 14:30'!
runTestLarge: index
- | s d aBitBlt mask rule simD originPoint destOrigin |
+ | s d aBitBlt mask rule simD originPoint destOrigin |
originPoint := path at: index.
rule := index - 1.
mask := nil.
@@ -553,7 +558,7 @@
extent: s extent
clipRect: simD computeBoundingBox.
aBitBlt simulateCopyBits.
-
+
aBitBlt := BitBlt
destForm: d
sourceForm: s
@@ -569,7 +574,7 @@
!BitBltSimTest methodsFor: 'running-modes' stamp: 'tfel 3/15/2013 14:43'!
runTestVisual: index
- | s d aBitBlt mask rule simD originPoint destOrigin |
+ | s d aBitBlt mask rule simD originPoint destOrigin |
originPoint := path at: index.
rule := index - 1.
mask := nil.
@@ -592,7 +597,7 @@
extent: s extent
clipRect: simD computeBoundingBox.
aBitBlt simulateCopyBits.
-
+
aBitBlt := BitBlt
destForm: d
sourceForm: s
@@ -606,7 +611,7 @@
simD displayOn: Display at: originPoint + (s width @ 0) rule: Form over.
d displayOn: Display at: originPoint - (10@0) rule: Form over.
-
+
d bits = simD bits
ifTrue: [index asString displayAt: originPoint - 20]
ifFalse: [(index asString, ' failed') displayAt: originPoint -
20. self assert: false].! !
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit