Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Unified Diff: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/FadingShadow.java

Issue 1141283003: Upstream oodles of Chrome for Android code into Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: final patch? Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java_staging/src/org/chromium/chrome/browser/widget/FadingShadow.java
diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/FadingShadow.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/FadingShadow.java
new file mode 100644
index 0000000000000000000000000000000000000000..8022051600c0deaae55f9b9ae5677d72ac0261b6
--- /dev/null
+++ b/chrome/android/java_staging/src/org/chromium/chrome/browser/widget/FadingShadow.java
@@ -0,0 +1,91 @@
+// 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.Canvas;
+import android.graphics.Color;
+import android.graphics.LinearGradient;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Shader;
+import android.view.View;
+
+/**
+ * This class draws a variable-sized shadow at the top or bottom edge of a view. This is just like
+ * a fading edge, except that the shadow color can have an alpha component, whereas a fading edge
+ * color must be opaque.
+ */
+public class FadingShadow {
+
+ public static final int POSITION_TOP = 0;
+ public static final int POSITION_BOTTOM = 1;
+
+ private static final int SMOOTH_ALGORITHM_INTERPOLATION_POINTS_NUM = 8;
+
+ private Paint mShadowPaint = new Paint();
+ private Matrix mShadowMatrix = new Matrix();
+ private Shader mShadowShader;
+
+ /**
+ * @param shadowColor The color of the shadow, e.g. 0x11000000.
+ */
+ public FadingShadow(int shadowColor) {
+ final int n = SMOOTH_ALGORITHM_INTERPOLATION_POINTS_NUM;
+ float[] positions = new float[n];
+ int[] colors = new int[n];
+ int transparentShadowColor = shadowColor & 0x00FFFFFF;
+ int shadowAlpha = Color.alpha(shadowColor);
+
+ // Piece-wise linear interpolation of the smooth cubic function below.
+ for (int i = 0; i < n; ++i) {
+ float x = (float) i / (n - 1);
+ // Polynomial computation by Estrin's scheme.
+ float value = (1.0f - 2.2f * x) + (1.8f - 0.6f * x) * (x * x);
+
+ positions[i] = x;
+ colors[i] = (Math.round(shadowAlpha * value) << 24) | transparentShadowColor;
+ }
+
+ mShadowShader = new LinearGradient(0, 0, 0, 1, colors, positions, Shader.TileMode.CLAMP);
+
+ }
+
+ /**
+ * Draws a shadow at the top or bottom of a view. This should be called from dispatchDraw() so
+ * the shadow is drawn on top of the view's children.
+ *
+ * @param view The View in which to draw the shadow.
+ * @param canvas The canvas on which to draw.
+ * @param position Where to draw the shadow: either POSITION_TOP or POSITION_BOTTOM.
+ * @param shadowHeight The maximum height of the shadow, in pixels.
+ * @param shadowStrength A value between 0 and 1 indicating the relative size of the shadow. 0
+ * means no shadow at all. 1 means a full height shadow.
+ */
+ public void drawShadow(View view, Canvas canvas, int position, float shadowHeight,
+ float shadowStrength) {
+ float scaledShadowHeight = Math.max(0.0f, Math.min(1.0f, shadowStrength)) * shadowHeight;
+ if (scaledShadowHeight < 1.0f) return;
+
+ int left = view.getScrollX();
+ int right = left + view.getRight();
+
+ if (position == POSITION_BOTTOM) {
+ int bottom = view.getScrollY() + view.getBottom() - view.getTop();
+ mShadowMatrix.setScale(1, scaledShadowHeight);
+ mShadowMatrix.postRotate(180);
+ mShadowMatrix.postTranslate(left, bottom);
+ mShadowShader.setLocalMatrix(mShadowMatrix);
+ mShadowPaint.setShader(mShadowShader);
+ canvas.drawRect(left, bottom - scaledShadowHeight, right, bottom, mShadowPaint);
+ } else if (position == POSITION_TOP) {
+ int top = view.getScrollY();
+ mShadowMatrix.setScale(1, scaledShadowHeight);
+ mShadowMatrix.postTranslate(left, top);
+ mShadowShader.setLocalMatrix(mShadowMatrix);
+ mShadowPaint.setShader(mShadowShader);
+ canvas.drawRect(left, top, right, top + scaledShadowHeight, mShadowPaint);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698