diff options
author | 2016-04-12 11:06:23 -0700 | |
---|---|---|
committer | 2016-04-12 21:38:07 +0000 | |
commit | b35da390601e3c24e777d72daacd8dbeb4d1d9c4 (patch) | |
tree | 5949f592804c952b814cda6d154ab91eff2d864e | |
parent | d92e5c314e1a3ffa0bc6daf43e4e9cec2521d217 (diff) |
Allow leading spaces in path string (to keep behavior consistent)
Bug: 28132454
Change-Id: Iee799c13a85738db3d6940aca0fe917f284fa651
-rw-r--r-- | core/jni/android_graphics_drawable_VectorDrawable.cpp | 2 | ||||
-rw-r--r-- | core/jni/android_util_PathParser.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/PathParser.cpp | 17 | ||||
-rw-r--r-- | libs/hwui/PathParser.h | 4 | ||||
-rw-r--r-- | libs/hwui/VectorDrawable.cpp | 2 | ||||
-rw-r--r-- | libs/hwui/tests/microbench/PathParserBench.cpp | 4 | ||||
-rw-r--r-- | libs/hwui/tests/unit/VectorDrawableTests.cpp | 15 |
7 files changed, 29 insertions, 19 deletions
diff --git a/core/jni/android_graphics_drawable_VectorDrawable.cpp b/core/jni/android_graphics_drawable_VectorDrawable.cpp index 50d86fffe29d..0de6549ec134 100644 --- a/core/jni/android_graphics_drawable_VectorDrawable.cpp +++ b/core/jni/android_graphics_drawable_VectorDrawable.cpp @@ -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()); } diff --git a/core/jni/android_util_PathParser.cpp b/core/jni/android_util_PathParser.cpp index 0c867f1ccb03..53669a8d4bd5 100644 --- a/core/jni/android_util_PathParser.cpp +++ b/core/jni/android_util_PathParser.cpp @@ -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); diff --git a/libs/hwui/PathParser.cpp b/libs/hwui/PathParser.cpp index 7e85333ef36b..2179f146115a 100644 --- a/libs/hwui/PathParser.cpp +++ b/libs/hwui/PathParser.cpp @@ -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; } diff --git a/libs/hwui/PathParser.h b/libs/hwui/PathParser.h index 180a7a30f8e8..5578e8d42e2f 100644 --- a/libs/hwui/PathParser.h +++ b/libs/hwui/PathParser.h @@ -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); diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index adfe45c64885..ac17ed2eb735 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -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); } diff --git a/libs/hwui/tests/microbench/PathParserBench.cpp b/libs/hwui/tests/microbench/PathParserBench.cpp index 4186539d74ee..b43c4c3b63c1 100644 --- a/libs/hwui/tests/microbench/PathParserBench.cpp +++ b/libs/hwui/tests/microbench/PathParserBench.cpp @@ -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); } diff --git a/libs/hwui/tests/unit/VectorDrawableTests.cpp b/libs/hwui/tests/unit/VectorDrawableTests.cpp index 796169e09137..1404962a6d14 100644 --- a/libs/hwui/tests/unit/VectorDrawableTests.cpp +++ b/libs/hwui/tests/unit/VectorDrawableTests.cpp @@ -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); } |