Index: src/core/SkBitmap.cpp |
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp |
index 96d683c0e2592765351bcf5e9912085b660093a6..6a70c1e089288cf93c99623c88ab6d1dca5b9ecc 100644 |
--- a/src/core/SkBitmap.cpp |
+++ b/src/core/SkBitmap.cpp |
@@ -24,11 +24,6 @@ |
#include "SkPackBits.h" |
#include <new> |
-static bool reset_return_false(SkBitmap* bm) { |
- bm->reset(); |
- return false; |
-} |
- |
struct MipLevel { |
void* fPixels; |
uint32_t fRowBytes; |
@@ -130,9 +125,13 @@ void SkBitmap::swap(SkBitmap& other) { |
SkTSwap(fPixelLockCount, other.fPixelLockCount); |
SkTSwap(fMipMap, other.fMipMap); |
SkTSwap(fPixels, other.fPixels); |
- SkTSwap(fInfo, other.fInfo); |
SkTSwap(fRowBytes, other.fRowBytes); |
+ SkTSwap(fWidth, other.fWidth); |
+ SkTSwap(fHeight, other.fHeight); |
+ SkTSwap(fConfig, other.fConfig); |
+ SkTSwap(fAlphaType, other.fAlphaType); |
SkTSwap(fFlags, other.fFlags); |
+ SkTSwap(fBytesPerPixel, other.fBytesPerPixel); |
SkDEBUGCODE(this->validate();) |
} |
@@ -142,10 +141,6 @@ void SkBitmap::reset() { |
sk_bzero(this, sizeof(*this)); |
} |
-SkBitmap::Config SkBitmap::config() const { |
- return SkColorTypeToBitmapConfig(fInfo.colorType()); |
-} |
- |
int SkBitmap::ComputeBytesPerPixel(SkBitmap::Config config) { |
int bpp; |
switch (config) { |
@@ -172,12 +167,39 @@ int SkBitmap::ComputeBytesPerPixel(SkBitmap::Config config) { |
} |
size_t SkBitmap::ComputeRowBytes(Config c, int width) { |
- return SkColorTypeMinRowBytes(SkBitmapConfigToColorType(c), width); |
+ if (width < 0) { |
+ return 0; |
+ } |
+ |
+ int64_t rowBytes = 0; |
+ |
+ switch (c) { |
+ case kNo_Config: |
+ break; |
+ case kA8_Config: |
+ case kIndex8_Config: |
+ rowBytes = width; |
+ break; |
+ case kRGB_565_Config: |
+ case kARGB_4444_Config: |
+ // assign and then shift, so we don't overflow int |
+ rowBytes = width; |
+ rowBytes <<= 1; |
+ break; |
+ case kARGB_8888_Config: |
+ // assign and then shift, so we don't overflow int |
+ rowBytes = width; |
+ rowBytes <<= 2; |
+ break; |
+ default: |
+ SkDEBUGFAIL("unknown config"); |
+ break; |
+ } |
+ return sk_64_isS32(rowBytes) ? sk_64_asS32(rowBytes) : 0; |
} |
int64_t SkBitmap::ComputeSize64(Config config, int width, int height) { |
- SkColorType ct = SkBitmapConfigToColorType(config); |
- int64_t rowBytes = sk_64_mul(SkColorTypeBytesPerPixel(ct), width); |
+ int64_t rowBytes = sk_64_mul(ComputeBytesPerPixel(config), width); |
return rowBytes * height; |
} |
@@ -190,10 +212,13 @@ int64_t SkBitmap::ComputeSafeSize64(Config config, |
uint32_t width, |
uint32_t height, |
size_t rowBytes) { |
- SkImageInfo info = SkImageInfo::Make(width, height, |
- SkBitmapConfigToColorType(config), |
- kPremul_SkAlphaType); |
- return info.getSafeSize64(rowBytes); |
+ int64_t safeSize = 0; |
+ if (height > 0) { |
+ int64_t lastRow = sk_64_mul(ComputeBytesPerPixel(config), width); |
+ safeSize = sk_64_mul(height - 1, rowBytes) + lastRow; |
+ } |
+ SkASSERT(safeSize >= 0); |
+ return safeSize; |
} |
size_t SkBitmap::ComputeSafeSize(Config config, |
@@ -212,36 +237,35 @@ size_t SkBitmap::ComputeSafeSize(Config config, |
void SkBitmap::getBounds(SkRect* bounds) const { |
SkASSERT(bounds); |
bounds->set(0, 0, |
- SkIntToScalar(fInfo.fWidth), SkIntToScalar(fInfo.fHeight)); |
+ SkIntToScalar(fWidth), SkIntToScalar(fHeight)); |
} |
void SkBitmap::getBounds(SkIRect* bounds) const { |
SkASSERT(bounds); |
- bounds->set(0, 0, fInfo.fWidth, fInfo.fHeight); |
+ bounds->set(0, 0, fWidth, fHeight); |
} |
/////////////////////////////////////////////////////////////////////////////// |
-static bool validate_alphaType(SkColorType colorType, SkAlphaType alphaType, |
+static bool validate_alphaType(SkBitmap::Config config, SkAlphaType alphaType, |
SkAlphaType* canonical = NULL) { |
- switch (colorType) { |
- case kUnknown_SkColorType: |
+ switch (config) { |
+ case SkBitmap::kNo_Config: |
alphaType = kIgnore_SkAlphaType; |
break; |
- case kAlpha_8_SkColorType: |
+ case SkBitmap::kA8_Config: |
if (kUnpremul_SkAlphaType == alphaType) { |
alphaType = kPremul_SkAlphaType; |
} |
// fall-through |
- case kIndex_8_SkColorType: |
- case kARGB_4444_SkColorType: |
- case kRGBA_8888_SkColorType: |
- case kBGRA_8888_SkColorType: |
+ case SkBitmap::kIndex8_Config: |
+ case SkBitmap::kARGB_4444_Config: |
+ case SkBitmap::kARGB_8888_Config: |
if (kIgnore_SkAlphaType == alphaType) { |
return false; |
} |
break; |
- case kRGB_565_SkColorType: |
+ case SkBitmap::kRGB_565_Config: |
alphaType = kOpaque_SkAlphaType; |
break; |
default: |
@@ -253,48 +277,52 @@ static bool validate_alphaType(SkColorType colorType, SkAlphaType alphaType, |
return true; |
} |
-bool SkBitmap::setConfig(const SkImageInfo& info, size_t rowBytes) { |
- // require that rowBytes fit in 31bits |
- int64_t mrb = info.minRowBytes64(); |
- if ((int32_t)mrb != mrb) { |
- return reset_return_false(this); |
- } |
- if ((int64_t)rowBytes != (int32_t)rowBytes) { |
- return reset_return_false(this); |
+bool SkBitmap::setConfig(Config config, int width, int height, size_t rowBytes, |
+ SkAlphaType alphaType) { |
+ if ((width | height) < 0) { |
+ goto BAD_CONFIG; |
} |
- |
- if (info.width() < 0 || info.height() < 0) { |
- return reset_return_false(this); |
+ if (rowBytes == 0) { |
+ rowBytes = SkBitmap::ComputeRowBytes(config, width); |
+ if (0 == rowBytes && kNo_Config != config && width > 0) { |
+ goto BAD_CONFIG; |
+ } |
} |
- if (kUnknown_SkColorType == info.colorType()) { |
- rowBytes = 0; |
- } else if (0 == rowBytes) { |
- rowBytes = (size_t)mrb; |
- } else if (rowBytes < info.minRowBytes()) { |
- return reset_return_false(this); |
+ if (!validate_alphaType(config, alphaType, &alphaType)) { |
+ goto BAD_CONFIG; |
} |
this->freePixels(); |
- fInfo = info; |
- fRowBytes = SkToU32(rowBytes); |
+ fConfig = SkToU8(config); |
+ fAlphaType = SkToU8(alphaType); |
+ fWidth = width; |
+ fHeight = height; |
+ fRowBytes = SkToU32(rowBytes); |
+ |
+ fBytesPerPixel = (uint8_t)ComputeBytesPerPixel(config); |
+ |
+ SkDEBUGCODE(this->validate();) |
return true; |
+ |
+ // if we got here, we had an error, so we reset the bitmap to empty |
+BAD_CONFIG: |
+ this->reset(); |
+ return false; |
} |
-bool SkBitmap::setConfig(Config config, int width, int height, size_t rowBytes, |
- SkAlphaType alphaType) { |
- SkColorType ct = SkBitmapConfigToColorType(config); |
- return this->setConfig(SkImageInfo::Make(width, height, ct, alphaType), |
- rowBytes); |
+bool SkBitmap::setConfig(const SkImageInfo& info, size_t rowBytes) { |
+ return this->setConfig(SkImageInfoToBitmapConfig(info), info.fWidth, |
+ info.fHeight, rowBytes, info.fAlphaType); |
} |
bool SkBitmap::setAlphaType(SkAlphaType alphaType) { |
- if (!validate_alphaType(fInfo.fColorType, alphaType, &alphaType)) { |
+ if (!validate_alphaType(this->config(), alphaType, &alphaType)) { |
return false; |
} |
- if (fInfo.fAlphaType != alphaType) { |
- fInfo.fAlphaType = alphaType; |
+ if (fAlphaType != alphaType) { |
+ fAlphaType = SkToU8(alphaType); |
if (fPixelRef) { |
fPixelRef->changeAlphaType(alphaType); |
} |
@@ -311,7 +339,7 @@ void SkBitmap::updatePixelsFromRef() const { |
if (NULL != p) { |
p = (char*)p |
+ fPixelRefOrigin.fY * fRowBytes |
- + fPixelRefOrigin.fX * fInfo.bytesPerPixel(); |
+ + fPixelRefOrigin.fX * fBytesPerPixel; |
} |
fPixels = p; |
fColorTable = fPixelRef->colorTable(); |
@@ -351,6 +379,20 @@ static bool config_to_colorType(SkBitmap::Config config, SkColorType* ctOut) { |
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, int dx, int dy) { |
#ifdef SK_DEBUG |
if (pr) { |
@@ -362,7 +404,7 @@ SkPixelRef* SkBitmap::setPixelRef(SkPixelRef* pr, int dx, int dy) { |
SkASSERT(info.fColorType == prInfo.fColorType); |
switch (prInfo.fAlphaType) { |
case kIgnore_SkAlphaType: |
- SkASSERT(fInfo.fAlphaType == kIgnore_SkAlphaType); |
+ SkASSERT(fAlphaType == kIgnore_SkAlphaType); |
break; |
case kOpaque_SkAlphaType: |
case kPremul_SkAlphaType: |
@@ -460,6 +502,11 @@ bool SkBitmap::allocPixels(Allocator* allocator, SkColorTable* ctable) { |
/////////////////////////////////////////////////////////////////////////////// |
+static bool reset_return_false(SkBitmap* bm) { |
+ bm->reset(); |
+ return false; |
+} |
+ |
bool SkBitmap::allocPixels(const SkImageInfo& info, SkPixelRefFactory* factory, |
SkColorTable* ctable) { |
if (kIndex_8_SkColorType == info.fColorType && NULL == ctable) { |
@@ -515,6 +562,10 @@ bool SkBitmap::allocConfigPixels(Config config, int width, int height, |
} |
SkAlphaType at = isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
+ if (!validate_alphaType(config, at, &at)) { |
+ return false; |
+ } |
+ |
return this->allocPixels(SkImageInfo::Make(width, height, ct, at)); |
} |
@@ -586,6 +637,13 @@ bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst, |
/////////////////////////////////////////////////////////////////////////////// |
+size_t SkBitmap::getSafeSize() const { |
+ // This is intended to be a size_t version of ComputeSafeSize64(), just |
+ // faster. The computation is meant to be identical. |
+ return (fHeight ? ((fHeight - 1) * fRowBytes) + |
+ ComputeRowBytes(this->config(), fWidth): 0); |
+} |
+ |
bool SkBitmap::copyPixelsTo(void* const dst, size_t dstSize, |
size_t dstRowBytes, bool preserveDstPad) const { |
@@ -593,10 +651,9 @@ bool SkBitmap::copyPixelsTo(void* const dst, size_t dstSize, |
dstRowBytes = fRowBytes; |
} |
- if (dstRowBytes < fInfo.minRowBytes() || |
- dst == NULL || (getPixels() == NULL && pixelRef() == NULL)) { |
+ if (dstRowBytes < ComputeRowBytes(this->config(), fWidth) || |
+ dst == NULL || (getPixels() == NULL && pixelRef() == NULL)) |
return false; |
- } |
if (!preserveDstPad && static_cast<uint32_t>(dstRowBytes) == fRowBytes) { |
size_t safeSize = this->getSafeSize(); |
@@ -613,15 +670,16 @@ bool SkBitmap::copyPixelsTo(void* const dst, size_t dstSize, |
} |
} else { |
// If destination has different stride than us, then copy line by line. |
- if (fInfo.getSafeSize(dstRowBytes) > dstSize) { |
+ if (ComputeSafeSize(this->config(), fWidth, fHeight, dstRowBytes) > |
+ dstSize) |
return false; |
- } else { |
+ else { |
// Just copy what we need on each line. |
- size_t rowBytes = fInfo.minRowBytes(); |
+ size_t rowBytes = ComputeRowBytes(this->config(), fWidth); |
SkAutoLockPixels lock(*this); |
const uint8_t* srcP = reinterpret_cast<const uint8_t*>(getPixels()); |
uint8_t* dstP = reinterpret_cast<uint8_t*>(dst); |
- for (int row = 0; row < fInfo.fHeight; |
+ for (uint32_t row = 0; row < fHeight; |
row++, srcP += fRowBytes, dstP += dstRowBytes) { |
memcpy(dstP, srcP, rowBytes); |
} |
@@ -665,19 +723,19 @@ void* SkBitmap::getAddr(int x, int y) const { |
char* base = (char*)this->getPixels(); |
if (base) { |
base += y * this->rowBytes(); |
- switch (this->colorType()) { |
- case kRGBA_8888_SkColorType: |
- case kBGRA_8888_SkColorType: |
+ switch (this->config()) { |
+ case SkBitmap::kARGB_8888_Config: |
base += x << 2; |
break; |
- case kARGB_4444_SkColorType: |
- case kRGB_565_SkColorType: |
+ case SkBitmap::kARGB_4444_Config: |
+ case SkBitmap::kRGB_565_Config: |
base += x << 1; |
break; |
- case kAlpha_8_SkColorType: |
- case kIndex_8_SkColorType: |
+ case SkBitmap::kA8_Config: |
+ case SkBitmap::kIndex8_Config: |
base += x; |
break; |
+ break; |
default: |
SkDEBUGFAIL("Can't return addr for config"); |
base = NULL; |
@@ -815,12 +873,8 @@ void SkBitmap::internalErase(const SkIRect& area, |
} |
#endif |
- switch (fInfo.colorType()) { |
- case kUnknown_SkColorType: |
- case kIndex_8_SkColorType: |
- return; // can't erase |
- default: |
- break; |
+ if (kNo_Config == fConfig || kIndex8_Config == fConfig) { |
+ return; |
} |
SkAutoLockPixels alp(*this); |
@@ -840,8 +894,8 @@ void SkBitmap::internalErase(const SkIRect& area, |
b = SkAlphaMul(b, a); |
} |
- switch (this->colorType()) { |
- case kAlpha_8_SkColorType: { |
+ switch (fConfig) { |
+ case kA8_Config: { |
uint8_t* p = this->getAddr8(area.fLeft, area.fTop); |
while (--height >= 0) { |
memset(p, a, width); |
@@ -849,12 +903,12 @@ void SkBitmap::internalErase(const SkIRect& area, |
} |
break; |
} |
- case kARGB_4444_SkColorType: |
- case kRGB_565_SkColorType: { |
+ case kARGB_4444_Config: |
+ case kRGB_565_Config: { |
uint16_t* p = this->getAddr16(area.fLeft, area.fTop);; |
uint16_t v; |
- if (kARGB_4444_SkColorType == this->colorType()) { |
+ if (kARGB_4444_Config == fConfig) { |
v = pack_8888_to_4444(a, r, g, b); |
} else { |
v = SkPackRGB16(r >> (8 - SK_R16_BITS), |
@@ -867,9 +921,7 @@ void SkBitmap::internalErase(const SkIRect& area, |
} |
break; |
} |
- case kPMColor_SkColorType: { |
- // what to do about BGRA or RGBA (which ever is != PMColor ? |
- // for now we don't support them. |
+ case kARGB_8888_Config: { |
uint32_t* p = this->getAddr32(area.fLeft, area.fTop); |
uint32_t v = SkPackARGB32(a, r, g, b); |
@@ -879,8 +931,6 @@ void SkBitmap::internalErase(const SkIRect& area, |
} |
break; |
} |
- default: |
- return; // no change, so don't call notifyPixelsChanged() |
} |
this->notifyPixelsChanged(); |
@@ -996,8 +1046,7 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
if (fPixelRef) { |
SkIRect subset; |
- subset.setXYWH(fPixelRefOrigin.fX, fPixelRefOrigin.fY, |
- fInfo.width(), fInfo.height()); |
+ subset.setXYWH(fPixelRefOrigin.fX, fPixelRefOrigin.fY, fWidth, fHeight); |
if (fPixelRef->readPixels(&tmpSrc, &subset)) { |
SkASSERT(tmpSrc.width() == this->width()); |
SkASSERT(tmpSrc.height() == this->height()); |
@@ -1111,8 +1160,6 @@ bool SkBitmap::copyTo(SkBitmap* dst, Config dstConfig, Allocator* alloc) const { |
} |
bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const { |
- const SkColorType dstCT = SkBitmapConfigToColorType(dstConfig); |
- |
if (!this->canCopyTo(dstConfig)) { |
return false; |
} |
@@ -1123,7 +1170,7 @@ bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const { |
SkPixelRef* pixelRef = fPixelRef->deepCopy(dstConfig); |
if (pixelRef) { |
uint32_t rowBytes; |
- if (this->colorType() == dstCT) { |
+ if (dstConfig == fConfig) { |
// Since there is no subset to pass to deepCopy, and deepCopy |
// succeeded, the new pixel ref must be identical. |
SkASSERT(fPixelRef->info() == pixelRef->info()); |
@@ -1134,12 +1181,7 @@ bool SkBitmap::deepCopyTo(SkBitmap* dst, Config dstConfig) const { |
// With the new config, an appropriate fRowBytes will be computed by setConfig. |
rowBytes = 0; |
} |
- |
- SkImageInfo info = fInfo; |
- info.fColorType = dstCT; |
- if (!dst->setConfig(info, rowBytes)) { |
- return false; |
- } |
+ dst->setConfig(dstConfig, fWidth, fHeight, rowBytes); |
dst->setPixelRef(pixelRef, fPixelRefOrigin)->unref(); |
return true; |
} |
@@ -1542,8 +1584,11 @@ enum { |
}; |
void SkBitmap::flatten(SkWriteBuffer& buffer) const { |
- fInfo.flatten(buffer); |
+ buffer.writeInt(fWidth); |
+ buffer.writeInt(fHeight); |
buffer.writeInt(fRowBytes); |
+ buffer.writeInt(fConfig); |
+ buffer.writeInt(fAlphaType); |
if (fPixelRef) { |
if (fPixelRef->getFactory()) { |
@@ -1563,17 +1608,19 @@ void SkBitmap::flatten(SkWriteBuffer& buffer) const { |
void SkBitmap::unflatten(SkReadBuffer& buffer) { |
this->reset(); |
- SkImageInfo info; |
- info.unflatten(buffer); |
- size_t rowBytes = buffer.readInt(); |
- buffer.validate((info.width() >= 0) && (info.height() >= 0) && |
- SkColorTypeIsValid(info.fColorType) && |
- SkAlphaTypeIsValid(info.fAlphaType) && |
- validate_alphaType(info.fColorType, info.fAlphaType) && |
- info.validRowBytes(rowBytes)); |
+ int width = buffer.readInt(); |
+ int height = buffer.readInt(); |
+ int rowBytes = buffer.readInt(); |
+ Config config = (Config)buffer.readInt(); |
+ SkAlphaType alphaType = (SkAlphaType)buffer.readInt(); |
+ buffer.validate((width >= 0) && (height >= 0) && (rowBytes >= 0) && |
+ SkIsValidConfig(config) && validate_alphaType(config, alphaType)); |
- bool configIsValid = this->setConfig(info, rowBytes); |
- buffer.validate(configIsValid); |
+ bool configIsValid = this->setConfig(config, width, height, rowBytes, alphaType); |
+ // Note : Using (fRowBytes >= (fWidth * fBytesPerPixel)) in the following test can create false |
+ // positives if the multiplication causes an integer overflow. Use the division instead. |
+ buffer.validate(configIsValid && (fBytesPerPixel > 0) && |
+ ((fRowBytes / fBytesPerPixel) >= fWidth)); |
int reftype = buffer.readInt(); |
if (buffer.validate((SERIALIZE_PIXELTYPE_REF_DATA == reftype) || |
@@ -1583,7 +1630,7 @@ void SkBitmap::unflatten(SkReadBuffer& buffer) { |
SkIPoint origin; |
origin.fX = buffer.readInt(); |
origin.fY = buffer.readInt(); |
- size_t offset = origin.fY * rowBytes + origin.fX * info.bytesPerPixel(); |
+ size_t offset = origin.fY * rowBytes + origin.fX * fBytesPerPixel; |
SkPixelRef* pr = buffer.readPixelRef(); |
if (!buffer.validate((NULL == pr) || |
(pr->getAllocatedSizeInBytes() >= (offset + this->getSafeSize())))) { |
@@ -1616,14 +1663,15 @@ SkBitmap::RLEPixels::~RLEPixels() { |
#ifdef SK_DEBUG |
void SkBitmap::validate() const { |
- fInfo.validate(); |
- SkASSERT(fInfo.validRowBytes(fRowBytes)); |
+ SkASSERT(fConfig < kConfigCount); |
+ SkASSERT(fRowBytes >= (unsigned)ComputeRowBytes((Config)fConfig, fWidth)); |
uint8_t allFlags = kImageIsOpaque_Flag | kImageIsVolatile_Flag | kImageIsImmutable_Flag; |
#ifdef SK_BUILD_FOR_ANDROID |
allFlags |= kHasHardwareMipMap_Flag; |
#endif |
SkASSERT(fFlags <= allFlags); |
SkASSERT(fPixelLockCount >= 0); |
+ SkASSERT((uint8_t)ComputeBytesPerPixel((Config)fConfig) == fBytesPerPixel); |
if (fPixels) { |
SkASSERT(fPixelRef); |
@@ -1632,9 +1680,9 @@ void SkBitmap::validate() const { |
SkASSERT(fPixelRef->rowBytes() == fRowBytes); |
SkASSERT(fPixelRefOrigin.fX >= 0); |
SkASSERT(fPixelRefOrigin.fY >= 0); |
- SkASSERT(fPixelRef->info().width() >= (int)this->width() + fPixelRefOrigin.fX); |
- SkASSERT(fPixelRef->info().fHeight >= (int)this->height() + fPixelRefOrigin.fY); |
- SkASSERT(fPixelRef->rowBytes() >= fInfo.minRowBytes()); |
+ SkASSERT(fPixelRef->info().fWidth >= (int)fWidth + fPixelRefOrigin.fX); |
+ SkASSERT(fPixelRef->info().fHeight >= (int)fHeight + fPixelRefOrigin.fY); |
+ SkASSERT(fPixelRef->rowBytes() >= fWidth * fBytesPerPixel); |
} else { |
SkASSERT(NULL == fColorTable); |
} |
@@ -1680,14 +1728,3 @@ void SkBitmap::toString(SkString* str) const { |
str->append(")"); |
} |
#endif |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-#ifdef SK_DEBUG |
-void SkImageInfo::validate() const { |
- SkASSERT(fWidth >= 0); |
- SkASSERT(fHeight >= 0); |
- SkASSERT(SkColorTypeIsValid(fColorType)); |
- SkASSERT(SkAlphaTypeIsValid(fAlphaType)); |
-} |
-#endif |