From fac3d1b72547aa23842c16e6df27ea4c2b54867a Mon Sep 17 00:00:00 2001 From: mtklein Date: Wed, 20 Jan 2016 13:35:20 -0800 Subject: SkValue: improve SkFromValue implementation Add template<> bool SkFromValue(const SkValue&, float*); Refactor template<> bool SkFromValue(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 --- src/core/SkValue.cpp | 41 ++++++++++++++++++++++------------------- 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 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(const SkMatrix& mat) { auto val = SkValue::Object(SkValue::Matrix); for (int i = 0; i < 9; ++i) { @@ -192,26 +199,22 @@ template<> SkValue SkToValue(const SkMatrix& mat) { return val; } +template<> bool SkFromValue(const SkValue& val, float* f) { + REQUIRE(val.type() == SkValue::F32); + *f = val.f32(); + return true; +} + template<> bool SkFromValue(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) const; // Array -- cgit v1.2.3