Fix translation in crop editor's pan gesture.

pull/2/head
Matthew Chen 7 years ago
parent d1d99bc641
commit 4022ba1a16

@ -516,16 +516,20 @@ class ImageEditorCropViewController: OWSViewController {
owsFailDebug("Missing pinchTransform.") owsFailDebug("Missing pinchTransform.")
return return
} }
guard let locationStart = gestureRecognizer.locationStart else { guard let oldLocationView = gestureRecognizer.locationStart else {
owsFailDebug("Missing locationStart.") owsFailDebug("Missing locationStart.")
return return
} }
let locationNow = gestureRecognizer.location(in: self.clipView)
let locationUnitStart = self.locationUnit(forLocationInView: locationStart, transform: gestureStartTransform) // The beauty of using an SRT (scale-rotate-translation) tranform ordering
let locationUnitNow = self.locationUnit(forLocationInView: locationNow, transform: gestureStartTransform) // is that the translation is applied last, so it's trivial to convert
let locationUnitDelta = CGPointSubtract(locationUnitNow, locationUnitStart) // translations from view coordinates to transform translation.
let newUnitTranslation = CGPointAdd(gestureStartTransform.unitTranslation, locationUnitDelta) let viewBounds = clipView.bounds
let newLocationView = gestureRecognizer.location(in: self.clipView)
// Our (view bounds == canvas bounds) so no need to convert.
let translation = newLocationView.minus(oldLocationView)
let translationUnit = translation.toUnitCoordinates(viewSize: viewBounds.size, shouldClamp: false)
let newUnitTranslation = gestureStartTransform.unitTranslation.plus(translationUnit)
updateTransform(ImageEditorTransform(outputSizePixels: gestureStartTransform.outputSizePixels, updateTransform(ImageEditorTransform(outputSizePixels: gestureStartTransform.outputSizePixels,
unitTranslation: newUnitTranslation, unitTranslation: newUnitTranslation,
@ -600,17 +604,19 @@ class ImageEditorCropViewController: OWSViewController {
} }
@objc public func rotate90ButtonPressed() { @objc public func rotate90ButtonPressed() {
rotateButtonPressed(angleRadians: CGFloat.pi * 0.5) rotateButtonPressed(angleRadians: CGFloat.pi * 0.5, rotateCanvas: true)
} }
@objc public func rotate45ButtonPressed() { @objc public func rotate45ButtonPressed() {
rotateButtonPressed(angleRadians: CGFloat.pi * 0.25) rotateButtonPressed(angleRadians: CGFloat.pi * 0.25, rotateCanvas: false)
} }
private func rotateButtonPressed(angleRadians: CGFloat) { private func rotateButtonPressed(angleRadians: CGFloat, rotateCanvas: Bool) {
let outputSizePixels = (rotateCanvas
// Invert width and height. // Invert width and height.
let outputSizePixels = CGSize(width: transform.outputSizePixels.height, ? CGSize(width: transform.outputSizePixels.height,
height: transform.outputSizePixels.width) height: transform.outputSizePixels.width)
: transform.outputSizePixels)
let unitTranslation = transform.unitTranslation let unitTranslation = transform.unitTranslation
let rotationRadians = transform.rotationRadians + angleRadians let rotationRadians = transform.rotationRadians + angleRadians
let scaling = transform.scaling let scaling = transform.scaling

Loading…
Cancel
Save