Fix for crash in SkDeferredCanvas when optional SkPaint argument is NULL
BUG=http://code.google.com/p/skia/issues/detail?id=505
TEST=Canvas unit test
REVIEW=http://codereview.appspot.com/5699054/
git-svn-id: http://skia.googlecode.com/svn/trunk@3246 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
index 19b98a8..00a26b9 100644
--- a/src/utils/SkDeferredCanvas.cpp
+++ b/src/utils/SkDeferredCanvas.cpp
@@ -15,47 +15,52 @@
namespace {
-bool isPaintOpaque(const SkPaint& paint, const SkBitmap* bmpReplacesShader = NULL) {
+bool isPaintOpaque(const SkPaint* paint, const SkBitmap* bmpReplacesShader = NULL) {
// TODO: SkXfermode should have a virtual isOpaque method, which would
// make it possible to test modes that do not have a Coeff representation.
+
+ if (!paint) {
+ return bmpReplacesShader ? bmpReplacesShader->isOpaque() : true;
+ }
+
SkXfermode::Coeff srcCoeff, dstCoeff;
- if (SkXfermode::AsCoeff(paint.getXfermode(), &srcCoeff, &dstCoeff)){
+ if (SkXfermode::AsCoeff(paint->getXfermode(), &srcCoeff, &dstCoeff)){
switch (dstCoeff) {
case SkXfermode::kZero_Coeff:
return true;
case SkXfermode::kISA_Coeff:
- if (paint.getAlpha() != 255) {
+ if (paint->getAlpha() != 255) {
break;
}
if (bmpReplacesShader) {
if (!bmpReplacesShader->isOpaque()) {
break;
}
- } else if (paint.getShader() && !paint.getShader()->isOpaque()) {
+ } else if (paint->getShader() && !paint->getShader()->isOpaque()) {
break;
}
- if (paint.getColorFilter() && ((paint.getColorFilter()->getFlags() &
+ if (paint->getColorFilter() && ((paint->getColorFilter()->getFlags() &
SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
break;
}
return true;
case SkXfermode::kSA_Coeff:
- if (paint.getAlpha() != 0) {
+ if (paint->getAlpha() != 0) {
break;
}
- if (paint.getColorFilter() && ((paint.getColorFilter()->getFlags() &
+ if (paint->getColorFilter() && ((paint->getColorFilter()->getFlags() &
SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
break;
}
return true;
case SkXfermode::kSC_Coeff:
- if (paint.getColor() != 0) { // all components must be 0
+ if (paint->getColor() != 0) { // all components must be 0
break;
}
- if (bmpReplacesShader || paint.getShader()) {
+ if (bmpReplacesShader || paint->getShader()) {
break;
}
- if (paint.getColorFilter() && ((paint.getColorFilter()->getFlags() &
+ if (paint->getColorFilter() && ((paint->getColorFilter()->getFlags() &
SkColorFilter::kAlphaUnchanged_Flag) == 0)) {
break;
}
@@ -297,7 +302,7 @@
void SkDeferredCanvas::drawPaint(const SkPaint& paint)
{
- if (fDeferredDrawing && isFullFrame(NULL, &paint) && isPaintOpaque(paint)) {
+ if (fDeferredDrawing && isFullFrame(NULL, &paint) && isPaintOpaque(&paint)) {
getDeferredDevice()->contentsCleared();
}
@@ -312,7 +317,7 @@
void SkDeferredCanvas::drawRect(const SkRect& rect, const SkPaint& paint)
{
- if (fDeferredDrawing && isFullFrame(&rect, &paint) && isPaintOpaque(paint)) {
+ if (fDeferredDrawing && isFullFrame(&rect, &paint) && isPaintOpaque(&paint)) {
getDeferredDevice()->contentsCleared();
}
@@ -331,7 +336,7 @@
SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()));
if (fDeferredDrawing &&
isFullFrame(&bitmapRect, paint) &&
- isPaintOpaque(*paint, &bitmap)) {
+ isPaintOpaque(paint, &bitmap)) {
getDeferredDevice()->contentsCleared();
}
@@ -345,7 +350,7 @@
{
if (fDeferredDrawing &&
isFullFrame(&dst, paint) &&
- isPaintOpaque(*paint, &bitmap)) {
+ isPaintOpaque(paint, &bitmap)) {
getDeferredDevice()->contentsCleared();
}
@@ -386,7 +391,7 @@
SkIntToScalar(bitmap.height()));
if (fDeferredDrawing &&
isFullFrame(&bitmapRect, paint) &&
- isPaintOpaque(*paint, &bitmap)) {
+ isPaintOpaque(paint, &bitmap)) {
getDeferredDevice()->contentsCleared();
}