1/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkImageFilterCache_DEFINED
9#define SkImageFilterCache_DEFINED
10
11#include "include/core/SkMatrix.h"
12#include "include/core/SkRefCnt.h"
13#include "src/core/SkImageFilterTypes.h"
14
15struct SkIPoint;
16class SkImageFilter;
17
18struct SkImageFilterCacheKey {
19 SkImageFilterCacheKey(const uint32_t uniqueID, const SkMatrix& matrix,
20 const SkIRect& clipBounds, uint32_t srcGenID, const SkIRect& srcSubset)
21 : fUniqueID(uniqueID)
22 , fMatrix(matrix)
23 , fClipBounds(clipBounds)
24 , fSrcGenID(srcGenID)
25 , fSrcSubset(srcSubset) {
26 // Assert that Key is tightly-packed, since it is hashed.
27 static_assert(sizeof(SkImageFilterCacheKey) == sizeof(uint32_t) + sizeof(SkMatrix) +
28 sizeof(SkIRect) + sizeof(uint32_t) + 4 * sizeof(int32_t),
29 "image_filter_key_tight_packing");
30 fMatrix.getType(); // force initialization of type, so hashes match
31 SkASSERT(fMatrix.isFinite()); // otherwise we can't rely on == self when comparing keys
32 }
33
34 uint32_t fUniqueID;
35 SkMatrix fMatrix;
36 SkIRect fClipBounds;
37 uint32_t fSrcGenID;
38 SkIRect fSrcSubset;
39
40 bool operator==(const SkImageFilterCacheKey& other) const {
41 return fUniqueID == other.fUniqueID &&
42 fMatrix == other.fMatrix &&
43 fClipBounds == other.fClipBounds &&
44 fSrcGenID == other.fSrcGenID &&
45 fSrcSubset == other.fSrcSubset;
46 }
47};
48
49// This cache maps from (filter's unique ID + CTM + clipBounds + src bitmap generation ID) to result
50// NOTE: this is the _specific_ unique ID of the image filter, so refiltering the same image with a
51// copy of the image filter (with exactly the same parameters) will not yield a cache hit.
52class SkImageFilterCache : public SkRefCnt {
53public:
54 SK_USE_FLUENT_IMAGE_FILTER_TYPES_IN_CLASS
55
56 enum { kDefaultTransientSize = 32 * 1024 * 1024 };
57
58 virtual ~SkImageFilterCache() {}
59 static SkImageFilterCache* Create(size_t maxBytes);
60 static SkImageFilterCache* Get();
61
62 // Returns true on cache hit and updates 'result' to be the cached result. Returns false when
63 // not in the cache, in which case 'result' is not modified.
64 virtual bool get(const SkImageFilterCacheKey& key,
65 skif::FilterResult<For::kOutput>* result) const = 0;
66 // 'filter' is included in the caching to allow the purging of all of an image filter's cached
67 // results when it is destroyed.
68 virtual void set(const SkImageFilterCacheKey& key, const SkImageFilter* filter,
69 const skif::FilterResult<For::kOutput>& result) = 0;
70 virtual void purge() = 0;
71 virtual void purgeByImageFilter(const SkImageFilter*) = 0;
72 SkDEBUGCODE(virtual int count() const = 0;)
73};
74
75#endif
76