The Trunk: Graphics-eem.375.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Graphics-eem.375.mcz

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

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

Name: Graphics-eem.375
Author: eem
Time: 25 May 2017, 3:36:53.966637 pm
UUID: 065e211a-d9da-4f21-9122-3467568da9e6
Ancestors: Graphics-nice.374

Fix a slip in warpBitsSmoothing:sourceMap: and implement a trick in clipRange.  Harvested from Terf.

=============== Diff against Graphics-nice.374 ===============

Item was changed:
  ----- Method: BitBlt>>clipRange (in category 'private') -----
  clipRange
  "clip and adjust source origin and extent appropriately"
  "first in x"
  | sx sy dx dy bbW bbH |
  "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].
 
  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 := clipWidth := clipHeight := 0.
- 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: 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>
 
  "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].
 
  (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 primitiveFailed].
- ^ 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)].
  sp := sp + deltaPAB].
  pA := pA + deltaP12.
  pB := pB + deltaP43]!