store SkAlphaType inside SkBitmap, on road to support unpremul
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 21 Oct 2013 14:00:07 +0000 (14:00 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 21 Oct 2013 14:00:07 +0000 (14:00 +0000)
BUG=
R=bsalomon@google.com, scroggo@google.com

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

git-svn-id: http://skia.googlecode.com/svn/trunk@11877 2bbb7eff-a529-9590-31e7-b0007b416f81

39 files changed:
bench/BitmapBench.cpp
bench/BitmapRectBench.cpp
bench/BitmapScaleBench.cpp
bench/RepeatTileBench.cpp
bench/TileBench.cpp
gm/bleed.cpp
gm/xfermodes.cpp
gm/xfermodes2.cpp
gm/xfermodes3.cpp
include/core/SkBitmap.h
samplecode/SampleDitherBitmap.cpp
samplecode/SampleTinyBitmap.cpp
samplecode/SampleXfermodesBlur.cpp
src/core/SkBitmap.cpp
src/core/SkBitmapDevice.cpp
src/core/SkBitmapScaler.cpp
src/gpu/SkGpuDevice.cpp
src/image/SkImagePriv.cpp
src/image/SkImagePriv.h
src/image/SkImage_Raster.cpp
src/image/SkSurface_Gpu.cpp
src/image/SkSurface_Raster.cpp
src/images/SkImageDecoder.cpp
src/images/SkImageDecoder_libbmp.cpp
src/images/SkImageDecoder_libjpeg.cpp
src/images/SkImageDecoder_libpng.cpp
src/images/SkImageDecoder_libwebp.cpp
src/images/SkImageDecoder_wbmp.cpp
src/images/SkImageRef.cpp
src/lazy/SkBitmapFactory.cpp
src/lazy/SkLazyPixelRef.cpp
src/ports/SkImageDecoder_CG.cpp
src/ports/SkImageDecoder_WIC.cpp
src/views/SkWindow.cpp
tests/ARGBImageEncoderTest.cpp
tests/BitmapCopyTest.cpp
tests/BitmapHasherTest.cpp
tests/DeferredCanvasTest.cpp
tests/ShaderOpacityTest.cpp

index 982c917c02691319bc9a4b911c625b88d0f50066..6dc759283e4952b03b274e47e89ae3bc1d1a381e 100644 (file)
@@ -126,7 +126,7 @@ protected:
             fBitmap = bm;
         }
 
-        fBitmap.setIsOpaque(fIsOpaque);
+        fBitmap.setAlphaType(fIsOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
         fBitmap.setIsVolatile(fIsVolatile);
     }
 
index 1dd98ef9750a653380eb83d4e374d32ede9cdd59..104cb24bd90e51c6d00dd28ece3a1f29e7f69380 100644 (file)
@@ -66,7 +66,7 @@ protected:
 
     virtual void onPreDraw() SK_OVERRIDE {
         fBitmap.allocPixels();
-        fBitmap.setIsOpaque(true);
+        fBitmap.setAlphaType(kOpaque_SkAlphaType);
         fBitmap.eraseColor(SK_ColorBLACK);
         draw_into_bitmap(fBitmap);
 
index cc2a33a894944eee279214c94d86412c47df10ec..ae3df71c22da5c4648415e4b3b8d3bcf146374a3 100644 (file)
@@ -57,14 +57,14 @@ protected:
     }
 
     virtual void onPreDraw() {
-        fInputBitmap.setConfig(SkBitmap::kARGB_8888_Config, fInputSize, fInputSize);
+        fInputBitmap.setConfig(SkBitmap::kARGB_8888_Config,
+                               fInputSize, fInputSize, 0, kOpaque_SkAlphaType);
         fInputBitmap.allocPixels();
         fInputBitmap.eraseColor(SK_ColorWHITE);
-        fInputBitmap.setIsOpaque(true);
 
-        fOutputBitmap.setConfig(SkBitmap::kARGB_8888_Config, fOutputSize, fOutputSize);
+        fOutputBitmap.setConfig(SkBitmap::kARGB_8888_Config,
+                                fOutputSize, fOutputSize, 0, kOpaque_SkAlphaType);
         fOutputBitmap.allocPixels();
-        fOutputBitmap.setIsOpaque(true);
 
         fMatrix.setScale( scale(), scale() );
     }
index 612a149d6df78325470fb3ceef6d8b4e7b992bb6..957ec2a83e28dd02c06d9ec65a94edcedf4d7eaf 100644 (file)
@@ -115,7 +115,8 @@ protected:
     virtual void onPreDraw() SK_OVERRIDE {
         fBitmap.allocPixels();
         fBitmap.eraseColor(fIsOpaque ? SK_ColorWHITE : 0);
-        fBitmap.setIsOpaque(fIsOpaque);
+        fBitmap.setAlphaType(fIsOpaque ?
+                             kOpaque_SkAlphaType : kPremul_SkAlphaType);
 
         draw_into_bitmap(fBitmap);
 
index 60312a3d56cb06b8141953da66e729d96f9f8bea..03a758cdea03bcd83c4c638e994bd9d1fb053426 100644 (file)
@@ -48,11 +48,10 @@ public:
         , fDoScale(doScale) {
         SkBitmap bm;
 
-        bm.setConfig(SkBitmap::kARGB_8888_Config, kWidth, kHeight);
-
+        bm.setConfig(SkBitmap::kARGB_8888_Config, kWidth, kHeight, 0,
+                     kOpaque_SkAlphaType);
         bm.allocPixels();
         bm.eraseColor(SK_ColorWHITE);
-        bm.setIsOpaque(true);
 
         create_gradient(&bm);
 
index dc7e96fbb122716c76d397de1cf5d59eda399354..0d093940decc73da421833cb8336b96bf267b98e 100644 (file)
@@ -19,7 +19,8 @@
 static void make_red_ringed_bitmap(SkBitmap* result, int width, int height) {
     SkASSERT(0 == width % 2 && 0 == width % 2);
 
-    result->setConfig(SkBitmap::kARGB_8888_Config, width, height);
+    result->setConfig(SkBitmap::kARGB_8888_Config, width, height, 0,
+                      kOpaque_SkAlphaType);
     result->allocPixels();
     SkAutoLockPixels lock(*result);
 
@@ -56,7 +57,6 @@ static void make_red_ringed_bitmap(SkBitmap* result, int width, int height) {
     for (int x = 0; x < width; ++x) {
         scanline[x] = SK_ColorRED;
     }
-    result->setIsOpaque(true);
     result->setImmutable();
 }
 
index 65f53bffe703ac56a16b1e161f2073600259de52..e839b0ee71f77b0d3a27807505f21c1256037053 100644 (file)
@@ -60,9 +60,8 @@ class XfermodesGM : public GM {
     }
 
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
-        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4);
+        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType);
         fBG.setPixels(gData);
-        fBG.setIsOpaque(true);
 
         make_bitmaps(W, H, &fSrcB, &fDstB);
     }
