bool buildSVGPathByteStreamFromSVGPathSegList(const SVGPathSegList& list, SVGPathByteStream& result, PathParsingMode parsingMode) { result.clear(); if (list.isEmpty()) return true; SVGPathSegListSource source(list); return SVGPathParser::parseToByteStream(source, result, parsingMode); }
bool buildSVGPathByteStreamFromString(const String& d, SVGPathByteStream& result, PathParsingMode parsingMode) { result.clear(); if (d.isEmpty()) return true; SVGPathStringSource source(d); return SVGPathParser::parseToByteStream(source, result, parsingMode); }
bool buildAnimatedSVGPathByteStream(const SVGPathByteStream& fromStream, const SVGPathByteStream& toStream, SVGPathByteStream& result, float progress) { ASSERT(&toStream != &result); result.clear(); if (toStream.isEmpty()) return true; SVGPathByteStreamBuilder builder(result); SVGPathByteStreamSource fromSource(fromStream); SVGPathByteStreamSource toSource(toStream); return SVGPathBlender::blendAnimatedPath(fromSource, toSource, builder, progress); }
bool addToSVGPathByteStream(SVGPathByteStream& fromStream, const SVGPathByteStream& byStream, unsigned repeatCount) { if (fromStream.isEmpty() || byStream.isEmpty()) return true; OwnPtr<SVGPathByteStream> fromStreamCopy = fromStream.copy(); fromStream.clear(); SVGPathByteStreamBuilder builder(fromStream); SVGPathByteStreamSource fromSource(*fromStreamCopy); SVGPathByteStreamSource bySource(byStream); SVGPathBlender blender(&fromSource, &bySource, &builder); return blender.addAnimatedPath(repeatCount); }
bool buildSVGPathByteStreamFromString(const String& d, SVGPathByteStream& result, PathParsingMode parsingMode) { result.clear(); if (d.isEmpty()) return true; // The string length is typically a minor overestimate of eventual byte stream size, so it avoids us a lot of reallocs. result.reserveInitialCapacity(d.length()); SVGPathByteStreamBuilder builder(result); SVGPathStringSource source(d); SVGPathParser parser(&source, &builder); bool ok = parser.parsePathDataFromSource(parsingMode); result.shrinkToFit(); return ok; }
bool addToSVGPathByteStream(SVGPathByteStream& streamToAppendTo, const SVGPathByteStream& byStream, unsigned repeatCount) { // Why return when streamToAppendTo is empty? Don't we still need to append? if (streamToAppendTo.isEmpty() || byStream.isEmpty()) return true; // Is it OK to make the SVGPathByteStreamBuilder from a stream, and then clear that stream? SVGPathByteStreamBuilder builder(streamToAppendTo); SVGPathByteStream fromStreamCopy = streamToAppendTo; streamToAppendTo.clear(); SVGPathByteStreamSource fromSource(fromStreamCopy); SVGPathByteStreamSource bySource(byStream); return SVGPathBlender::addAnimatedPath(fromSource, bySource, builder, repeatCount); }