Index: AndroidManifest.xml =================================================================== --- AndroidManifest.xml (revision 9) +++ AndroidManifest.xml (working copy) @@ -21,6 +21,7 @@ android:installLocation="internalOnly"> viewAspect) { - float scale = targetHeight / bitmapHeightF; - if (scale < .9F || scale > 1F) { - scaler.setScale(scale, scale); + if (crop) { + if (bitmapAspect > viewAspect) { + float scale = targetHeight / bitmapHeightF; + if (scale < .9F || scale > 1F) { + scaler.setScale(scale, scale); + } else { + scaler = null; + } } else { - scaler = null; + float scale = targetWidth / bitmapWidthF; + if (scale < .9F || scale > 1F) { + scaler.setScale(scale, scale); + } else { + scaler = null; + } } } else { - float scale = targetWidth / bitmapWidthF; - if (scale < .9F || scale > 1F) { - scaler.setScale(scale, scale); - } else { - scaler = null; - } + float scale = (bitmapAspect > viewAspect) ? + targetWidth / bitmapWidthF : targetHeight / bitmapHeightF; + scaler.setScale(scale, scale); } Bitmap b1; @@ -199,16 +190,21 @@ source.recycle(); } - int dx1 = Math.max(0, b1.getWidth() - targetWidth); - int dy1 = Math.max(0, b1.getHeight() - targetHeight); + Bitmap b2; + if (crop) { + int dx1 = Math.max(0, b1.getWidth() - targetWidth); + int dy1 = Math.max(0, b1.getHeight() - targetHeight); + b2 = Bitmap.createBitmap(b1, + dx1 / 2, + dy1 / 2, + targetWidth, + targetHeight); + } else { + b2 = drawBitmapInBlackRectangle(targetWidth, + targetHeight, + b1); + } - Bitmap b2 = Bitmap.createBitmap( - b1, - dx1 / 2, - dy1 / 2, - targetWidth, - targetHeight); - if (b2 != b1) { if (recycle || b1 != source) { b1.recycle(); @@ -218,6 +214,32 @@ return b2; } + private static Bitmap drawBitmapInBlackRectangle(int targetWidth, + int targetHeight, + Bitmap bitmap) { + Bitmap res = Bitmap.createBitmap(targetWidth, targetHeight, + Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(res); + + int deltaX = bitmap.getWidth() - targetWidth; + int deltaY = bitmap.getHeight() - targetHeight; + int deltaXHalf = Math.max(0, deltaX / 2); + int deltaYHalf = Math.max(0, deltaY / 2); + Rect src = new Rect(deltaXHalf, + deltaYHalf, + deltaXHalf + Math.min(targetWidth, bitmap.getWidth()), + deltaYHalf + Math.min(targetHeight, bitmap.getHeight())); + int dstX = (targetWidth - src.width()) / 2; + int dstY = (targetHeight - src.height()) / 2; + Rect dst = new Rect( + dstX, + dstY, + targetWidth - dstX, + targetHeight - dstY); + c.drawBitmap(bitmap, src, dst, null); + return res; + } + /** * Make a bitmap from a given Uri. * @@ -235,8 +257,9 @@ return null; } - options.inSampleSize = computeSampleSize( - options, minSideLength, maxNumOfPixels); + options.inSampleSize = computeSampleSize(options, + minSideLength, + maxNumOfPixels); options.inJustDecodeBounds = false; //options.inDither = false; //options.inPreferredConfig = Bitmap.Config.ARGB_8888; @@ -285,4 +308,4 @@ } } -} \ No newline at end of file +} Index: src/com/birbeck/wallpaperslideshow/WallpaperSlideshow.java =================================================================== --- src/com/birbeck/wallpaperslideshow/WallpaperSlideshow.java (revision 9) +++ src/com/birbeck/wallpaperslideshow/WallpaperSlideshow.java (working copy) @@ -92,6 +92,7 @@ private String mFolder = null; private int mDuration = 0; private boolean mRandom = false; + private boolean mCrop = false; private boolean mRotate = false; private boolean mScroll = false; private boolean mRecurse = false; @@ -255,6 +256,9 @@ mRandom = sharedPreferences.getBoolean( res.getString(R.string.preferences_random_key), Boolean.valueOf(res.getString(R.string.preferences_random_default))); + mCrop = sharedPreferences.getBoolean( + res.getString(R.string.preferences_crop_key), + Boolean.valueOf(res.getString(R.string.preferences_crop_default))); mRotate = sharedPreferences.getBoolean( res.getString(R.string.preferences_rotate_key), Boolean.valueOf(res.getString(R.string.preferences_rotate_default))); @@ -282,6 +286,9 @@ } else if (key.equals(res.getString(R.string.preferences_random_key))) { mRandom = sharedPreferences.getBoolean(key, Boolean.valueOf(res.getString(R.string.preferences_random_default))); + } else if (key.equals(res.getString(R.string.preferences_crop_key))) { + mCrop = sharedPreferences.getBoolean(key, + Boolean.valueOf(res.getString(R.string.preferences_crop_default))); } else if (key.equals(res.getString(R.string.preferences_rotate_key))) { mRotate = sharedPreferences.getBoolean(key, Boolean.valueOf(res.getString(R.string.preferences_rotate_default))); @@ -408,8 +415,8 @@ int targetWidth = (mScroll)? mMinWidth: mWidth; int targetHeight = (mScroll)? mMinHeight: mHeight; - Bitmap bitmap = BitmapUtil.makeBitmap(Math.max(mMinWidth, mMinHeight), - mMinWidth * mMinHeight, file, null); + Bitmap bitmap = BitmapUtil.makeBitmap(Math.max(mWidth, mHeight), + mWidth * mHeight, file, null); if (bitmap == null) { return Bitmap.createBitmap(targetWidth, targetHeight, @@ -435,7 +442,7 @@ // Scale bitmap if (width != targetWidth || height != targetHeight) { bitmap = BitmapUtil.transform(mScaler, bitmap, - targetWidth, targetHeight, true, true); + targetWidth, targetHeight, true, mCrop, true); } return bitmap; @@ -469,4 +476,4 @@ private static final long serialVersionUID = 1L; } -} \ No newline at end of file +} Index: res/values/preferences.xml =================================================================== --- res/values/preferences.xml (revision 9) +++ res/values/preferences.xml (working copy) @@ -59,6 +59,11 @@ Display photos in random order instead of sequentially false + crop + Crop + Crop photos to make them fill whole screen + true + rotate Do not rotate Keep original screen orientation of photos Index: res/xml/preferences.xml =================================================================== --- res/xml/preferences.xml (revision 9) +++ res/xml/preferences.xml (working copy) @@ -47,6 +47,12 @@ android:summary="@string/preferences_random_summary" android:defaultValue="@string/preferences_random_default" /> + + - \ No newline at end of file +