add (hidden) setHasAlpha() to allow clients like the view's cache to hint that a bitmap is opaque.
Knowing that a 32bit bitmap is opaque is a performance boost for some blits.
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 8d52917..0f1b845 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -317,6 +317,11 @@
return !bitmap->isOpaque();
}
+static void Bitmap_setHasAlpha(JNIEnv* env, jobject, SkBitmap* bitmap,
+ jboolean hasAlpha) {
+ bitmap->setIsOpaque(!hasAlpha);
+}
+
///////////////////////////////////////////////////////////////////////////////
static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
@@ -546,6 +551,7 @@
{ "nativeRowBytes", "(I)I", (void*)Bitmap_rowBytes },
{ "nativeConfig", "(I)I", (void*)Bitmap_config },
{ "nativeHasAlpha", "(I)Z", (void*)Bitmap_hasAlpha },
+ { "nativeSetHasAlpha", "(IZ)V", (void*)Bitmap_setHasAlpha },
{ "nativeCreateFromParcel",
"(Landroid/os/Parcel;)Landroid/graphics/Bitmap;",
(void*)Bitmap_createFromParcel },
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 216dea0..5aa88b0 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -684,12 +684,35 @@
return Config.nativeToConfig(nativeConfig(mNativeBitmap));
}
- /** Returns true if the bitmap's pixels support levels of alpha */
+ /** Returns true if the bitmap's config supports per-pixel alpha, and
+ * if the pixels may contain non-opaque alpha values. For some configs,
+ * this is always false (e.g. RGB_565), since they do not support per-pixel
+ * alpha. However, for configs that do, the bitmap may be flagged to be
+ * known that all of its pixels are opaque. In this case hasAlpha() will
+ * also return false. If a config such as ARGB_8888 is not so flagged,
+ * it will return true by default.
+ */
public final boolean hasAlpha() {
return nativeHasAlpha(mNativeBitmap);
}
/**
+ * Tell the bitmap if all of the pixels are known to be opaque (false)
+ * or if some of the pixels may contain non-opaque alpha values (true).
+ * Note, for some configs (e.g. RGB_565) this call is ignore, since it does
+ * not support per-pixel alpha values.
+ *
+ * This is meant as a drawing hint, as in some cases a bitmap that is known
+ * to be opaque can take a faster drawing case than one that may have
+ * non-opaque per-pixel alpha values.
+ *
+ * @hide
+ */
+ public void setHasAlpha(boolean hasAlpha) {
+ nativeSetHasAlpha(mNativeBitmap, hasAlpha);
+ }
+
+ /**
* Fills the bitmap's pixels with the specified {@link Color}.
*
* @throws IllegalStateException if the bitmap is not mutable.
@@ -1018,6 +1041,7 @@
int[] offsetXY);
private static native void nativePrepareToDraw(int nativeBitmap);
+ private static native void nativeSetHasAlpha(int nBitmap, boolean hasAlpha);
/* package */ final int ni() {
return mNativeBitmap;