2 * Copyright 2013 The Android Open Source Project
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "SkPictureImageFilter.h"
11 #include "SkReadBuffer.h"
12 #include "SkWriteBuffer.h"
13 #include "SkValidationUtils.h"
15 SkPictureImageFilter::SkPictureImageFilter(const SkPicture* picture, uint32_t uniqueID)
16 : INHERITED(0, 0, NULL, uniqueID)
17 , fPicture(SkSafeRef(picture))
18 , fCropRect(picture ? picture->cullRect() : SkRect::MakeEmpty()) {
21 SkPictureImageFilter::SkPictureImageFilter(const SkPicture* picture, const SkRect& cropRect,
23 : INHERITED(0, 0, NULL, uniqueID)
24 , fPicture(SkSafeRef(picture))
25 , fCropRect(cropRect) {
28 SkPictureImageFilter::~SkPictureImageFilter() {
29 SkSafeUnref(fPicture);
32 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
33 SkPictureImageFilter::SkPictureImageFilter(SkReadBuffer& buffer)
34 : INHERITED(0, buffer),
36 if (!buffer.isCrossProcess()) {
37 if (buffer.readBool()) {
38 fPicture = SkPicture::CreateFromBuffer(buffer);
41 buffer.validate(!buffer.readBool());
43 buffer.readRect(&fCropRect);
47 SkFlattenable* SkPictureImageFilter::CreateProc(SkReadBuffer& buffer) {
48 SkAutoTUnref<SkPicture> picture;
51 if (!buffer.isCrossProcess()) {
52 if (buffer.readBool()) {
53 picture.reset(SkPicture::CreateFromBuffer(buffer));
56 buffer.validate(!buffer.readBool());
58 buffer.readRect(&cropRect);
60 return Create(picture, cropRect);
63 void SkPictureImageFilter::flatten(SkWriteBuffer& buffer) const {
64 if (!buffer.isCrossProcess()) {
65 bool hasPicture = (fPicture != NULL);
66 buffer.writeBool(hasPicture);
68 fPicture->flatten(buffer);
71 buffer.writeBool(false);
73 buffer.writeRect(fCropRect);
76 bool SkPictureImageFilter::onFilterImage(Proxy* proxy, const SkBitmap&, const Context& ctx,
77 SkBitmap* result, SkIPoint* offset) const {
79 offset->fX = offset->fY = 0;
85 ctx.ctm().mapRect(&floatBounds, fCropRect);
86 floatBounds.roundOut(&bounds);
87 if (!bounds.intersect(ctx.clipBounds())) {
91 if (bounds.isEmpty()) {
92 offset->fX = offset->fY = 0;
96 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height()));
97 if (NULL == device.get()) {
101 SkCanvas canvas(device.get());
104 canvas.translate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop));
105 canvas.concat(ctx.ctm());
106 canvas.drawPicture(fPicture);
108 *result = device.get()->accessBitmap(false);
109 offset->fX = bounds.fLeft;
110 offset->fY = bounds.fTop;