SkColorFilterImageFilter.cpp revision 44888c66d4bf03da58eb9fbd3db92eb477141aab
1/* 2 * Copyright 2012 The Android Open Source Project 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 "SkColorFilterImageFilter.h" 9#include "SkBitmap.h" 10#include "SkCanvas.h" 11#include "SkDevice.h" 12#include "SkColorFilter.h" 13#include "SkFlattenableBuffers.h" 14 15SkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf, SkImageFilter* input) : INHERITED(input), fColorFilter(cf) { 16 SkSafeRef(cf); 17} 18 19SkColorFilterImageFilter::SkColorFilterImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 20 fColorFilter = buffer.readFlattenableT<SkColorFilter>(); 21} 22 23void SkColorFilterImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { 24 this->INHERITED::flatten(buffer); 25 26 buffer.writeFlattenable(fColorFilter); 27} 28 29SkColorFilterImageFilter::~SkColorFilterImageFilter() { 30 SkSafeUnref(fColorFilter); 31} 32 33bool SkColorFilterImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source, 34 const SkMatrix& matrix, 35 SkBitmap* result, 36 SkIPoint* loc) { 37 SkBitmap src = this->getInputResult(proxy, source, matrix, loc); 38 SkColorFilter* cf = fColorFilter; 39 if (NULL == cf) { 40 *result = src; 41 return true; 42 } 43 44 SkAutoTUnref<SkDevice> device(proxy->createDevice(src.width(), src.height())); 45 SkCanvas canvas(device.get()); 46 SkPaint paint; 47 48 paint.setXfermodeMode(SkXfermode::kSrc_Mode); 49 paint.setColorFilter(fColorFilter); 50 canvas.drawSprite(src, 0, 0, &paint); 51 52 *result = device.get()->accessBitmap(false); 53 return true; 54} 55 56SK_DEFINE_FLATTENABLE_REGISTRAR(SkColorFilterImageFilter) 57 58