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