SkImageFilter.cpp revision b295fb6ff3222453912dfcb7a1ea5184d40014b5
1bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org/*
2bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org * Copyright 2012 The Android Open Source Project
3bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org *
4bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
5bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org * found in the LICENSE file.
6bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org */
7bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
8bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org#include "SkImageFilter.h"
99f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org
109f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org#include "SkBitmap.h"
119f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org#include "SkFlattenableBuffers.h"
12bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org#include "SkRect.h"
13d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#if SK_SUPPORT_GPU
14d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#include "GrContext.h"
15d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#include "GrTexture.h"
16d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#include "SkImageFilterUtils.h"
17d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#endif
18bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
19bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.orgSK_DEFINE_INST_COUNT(SkImageFilter)
20bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
21b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.orgSkImageFilter::SkImageFilter(int inputCount, SkImageFilter** inputs, const CropRect* cropRect)
22194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org  : fInputCount(inputCount),
23194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    fInputs(new SkImageFilter*[inputCount]),
24b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#ifdef SK_CROP_RECT_IS_INT
25194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    fCropRect(cropRect ? *cropRect : SkIRect::MakeLargest()) {
26b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#else
27b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    fCropRect(cropRect ? *cropRect : CropRect(SkRect(), 0x0)) {
28b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#endif
298d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    for (int i = 0; i < inputCount; ++i) {
309f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        fInputs[i] = inputs[i];
319f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        SkSafeRef(fInputs[i]);
329f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org    }
339f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org}
349f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org
35b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.orgSkImageFilter::SkImageFilter(SkImageFilter* input, const CropRect* cropRect)
36194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org  : fInputCount(1),
37194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    fInputs(new SkImageFilter*[1]),
38b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#ifdef SK_CROP_RECT_IS_INT
39194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    fCropRect(cropRect ? *cropRect : SkIRect::MakeLargest()) {
40b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#else
41b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    fCropRect(cropRect ? *cropRect : CropRect(SkRect(), 0x0)) {
42b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#endif
43c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org    fInputs[0] = input;
44c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org    SkSafeRef(fInputs[0]);
45c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org}
46c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org
47b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.orgSkImageFilter::SkImageFilter(SkImageFilter* input1, SkImageFilter* input2, const CropRect* cropRect)
48194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org  : fInputCount(2), fInputs(new SkImageFilter*[2]),
49b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#ifdef SK_CROP_RECT_IS_INT
50b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    fCropRect(cropRect ? *cropRect : SkIRect::MakeLargest()) {
51b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#else
52b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    fCropRect(cropRect ? *cropRect : CropRect(SkRect(), 0x0)) {
53b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#endif
54c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org    fInputs[0] = input1;
55c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org    fInputs[1] = input2;
56c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org    SkSafeRef(fInputs[0]);
57c2e8cef4792b478547973d312b26fff4aab7c729senorblanco@chromium.org    SkSafeRef(fInputs[1]);
589f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org}
599f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org
609f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.orgSkImageFilter::~SkImageFilter() {
618d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    for (int i = 0; i < fInputCount; i++) {
629f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        SkSafeUnref(fInputs[i]);
639f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org    }
649f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org    delete[] fInputs;
659f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org}
669f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org
67fc84359aa920567e72742877a1249f52d076ad35skia.committer@gmail.comSkImageFilter::SkImageFilter(SkFlattenableReadBuffer& buffer)
688d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    : fInputCount(buffer.readInt()), fInputs(new SkImageFilter*[fInputCount]) {
698d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    for (int i = 0; i < fInputCount; i++) {
709f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        if (buffer.readBool()) {
719f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org            fInputs[i] = static_cast<SkImageFilter*>(buffer.readFlattenable());
729f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        } else {
739f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org            fInputs[i] = NULL;
749f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        }
759f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org    }
76b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#ifdef SK_CROP_RECT_IS_INT
77194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    buffer.readIRect(&fCropRect);
78b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#else
79b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    buffer.readRect(&fCropRect.fRect);
80b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    fCropRect.fFlags = buffer.readUInt();
81b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#endif
829f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org}
839f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org
849f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.orgvoid SkImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
858d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    buffer.writeInt(fInputCount);
868d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org    for (int i = 0; i < fInputCount; i++) {
879f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        SkImageFilter* input = getInput(i);
889f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        buffer.writeBool(input != NULL);
899f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        if (input != NULL) {
909f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org            buffer.writeFlattenable(input);
919f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org        }
929f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org    }
93b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#ifdef SK_CROP_RECT_IS_INT
94194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org    buffer.writeIRect(fCropRect);
95b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#else
96b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    buffer.writeRect(fCropRect.fRect);
97b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    buffer.writeUInt(fCropRect.fFlags);
98b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#endif
999f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org}
1009f25de79009ce721aa13abe71c38179d5a6710e2senorblanco@chromium.org
101bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.orgbool SkImageFilter::filterImage(Proxy* proxy, const SkBitmap& src,
102bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org                                const SkMatrix& ctm,
103bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org                                SkBitmap* result, SkIPoint* loc) {
104bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    SkASSERT(result);
105bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    SkASSERT(loc);
106bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    /*
107bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org     *  Give the proxy first shot at the filter. If it returns false, ask
108bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org     *  the filter to do it.
109bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org     */
110bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    return (proxy && proxy->filterImage(this, src, ctm, result, loc)) ||
111bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org           this->onFilterImage(proxy, src, ctm, result, loc);
112bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
113bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
114bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.orgbool SkImageFilter::filterBounds(const SkIRect& src, const SkMatrix& ctm,
115bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org                                 SkIRect* dst) {
116bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    SkASSERT(&src);
117bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    SkASSERT(dst);
118bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    return this->onFilterBounds(src, ctm, dst);
119bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
120bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
121bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.orgbool SkImageFilter::onFilterImage(Proxy*, const SkBitmap&, const SkMatrix&,
122bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org                                  SkBitmap*, SkIPoint*) {
123bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    return false;
124bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
125bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
126bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.orgbool SkImageFilter::canFilterImageGPU() const {
127fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    return this->asNewEffect(NULL, NULL, SkMatrix::I());
128bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
129bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
1301aa54bf6696afc7d06fc8ecc63dad2840a4d6179commit-bot@chromium.orgbool SkImageFilter::filterImageGPU(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm,
1311aa54bf6696afc7d06fc8ecc63dad2840a4d6179commit-bot@chromium.org                                   SkBitmap* result, SkIPoint* offset) {
132d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#if SK_SUPPORT_GPU
133d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    SkBitmap input;
134d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    SkASSERT(fInputCount == 1);
1351aa54bf6696afc7d06fc8ecc63dad2840a4d6179commit-bot@chromium.org    if (!SkImageFilterUtils::GetInputResultGPU(this->getInput(0), proxy, src, ctm, &input, offset)) {
136d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org        return false;
137d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    }
138b8d00db075b5ea09e353508a26ef5ced50722a6ccommit-bot@chromium.org    GrTexture* srcTexture = input.getTexture();
1394e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    SkIRect bounds;
1404e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    src.getBounds(&bounds);
141fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    if (!this->applyCropRect(&bounds, ctm)) {
1424e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org        return false;
1434e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    }
1444e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    SkRect srcRect = SkRect::Make(bounds);
1454e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height());
146d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrContext* context = srcTexture->getContext();
147d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org
148d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrTextureDesc desc;
149d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    desc.fFlags = kRenderTarget_GrTextureFlagBit,
1504e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    desc.fWidth = bounds.width();
1514e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    desc.fHeight = bounds.height();
152d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    desc.fConfig = kRGBA_8888_GrPixelConfig;
153d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org
154d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrAutoScratchTexture dst(context, desc);
155d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrContext::AutoMatrix am;
156d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    am.setIdentity(context);
157d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrContext::AutoRenderTarget art(context, dst.texture()->asRenderTarget());
1584e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    GrContext::AutoClip acs(context, dstRect);
159d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrEffectRef* effect;
160fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    SkMatrix matrix(ctm);
161fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
162fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    this->asNewEffect(&effect, srcTexture, matrix);
163d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    SkASSERT(effect);
164d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    SkAutoUnref effectRef(effect);
165d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    GrPaint paint;
16642dacab4e7366d9f53989558cc8d045c3d065bcdcommit-bot@chromium.org    paint.addColorEffect(effect);
1674e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    context->drawRectToRect(paint, dstRect, srcRect);
1684e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org
169d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    SkAutoTUnref<GrTexture> resultTex(dst.detach());
1704e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    SkImageFilterUtils::WrapTexture(resultTex, bounds.width(), bounds.height(), result);
1714e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    offset->fX += bounds.left();
1724e16bb2a322f2bd16cb1afd2f78c27e420a4b9dbsenorblanco@chromium.org    offset->fY += bounds.top();
173d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org    return true;
174d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#else
175c2594f41066102d7a8a73effd3c574142a018b9asenorblanco@chromium.org    return false;
176d043ccee3788ea4192806bd8c94484ed003fa828senorblanco@chromium.org#endif
177bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
178bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
179fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.orgbool SkImageFilter::applyCropRect(SkIRect* rect, const SkMatrix& matrix) const {
180fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    SkRect cropRect;
181b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#ifdef SK_CROP_RECT_IS_INT
182fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    matrix.mapRect(&cropRect, SkRect::Make(fCropRect));
183fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    SkIRect cropRectI;
184fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    cropRect.roundOut(&cropRectI);
185fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    // If the original crop rect edges were unset, max out the new crop edges
186fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    if (fCropRect.fLeft == SK_MinS32) cropRectI.fLeft = SK_MinS32;
187fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    if (fCropRect.fTop == SK_MinS32) cropRectI.fTop = SK_MinS32;
188fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    if (fCropRect.fRight == SK_MaxS32) cropRectI.fRight = SK_MaxS32;
189fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    if (fCropRect.fBottom == SK_MaxS32) cropRectI.fBottom = SK_MaxS32;
190b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#else
191b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    matrix.mapRect(&cropRect, fCropRect.fRect);
192b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    SkIRect cropRectI;
193b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    cropRect.roundOut(&cropRectI);
194b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    // If the original crop rect edges were unset, max out the new crop edges
195b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    if (!(fCropRect.fFlags & CropRect::kHasLeft_CropEdge)) cropRectI.fLeft = SK_MinS32;
196b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    if (!(fCropRect.fFlags & CropRect::kHasTop_CropEdge)) cropRectI.fTop = SK_MinS32;
197b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    if (!(fCropRect.fFlags & CropRect::kHasRight_CropEdge)) cropRectI.fRight = SK_MaxS32;
198b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org    if (!(fCropRect.fFlags & CropRect::kHasBottom_CropEdge)) cropRectI.fBottom = SK_MaxS32;
199b295fb6ff3222453912dfcb7a1ea5184d40014b5senorblanco@chromium.org#endif
200fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.org    return rect->intersect(cropRectI);
201194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org}
202194d775edcf5fa6e82098a97ad53018d70db1155senorblanco@chromium.org
203bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.orgbool SkImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm,
204bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org                                   SkIRect* dst) {
205bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    *dst = src;
206bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    return true;
207bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
208bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org
209fbaea5336690ffc4fd9ee695608e9457da10eeabsenorblanco@chromium.orgbool SkImageFilter::asNewEffect(GrEffectRef**, GrTexture*, const SkMatrix&) const {
210bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org    return false;
211bf2768bab9f3b21c03a8f9a75dc891231d5857ccsenorblanco@chromium.org}
2128d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org
213a1c511b8704c6c266b90860a4c68f30ca7514f9bsugoi@google.combool SkImageFilter::asColorFilter(SkColorFilter**) const {
214a1c511b8704c6c266b90860a4c68f30ca7514f9bsugoi@google.com    return false;
2158d21f6c7a9d0cf4f87d77c235c6da7203620c7e5senorblanco@chromium.org}
216