OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #ifndef SkRemote_DEFINED | 8 #ifndef SkRemote_DEFINED |
9 #define SkRemote_DEFINED | 9 #define SkRemote_DEFINED |
10 | 10 |
(...skipping 27 matching lines...) Expand all Loading... |
38 }; | 38 }; |
39 | 39 |
40 // TODO: document | 40 // TODO: document |
41 struct Encoder { | 41 struct Encoder { |
42 virtual ~Encoder() {} | 42 virtual ~Encoder() {} |
43 | 43 |
44 virtual void define(ID, const SkMatrix&) = 0; | 44 virtual void define(ID, const SkMatrix&) = 0; |
45 virtual void define(ID, const Misc&) = 0; | 45 virtual void define(ID, const Misc&) = 0; |
46 virtual void define(ID, const SkPath&) = 0; | 46 virtual void define(ID, const SkPath&) = 0; |
47 virtual void define(ID, const Stroke&) = 0; | 47 virtual void define(ID, const Stroke&) = 0; |
| 48 virtual void define(ID, SkXfermode*) = 0; |
48 | 49 |
49 virtual void undefine(ID) = 0; | 50 virtual void undefine(ID) = 0; |
50 | 51 |
51 virtual void save() = 0; | 52 virtual void save() = 0; |
52 virtual void restore() = 0; | 53 virtual void restore() = 0; |
53 | 54 |
54 virtual void setMatrix(ID matrix) = 0; | 55 virtual void setMatrix(ID matrix) = 0; |
55 | 56 |
56 virtual void clipPath(ID path, SkRegion::Op, bool aa) = 0; | 57 // TODO: struct CommonIDs { ID misc; ID xfermode; ... } |
57 virtual void fillPath(ID path, ID misc) = 0; | 58 // for IDs that affect both fill + stroke? |
58 virtual void strokePath(ID path, ID misc, ID stroke) = 0; | 59 |
| 60 virtual void clipPath(ID path, SkRegion::Op, bool aa) = 0; |
| 61 virtual void fillPath(ID path, ID misc, ID xfermode) = 0; |
| 62 virtual void strokePath(ID path, ID misc, ID xfermode, ID stroke) = 0; |
59 }; | 63 }; |
60 | 64 |
61 class LookupScope; | 65 class LookupScope; |
62 | 66 |
63 // TODO: document | 67 // The Cache interface encapsulates the caching logic of the Client. |
| 68 // |
| 69 // Each lookup() method must always fill ID* with a valid value, |
| 70 // but ID may be cached. If so, the lookup() method returns true; |
| 71 // if not the lookup() method returns false and the Client must |
| 72 // then define() this ID -> Thing mapping before using the ID. |
| 73 // |
| 74 // The Caches may also add IDs to the LookupScope's list of IDs to |
| 75 // undefine() on destruction. This lets the Cache purge IDs. |
64 struct Cache { | 76 struct Cache { |
65 virtual ~Cache() {} | 77 virtual ~Cache() {} |
66 | 78 |
67 static Cache* CreateNeverCache(); | 79 static Cache* CreateNeverCache(); // Never caches anything. |
68 static Cache* CreateAlwaysCache(); | 80 static Cache* CreateAlwaysCache(); // Caches by value (not deep pointer
equality). |
| 81 // TODO: static Cache* CreateDeepCache(); // Caches by deep value. |
69 | 82 |
70 virtual bool lookup(const SkMatrix&, ID*, LookupScope*) = 0; | 83 virtual bool lookup(const SkMatrix&, ID*, LookupScope*) = 0; |
71 virtual bool lookup(const Misc&, ID*, LookupScope*) = 0; | 84 virtual bool lookup(const Misc&, ID*, LookupScope*) = 0; |
72 virtual bool lookup(const SkPath&, ID*, LookupScope*) = 0; | 85 virtual bool lookup(const SkPath&, ID*, LookupScope*) = 0; |
73 virtual bool lookup(const Stroke&, ID*, LookupScope*) = 0; | 86 virtual bool lookup(const Stroke&, ID*, LookupScope*) = 0; |
| 87 virtual bool lookup(const SkXfermode*, ID*, LookupScope*) = 0; |
74 | 88 |
75 virtual void cleanup(Encoder*) = 0; | 89 virtual void cleanup(Encoder*) = 0; |
76 }; | 90 }; |
77 | 91 |
78 // TODO: document | 92 // TODO: document |
79 class Client final : public SkCanvas { | 93 class Client final : public SkCanvas { |
80 public: | 94 public: |
81 Client(Cache*, Encoder*); | 95 Client(Cache*, Encoder*); |
82 ~Client(); | 96 ~Client(); |
83 | 97 |
(...skipping 29 matching lines...) Expand all Loading... |
113 // TODO: document | 127 // TODO: document |
114 class Server final : public Encoder { | 128 class Server final : public Encoder { |
115 public: | 129 public: |
116 explicit Server(SkCanvas*); | 130 explicit Server(SkCanvas*); |
117 | 131 |
118 private: | 132 private: |
119 void define(ID, const SkMatrix&) override; | 133 void define(ID, const SkMatrix&) override; |
120 void define(ID, const Misc&) override; | 134 void define(ID, const Misc&) override; |
121 void define(ID, const SkPath&) override; | 135 void define(ID, const SkPath&) override; |
122 void define(ID, const Stroke&) override; | 136 void define(ID, const Stroke&) override; |
| 137 void define(ID, SkXfermode*) override; |
123 | 138 |
124 void undefine(ID) override; | 139 void undefine(ID) override; |
125 | 140 |
126 void save() override; | 141 void save() override; |
127 void restore() override; | 142 void restore() override; |
128 | 143 |
129 void setMatrix(ID matrix) override; | 144 void setMatrix(ID matrix) override; |
130 | 145 |
131 void clipPath(ID path, SkRegion::Op, bool aa) override; | 146 void clipPath(ID path, SkRegion::Op, bool aa) override; |
132 void fillPath(ID path, ID misc) override; | 147 void fillPath(ID path, ID misc, ID xfermode) override; |
133 void strokePath(ID path, ID misc, ID stroke) override; | 148 void strokePath(ID path, ID misc, ID xfermode, ID stroke) override; |
134 | 149 |
| 150 // Maps ID -> T. |
135 template <typename T, Type kType> | 151 template <typename T, Type kType> |
136 class IDMap { | 152 class IDMap { |
137 public: | 153 public: |
| 154 ~IDMap() { |
| 155 // A well-behaved client always cleans up its definitions. |
| 156 SkASSERT(fMap.count() == 0); |
| 157 } |
| 158 |
138 void set(const ID& id, const T& val) { | 159 void set(const ID& id, const T& val) { |
139 SkASSERT(id.type() == kType); | 160 SkASSERT(id.type() == kType); |
140 fMap.set(id, val); | 161 fMap.set(id, val); |
141 } | 162 } |
142 | 163 |
143 void remove(const ID& id) { | 164 void remove(const ID& id) { |
144 SkASSERT(id.type() == kType); | 165 SkASSERT(id.type() == kType); |
145 fMap.remove(id); | 166 fMap.remove(id); |
146 } | 167 } |
147 | 168 |
148 const T& find(const ID& id) const { | 169 const T& find(const ID& id) const { |
149 SkASSERT(id.type() == kType); | 170 SkASSERT(id.type() == kType); |
150 T* val = fMap.find(id); | 171 T* val = fMap.find(id); |
151 SkASSERT(val != nullptr); | 172 SkASSERT(val != nullptr); |
152 return *val; | 173 return *val; |
153 } | 174 } |
154 | 175 |
155 private: | 176 private: |
156 SkTHashMap<ID, T> fMap; | 177 SkTHashMap<ID, T> fMap; |
157 }; | 178 }; |
158 | 179 |
159 IDMap<SkMatrix, Type::kMatrix> fMatrix; | 180 // Maps ID -> T*, and keeps the T alive by reffing it. |
160 IDMap<Misc , Type::kMisc > fMisc; | 181 template <typename T, Type kType> |
161 IDMap<SkPath , Type::kPath > fPath; | 182 class ReffedIDMap { |
162 IDMap<Stroke , Type::kStroke> fStroke; | 183 public: |
| 184 ReffedIDMap() { |
| 185 // A null ID always maps to nullptr. |
| 186 fMap.set(ID(kType), nullptr); |
| 187 } |
| 188 ~ReffedIDMap() { |
| 189 // A well-behaved client always cleans up its definitions. |
| 190 SkASSERT(fMap.count() == 1); |
| 191 } |
| 192 |
| 193 void set(const ID& id, T* val) { |
| 194 SkASSERT(id.type() == kType && val); |
| 195 fMap.set(id, SkRef(val)); |
| 196 } |
| 197 |
| 198 void remove(const ID& id) { |
| 199 SkASSERT(id.type() == kType); |
| 200 T** val = fMap.find(id); |
| 201 SkASSERT(val && *val); |
| 202 (*val)->unref(); |
| 203 fMap.remove(id); |
| 204 } |
| 205 |
| 206 T* find(const ID& id) const { |
| 207 SkASSERT(id.type() == kType); |
| 208 T** val = fMap.find(id); |
| 209 SkASSERT(val); |
| 210 return *val; |
| 211 } |
| 212 |
| 213 private: |
| 214 SkTHashMap<ID, T*> fMap; |
| 215 }; |
| 216 |
| 217 IDMap<SkMatrix, Type::kMatrix> fMatrix; |
| 218 IDMap<Misc , Type::kMisc > fMisc; |
| 219 IDMap<SkPath , Type::kPath > fPath; |
| 220 IDMap<Stroke , Type::kStroke> fStroke; |
| 221 ReffedIDMap<SkXfermode, Type::kXfermode> fXfermode; |
163 | 222 |
164 SkCanvas* fCanvas; | 223 SkCanvas* fCanvas; |
165 }; | 224 }; |
166 | 225 |
167 } // namespace SkRemote | 226 } // namespace SkRemote |
168 | 227 |
169 #endif//SkRemote_DEFINED | 228 #endif//SkRemote_DEFINED |
OLD | NEW |