bool SVGViewSpec::parseViewSpecInternal(const CharType* ptr, const CharType* end) { if (!skipToken(ptr, end, "svgView")) return false; if (!skipExactly<CharType>(ptr, end, '(')) return false; while (ptr < end && *ptr != ')') { ViewSpecFunctionType functionType = scanViewSpecFunction(ptr, end); if (functionType == Unknown) return false; if (!skipExactly<CharType>(ptr, end, '(')) return false; switch (functionType) { case ViewBox: { float x = 0.0f; float y = 0.0f; float width = 0.0f; float height = 0.0f; if (!(parseNumber(ptr, end, x) && parseNumber(ptr, end, y) && parseNumber(ptr, end, width) && parseNumber(ptr, end, height, DisallowWhitespace))) return false; updateViewBox(FloatRect(x, y, width, height)); break; } case ViewTarget: { const CharType* viewTargetStart = ptr; skipUntil<CharType>(ptr, end, ')'); if (ptr == viewTargetStart) return false; m_viewTargetString = String(viewTargetStart, ptr - viewTargetStart); break; } case ZoomAndPan: if (!parseZoomAndPan(ptr, end)) return false; break; case PreserveAspectRatio: if (!preserveAspectRatio()->baseValue()->parse(ptr, end, false)) return false; break; case Transform: m_transform->baseValue()->parse(ptr, end); break; default: NOTREACHED(); break; } if (!skipExactly<CharType>(ptr, end, ')')) return false; skipExactly<CharType>(ptr, end, ';'); } return skipExactly<CharType>(ptr, end, ')'); }
bool SVGZoomAndPan::parseMappedAttribute(Attribute* attr) { if (attr->name() == SVGNames::zoomAndPanAttr) { const UChar* start = attr->value().characters(); const UChar* end = start + attr->value().length(); parseZoomAndPan(start, end); return true; } return false; }
bool SVGViewSpec::parseViewSpec(const String& viewSpec) { const UChar* currViewSpec = viewSpec.deprecatedCharacters(); const UChar* end = currViewSpec + viewSpec.length(); if (currViewSpec >= end || !m_contextElement) return false; if (!skipString(currViewSpec, end, svgViewSpec, WTF_ARRAY_LENGTH(svgViewSpec))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; while (currViewSpec < end && *currViewSpec != ')') { if (*currViewSpec == 'v') { if (skipString(currViewSpec, end, viewBoxSpec, WTF_ARRAY_LENGTH(viewBoxSpec))) { if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; FloatRect viewBox; if (!SVGFitToViewBox::parseViewBox(&m_contextElement->document(), currViewSpec, end, viewBox, false)) return false; setViewBoxBaseValue(viewBox); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (skipString(currViewSpec, end, viewTargetSpec, WTF_ARRAY_LENGTH(viewTargetSpec))) { if (currViewSpec >= end || *currViewSpec != '(') return false; const UChar* viewTargetStart = ++currViewSpec; while (currViewSpec < end && *currViewSpec != ')') currViewSpec++; if (currViewSpec >= end) return false; setViewTargetString(String(viewTargetStart, currViewSpec - viewTargetStart)); currViewSpec++; } else return false; } else if (*currViewSpec == 'z') { if (!skipString(currViewSpec, end, zoomAndPanSpec, WTF_ARRAY_LENGTH(zoomAndPanSpec))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; if (!parseZoomAndPan(currViewSpec, end, m_zoomAndPan)) return false; if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (*currViewSpec == 'p') { if (!skipString(currViewSpec, end, preserveAspectRatioSpec, WTF_ARRAY_LENGTH(preserveAspectRatioSpec))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; SVGPreserveAspectRatio preserveAspectRatio; if (!preserveAspectRatio.parse(currViewSpec, end, false)) return false; setPreserveAspectRatioBaseValue(preserveAspectRatio); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (*currViewSpec == 't') { if (!skipString(currViewSpec, end, transformSpec, WTF_ARRAY_LENGTH(transformSpec))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; SVGTransformable::parseTransformAttribute(m_transform, currViewSpec, end, SVGTransformable::DoNotClearList); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else return false; if (currViewSpec < end && *currViewSpec == ';') currViewSpec++; } if (currViewSpec >= end || *currViewSpec != ')') return false; return true; }
bool SVGViewSpec::parseViewSpecInternal(const CharType* ptr, const CharType* end) { if (!skipString(ptr, end, svgViewSpec, WTF_ARRAY_LENGTH(svgViewSpec))) return false; if (ptr >= end || *ptr != '(') return false; ptr++; while (ptr < end && *ptr != ')') { if (*ptr == 'v') { if (skipString(ptr, end, viewBoxSpec, WTF_ARRAY_LENGTH(viewBoxSpec))) { if (ptr >= end || *ptr != '(') return false; ptr++; float x = 0.0f; float y = 0.0f; float width = 0.0f; float height = 0.0f; if (!(parseNumber(ptr, end, x) && parseNumber(ptr, end, y) && parseNumber(ptr, end, width) && parseNumber(ptr, end, height, DisallowWhitespace))) return false; updateViewBox(FloatRect(x, y, width, height)); if (ptr >= end || *ptr != ')') return false; ptr++; } else if (skipString(ptr, end, viewTargetSpec, WTF_ARRAY_LENGTH(viewTargetSpec))) { if (ptr >= end || *ptr != '(') return false; const CharType* viewTargetStart = ++ptr; while (ptr < end && *ptr != ')') ptr++; if (ptr >= end) return false; m_viewTargetString = String(viewTargetStart, ptr - viewTargetStart); ptr++; } else return false; } else if (*ptr == 'z') { if (!skipString(ptr, end, zoomAndPanSpec, WTF_ARRAY_LENGTH(zoomAndPanSpec))) return false; if (ptr >= end || *ptr != '(') return false; ptr++; if (!parseZoomAndPan(ptr, end)) return false; if (ptr >= end || *ptr != ')') return false; ptr++; } else if (*ptr == 'p') { if (!skipString(ptr, end, preserveAspectRatioSpec, WTF_ARRAY_LENGTH(preserveAspectRatioSpec))) return false; if (ptr >= end || *ptr != '(') return false; ptr++; if (!preserveAspectRatio()->baseValue()->parse(ptr, end, false)) return false; if (ptr >= end || *ptr != ')') return false; ptr++; } else if (*ptr == 't') { if (!skipString(ptr, end, transformSpec, WTF_ARRAY_LENGTH(transformSpec))) return false; if (ptr >= end || *ptr != '(') return false; ptr++; m_transform->baseValue()->parse(ptr, end); if (ptr >= end || *ptr != ')') return false; ptr++; } else return false; if (ptr < end && *ptr == ';') ptr++; } if (ptr >= end || *ptr != ')') return false; return true; }
bool SVGViewSpec::parseViewSpec(const String& viewSpec) { const UChar* currViewSpec = viewSpec.characters(); const UChar* end = currViewSpec + viewSpec.length(); if (currViewSpec >= end) return false; if (!skipString(currViewSpec, end, svgViewSpec, sizeof(svgViewSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(' ) return false; currViewSpec++; while (currViewSpec < end && *currViewSpec != ')') { if (*currViewSpec == 'v') { if (skipString(currViewSpec, end, viewBoxSpec, sizeof(viewBoxSpec) / sizeof(UChar))) { if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; float x, y, w, h; if (!parseViewBox(currViewSpec, end, x, y, w, h, false)) return false; setViewBoxBaseValue(FloatRect(x, y, w, h)); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (skipString(currViewSpec, end, viewTargetSpec, sizeof(viewTargetSpec) / sizeof(UChar))) { if (currViewSpec >= end || *currViewSpec != '(') return false; const UChar* viewTargetStart = ++currViewSpec; while (currViewSpec < end && *currViewSpec != ')') currViewSpec++; if (currViewSpec >= end) return false; setViewTargetString(String(viewTargetStart, currViewSpec - viewTargetStart)); currViewSpec++; } else return false; } else if (*currViewSpec == 'z') { if (!skipString(currViewSpec, end, zoomAndPanSpec, sizeof(zoomAndPanSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; if (!parseZoomAndPan(currViewSpec, end)) return false; if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (*currViewSpec == 'p') { if (!skipString(currViewSpec, end, preserveAspectRatioSpec, sizeof(preserveAspectRatioSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; if (!preserveAspectRatioBaseValue()->parsePreserveAspectRatio(currViewSpec, end, false)) return false; if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (*currViewSpec == 't') { if (!skipString(currViewSpec, end, transformSpec, sizeof(transformSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; SVGTransformable::parseTransformAttribute(m_transform.get(), currViewSpec, end); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else return false; if (currViewSpec < end && *currViewSpec == ';') currViewSpec++; } if (currViewSpec >= end || *currViewSpec != ')') return false; return true; }
bool SVGViewSpec::parseViewSpec(const String& viewSpec) { const UChar* currViewSpec = viewSpec.characters(); const UChar* end = currViewSpec + viewSpec.length(); if (currViewSpec >= end) return false; if (!skipString(currViewSpec, end, svgViewSpec, sizeof(svgViewSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(' ) return false; currViewSpec++; while (currViewSpec < end && *currViewSpec != ')') { if (*currViewSpec == 'v') { if (skipString(currViewSpec, end, viewBoxSpec, sizeof(viewBoxSpec) / sizeof(UChar))) { if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; FloatRect viewBox; if (!parseViewBox(m_contextElement->document(), currViewSpec, end, viewBox, false)) return false; setViewBoxBaseValue(viewBox); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (skipString(currViewSpec, end, viewTargetSpec, sizeof(viewTargetSpec) / sizeof(UChar))) { if (currViewSpec >= end || *currViewSpec != '(') return false; const UChar* viewTargetStart = ++currViewSpec; while (currViewSpec < end && *currViewSpec != ')') currViewSpec++; if (currViewSpec >= end) return false; setViewTargetString(String(viewTargetStart, currViewSpec - viewTargetStart)); currViewSpec++; } else return false; } else if (*currViewSpec == 'z') { if (!skipString(currViewSpec, end, zoomAndPanSpec, sizeof(zoomAndPanSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; if (!parseZoomAndPan(currViewSpec, end)) return false; if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (*currViewSpec == 'p') { if (!skipString(currViewSpec, end, preserveAspectRatioSpec, sizeof(preserveAspectRatioSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; bool result = false; setPreserveAspectRatioBaseValue(SVGPreserveAspectRatio::parsePreserveAspectRatio(currViewSpec, end, false, result)); if (!result) return false; if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else if (*currViewSpec == 't') { if (!skipString(currViewSpec, end, transformSpec, sizeof(transformSpec) / sizeof(UChar))) return false; if (currViewSpec >= end || *currViewSpec != '(') return false; currViewSpec++; SVGTransformable::parseTransformAttribute(m_transform.get(), currViewSpec, end, SVGTransformable::DoNotClearList); if (currViewSpec >= end || *currViewSpec != ')') return false; currViewSpec++; } else return false; if (currViewSpec < end && *currViewSpec == ';') currViewSpec++; } if (currViewSpec >= end || *currViewSpec != ')') return false; return true; }