bump SkStrAppendScalar_MaxSize to 14 to accomodate the largest string now that
authorreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 1 Mar 2011 15:44:08 +0000 (15:44 +0000)
committerreed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 1 Mar 2011 15:44:08 +0000 (15:44 +0000)
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
src/core/SkString.cpp
tests/StringTest.cpp

index 4498bba..5b41a78 100644 (file)
@@ -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:
index 7f490cc..ca97e0b 100644 (file)
@@ -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);
 
index 781fed8..270ccfd 100644 (file)
@@ -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));
     }
 }