OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 #include "SkParse.h" | 8 #include "SkParse.h" |
9 #include "SkParsePath.h" | 9 #include "SkParsePath.h" |
10 | 10 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 } | 57 } |
58 return str; | 58 return str; |
59 } | 59 } |
60 | 60 |
61 static const char* find_scalar(const char str[], SkScalar* value, | 61 static const char* find_scalar(const char str[], SkScalar* value, |
62 bool isRelative, SkScalar relative) { | 62 bool isRelative, SkScalar relative) { |
63 str = SkParse::FindScalar(str, value); | 63 str = SkParse::FindScalar(str, value); |
64 if (isRelative) { | 64 if (isRelative) { |
65 *value += relative; | 65 *value += relative; |
66 } | 66 } |
| 67 str = skip_sep(str); |
67 return str; | 68 return str; |
68 } | 69 } |
69 | 70 |
70 bool SkParsePath::FromSVGString(const char data[], SkPath* result) { | 71 bool SkParsePath::FromSVGString(const char data[], SkPath* result) { |
71 SkPath path; | 72 SkPath path; |
72 SkPoint f = {0, 0}; | 73 SkPoint f = {0, 0}; |
73 SkPoint c = {0, 0}; | 74 SkPoint c = {0, 0}; |
74 SkPoint lastc = {0, 0}; | 75 SkPoint lastc = {0, 0}; |
75 SkPoint points[3]; | 76 SkPoint points[3]; |
76 char op = '\0'; | 77 char op = '\0'; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 points[0] = points[1]; | 150 points[0] = points[1]; |
150 if (previousOp == 'Q' || previousOp == 'T') { | 151 if (previousOp == 'Q' || previousOp == 'T') { |
151 points[0].fX = c.fX * 2 - lastc.fX; | 152 points[0].fX = c.fX * 2 - lastc.fX; |
152 points[0].fY = c.fY * 2 - lastc.fY; | 153 points[0].fY = c.fY * 2 - lastc.fY; |
153 } | 154 } |
154 quadraticCommon: | 155 quadraticCommon: |
155 path.quadTo(points[0], points[1]); | 156 path.quadTo(points[0], points[1]); |
156 lastc = points[0]; | 157 lastc = points[0]; |
157 c = points[1]; | 158 c = points[1]; |
158 break; | 159 break; |
| 160 case 'A': { |
| 161 SkPoint radii; |
| 162 data = find_points(data, &radii, 1, false, nullptr); |
| 163 SkScalar angle, largeArc, sweep; |
| 164 data = find_scalar(data, &angle, false, 0); |
| 165 data = find_scalar(data, &largeArc, false, 0); |
| 166 data = find_scalar(data, &sweep, false, 0); |
| 167 data = find_points(data, &points[0], 1, relative, &c); |
| 168 path.arcTo(radii, angle, (SkPath::ArcSize) SkToBool(largeArc), |
| 169 (SkPath::Direction) !SkToBool(sweep), points[0]); |
| 170 } break; |
159 case 'Z': | 171 case 'Z': |
160 path.close(); | 172 path.close(); |
161 #if 0 // !!! still a bug? | 173 #if 0 // !!! still a bug? |
162 if (fPath.isEmpty() && (f.fX != 0 || f.fY != 0)) { | 174 if (fPath.isEmpty() && (f.fX != 0 || f.fY != 0)) { |
163 c.fX -= SkScalar.Epsilon; // !!! enough? | 175 c.fX -= SkScalar.Epsilon; // !!! enough? |
164 fPath.moveTo(c); | 176 fPath.moveTo(c); |
165 fPath.lineTo(f); | 177 fPath.lineTo(f); |
166 fPath.close(); | 178 fPath.close(); |
167 } | 179 } |
168 #endif | 180 #endif |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 case SkPath::kClose_Verb: | 258 case SkPath::kClose_Verb: |
247 stream.write("Z", 1); | 259 stream.write("Z", 1); |
248 break; | 260 break; |
249 case SkPath::kDone_Verb: | 261 case SkPath::kDone_Verb: |
250 str->resize(stream.getOffset()); | 262 str->resize(stream.getOffset()); |
251 stream.copyTo(str->writable_str()); | 263 stream.copyTo(str->writable_str()); |
252 return; | 264 return; |
253 } | 265 } |
254 } | 266 } |
255 } | 267 } |
OLD | NEW |