1e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger/*
2e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger * Copyright 2013 Google Inc.
3e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger *
4e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
5e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger * found in the LICENSE file.
6e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger */
7e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
8e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#include "SkBitmap.h"
9e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#include "SkComposeImageFilter.h"
10e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger#include "SkFlattenableBuffers.h"
11e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
12e27eefc4844477cee5d32f51ab45ff62020cdb36Derek SollenbergerSkComposeImageFilter::~SkComposeImageFilter() {
13e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger}
14e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
15e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenbergerbool SkComposeImageFilter::onFilterImage(Proxy* proxy,
16e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger                                         const SkBitmap& src,
17e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger                                         const SkMatrix& ctm,
18e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger                                         SkBitmap* result,
19e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger                                         SkIPoint* loc) {
20e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    SkImageFilter* outer = getInput(0);
21e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    SkImageFilter* inner = getInput(1);
22e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
23e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    if (!outer && !inner) {
24e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger        return false;
25e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    }
26e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
27e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    if (!outer || !inner) {
28e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger        return (outer ? outer : inner)->filterImage(proxy, src, ctm, result, loc);
29e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    }
30e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
31e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    SkBitmap tmp;
32e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    return inner->filterImage(proxy, src, ctm, &tmp, loc) &&
33e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger           outer->filterImage(proxy, tmp, ctm, result, loc);
34e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger}
35e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
36e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenbergerbool SkComposeImageFilter::onFilterBounds(const SkIRect& src,
37e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger                                          const SkMatrix& ctm,
38e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger                                          SkIRect* dst) {
39e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    SkImageFilter* outer = getInput(0);
40e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    SkImageFilter* inner = getInput(1);
41e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
42e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    if (!outer && !inner) {
43e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger        return false;
44e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    }
45e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
46e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    if (!outer || !inner) {
47e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger        return (outer ? outer : inner)->filterBounds(src, ctm, dst);
48e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    }
49e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
50e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    SkIRect tmp;
51e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger    return inner->filterBounds(src, ctm, &tmp) &&
52e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger           outer->filterBounds(tmp, ctm, dst);
53e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger}
54e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger
55910f694aefb0b671dd8522a9afe9b6be645701c1Derek SollenbergerSkComposeImageFilter::SkComposeImageFilter(SkFlattenableReadBuffer& buffer)
56910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger  : INHERITED(2, buffer) {
57e27eefc4844477cee5d32f51ab45ff62020cdb36Derek Sollenberger}
58