diff options
author | 2016-01-20 13:35:20 -0800 | |
---|---|---|
committer | 2016-01-20 13:35:21 -0800 | |
commit | fac3d1b72547aa23842c16e6df27ea4c2b54867a (patch) | |
tree | 70fd8f03df58ef831af862d3dbd9382c3f5b3a4e | |
parent | 01836add2ab778ed085735fa8a206b54d5fc4f23 (diff) |
SkValue: improve SkFromValue<T> implementation
Add template<> bool SkFromValue<float>(const SkValue&, float*);
Refactor template<> bool SkFromValue<SkMatrix>(const SkValue&, SkMatrix*);
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1605093003
Review URL: https://codereview.chromium.org/1605093003
-rw-r--r-- | src/core/SkValue.cpp | 41 | ||||
-rw-r--r-- | src/core/SkValue.h | 1 |
2 files changed, 23 insertions, 19 deletions
diff --git a/src/core/SkValue.cpp b/src/core/SkValue.cpp index 8f58dd6ef9..787cdf58df 100644 --- a/src/core/SkValue.cpp +++ b/src/core/SkValue.cpp @@ -135,6 +135,11 @@ void SkValue::set(SkValue::Key k, SkValue v) { fObject->set(k, std::move(v)); } +const SkValue* SkValue::get(Key k) const { + SkASSERT(this->isObject()); + return fObject->get(k); +} + void SkValue::foreach(std::function<void(Key, const SkValue&)> fn) const { SkASSERT(this->isObject()); fObject->foreach(fn); @@ -182,6 +187,8 @@ SkValue SkValue::FromF32s(SkData* d) { return FromTs< float>(F32s, d); } //////////////////////////////////////////////////////////////////////////////// +#define REQUIRE(cond) do { if (!(cond)) { SkASSERT(false); return false; } } while (false) + template<> SkValue SkToValue<SkMatrix>(const SkMatrix& mat) { auto val = SkValue::Object(SkValue::Matrix); for (int i = 0; i < 9; ++i) { @@ -192,26 +199,22 @@ template<> SkValue SkToValue<SkMatrix>(const SkMatrix& mat) { return val; } +template<> bool SkFromValue<float>(const SkValue& val, float* f) { + REQUIRE(val.type() == SkValue::F32); + *f = val.f32(); + return true; +} + template<> bool SkFromValue<SkMatrix>(const SkValue& val, SkMatrix* m){ - SkASSERT(val.type() == SkValue::Matrix); - if (val.type() != SkValue::Matrix) { - return false; - } + REQUIRE(val.type() == SkValue::Matrix); + *m = SkMatrix::I(); - bool good = true; - auto fn = [&](SkValue::Key key, const SkValue& v) { - if (key < 9) { - if (v.type() != SkValue::F32) { - SkASSERT(false); - good = false; - } else { - (*m)[key] = v.f32(); - } - } else { - SkASSERT(false); - good = false; + for (int i = 0; i < 9; i++) { + if (auto v = val.get(i)) { + REQUIRE(SkFromValue(*v, &(*m)[i])); } - }; - val.foreach(fn); - return good; + } + return true; } + +#undef REQUIRE diff --git a/src/core/SkValue.h b/src/core/SkValue.h index 5ff9eadc25..1f11209056 100644 --- a/src/core/SkValue.h +++ b/src/core/SkValue.h @@ -73,6 +73,7 @@ public: // Object void set(Key, SkValue); + const SkValue* get(Key) const; void foreach(std::function<void(Key, const SkValue&)>) const; // Array |