diff options
author | 2013-01-24 14:38:23 +0000 | |
---|---|---|
committer | 2013-01-24 14:38:23 +0000 | |
commit | baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3 (patch) | |
tree | 862401b0d34f903df91f8305d86efd8946b4fe67 /src | |
parent | 43a6b6a046774576378dfb725e19632a0c8530b7 (diff) |
Move code in isPaintOpaque from SkDeferredCanvas.cpp to SkPaintPriv
The purpose of this code move is to make it re-usable in order to implement
occlusion culling optimizations in SkPicture similar to what we have now
in SkDeferredCanvas.
BUG=https://code.google.com/p/chromium/issues/detail?id=164530
Review URL: https://codereview.appspot.com/7196046
git-svn-id: http://skia.googlecode.com/svn/trunk@7361 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPaintPriv.cpp | 78 | ||||
-rw-r--r-- | src/core/SkPaintPriv.h | 25 | ||||
-rw-r--r-- | src/utils/SkDeferredCanvas.cpp | 72 |
3 files changed, 105 insertions, 70 deletions
diff --git a/src/core/SkPaintPriv.cpp b/src/core/SkPaintPriv.cpp new file mode 100644 index 0000000000..ce05389019 --- /dev/null +++ b/src/core/SkPaintPriv.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkPaintPriv.h" + +#include "SkBitmap.h" +#include "SkColorFilter.h" +#include "SkPaint.h" +#include "SkShader.h" + +bool isPaintOpaque(const SkPaint* paint, + const SkBitmap* bmpReplacesShader) { + // 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::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff || + SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) { + return false; + } + switch (dstCoeff) { + case SkXfermode::kZero_Coeff: + return true; + case SkXfermode::kISA_Coeff: + if (paint->getAlpha() != 255) { + break; + } + if (bmpReplacesShader) { + if (!bmpReplacesShader->isOpaque()) { + break; + } + } else if (paint->getShader() && !paint->getShader()->isOpaque()) { + break; + } + if (paint->getColorFilter() && + ((paint->getColorFilter()->getFlags() & + SkColorFilter::kAlphaUnchanged_Flag) == 0)) { + break; + } + return true; + case SkXfermode::kSA_Coeff: + if (paint->getAlpha() != 0) { + break; + } + 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 + break; + } + if (bmpReplacesShader || paint->getShader()) { + break; + } + if (paint->getColorFilter() && ( + (paint->getColorFilter()->getFlags() & + SkColorFilter::kAlphaUnchanged_Flag) == 0)) { + break; + } + return true; + default: + break; + } + } + return false; +} diff --git a/src/core/SkPaintPriv.h b/src/core/SkPaintPriv.h new file mode 100644 index 0000000000..38c9063e56 --- /dev/null +++ b/src/core/SkPaintPriv.h @@ -0,0 +1,25 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkPaintPriv_DEFINED +#define SkPaintPriv_DEFINED + +class SkBitmap; +class SkPaint; + +#include "SkTypes.h" +/** Returns true if draw calls that use the paint will completely occlude + canvas contents that are covered by the draw. + @param paint The paint to be analyzed, NULL is equivalent to + the default paint. + @param bmpReplacesShader a bitmap to be used in place of the paint's + shader. + @return true if paint is opaque +*/ +bool isPaintOpaque(const SkPaint* paint, + const SkBitmap* bmpReplacesShader = NULL); +#endif diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp index 3c6dc2c7ef..5119729447 100644 --- a/src/utils/SkDeferredCanvas.cpp +++ b/src/utils/SkDeferredCanvas.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2012 Google Inc. + * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. @@ -14,6 +14,7 @@ #include "SkDrawFilter.h" #include "SkGPipe.h" #include "SkPaint.h" +#include "SkPaintPriv.h" #include "SkRRect.h" #include "SkShader.h" @@ -54,75 +55,6 @@ bool shouldDrawImmediately(const SkBitmap* bitmap, const SkPaint* paint, } } -namespace { - -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::kDA_Coeff == srcCoeff || SkXfermode::kDC_Coeff == srcCoeff || - SkXfermode::kIDA_Coeff == srcCoeff || SkXfermode::kIDC_Coeff == srcCoeff) { - return false; - } - switch (dstCoeff) { - case SkXfermode::kZero_Coeff: - return true; - case SkXfermode::kISA_Coeff: - if (paint->getAlpha() != 255) { - break; - } - if (bmpReplacesShader) { - if (!bmpReplacesShader->isOpaque()) { - break; - } - } else if (paint->getShader() && !paint->getShader()->isOpaque()) { - break; - } - if (paint->getColorFilter() && - ((paint->getColorFilter()->getFlags() & - SkColorFilter::kAlphaUnchanged_Flag) == 0)) { - break; - } - return true; - case SkXfermode::kSA_Coeff: - if (paint->getAlpha() != 0) { - break; - } - 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 - break; - } - if (bmpReplacesShader || paint->getShader()) { - break; - } - if (paint->getColorFilter() && ( - (paint->getColorFilter()->getFlags() & - SkColorFilter::kAlphaUnchanged_Flag) == 0)) { - break; - } - return true; - default: - break; - } - } - return false; -} - -} // unnamed namespace - //----------------------------------------------------------------------------- // DeferredPipeController //----------------------------------------------------------------------------- |