Revert of Implement canComputeFastBounds() for image filters. (patchset #8 id:130001 of https://codereview.chromium.org/1296943002/ )

Reason for revert:
This causes a syntax error.

http://build.chromium.org/p/tryserver.chromium.mac/builders/mac_chromium_compile_dbg_ng/builds/87819/steps/compile%20%28with%20patch%29/logs/stdio

Original issue's description:
> Implement canComputeFastBounds() for image filters.
>
> Image filters have never implemented this check, which means that
> filters which affect transparent black falsely claim they can compute
> their bounds.
>
> Implemented an affectsTransparentBlack() virtual for image
> filters, and a similar helper function for color filters.
>
> This will affect the following GMs: imagefiltersscaled
> (lighting, perlin noise now filter to clip),
> colorfilterimagefilter (new test case), imagefiltersclipped
> (perlin noise now filters to clip).
>
> Note: I de-inlined SkPaint::canComputeFastBounds() to avoid adding
> a dependency from SkPaint.h to SkImageFilter.h.h. Skia benches show
> no impact from this change, but will watch the perf bots carefully.
>
> BUG=4212
>
> Committed: https://skia.googlesource.com/skia/+/915881fe743f9a789037695f543bc6ea189cd0cb

TBR=reed@google.com,senorblanco@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=4212

Review URL: https://codereview.chromium.org/1300403003
This commit is contained in:
herb 2015-08-20 09:28:45 -07:00 committed by Commit bot
parent 877a52ae61
commit 12d8472d31
13 changed files with 8 additions and 117 deletions

View File

@ -45,7 +45,7 @@ static SkImageFilter* make_grayscale(SkImageFilter* input = NULL) {
static SkImageFilter* make_mode_blue(SkImageFilter* input = NULL) { static SkImageFilter* make_mode_blue(SkImageFilter* input = NULL) {
SkAutoTUnref<SkColorFilter> filter( SkAutoTUnref<SkColorFilter> filter(
SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrc_Mode)); SkColorFilter::CreateModeFilter(SK_ColorBLUE, SkXfermode::kSrcIn_Mode));
return SkColorFilterImageFilter::Create(filter, input); return SkColorFilterImageFilter::Create(filter, input);
} }
@ -120,12 +120,6 @@ protected:
drawClippedRect(canvas, r, paint, 3); drawClippedRect(canvas, r, paint, 3);
canvas->translate(FILTER_WIDTH + MARGIN, 0); canvas->translate(FILTER_WIDTH + MARGIN, 0);
} }
{
SkAutoTUnref<SkImageFilter> blue(make_mode_blue());
paint.setImageFilter(blue.get());
drawClippedRect(canvas, r, paint, 5);
canvas->translate(FILTER_WIDTH + MARGIN, 0);
}
} }
private: private:

View File

@ -131,7 +131,6 @@ protected:
paint.setAntiAlias(true); paint.setAntiAlias(true);
canvas->save(); canvas->save();
canvas->scale(scales[j].fX, scales[j].fY); canvas->scale(scales[j].fX, scales[j].fY);
canvas->clipRect(r);
if (5 == i) { if (5 == i) {
canvas->translate(SkIntToScalar(-32), 0); canvas->translate(SkIntToScalar(-32), 0);
} else if (6 == i) { } else if (6 == i) {

View File

@ -140,10 +140,6 @@ public:
return false; return false;
} }
bool affectsTransparentBlack() const {
return this->filterColor(0) != 0;
}
SK_TO_STRING_PUREVIRT() SK_TO_STRING_PUREVIRT()
SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()

View File

@ -178,7 +178,6 @@ public:
bool asAColorFilter(SkColorFilter** filterPtr) const { bool asAColorFilter(SkColorFilter** filterPtr) const {
return this->countInputs() > 0 && return this->countInputs() > 0 &&
NULL == this->getInput(0) && NULL == this->getInput(0) &&
!this->affectsTransparentBlack() &&
this->isColorFilterNode(filterPtr); this->isColorFilterNode(filterPtr);
} }
@ -215,9 +214,6 @@ public:
// Default impl returns union of all input bounds. // Default impl returns union of all input bounds.
virtual void computeFastBounds(const SkRect&, SkRect*) const; virtual void computeFastBounds(const SkRect&, SkRect*) const;
// Can this filter DAG compute the resulting bounds of an object-space rectangle?
bool canComputeFastBounds() const;
/** /**
* Create an SkMatrixImageFilter, which transforms its input by the given matrix. * Create an SkMatrixImageFilter, which transforms its input by the given matrix.
*/ */
@ -366,14 +362,6 @@ protected:
virtual bool asFragmentProcessor(GrFragmentProcessor**, GrProcessorDataManager*, GrTexture*, virtual bool asFragmentProcessor(GrFragmentProcessor**, GrProcessorDataManager*, GrTexture*,
const SkMatrix&, const SkIRect& bounds) const; const SkMatrix&, const SkIRect& bounds) const;
/**
* Returns true if this filter can cause transparent black pixels to become
* visible (ie., alpha > 0). The default implementation returns false. This
* function is non-recursive, i.e., only queries this filter and not its
* inputs.
*/
virtual bool affectsTransparentBlack() const;
private: private:
friend class SkGraphics; friend class SkGraphics;
static void PurgeCache(); static void PurgeCache();

