Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(711)

Unified Diff: third_party/WebKit/Source/core/svg/SVGPathQuery.cpp

Issue 1471943003: Introduce SVGPathQuery to hold SVG path query methods (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Const-qualify. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/svg/SVGPathQuery.cpp
diff --git a/third_party/WebKit/Source/core/svg/SVGPathQuery.cpp b/third_party/WebKit/Source/core/svg/SVGPathQuery.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bdf0028db3afcf4b65a5e22a1c9348cc4b7e307b
--- /dev/null
+++ b/third_party/WebKit/Source/core/svg/SVGPathQuery.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "core/svg/SVGPathQuery.h"
+
+#include "core/svg/SVGPathByteStreamSource.h"
+#include "core/svg/SVGPathConsumer.h"
+#include "core/svg/SVGPathData.h"
+#include "core/svg/SVGPathParser.h"
+#include "platform/graphics/PathTraversalState.h"
+
+namespace blink {
+
+namespace {
+
+class SVGPathTraversalState final : public SVGPathConsumer {
+public:
+ SVGPathTraversalState(PathTraversalState::PathTraversalAction traversalAction, float desiredLength = 0)
+ : m_traversalState(traversalAction)
+ , m_segmentIndex(0)
+ {
+ m_traversalState.m_desiredLength = desiredLength;
+ }
+
+ unsigned segmentIndex() const { return m_segmentIndex; }
+ float totalLength() const { return m_traversalState.m_totalLength; }
+ FloatPoint computedPoint() const { return m_traversalState.m_current; }
+
+ void consumedSegment() { m_segmentIndex++; }
+
+ bool processSegment()
+ {
+ m_traversalState.processSegment();
+ return m_traversalState.m_success;
+ }
+
+private:
+ void emitSegment(const PathSegmentData&) override;
+
+ PathTraversalState m_traversalState;
+ unsigned m_segmentIndex;
+};
+
+void SVGPathTraversalState::emitSegment(const PathSegmentData& segment)
+{
+ switch (segment.command) {
+ case PathSegMoveToAbs:
+ m_traversalState.m_totalLength += m_traversalState.moveTo(segment.targetPoint);
+ break;
+ case PathSegLineToAbs:
+ m_traversalState.m_totalLength += m_traversalState.lineTo(segment.targetPoint);
+ break;
+ case PathSegClosePath:
+ m_traversalState.m_totalLength += m_traversalState.closeSubpath();
+ break;
+ case PathSegCurveToCubicAbs:
+ m_traversalState.m_totalLength += m_traversalState.cubicBezierTo(segment.point1, segment.point2, segment.targetPoint);
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+}
+
+void executeQuery(const SVGPathByteStream& pathByteStream, SVGPathTraversalState& traversalState)
+{
+ SVGPathByteStreamSource source(pathByteStream);
+ SVGPathNormalizer normalizer(&traversalState);
+
+ bool hasMoreData = source.hasMoreData();
+ while (hasMoreData) {
+ PathSegmentData segment = source.parseSegment();
+ ASSERT(segment.command != PathSegUnknown);
+
+ normalizer.emitSegment(segment);
+
+ if (traversalState.processSegment())
+ return;
+
+ hasMoreData = source.hasMoreData();
+ if (hasMoreData)
+ traversalState.consumedSegment();
f(malita) 2015/11/24 14:22:40 Could we get rid of consumedSegment by folding its
fs 2015/11/24 14:51:46 Done (the former, the latter would change semantic
+ }
+}
+
+}
+
+SVGPathQuery::SVGPathQuery(const SVGPathByteStream& pathByteStream)
+ : m_pathByteStream(pathByteStream)
+{
+}
+
+unsigned SVGPathQuery::getPathSegIndexAtLength(float length) const
+{
+ SVGPathTraversalState traversalState(PathTraversalState::TraversalSegmentAtLength, length);
+ executeQuery(m_pathByteStream, traversalState);
+ return traversalState.segmentIndex();
+}
+
+float SVGPathQuery::getTotalLength() const
+{
+ SVGPathTraversalState traversalState(PathTraversalState::TraversalTotalLength);
+ executeQuery(m_pathByteStream, traversalState);
+ return traversalState.totalLength();
+}
+
+FloatPoint SVGPathQuery::getPointAtLength(float length) const
+{
+ SVGPathTraversalState traversalState(PathTraversalState::TraversalPointAtLength, length);
+ executeQuery(m_pathByteStream, traversalState);
+ return traversalState.computedPoint();
+}
+
+}
« no previous file with comments | « third_party/WebKit/Source/core/svg/SVGPathQuery.h ('k') | third_party/WebKit/Source/core/svg/SVGPathStringBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698