Merge "Allow leading spaces in path string (to keep behavior consistent)" into nyc-dev
This commit is contained in:
@@ -175,7 +175,7 @@ static void setPathString(JNIEnv* env, jobject, jlong pathPtr, jstring inputStr,
|
|||||||
|
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
PathData data;
|
PathData data;
|
||||||
PathParser::getPathDataFromString(&data, &result, pathString, stringLength);
|
PathParser::getPathDataFromAsciiString(&data, &result, pathString, stringLength);
|
||||||
if (result.failureOccurred) {
|
if (result.failureOccurred) {
|
||||||
doThrowIAE(env, result.failureMessage.c_str());
|
doThrowIAE(env, result.failureMessage.c_str());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ static void parseStringForPath(JNIEnv* env, jobject, jlong skPathHandle, jstring
|
|||||||
SkPath* skPath = reinterpret_cast<SkPath*>(skPathHandle);
|
SkPath* skPath = reinterpret_cast<SkPath*>(skPathHandle);
|
||||||
|
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
PathParser::parseStringForSkPath(skPath, &result, pathString, strLength);
|
PathParser::parseAsciiStringForSkPath(skPath, &result, pathString, strLength);
|
||||||
env->ReleaseStringUTFChars(inputPathStr, pathString);
|
env->ReleaseStringUTFChars(inputPathStr, pathString);
|
||||||
if (result.failureOccurred) {
|
if (result.failureOccurred) {
|
||||||
doThrowIAE(env, result.failureMessage.c_str());
|
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);
|
const char* pathString = env->GetStringUTFChars(inputStr, NULL);
|
||||||
PathData* pathData = new PathData();
|
PathData* pathData = new PathData();
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
PathParser::getPathDataFromString(pathData, &result, pathString, strLength);
|
PathParser::getPathDataFromAsciiString(pathData, &result, pathString, strLength);
|
||||||
env->ReleaseStringUTFChars(inputStr, pathString);
|
env->ReleaseStringUTFChars(inputStr, pathString);
|
||||||
if (!result.failureOccurred) {
|
if (!result.failureOccurred) {
|
||||||
return reinterpret_cast<jlong>(pathData);
|
return reinterpret_cast<jlong>(pathData);
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ bool PathParser::isVerbValid(char verb) {
|
|||||||
|| verb == 's' || verb == 't' || verb == 'v' || verb == 'z';
|
|| 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) {
|
const char* pathStr, size_t strLen) {
|
||||||
if (pathStr == NULL) {
|
if (pathStr == NULL) {
|
||||||
result->failureOccurred = true;
|
result->failureOccurred = true;
|
||||||
@@ -171,7 +171,16 @@ void PathParser::getPathDataFromString(PathData* data, ParseResult* result,
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t start = 0;
|
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) {
|
while (end < strLen) {
|
||||||
end = nextStart(pathStr, strLen, end);
|
end = nextStart(pathStr, strLen, end);
|
||||||
@@ -226,9 +235,9 @@ void PathParser::dump(const PathData& data) {
|
|||||||
ALOGD("points are : %s", os.str().c_str());
|
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;
|
PathData pathData;
|
||||||
getPathDataFromString(&pathData, result, pathStr, strLen);
|
getPathDataFromAsciiString(&pathData, result, pathStr, strLen);
|
||||||
if (result->failureOccurred) {
|
if (result->failureOccurred) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Parse the string literal and create a Skia Path. Return true on success.
|
* 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);
|
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);
|
const char* pathStr, size_t strLength);
|
||||||
static void dump(const PathData& data);
|
static void dump(const PathData& data);
|
||||||
static bool isVerbValid(char verb);
|
static bool isVerbValid(char verb);
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ float Path::getMatrixScale(const SkMatrix& groupStackedMatrix) {
|
|||||||
Path::Path(const char* pathStr, size_t strLength) {
|
Path::Path(const char* pathStr, size_t strLength) {
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
Data data;
|
Data data;
|
||||||
PathParser::getPathDataFromString(&data, &result, pathStr, strLength);
|
PathParser::getPathDataFromAsciiString(&data, &result, pathStr, strLength);
|
||||||
mStagingProperties.setData(data);
|
mStagingProperties.setData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ void BM_PathParser_parseStringPathForSkPath(benchmark::State& state) {
|
|||||||
size_t length = strlen(sPathString);
|
size_t length = strlen(sPathString);
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
while (state.KeepRunning()) {
|
while (state.KeepRunning()) {
|
||||||
PathParser::parseStringForSkPath(&skPath, &result, sPathString, length);
|
PathParser::parseAsciiStringForSkPath(&skPath, &result, sPathString, length);
|
||||||
benchmark::DoNotOptimize(&result);
|
benchmark::DoNotOptimize(&result);
|
||||||
benchmark::DoNotOptimize(&skPath);
|
benchmark::DoNotOptimize(&skPath);
|
||||||
}
|
}
|
||||||
@@ -43,7 +43,7 @@ void BM_PathParser_parseStringPathForPathData(benchmark::State& state) {
|
|||||||
PathData outData;
|
PathData outData;
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
while (state.KeepRunning()) {
|
while (state.KeepRunning()) {
|
||||||
PathParser::getPathDataFromString(&outData, &result, sPathString, length);
|
PathParser::getPathDataFromAsciiString(&outData, &result, sPathString, length);
|
||||||
benchmark::DoNotOptimize(&result);
|
benchmark::DoNotOptimize(&result);
|
||||||
benchmark::DoNotOptimize(&outData);
|
benchmark::DoNotOptimize(&outData);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -234,9 +234,10 @@ const StringPath sStringPaths[] = {
|
|||||||
{"3e...3", false}, // Not starting with a verb and ill-formatted float
|
{"3e...3", false}, // Not starting with a verb and ill-formatted float
|
||||||
{"L.M.F.A.O", false}, // No floats following verbs
|
{"L.M.F.A.O", false}, // No floats following verbs
|
||||||
{"m 1 1", true}, // Valid path data
|
{"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
|
{"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.
|
// Test generated path data against the given data.
|
||||||
PathData pathData;
|
PathData pathData;
|
||||||
size_t length = strlen(testData.pathString);
|
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);
|
EXPECT_EQ(testData.pathData, pathData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +259,7 @@ TEST(PathParser, parseStringForData) {
|
|||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
PathData pathData;
|
PathData pathData;
|
||||||
SkPath skPath;
|
SkPath skPath;
|
||||||
PathParser::getPathDataFromString(&pathData, &result,
|
PathParser::getPathDataFromAsciiString(&pathData, &result,
|
||||||
stringPath.stringPath, strlen(stringPath.stringPath));
|
stringPath.stringPath, strlen(stringPath.stringPath));
|
||||||
EXPECT_EQ(stringPath.isValid, !result.failureOccurred);
|
EXPECT_EQ(stringPath.isValid, !result.failureOccurred);
|
||||||
}
|
}
|
||||||
@@ -274,13 +275,13 @@ TEST(VectorDrawableUtils, createSkPathFromPathData) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PathParser, parseStringForSkPath) {
|
TEST(PathParser, parseAsciiStringForSkPath) {
|
||||||
for (TestData testData: sTestDataSet) {
|
for (TestData testData: sTestDataSet) {
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
size_t length = strlen(testData.pathString);
|
size_t length = strlen(testData.pathString);
|
||||||
// Check the return value as well as the SkPath generated.
|
// Check the return value as well as the SkPath generated.
|
||||||
SkPath actualPath;
|
SkPath actualPath;
|
||||||
PathParser::parseStringForSkPath(&actualPath, &result, testData.pathString, length);
|
PathParser::parseAsciiStringForSkPath(&actualPath, &result, testData.pathString, length);
|
||||||
bool hasValidData = !result.failureOccurred;
|
bool hasValidData = !result.failureOccurred;
|
||||||
EXPECT_EQ(hasValidData, testData.pathData.verbs.size() > 0);
|
EXPECT_EQ(hasValidData, testData.pathData.verbs.size() > 0);
|
||||||
SkPath expectedPath;
|
SkPath expectedPath;
|
||||||
@@ -291,7 +292,7 @@ TEST(PathParser, parseStringForSkPath) {
|
|||||||
for (StringPath stringPath : sStringPaths) {
|
for (StringPath stringPath : sStringPaths) {
|
||||||
PathParser::ParseResult result;
|
PathParser::ParseResult result;
|
||||||
SkPath skPath;
|
SkPath skPath;
|
||||||
PathParser::parseStringForSkPath(&skPath, &result, stringPath.stringPath,
|
PathParser::parseAsciiStringForSkPath(&skPath, &result, stringPath.stringPath,
|
||||||
strlen(stringPath.stringPath));
|
strlen(stringPath.stringPath));
|
||||||
EXPECT_EQ(stringPath.isValid, !result.failureOccurred);
|
EXPECT_EQ(stringPath.isValid, !result.failureOccurred);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user