189820941d3235c89e15142daae082da5b892e5d4sugoi@google.com/*
289820941d3235c89e15142daae082da5b892e5d4sugoi@google.com * Copyright 2013 Google Inc.
389820941d3235c89e15142daae082da5b892e5d4sugoi@google.com *
489820941d3235c89e15142daae082da5b892e5d4sugoi@google.com * Use of this source code is governed by a BSD-style license that can be
589820941d3235c89e15142daae082da5b892e5d4sugoi@google.com * found in the LICENSE file.
689820941d3235c89e15142daae082da5b892e5d4sugoi@google.com */
789820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
889820941d3235c89e15142daae082da5b892e5d4sugoi@google.com#include "SkRectShaderImageFilter.h"
989820941d3235c89e15142daae082da5b892e5d4sugoi@google.com#include "SkBitmap.h"
1089820941d3235c89e15142daae082da5b892e5d4sugoi@google.com#include "SkCanvas.h"
1189820941d3235c89e15142daae082da5b892e5d4sugoi@google.com#include "SkDevice.h"
1289820941d3235c89e15142daae082da5b892e5d4sugoi@google.com#include "SkFlattenableBuffers.h"
1389820941d3235c89e15142daae082da5b892e5d4sugoi@google.com#include "SkShader.h"
1489820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
1507bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.comSkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) {
1689820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    SkASSERT(s);
1707bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.com    return SkNEW_ARGS(SkRectShaderImageFilter, (s, rect));
1889820941d3235c89e15142daae082da5b892e5d4sugoi@google.com}
1989820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
2007bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.comSkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const SkRect& rect)
2189820941d3235c89e15142daae082da5b892e5d4sugoi@google.com  : INHERITED(NULL)
2289820941d3235c89e15142daae082da5b892e5d4sugoi@google.com  , fShader(s)
2307bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.com  , fRect(rect) {
2489820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    SkASSERT(s);
2507bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.com    s->ref();
2689820941d3235c89e15142daae082da5b892e5d4sugoi@google.com}
2789820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
2889820941d3235c89e15142daae082da5b892e5d4sugoi@google.comSkRectShaderImageFilter::SkRectShaderImageFilter(SkFlattenableReadBuffer& buffer)
2989820941d3235c89e15142daae082da5b892e5d4sugoi@google.com  : INHERITED(buffer) {
3089820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    fShader = buffer.readFlattenableT<SkShader>();
3107bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.com    buffer.readRect(&fRect);
3289820941d3235c89e15142daae082da5b892e5d4sugoi@google.com}
3389820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
3489820941d3235c89e15142daae082da5b892e5d4sugoi@google.comvoid SkRectShaderImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
3589820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    this->INHERITED::flatten(buffer);
3689820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
3789820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    buffer.writeFlattenable(fShader);
3807bc6c64487ecf264efa84a725f8f48de4c40488sugoi@google.com    buffer.writeRect(fRect);
3989820941d3235c89e15142daae082da5b892e5d4sugoi@google.com}
4089820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
4189820941d3235c89e15142daae082da5b892e5d4sugoi@google.comSkRectShaderImageFilter::~SkRectShaderImageFilter() {
4289820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    SkSafeUnref(fShader);
4389820941d3235c89e15142daae082da5b892e5d4sugoi@google.com}
4489820941d3235c89e15142daae082da5b892e5d4sugoi@google.com
4589820941d3235c89e15142daae082da5b892e5d4sugoi@google.combool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
46d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com                                            const SkBitmap& source,
47d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com                                            const SkMatrix&,
48d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com                                            SkBitmap* result,
49d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com                                            SkIPoint*) {
50d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    SkRect rect(fRect);
51d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    if (rect.isEmpty()) {
52bfb339ab5a43667d3d21b8672febd91425b05888caryclark@google.com        rect = SkRect::MakeWH(SkIntToScalar(source.width()), SkIntToScalar(source.height()));
53d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    }
54d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com
55d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    if (rect.isEmpty()) {
56d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com        return false;
57d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    }
58d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com
59d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    SkAutoTUnref<SkDevice> device(proxy->createDevice(SkScalarCeilToInt(rect.width()),
60d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com                                                      SkScalarCeilToInt(rect.height())));
6189820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    SkCanvas canvas(device.get());
6289820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    SkPaint paint;
6389820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    paint.setShader(fShader);
64d0d0e1f14b2d510418f8989bb5fc4472df40896esugoi@google.com    canvas.drawRect(rect, paint);
6589820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    *result = device.get()->accessBitmap(false);
6689820941d3235c89e15142daae082da5b892e5d4sugoi@google.com    return true;
6789820941d3235c89e15142daae082da5b892e5d4sugoi@google.com}
68