Add an SkColorSpaceXformer image filter cache
The cache is scoped with the SkColorSpaceXformer object. This ensures we're not transforming nodes with a degree > 1 multiple times, and preserves the DAG topology. Change-Id: I0b072cdac95f9f1c34e0565ed4f258aba986e1ae Reviewed-on: https://skia-review.googlesource.com/21726 Commit-Queue: Florin Malita <fmalita@chromium.org> Reviewed-by: Mike Reed <reed@google.com>
This commit is contained in:
parent
c19ced195a
commit
39e085559d
@ -10,12 +10,15 @@
|
||||
#include "SkColorSpaceXform_Base.h"
|
||||
#include "SkDrawLooper.h"
|
||||
#include "SkGradientShader.h"
|
||||
#include "SkImage.h"
|
||||
#include "SkImage_Base.h"
|
||||
#include "SkImageFilter.h"
|
||||
#include "SkImagePriv.h"
|
||||
#include "SkMakeUnique.h"
|
||||
#include "SkShaderBase.h"
|
||||
|
||||
SkColorSpaceXformer::~SkColorSpaceXformer() {}
|
||||
|
||||
std::unique_ptr<SkColorSpaceXformer> SkColorSpaceXformer::Make(sk_sp<SkColorSpace> dst) {
|
||||
std::unique_ptr<SkColorSpaceXform> fromSRGB = SkColorSpaceXform_Base::New(
|
||||
SkColorSpace::MakeSRGB().get(), dst.get(), SkTransferFunctionBehavior::kIgnore);
|
||||
@ -50,7 +53,18 @@ sk_sp<SkColorFilter> SkColorSpaceXformer::apply(const SkColorFilter* colorFilter
|
||||
}
|
||||
|
||||
sk_sp<SkImageFilter> SkColorSpaceXformer::apply(const SkImageFilter* imageFilter) {
|
||||
return imageFilter ? imageFilter->makeColorSpace(this) : nullptr;
|
||||
if (!imageFilter) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (auto* xformedFilter = fFilterCache.find(imageFilter->fUniqueID)) {
|
||||
return sk_ref_sp(xformedFilter->get());
|
||||
}
|
||||
|
||||
auto xformedFilter = imageFilter->makeColorSpace(this);
|
||||
fFilterCache.set(imageFilter->fUniqueID, xformedFilter);
|
||||
|
||||
return xformedFilter;
|
||||
}
|
||||
|
||||
sk_sp<SkShader> SkColorSpaceXformer::apply(const SkShader* shader) {
|
||||
|
@ -8,15 +8,25 @@
|
||||
#ifndef SkColorSpaceXformer_DEFINED
|
||||
#define SkColorSpaceXformer_DEFINED
|
||||
|
||||
#include "SkColorSpaceXform.h"
|
||||
#include "SkImage.h"
|
||||
#include "SkShader.h"
|
||||
#include "SkImageFilter.h"
|
||||
#include "SkColor.h"
|
||||
#include "SkRefCnt.h"
|
||||
#include "SkTHash.h"
|
||||
|
||||
class SkBitmap;
|
||||
class SkColorFilter;
|
||||
class SkColorSpace;
|
||||
class SkColorSpaceXform;
|
||||
class SkImage;
|
||||
class SkImageFilter;
|
||||
class SkPaint;
|
||||
class SkShader;
|
||||
|
||||
class SkColorSpaceXformer : public SkNoncopyable {
|
||||
public:
|
||||
static std::unique_ptr<SkColorSpaceXformer> Make(sk_sp<SkColorSpace> dst);
|
||||
|
||||
~SkColorSpaceXformer();
|
||||
|
||||
sk_sp<SkImage> apply(const SkImage*);
|
||||
sk_sp<SkImage> apply(const SkBitmap&);
|
||||
sk_sp<SkColorFilter> apply(const SkColorFilter*);
|
||||
@ -29,10 +39,12 @@ public:
|
||||
sk_sp<SkColorSpace> dst() const { return fDst; }
|
||||
|
||||
private:
|
||||
SkColorSpaceXformer() {}
|
||||
SkColorSpaceXformer() = default;
|
||||
|
||||
sk_sp<SkColorSpace> fDst;
|
||||
std::unique_ptr<SkColorSpaceXform> fFromSRGB;
|
||||
|
||||
SkTHashMap<uint32_t, sk_sp<SkImageFilter>> fFilterCache;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "SkColorMatrixFilter.h"
|
||||
#include "SkColorSpace.h"
|
||||
#include "SkColorSpaceXformer.h"
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "GrFragmentProcessor.h"
|
||||
|
@ -1920,6 +1920,5 @@ DEF_TEST(ImageFilterColorSpaceDAG, reporter) {
|
||||
auto xformer = SkColorSpaceXformer::Make(SkColorSpace::MakeSRGB());
|
||||
auto xformedFilter = xformer->apply(complexFilter.get());
|
||||
|
||||
// FIXME: clone count should be 1 at this point.
|
||||
REPORTER_ASSERT(reporter, filter->cloneCount() == 2u);
|
||||
REPORTER_ASSERT(reporter, filter->cloneCount() == 1u);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include "SkArenaAlloc.h"
|
||||
#include "SkBitmap.h"
|
||||
#include "SkCanvas.h"
|
||||
#include "SkColorSpaceXformer.h"
|
||||
#include "SkDrawLooper.h"
|
||||
|
Loading…
Reference in New Issue
Block a user