Reverting 12528 & 12533 (Implement srcRect and dstRect functionality in SkBitmapSource) due to image differences on N4

https://codereview.chromium.org/108623002/



git-svn-id: http://skia.googlecode.com/svn/trunk@12534 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
robertphillips@google.com 2013-12-06 17:44:15 +00:00
parent 86b82767bd
commit 40757703bd
6 changed files with 30 additions and 173 deletions

View File

@ -1,95 +0,0 @@
/*
* 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 "gm.h"
#include "SkBitmapSource.h"
class BitmapSourceGM : public skiagm::GM {
public:
BitmapSourceGM() : fInitialized(false) {
}
protected:
virtual SkString onShortName() {
return SkString("bitmapsource");
}
void make_bitmap() {
fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
fBitmap.allocPixels();
SkBitmapDevice device(fBitmap);
SkCanvas canvas(&device);
canvas.clear(0x00000000);
SkPaint paint;
paint.setAntiAlias(true);
paint.setColor(0xFFFFFFFF);
paint.setTextSize(SkIntToScalar(96));
const char* str = "e";
canvas.drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), paint);
}
virtual SkISize onISize() { return SkISize::Make(500, 150); }
virtual void onDraw(SkCanvas* canvas) {
if (!fInitialized) {
this->make_bitmap();
fInitialized = true;
}
canvas->clear(0x00000000);
{
SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
SkRect dstRect = SkRect::MakeXYWH(0, 10, 60, 60);
SkRect clipRect = SkRect::MakeXYWH(0, 0, 100, 100);
SkRect bounds;
fBitmap.getBounds(&bounds);
SkAutoTUnref<SkImageFilter> bitmapSource(new SkBitmapSource(fBitmap));
SkAutoTUnref<SkImageFilter> bitmapSourceSrcRect(new SkBitmapSource(fBitmap, srcRect, srcRect));
SkAutoTUnref<SkImageFilter> bitmapSourceSrcRectDstRect(new SkBitmapSource(fBitmap, srcRect, dstRect));
SkAutoTUnref<SkImageFilter> bitmapSourceDstRectOnly(new SkBitmapSource(fBitmap, bounds, dstRect));
SkPaint paint;
paint.setImageFilter(bitmapSource);
canvas->save();
canvas->clipRect(clipRect);
canvas->drawPaint(paint);
canvas->restore();
canvas->translate(SkIntToScalar(100), 0);
paint.setImageFilter(bitmapSourceSrcRect);
canvas->save();
canvas->clipRect(clipRect);
canvas->drawPaint(paint);
canvas->restore();
canvas->translate(SkIntToScalar(100), 0);
paint.setImageFilter(bitmapSourceSrcRectDstRect);
canvas->save();
canvas->clipRect(clipRect);
canvas->drawPaint(paint);
canvas->restore();
canvas->translate(SkIntToScalar(100), 0);
paint.setImageFilter(bitmapSourceDstRectOnly);
canvas->save();
canvas->clipRect(clipRect);
canvas->drawPaint(paint);
canvas->restore();
canvas->translate(SkIntToScalar(100), 0);
}
}
private:
typedef GM INHERITED;
SkBitmap fBitmap;
bool fInitialized;
};
///////////////////////////////////////////////////////////////////////////////
static skiagm::GM* MyFactory(void*) { return new BitmapSourceGM; }
static skiagm::GMRegistry reg(MyFactory);

View File

@ -70,10 +70,9 @@ protected:
void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint,
SkScalar x, SkScalar y) {
canvas->save();
canvas->translate(x, y);
canvas->clipRect(SkRect::MakeXYWH(0, 0,
canvas->clipRect(SkRect::MakeXYWH(x, y,
SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())));
canvas->drawBitmap(bitmap, 0, 0, &paint);
canvas->drawBitmap(bitmap, x, y, &paint);
canvas->restore();
}

View File

@ -72,19 +72,9 @@ protected:
void drawClippedBitmap(SkCanvas* canvas, const SkBitmap& bitmap, const SkPaint& paint,
SkScalar x, SkScalar y) {
canvas->save();
canvas->translate(x, y);
canvas->clipRect(SkRect::MakeXYWH(0, 0,
canvas->clipRect(SkRect::MakeXYWH(x, y,
SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())));
canvas->drawBitmap(bitmap, 0, 0, &paint);
canvas->restore();
}
void drawClippedPaint(SkCanvas* canvas, const SkRect& rect, const SkPaint& paint,
SkScalar x, SkScalar y) {
canvas->save();
canvas->translate(x, y);
canvas->clipRect(rect);
canvas->drawPaint(paint);
canvas->drawBitmap(bitmap, x, y, &paint);
canvas->restore();
}
@ -166,8 +156,6 @@ protected:
x = 0;
y += fBitmap.height() + MARGIN;
}
SkRect clipRect = SkRect::MakeWH(SkIntToScalar(fBitmap.width() + 4),
SkIntToScalar(fBitmap.height() + 4));
// Test offsets on SrcMode (uses fixed-function blend)
SkAutoTUnref<SkImageFilter> foreground(SkNEW_ARGS(SkBitmapSource, (fBitmap)));
SkAutoTUnref<SkImageFilter> offsetForeground(SkNEW_ARGS(SkOffsetImageFilter,
@ -178,8 +166,13 @@ protected:
filter.reset(SkNEW_ARGS(SkXfermodeImageFilter,
(mode, offsetBackground, offsetForeground)));
paint.setImageFilter(filter);
drawClippedPaint(canvas, clipRect, paint,
SkIntToScalar(x), SkIntToScalar(y));
canvas->save();
canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x),
SkIntToScalar(y),
SkIntToScalar(fBitmap.width() + 4),
SkIntToScalar(fBitmap.height() + 4)));
canvas->drawPaint(paint);
canvas->restore();
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
x = 0;
@ -189,8 +182,13 @@ protected:
mode.reset(SkXfermode::Create(SkXfermode::kDarken_Mode));
filter.reset(SkNEW_ARGS(SkXfermodeImageFilter, (mode, offsetBackground, offsetForeground)));
paint.setImageFilter(filter);
drawClippedPaint(canvas, clipRect, paint,
SkIntToScalar(x), SkIntToScalar(y));
canvas->save();
canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x),
SkIntToScalar(y),
SkIntToScalar(fBitmap.width() + 4),
SkIntToScalar(fBitmap.height() + 4)));
canvas->drawPaint(paint);
canvas->restore();
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
x = 0;
@ -205,8 +203,8 @@ protected:
{ 10, 10, 10, 10},
{-10, -10, -6, -6}};
for (size_t i = 0; i < nbSamples; ++i) {
SkIRect cropRect = SkIRect::MakeXYWH(offsets[i][0],
offsets[i][1],
SkIRect cropRect = SkIRect::MakeXYWH(x + offsets[i][0],
y + offsets[i][1],
fBitmap.width() + offsets[i][2],
fBitmap.height() + offsets[i][3]);
SkImageFilter::CropRect rect(SkRect::Make(cropRect));
@ -214,8 +212,13 @@ protected:
filter.reset(SkNEW_ARGS(SkXfermodeImageFilter,
(mode, offsetBackground, offsetForeground, &rect)));
paint.setImageFilter(filter);
drawClippedPaint(canvas, clipRect, paint,
SkIntToScalar(x), SkIntToScalar(y));
canvas->save();
canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x),
SkIntToScalar(y),
SkIntToScalar(fBitmap.width() + 4),
SkIntToScalar(fBitmap.height() + 4)));
canvas->drawPaint(paint);
canvas->restore();
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
x = 0;

View File

@ -20,7 +20,6 @@
'../gm/bitmaprect.cpp',
'../gm/bitmaprecttest.cpp',
'../gm/bitmapscroll.cpp',
'../gm/bitmapsource.cpp',
'../gm/bleed.cpp',
'../gm/blurs.cpp',
'../gm/blurquickreject.cpp',

View File

@ -14,7 +14,6 @@
class SK_API SkBitmapSource : public SkImageFilter {
public:
explicit SkBitmapSource(const SkBitmap& bitmap);
SkBitmapSource(const SkBitmap& bitmap, const SkRect& srcRect, const SkRect& dstRect);
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource)
@ -26,7 +25,6 @@ protected:
private:
SkBitmap fBitmap;
SkRect fSrcRect, fDstRect;
typedef SkImageFilter INHERITED;
};

View File

@ -6,71 +6,24 @@
*/
#include "SkBitmapSource.h"
#include "SkDevice.h"
#include "SkCanvas.h"
#include "SkFlattenableBuffers.h"
#include "SkValidationUtils.h"
SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap)
: INHERITED(0, 0),
fBitmap(bitmap),
fSrcRect(SkRect::MakeWH(SkIntToScalar(bitmap.width()),
SkIntToScalar(bitmap.height()))),
fDstRect(fSrcRect) {
}
SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap, const SkRect& srcRect, const SkRect& dstRect)
: INHERITED(0, 0),
fBitmap(bitmap),
fSrcRect(srcRect),
fDstRect(dstRect) {
fBitmap(bitmap) {
}
SkBitmapSource::SkBitmapSource(SkFlattenableReadBuffer& buffer)
: INHERITED(0, buffer) {
fBitmap.unflatten(buffer);
buffer.readRect(&fSrcRect);
buffer.readRect(&fDstRect);
buffer.validate(SkIsValidRect(fSrcRect) && SkIsValidRect(fDstRect));
}
void SkBitmapSource::flatten(SkFlattenableWriteBuffer& buffer) const {
this->INHERITED::flatten(buffer);
fBitmap.flatten(buffer);
buffer.writeRect(fSrcRect);
buffer.writeRect(fDstRect);
}
bool SkBitmapSource::onFilterImage(Proxy* proxy, const SkBitmap&, const SkMatrix& matrix,
bool SkBitmapSource::onFilterImage(Proxy*, const SkBitmap&, const SkMatrix&,
SkBitmap* result, SkIPoint* offset) {
SkRect bounds, dstRect;
fBitmap.getBounds(&bounds);
matrix.mapRect(&dstRect, fDstRect);
if (fSrcRect == bounds && dstRect == bounds) {
*result = fBitmap;
return true;
}
SkIRect dstIRect;
dstRect.roundOut(&dstIRect);
SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstIRect.width(), dstIRect.height()));
if (NULL == device.get()) {
return false;
}
SkCanvas canvas(device.get());
SkPaint paint;
// Subtract off the integer component of the translation (will be applied in loc, below).
dstRect.offset(-SkIntToScalar(dstIRect.fLeft), -SkIntToScalar(dstIRect.fTop));
paint.setXfermodeMode(SkXfermode::kSrc_Mode);
// FIXME: this probably shouldn't be necessary, but drawBitmapRectToRect asserts
// None filtering when it's translate-only
paint.setFilterLevel(fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.height() ? SkPaint::kNone_FilterLevel : SkPaint::kMedium_FilterLevel);
canvas.drawBitmapRectToRect(fBitmap, &fSrcRect, dstRect, &paint);
*result = device.get()->accessBitmap(false);
offset->fX += dstIRect.fLeft;
offset->fY += dstIRect.fTop;
*result = fBitmap;
return true;
}