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;