blob: ada861fd5c134b4e51b7b56727a4f2b8a2aae7e2 [file] [log] [blame]
sugoi@google.coma1c511b2013-02-21 15:02:28 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkRectShaderImageFilter.h"
9#include "SkBitmap.h"
10#include "SkCanvas.h"
11#include "SkDevice.h"
12#include "SkFlattenableBuffers.h"
13#include "SkShader.h"
14
sugoi@google.com4b6d4322013-02-21 20:26:50 +000015SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) {
sugoi@google.coma1c511b2013-02-21 15:02:28 +000016 SkASSERT(s);
sugoi@google.com4b6d4322013-02-21 20:26:50 +000017 return SkNEW_ARGS(SkRectShaderImageFilter, (s, rect));
sugoi@google.coma1c511b2013-02-21 15:02:28 +000018}
19
sugoi@google.com4b6d4322013-02-21 20:26:50 +000020SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const SkRect& rect)
sugoi@google.coma1c511b2013-02-21 15:02:28 +000021 : INHERITED(NULL)
22 , fShader(s)
sugoi@google.com4b6d4322013-02-21 20:26:50 +000023 , fRect(rect) {
sugoi@google.coma1c511b2013-02-21 15:02:28 +000024 SkASSERT(s);
sugoi@google.com4b6d4322013-02-21 20:26:50 +000025 s->ref();
sugoi@google.coma1c511b2013-02-21 15:02:28 +000026}
27
28SkRectShaderImageFilter::SkRectShaderImageFilter(SkFlattenableReadBuffer& buffer)
29 : INHERITED(buffer) {
30 fShader = buffer.readFlattenableT<SkShader>();
sugoi@google.com4b6d4322013-02-21 20:26:50 +000031 buffer.readRect(&fRect);
sugoi@google.coma1c511b2013-02-21 15:02:28 +000032}
33
34void SkRectShaderImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const {
35 this->INHERITED::flatten(buffer);
36
37 buffer.writeFlattenable(fShader);
sugoi@google.com4b6d4322013-02-21 20:26:50 +000038 buffer.writeRect(fRect);
sugoi@google.coma1c511b2013-02-21 15:02:28 +000039}
40
41SkRectShaderImageFilter::~SkRectShaderImageFilter() {
42 SkSafeUnref(fShader);
43}
44
45bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
sugoi@google.comf738cf02013-04-18 14:13:10 +000046 const SkBitmap& source,
47 const SkMatrix&,
48 SkBitmap* result,
49 SkIPoint*) {
50 SkRect rect(fRect);
51 if (rect.isEmpty()) {
caryclark@google.com9584b9e2013-04-18 17:44:57 +000052 rect = SkRect::MakeWH(SkIntToScalar(source.width()), SkIntToScalar(source.height()));
sugoi@google.comf738cf02013-04-18 14:13:10 +000053 }
54
55 if (rect.isEmpty()) {
56 return false;
57 }
58
robertphillips@google.com9b051a32013-08-20 20:06:40 +000059 SkAutoTUnref<SkDevice> device(proxy->createDevice(SkScalarCeilToInt(rect.width()),
60 SkScalarCeilToInt(rect.height())));
sugoi@google.coma1c511b2013-02-21 15:02:28 +000061 SkCanvas canvas(device.get());
62 SkPaint paint;
63 paint.setShader(fShader);
sugoi@google.comf738cf02013-04-18 14:13:10 +000064 canvas.drawRect(rect, paint);
sugoi@google.coma1c511b2013-02-21 15:02:28 +000065 *result = device.get()->accessBitmap(false);
66 return true;
67}