Merge "Allow leading spaces in path string (to keep behavior consistent)" into nyc-dev

am: a184abe

* commit 'a184abe4b0348b7c4633fb2c9922d2ec82cee34a':
  Allow leading spaces in path string (to keep behavior consistent)

Change-Id: I9340d31fe79251de3a37f999c0d7228bbd759e23
This commit is contained in:
Doris Liu
2016-04-13 17:35:56 +00:00
committed by android-build-merger
7 changed files with 29 additions and 19 deletions

View File

@@ -175,7 +175,7 @@ static void setPathString(JNIEnv* env, jobject, jlong pathPtr, jstring inputStr,
PathParser::ParseResult result;
PathData data;
PathParser::getPathDataFromString(&data, &result, pathString, stringLength);
PathParser::getPathDataFromAsciiString(&data, &result, pathString, stringLength);
if (result.failureOccurred) {
doThrowIAE(env, result.failureMessage.c_str());
}

View File

@@ -34,7 +34,7 @@ static void parseStringForPath(JNIEnv* env, jobject, jlong skPathHandle, jstring
SkPath* skPath = reinterpret_cast<SkPath*>(skPathHandle);
PathParser::ParseResult result;
PathParser::parseStringForSkPath(skPath, &result, pathString, strLength);
PathParser::parseAsciiStringForSkPath(skPath, &result, pathString, strLength);
env->ReleaseStringUTFChars(inputPathStr, pathString);
if (result.failureOccurred) {
doThrowIAE(env, result.failureMessage.c_str());
@@ -56,7 +56,7 @@ static long createPathDataFromStringPath(JNIEnv* env, jobject, jstring inputStr,
const char* pathString = env->GetStringUTFChars(inputStr, NULL);
PathData* pathData = new PathData();
PathParser::ParseResult result;
PathParser::getPathDataFromString(pathData, &result, pathString, strLength);
PathParser::getPathDataFromAsciiString(pathData, &result, pathString, strLength);
env->ReleaseStringUTFChars(inputStr, pathString);
if (!result.failureOccurred) {
return reinterpret_cast<jlong>(pathData);

View File

@@ -162,7 +162,7 @@ bool PathParser::isVerbValid(char verb) {
|| verb == 's' || verb == 't' || verb == 'v' || verb == 'z';
}
void PathParser::getPathDataFromString(PathData* data, ParseResult* result,
void PathParser::getPathDataFromAsciiString(PathData* data, ParseResult* result,
const char* pathStr, size_t strLen) {
if (pathStr == NULL) {
result->failureOccurred = true;
@@ -171,7 +171,16 @@ void PathParser::getPathDataFromString(PathData* data, ParseResult* result,
}
size_t start = 0;
size_t end = 1;
// Skip leading spaces.
while (isspace(pathStr[start]) && start < strLen) {
start++;
}
if (start == strLen) {
result->failureOccurred = true;
result->failureMessage = "Path string cannot be empty.";
return;
}
size_t end = start + 1;
while (end < strLen) {
end = nextStart(pathStr, strLen, end);
@@ -226,9 +235,9 @@ void PathParser::dump(const PathData& data) {
ALOGD("points are : %s", os.str().c_str());
}
void PathParser::parseStringForSkPath(SkPath* skPath, ParseResult* result, const char* pathStr, size_t strLen) {
void PathParser::parseAsciiStringForSkPath(SkPath* skPath, ParseResult* result, const char* pathStr, size_t strLen) {
PathData pathData;
getPathDataFromString(&pathData, result, pathStr, strLen);
getPathDataFromAsciiString(&pathData, result, pathStr, strLen);
if (result->failureOccurred) {
return;
}

View File

@@ -39,9 +39,9 @@ public:
/**
* Parse the string literal and create a Skia Path. Return true on success.
*/
ANDROID_API static void parseStringForSkPath(SkPath* outPath, ParseResult* result,
ANDROID_API static void parseAsciiStringForSkPath(SkPath* outPath, ParseResult* result,
const char* pathStr, size_t strLength);
ANDROID_API static void getPathDataFromString(PathData* outData, ParseResult* result,
ANDROID_API static void getPathDataFromAsciiString(PathData* outData, ParseResult* result,
const char* pathStr, size_t strLength);
static void dump(const PathData& data);
static bool isVerbValid(char verb);

View File

@@ -96,7 +96,7 @@ float Path::getMatrixScale(const SkMatrix& groupStackedMatrix) {
Path::Path(const char* pathStr, size_t strLength) {
PathParser::ParseResult result;
Data data;
PathParser::getPathDataFromString(&data, &result, pathStr, strLength);
PathParser::getPathDataFromAsciiString(&data, &result, pathStr, strLength);
mStagingProperties.setData(data);
}

View File

@@ -31,7 +31,7 @@ void BM_PathParser_parseStringPathForSkPath(benchmark::State& state) {
size_t length = strlen(sPathString);
PathParser::ParseResult result;
while (state.KeepRunning()) {
PathParser::parseStringForSkPath(&skPath, &result, sPathString, length);
PathParser::parseAsciiStringForSkPath(&skPath, &result, sPathString, length);
benchmark::DoNotOptimize(&result);
benchmark::DoNotOptimize(&skPath);
}
@@ -43,7 +43,7 @@ void BM_PathParser_parseStringPathForPathData(benchmark::State& state) {
PathData outData;
PathParser::ParseResult result;
while (state.KeepRunning()) {
PathParser::getPathDataFromString(&outData, &result, sPathString, length);
PathParser::getPathDataFromAsciiString(&outData, &result, sPathString, length);
benchmark::DoNotOptimize(&result);
benchmark::DoNotOptimize(&outData);
}

View File

@@ -234,9 +234,10 @@ const StringPath sStringPaths[] = {
{"3e...3", false}, // Not starting with a verb and ill-formatted float
{"L.M.F.A.O", false}, // No floats following verbs
{"m 1 1", true}, // Valid path data
{"z", true}, // Valid path data
{"\n \t z", true}, // Valid path data with leading spaces
{"1-2e34567", false}, // Not starting with a verb and ill-formatted float
{"f 4 5", false} // Invalid verb
{"f 4 5", false}, // Invalid verb
{"\r ", false} // Empty string
};
@@ -250,7 +251,7 @@ TEST(PathParser, parseStringForData) {
// Test generated path data against the given data.
PathData pathData;
size_t length = strlen(testData.pathString);
PathParser::getPathDataFromString(&pathData, &result, testData.pathString, length);
PathParser::getPathDataFromAsciiString(&pathData, &result, testData.pathString, length);
EXPECT_EQ(testData.pathData, pathData);
}
@@ -258,7 +259,7 @@ TEST(PathParser, parseStringForData) {
PathParser::ParseResult result;
PathData pathData;
SkPath skPath;
PathParser::getPathDataFromString(&pathData, &result,
PathParser::getPathDataFromAsciiString(&pathData, &result,
stringPath.stringPath, strlen(stringPath.stringPath));
EXPECT_EQ(stringPath.isValid, !result.failureOccurred);
}
@@ -274,13 +275,13 @@ TEST(VectorDrawableUtils, createSkPathFromPathData) {
}
}
TEST(PathParser, parseStringForSkPath) {
TEST(PathParser, parseAsciiStringForSkPath) {
for (TestData testData: sTestDataSet) {
PathParser::ParseResult result;
size_t length = strlen(testData.pathString);
// Check the return value as well as the SkPath generated.
SkPath actualPath;
PathParser::parseStringForSkPath(&actualPath, &result, testData.pathString, length);
PathParser::parseAsciiStringForSkPath(&actualPath, &result, testData.pathString, length);
bool hasValidData = !result.failureOccurred;
EXPECT_EQ(hasValidData, testData.pathData.verbs.size() > 0);
SkPath expectedPath;
@@ -291,7 +292,7 @@ TEST(PathParser, parseStringForSkPath) {
for (StringPath stringPath : sStringPaths) {
PathParser::ParseResult result;
SkPath skPath;
PathParser::parseStringForSkPath(&skPath, &result, stringPath.stringPath,
PathParser::parseAsciiStringForSkPath(&skPath, &result, stringPath.stringPath,
strlen(stringPath.stringPath));
EXPECT_EQ(stringPath.isValid, !result.failureOccurred);
}