fix bitmapinfo



git-svn-id: http://skia.googlecode.com/svn/trunk@1744 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/utils/mac/SkCreateCGImageRef.cpp b/src/utils/mac/SkCreateCGImageRef.cpp
index ccc2199..d41de18 100644
--- a/src/utils/mac/SkCreateCGImageRef.cpp
+++ b/src/utils/mac/SkCreateCGImageRef.cpp
@@ -11,29 +11,34 @@
     (SK_A32_SHIFT == (a) && SK_R32_SHIFT == (r) \
     && SK_G32_SHIFT == (g) && SK_B32_SHIFT == (b))
 
-static SkBitmap* prepareForImageRef(const SkBitmap& bm,
-                                    size_t* bitsPerComponent,
-                                    CGBitmapInfo* info) {
-    bool upscaleTo32 = false;
-
+static bool getBitmapInfo(const SkBitmap& bm, 
+                          size_t* bitsPerComponent,
+                          CGBitmapInfo* info,
+                          bool* upscaleTo32) {
+    if (upscaleTo32) {
+        *upscaleTo32 = false;
+    }
+    
     switch (bm.config()) {
         case SkBitmap::kRGB_565_Config:
-            upscaleTo32 = true;
+            if (upscaleTo32) {
+                *upscaleTo32 = true;
+            }
             // fall through
         case SkBitmap::kARGB_8888_Config:
             *bitsPerComponent = 8;
 #if defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 0, 8, 16) \
- || defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(0, 24, 16, 8)
+|| defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(0, 24, 16, 8)
             *info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast;
 #elif defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0) \
-   || defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0)
+|| defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0)
             // Matches the CGBitmapInfo that Apple recommends for best
             // performance, used by google chrome.
             *info = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
 #else
-// ...add more formats as required...
+            // ...add more formats as required...
 #warning Cannot convert SkBitmap to CGImageRef with these shiftmasks. \
-            This will probably not work.
+This will probably not work.
             // Legacy behavior. Perhaps turn this into an error at some
             // point.
             *info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast;
@@ -51,7 +56,17 @@
             *info = kCGBitmapByteOrder16Little | kCGImageAlphaPremultipliedLast;
             break;
         default:
-            return NULL;
+            return false;
+    }
+    return true;
+}
+
+static SkBitmap* prepareForImageRef(const SkBitmap& bm,
+                                    size_t* bitsPerComponent,
+                                    CGBitmapInfo* info) {
+    bool upscaleTo32;
+    if (!getBitmapInfo(bm, bitsPerComponent, info, &upscaleTo32)) {
+        return NULL;
     }
 
     SkBitmap* copy;
@@ -172,15 +187,19 @@
     
     int w = (int)CGRectGetWidth(bounds);
     int h = (int)CGRectGetHeight(bounds);
-    
+        
     SkBitmap bitmap;
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, w, h);
     bitmap.allocPixels();
     bitmap.eraseColor(SK_ColorWHITE);
+
+    size_t bitsPerComponent;
+    CGBitmapInfo info;
+    getBitmapInfo(bitmap, &bitsPerComponent, &info, NULL); 
     
-    CGBitmapInfo info = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
     CGContextRef ctx = CGBitmapContextCreateWithData(bitmap.getPixels(),
-                                                     w, h, 8, bitmap.rowBytes(),
+                                                     w, h, bitsPerComponent,
+                                                     bitmap.rowBytes(),
                                                      CGColorSpaceCreateDeviceRGB(),
                                                      info, NULL, NULL);
     if (ctx) {