diff options
author | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-12 23:28:52 +0000 |
---|---|---|
committer | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-12 23:28:52 +0000 |
commit | 246be068530a88747ff941b76ff500872ffe8c2b (patch) | |
tree | 5ab1cce22bacb4bc524a2ca5dc149be05ac067fd | |
parent | d5e04336e89c85513a3a7aac8322e05e1527fc04 (diff) | |
download | src-246be068530a88747ff941b76ff500872ffe8c2b.tar.gz |
Implement an SkPicture image filter source. This is required for the external-SVG reference feature of feImage. It simply plays back an SkPicture to a given destination rect.
R=reed@google.com
Review URL: https://codereview.chromium.org/114263002
git-svn-id: http://skia.googlecode.com/svn/trunk/src@12661 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | effects/SkPictureImageFilter.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/effects/SkPictureImageFilter.cpp b/effects/SkPictureImageFilter.cpp new file mode 100644 index 00000000..5b4af654 --- /dev/null +++ b/effects/SkPictureImageFilter.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2013 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkPictureImageFilter.h" +#include "SkDevice.h" +#include "SkCanvas.h" +#include "SkFlattenableBuffers.h" +#include "SkValidationUtils.h" + +SkPictureImageFilter::SkPictureImageFilter(SkPicture* picture) + : INHERITED(0, 0), + fPicture(picture), + fRect(SkRect::MakeWH(picture ? SkIntToScalar(picture->width()) : 0, + picture ? SkIntToScalar(picture->height()) : 0)) { + SkSafeRef(fPicture); +} + +SkPictureImageFilter::SkPictureImageFilter(SkPicture* picture, const SkRect& rect) + : INHERITED(0, 0), + fPicture(picture), + fRect(rect) { + SkSafeRef(fPicture); +} + +SkPictureImageFilter::~SkPictureImageFilter() { + SkSafeUnref(fPicture); +} + +SkPictureImageFilter::SkPictureImageFilter(SkFlattenableReadBuffer& buffer) + : INHERITED(0, buffer), + fPicture(NULL) { + // FIXME: unflatten picture here. + buffer.readRect(&fRect); +} + +void SkPictureImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { + this->INHERITED::flatten(buffer); + // FIXME: flatten picture here. + buffer.writeRect(fRect); +} + +bool SkPictureImageFilter::onFilterImage(Proxy* proxy, const SkBitmap&, const SkMatrix& matrix, + SkBitmap* result, SkIPoint* offset) { + if (!fPicture) { + return true; + } + + SkRect floatBounds; + SkIRect bounds; + matrix.mapRect(&floatBounds, fRect); + floatBounds.roundOut(&bounds); + + if (bounds.isEmpty()) { + return true; + } + + SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); + if (NULL == device.get()) { + return false; + } + + SkCanvas canvas(device.get()); + SkPaint paint; + + canvas.translate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop)); + canvas.concat(matrix); + canvas.drawPicture(*fPicture); + + *result = device.get()->accessBitmap(false); + offset->fX += bounds.fLeft; + offset->fY += bounds.fTop; + return true; +} |