replace SkBitmap::Config with SkColorType in gms

add helper installMaskPixels() to SkBitmap

BUG=skia:
R=halcanary@google.com

Author: reed@google.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@13482 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/bitmapfilters.cpp b/gm/bitmapfilters.cpp
index 5856f87..7addf25 100644
--- a/gm/bitmapfilters.cpp
+++ b/gm/bitmapfilters.cpp
@@ -20,8 +20,9 @@
     }
     SkColorTable* ctable = new SkColorTable(colorsPM, 4);
 
-    bm->setConfig(SkBitmap::kIndex8_Config, 2, 2);
-    bm->allocPixels(ctable);
+    bm->allocPixels(SkImageInfo::Make(2, 2, kIndex_8_SkColorType,
+                                      kPremul_SkAlphaType),
+                    NULL, ctable);
     ctable->unref();
 
     *bm->getAddr8(0, 0) = 0;
diff --git a/gm/bitmappremul.cpp b/gm/bitmappremul.cpp
index 57d22d7..fd563eb 100644
--- a/gm/bitmappremul.cpp
+++ b/gm/bitmappremul.cpp
@@ -22,14 +22,15 @@
 static const int PIXEL_SIZE_8888 = SLIDE_SIZE / 256;
 static const int PIXEL_SIZE_4444 = SLIDE_SIZE / 16;
 
