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
This commit is contained in:
parent
43a6b6a046
commit
baa0220dfd
@ -107,6 +107,8 @@
|
||||
'<(skia_src_path)/core/SkOrderedWriteBuffer.cpp',
|
||||
'<(skia_src_path)/core/SkPackBits.cpp',
|
||||
'<(skia_src_path)/core/SkPaint.cpp',
|
||||
'<(skia_src_path)/core/SkPaintPriv.cpp',
|
||||
'<(skia_src_path)/core/SkPaintPriv.h',
|
||||
'<(skia_src_path)/core/SkPath.cpp',
|
||||
'<(skia_src_path)/core/SkPathEffect.cpp',
|
||||
'<(skia_src_path)/core/SkPathHeap.cpp',
|
||||
|
@ -18,6 +18,7 @@
|
||||
'../include/utils/unix',
|
||||
'../include/utils/win',
|
||||
'../include/xml',
|
||||
'../src/core',
|
||||
'../src/utils',
|
||||
],
|
||||
'sources': [
|
||||
|
78
src/core/SkPaintPriv.cpp
Normal file
78
src/core/SkPaintPriv.cpp
Normal file
@ -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;
|
||||
}
|
25
src/core/SkPaintPriv.h
Normal file
25
src/core/SkPaintPriv.h
Normal file
@ -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
|
@ -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
|
||||
//-----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user