From 8072e4fdc8261b1ca8937aa5c31db967280eae2a Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Tue, 1 Mar 2011 15:44:08 +0000 Subject: [PATCH] bump SkStrAppendScalar_MaxSize to 14 to accomodate the largest string now that scalar->string uses %.8g. Floats have at most 8 significant digits, plus we add more space for sign, decimal point and exponent. add tests to check these limits. git-svn-id: http://skia.googlecode.com/svn/trunk@872 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/core/SkString.h | 19 ++++++++++++++++--- src/core/SkString.cpp | 8 +++++++- tests/StringTest.cpp | 6 ++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/include/core/SkString.h b/include/core/SkString.h index 4498bba768..5b41a78588 100644 --- a/include/core/SkString.h +++ b/include/core/SkString.h @@ -30,8 +30,21 @@ int SkStrStartsWithOneOf(const char string[], const char prefixes[]); char* SkStrAppendS32(char buffer[], int32_t); #define SkStrAppendS64_MaxSize 20 char* SkStrAppendS64(char buffer[], int64_t, int minDigits); -#define SkStrAppendScalar_MaxSize 11 -char* SkStrAppendScalar(char buffer[], SkScalar); + +/** + * Floats have at most 8 significant digits, so we limit our %g to that. + * However, the total string could be 14 characters: -1.2345678e+38 + */ +#define SkStrAppendScalar_MaxSize 14 + +/** + * Write the scaler in decimal format into buffer, and return a pointer to + * the next char after the last one written. Note: a terminating 0 is not + * written into buffer, which must be at least SkStrAppendScalar_MaxSize. + * Thus if the caller wants to add a 0 at the end, buffer must be at least + * SkStrAppendScalar_MaxSize + 1 bytes large. + */ +char* SkStrAppendScalar(char buffer[], SkScalar); /** \class SkString @@ -127,7 +140,7 @@ public: to never fail or throw. */ void swap(SkString& other); - + private: struct Rec { public: diff --git a/src/core/SkString.cpp b/src/core/SkString.cpp index 7f490cc97d..ca97e0b592 100644 --- a/src/core/SkString.cpp +++ b/src/core/SkString.cpp @@ -139,7 +139,13 @@ char* SkStrAppendScalar(char string[], SkScalar value) SkDEBUGCODE(char* start = string;) #ifdef SK_SCALAR_IS_FLOAT - return string + SNPRINTF(string, SkStrAppendScalar_MaxSize, "%g", value); + // since floats have at most 8 significant digits, we limit our %g to that. + static const char gFormat[] = "%.8g"; + // make it 1 larger for the terminating 0 + char buffer[SkStrAppendScalar_MaxSize + 1]; + int len = SNPRINTF(buffer, sizeof(buffer), gFormat, value); + memcpy(string, buffer, len); + return string + len; #else SkFixed x = SkScalarToFixed(value); diff --git a/tests/StringTest.cpp b/tests/StringTest.cpp index 781fed8bf7..270ccfd3a4 100644 --- a/tests/StringTest.cpp +++ b/tests/StringTest.cpp @@ -73,10 +73,16 @@ static void TestString(skiatest::Reporter* reporter) { { SK_Scalar1, "1" }, { -SK_Scalar1, "-1" }, { SK_Scalar1/2, "0.5" }, +#ifdef SK_SCALAR_IS_FLOAT + { 3.4028234e38f, "3.4028235e+38" }, + { -3.4028234e38f, "-3.4028235e+38" }, +#endif }; for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) { a.reset(); a.appendScalar(gRec[i].fValue); + REPORTER_ASSERT(reporter, a.size() <= SkStrAppendScalar_MaxSize); +// SkDebugf(" received <%s> expected <%s>\n", a.c_str(), gRec[i].fString); REPORTER_ASSERT(reporter, a.equals(gRec[i].fString)); } }