diff options
author | 2014-09-15 09:26:09 -0700 | |
---|---|---|
committer | 2014-09-15 09:26:09 -0700 | |
commit | e956259c5a4f71768afb34ec032eaed49dcbe9f2 (patch) | |
tree | 99370ea8387aa4100730718fba544a7442e5df87 /src/core | |
parent | a63d5df455e5fb32ac995f753709893221de6147 (diff) |
add dumpHex() option to SkPath
This provides exact precision
to help debugging when the float
representation of a SkScalar may
introduce error.
R=reed@google.com
Author: caryclark@google.com
Review URL: https://codereview.chromium.org/571973003
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkClipStack.cpp | 2 | ||||
-rw-r--r-- | src/core/SkPath.cpp | 30 |
2 files changed, 20 insertions, 12 deletions
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp index 3093c314f4..cf2e71e671 100644 --- a/src/core/SkClipStack.cpp +++ b/src/core/SkClipStack.cpp @@ -891,7 +891,7 @@ void SkClipStack::Element::dump() const { SkDebugf("\n"); break; case kPath_Type: - this->getPath().dump(NULL, true); + this->getPath().dump(NULL, true, false); break; } } diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp index b89aec31fa..33a0617da9 100644 --- a/src/core/SkPath.cpp +++ b/src/core/SkPath.cpp @@ -2019,7 +2019,11 @@ size_t SkPath::readFromMemory(const void* storage, size_t length) { #include "SkString.h" #include "SkStream.h" -static void append_scalar(SkString* str, SkScalar value) { +static void append_scalar(SkString* str, SkScalar value, bool dumpAsHex) { + if (dumpAsHex) { + str->appendf("SkBits2Float(0x%08x)", SkFloat2Bits(value)); + return; + } SkString tmp; tmp.printf("%g", value); if (tmp.contains('.')) { @@ -2029,7 +2033,7 @@ static void append_scalar(SkString* str, SkScalar value) { } static void append_params(SkString* str, const char label[], const SkPoint pts[], - int count, SkScalar conicWeight = -1) { + int count, bool dumpAsHex, SkScalar conicWeight = -1) { str->append(label); str->append("("); @@ -2037,19 +2041,19 @@ static void append_params(SkString* str, const char label[], const SkPoint pts[] count *= 2; for (int i = 0; i < count; ++i) { - append_scalar(str, values[i]); + append_scalar(str, values[i], dumpAsHex); if (i < count - 1) { str->append(", "); } } if (conicWeight >= 0) { str->append(", "); - append_scalar(str, conicWeight); + append_scalar(str, conicWeight, dumpAsHex); } str->append(");\n"); } -void SkPath::dump(SkWStream* wStream, bool forceClose) const { +void SkPath::dump(SkWStream* wStream, bool forceClose, bool dumpAsHex) const { Iter iter(*this, forceClose); SkPoint pts[4]; Verb verb; @@ -2062,19 +2066,19 @@ void SkPath::dump(SkWStream* wStream, bool forceClose) const { while ((verb = iter.next(pts, false)) != kDone_Verb) { switch (verb) { case kMove_Verb: - append_params(&builder, "path.moveTo", &pts[0], 1); + append_params(&builder, "path.moveTo", &pts[0], 1, dumpAsHex); break; case kLine_Verb: - append_params(&builder, "path.lineTo", &pts[1], 1); + append_params(&builder, "path.lineTo", &pts[1], 1, dumpAsHex); break; case kQuad_Verb: - append_params(&builder, "path.quadTo", &pts[1], 2); + append_params(&builder, "path.quadTo", &pts[1], 2, dumpAsHex); break; case kConic_Verb: - append_params(&builder, "path.conicTo", &pts[1], 2, iter.conicWeight()); + append_params(&builder, "path.conicTo", &pts[1], 2, dumpAsHex, iter.conicWeight()); break; case kCubic_Verb: - append_params(&builder, "path.cubicTo", &pts[1], 3); + append_params(&builder, "path.cubicTo", &pts[1], 3, dumpAsHex); break; case kClose_Verb: builder.append("path.close();\n"); @@ -2093,7 +2097,11 @@ void SkPath::dump(SkWStream* wStream, bool forceClose) const { } void SkPath::dump() const { - this->dump(NULL, false); + this->dump(NULL, false, false); +} + +void SkPath::dumpHex() const { + this->dump(NULL, false, true); } #ifdef SK_DEBUG |