/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkDisplacementMapEffect_DEFINED #define SkDisplacementMapEffect_DEFINED #include "SkImageFilter.h" #include "SkBitmap.h" class SK_API SkDisplacementMapEffect : public SkImageFilter { public: enum ChannelSelectorType { kUnknown_ChannelSelectorType, kR_ChannelSelectorType, kG_ChannelSelectorType, kB_ChannelSelectorType, kA_ChannelSelectorType }; ~SkDisplacementMapEffect(); static SkDisplacementMapEffect* Create(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, SkScalar scale, SkImageFilter* displacement, SkImageFilter* color = NULL, const CropRect* cropRect = NULL) { SkImageFilter* inputs[2] = { displacement, color }; return SkNEW_ARGS(SkDisplacementMapEffect, (xChannelSelector, yChannelSelector, scale, inputs, cropRect)); } SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDisplacementMapEffect) virtual bool onFilterImage(Proxy* proxy, const SkBitmap& src, const Context& ctx, SkBitmap* dst, SkIPoint* offset) const SK_OVERRIDE; virtual void computeFastBounds(const SkRect& src, SkRect* dst) const SK_OVERRIDE; virtual bool onFilterBounds(const SkIRect& src, const SkMatrix&, SkIRect* dst) const SK_OVERRIDE; #if SK_SUPPORT_GPU virtual bool canFilterImageGPU() const SK_OVERRIDE { return true; } virtual bool filterImageGPU(Proxy* proxy, const SkBitmap& src, const Context& ctx, SkBitmap* result, SkIPoint* offset) const SK_OVERRIDE; #endif protected: SkDisplacementMapEffect(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, SkScalar scale, SkImageFilter* inputs[2], const CropRect* cropRect); explicit SkDisplacementMapEffect(SkReadBuffer& buffer); virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; private: ChannelSelectorType fXChannelSelector; ChannelSelectorType fYChannelSelector; SkScalar fScale; typedef SkImageFilter INHERITED; const SkImageFilter* getDisplacementInput() const { return getInput(0); } const SkImageFilter* getColorInput() const { return getInput(1); } }; #endif