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(0, NULL, cropRect)
38 SkRectShaderImageFilter::SkRectShaderImageFilter(SkReadBuffer& buffer)
39 : INHERITED(0, 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 if (!this->applyCropRect(ctx, source, SkIPoint::Make(0, 0), &bounds)) {
63 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(),
65 if (NULL == device.get()) {
68 SkCanvas canvas(device.get());
71 SkMatrix matrix(ctx.ctm());
72 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
73 paint.setShader(SkShader::CreateLocalMatrixShader(fShader, matrix))->unref();
75 SkRect rect = SkRect::MakeWH(SkIntToScalar(bounds.width()), SkIntToScalar(bounds.height()));
76 canvas.drawRect(rect, paint);
78 *result = device.get()->accessBitmap(false);
79 offset->fX = bounds.fLeft;
80 offset->fY = bounds.fTop;