diff options
author | caryclark <caryclark@google.com> | 2016-01-23 05:07:04 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-23 05:07:04 -0800 |
commit | 55d49053d1b6db42e013eb3409ffcfc7e235c685 (patch) | |
tree | c424605b65aceb748643ecb9e6b66193f362d54b /src/utils | |
parent | b714fb0199e8727ef2b6cddbee7eba6046f01554 (diff) |
Add svg path arcto
The arcto() used by SVG in Chrome and Android is ported here, using conics
instead of cubics. The logic is a direct transposition of the WebKit code.
The attached GM includes SVG that draws the same as Skia.
R=reed@google.com
BUG=skia:3959
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1613303002
Review URL: https://codereview.chromium.org/1613303002
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/SkParsePath.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/utils/SkParsePath.cpp b/src/utils/SkParsePath.cpp index 3eb9e1ef79..c0f39aa06f 100644 --- a/src/utils/SkParsePath.cpp +++ b/src/utils/SkParsePath.cpp @@ -64,6 +64,7 @@ static const char* find_scalar(const char str[], SkScalar* value, if (isRelative) { *value += relative; } + str = skip_sep(str); return str; } @@ -156,6 +157,17 @@ bool SkParsePath::FromSVGString(const char data[], SkPath* result) { lastc = points[0]; c = points[1]; break; + case 'A': { + SkPoint radii; + data = find_points(data, &radii, 1, false, nullptr); + SkScalar angle, largeArc, sweep; + data = find_scalar(data, &angle, false, 0); + data = find_scalar(data, &largeArc, false, 0); + data = find_scalar(data, &sweep, false, 0); + data = find_points(data, &points[0], 1, relative, &c); + path.arcTo(radii, angle, (SkPath::ArcSize) SkToBool(largeArc), + (SkPath::Direction) !SkToBool(sweep), points[0]); + } break; case 'Z': path.close(); #if 0 // !!! still a bug? |