186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org/*
286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org * Copyright 2013 The Android Open Source Project
386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org *
486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org * found in the LICENSE file.
686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org */
786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#ifndef SkXfermodeImageFilter_DEFINED
986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#define SkXfermodeImageFilter_DEFINED
1086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#include "SkImageFilter.h"
1286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgclass SkBitmap;
1486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgclass SkXfermode;
1586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
1686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgclass SK_API SkXfermodeImageFilter : public SkImageFilter {
1786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    /**
1886fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org     * This filter takes an xfermode, and uses it to composite the foreground
1986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org     * over the background.  If foreground or background is NULL, the input
2086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org     * bitmap (src) is used instead.
2186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org      */
2286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
2386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgpublic:
2486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    virtual ~SkXfermodeImageFilter();
2586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
26cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkXfermodeImageFilter* Create(SkXfermode* mode, SkImageFilter* background,
27cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                         SkImageFilter* foreground = NULL,
28cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                         const CropRect* cropRect = NULL) {
29cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        return SkNEW_ARGS(SkXfermodeImageFilter, (mode, background, foreground, cropRect));
30cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
31cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
3286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkXfermodeImageFilter)
3386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
3486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    virtual bool onFilterImage(Proxy* proxy,
3586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org                               const SkBitmap& src,
364cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org                               const Context& ctx,
3786fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org                               SkBitmap* dst,
38ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkIPoint* offset) const SK_OVERRIDE;
3986fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#if SK_SUPPORT_GPU
40ee845ae4940779280a853269d7d797dc9eb89201senorblanco@chromium.org    virtual bool canFilterImageGPU() const SK_OVERRIDE;
414cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
42ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                                SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
4386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#endif
4486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
4586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgprotected:
46bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    SkXfermodeImageFilter(SkXfermode* mode, SkImageFilter* background,
47bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org                          SkImageFilter* foreground, const CropRect* cropRect);
488b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    explicit SkXfermodeImageFilter(SkReadBuffer& buffer);
498b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
5086fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
5186fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.orgprivate:
5286fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    SkXfermode* fMode;
5386fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org    typedef SkImageFilter INHERITED;
5486fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org};
5586fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org
5686fc266eda887920e3dd104bee8121ae19729cf5senorblanco@chromium.org#endif
57