diff options
author | Ruben Brunk <rubenbrunk@google.com> | 2012-10-23 18:11:10 -0700 |
---|---|---|
committer | Ruben Brunk <rubenbrunk@google.com> | 2012-10-23 21:32:43 -0700 |
commit | 026dabdcb13bd0095a970af8e1a05741f801db50 (patch) | |
tree | 79864c73cc56384ca3cc7b7369c152074104f93b /src/com/android/gallery3d | |
parent | 57cc382afb777db41002619da6f4762f4251bb59 (diff) | |
download | android_packages_apps_Snap-026dabdcb13bd0095a970af8e1a05741f801db50.tar.gz android_packages_apps_Snap-026dabdcb13bd0095a970af8e1a05741f801db50.tar.bz2 android_packages_apps_Snap-026dabdcb13bd0095a970af8e1a05741f801db50.zip |
Fixed scaling factor for ImageShow and rotations.
Bug: 7392240
Bug: 7386048
Change-Id: I156c52acbd041604df2f7ccacca3a80f1b9fdb3b
Diffstat (limited to 'src/com/android/gallery3d')
4 files changed, 49 insertions, 35 deletions
diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java index d27946a91..33a3f73cb 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java +++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java @@ -93,4 +93,10 @@ public class GeometryMath { return (float) Math.sqrt(a[0] * a[0] + a[1] * a[1]); } + public static float scale(float oldWidth, float oldHeight, float newWidth, float newHeight) { + if (oldHeight == 0 || oldWidth == 0) + return 1; + return Math.min(newWidth / oldWidth , newHeight / oldHeight); + } + } diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java index 4c2918465..77e78fe7d 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java +++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java @@ -105,9 +105,8 @@ public class GeometryMetadata { public RectF getCropBounds(Bitmap bitmap) { float scale = 1.0f; - if (mPhotoBounds.width() > 0) { - scale = bitmap.getWidth() / mPhotoBounds.width(); - } + scale = GeometryMath.scale(mPhotoBounds.width(), mPhotoBounds.height(), bitmap.getWidth(), + bitmap.getHeight()); return new RectF(mCropBounds.left * scale, mCropBounds.top * scale, mCropBounds.right * scale, mCropBounds.bottom * scale); } @@ -299,8 +298,8 @@ public class GeometryMetadata { /** * Builds a matrix to transform a bitmap of width bmWidth and height - * bmHeight so that the region of the bitmap being cropped to is - * oriented and centered at displayCenter. + * bmHeight so that the region of the bitmap being cropped to is oriented + * and centered at displayCenter. * * @param bmWidth * @param bmHeight @@ -311,7 +310,7 @@ public class GeometryMetadata { RectF rp = getPhotoBounds(); RectF rc = getPreviewCropBounds(); - float scale = bmWidth / rp.width(); + float scale = GeometryMath.scale(rp.width(), rp.height(), bmWidth, bmHeight); RectF scaledCrop = GeometryMath.scaleRect(rc, scale); RectF scaledPhoto = GeometryMath.scaleRect(rp, scale); diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java b/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java index 590b53cd6..af4290df9 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java @@ -89,7 +89,7 @@ public abstract class ImageGeometry extends ImageSlave { return current * 90; } - protected float getCurrentTouchAngle(){ + protected float getCurrentTouchAngle() { if (mCurrentX == mTouchCenterX && mCurrentY == mTouchCenterY) { return 0; } @@ -106,11 +106,7 @@ public abstract class ImageGeometry extends ImageSlave { protected float computeScale(float width, float height) { float imageWidth = mLocalGeometry.getPhotoBounds().width(); float imageHeight = mLocalGeometry.getPhotoBounds().height(); - float zoom = width / imageWidth; - if (imageHeight > imageWidth) { - zoom = height / imageHeight; - } - return zoom; + return GeometryMath.scale(imageWidth, imageHeight, width, height); } private void calculateLocalScalingFactorAndOffset() { @@ -221,7 +217,6 @@ public abstract class ImageGeometry extends ImageSlave { return getLocalRotation() + getLocalStraighten(); } - protected static float[] getCornersFromRect(RectF r) { // Order is: // 0------->1 @@ -406,7 +401,12 @@ public abstract class ImageGeometry extends ImageSlave { } protected Matrix getGeoMatrix(RectF r, boolean onlyRotate) { - float scale = computeScale(getWidth(), getHeight()); + RectF pbounds = getLocalPhotoBounds(); + float scale = GeometryMath + .scale(pbounds.width(), pbounds.height(), getWidth(), getHeight()); + if (((int) (getLocalRotation() / 90)) % 2 != 0) { + scale = GeometryMath.scale(pbounds.width(), pbounds.height(), getHeight(), getWidth()); + } float yoff = getHeight() / 2; float xoff = getWidth() / 2; float w = r.left * 2 + r.width(); @@ -449,7 +449,8 @@ public abstract class ImageGeometry extends ImageSlave { float scale = computeScale(getWidth(), getHeight()); float yoff = getHeight() / 2; float xoff = getWidth() / 2; - Matrix m = mLocalGeometry.buildGeometryMatrix(pbounds.width(), pbounds.height(), scale, xoff, yoff, 0); + Matrix m = mLocalGeometry.buildGeometryMatrix(pbounds.width(), pbounds.height(), scale, + xoff, yoff, 0); m.mapRect(bounds); return bounds; } @@ -544,15 +545,21 @@ public abstract class ImageGeometry extends ImageSlave { // TODO: Override this stub. } - protected RectF drawTransformed(Canvas canvas, Bitmap photo, Paint p){ + protected RectF drawTransformed(Canvas canvas, Bitmap photo, Paint p) { p.setARGB(255, 0, 0, 0); RectF photoBounds = getLocalPhotoBounds(); RectF cropBounds = getLocalCropBounds(); float scale = computeScale(getWidth(), getHeight()); + // checks if local rotation is an odd multiple of 90. + if (((int) (getLocalRotation() / 90)) % 2 != 0) { + scale = computeScale(getHeight(), getWidth()); + } // put in screen coordinates RectF scaledCrop = GeometryMath.scaleRect(cropBounds, scale); RectF scaledPhoto = GeometryMath.scaleRect(photoBounds, scale); - float [] displayCenter = { getWidth() / 2f, getHeight() / 2f }; + float[] displayCenter = { + getWidth() / 2f, getHeight() / 2f + }; Matrix m = GeometryMetadata.buildCenteredPhotoMatrix(scaledPhoto, scaledCrop, getLocalRotation(), getLocalStraighten(), getLocalFlip(), displayCenter); @@ -574,22 +581,27 @@ public abstract class ImageGeometry extends ImageSlave { return scaledCrop; } - protected void drawTransformedCropped(Canvas canvas, Bitmap photo, Paint p){ + protected void drawTransformedCropped(Canvas canvas, Bitmap photo, Paint p) { RectF photoBounds = getLocalPhotoBounds(); RectF cropBounds = getLocalCropBounds(); float imageWidth = cropBounds.width(); float imageHeight = cropBounds.height(); - float scale = getWidth() / imageWidth; - if (imageHeight > imageWidth) { - scale = getHeight() / imageHeight; + float scale = GeometryMath.scale(imageWidth, imageHeight, getWidth(), getHeight()); + // checks if local rotation is an odd multiple of 90. + if (((int) (getLocalRotation() / 90)) % 2 != 0) { + scale = GeometryMath.scale(imageWidth, imageHeight, getHeight(), getWidth()); } // put in screen coordinates RectF scaledCrop = GeometryMath.scaleRect(cropBounds, scale); RectF scaledPhoto = GeometryMath.scaleRect(photoBounds, scale); - float [] displayCenter = { getWidth() / 2f, getHeight() / 2f }; + float[] displayCenter = { + getWidth() / 2f, getHeight() / 2f + }; Matrix m1 = GeometryMetadata.buildWanderingCropMatrix(scaledPhoto, scaledCrop, getLocalRotation(), getLocalStraighten(), getLocalFlip(), displayCenter); - float [] cropCenter = { scaledCrop.centerX(), scaledCrop.centerY() }; + float[] cropCenter = { + scaledCrop.centerX(), scaledCrop.centerY() + }; m1.mapPoints(cropCenter); GeometryMetadata.concatRecenterMatrix(m1, cropCenter, displayCenter); m1.preRotate(getLocalStraighten(), scaledPhoto.centerX(), scaledPhoto.centerY()); diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java index b15723702..51476cc9a 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageShow.java @@ -405,7 +405,7 @@ public class ImageShow extends View implements OnGestureListener, mImageGeometryOnlyPreset = newPreset; mGeometryOnlyImage = null; } - } + } if (force || mImageFiltersOnlyPreset == null) { ImagePreset newPreset = new ImagePreset(preset); newPreset.setDoApplyGeometry(false); @@ -467,18 +467,15 @@ public class ImageShow extends View implements OnGestureListener, if (image != null) { Rect s = new Rect(0, 0, image.getWidth(), image.getHeight()); - float ratio = image.getWidth() - / (float) image.getHeight(); - float w = getWidth(); - float h = w / ratio; + + float scale = GeometryMath.scale(image.getWidth(), image.getHeight(), getWidth(), + getHeight()); + + float w = image.getWidth() * scale; + float h = image.getHeight() * scale; float ty = (getHeight() - h) / 2.0f; - float tx = 0; - if (ratio < 1.0f || (getHeight() < w)) { - h = getHeight(); - w = h * ratio; - tx = (getWidth() - w) / 2.0f; - ty = 0; - } + float tx = (getWidth() - w) / 2.0f; + Rect d = new Rect((int) tx, (int) ty, (int) (w + tx), (int) (h + ty)); mImageBounds = d; |