2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #include "SkRectShaderImageFilter.h"
12 #include "SkReadBuffer.h"
13 #include "SkWriteBuffer.h"
16 SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) {
18 uint32_t flags = CropRect::kHasAll_CropEdge;
19 if (rect.width() == 0 || rect.height() == 0) {
22 CropRect cropRect(rect, flags);
23 return SkNEW_ARGS(SkRectShaderImageFilter, (s, &cropRect));
26 SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const CropRect* cropRect) {
28 return SkNEW_ARGS(SkRectShaderImageFilter, (s, cropRect));
31 SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const CropRect* cropRect)
32 : INHERITED(NULL, cropRect)
38 SkRectShaderImageFilter::SkRectShaderImageFilter(SkReadBuffer& buffer)
39 : INHERITED(1, buffer) {
40 fShader = buffer.readShader();
43 void SkRectShaderImageFilter::flatten(SkWriteBuffer& buffer) const {
44 this->INHERITED::flatten(buffer);
46 buffer.writeFlattenable(fShader);
49 SkRectShaderImageFilter::~SkRectShaderImageFilter() {
53 bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
54 const SkBitmap& source,
57 SkIPoint* offset) const {
59 source.getBounds(&bounds);
60 if (!this->applyCropRect(&bounds, ctm)) {
64 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(),
66 if (NULL == device.get()) {
69 SkCanvas canvas(device.get());
71 paint.setShader(fShader);
73 matrix.setTranslate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop));
74 fShader->setLocalMatrix(matrix);
75 SkRect rect = SkRect::MakeWH(SkIntToScalar(bounds.width()), SkIntToScalar(bounds.height()));
76 canvas.drawRect(rect, paint);
77 *result = device.get()->accessBitmap(false);
78 offset->fX = bounds.fLeft;
79 offset->fY = bounds.fTop;