Home | History | Annotate | Download | only in effects
      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