blob: fb34ed0007152f124ae557a5567aad4effa3bed5 [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"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000012#include "SkReadBuffer.h"
13#include "SkWriteBuffer.h"
sugoi@google.coma1c511b2013-02-21 15:02:28 +000014#include "SkShader.h"
15
sugoi@google.com4b6d4322013-02-21 20:26:50 +000016SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) {
sugoi@google.coma1c511b2013-02-21 15:02:28 +000017 SkASSERT(s);
senorblanco@chromium.org5e853002013-10-11 17:57:47 +000018 uint32_t flags = CropRect::kHasAll_CropEdge;
19 if (rect.width() == 0 || rect.height() == 0) {
20 flags = 0x0;
21 }
22 CropRect cropRect(rect, flags);
senorblanco@chromium.orge258eb32013-10-10 21:36:48 +000023 return SkNEW_ARGS(SkRectShaderImageFilter, (s, &cropRect));
sugoi@google.coma1c511b2013-02-21 15:02:28 +000024}
25
senorblanco5e5f9482014-08-26 12:27:12 -070026SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const CropRect* cropRect, uint32_t uniqueID) {
senorblanco@chromium.org33e88b72013-10-15 15:25:18 +000027 SkASSERT(s);
senorblanco5e5f9482014-08-26 12:27:12 -070028 return SkNEW_ARGS(SkRectShaderImageFilter, (s, cropRect, uniqueID));
senorblanco@chromium.org33e88b72013-10-15 15:25:18 +000029}
30
senorblanco5e5f9482014-08-26 12:27:12 -070031SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const CropRect* cropRect,
32 uint32_t uniqueID)
33 : INHERITED(0, NULL, cropRect, uniqueID)
senorblanco@chromium.orge258eb32013-10-10 21:36:48 +000034 , fShader(s) {
sugoi@google.coma1c511b2013-02-21 15:02:28 +000035 SkASSERT(s);
sugoi@google.com4b6d4322013-02-21 20:26:50 +000036 s->ref();
sugoi@google.coma1c511b2013-02-21 15:02:28 +000037}
38
reed9fa60da2014-08-21 07:59:51 -070039#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000040SkRectShaderImageFilter::SkRectShaderImageFilter(SkReadBuffer& buffer)
senorblanco9ea3d572014-07-08 09:16:22 -070041 : INHERITED(0, buffer) {
reed@google.com35348222013-10-16 13:05:06 +000042 fShader = buffer.readShader();
sugoi@google.coma1c511b2013-02-21 15:02:28 +000043}
reed9fa60da2014-08-21 07:59:51 -070044#endif
45
46SkFlattenable* SkRectShaderImageFilter::CreateProc(SkReadBuffer& buffer) {
47 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 0);
mtkleinb00f54d2014-08-22 13:42:56 -070048 SkAutoTUnref<SkShader> shader(buffer.readShader());
senorblanco5e5f9482014-08-26 12:27:12 -070049 return Create(shader.get(), &common.cropRect(), common.uniqueID());
reed9fa60da2014-08-21 07:59:51 -070050}
sugoi@google.coma1c511b2013-02-21 15:02:28 +000051
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000052void SkRectShaderImageFilter::flatten(SkWriteBuffer& buffer) const {
sugoi@google.coma1c511b2013-02-21 15:02:28 +000053 this->INHERITED::flatten(buffer);
sugoi@google.coma1c511b2013-02-21 15:02:28 +000054 buffer.writeFlattenable(fShader);
sugoi@google.coma1c511b2013-02-21 15:02:28 +000055}
56
57SkRectShaderImageFilter::~SkRectShaderImageFilter() {
58 SkSafeUnref(fShader);
59}
60
61bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy,
sugoi@google.comf738cf02013-04-18 14:13:10 +000062 const SkBitmap& source,
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000063 const Context& ctx,
sugoi@google.comf738cf02013-04-18 14:13:10 +000064 SkBitmap* result,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000065 SkIPoint* offset) const {
senorblanco@chromium.orge258eb32013-10-10 21:36:48 +000066 SkIRect bounds;
senorblanco@chromium.org11825292014-03-14 17:44:41 +000067 if (!this->applyCropRect(ctx, source, SkIPoint::Make(0, 0), &bounds)) {
sugoi@google.comf738cf02013-04-18 14:13:10 +000068 return false;
69 }
70
senorblanco@chromium.orge258eb32013-10-10 21:36:48 +000071 SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(),
72 bounds.height()));
commit-bot@chromium.orgcd3b15c2013-12-04 17:06:49 +000073 if (NULL == device.get()) {
74 return false;
75 }
sugoi@google.coma1c511b2013-02-21 15:02:28 +000076 SkCanvas canvas(device.get());
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000077
sugoi@google.coma1c511b2013-02-21 15:02:28 +000078 SkPaint paint;
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000079 SkMatrix matrix(ctx.ctm());
senorblanco@chromium.org47d98c82014-03-03 14:58:09 +000080 matrix.postTranslate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top()));
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000081 paint.setShader(SkShader::CreateLocalMatrixShader(fShader, matrix))->unref();
82
senorblanco@chromium.orge258eb32013-10-10 21:36:48 +000083 SkRect rect = SkRect::MakeWH(SkIntToScalar(bounds.width()), SkIntToScalar(bounds.height()));
sugoi@google.comf738cf02013-04-18 14:13:10 +000084 canvas.drawRect(rect, paint);
commit-bot@chromium.org5970f622014-05-12 20:42:21 +000085
sugoi@google.coma1c511b2013-02-21 15:02:28 +000086 *result = device.get()->accessBitmap(false);
senorblanco@chromium.org6776b822014-01-03 21:48:22 +000087 offset->fX = bounds.fLeft;
88 offset->fY = bounds.fTop;
sugoi@google.coma1c511b2013-02-21 15:02:28 +000089 return true;
90}