Revert "Implement srcRect and dstRect functionality in SkBitmapSource. This is required for the "preserveAspectRatio" options of SVG's feImage. Covered by new GM "bitmapsource"." until I can sort out the xfermodeimagefilter and tileimagefilter failures.
This reverts commit b26725c8c9755415284c34399e76be098868e01a, aka r12522. BUG= TBR=reed@google.com Review URL: https://codereview.chromium.org/107093005 git-svn-id: http://skia.googlecode.com/svn/trunk@12523 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
af35920e6d
commit
899b22ab97
@ -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);
|
|
@ -20,7 +20,6 @@
|
|||||||
'../gm/bitmaprect.cpp',
|
'../gm/bitmaprect.cpp',
|
||||||
'../gm/bitmaprecttest.cpp',
|
'../gm/bitmaprecttest.cpp',
|
||||||
'../gm/bitmapscroll.cpp',
|
'../gm/bitmapscroll.cpp',
|
||||||
'../gm/bitmapsource.cpp',
|
|
||||||
'../gm/bleed.cpp',
|
'../gm/bleed.cpp',
|
||||||
'../gm/blurs.cpp',
|
'../gm/blurs.cpp',
|
||||||
'../gm/blurquickreject.cpp',
|
'../gm/blurquickreject.cpp',
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
class SK_API SkBitmapSource : public SkImageFilter {
|
class SK_API SkBitmapSource : public SkImageFilter {
|
||||||
public:
|
public:
|
||||||
explicit SkBitmapSource(const SkBitmap& bitmap);
|
explicit SkBitmapSource(const SkBitmap& bitmap);
|
||||||
SkBitmapSource(const SkBitmap& bitmap, const SkRect& srcRect, const SkRect& dstRect);
|
|
||||||
|
|
||||||
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource)
|
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource)
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
SkBitmap fBitmap;
|
SkBitmap fBitmap;
|
||||||
SkRect fSrcRect, fDstRect;
|
|
||||||
typedef SkImageFilter INHERITED;
|
typedef SkImageFilter INHERITED;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,71 +6,24 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "SkBitmapSource.h"
|
#include "SkBitmapSource.h"
|
||||||
#include "SkDevice.h"
|
|
||||||
#include "SkCanvas.h"
|
|
||||||
#include "SkFlattenableBuffers.h"
|
|
||||||
#include "SkValidationUtils.h"
|
|
||||||
|
|
||||||
SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap)
|
SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap)
|
||||||
: INHERITED(0, 0),
|
: INHERITED(0, 0),
|
||||||
fBitmap(bitmap),
|
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) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SkBitmapSource::SkBitmapSource(SkFlattenableReadBuffer& buffer)
|
SkBitmapSource::SkBitmapSource(SkFlattenableReadBuffer& buffer)
|
||||||
: INHERITED(0, buffer) {
|
: INHERITED(0, buffer) {
|
||||||
fBitmap.unflatten(buffer);
|
fBitmap.unflatten(buffer);
|
||||||
buffer.readRect(&fSrcRect);
|
|
||||||
buffer.readRect(&fDstRect);
|
|
||||||
buffer.validate(SkIsValidRect(fSrcRect) && SkIsValidRect(fDstRect));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkBitmapSource::flatten(SkFlattenableWriteBuffer& buffer) const {
|
void SkBitmapSource::flatten(SkFlattenableWriteBuffer& buffer) const {
|
||||||
this->INHERITED::flatten(buffer);
|
this->INHERITED::flatten(buffer);
|
||||||
fBitmap.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) {
|
SkBitmap* result, SkIPoint* offset) {
|
||||||
SkRect bounds, dstRect;
|
*result = fBitmap;
|
||||||
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;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user