index 990ee508d50db931dcd6ea9fc661500c98020ff6..046c3ddc2af47dc8d9ad25e3e94f66fc3de1a65e 100644 (file)
@@ -93,11 +93,10 @@ private:
             SkPackARGB32(0xFF, 0x40, 0x40, 0x40)
         };
         SkBitmap bg;
-        bg.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
+        bg.setConfig(SkBitmap::kARGB_8888_Config, 2, 2, 0, kOpaque_SkAlphaType);
         bg.allocPixels();
         SkAutoLockPixels bgAlp(bg);
         memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
-        bg.setIsOpaque(true);
 
         fBG.reset(SkShader::CreateBitmapShader(bg,
                                                SkShader::kRepeat_TileMode,
index baac3cdaff6d44e36bfd465388c928c1eab48f3c..d01c0190d4a4391f6f99a1a8052b493a47acdc57 100644 (file)
@@ -188,11 +188,10 @@ private:
             SkPackARGB32(0xFF, 0x40, 0x40, 0x40)
         };
         SkBitmap bg;
-        bg.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
+        bg.setConfig(SkBitmap::kARGB_8888_Config, 2, 2, 0, kOpaque_SkAlphaType);
         bg.allocPixels();
         SkAutoLockPixels bgAlp(bg);
         memcpy(bg.getPixels(), kCheckData, sizeof(kCheckData));
-        bg.setIsOpaque(true);
 
         fBGShader.reset(SkShader::CreateBitmapShader(bg,
                                                      SkShader::kRepeat_TileMode,
index 07d2b955533b78d37a7ebcb96e3217fd1e8bcb6c..3e22069e60af29980ecc110ba379bd3b8bfa6c56 100644 (file)
@@ -11,6 +11,7 @@
 #define SkBitmap_DEFINED
 
 #include "Sk64.h"
+#include "SkAlpha.h"
 #include "SkColor.h"
 #include "SkColorTable.h"
 #include "SkPoint.h"
@@ -130,6 +131,15 @@ public:
     */
     int rowBytesAsPixels() const { return fRowBytes >> (fBytesPerPixel >> 1); }
 
+    SkAlphaType alphaType() const { return (SkAlphaType)fAlphaType; }
+
+    /**
+     *  Set the bitmap's alphaType, returning true on success. If false is
+     *  returned, then the specified new alphaType is incompatible with the
+     *  Config, and the current alphaType is unchanged.
+     */
+    bool setAlphaType(SkAlphaType);
+
     /** Return the address of the pixels for this SkBitmap.
     */
     void* getPixels() const { return fPixels; }
@@ -175,12 +185,16 @@ public:
 
     /** Returns true if the bitmap is opaque (has no translucent/transparent pixels).
     */
-    bool isOpaque() const;
+    bool isOpaque() const {
+        return SkAlphaTypeIsOpaque(this->alphaType());
+    }
 
-    /** Specify if this bitmap's pixels are all opaque or not. Is only meaningful for configs
-        that support per-pixel alpha (RGB32, A1, A8).
-    */
-    void setIsOpaque(bool);
+    /**
+     *  DEPRECATED: use setAlpahType() instead.
+     */
+    void setIsOpaque(bool opaque) {
+        this->setAlphaType(opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
+    }
 
     /** Returns true if the bitmap is volatile (i.e. should not be cached by devices.)
     */
@@ -231,13 +245,6 @@ public:
      */
     static bool ComputeIsOpaque(const SkBitmap&);
 
-    /**
-     *  Calls ComputeIsOpaque, and passes its result to setIsOpaque().
-     */
-    void computeAndSetOpaquePredicate() {
-        this->setIsOpaque(ComputeIsOpaque(*this));
-    }
-
     /**
      *  Return the bitmap's bounds [0, 0, width, height] as an SkRect
      */
@@ -248,7 +255,14 @@ public:
         ComputeRowBytes() is called to compute the optimal value. This resets
         any pixel/colortable ownership, just like reset().
     */
-    void setConfig(Config, int width, int height, size_t rowBytes = 0);
+    bool setConfig(Config, int width, int height, size_t rowBytes, SkAlphaType);
+
+    bool setConfig(Config config, int width, int height, size_t rowBytes = 0) {
+        return this->setConfig(config, width, height, rowBytes,
+                               kPremul_SkAlphaType);
+    }
+
+
     /** Use this to assign a new pixel address for an existing bitmap. This
         will automatically release any pixelref previously installed. Only call
         this if you are handling ownership/lifetime of the pixel memory.
@@ -672,6 +686,7 @@ private:
     uint32_t    fWidth;
     uint32_t    fHeight;
     uint8_t     fConfig;
+    uint8_t     fAlphaType;
     uint8_t     fFlags;
     uint8_t     fBytesPerPixel; // based on config
 
index 7f29305a51a58fced0242cb0fdb8fda3c23f731f..9132ceb1953d9ac3479aa7a2b4f033d4104bd8af 100644 (file)
@@ -100,7 +100,7 @@ protected:
 
     static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) {
         SkAutoLockPixels alp(*bm);  // needed for ctable
-        bm->setIsOpaque(isOpaque);
+        bm->setAlphaType(isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
 #if 0
         SkColorTable* ctable = bm->getColorTable();
         if (ctable) {
index 42866d07adfe6b370e7be9f4430fbfbfb6631dbd..dc7157ff99656c2bb135629dc626ffe8ddf93556 100644 (file)
@@ -57,9 +57,8 @@ protected:
 
     static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) {
         SkAutoLockPixels alp(*bm);  // needed for ctable
-        bm->setIsOpaque(isOpaque);
+        bm->setAlphaType(isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
 #if 0
-        // TODO - I think we just want to not allow this anymore
         SkColorTable* ctable = bm->getColorTable();
         if (ctable) {
             ctable->setIsOpaque(isOpaque);
index 59aa87e214dbd3b969de026e53f89214b13f965c..a73d9f2e2005e2861e15a004ab4c62f2cfd40e5c 100644 (file)
@@ -77,9 +77,8 @@ public:
     const static int W = 64;
     const static int H = 64;
     XfermodesBlurView() {
-        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4);
+        fBG.setConfig(SkBitmap::kARGB_4444_Config, 2, 2, 4, kOpaque_SkAlphaType);
         fBG.setPixels(gBG);
-        fBG.setIsOpaque(true);
     }
 
 protected:
index 63a760c4cf7672a15068f8b801efc7a36d7d530e..bad63bac18f5d25ba1445a06fbc2fef17f2ad68f 100644 (file)
@@ -143,6 +143,7 @@ void SkBitmap::swap(SkBitmap& other) {
     SkTSwap(fWidth, other.fWidth);
     SkTSwap(fHeight, other.fHeight);
     SkTSwap(fConfig, other.fConfig);
+    SkTSwap(fAlphaType, other.fAlphaType);
     SkTSwap(fFlags, other.fFlags);
     SkTSwap(fBytesPerPixel, other.fBytesPerPixel);
 
@@ -266,33 +267,76 @@ void SkBitmap::getBounds(SkIRect* bounds) const {
 
 ///////////////////////////////////////////////////////////////////////////////
 
-void SkBitmap::setConfig(Config c, int width, int height, size_t rowBytes) {
-    this->freePixels();
+static bool validate_alphaType(SkBitmap::Config config, SkAlphaType alphaType,
+                               SkAlphaType* canonical) {
+    switch (config) {
+        case SkBitmap::kNo_Config:
+            alphaType = kIgnore_SkAlphaType;
+            break;
+        case SkBitmap::kA1_Config:
+        case SkBitmap::kA8_Config:
+            if (kUnpremul_SkAlphaType == alphaType) {
+                alphaType = kPremul_SkAlphaType;
+            }
+            // fall-through
+        case SkBitmap::kIndex8_Config:
+        case SkBitmap::kARGB_4444_Config:
+        case SkBitmap::kARGB_8888_Config:
+            if (kIgnore_SkAlphaType == alphaType) {
+                return false;
+            }
+            break;
+        case SkBitmap::kRGB_565_Config:
+            alphaType = kOpaque_SkAlphaType;
+            break;
+    }
+    if (canonical) {
+        *canonical = alphaType;
+    }
+    return true;
+}
 
+bool SkBitmap::setConfig(Config config, int width, int height, size_t rowBytes,
+                         SkAlphaType alphaType) {
     if ((width | height) < 0) {
-        goto err;
+        goto ERROR;
     }
-
     if (rowBytes == 0) {
-        rowBytes = SkBitmap::ComputeRowBytes(c, width);
-        if (0 == rowBytes && kNo_Config != c) {
-            goto err;
+        rowBytes = SkBitmap::ComputeRowBytes(config, width);
+        if (0 == rowBytes && kNo_Config != config) {
+            goto ERROR;
         }
     }
 
-    fConfig     = SkToU8(c);
+    if (!validate_alphaType(config, alphaType, &alphaType)) {
+        goto ERROR;
+    }
+
+    this->freePixels();
+
+    fConfig     = SkToU8(config);
+    fAlphaType  = SkToU8(alphaType);
     fWidth      = width;
     fHeight     = height;
     fRowBytes   = SkToU32(rowBytes);
 
-    fBytesPerPixel = (uint8_t)ComputeBytesPerPixel(c);
+    fBytesPerPixel = (uint8_t)ComputeBytesPerPixel(config);
 
     SkDEBUGCODE(this->validate();)
-    return;
+    return true;
 
     // if we got here, we had an error, so we reset the bitmap to empty
-err:
+ERROR:
     this->reset();
+    return false;
+}
+
+bool SkBitmap::setAlphaType(SkAlphaType alphaType) {
+    if (!validate_alphaType(this->config(), alphaType, &alphaType)) {
+        return false;
+    }
+    fAlphaType = SkToU8(alphaType);
+    return true;
 }
 
 void SkBitmap::updatePixelsFromRef() const {
@@ -524,46 +568,6 @@ void SkBitmap::setImmutable() {
     }
 }
 
-bool SkBitmap::isOpaque() const {
-    switch (fConfig) {
-        case kNo_Config:
-            return true;
-
-        case kA1_Config:
-        case kA8_Config:
-        case kARGB_4444_Config:
-        case kARGB_8888_Config:
-            return (fFlags & kImageIsOpaque_Flag) != 0;
-
-        case kIndex8_Config: {
-            bool isOpaque;
-
-            this->lockPixels();
-            isOpaque = fColorTable && fColorTable->isOpaque();
-            this->unlockPixels();
-            return isOpaque;
-        }
-
-        case kRGB_565_Config:
-            return true;
-
-        default:
-            SkDEBUGFAIL("unknown bitmap config pased to isOpaque");
-            return false;
-    }
-}
-
-void SkBitmap::setIsOpaque(bool isOpaque) {
-    /*  we record this regardless of fConfig, though it is ignored in
-        isOpaque() for configs that can't support per-pixel alpha.
-    */
-    if (isOpaque) {
-        fFlags |= kImageIsOpaque_Flag;
-    } else {
-        fFlags &= ~kImageIsOpaque_Flag;
-    }
-}
-
 bool SkBitmap::isVolatile() const {
     return (fFlags & kImageIsVolatile_Flag) != 0;
 }
@@ -958,9 +962,9 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const {
         SkPixelRef* pixelRef = fPixelRef->deepCopy(this->config(), &subset);
         if (pixelRef != NULL) {
             SkBitmap dst;
-            dst.setConfig(this->config(), subset.width(), subset.height());
+            dst.setConfig(this->config(), subset.width(), subset.height(), 0,
+                          this->alphaType());
             dst.setIsVolatile(this->isVolatile());
-            dst.setIsOpaque(this->isOpaque());
             dst.setPixelRef(pixelRef)->unref();
             SkDEBUGCODE(dst.validate());
             result->swap(dst);
@@ -979,9 +983,9 @@ bool SkBitmap::extractSubset(SkBitmap* result, const SkIRect& subset) const {
     }
 
     SkBitmap dst;
-    dst.setConfig(this->config(), r.width(), r.height(), this->rowBytes());
+    dst.setConfig(this->config(), r.width(), r.height(), this->rowBytes(),
+                  this->alphaType());
     dst.setIsVolatile(this->isVolatile());
-    dst.setIsOpaque(this->isOpaque());
 
     if (fPixelRef) {
         // share the pixelref with a custom offset
@@ -1070,7 +1074,8 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const {
     }
 
     SkBitmap tmpDst;
-    tmpDst.setConfig(dstConfig, src->width(), src->height());
+    tmpDst.setConfig(dstConfig, src->width(), src->height(), 0,
+                     src->alphaType());
 
     // allocate colortable if srcConfig == kIndex8_Config
     SkColorTable* ctable = (dstConfig == kIndex8_Config) ?
@@ -1130,8 +1135,6 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const {
         canvas.drawBitmap(*src, 0, 0, &paint);
     }
 
-    tmpDst.setIsOpaque(src->isOpaque());
-
     dst->swap(tmpDst);
     return true;
 }
@@ -1579,7 +1582,7 @@ void SkBitmap::flatten(SkFlattenableWriteBuffer& buffer) const {
     buffer.writeInt(fHeight);
     buffer.writeInt(fRowBytes);
     buffer.writeInt(fConfig);
-    buffer.writeBool(this->isOpaque());
+    buffer.writeInt(fAlphaType);
 
     if (fPixelRef) {
         if (fPixelRef->getFactory()) {
@@ -1602,9 +1605,9 @@ void SkBitmap::unflatten(SkFlattenableReadBuffer& buffer) {
     int height = buffer.readInt();
     int rowBytes = buffer.readInt();
     int config = buffer.readInt();
+    int alphaType = buffer.readInt();
 
-    this->setConfig((Config)config, width, height, rowBytes);
-    this->setIsOpaque(buffer.readBool());
+    this->setConfig((Config)config, width, height, rowBytes, (SkAlphaType)alphaType);
 
     int reftype = buffer.readInt();
     switch (reftype) {
index eee201881a879d340c3ed594ba4b9b55340ecab7..ff68481538286fd25f92734f527a3134de03b1f4 100644 (file)
@@ -27,9 +27,9 @@ SkBitmapDevice::SkBitmapDevice(const SkBitmap& bitmap, const SkDeviceProperties&
 }
 
 SkBitmapDevice::SkBitmapDevice(SkBitmap::Config config, int width, int height, bool isOpaque) {
-    fBitmap.setConfig(config, width, height);
+    fBitmap.setConfig(config, width, height, 0, isOpaque ?
+                      kOpaque_SkAlphaType : kPremul_SkAlphaType);
     fBitmap.allocPixels();
-    fBitmap.setIsOpaque(isOpaque);
     if (!isOpaque) {
         fBitmap.eraseColor(SK_ColorTRANSPARENT);
     }
@@ -39,9 +39,9 @@ SkBitmapDevice::SkBitmapDevice(SkBitmap::Config config, int width, int height, b
                                const SkDeviceProperties& deviceProperties)
     : SkBaseDevice(deviceProperties) {
 
-    fBitmap.setConfig(config, width, height);
+    fBitmap.setConfig(config, width, height, 0, isOpaque ?
+                      kOpaque_SkAlphaType : kPremul_SkAlphaType);
     fBitmap.allocPixels();
-    fBitmap.setIsOpaque(isOpaque);
     if (!isOpaque) {
         fBitmap.eraseColor(SK_ColorTRANSPARENT);
     }
index 114836dd7967c72419c4ad92253648467cdf3413..c28d4779c7ae60b3bc3c375b16605be8efdd2049 100644 (file)
@@ -287,7 +287,8 @@ bool SkBitmapScaler::Resize(SkBitmap* resultPtr,
     // Convolve into the result.
     SkBitmap result;
     result.setConfig(SkBitmap::kARGB_8888_Config,
-        destSubset.width(), destSubset.height());
+                     destSubset.width(), destSubset.height(), 0,
+                     source.alphaType());
     result.allocPixels(allocator, NULL);
     if (!result.readyToDraw()) {
         return false;
@@ -299,8 +300,6 @@ bool SkBitmapScaler::Resize(SkBitmap* resultPtr,
         static_cast<unsigned char*>(result.getPixels()),
         convolveProcs, true);
 
-    // Preserve the "opaque" flag for use as an optimization later.
-    result.setIsOpaque(source.isOpaque());
     *resultPtr = result;
     return true;
 }
index 3c91101b346376b50e190079e5a19c1ac1057f51..1498fc4c4299c1667a5d876add14152239cb9a0c 100644 (file)
@@ -137,14 +137,17 @@ static SkBitmap::Config grConfig2skConfig(GrPixelConfig config, bool* isOpaque)
     }
 }
 
+/*
+ * GrRenderTarget does not know its opaqueness, only its config, so we have
+ * to make conservative guesses when we return an "equivalent" bitmap.
+ */
 static SkBitmap make_bitmap(GrContext* context, GrRenderTarget* renderTarget) {
-    GrPixelConfig config = renderTarget->config();
-
     bool isOpaque;
+    SkBitmap::Config config = grConfig2skConfig(renderTarget->config(), &isOpaque);
+
     SkBitmap bitmap;
-    bitmap.setConfig(grConfig2skConfig(config, &isOpaque),
-                     renderTarget->width(), renderTarget->height());
-    bitmap.setIsOpaque(isOpaque);
+    bitmap.setConfig(config, renderTarget->width(), renderTarget->height(), 0,
+                     isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
     return bitmap;
 }
 
index f707543c2ab5d0972957f0499395950b54450d08..eeeb9d87f77738599018d1f752299dc00ce70b18 100644 (file)
@@ -9,45 +9,16 @@
 #include "SkCanvas.h"
 #include "SkPicture.h"
 
-SkBitmap::Config SkImageInfoToBitmapConfig(const SkImage::Info& info,
-                                           bool* isOpaque) {
+SkBitmap::Config SkImageInfoToBitmapConfig(const SkImage::Info& info) {
     switch (info.fColorType) {
         case SkImage::kAlpha_8_ColorType:
-            switch (info.fAlphaType) {
-                case kIgnore_SkAlphaType:
-                    // makes no sense
-                    return SkBitmap::kNo_Config;
-
-                case kOpaque_SkAlphaType:
-                    *isOpaque = true;
-                    return SkBitmap::kA8_Config;
-
-                case kPremul_SkAlphaType:
-                case kUnpremul_SkAlphaType:
-                    *isOpaque = false;
-                    return SkBitmap::kA8_Config;
-            }
-            break;
+            return SkBitmap::kA8_Config;
 
         case SkImage::kRGB_565_ColorType:
-            // we ignore fAlpahType, though some would not make sense
-            *isOpaque = true;
             return SkBitmap::kRGB_565_Config;
 
         case SkImage::kPMColor_ColorType:
-            switch (info.fAlphaType) {
-                case kIgnore_SkAlphaType:
-                case kUnpremul_SkAlphaType:
-                    // not supported yet
-                    return SkBitmap::kNo_Config;
-                case kOpaque_SkAlphaType:
-                    *isOpaque = true;
-                    return SkBitmap::kARGB_8888_Config;
-                case kPremul_SkAlphaType:
-                    *isOpaque = false;
-                    return SkBitmap::kARGB_8888_Config;
-            }
-            break;
+            return SkBitmap::kARGB_8888_Config;
 
         default:
             // break for unsupported colortypes
index 2af8bbea92c49c98ebd45f4ca9f93271dec1ab24..5d93605566991e4cb2c1de9cee99c76db134e92f 100644 (file)
@@ -13,8 +13,7 @@
 
 class SkPicture;
 
-extern SkBitmap::Config SkImageInfoToBitmapConfig(const SkImage::Info&,
-                                                  bool* isOpaque);
+extern SkBitmap::Config SkImageInfoToBitmapConfig(const SkImage::Info&);
 
 extern int SkImageBytesPerPixel(SkImage::ColorType);
 
index cd9b70f018bc6637192dbcca4a581af1b47ffc93..a208d83a7f213643e6fd862a8096d46120ee5687 100644 (file)
@@ -31,8 +31,7 @@ public:
             return false;
         }
 
-        bool isOpaque;
-        if (SkImageInfoToBitmapConfig(info, &isOpaque) == SkBitmap::kNo_Config) {
+        if (SkImageInfoToBitmapConfig(info) == SkBitmap::kNo_Config) {
             return false;
         }
 
@@ -85,23 +84,19 @@ SkImage* SkImage_Raster::NewEmpty() {
 
 SkImage_Raster::SkImage_Raster(const Info& info, SkData* data, size_t rowBytes)
         : INHERITED(info.fWidth, info.fHeight) {
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
 
-    fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes);
+    fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes, info.fAlphaType);
     fBitmap.setPixelRef(SkNEW_ARGS(SkDataPixelRef, (data)))->unref();
-    fBitmap.setIsOpaque(isOpaque);
     fBitmap.setImmutable();
 }
 
 SkImage_Raster::SkImage_Raster(const Info& info, SkPixelRef* pr, size_t rowBytes)
 : INHERITED(info.fWidth, info.fHeight) {
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
 
-    fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes);
+    fBitmap.setConfig(config, info.fWidth, info.fHeight, rowBytes, info.fAlphaType);
     fBitmap.setPixelRef(pr);
-    fBitmap.setIsOpaque(isOpaque);
 }
 
 SkImage_Raster::~SkImage_Raster() {}
index e5b7bd4486a86d87e0f91b28db5389448671c3c9..7b3a6437d98328a01215bb27e16c7e107607262d 100644 (file)
@@ -38,12 +38,11 @@ SK_DEFINE_INST_COUNT(SkSurface_Gpu)
 SkSurface_Gpu::SkSurface_Gpu(GrContext* ctx, const SkImage::Info& info,
                              int sampleCount)
         : INHERITED(info.fWidth, info.fHeight) {
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
 
     fDevice = SkNEW_ARGS(SkGpuDevice, (ctx, config, info.fWidth, info.fHeight, sampleCount));
 
-    if (!isOpaque) {
+    if (!SkAlphaTypeIsOpaque(info.fAlphaType)) {
         fDevice->clear(0x0);
     }
 }
@@ -119,8 +118,7 @@ SkSurface* SkSurface::NewRenderTarget(GrContext* ctx, const SkImage::Info& info,
         return NULL;
     }
 
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
 
     GrTextureDesc desc;
     desc.fFlags = kRenderTarget_GrTextureFlagBit | kCheckAllocation_GrTextureFlagBit;
@@ -136,3 +134,4 @@ SkSurface* SkSurface::NewRenderTarget(GrContext* ctx, const SkImage::Info& info,
 
     return SkNEW_ARGS(SkSurface_Gpu, (ctx, tex->asRenderTarget()));
 }
+
index ccfdd27b1cb82cab885098ca458c2f5ffd07cfa9..5beabf71ccb9b8c2f8e17e659ab03e525cdc1202 100644 (file)
@@ -39,8 +39,7 @@ private:
 bool SkSurface_Raster::Valid(const SkImage::Info& info, size_t rowBytes) {
     static const size_t kMaxTotalSize = SK_MaxS32;
 
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
 
     int shift = 0;
     switch (config) {
@@ -83,26 +82,20 @@ bool SkSurface_Raster::Valid(const SkImage::Info& info, size_t rowBytes) {
 
 SkSurface_Raster::SkSurface_Raster(const SkImage::Info& info, void* pixels, size_t rb)
         : INHERITED(info.fWidth, info.fHeight) {
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
-
-    fBitmap.setConfig(config, info.fWidth, info.fHeight, rb);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
+    fBitmap.setConfig(config, info.fWidth, info.fHeight, rb, info.fAlphaType);
     fBitmap.setPixels(pixels);
-    fBitmap.setIsOpaque(isOpaque);
     fWeOwnThePixels = false;    // We are "Direct"
 }
 
 SkSurface_Raster::SkSurface_Raster(const SkImage::Info& info, SkPixelRef* pr, size_t rb)
         : INHERITED(info.fWidth, info.fHeight) {
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
-
-    fBitmap.setConfig(config, info.fWidth, info.fHeight, rb);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
+    fBitmap.setConfig(config, info.fWidth, info.fHeight, rb, info.fAlphaType);
     fBitmap.setPixelRef(pr);
-    fBitmap.setIsOpaque(isOpaque);
     fWeOwnThePixels = true;
 
-    if (!isOpaque) {
+    if (!SkAlphaTypeIsOpaque(info.fAlphaType)) {
         fBitmap.eraseColor(SK_ColorTRANSPARENT);
     }
 }
index 15cd1a60c0dd6dc27bf517f0a85d9453e5301e70..3ee41124c01ef68186cd2c7d2ffdaa9395ce6aef 100644 (file)
@@ -245,8 +245,7 @@ bool SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize,
     }
     // if the destination has no pixels then we must allocate them.
     if (dst->isNull()) {
-        dst->setConfig(src->getConfig(), w, h);
-        dst->setIsOpaque(src->isOpaque());
+        dst->setConfig(src->getConfig(), w, h, 0, src->alphaType());
 
         if (!this->allocPixelRef(dst, NULL)) {
             SkDEBUGF(("failed to allocate pixels needed to crop the bitmap"));
index 2283dbf51d480289427b71cbcc12559026bddd15..34a88ac6b00c7a161b5fda7bcdf21ee1002f3779 100644 (file)
@@ -133,8 +133,8 @@ bool SkBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
 
     SkScaledBitmapSampler sampler(width, height, getSampleSize());
 
-    bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
-    bm->setIsOpaque(true);
+    bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0,
+                  kOpaque_SkAlphaType);
 
     if (justBounds) {
         return true;
index 52c7483d7cc05def1d59ff9f573c65552e7907c4..67b17823e262bba903fbd55a4e437efbce5dfd8d 100644 (file)
@@ -543,9 +543,9 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
 #endif
 
     if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) {
-        bm->setConfig(config, cinfo.image_width, cinfo.image_height);
-        bm->setIsOpaque(config != SkBitmap::kA8_Config);
-        return true;
+        return bm->setConfig(config, cinfo.image_width, cinfo.image_height, 0,
+                             SkBitmap::kA8_Config == config ?
+                                kPremul_SkAlphaType : kOpaque_SkAlphaType);
     }
 
     /*  image_width and image_height are the original dimensions, available
@@ -565,9 +565,9 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
         if (SkImageDecoder::kDecodeBounds_Mode == mode && valid_output_dimensions(cinfo)) {
             SkScaledBitmapSampler smpl(cinfo.output_width, cinfo.output_height,
                                        recompute_sampleSize(sampleSize, cinfo));
-            bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight());
-            bm->setIsOpaque(config != SkBitmap::kA8_Config);
-            return true;
+            return bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight(),
+                                 0, SkBitmap::kA8_Config == config ?
+                                    kPremul_SkAlphaType : kOpaque_SkAlphaType);
         } else {
             return return_false(cinfo, *bm, "start_decompress");
         }
@@ -580,8 +580,8 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
     }
 
     SkScaledBitmapSampler sampler(cinfo.output_width, cinfo.output_height, sampleSize);
-    bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
-    bm->setIsOpaque(config != SkBitmap::kA8_Config);
+    bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0,
+                  SkBitmap::kA8_Config != config ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
     if (SkImageDecoder::kDecodeBounds_Mode == mode) {
         return true;
     }
@@ -801,8 +801,8 @@ bool SkJPEGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
     SkScaledBitmapSampler sampler(width, height, skiaSampleSize);
 
     SkBitmap bitmap;
-    bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
-    bitmap.setIsOpaque(true);
+    bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0,
+                     kOpaque_SkAlphaType);
 
     // Check ahead of time if the swap(dest, src) is possible or not.
     // If yes, then we will stick to AllocPixelRef since it's cheaper with the
index 5fc9350b519e23d691bb368aac9cef8d3a0d726b..e54387af34cf960f143a9963d857fd100e7bba73 100644 (file)
@@ -466,7 +466,16 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
     if (SkBitmap::kA8_Config == decodedBitmap->config()) {
         reallyHasAlpha = true;
     }
-    decodedBitmap->setIsOpaque(!reallyHasAlpha);
+    
+    SkAlphaType alphaType = kOpaque_SkAlphaType;
+    if (reallyHasAlpha) {
+        if (this->getRequireUnpremultipliedColors()) {
+            alphaType = kUnpremul_SkAlphaType;
+        } else {
+            alphaType = kPremul_SkAlphaType;
+        }
+    }
+    decodedBitmap->setAlphaType(alphaType);
     return true;
 }
 
@@ -939,7 +948,15 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
     if (SkBitmap::kA8_Config == decodedBitmap.config()) {
         reallyHasAlpha = true;
     }
-    decodedBitmap.setIsOpaque(!reallyHasAlpha);
+    SkAlphaType alphaType = kOpaque_SkAlphaType;
+    if (reallyHasAlpha) {
+        if (this->getRequireUnpremultipliedColors()) {
+            alphaType = kUnpremul_SkAlphaType;
+        } else {
+            alphaType = kPremul_SkAlphaType;
+        }
+    }
+    decodedBitmap.setAlphaType(alphaType);
 
     if (swapOnly) {
         bm->swap(decodedBitmap);
index 8bb716bae82a40807c0a759a8fcf0bc22ba357fc..68014dd39247f0c663305584ad62ffde7ee978e7 100644 (file)
@@ -293,11 +293,8 @@ bool SkWEBPImageDecoder::setDecodeConfig(SkBitmap* decodedBitmap,
         return false;
     }
 
-    decodedBitmap->setConfig(config, width, height, 0);
-
-    decodedBitmap->setIsOpaque(!fHasAlpha);
-
-    return true;
+    return decodedBitmap->setConfig(config, width, height, 0,
+                                    fHasAlpha ? kPremul_SkAlphaType : kOpaque_SkAlphaType);
 }
 
 bool SkWEBPImageDecoder::onBuildTileIndex(SkStreamRewindable* stream,
index 4a9944dbcda30f85fe743518484346870f292ecf..8dce62cdf003ae6878805691373012f1a02356b6 100644 (file)
@@ -111,8 +111,8 @@ bool SkWBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap,
     int width = head.fWidth;
     int height = head.fHeight;
 
-    decodedBitmap->setConfig(SkBitmap::kIndex8_Config, width, height);
-    decodedBitmap->setIsOpaque(true);
+    decodedBitmap->setConfig(SkBitmap::kIndex8_Config, width, height, 0,
+                             kOpaque_SkAlphaType);
 
     if (SkImageDecoder::kDecodeBounds_Mode == mode) {
         return true;
index 9093b0515662d24dda6023d4dedf00575a1e69a2..ead835f7ab9c9c4c16f6a5e810026855973554f6 100644 (file)
@@ -64,7 +64,8 @@ bool SkImageRef::getInfo(SkBitmap* bitmap) {
 bool SkImageRef::isOpaque(SkBitmap* bitmap) {
     if (bitmap && bitmap->pixelRef() == this) {
         bitmap->lockPixels();
-        bitmap->setIsOpaque(fBitmap.isOpaque());
+        // what about colortables??????
+        bitmap->setAlphaType(fBitmap.alphaType());
         bitmap->unlockPixels();
         return true;
     }
index 0ff4ee2d17d018cf36f4af49def81340e33df12f..546485140203b070e9a78c9a017f9765edfe4071 100644 (file)
@@ -53,16 +53,13 @@ bool SkBitmapFactory::installPixelRef(SkData* data, SkBitmap* dst) {
         return false;
     }
 
-    bool isOpaque = false;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
 
     Target target;
     // FIMXE: There will be a problem if this rowbytes is calculated differently from
     // in SkLazyPixelRef.
     target.fRowBytes = SkImageMinRowBytes(info);
-
-    dst->setConfig(config, info.fWidth, info.fHeight, target.fRowBytes);
-    dst->setIsOpaque(isOpaque);
+    dst->setConfig(config, info.fWidth, info.fHeight, target.fRowBytes, info.fAlphaType);
 
     // fImageCache and fCacheSelector are mutually exclusive.
     SkASSERT(NULL == fImageCache || NULL == fCacheSelector);
index 9e023c4a7c8859369886fe07a650c85fe1c69e23..22d4b112f18688dcedcef287dac019bc7c5f9210 100644 (file)
@@ -150,15 +150,14 @@ SkData* SkLazyPixelRef::onRefEncodedData() {
 
 static bool init_from_info(SkBitmap* bm, const SkImage::Info& info,
                            size_t rowBytes) {
-    bool isOpaque;
-    SkBitmap::Config config = SkImageInfoToBitmapConfig(info, &isOpaque);
+    SkBitmap::Config config = SkImageInfoToBitmapConfig(info);
     if (SkBitmap::kNo_Config == config) {
         return false;
     }
 
-    bm->setConfig(config, info.fWidth, info.fHeight, rowBytes);
-    bm->setIsOpaque(isOpaque);
-    return bm->allocPixels();
+    return bm->setConfig(config, info.fWidth, info.fHeight, rowBytes, info.fAlphaType)
+           &&
+           bm->allocPixels();
 }
 
 bool SkLazyPixelRef::onImplementsDecodeInto() {
index 8956acaebc8bd0fe3dd5300d77af02b662ec90e6..3f850b544dabf288ff64eddcb9951bb5d416aa48 100644 (file)
@@ -104,11 +104,13 @@ bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
         case kCGImageAlphaNoneSkipLast:
         case kCGImageAlphaNoneSkipFirst:
             SkASSERT(SkBitmap::ComputeIsOpaque(*bm));
-            bm->setIsOpaque(true);
+            bm->setAlphaType(kOpaque_SkAlphaType);
             break;
         default:
             // we don't know if we're opaque or not, so compute it.
-            bm->computeAndSetOpaquePredicate();
+            if (SkBitmap::ComputeIsOpaque(*bm)) {
+                bm->setAlphaType(kOpaque_SkAlphaType);
+            }
     }
     if (!bm->isOpaque() && this->getRequireUnpremultipliedColors()) {
         // CGBitmapContext does not support unpremultiplied, so the image has been premultiplied.
@@ -119,6 +121,7 @@ bool SkImageDecoder_CG::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) {
                 *addr = unpremultiply_pmcolor(*addr);
             }
         }
+        bm->setAlphaType(kUnpremul_SkAlphaType);
     }
     bm->unlockPixels();
     return true;
index c3666aca5cd34068df6f92f8f15b8e483038cbd5..1bda67fe91d86861db18443fde8038622e7fb434 100644 (file)
@@ -240,7 +240,9 @@ bool SkImageDecoder_WIC::decodeStream(SkStream* stream, SkBitmap* bm, WICModes w
         );
 
         // Note: we don't need to premultiply here since we specified PBGRA
-        bm->computeAndSetOpaquePredicate();
+        if (ComputeIsOpaque(*bm)) {
+            bm->setAlphaType(kOpaque_SkAlphaType);
+        }
     }
 
     return SUCCEEDED(hr);
index f25eb12379de90e2a3971b26b432cd1eeb89bcf9..d6fe32bd8884cf8ff95a3c9673461493562bd95f 100644 (file)
@@ -102,9 +102,8 @@ void SkWindow::resize(int width, int height, SkBitmap::Config config)
     if (width != fBitmap.width() || height != fBitmap.height() || config != fConfig)
     {
         fConfig = config;
-        fBitmap.setConfig(config, width, height);
+        fBitmap.setConfig(config, width, height, 0, kOpaque_SkAlphaType);
         fBitmap.allocPixels();
-        fBitmap.setIsOpaque(true);
 
         this->setSize(SkIntToScalar(width), SkIntToScalar(height));
         this->inval(NULL);
index 9f68a0a151ec8639fdcb77d85dfe893425b60588..bffcaa4f7873001d451f42eb628d7cf22277b8a5 100644 (file)
@@ -48,7 +48,7 @@ void BitmapTransformerTestClass::onRun(Reporter* reporter) {
         {
             bitmap.setConfig(configs[configIndex], kWidth, kHeight);
             REPORTER_ASSERT(reporter, bitmap.allocPixels());
-            bitmap.setIsOpaque(true);
+            bitmap.setAlphaType(kOpaque_SkAlphaType);
             bitmap.eraseColor(SK_ColorBLUE);
             // Change rows [0,1] from blue to [red,green].
             SkCanvas canvas(bitmap);
index cccde8af92eb56ba95b90a78a45463f9d197f303..bf0d2f7813889f53fb0a0173445421fb33b30b3b 100644 (file)
@@ -249,8 +249,8 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
                 SkColorTable* ctOpaque = NULL;
                 SkColorTable* ctPremul = NULL;
 
-                srcOpaque.setConfig(gPairs[i].fConfig, W, H);
-                srcPremul.setConfig(gPairs[i].fConfig, W, H);
+                srcOpaque.setConfig(gPairs[i].fConfig, W, H, 0, kOpaque_SkAlphaType);
+                srcPremul.setConfig(gPairs[i].fConfig, W, H, 0, kPremul_SkAlphaType);
                 if (SkBitmap::kIndex8_Config == gPairs[i].fConfig) {
                     ctOpaque = init_ctable(kOpaque_SkAlphaType);
                     ctPremul = init_ctable(kPremul_SkAlphaType);
@@ -259,9 +259,6 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
                 srcPremul.allocPixels(ctPremul);
                 SkSafeUnref(ctOpaque);
                 SkSafeUnref(ctPremul);
-
-                srcOpaque.setIsOpaque(true);
-                srcPremul.setIsOpaque(false);
             }
             init_src(srcOpaque);
             init_src(srcPremul);
@@ -315,7 +312,7 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
                         REPORTER_ASSERT(reporter, subset.width() == 1);
                         REPORTER_ASSERT(reporter, subset.height() == 1);
                         REPORTER_ASSERT(reporter,
-                                        subset.isOpaque() == bitmap.isOpaque());
+                                        subset.alphaType() == bitmap.alphaType());
                         REPORTER_ASSERT(reporter,
                                         subset.isVolatile() == true);
 
@@ -333,12 +330,11 @@ static void TestBitmapCopy(skiatest::Reporter* reporter) {
                         REPORTER_ASSERT(reporter,
                                     (copy.getColorTable() != NULL) == hasCT);
                     }
-
                     bitmap = srcPremul;
                     bitmap.setIsVolatile(false);
                     if (bitmap.extractSubset(&subset, r)) {
                         REPORTER_ASSERT(reporter,
-                                        subset.isOpaque() == bitmap.isOpaque());
+                                        subset.alphaType() == bitmap.alphaType());
                         REPORTER_ASSERT(reporter,
                                         subset.isVolatile() == false);
                     }
index 924cea2dcc0532e81c6848de38f80413825f2916..d6c9e6ab2fbce13f99c928f2184a76785e34a976 100644 (file)
@@ -31,7 +31,7 @@ namespace skiatest {
                               SkColor color) {
             bitmap.setConfig(config, width, height);
             REPORTER_ASSERT(fReporter, bitmap.allocPixels());
-            bitmap.setIsOpaque(true);
+            bitmap.setAlphaType(kOpaque_SkAlphaType);
             bitmap.eraseColor(color);
         }
 
index e8075bd68fb10daf9f2ac6ed1fbcf0563284079e..537a810aa9175ef478053ef700303bca5f029805 100644 (file)
@@ -333,7 +333,7 @@ static void TestDeferredCanvasFreshFrame(skiatest::Reporter* reporter) {
         paint.setStyle(SkPaint::kFill_Style);
         SkBitmap bmp;
         create(&bmp, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
-        bmp.setIsOpaque(true);
+        bmp.setAlphaType(kOpaque_SkAlphaType);
         SkShader* shader = SkShader::CreateBitmapShader(bmp,
             SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
         paint.setShader(shader)->unref();
@@ -371,7 +371,7 @@ static void TestDeferredCanvasFreshFrame(skiatest::Reporter* reporter) {
         paint.setStyle(SkPaint::kFill_Style);
         SkBitmap bmp;
         create(&bmp, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
-        bmp.setIsOpaque(false);
+        bmp.setAlphaType(kPremul_SkAlphaType);
         SkShader* shader = SkShader::CreateBitmapShader(bmp,
             SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
         paint.setShader(shader)->unref();
index 0af25d1ec21e9e09e7c79c49a248f1bce2357f53..c3dc888ba35098632b2fd7ab3669ea08fe62142f 100644 (file)
@@ -32,7 +32,7 @@ static void test_bitmap(skiatest::Reporter* reporter) {
     shader->unref();
 
     // test 3: explicitly opaque
-    bmp.setIsOpaque(true);
+    bmp.setAlphaType(kOpaque_SkAlphaType);
     shader = SkShader::CreateBitmapShader(bmp,
         SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
     REPORTER_ASSERT(reporter, shader);
@@ -40,7 +40,7 @@ static void test_bitmap(skiatest::Reporter* reporter) {
     shader->unref();
 
     // test 4: explicitly not opaque
-    bmp.setIsOpaque(false);
+    bmp.setAlphaType(kPremul_SkAlphaType);
     shader = SkShader::CreateBitmapShader(bmp,
         SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
     REPORTER_ASSERT(reporter, shader);