| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkBuffer.h" | 10 #include "SkBuffer.h" |
| (...skipping 2001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2012 sk_throw(); | 2012 sk_throw(); |
| 2013 } | 2013 } |
| 2014 return sizeRead; | 2014 return sizeRead; |
| 2015 } | 2015 } |
| 2016 | 2016 |
| 2017 /////////////////////////////////////////////////////////////////////////////// | 2017 /////////////////////////////////////////////////////////////////////////////// |
| 2018 | 2018 |
| 2019 #include "SkString.h" | 2019 #include "SkString.h" |
| 2020 #include "SkStream.h" | 2020 #include "SkStream.h" |
| 2021 | 2021 |
| 2022 static void append_scalar(SkString* str, SkScalar value) { | 2022 static void append_scalar(SkString* str, SkScalar value, bool dumpAsHex) { |
| 2023 if (dumpAsHex) { |
| 2024 str->appendf("SkBits2Float(0x%08x)", SkFloat2Bits(value)); |
| 2025 return; |
| 2026 } |
| 2023 SkString tmp; | 2027 SkString tmp; |
| 2024 tmp.printf("%g", value); | 2028 tmp.printf("%g", value); |
| 2025 if (tmp.contains('.')) { | 2029 if (tmp.contains('.')) { |
| 2026 tmp.appendUnichar('f'); | 2030 tmp.appendUnichar('f'); |
| 2027 } | 2031 } |
| 2028 str->append(tmp); | 2032 str->append(tmp); |
| 2029 } | 2033 } |
| 2030 | 2034 |
| 2031 static void append_params(SkString* str, const char label[], const SkPoint pts[]
, | 2035 static void append_params(SkString* str, const char label[], const SkPoint pts[]
, |
| 2032 int count, SkScalar conicWeight = -1) { | 2036 int count, bool dumpAsHex, SkScalar conicWeight = -1)
{ |
| 2033 str->append(label); | 2037 str->append(label); |
| 2034 str->append("("); | 2038 str->append("("); |
| 2035 | 2039 |
| 2036 const SkScalar* values = &pts[0].fX; | 2040 const SkScalar* values = &pts[0].fX; |
| 2037 count *= 2; | 2041 count *= 2; |
| 2038 | 2042 |
| 2039 for (int i = 0; i < count; ++i) { | 2043 for (int i = 0; i < count; ++i) { |
| 2040 append_scalar(str, values[i]); | 2044 append_scalar(str, values[i], dumpAsHex); |
| 2041 if (i < count - 1) { | 2045 if (i < count - 1) { |
| 2042 str->append(", "); | 2046 str->append(", "); |
| 2043 } | 2047 } |
| 2044 } | 2048 } |
| 2045 if (conicWeight >= 0) { | 2049 if (conicWeight >= 0) { |
| 2046 str->append(", "); | 2050 str->append(", "); |
| 2047 append_scalar(str, conicWeight); | 2051 append_scalar(str, conicWeight, dumpAsHex); |
| 2048 } | 2052 } |
| 2049 str->append(");\n"); | 2053 str->append(");\n"); |
| 2050 } | 2054 } |
| 2051 | 2055 |
| 2052 void SkPath::dump(SkWStream* wStream, bool forceClose) const { | 2056 void SkPath::dump(SkWStream* wStream, bool forceClose, bool dumpAsHex) const { |
| 2053 Iter iter(*this, forceClose); | 2057 Iter iter(*this, forceClose); |
| 2054 SkPoint pts[4]; | 2058 SkPoint pts[4]; |
| 2055 Verb verb; | 2059 Verb verb; |
| 2056 | 2060 |
| 2057 if (!wStream) { | 2061 if (!wStream) { |
| 2058 SkDebugf("path: forceClose=%s\n", forceClose ? "true" : "false"); | 2062 SkDebugf("path: forceClose=%s\n", forceClose ? "true" : "false"); |
| 2059 } | 2063 } |
| 2060 SkString builder; | 2064 SkString builder; |
| 2061 | 2065 |
| 2062 while ((verb = iter.next(pts, false)) != kDone_Verb) { | 2066 while ((verb = iter.next(pts, false)) != kDone_Verb) { |
| 2063 switch (verb) { | 2067 switch (verb) { |
| 2064 case kMove_Verb: | 2068 case kMove_Verb: |
| 2065 append_params(&builder, "path.moveTo", &pts[0], 1); | 2069 append_params(&builder, "path.moveTo", &pts[0], 1, dumpAsHex); |
| 2066 break; | 2070 break; |
| 2067 case kLine_Verb: | 2071 case kLine_Verb: |
| 2068 append_params(&builder, "path.lineTo", &pts[1], 1); | 2072 append_params(&builder, "path.lineTo", &pts[1], 1, dumpAsHex); |
| 2069 break; | 2073 break; |
| 2070 case kQuad_Verb: | 2074 case kQuad_Verb: |
| 2071 append_params(&builder, "path.quadTo", &pts[1], 2); | 2075 append_params(&builder, "path.quadTo", &pts[1], 2, dumpAsHex); |
| 2072 break; | 2076 break; |
| 2073 case kConic_Verb: | 2077 case kConic_Verb: |
| 2074 append_params(&builder, "path.conicTo", &pts[1], 2, iter.conicWe
ight()); | 2078 append_params(&builder, "path.conicTo", &pts[1], 2, dumpAsHex, i
ter.conicWeight()); |
| 2075 break; | 2079 break; |
| 2076 case kCubic_Verb: | 2080 case kCubic_Verb: |
| 2077 append_params(&builder, "path.cubicTo", &pts[1], 3); | 2081 append_params(&builder, "path.cubicTo", &pts[1], 3, dumpAsHex); |
| 2078 break; | 2082 break; |
| 2079 case kClose_Verb: | 2083 case kClose_Verb: |
| 2080 builder.append("path.close();\n"); | 2084 builder.append("path.close();\n"); |
| 2081 break; | 2085 break; |
| 2082 default: | 2086 default: |
| 2083 SkDebugf(" path: UNKNOWN VERB %d, aborting dump...\n", verb); | 2087 SkDebugf(" path: UNKNOWN VERB %d, aborting dump...\n", verb); |
| 2084 verb = kDone_Verb; // stop the loop | 2088 verb = kDone_Verb; // stop the loop |
| 2085 break; | 2089 break; |
| 2086 } | 2090 } |
| 2087 } | 2091 } |
| 2088 if (wStream) { | 2092 if (wStream) { |
| 2089 wStream->writeText(builder.c_str()); | 2093 wStream->writeText(builder.c_str()); |
| 2090 } else { | 2094 } else { |
| 2091 SkDebugf("%s", builder.c_str()); | 2095 SkDebugf("%s", builder.c_str()); |
| 2092 } | 2096 } |
| 2093 } | 2097 } |
| 2094 | 2098 |
| 2095 void SkPath::dump() const { | 2099 void SkPath::dump() const { |
| 2096 this->dump(NULL, false); | 2100 this->dump(NULL, false, false); |
| 2101 } |
| 2102 |
| 2103 void SkPath::dumpHex() const { |
| 2104 this->dump(NULL, false, true); |
| 2097 } | 2105 } |
| 2098 | 2106 |
| 2099 #ifdef SK_DEBUG | 2107 #ifdef SK_DEBUG |
| 2100 void SkPath::validate() const { | 2108 void SkPath::validate() const { |
| 2101 SkASSERT(this != NULL); | 2109 SkASSERT(this != NULL); |
| 2102 SkASSERT((fFillType & ~3) == 0); | 2110 SkASSERT((fFillType & ~3) == 0); |
| 2103 | 2111 |
| 2104 #ifdef SK_DEBUG_PATH | 2112 #ifdef SK_DEBUG_PATH |
| 2105 if (!fBoundsIsDirty) { | 2113 if (!fBoundsIsDirty) { |
| 2106 SkRect bounds; | 2114 SkRect bounds; |
| (...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2794 switch (this->getFillType()) { | 2802 switch (this->getFillType()) { |
| 2795 case SkPath::kEvenOdd_FillType: | 2803 case SkPath::kEvenOdd_FillType: |
| 2796 case SkPath::kInverseEvenOdd_FillType: | 2804 case SkPath::kInverseEvenOdd_FillType: |
| 2797 w &= 1; | 2805 w &= 1; |
| 2798 break; | 2806 break; |
| 2799 default: | 2807 default: |
| 2800 break; | 2808 break; |
| 2801 } | 2809 } |
| 2802 return SkToBool(w); | 2810 return SkToBool(w); |
| 2803 } | 2811 } |
| OLD | NEW |