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