make info real in SkPixelRef, and add bitmap::asImageInfo

BUG=
R=scroggo@google.com

Review URL: https://codereview.chromium.org/108663004

git-svn-id: http://skia.googlecode.com/svn/trunk/src@12586 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/core/SkBitmap.cpp b/core/SkBitmap.cpp
index 7e204f2..25a6b1d 100644
--- a/core/SkBitmap.cpp
+++ b/core/SkBitmap.cpp
@@ -361,6 +361,48 @@
     }
 }
 
+static bool config_to_colorType(SkBitmap::Config config, SkColorType* ctOut) {
+    SkColorType ct;
+    switch (config) {
+        case SkBitmap::kA8_Config:
+            ct = kAlpha_8_SkColorType;
+            break;
+        case SkBitmap::kIndex8_Config:
+            ct = kIndex_8_SkColorType;
+            break;
+        case SkBitmap::kRGB_565_Config:
+            ct = kRGB_565_SkColorType;
+            break;
+        case SkBitmap::kARGB_4444_Config:
+            ct = kARGB_4444_SkColorType;
+            break;
+        case SkBitmap::kARGB_8888_Config:
+            ct = kPMColor_SkColorType;
+            break;
+        case SkBitmap::kNo_Config:
+        default:
+            return false;
+    }
+    if (ctOut) {
+        *ctOut = ct;
+    }
+    return true;
+}
+
+bool SkBitmap::asImageInfo(SkImageInfo* info) const {
+    SkColorType ct;
+    if (!config_to_colorType(this->config(), &ct)) {
+        return false;
+    }
+    if (info) {
+        info->fWidth = fWidth;
+        info->fHeight = fHeight;
+        info->fAlphaType = this->alphaType();
+        info->fColorType = ct;
+    }
+    return true;
+}
+
 SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, size_t offset) {
     // do this first, we that we never have a non-zero offset with a null ref
     if (NULL == pr) {
diff --git a/image/SkImagePriv.cpp b/image/SkImagePriv.cpp
index f1916c6..1e24c48 100644
--- a/image/SkImagePriv.cpp
+++ b/image/SkImagePriv.cpp
@@ -14,13 +14,16 @@
         case kAlpha_8_SkColorType:
             return SkBitmap::kA8_Config;
 
+        case kARGB_4444_SkColorType:
+            return SkBitmap::kARGB_4444_Config;
+            
         case kRGB_565_SkColorType:
             return SkBitmap::kRGB_565_Config;
-
+            
         case kPMColor_SkColorType:
             return SkBitmap::kARGB_8888_Config;
 
-        case kIndex8_SkColorType:
+        case kIndex_8_SkColorType:
             return SkBitmap::kIndex8_Config;
 
         default:
@@ -30,52 +33,9 @@
     return SkBitmap::kNo_Config;
 }
 
-int SkImageBytesPerPixel(SkColorType ct) {
-    static const uint8_t gColorTypeBytesPerPixel[] = {
-        1,  // kAlpha_8_SkColorType
-        2,  // kRGB_565_SkColorType
-        4,  // kRGBA_8888_SkColorType
-        4,  // kBGRA_8888_SkColorType
-        4,  // kPMColor_SkColorType
-        1,  // kIndex8_SkColorType
-    };
-
-    SkASSERT((size_t)ct < SK_ARRAY_COUNT(gColorTypeBytesPerPixel));
-    return gColorTypeBytesPerPixel[ct];
-}
-
-bool SkBitmapToImageInfo(const SkBitmap& bm, SkImageInfo* info) {
-    switch (bm.config()) {
-        case SkBitmap::kA8_Config:
-            info->fColorType = kAlpha_8_SkColorType;
-            break;
-
-        case SkBitmap::kIndex8_Config:
-            info->fColorType = kIndex8_SkColorType;
-            break;
-
-        case SkBitmap::kRGB_565_Config:
-            info->fColorType = kRGB_565_SkColorType;
-            break;
-
-        case SkBitmap::kARGB_8888_Config:
-            info->fColorType = kPMColor_SkColorType;
-            break;
-
-        default:
-            return false;
-    }
-
-    info->fWidth = bm.width();
-    info->fHeight = bm.height();
-    info->fAlphaType = bm.isOpaque() ? kOpaque_SkAlphaType :
-                                       kPremul_SkAlphaType;
-    return true;
-}
-
 SkImage* SkNewImageFromBitmap(const SkBitmap& bm, bool canSharePixelRef) {
     SkImageInfo info;
-    if (!SkBitmapToImageInfo(bm, &info)) {
+    if (!bm.asImageInfo(&info)) {
         return NULL;
     }
 
diff --git a/image/SkImagePriv.h b/image/SkImagePriv.h
index 188b16d..bf28f59 100644
--- a/image/SkImagePriv.h
+++ b/image/SkImagePriv.h
@@ -15,10 +15,6 @@
 
 extern SkBitmap::Config SkImageInfoToBitmapConfig(const SkImageInfo&);
 
-extern int SkImageBytesPerPixel(SkColorType);
-
-extern bool SkBitmapToImageInfo(const SkBitmap&, SkImageInfo*);
-
 // Call this if you explicitly want to use/share this pixelRef in the image
 extern SkImage* SkNewImageFromPixelRef(const SkImageInfo&, SkPixelRef*,
                                        size_t rowBytes);
@@ -48,8 +44,7 @@
 extern SkImage* SkNewImageFromPicture(const SkPicture*);
 
 static inline size_t SkImageMinRowBytes(const SkImageInfo& info) {
-    size_t rb = info.fWidth * SkImageBytesPerPixel(info.fColorType);
-    return SkAlign4(rb);
+    return SkAlign4(info.minRowBytes());
 }
 
 // Given an image created from SkNewImageFromBitmap, return its pixelref. This
diff --git a/images/SkDecodingImageGenerator.cpp b/images/SkDecodingImageGenerator.cpp
index 2b80444..e49f9a4 100644
--- a/images/SkDecodingImageGenerator.cpp
+++ b/images/SkDecodingImageGenerator.cpp
@@ -119,11 +119,9 @@
     if (bitmap.config() == SkBitmap::kNo_Config) {
         return false;
     }
-    if (!SkBitmapToImageInfo(bitmap, &fInfo)) {
+    if (!bitmap.asImageInfo(&fInfo)) {
         // We can't use bitmap.config() as is.
-        // Must be kARGB_4444_Config.
         if (!bitmap.canCopyTo(SkBitmap::kARGB_8888_Config)) {
-            // kARGB_4444_Config can copy to kARGB_8888.
             SkDEBUGFAIL("!bitmap->canCopyTo(SkBitmap::kARGB_8888_Config)");
             return false;
         }