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:
parent
877a52ae61
commit
12d8472d31
@ -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:
|
||||||
|
@ -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) {
|
||||||
|
@ -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()
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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: (");
|
||||||
|
@ -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: (");
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user