summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorRuben Brunk <rubenbrunk@google.com>2012-10-23 18:11:10 -0700
committerRuben Brunk <rubenbrunk@google.com>2012-10-23 21:32:43 -0700
commit026dabdcb13bd0095a970af8e1a05741f801db50 (patch)
tree79864c73cc56384ca3cc7b7369c152074104f93b /src/com
parent57cc382afb777db41002619da6f4762f4251bb59 (diff)
downloadandroid_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')
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java6
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java11
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageGeometry.java46
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageShow.java21
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;