SkColorFilterImageFilter.cpp revision 44888c66d4bf03da58eb9fbd3db92eb477141aab
144888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org/* 244888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org * Copyright 2012 The Android Open Source Project 344888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org * 444888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be 544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org * found in the LICENSE file. 644888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org */ 744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 844888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkColorFilterImageFilter.h" 944888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkBitmap.h" 1044888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkCanvas.h" 1144888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkDevice.h" 1244888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkColorFilter.h" 1344888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org#include "SkFlattenableBuffers.h" 1444888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 1544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.orgSkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf, SkImageFilter* input) : INHERITED(input), fColorFilter(cf) { 1644888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkSafeRef(cf); 1744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org} 1844888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 1944888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.orgSkColorFilterImageFilter::SkColorFilterImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { 2044888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org fColorFilter = buffer.readFlattenableT<SkColorFilter>(); 2144888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org} 2244888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 2344888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.orgvoid SkColorFilterImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { 2444888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org this->INHERITED::flatten(buffer); 2544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 2644888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org buffer.writeFlattenable(fColorFilter); 2744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org} 2844888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 2944888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.orgSkColorFilterImageFilter::~SkColorFilterImageFilter() { 3044888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkSafeUnref(fColorFilter); 3144888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org} 3244888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 3344888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.orgbool SkColorFilterImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source, 3444888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org const SkMatrix& matrix, 3544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkBitmap* result, 3644888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkIPoint* loc) { 3744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkBitmap src = this->getInputResult(proxy, source, matrix, loc); 3844888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkColorFilter* cf = fColorFilter; 3944888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org if (NULL == cf) { 4044888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org *result = src; 4144888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org return true; 4244888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org } 4344888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 4444888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkAutoTUnref<SkDevice> device(proxy->createDevice(src.width(), src.height())); 4544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkCanvas canvas(device.get()); 4644888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org SkPaint paint; 4744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 4844888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org paint.setXfermodeMode(SkXfermode::kSrc_Mode); 4944888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org paint.setColorFilter(fColorFilter); 5044888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org canvas.drawSprite(src, 0, 0, &paint); 5144888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 5244888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org *result = device.get()->accessBitmap(false); 5344888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org return true; 5444888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org} 5544888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 5644888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.orgSK_DEFINE_FLATTENABLE_REGISTRAR(SkColorFilterImageFilter) 5744888c66d4bf03da58eb9fbd3db92eb477141aabsenorblanco@chromium.org 58