SkDisplacementMapEffect.h revision 4cb543d6057b692e1099e9f115155f0bf323a0c8
1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch/*
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch * Copyright 2013 Google Inc.
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef SkDisplacementMapEffect_DEFINED
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define SkDisplacementMapEffect_DEFINED
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "SkImageFilter.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "SkBitmap.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass SK_API SkDisplacementMapEffect : public SkImageFilter {
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochpublic:
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    enum ChannelSelectorType {
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kUnknown_ChannelSelectorType,
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kR_ChannelSelectorType,
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kG_ChannelSelectorType,
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kB_ChannelSelectorType,
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        kA_ChannelSelectorType
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    };
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ~SkDisplacementMapEffect();
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    static SkDisplacementMapEffect* Create(ChannelSelectorType xChannelSelector,
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                           ChannelSelectorType yChannelSelector,
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                           SkScalar scale, SkImageFilter* displacement,
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                           SkImageFilter* color = NULL,
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                           const CropRect* cropRect = NULL) {
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return SkNEW_ARGS(SkDisplacementMapEffect, (xChannelSelector, yChannelSelector, scale,
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                    displacement, color, cropRect));
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    }
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDisplacementMapEffect)
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual bool onFilterImage(Proxy* proxy,
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               const SkBitmap& src,
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               const Context& ctx,
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               SkBitmap* dst,
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               SkIPoint* offset) const SK_OVERRIDE;
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE;
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual bool onFilterBounds(const SkIRect& src, const SkMatrix&,
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                SkIRect* dst) const SK_OVERRIDE;
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if SK_SUPPORT_GPU
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; }
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx,
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE;
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochprotected:
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    explicit SkDisplacementMapEffect(SkReadBuffer& buffer);
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochpublic:
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SkDisplacementMapEffect(ChannelSelectorType xChannelSelector,
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            ChannelSelectorType yChannelSelector,
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            SkScalar scale, SkImageFilter* displacement,
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            SkImageFilter* color = NULL,
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            const CropRect* cropRect = NULL);
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochprivate:
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ChannelSelectorType fXChannelSelector;
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ChannelSelectorType fYChannelSelector;
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SkScalar fScale;
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    typedef SkImageFilter INHERITED;
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const SkImageFilter* getDisplacementInput() const { return getInput(0); }
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const SkImageFilter* getColorInput() const { return getInput(1); }
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch