1781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com/*
2781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com * Copyright 2013 Google Inc.
3781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com *
4781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com * Use of this source code is governed by a BSD-style license that can be
5781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com * found in the LICENSE file.
6781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com */
7781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
8781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#ifndef SkDisplacementMapEffect_DEFINED
9781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#define SkDisplacementMapEffect_DEFINED
10781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
11781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#include "SkImageFilter.h"
12781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#include "SkBitmap.h"
13781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
14781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.comclass SK_API SkDisplacementMapEffect : public SkImageFilter {
15781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.compublic:
16781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    enum ChannelSelectorType {
17781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com        kUnknown_ChannelSelectorType,
18781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com        kR_ChannelSelectorType,
19781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com        kG_ChannelSelectorType,
20781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com        kB_ChannelSelectorType,
21cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        kA_ChannelSelectorType
22781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    };
23781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
24781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    ~SkDisplacementMapEffect();
25781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
26cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    static SkDisplacementMapEffect* Create(ChannelSelectorType xChannelSelector,
27cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                           ChannelSelectorType yChannelSelector,
28cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                           SkScalar scale, SkImageFilter* displacement,
29cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                           SkImageFilter* color = NULL,
30cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                           const CropRect* cropRect = NULL) {
31cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org        return SkNEW_ARGS(SkDisplacementMapEffect, (xChannelSelector, yChannelSelector, scale,
32cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                                                    displacement, color, cropRect));
33cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    }
34cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
35781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDisplacementMapEffect)
36781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
37781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    virtual bool onFilterImage(Proxy* proxy,
38781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com                               const SkBitmap& src,
394cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org                               const Context& ctx,
40781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com                               SkBitmap* dst,
41ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                               SkIPoint* offset) const SK_OVERRIDE;
42336d1d759590d9bedcbc5a96d0fff79861cf8f7asenorblanco@chromium.org    virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE;
43336d1d759590d9bedcbc5a96d0fff79861cf8f7asenorblanco@chromium.org
44c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org    virtual bool onFilterBounds(const SkIRect& src, const SkMatrix&,
45c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org                                SkIRect* dst) const SK_OVERRIDE;
46c4b12f19a46946e1c02f3525e0ea4902b09feac5senorblanco@chromium.org
47781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#if SK_SUPPORT_GPU
48781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; }
494cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
50ae761f7545d8ebf181d220169afac2056b057b8ccommit-bot@chromium.org                                SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
51781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#endif
52781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
53781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.comprotected:
54cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org    SkDisplacementMapEffect(ChannelSelectorType xChannelSelector,
55cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                            ChannelSelectorType yChannelSelector,
56cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                            SkScalar scale, SkImageFilter* displacement,
57cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                            SkImageFilter* color = NULL,
58cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org                            const CropRect* cropRect = NULL);
59bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    explicit SkDisplacementMapEffect(SkReadBuffer& buffer);
60bd0be25074e53a6d1abc284562568c9745191984commit-bot@chromium.org    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
61cac5fd597f6e2495f50aaa6bcbe3dadc56f0b977commit-bot@chromium.org
62781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.comprivate:
63781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    ChannelSelectorType fXChannelSelector;
64781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    ChannelSelectorType fYChannelSelector;
65781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    SkScalar fScale;
66781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com    typedef SkImageFilter INHERITED;
67336d1d759590d9bedcbc5a96d0fff79861cf8f7asenorblanco@chromium.org    const SkImageFilter* getDisplacementInput() const { return getInput(0); }
68336d1d759590d9bedcbc5a96d0fff79861cf8f7asenorblanco@chromium.org    const SkImageFilter* getColorInput() const { return getInput(1); }
69781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com};
70781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com
71781cc76e0f1ebb06e0796a9237045ae9d4bddd21sugoi@google.com#endif
72