Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/core/SkMaskCache.cpp

Issue 592843003: Add SkCachedData and use it for SkMipMap (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: use explicit runtime flag to recognize Discardable, to allow clients to subclass Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
2 * Copyright 2014 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 #include "SkCachedData_priv.h"
9 #include "SkMaskCache.h"
10 #include "SkResourceCache.h"
11 #include "SkRRect.h"
12
13 struct MaskKey_Rects : public SkResourceCache::Key {
14 MaskKey_Rects(SkScalar sigma, const SkRect& outer, const SkRect& inner)
15 : fSigma(sigma)
16 , fOuter(outer)
17 , fInner(inner)
18 {
19 this->init(sizeof(fSigma) + sizeof(fOuter) + sizeof(fInner));
20 }
21
22 SkScalar fSigma;
23 SkRect fOuter;
24 SkRect fInner;
25 };
26
27 struct MaskKey_RRect : public SkResourceCache::Key {
28 MaskKey_RRect(SkScalar sigma, const SkRRect& rrect)
29 : fSigma(sigma)
30 , fRRect(rrect)
31 {
32 this->init(sizeof(fSigma) + sizeof(fRRect));
33 }
34
35 SkScalar fSigma;
36 SkRRect fRRect;
37 };
38
39 struct MaskValue {
40 SkMask fMask;
41 SkCachedData* fPixels;
42 };
43
44 struct MaskRecBase : public SkResourceCache::Rec {
45 MaskValue fValue;
46 };
47
48 template <typename MaskKey> struct TMaskRec : public MaskRecBase {
49 TMaskRec(const MaskKey& key, const SkMask& mask, SkCachedData* pixels) : fKe y(key) {
50 fValue.fMask = mask;
51 fValue.fPixels = pixels;
52 fValue.fPixels->attachToCacheAndRef();
53 }
54 virtual ~TMaskRec() {
55 fValue.fPixels->detachFromCacheAndUnref();
56 }
57
58 MaskKey fKey;
59
60 virtual const Key& getKey() const SK_OVERRIDE { return fKey; }
61
62 virtual size_t bytesUsed() const SK_OVERRIDE {
63 return sizeof(*this) + fValue.fPixels->size();
64 }
65
66 static bool Visitor(const SkResourceCache::Rec& baseRec, void* contextPayloa d) {
67 const MaskRecBase& rec = static_cast<const MaskRecBase&>(baseRec);
68
69 SkCachedData* pixels = rec.fValue.fPixels;
70 pixels->ref();
71 if (NULL == pixels->data()) {
72 pixels->unref();
73 return false;
74 }
75
76 // we return our pixels already (successfully) ref'd
77 *static_cast<MaskValue*>(contextPayload) = rec.fValue;
78 return true;
79 }
80 };
81
82 //////////////////////////////////////////////////////////////////////////////// ///////////////////
83
84 template <typename MaskKey>
85 static SkCachedData* find_and_lock(const MaskKey& key, SkMask* mask, SkResourceC ache* localCache) {
86 MaskValue value;
87
88 bool found;
89 if (localCache) {
90 found = localCache->find(key, TMaskRec<MaskKey>::Visitor, &value);
91 } else {
92 found = SkResourceCache::Find(key, TMaskRec<MaskKey>::Visitor, &value);
93 }
94 if (!found) {
95 return NULL;
96 }
97
98 if (mask) {
99 *mask = value.fMask;
100 mask->fImage = (uint8_t*)value.fPixels->data();
101 }
102 return value.fPixels;
103 }
104
105 SkCachedData* SkMaskCache::FindAndLock(SkScalar sigma, const SkRect& r0, const S kRect& r1,
106 SkMask* result, SkResourceCache* localCac he) {
107 return find_and_lock(MaskKey_Rects(sigma, r0, r1), result, localCache);
108 }
109
110 SkCachedData* SkMaskCache::FindAndLock(SkScalar sigma, const SkRRect& rrect,
111 SkMask* result, SkResourceCache* localCac he) {
112 return find_and_lock(MaskKey_RRect(sigma, rrect), result, localCache);
113 }
114
115 static void add(SkResourceCache::Rec* rec, SkResourceCache* localCache) {
116 localCache ? localCache->add(rec) : SkResourceCache::Add(rec);
117 }
118
119 void SkMaskCache::Add(SkScalar sigma, const SkRect& r0, const SkRect& r1, const SkMask& mask,
120 SkCachedData* pixels, SkResourceCache* localCache) {
121 add(SkNEW_ARGS(TMaskRec<MaskKey_Rects>, (MaskKey_Rects(sigma, r0, r1), mask, pixels)), localCache);
122 }
123
124 void SkMaskCache::Add(SkScalar sigma, const SkRRect& rrect, const SkMask& mask,
125 SkCachedData* pixels, SkResourceCache* localCache) {
126 add(SkNEW_ARGS(TMaskRec<MaskKey_RRect>, (MaskKey_RRect(sigma, rrect), mask, pixels)), localCache);
127 }
128
129 //////////////////////////////////////////////////////////////////////////////// ///////////////////
130 // 1 Rect just means 2 rects where the 2nd (inner) rect is empty
131
132 SkCachedData* SkMaskCache::FindAndLock(SkScalar sigma, const SkRect& rect,
133 SkMask* result, SkResourceCache* localCac he) {
134 return FindAndLock(sigma, rect, SkRect::MakeEmpty(), result, localCache);
135 }
136
137 void SkMaskCache::Add(SkScalar sigma, const SkRect& rect,
138 const SkMask& result, SkCachedData* data, SkResourceCache* localCache) {
139 return Add(sigma, rect, SkRect::MakeEmpty(), result, data, localCache);
140 }
141
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698