Revert of Fix dst bound reported by SkTileImageFilter (patchset #3 id:40001 of https://codereview.chromium.org/1152553006/)
Reason for revert: Blink Original issue's description: > Fix dst bound reported by SkTileImageFilter > > In the example from the bug we had the filter DAG: > > color filter (table) > 0: xfermode filter (arith) > 0: tile filter [0,80,34,114] -> [0,80,800,480] > 0: color filter (table) > 0: bitmap src 34x34 -> [0,80,34,114] > 1: color filter (table) > 0: picture filter [0, 80, 800, 480] > > computeFastBounds was coming out of the DAG with a bound of [0,80,34,114] which didn't represent the pixels that would be drawn. > > This CL updates SkTileImageFilter to correctly set the bound for the pixels it will hit. > > BUG=493783 > > Committed: https://skia.googlesource.com/skia/+/05be93bbdf09576f7903130e3b106b0a8c7c4b4e > > Committed: https://skia.googlesource.com/skia/+/0be685755f942baea26c66a87226b569fc17e960 TBR=reed@google.com,senorblanco@google.com,senorblanco@chromium.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=493783 Review URL: https://codereview.chromium.org/1156583004
This commit is contained in:
parent
99a69eb152
commit
270fe6aad5
@ -1,76 +0,0 @@
|
||||
/*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license that can be
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "SkBitmapSource.h"
|
||||
#include "SkTileImageFilter.h"
|
||||
#include "gm.h"
|
||||
|
||||
namespace skiagm {
|
||||
|
||||
class BigTileImageFilterGM : public GM {
|
||||
public:
|
||||
BigTileImageFilterGM() {
|
||||
this->setBGColor(0xFF000000);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
SkString onShortName() override {
|
||||
return SkString("bigtileimagefilter");
|
||||
}
|
||||
|
||||
SkISize onISize() override{
|
||||
return SkISize::Make(kWidth, kHeight);
|
||||
}
|
||||
|
||||
void onOnceBeforeDraw() override {
|
||||
fBitmap.allocN32Pixels(kBitmapSize, kBitmapSize);
|
||||
|
||||
SkCanvas canvas(fBitmap);
|
||||
canvas.clear(0xFF000000);
|
||||
|
||||
SkPaint paint;
|
||||
paint.setColor(SK_ColorRED);
|
||||
paint.setStrokeWidth(3);
|
||||
paint.setStyle(SkPaint::kStroke_Style);
|
||||
|
||||
canvas.drawCircle(SkScalarHalf(kBitmapSize), SkScalarHalf(kBitmapSize),
|
||||
SkScalarHalf(kBitmapSize), paint);
|
||||
}
|
||||
|
||||
void onDraw(SkCanvas* canvas) override {
|
||||
canvas->clear(SK_ColorBLACK);
|
||||
|
||||
SkPaint p;
|
||||
|
||||
SkAutoTUnref<SkBitmapSource> bms(SkBitmapSource::Create(fBitmap));
|
||||
SkAutoTUnref<SkTileImageFilter> tif(SkTileImageFilter::Create(
|
||||
SkRect::MakeWH(SkIntToScalar(kBitmapSize), SkIntToScalar(kBitmapSize)),
|
||||
SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight)),
|
||||
bms));
|
||||
p.setImageFilter(tif);
|
||||
|
||||
SkRect bound = SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight));
|
||||
canvas->saveLayer(&bound, &p);
|
||||
canvas->restore();
|
||||
}
|
||||
|
||||
private:
|
||||
static const int kWidth = 512;
|
||||
static const int kHeight = 512;
|
||||
static const int kBitmapSize = 64;
|
||||
|
||||
SkBitmap fBitmap;
|
||||
|
||||
typedef GM INHERITED;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DEF_GM( return SkNEW(BigTileImageFilterGM); )
|
||||
|
||||
}
|
@ -16,48 +16,46 @@
|
||||
#define HEIGHT 100
|
||||
#define MARGIN 12
|
||||
|
||||
static SkBitmap make_bitmap() {
|
||||
SkBitmap bitmap;
|
||||
bitmap.allocN32Pixels(50, 50);
|
||||
SkCanvas canvas(bitmap);
|
||||
canvas.clear(0xFF000000);
|
||||
SkPaint paint;
|
||||
paint.setAntiAlias(true);
|
||||
sk_tool_utils::set_portable_typeface(&paint);
|
||||
paint.setColor(0xD000D000);
|
||||
paint.setTextSize(SkIntToScalar(50));
|
||||
const char* str = "e";
|
||||
canvas.drawText(str, strlen(str), SkIntToScalar(10), SkIntToScalar(45), paint);
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
|
||||
namespace skiagm {
|
||||
|
||||
class TileImageFilterGM : public GM {
|
||||
public:
|
||||
TileImageFilterGM() {
|
||||
TileImageFilterGM() : fInitialized(false) {
|
||||
this->setBGColor(0xFF000000);
|
||||
}
|
||||
|
||||
protected:
|
||||
SkString onShortName() override {
|
||||
virtual SkString onShortName() {
|
||||
return SkString("tileimagefilter");
|
||||
}
|
||||
|
||||
SkISize onISize() override{
|
||||
void make_bitmap() {
|
||||
fBitmap.allocN32Pixels(50, 50);
|
||||
SkCanvas canvas(fBitmap);
|
||||
canvas.clear(0xFF000000);
|
||||
SkPaint paint;
|
||||
paint.setAntiAlias(true);
|
||||
sk_tool_utils::set_portable_typeface(&paint);
|
||||
paint.setColor(0xD000D000);
|
||||
paint.setTextSize(SkIntToScalar(50));
|
||||
const char* str = "e";
|
||||
canvas.drawText(str, strlen(str), SkIntToScalar(10), SkIntToScalar(45), paint);
|
||||
}
|
||||
|
||||
virtual SkISize onISize() {
|
||||
return SkISize::Make(WIDTH, HEIGHT);
|
||||
}
|
||||
|
||||
void onOnceBeforeDraw() override {
|
||||
fBitmap = make_bitmap();
|
||||
virtual void onDraw(SkCanvas* canvas) {
|
||||
if (!fInitialized) {
|
||||
make_bitmap();
|
||||
|
||||
fCheckerboard.allocN32Pixels(80, 80);
|
||||
SkCanvas checkerboardCanvas(fCheckerboard);
|
||||
sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
|
||||
}
|
||||
fCheckerboard.allocN32Pixels(80, 80);
|
||||
SkCanvas checkerboardCanvas(fCheckerboard);
|
||||
sk_tool_utils::draw_checkerboard(&checkerboardCanvas, 0xFFA0A0A0, 0xFF404040, 8);
|
||||
|
||||
void onDraw(SkCanvas* canvas) override {
|
||||
fInitialized = true;
|
||||
}
|
||||
canvas->clear(SK_ColorBLACK);
|
||||
|
||||
int x = 0, y = 0;
|
||||
@ -111,14 +109,14 @@ protected:
|
||||
canvas->restore();
|
||||
}
|
||||
private:
|
||||
SkBitmap fBitmap;
|
||||
SkBitmap fCheckerboard;
|
||||
|
||||
typedef GM INHERITED;
|
||||
SkBitmap fBitmap, fCheckerboard;
|
||||
bool fInitialized;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
DEF_GM( return SkNEW(TileImageFilterGM); )
|
||||
static GM* MyFactory(void*) { return new TileImageFilterGM; }
|
||||
static GMRegistry reg(MyFactory);
|
||||
|
||||
}
|
||||
|
@ -22,11 +22,10 @@ public:
|
||||
static SkTileImageFilter* Create(const SkRect& srcRect, const SkRect& dstRect,
|
||||
SkImageFilter* input);
|
||||
|
||||
bool onFilterImage(Proxy* proxy, const SkBitmap& src, const Context& ctx,
|
||||
SkBitmap* dst, SkIPoint* offset) const override;
|
||||
bool onFilterBounds(const SkIRect& src, const SkMatrix&,
|
||||
SkIRect* dst) const override;
|
||||
void computeFastBounds(const SkRect& src, SkRect* dst) const override;
|
||||
virtual bool onFilterImage(Proxy* proxy, const SkBitmap& src, const Context& ctx,
|
||||
SkBitmap* dst, SkIPoint* offset) const override;
|
||||
virtual bool onFilterBounds(const SkIRect& src, const SkMatrix&,
|
||||
SkIRect* dst) const override;
|
||||
|
||||
SK_TO_STRING_OVERRIDE()
|
||||
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkTileImageFilter)
|
||||
|
@ -82,10 +82,6 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
|
||||
return true;
|
||||
}
|
||||
|
||||
void SkTileImageFilter::computeFastBounds(const SkRect& src, SkRect* dst) const {
|
||||
*dst = fDstRect;
|
||||
}
|
||||
|
||||
bool SkTileImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
|
||||
SkIRect* dst) const {
|
||||
SkRect srcRect;
|
||||
@ -114,15 +110,6 @@ void SkTileImageFilter::flatten(SkWriteBuffer& buffer) const {
|
||||
#ifndef SK_IGNORE_TO_STRING
|
||||
void SkTileImageFilter::toString(SkString* str) const {
|
||||
str->appendf("SkTileImageFilter: (");
|
||||
str->appendf("src: %.2f %.2f %.2f %.2f",
|
||||
fSrcRect.fLeft, fSrcRect.fTop, fSrcRect.fRight, fSrcRect.fBottom);
|
||||
str->appendf(" dst: %.2f %.2f %.2f %.2f",
|
||||
fDstRect.fLeft, fDstRect.fTop, fDstRect.fRight, fDstRect.fBottom);
|
||||
if (this->getInput(0)) {
|
||||
str->appendf("input: (");
|
||||
this->getInput(0)->toString(str);
|
||||
str->appendf(")");
|
||||
}
|
||||
str->append(")");
|
||||
}
|
||||
#endif
|
||||
|
@ -105,18 +105,7 @@ void SkXfermodeImageFilter::toString(SkString* str) const {
|
||||
if (fMode) {
|
||||
fMode->toString(str);
|
||||
}
|
||||
str->append(")");
|
||||
if (this->getInput(0)) {
|
||||
str->appendf("foreground: (");
|
||||
this->getInput(0)->toString(str);
|
||||
str->appendf(")");
|
||||
}
|
||||
if (this->getInput(1)) {
|
||||
str->appendf("background: (");
|
||||
this->getInput(1)->toString(str);
|
||||
str->appendf(")");
|
||||
}
|
||||
str->append(")");
|
||||
str->append("))");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user