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
This commit is contained in:
reed@google.com 2011-03-01 15:44:08 +00:00
parent b652427197
commit 8072e4fdc8
3 changed files with 29 additions and 4 deletions

View 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:

View 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);

View 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));
}
}