-static void init_bitmap(SkBitmap::Config config, SkBitmap* bitmap) {
-    bitmap->allocConfigPixels(config, SLIDE_SIZE, SLIDE_SIZE);
+static void init_bitmap(SkColorType ct, SkBitmap* bitmap) {
+    bitmap->allocPixels(SkImageInfo::Make(SLIDE_SIZE, SLIDE_SIZE, ct,
+                                          kPremul_SkAlphaType));
     bitmap->eraseColor(SK_ColorWHITE);
 }
 
 static SkBitmap make_argb8888_gradient() {
     SkBitmap bitmap;
-    init_bitmap(SkBitmap::kARGB_8888_Config, &bitmap);
+    init_bitmap(kPMColor_SkColorType, &bitmap);
     uint8_t rowColor = 0;
     for (int y = 0; y < SLIDE_SIZE; y++) {
         uint32_t* dst = bitmap.getAddr32(0, y);
@@ -46,7 +47,7 @@
 
 static SkBitmap make_argb4444_gradient() {
     SkBitmap bitmap;
-    init_bitmap(SkBitmap::kARGB_4444_Config, &bitmap);
+    init_bitmap(kARGB_4444_SkColorType, &bitmap);
     uint8_t rowColor = 0;
     for (int y = 0; y < SLIDE_SIZE; y++) {
         uint16_t* dst = bitmap.getAddr16(0, y);
@@ -63,7 +64,7 @@
 
 static SkBitmap make_argb8888_stripes() {
     SkBitmap bitmap;
-    init_bitmap(SkBitmap::kARGB_8888_Config, &bitmap);
+    init_bitmap(kPMColor_SkColorType, &bitmap);
     uint8_t rowColor = 0;
     for (int y = 0; y < SLIDE_SIZE; y++) {
         uint32_t* dst = bitmap.getAddr32(0, y);
@@ -82,7 +83,7 @@
 
 static SkBitmap make_argb4444_stripes() {
     SkBitmap bitmap;
-    init_bitmap(SkBitmap::kARGB_4444_Config, &bitmap);
+    init_bitmap(kARGB_4444_SkColorType, &bitmap);
     uint8_t rowColor = 0;;
     for (int y = 0; y < SLIDE_SIZE; y++) {
         uint16_t* dst = bitmap.getAddr16(0, y);
diff --git a/gm/bitmapshader.cpp b/gm/bitmapshader.cpp
index d1915c9..4649b7e 100644
--- a/gm/bitmapshader.cpp
+++ b/gm/bitmapshader.cpp
@@ -28,7 +28,7 @@
     SkPaint circlePaint;
     circlePaint.setColor(SK_ColorBLACK);
 
-    bm->allocConfigPixels(SkBitmap::kA8_Config, 20, 20);
+    bm->allocPixels(SkImageInfo::MakeA8(20, 20));
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas canvas(*bm);
diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index 3197eb6..52edd6a 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -197,8 +197,7 @@
         SkAutoMaskFreeImage amfi(mask.fImage);
 
         SkBitmap bm;
-        bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(), mask.fBounds.height());
-        bm.setPixels(mask.fImage);
+        bm.installMaskPixels(mask);
 
         center_x = (canvas_size.fWidth - mask.fBounds.width())/2;
         center_y = (canvas_size.fHeight - mask.fBounds.height())/2;
diff --git a/gm/drawbitmaprect.cpp b/gm/drawbitmaprect.cpp
index 31cba51..664958a 100644
--- a/gm/drawbitmaprect.cpp
+++ b/gm/drawbitmaprect.cpp
@@ -28,8 +28,8 @@
     return bm;
 }
 
-static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
-    bm->allocConfigPixels(config, w, h);
+static void makebm(SkBitmap* bm, int w, int h) {
+    bm->allocN32Pixels(w, h);
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas    canvas(*bm);
@@ -89,9 +89,7 @@
     virtual void onDraw(SkCanvas* canvas) {
         static const int kBmpSize = 2048;
         if (fLargeBitmap.isNull()) {
-            makebm(&fLargeBitmap,
-                   SkBitmap::kARGB_8888_Config,
-                   kBmpSize, kBmpSize);
+            makebm(&fLargeBitmap, kBmpSize, kBmpSize);
         }
         SkRect dstRect = { 0, 0, SkIntToScalar(64), SkIntToScalar(64)};
         static const int kMaxSrcRectSize = 1 << (SkNextLog2(kBmpSize) + 2);
diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp
index 687ee45..d6457ab 100644
--- a/gm/gmmain.cpp
+++ b/gm/gmmain.cpp
@@ -265,16 +265,16 @@
        otherwise on compare we may not get a perfect match.
     */
     static void force_all_opaque(const SkBitmap& bitmap) {
-        SkBitmap::Config config = bitmap.config();
-        switch (config) {
-        case SkBitmap::kARGB_8888_Config:
+        SkColorType colorType = bitmap.colorType();
+        switch (colorType) {
+        case kPMColor_SkColorType:
             force_all_opaque_8888(bitmap);
             break;
-        case SkBitmap::kRGB_565_Config:
+        case kRGB_565_SkColorType:
             // nothing to do here; 565 bitmaps are inherently opaque
             break;
         default:
-            gm_fprintf(stderr, "unsupported bitmap config %d\n", config);
+            gm_fprintf(stderr, "unsupported bitmap colorType %d\n", colorType);
             DEBUGFAIL_SEE_STDERR;
         }
     }
@@ -590,8 +590,7 @@
             // the device is as large as the current rendertarget, so
             // we explicitly only readback the amount we expect (in
             // size) overwrite our previous allocation
-            bitmap->setConfig(SkBitmap::kARGB_8888_Config, size.fWidth,
-                              size.fHeight);
+            bitmap->setConfig(SkImageInfo::MakeN32Premul(size.fWidth, size.fHeight));
             canvas->readPixels(bitmap, 0, 0);
         }
 #endif
@@ -741,8 +740,8 @@
             return;
         }
 
-        if ((SkBitmap::kARGB_8888_Config != expectedBitmap.config()) ||
-            (SkBitmap::kARGB_8888_Config != actualBitmap.config())) {
+        if ((kPMColor_SkColorType != expectedBitmap.colorType()) ||
+            (kPMColor_SkColorType != actualBitmap.colorType())) {
             gm_fprintf(stderr, "---- %s: not computing max per-channel"
                        " pixel mismatch because non-8888\n", testName);
             return;
diff --git a/gm/shadertext.cpp b/gm/shadertext.cpp
index eccd8cb..4af5b0d 100644
--- a/gm/shadertext.cpp
+++ b/gm/shadertext.cpp
@@ -12,8 +12,8 @@
 
 namespace skiagm {
 
-static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
-    bm->allocConfigPixels(config, w, h);
+static void makebm(SkBitmap* bm, int w, int h) {
+    bm->allocN32Pixels(w, h);
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas    canvas(*bm);
@@ -39,7 +39,7 @@
                            int w, int h) {
     static SkBitmap bmp;
     if (bmp.isNull()) {
-        makebm(&bmp, SkBitmap::kARGB_8888_Config, w/2, h/4);
+        makebm(&bmp, w/2, h/4);
     }
     return SkShader::CreateBitmapShader(bmp, tx, ty);
 }
diff --git a/gm/shadertext2.cpp b/gm/shadertext2.cpp
index dcff3c6..1e6ae5c 100644
--- a/gm/shadertext2.cpp
+++ b/gm/shadertext2.cpp
@@ -11,8 +11,8 @@
 
 namespace skiagm {
 
-static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
-    bm->allocConfigPixels(config, w, h);
+static void makebm(SkBitmap* bm, int w, int h) {
+    bm->allocN32Pixels(w, h);
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas    canvas(*bm);
@@ -92,7 +92,7 @@
 
         static SkBitmap bmp;
         if (bmp.isNull()) {
-            makebm(&bmp, SkBitmap::kARGB_8888_Config, kPointSize / 2, kPointSize / 2);
+            makebm(&bmp, kPointSize / 2, kPointSize / 2);
         }
 
         SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(bmp,
diff --git a/gm/shadertext3.cpp b/gm/shadertext3.cpp
index 15b4f99..29ceac4 100644
--- a/gm/shadertext3.cpp
+++ b/gm/shadertext3.cpp
@@ -11,8 +11,8 @@
 
 namespace skiagm {
 
-static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
-    bm->allocConfigPixels(config, w, h);
+static void makebm(SkBitmap* bm, int w, int h) {
+    bm->allocN32Pixels(w, h);
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas    canvas(*bm);
@@ -68,7 +68,7 @@
 
         static SkBitmap bmp;
         if (bmp.isNull()) {
-            makebm(&bmp, SkBitmap::kARGB_8888_Config, kPointSize / 4, kPointSize / 4);
+            makebm(&bmp, kPointSize / 4, kPointSize / 4);
         }
 
         SkPaint bmpPaint;
diff --git a/gm/simpleaaclip.cpp b/gm/simpleaaclip.cpp
index e8946b4..a517b50 100644
--- a/gm/simpleaaclip.cpp
+++ b/gm/simpleaaclip.cpp
@@ -21,9 +21,7 @@
 
     SkAutoMaskFreeImage amfi(mask.fImage);
 
-    bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(),
-                 mask.fBounds.height(), mask.fRowBytes);
-    bm.setPixels(mask.fImage);
+    bm.installMaskPixels(mask);
 
     // need to copy for deferred drawing test to work
     SkBitmap bm2;
diff --git a/gm/tilemodes.cpp b/gm/tilemodes.cpp
index 0b0a3ae..5b97f13 100644
--- a/gm/tilemodes.cpp
+++ b/gm/tilemodes.cpp
@@ -19,8 +19,8 @@
 #include "SkUnitMappers.h"
 #include "SkBlurDrawLooper.h"
 
-static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
-    bm->allocConfigPixels(config, w, h);
+static void makebm(SkBitmap* bm, SkColorType ct, int w, int h) {
+    bm->allocPixels(SkImageInfo::Make(w, h, ct, kPremul_SkAlphaType));
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas    canvas(*bm);
@@ -49,9 +49,9 @@
     paint->setFilterLevel(filter ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel);
 }
 
-static const SkBitmap::Config gConfigs[] = {
-    SkBitmap::kARGB_8888_Config,
-    SkBitmap::kRGB_565_Config,
+static const SkColorType gColorTypes[] = {
+    kPMColor_SkColorType,
+    kRGB_565_SkColorType,
 };
 
 class TilingGM : public skiagm::GM {
@@ -60,7 +60,7 @@
             : fPowerOfTwoSize(powerOfTwoSize) {
     }
 
-    SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
+    SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
 
 protected:
 
@@ -81,8 +81,8 @@
 
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
         int size = fPowerOfTwoSize ? kPOTSize : kNPOTSize;
-        for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
-            makebm(&fTexture[i], gConfigs[i], size, size);
+        for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
+            makebm(&fTexture[i], gColorTypes[i], size, size);
         }
     }
 
@@ -120,7 +120,7 @@
 
         y += SkIntToScalar(16);
 
-        for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
+        for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
             for (size_t j = 0; j < SK_ARRAY_COUNT(gFilters); j++) {
                 x = SkIntToScalar(10);
                 for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
@@ -129,7 +129,7 @@
 #if 1 // Temporary change to regen bitmap before each draw. This may help tracking down an issue
       // on SGX where resizing NPOT textures to POT textures exhibits a driver bug.
                         if (!fPowerOfTwoSize) {
-                            makebm(&fTexture[i], gConfigs[i], size, size);
+                            makebm(&fTexture[i], gColorTypes[i], size, size);
                         }
 #endif
                         setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]);
@@ -166,7 +166,7 @@
 
 static SkShader* make_bm(SkShader::TileMode tx, SkShader::TileMode ty) {
     SkBitmap bm;
-    makebm(&bm, SkBitmap::kARGB_8888_Config, gWidth, gHeight);
+    makebm(&bm, kPMColor_SkColorType, gWidth, gHeight);
     return SkShader::CreateBitmapShader(bm, tx, ty);
 }
 
diff --git a/gm/tilemodes_scaled.cpp b/gm/tilemodes_scaled.cpp
index 603a78f..932d3f7 100644
--- a/gm/tilemodes_scaled.cpp
+++ b/gm/tilemodes_scaled.cpp
@@ -19,8 +19,8 @@
 #include "SkUnitMappers.h"
 #include "SkBlurDrawLooper.h"
 
-static void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
-    bm->allocConfigPixels(config, w, h);
+static void makebm(SkBitmap* bm, SkColorType ct, int w, int h) {
+    bm->allocPixels(SkImageInfo::Make(w, h, ct, kPremul_SkAlphaType));
     bm->eraseColor(SK_ColorTRANSPARENT);
 
     SkCanvas    canvas(*bm);
@@ -49,9 +49,9 @@
     paint->setFilterLevel(filter_level);
 }
 
-static const SkBitmap::Config gConfigs[] = {
-    SkBitmap::kARGB_8888_Config,
-    SkBitmap::kRGB_565_Config,
+static const SkColorType gColorTypes[] = {
+    kPMColor_SkColorType,
+    kRGB_565_SkColorType,
 };
 
 class ScaledTilingGM : public skiagm::GM {
@@ -62,7 +62,7 @@
             , fPowerOfTwoSize(powerOfTwoSize) {
     }
 
-    SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
+    SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
 
 protected:
 
@@ -83,8 +83,8 @@
 
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
         int size = fPowerOfTwoSize ? kPOTSize : kNPOTSize;
-        for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
-            makebm(&fTexture[i], gConfigs[i], size, size);
+        for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
+            makebm(&fTexture[i], gColorTypes[i], size, size);
         }
     }
 
@@ -96,7 +96,7 @@
 
         SkRect r = { 0, 0, SkIntToScalar(size*2), SkIntToScalar(size*2) };
 
-        static const char* gConfigNames[] = { "8888" , "565", "4444" };
+        static const char* gColorTypeNames[] = { "8888" , "565", "4444" };
 
         static const SkPaint::FilterLevel           gFilterLevels[] =
             { SkPaint::kNone_FilterLevel,
@@ -129,7 +129,7 @@
 
         y = SkIntToScalar(40) / scale;
 
-        for (size_t i = 0; i < SK_ARRAY_COUNT(gConfigs); i++) {
+        for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
             for (size_t j = 0; j < SK_ARRAY_COUNT(gFilterLevels); j++) {
                 x = SkIntToScalar(10)/scale;
                 for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
@@ -138,7 +138,7 @@
 #if 1 // Temporary change to regen bitmap before each draw. This may help tracking down an issue
       // on SGX where resizing NPOT textures to POT textures exhibits a driver bug.
                         if (!fPowerOfTwoSize) {
-                            makebm(&fTexture[i], gConfigs[i], size, size);
+                            makebm(&fTexture[i], gColorTypes[i], size, size);
                         }
 #endif
                         setup(&paint, fTexture[i], gFilterLevels[j], gModes[kx], gModes[ky]);
@@ -158,7 +158,7 @@
                     SkString str;
                     p.setAntiAlias(true);
                     p.setLooper(&fLooper);
-                    str.printf("%s, %s", gConfigNames[i], gFilterNames[j]);
+                    str.printf("%s, %s", gColorTypeNames[i], gFilterNames[j]);
                     canvas->drawText(str.c_str(), str.size(), scale*x, scale*(y + r.height() * 2 / 3), p);
                 }
 
@@ -177,7 +177,7 @@
 
 static SkShader* make_bm(SkShader::TileMode tx, SkShader::TileMode ty) {
     SkBitmap bm;
-    makebm(&bm, SkBitmap::kARGB_8888_Config, gWidth, gHeight);
+    makebm(&bm, kPMColor_SkColorType, gWidth, gHeight);
     return SkShader::CreateBitmapShader(bm, tx, ty);
 }
 
diff --git a/gm/tinybitmap.cpp b/gm/tinybitmap.cpp
index 6cb9ede..92bf7c6 100644
--- a/gm/tinybitmap.cpp
+++ b/gm/tinybitmap.cpp
@@ -18,8 +18,9 @@
     SkColorTable* ctable = new SkColorTable(c, SK_ARRAY_COUNT(c));
 
     SkBitmap bm;
-    bm.setConfig(SkBitmap::kIndex8_Config, 1, 1);
-    bm.allocPixels(ctable);
+    bm.allocPixels(SkImageInfo::Make(1, 1, kIndex_8_SkColorType,
+                                     kPremul_SkAlphaType),
+                   NULL, ctable);
     ctable->unref();
 
     bm.lockPixels();
diff --git a/gm/xfermodes.cpp b/gm/xfermodes.cpp
index 353bebf..b5ce8b8 100644
--- a/gm/xfermodes.cpp
+++ b/gm/xfermodes.cpp
@@ -31,8 +31,7 @@
         c.drawOval(r, p);
     }
 
-    dst->setConfig(SkBitmap::kARGB_8888_Config, w, h);
-    dst->allocPixels();
+    dst->allocN32Pixels(w, h);
     dst->eraseColor(SK_ColorTRANSPARENT);
 
     {
@@ -42,8 +41,7 @@
         c.drawRect(r, p);
     }
 
-    transparent->setConfig(SkBitmap::kARGB_8888_Config, w, h);
-    transparent->allocPixels();
+    transparent->allocN32Pixels(w, h);
     transparent->eraseColor(SK_ColorTRANSPARENT);
 }
 
@@ -150,8 +148,9 @@
     }
 
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
-        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType);
-        fBG.setPixels(gData);
+        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType,
+                                            kOpaque_SkAlphaType),
+                          gData, 4);
 
         make_bitmaps(W, H, &fSrcB, &fDstB, &fTransparent);
     }
diff --git a/include/core/SkBitmap.h b/include/core/SkBitmap.h
index b6851de..35928db 100644
--- a/include/core/SkBitmap.h
+++ b/include/core/SkBitmap.h
@@ -14,6 +14,7 @@
 #include "SkPoint.h"
 #include "SkRefCnt.h"
 
+struct SkMask;
 struct SkIRect;
 struct SkRect;
 class SkPaint;
@@ -307,6 +308,22 @@
     bool installPixels(const SkImageInfo&, void* pixels, size_t rowBytes,
                        void (*ReleaseProc)(void* addr, void* context),
                        void* context);
+    
+    /**
+     *  Call installPixels with no ReleaseProc specified. This means that the
+     *  caller must ensure that the specified pixels are valid for the lifetime
+     *  of the created bitmap (and its pixelRef).
+     */
+    bool installPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) {
+        return this->installPixels(info, pixels, rowBytes, NULL, NULL);
+    }
+
+    /**
+     *  Calls installPixels() with the value in the SkMask. The caller must
+     *  ensure that the specified mask pixels are valid for the lifetime
+     *  of the created bitmap (and its pixelRef).
+     */
+    bool installMaskPixels(const SkMask&);
 
     /**
      *  DEPRECATED: call info().
diff --git a/samplecode/SampleAAClip.cpp b/samplecode/SampleAAClip.cpp
index 5419f68..a1ee67b 100644
--- a/samplecode/SampleAAClip.cpp
+++ b/samplecode/SampleAAClip.cpp
@@ -46,9 +46,7 @@
     clip.copyToMask(&mask);
     SkAutoMaskFreeImage amfi(mask.fImage);
 
-    bm.installPixels(SkImageInfo::MakeA8(mask.fBounds.width(),
-                                         mask.fBounds.height()),
-                     mask.fImage, mask.fRowBytes, NULL, NULL);
+    bm.installMaskPixels(mask);
 
     SkPaint paint;
     canvas->drawBitmap(bm,
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 151ab50..b6c2e2f 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -519,6 +519,16 @@
     return true;
 }
 
+bool SkBitmap::installMaskPixels(const SkMask& mask) {
+    if (SkMask::kA8_Format != mask.fFormat) {
+        this->reset();
+        return false;
+    }
+    return this->installPixels(SkImageInfo::MakeA8(mask.fBounds.width(),
+                                                   mask.fBounds.height()),
+                               mask.fImage, mask.fRowBytes);
+}
+
 bool SkBitmap::allocConfigPixels(Config config, int width, int height,
                                  bool isOpaque) {
     SkColorType ct;
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index f4d399b..7a20295 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -195,9 +195,7 @@
     // FIXME: This code duplicates code in draw_rects_into_mask, below. Is there a
     // clean way to share more code?
     SkBitmap bitmap;
-    bitmap.installPixels(SkImageInfo::MakeA8(mask->fBounds.width(),
-                                             mask->fBounds.height()),
-                         mask->fImage, mask->fRowBytes, NULL, NULL);
+    bitmap.installMaskPixels(*mask);
 
     SkCanvas canvas(bitmap);
     canvas.translate(-SkIntToScalar(mask->fBounds.left()),
diff --git a/src/effects/SkLayerRasterizer.cpp b/src/effects/SkLayerRasterizer.cpp
index 65ebd8a..a10d758 100644
--- a/src/effects/SkLayerRasterizer.cpp
+++ b/src/effects/SkLayerRasterizer.cpp
@@ -122,9 +122,7 @@
         translatedMatrix.postTranslate(-SkIntToScalar(mask->fBounds.fLeft),
                                        -SkIntToScalar(mask->fBounds.fTop));
 
-        device.installPixels(SkImageInfo::MakeA8(mask->fBounds.width(),
-                                                 mask->fBounds.height()),
-                             mask->fImage, mask->fRowBytes, NULL, NULL);
+        device.installMaskPixels(*mask);
 
         draw.fBitmap    = &device;
         draw.fMatrix    = &drawMatrix;