View File

@ -9,6 +9,7 @@
#define SkPaint_DEFINED #define SkPaint_DEFINED
#include "SkColor.h" #include "SkColor.h"
#include "SkDrawLooper.h"
#include "SkFilterQuality.h" #include "SkFilterQuality.h"
#include "SkMatrix.h" #include "SkMatrix.h"
#include "SkXfermode.h" #include "SkXfermode.h"
@ -19,7 +20,6 @@ class SkAutoGlyphCache;
class SkColorFilter; class SkColorFilter;
class SkData; class SkData;
class SkDescriptor; class SkDescriptor;
class SkDrawLooper;
class SkReadBuffer; class SkReadBuffer;
class SkWriteBuffer; class SkWriteBuffer;
class SkGlyph; class SkGlyph;
@ -909,7 +909,12 @@ public:
bounds (i.e. there is nothing complex like a patheffect that would make bounds (i.e. there is nothing complex like a patheffect that would make
the bounds computation expensive. the bounds computation expensive.
*/ */
bool canComputeFastBounds() const; bool canComputeFastBounds() const {
if (this->getLooper()) {
return this->getLooper()->canComputeFastBounds(*this);
}
return !this->getRasterizer();
}
/** Only call this if canComputeFastBounds() returned true. This takes a /** Only call this if canComputeFastBounds() returned true. This takes a
raw rectangle (the raw bounds of a shape), and adjusts it for stylistic raw rectangle (the raw bounds of a shape), and adjusts it for stylistic

View File

@ -29,7 +29,6 @@ protected:
SkBitmap* result, SkIPoint* loc) const override; SkBitmap* result, SkIPoint* loc) const override;
bool onIsColorFilterNode(SkColorFilter**) const override; bool onIsColorFilterNode(SkColorFilter**) const override;
bool affectsTransparentBlack() const override;
private: private:
SkColorFilterImageFilter(SkColorFilter* cf, SkColorFilterImageFilter(SkColorFilter* cf,

View File

@ -49,7 +49,6 @@ protected:
void flatten(SkWriteBuffer&) const override; void flatten(SkWriteBuffer&) const override;
const SkImageFilterLight* light() const { return fLight.get(); } const SkImageFilterLight* light() const { return fLight.get(); }
SkScalar surfaceScale() const { return fSurfaceScale; } SkScalar surfaceScale() const { return fSurfaceScale; }
bool affectsTransparentBlack() const override { return true; }
private: private:
typedef SkImageFilter INHERITED; typedef SkImageFilter INHERITED;

View File

@ -30,7 +30,6 @@ public:
static SkRectShaderImageFilter* Create(SkShader* s, const CropRect* rect = NULL); static SkRectShaderImageFilter* Create(SkShader* s, const CropRect* rect = NULL);
virtual ~SkRectShaderImageFilter(); virtual ~SkRectShaderImageFilter();
bool affectsTransparentBlack() const override;
SK_TO_STRING_OVERRIDE() SK_TO_STRING_OVERRIDE()
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkRectShaderImageFilter) SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkRectShaderImageFilter)

View File

@ -284,23 +284,6 @@ void SkImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) const {
} }
} }
bool SkImageFilter::canComputeFastBounds() const {
if (this->affectsTransparentBlack()) {
return false;
}
for (int i = 0; i < fInputCount; i++) {
SkImageFilter* input = this->getInput(i);
if (input && !input->canComputeFastBounds()) {
return false;
}
}
return true;
}
bool SkImageFilter::affectsTransparentBlack() const {
return false;
}
bool SkImageFilter::onFilterImage(Proxy*, const SkBitmap&, const Context&, bool SkImageFilter::onFilterImage(Proxy*, const SkBitmap&, const Context&,
SkBitmap*, SkIPoint*) const { SkBitmap*, SkIPoint*) const {
return false; return false;

View File

@ -2063,16 +2063,6 @@ bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect
return !rec.isHairlineStyle(); return !rec.isHairlineStyle();
} }
bool SkPaint::canComputeFastBounds() const {
if (this->getLooper()) {
return this->getLooper()->canComputeFastBounds(*this);
}
if (this->getImageFilter() && !this->getImageFilter()->canComputeFastBounds()) {
return false;
}
return !this->getRasterizer();
}
const SkRect& SkPaint::doComputeFastBounds(const SkRect& origSrc, const SkRect& SkPaint::doComputeFastBounds(const SkRect& origSrc,
SkRect* storage, SkRect* storage,
Style style) const { Style style) const {

View File

@ -98,10 +98,6 @@ bool SkColorFilterImageFilter::onIsColorFilterNode(SkColorFilter** filter) const
return false; return false;
} }
bool SkColorFilterImageFilter::affectsTransparentBlack() const {
return fColorFilter->affectsTransparentBlack();
}
#ifndef SK_IGNORE_TO_STRING #ifndef SK_IGNORE_TO_STRING
void SkColorFilterImageFilter::toString(SkString* str) const { void SkColorFilterImageFilter::toString(SkString* str) const {
str->appendf("SkColorFilterImageFilter: ("); str->appendf("SkColorFilterImageFilter: (");

View File

@ -79,10 +79,6 @@ bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
return true; return true;
} }
bool SkRectShaderImageFilter::affectsTransparentBlack() const {
return true;
}
#ifndef SK_IGNORE_TO_STRING #ifndef SK_IGNORE_TO_STRING
void SkRectShaderImageFilter::toString(SkString* str) const { void SkRectShaderImageFilter::toString(SkString* str) const {
str->appendf("SkRectShaderImageFilter: ("); str->appendf("SkRectShaderImageFilter: (");

View File

@ -30,7 +30,6 @@
#include "SkReadBuffer.h" #include "SkReadBuffer.h"
#include "SkRect.h" #include "SkRect.h"
#include "SkRectShaderImageFilter.h" #include "SkRectShaderImageFilter.h"
#include "SkTableColorFilter.h"
#include "SkTileImageFilter.h" #include "SkTileImageFilter.h"
#include "SkXfermodeImageFilter.h" #include "SkXfermodeImageFilter.h"
#include "Test.h" #include "Test.h"
@ -1160,58 +1159,6 @@ DEF_TEST(PartialCropRect, reporter) {
REPORTER_ASSERT(reporter, result.height() == 30); REPORTER_ASSERT(reporter, result.height() == 30);
} }
DEF_TEST(ImageFilterCanComputeFastBounds, reporter) {
SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1);
SkAutoTUnref<SkImageFilter> lighting(SkLightingImageFilter::CreatePointLitDiffuse(
location, SK_ColorGREEN, 0, 0));
REPORTER_ASSERT(reporter, !lighting->canComputeFastBounds());
SkAutoTUnref<SkImageFilter> gray(make_grayscale(nullptr, nullptr));
REPORTER_ASSERT(reporter, gray->canComputeFastBounds());
{
SkColorFilter* grayCF;
REPORTER_ASSERT(reporter, gray->asAColorFilter(&grayCF));
REPORTER_ASSERT(reporter, !grayCF->affectsTransparentBlack());
grayCF->unref();
}
REPORTER_ASSERT(reporter, gray->canComputeFastBounds());
SkAutoTUnref<SkImageFilter> grayBlur(SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1, gray.get()));
REPORTER_ASSERT(reporter, grayBlur->canComputeFastBounds());
SkScalar greenMatrix[20] = { 0, 0, 0, 0, 0,
0, 0, 0, 0, 1,
0, 0, 0, 0, 0,
0, 0, 0, 0, 1 };
SkAutoTUnref<SkColorFilter> greenCF(SkColorMatrixFilter::Create(greenMatrix));
SkAutoTUnref<SkImageFilter> green(SkColorFilterImageFilter::Create(greenCF));
REPORTER_ASSERT(reporter, greenCF->affectsTransparentBlack());
REPORTER_ASSERT(reporter, !green->canComputeFastBounds());
SkAutoTUnref<SkImageFilter> greenBlur(SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1, green.get()));
REPORTER_ASSERT(reporter, !greenBlur->canComputeFastBounds());
uint8_t allOne[256], identity[256];
for (int i = 0; i < 256; ++i) {
identity[i] = i;
allOne[i] = 255;
}
SkAutoTUnref<SkColorFilter> identityCF(
SkTableColorFilter::CreateARGB(identity, identity, identity, allOne));
SkAutoTUnref<SkImageFilter> identityFilter(SkColorFilterImageFilter::Create(identityCF.get()));
REPORTER_ASSERT(reporter, !identityCF->affectsTransparentBlack());
REPORTER_ASSERT(reporter, identityFilter->canComputeFastBounds());
SkAutoTUnref<SkColorFilter> forceOpaqueCF(
SkTableColorFilter::CreateARGB(allOne, identity, identity, identity));
SkAutoTUnref<SkImageFilter> forceOpaque(SkColorFilterImageFilter::Create(forceOpaqueCF.get()));
REPORTER_ASSERT(reporter, forceOpaqueCF->affectsTransparentBlack());
REPORTER_ASSERT(reporter, !forceOpaque->canComputeFastBounds());
}
#if SK_SUPPORT_GPU #if SK_SUPPORT_GPU
DEF_GPUTEST(ImageFilterCropRectGPU, reporter, factory) { DEF_GPUTEST(ImageFilterCropRectGPU, reporter, factory) {