5e5f948b6b
9fa60d ("Simplify flattening to just write enough ... ") simplified just a tad too much. In particular, it disabled deserialization of SkImageFilter's uniqueID, which in turn caused the failure of SkImageFilter's cache, which caused a large regression in Chrome's SVG filter performance. The medium-term fix is to switch to the new SkRecordDraw SkPicture backend, which will make the unique IDs unnecessary. This change is an "in case of emergecy" CL, in the event that there are problems switching on the new backend in Chrome. For that reason, it's minimalist: only the filters used by Chrome are modified, and whitespace changes are kept to a minimum. In this way, it should be easy to revert once the new backend goes in. R=reed@google.com Author: senorblanco@chromium.org Review URL: https://codereview.chromium.org/503833002
72 lines
2.6 KiB
C++
72 lines
2.6 KiB
C++
/*
|
|
* 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,
|
|
uint32_t uniqueID = 0);
|
|
|
|
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,
|
|
uint32_t uniqueID);
|
|
#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
|
|
explicit SkDisplacementMapEffect(SkReadBuffer& buffer);
|
|
#endif
|
|
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
|