replace SkBitmap::Config with SkColorType in gms
authorcommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 17 Feb 2014 21:21:46 +0000 (21:21 +0000)
committercommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 17 Feb 2014 21:21:46 +0000 (21:21 +0000)
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

19 files changed:
gm/bitmapfilters.cpp
gm/bitmappremul.cpp
gm/bitmapshader.cpp
gm/blurrect.cpp
gm/drawbitmaprect.cpp
gm/gmmain.cpp
gm/shadertext.cpp
gm/shadertext2.cpp
gm/shadertext3.cpp
gm/simpleaaclip.cpp
gm/tilemodes.cpp
gm/tilemodes_scaled.cpp
gm/tinybitmap.cpp
gm/xfermodes.cpp
include/core/SkBitmap.h
samplecode/SampleAAClip.cpp
src/core/SkBitmap.cpp
src/effects/SkBlurMaskFilter.cpp
src/effects/SkLayerRasterizer.cpp

index 5856f87f66de158b765a309396fae12a8870faef..7addf25c012e263297f88fa4fa33b9207d13ab01 100644 (file)
@@ -20,8 +20,9 @@ static void make_bm(SkBitmap* bm) {
     }
     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;
index 57d22d700a7c83b2415cca2c858ac83732b82ede..fd563eb7757367320bcce284d416e1d2e4acbcf9 100644 (file)
@@ -22,14 +22,15 @@ static const int SLIDE_SIZE = 256;
 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_argb8888_gradient() {
 
 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_argb4444_gradient() {
 
 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_argb8888_stripes() {
 
 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);
index d1915c9c90632dabf31671cd92f35b3dff33d5bb..4649b7e95f16486c61bb1407a6ce2635af1fb369 100644 (file)
@@ -28,7 +28,7 @@ static void draw_mask(SkBitmap* bm) {
     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);
index 3197eb6fc6a51c686b3d6241d2a510d18157c005..52edd6a105183ca802715e9d01439eb8723288e5 100644 (file)
@@ -197,8 +197,7 @@ protected:
         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;
index 31cba51e798ac443ea681d410b2c1d2eed39f7d5..664958a06b7258b890026f51ebed52728696133b 100644 (file)
@@ -28,8 +28,8 @@ static SkBitmap make_chessbm(int w, int h) {
     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 @@ protected:
     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);
index 687ee45a663310c0782969d57029fe562fae915e..d6457abb58eedb81a10544e4dcae34290768e713 100644 (file)
@@ -265,16 +265,16 @@ public:
        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 @@ public:
             // 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 @@ public:
             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;
index eccd8cbe12509c423ffa40ff36a1d3795039a4a5..4af5b0d49ddf6bbdd083484b990ef29b624199b5 100644 (file)
@@ -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 @@ static SkShader* MakeBitmapShader(SkShader::TileMode tx, SkShader::TileMode ty,
                            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);
 }
index dcff3c69bd6f38f76d74d16a3e8ef0e92efa169e..1e6ae5ca2cbc52a3945a339e69626ce9e0cf2f9d 100644 (file)
@@ -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 @@ protected:
 
         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,
index 15b4f993175f9b6e9822a23173f213ab984b59e1..29ceac45792bd77c3ccca094bd6bcba205648988 100644 (file)
@@ -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 @@ protected:
 
         static SkBitmap bmp;
         if (bmp.isNull()) {
-            makebm(&bmp, SkBitmap::kARGB_8888_Config, kPointSize / 4, kPointSize / 4);
+            makebm(&bmp, kPointSize / 4, kPointSize / 4);
         }
 
         SkPaint bmpPaint;
index e8946b446cc857d280387e44247aac59ff8a9344..a517b50dc142727e2f6fc1c093b3d6e08c77ca4a 100644 (file)
@@ -21,9 +21,7 @@ static void paint_rgn(SkCanvas* canvas, const SkAAClip& clip,
 
     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;
index 0b0a3ae6df33d070eb9417405120d991f4485287..5b97f13fc89e654b99e4551d4556cc3e0a2ed836 100644 (file)
@@ -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 @@ static void setup(SkPaint* paint, const SkBitmap& bm, bool filter,
     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 @@ public:
             : fPowerOfTwoSize(powerOfTwoSize) {
     }
 
-    SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
+    SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
 
 protected:
 
@@ -81,8 +81,8 @@ protected:
 
     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 @@ protected:
 
         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 @@ protected:
 #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 const int gHeight = 32;
 
 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);
 }
 
index 603a78fb1e958ba1ca4ff2cb0ac7baf09ad262f9..932d3f72200c174c60b41e5bb4b668f54dbb9edb 100644 (file)
@@ -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 @@ static void setup(SkPaint* paint, const SkBitmap& bm, SkPaint::FilterLevel filte
     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 @@ public:
             , fPowerOfTwoSize(powerOfTwoSize) {
     }
 
-    SkBitmap    fTexture[SK_ARRAY_COUNT(gConfigs)];
+    SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
 
 protected:
 
@@ -83,8 +83,8 @@ protected:
 
     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 @@ protected:
 
         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 @@ protected:
 
         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 @@ protected:
 #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 @@ protected:
                     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 const int gHeight = 32;
 
 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);
 }
 
index 6cb9eded73944c1f7fd400ebbea9842e8755ae72..92bf7c645f1d3e8d19409d32e234f3b3ce388b8d 100644 (file)
@@ -18,8 +18,9 @@ static SkBitmap make_bitmap() {
     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();
index 353bebf56fe660465866a33943b0c663acbccb87..b5ce8b8ced8ad1ce2375d8b8a687c85bd1f17a3f 100644 (file)
@@ -31,8 +31,7 @@ static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst,
         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 @@ static void make_bitmaps(int w, int h, SkBitmap* src, SkBitmap* dst,
         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 @@ class XfermodesGM : public GM {
     }
 
     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);
     }
index b6851def98a34e6af4ed9d735452b410fe4a7a20..35928db2a26d6f1c53c2e24f2236f2836bac7e68 100644 (file)
@@ -14,6 +14,7 @@
 #include "SkPoint.h"
 #include "SkRefCnt.h"
 
+struct SkMask;
 struct SkIRect;
 struct SkRect;
 class SkPaint;
@@ -307,6 +308,22 @@ public:
     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().
index 5419f68ed19c4d5aa04eefc804e381a27bfdcc4c..a1ee67b75f739327e92a3848f0cbaf8dfbac0289 100644 (file)
@@ -46,9 +46,7 @@ static void drawClip(SkCanvas* canvas, const SkAAClip& clip) {
     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,
index 151ab50290f53359b3103a364757b452e6dee469..b6c2e2f65ccd4dc8e4cd50e883c6586df94f0d1a 100644 (file)
@@ -519,6 +519,16 @@ bool SkBitmap::installPixels(const SkImageInfo& info, void* pixels, size_t rb,
     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;
index f4d399b80fef48b27f99a273112db77fb723909b..7a202951564f8456267a3b2b11ec5243bdf71d7d 100644 (file)
@@ -195,9 +195,7 @@ static bool draw_rrect_into_mask(const SkRRect rrect, SkMask* mask) {
     // 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()),
index 65ebd8ad1a61a29987d70e0ee360e03d58bbdbe6..a10d758ede45a54938802689c8b2ccb8a41640a2 100644 (file)
@@ -122,9 +122,7 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
         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;