static bool parseKeySplinesInternal(const String& string, Vector<UnitBezier>& result) { const CharType* ptr = string.getCharacters<CharType>(); const CharType* end = ptr + string.length(); skipOptionalSVGSpaces(ptr, end); while (ptr < end) { float posA = 0; if (!parseNumber(ptr, end, posA)) return false; float posB = 0; if (!parseNumber(ptr, end, posB)) return false; float posC = 0; if (!parseNumber(ptr, end, posC)) return false; float posD = 0; if (!parseNumber(ptr, end, posD, DisallowWhitespace)) return false; skipOptionalSVGSpaces(ptr, end); if (ptr < end && *ptr == ';') ptr++; skipOptionalSVGSpaces(ptr, end); result.append(UnitBezier(posA, posB, posC, posD)); } return ptr == end; }
static void parseKeySplines(const String &parse, Vector<UnitBezier> &result) { result.clear(); Vector<String> parseList; parse.split(';', parseList); for (unsigned n = 0; n < parseList.size(); ++n) { Vector<String> parseSpline; parseList[n].split(',', parseSpline); // The spec says the sepator is a space, all tests use commas. Weird. if (parseSpline.size() == 1) { parseList[n].split(' ', parseSpline); } if (parseSpline.size() != 4) { goto fail; } double curveValues[4]; for (unsigned i = 0; i < 4; ++i) { String parseNumber = parseSpline[i]; bool ok; curveValues[i] = parseNumber.toDouble(&ok); if (!ok || curveValues[i] < 0.0 || curveValues[i] > 1.0) { goto fail; } } result.append(UnitBezier(curveValues[0], curveValues[1], curveValues[2], curveValues[3])); } return; fail: result.clear(); }
static void parseKeySplines(const String& parse, Vector<UnitBezier>& result) { result.clear(); if (parse.isEmpty()) return; auto upconvertedCharacters = StringView(parse).upconvertedCharacters(); const UChar* cur = upconvertedCharacters; const UChar* end = cur + parse.length(); skipOptionalSVGSpaces(cur, end); bool delimParsed = false; while (cur < end) { delimParsed = false; float posA = 0; if (!parseNumber(cur, end, posA)) { result.clear(); return; } float posB = 0; if (!parseNumber(cur, end, posB)) { result.clear(); return; } float posC = 0; if (!parseNumber(cur, end, posC)) { result.clear(); return; } float posD = 0; if (!parseNumber(cur, end, posD, false)) { result.clear(); return; } skipOptionalSVGSpaces(cur, end); if (cur < end && *cur == ';') { delimParsed = true; cur++; } skipOptionalSVGSpaces(cur, end); result.append(UnitBezier(posA, posB, posC, posD)); } if (!(cur == end && !delimParsed)) result.clear(); }
static void parseKeySplinesInternal(const String& string, Vector<UnitBezier>& result) { const CharType* ptr = string.getCharacters<CharType>(); const CharType* end = ptr + string.length(); skipOptionalSVGSpaces(ptr, end); bool delimParsed = false; while (ptr < end) { delimParsed = false; float posA = 0; if (!parseNumber(ptr, end, posA)) { result.clear(); return; } float posB = 0; if (!parseNumber(ptr, end, posB)) { result.clear(); return; } float posC = 0; if (!parseNumber(ptr, end, posC)) { result.clear(); return; } float posD = 0; if (!parseNumber(ptr, end, posD, false)) { result.clear(); return; } skipOptionalSVGSpaces(ptr, end); if (ptr < end && *ptr == ';') { delimParsed = true; ptr++; } skipOptionalSVGSpaces(ptr, end); result.append(UnitBezier(posA, posB, posC, posD)); } if (!(ptr == end && !delimParsed)) result.clear(); }
static inline double solveCubicBezierFunction(double p1x, double p1y, double p2x, double p2y, double t, double duration) { return UnitBezier(p1x, p1y, p2x, p2y).solve(t, solveEpsilon(duration)); }