Index: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/CustomShapeDrawable.java |
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/CustomShapeDrawable.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/CustomShapeDrawable.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..344a3726907fcfe913e53cceb1d832d81676d9a8 |
--- /dev/null |
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/CustomShapeDrawable.java |
@@ -0,0 +1,184 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.chrome.browser.widget; |
+ |
+import android.graphics.Bitmap; |
+import android.graphics.BitmapShader; |
+import android.graphics.Canvas; |
+import android.graphics.Color; |
+import android.graphics.ColorFilter; |
+import android.graphics.Matrix; |
+import android.graphics.Paint; |
+import android.graphics.PixelFormat; |
+import android.graphics.PorterDuff; |
+import android.graphics.PorterDuffColorFilter; |
+import android.graphics.Rect; |
+import android.graphics.RectF; |
+import android.graphics.Shader; |
+import android.graphics.drawable.Drawable; |
+ |
+import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkSalientImageView.BaseSalientDrawable; |
+ |
+/** |
+ * Base class for drawables that are to control what shape they take. |
+ */ |
+public abstract class CustomShapeDrawable extends Drawable { |
+ |
+ /** |
+ * Circular drawable that makes a round mask on top of bitmap. |
+ */ |
+ public static class CircularDrawable extends CustomShapeDrawable { |
+ /** |
+ * Create a drawable based on the bitmap of the salient image. |
+ */ |
+ public CircularDrawable(Bitmap bitmap) { |
+ super(bitmap); |
+ } |
+ |
+ /** |
+ * Create a drawable based on the pure color. |
+ */ |
+ public CircularDrawable(int color) { |
+ super(color); |
+ } |
+ |
+ @Override |
+ protected void onBoundsChange(Rect bounds) { |
+ mRect.set(0, 0, bounds.width(), bounds.height()); |
+ super.onBoundsChange(bounds); |
+ } |
+ |
+ @Override |
+ public void draw(Canvas canvas) { |
+ canvas.drawCircle(mRect.centerX(), mRect.centerY(), mRect.height() * 0.5f, mPaint); |
+ } |
+ } |
+ |
+ /** |
+ * A {@link CircularDrawable} with dark background. |
+ */ |
+ public static class DarkBackgroundCircularDrawable extends CircularDrawable { |
+ private static final int FOLDER_CIRCLE_BACKGROUND_COLOR = Color.parseColor("#9E9E9E"); |
+ private Paint mBackgroundPaint = new Paint(); |
+ |
+ public DarkBackgroundCircularDrawable(Bitmap bitmap) { |
+ super(bitmap); |
+ shouldScale(false); |
+ mBackgroundPaint.setColor(FOLDER_CIRCLE_BACKGROUND_COLOR); |
+ mBackgroundPaint.setAntiAlias(true); |
+ mPaint.setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)); |
+ } |
+ |
+ @Override |
+ public void draw(Canvas canvas) { |
+ canvas.drawCircle(mRect.centerX(), mRect.centerY(), mRect.height() * 0.5f, |
+ mBackgroundPaint); |
+ super.draw(canvas); |
+ } |
+ } |
+ |
+ /** |
+ * Drawable that has rounded top corners, with image or pure color as content. |
+ */ |
+ public static class TopRoundedCornerDrawable extends BaseSalientDrawable { |
+ private final float mRadius; |
+ |
+ /** |
+ * Create a drawable based on bitmap of salient image as well as radius. |
+ */ |
+ public TopRoundedCornerDrawable(Bitmap bitmap, float radius) { |
+ super(bitmap); |
+ mRadius = radius; |
+ } |
+ |
+ /** |
+ * Create a drawable based on the pure color as well as radius. |
+ */ |
+ public TopRoundedCornerDrawable(int color, float radius) { |
+ super(color); |
+ mRadius = radius; |
+ } |
+ |
+ @Override |
+ protected void onBoundsChange(Rect bounds) { |
+ // We avoid drawing bottom corners just by making it taller by the radius. |
+ mRect.set(0, 0, bounds.width(), bounds.height() + mRadius); |
+ super.onBoundsChange(bounds); |
+ } |
+ |
+ @Override |
+ public void draw(Canvas canvas) { |
+ canvas.drawRoundRect(mRect, mRadius, mRadius, mPaint); |
+ } |
+ } |
+ |
+ protected RectF mRect = new RectF(); |
+ protected Paint mPaint = new Paint(); |
+ private int mBitmapWidth; |
+ private int mBitmapHeight; |
+ private boolean mShouldScale = true; |
+ |
+ @Override |
+ protected void onBoundsChange(Rect bounds) { |
+ // Subclasses must override this function. It should first set up correct boundary of |
+ // mRect and then call super.onBoundsChange(). |
+ if (mBitmapWidth > 0 && mBitmapHeight > 0) { |
+ BitmapShader shader = (BitmapShader) mPaint.getShader(); |
+ |
+ float scale = 1.0f; |
+ if (mShouldScale) { |
+ scale = Math.max((float) bounds.width() / mBitmapWidth, |
+ (float) bounds.height() / mBitmapHeight); |
+ } |
+ float dx = (bounds.width() - mBitmapWidth * scale) * 0.5f + bounds.left; |
+ float dy = (bounds.height() - mBitmapHeight * scale) * 0.5f + bounds.top; |
+ |
+ Matrix matrix = new Matrix(); |
+ matrix.setScale(scale, scale); |
+ matrix.postTranslate(dx, dy); |
+ shader.setLocalMatrix(matrix); |
+ } |
+ } |
+ |
+ protected CustomShapeDrawable(Bitmap bitmap) { |
+ mPaint.setAntiAlias(true); |
+ mPaint.setShader( |
+ new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); |
+ mBitmapWidth = bitmap.getWidth(); |
+ mBitmapHeight = bitmap.getHeight(); |
+ } |
+ |
+ protected CustomShapeDrawable(int color) { |
+ mPaint.setAntiAlias(true); |
+ mPaint.setColor(color); |
+ mBitmapWidth = 0; |
+ mBitmapHeight = 0; |
+ } |
+ |
+ /** |
+ * @param shouldScale True to let bitmap be scaled to match the size of |
+ * the drawable. False to let it maintain its original size, |
+ * regardless of the size of the drawable. |
+ */ |
+ public void shouldScale(boolean shouldScale) { |
+ mShouldScale = shouldScale; |
+ } |
+ |
+ @Override |
+ public int getOpacity() { |
+ return PixelFormat.TRANSLUCENT; |
+ } |
+ |
+ @Override |
+ public void setAlpha(int alpha) { |
+ mPaint.setAlpha(alpha); |
+ } |
+ |
+ @Override |
+ public void setColorFilter(ColorFilter cf) { |
+ mPaint.setColorFilter(cf); |
+ } |
+ |
+} |