1 /* 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 15 SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) { 16 SkASSERT(s); 17 return SkNEW_ARGS(SkRectShaderImageFilter, (s, rect)); 18 } 19 20 SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const SkRect& rect) 21 : INHERITED(NULL) 22 , fShader(s) 23 , fRect(rect) { 24 SkASSERT(s); 25 s->ref(); 26 } 27 28 SkRectShaderImageFilter::SkRectShaderImageFilter(SkFlattenableReadBuffer& buffer) 29 : INHERITED(buffer) { 30 fShader = buffer.readFlattenableT<SkShader>(); 31 buffer.readRect(&fRect); 32 } 33 34 void SkRectShaderImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { 35 this->INHERITED::flatten(buffer); 36 37 buffer.writeFlattenable(fShader); 38 buffer.writeRect(fRect); 39 } 40 41 SkRectShaderImageFilter::~SkRectShaderImageFilter() { 42 SkSafeUnref(fShader); 43 } 44 45 bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy, 46 const SkBitmap& source, 47 const SkMatrix&, 48 SkBitmap* result, 49 SkIPoint*) { 50 SkRect rect(fRect); 51 if (rect.isEmpty()) { 52 rect = SkRect::MakeWH(SkIntToScalar(source.width()), SkIntToScalar(source.height())); 53 } 54 55 if (rect.isEmpty()) { 56 return false; 57 } 58 59 SkAutoTUnref<SkDevice> device(proxy->createDevice(SkScalarCeilToInt(rect.width()), 60 SkScalarCeilToInt(rect.height()))); 61 SkCanvas canvas(device.get()); 62 SkPaint paint; 63 paint.setShader(fShader); 64 canvas.drawRect(rect, paint); 65 *result = device.get()->accessBitmap(false); 66 return true; 67 } 68