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