aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2016-01-20 13:35:20 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-01-20 13:35:21 -0800
commitfac3d1b72547aa23842c16e6df27ea4c2b54867a (patch)
tree70fd8f03df58ef831af862d3dbd9382c3f5b3a4e
parent01836add2ab778ed085735fa8a206b54d5fc4f23 (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.cpp41
-rw-r--r--src/core/SkValue.h1
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