diff options
author | Mark Wei <markwei@google.com> | 2013-11-21 00:58:33 -0800 |
---|---|---|
committer | Mark Wei <markwei@google.com> | 2014-01-22 21:30:34 -0800 |
commit | 89e59f00d67791754e44e65413baa95f94056df4 (patch) | |
tree | 25c052346e9f118ed410eeffa58db0f104bbaf3b /src/com/android/bitmap/drawable | |
parent | 1ef4c6b7fdbc6e36c030e4a6fab3a8ccf8ba524b (diff) | |
download | bitmap-89e59f00d67791754e44e65413baa95f94056df4.tar.gz |
Decouple parallaxSpeedMultiplier from setDecodeDimensions().
Expose decode vertical center through ExtendedOptions.
Genericize BitmapDrawableImageView#getTypedDrawable().
Bug: 11691744
Change-Id: I62e05ab2136cf031eaf1752dba728156c97c87a6
Diffstat (limited to 'src/com/android/bitmap/drawable')
-rw-r--r-- | src/com/android/bitmap/drawable/BasicBitmapDrawable.java | 21 | ||||
-rw-r--r-- | src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java | 48 |
2 files changed, 54 insertions, 15 deletions
diff --git a/src/com/android/bitmap/drawable/BasicBitmapDrawable.java b/src/com/android/bitmap/drawable/BasicBitmapDrawable.java index 684d322..a09daad 100644 --- a/src/com/android/bitmap/drawable/BasicBitmapDrawable.java +++ b/src/com/android/bitmap/drawable/BasicBitmapDrawable.java @@ -119,10 +119,12 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback, * * All UI operations should be called from the UI thread. */ - public final void setDecodeDimensions(int w, int h) { - mDecodeWidth = w; - mDecodeHeight = h; - bind(mCurrKey); + public void setDecodeDimensions(int width, int height) { + if (mDecodeWidth == 0 || mDecodeHeight == 0) { + mDecodeWidth = width; + mDecodeHeight = height; + setImage(mCurrKey); + } } /** @@ -133,6 +135,9 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback, */ public void bind(RequestKey key) { Trace.beginSection("bind"); + if (mCurrKey != null && mCurrKey.equals(key)) { + return; + } setImage(key); Trace.endSection(); } @@ -153,10 +158,6 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback, * Should only be overriden, not called. */ protected void setImage(final RequestKey key) { - if (mCurrKey != null && mCurrKey.equals(key)) { - return; - } - Trace.beginSection("set image"); Trace.beginSection("release reference"); if (mBitmap != null) { @@ -282,6 +283,10 @@ public class BasicBitmapDrawable extends Drawable implements DecodeCallback, return NO_MULTIPLIER; } + /** + * Clients can override this to specify which section of the source image to decode from. + * Possible applications include using face detection to always decode around facial features. + */ protected float getDecodeVerticalCenter() { return VERTICAL_CENTER; } diff --git a/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java b/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java index 6d9f05f..b6093e7 100644 --- a/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java +++ b/src/com/android/bitmap/drawable/ExtendedBitmapDrawable.java @@ -61,7 +61,6 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements private final ExtendedOptions mOpts; // Parallax. - private static final float DECODE_VERTICAL_CENTER = 1f / 3; private float mParallaxFraction = 1f / 2; // State changes. @@ -157,12 +156,26 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements setLoadState(LOAD_STATE_FAILED); } + /** + * Directly sets the decode width and height. The given height should already have had the + * parallaxSpeedMultiplier applied to it. + */ + public void setExactDecodeDimensions(int width, int height) { + super.setDecodeDimensions(width, height); + } + + /** + * {@inheritDoc} + * + * The given height should not have had the parallaxSpeedMultiplier applied to it. + */ @Override - protected void setImage(final RequestKey key) { - if (mCurrKey != null && mCurrKey.equals(key)) { - return; - } + public void setDecodeDimensions(int width, int height) { + super.setDecodeDimensions(width, (int) (height * mOpts.parallaxSpeedMultiplier)); + } + @Override + protected void setImage(final RequestKey key) { if (mCurrKey != null && getDecodeAggregator() != null) { getDecodeAggregator().forget(mCurrKey); } @@ -212,13 +225,13 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements } @Override - protected float getDrawVerticalOffsetMultiplier() { + protected final float getDrawVerticalOffsetMultiplier() { return mOpts.parallaxSpeedMultiplier; } @Override protected float getDecodeVerticalCenter() { - return DECODE_VERTICAL_CENTER; + return mOpts.decodeVerticalCenter; } private DecodeAggregator getDecodeAggregator() { @@ -651,6 +664,23 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements public final int features; /** + * Optional field for general decoding. + * + * This field determines which section of the source image to decode from. A value of 0 + * indicates a preference for the very top of the source, while a value of 1 indicates a + * preference for the very bottom of the source. A value of .5 will result in the center + * of the source being decoded. + * + * This should not be confused with {@link #setParallaxFraction(float)}. This field + * determines the general section for decode. The parallax fraction then determines the + * slice from within that section for display. + * + * The default value of 1f / 3 provides a good heuristic for the subject's face in a + * portrait photo. + */ + public float decodeVerticalCenter = 1f / 3; + + /** * Required field if {@link #FEATURE_ORDERED_DISPLAY} is supported. */ public DecodeAggregator decodeAggregator = null; @@ -725,6 +755,10 @@ public class ExtendedBitmapDrawable extends BasicBitmapDrawable implements */ private void validate() throws IllegalStateException { + if (decodeVerticalCenter < 0 || decodeVerticalCenter > 1) { + throw new IllegalStateException( + "ExtendedOptions: decodeVerticalCenter must be within 0 and 1, inclusive"); + } if ((features & FEATURE_ORDERED_DISPLAY) != 0 && decodeAggregator == null) { throw new IllegalStateException( "ExtendedOptions: To support FEATURE_ORDERED_DISPLAY, " |