OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 #include <unordered_map> | 8 #include <unordered_map> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "SkData.h" | 11 #include "SkData.h" |
12 #include "SkMatrix.h" | |
13 #include "SkValue.h" | 12 #include "SkValue.h" |
14 | 13 |
15 class SkValue::Obj { | 14 class SkValue::Obj { |
16 public: | 15 public: |
17 void set(SkValue::Key k, SkValue&& v) { fMap[k] = std::move(v); } | 16 void set(SkValue::Key k, SkValue&& v) { fMap[k] = std::move(v); } |
18 const SkValue* get(SkValue::Key k) const { | 17 const SkValue* get(SkValue::Key k) const { |
19 auto it = fMap.find(k); | 18 auto it = fMap.find(k); |
20 return it != fMap.end() ? &it->second : nullptr; | 19 return it != fMap.end() ? &it->second : nullptr; |
21 } | 20 } |
22 void foreach(std::function<void(Key, const SkValue&)> fn) const { | 21 void foreach(std::function<void(Key, const SkValue&)> fn) const { |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 SkValue val(type); | 176 SkValue val(type); |
178 val.fBytes = SkRef(data); | 177 val.fBytes = SkRef(data); |
179 SkASSERT(val.isData()); | 178 SkASSERT(val.isData()); |
180 SkASSERT(0 == (reinterpret_cast<uintptr_t>(data->bytes()) & (sizeof(T)-1))); | 179 SkASSERT(0 == (reinterpret_cast<uintptr_t>(data->bytes()) & (sizeof(T)-1))); |
181 return val; | 180 return val; |
182 } | 181 } |
183 | 182 |
184 SkValue SkValue::FromU16s(SkData* d) { return FromTs<uint16_t>(U16s, d); } | 183 SkValue SkValue::FromU16s(SkData* d) { return FromTs<uint16_t>(U16s, d); } |
185 SkValue SkValue::FromU32s(SkData* d) { return FromTs<uint32_t>(U32s, d); } | 184 SkValue SkValue::FromU32s(SkData* d) { return FromTs<uint32_t>(U32s, d); } |
186 SkValue SkValue::FromF32s(SkData* d) { return FromTs< float>(F32s, d); } | 185 SkValue SkValue::FromF32s(SkData* d) { return FromTs< float>(F32s, d); } |
187 | |
188 //////////////////////////////////////////////////////////////////////////////// | |
189 | |
190 #define REQUIRE(cond) do { if (!(cond)) { SkASSERT(false); return false; } } whi
le (false) | |
191 | |
192 template<> SkValue SkToValue<SkMatrix>(const SkMatrix& mat) { | |
193 auto val = SkValue::Object(SkValue::Matrix); | |
194 for (int i = 0; i < 9; ++i) { | |
195 if (mat[i] != SkMatrix::I()[i]) { | |
196 val.set(i, SkValue::FromF32(mat[i])); | |
197 } | |
198 } | |
199 return val; | |
200 } | |
201 | |
202 template<> bool SkFromValue<float>(const SkValue& val, float* f) { | |
203 REQUIRE(val.type() == SkValue::F32); | |
204 *f = val.f32(); | |
205 return true; | |
206 } | |
207 | |
208 template<> bool SkFromValue<SkMatrix>(const SkValue& val, SkMatrix* m){ | |
209 REQUIRE(val.type() == SkValue::Matrix); | |
210 | |
211 *m = SkMatrix::I(); | |
212 for (int i = 0; i < 9; i++) { | |
213 if (auto v = val.get(i)) { | |
214 REQUIRE(SkFromValue(*v, &(*m)[i])); | |
215 } | |
216 } | |
217 return true; | |
218 } | |
219 | |
220 #undef REQUIRE | |
OLD | NEW |