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

Side by Side Diff: Source/platform/graphics/Path.cpp

Issue 140053006: Optimize glyph positioning for SVG <textPath> layout (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: This is why I used an OwnPtr... Created 6 years, 10 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/platform/graphics/Path.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. 2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
3 * 2006 Rob Buis <buis@kde.org> 3 * 2006 Rob Buis <buis@kde.org>
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5 * Copyright (C) 2013 Google Inc. All rights reserved. 5 * Copyright (C) 2013 Google Inc. All rights reserved.
6 * Copyright (C) 2013 Intel Corporation. All rights reserved. 6 * Copyright (C) 2013 Intel Corporation. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
(...skipping 18 matching lines...) Expand all
29 29
30 #include "config.h" 30 #include "config.h"
31 #include "platform/graphics/Path.h" 31 #include "platform/graphics/Path.h"
32 32
33 #include <math.h> 33 #include <math.h>
34 #include "platform/geometry/FloatPoint.h" 34 #include "platform/geometry/FloatPoint.h"
35 #include "platform/geometry/FloatRect.h" 35 #include "platform/geometry/FloatRect.h"
36 #include "platform/graphics/GraphicsContext.h" 36 #include "platform/graphics/GraphicsContext.h"
37 #include "platform/graphics/skia/SkiaUtils.h" 37 #include "platform/graphics/skia/SkiaUtils.h"
38 #include "platform/transforms/AffineTransform.h" 38 #include "platform/transforms/AffineTransform.h"
39 #include "third_party/skia/include/core/SkPathMeasure.h"
40 #include "third_party/skia/include/pathops/SkPathOps.h" 39 #include "third_party/skia/include/pathops/SkPathOps.h"
41 #include "wtf/MathExtras.h" 40 #include "wtf/MathExtras.h"
42 41
43 namespace WebCore { 42 namespace WebCore {
44 43
45 Path::Path() 44 Path::Path()
46 : m_path() 45 : m_path()
47 { 46 {
48 } 47 }
49 48
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 } 169 }
171 170
172 float Path::normalAngleAtLength(float length, bool& ok) const 171 float Path::normalAngleAtLength(float length, bool& ok) const
173 { 172 {
174 FloatPoint point; 173 FloatPoint point;
175 float normal; 174 float normal;
176 ok = pointAndNormalAtLength(length, point, normal); 175 ok = pointAndNormalAtLength(length, point, normal);
177 return normal; 176 return normal;
178 } 177 }
179 178
180 bool Path::pointAndNormalAtLength(float length, FloatPoint& point, float& normal ) const 179 static bool calculatePointAndNormalOnPath(SkPathMeasure& measure, SkScalar lengt h, FloatPoint& point, float& normalAngle, SkScalar* accumulatedLength = 0)
181 { 180 {
182 SkPathMeasure measure(m_path, false);
183
184 do { 181 do {
185 SkScalar contourLength = measure.getLength(); 182 SkScalar contourLength = measure.getLength();
186 if (length <= contourLength) { 183 if (length <= contourLength) {
187 SkVector tangent; 184 SkVector tangent;
188 SkPoint position; 185 SkPoint position;
189 186
190 if (measure.getPosTan(length, &position, &tangent)) { 187 if (measure.getPosTan(length, &position, &tangent)) {
191 normal = rad2deg(SkScalarToFloat(SkScalarATan2(tangent.fY, tange nt.fX))); 188 normalAngle = rad2deg(SkScalarToFloat(SkScalarATan2(tangent.fY, tangent.fX)));
192 point = FloatPoint(SkScalarToFloat(position.fX), SkScalarToFloat (position.fY)); 189 point = FloatPoint(SkScalarToFloat(position.fX), SkScalarToFloat (position.fY));
193 return true; 190 return true;
194 } 191 }
195 } 192 }
196 length -= contourLength; 193 length -= contourLength;
194 if (accumulatedLength)
195 *accumulatedLength += contourLength;
197 } while (measure.nextContour()); 196 } while (measure.nextContour());
197 return false;
198 }
199
200 bool Path::pointAndNormalAtLength(float length, FloatPoint& point, float& normal ) const
201 {
202 SkPathMeasure measure(m_path, false);
203
204 if (calculatePointAndNormalOnPath(measure, WebCoreFloatToSkScalar(length), p oint, normal))
205 return true;
198 206
199 normal = 0; 207 normal = 0;
200 point = FloatPoint(0, 0); 208 point = FloatPoint(0, 0);
201 return false; 209 return false;
202 } 210 }
203 211
212 Path::PositionCalculator::PositionCalculator(const Path& path)
213 : m_path(path.skPath())
214 , m_pathMeasure(path.skPath(), false)
215 , m_accumulatedLength(0)
216 {
217 }
218
219 bool Path::PositionCalculator::pointAndNormalAtLength(float length, FloatPoint& point, float& normalAngle)
220 {
221 SkScalar skLength = WebCoreFloatToSkScalar(length);
222 if (skLength >= 0) {
223 if (skLength < m_accumulatedLength) {
224 // Reset path measurer to rewind (and restart from 0).
225 m_pathMeasure.setPath(&m_path, false);
226 m_accumulatedLength = 0;
227 } else {
228 skLength -= m_accumulatedLength;
229 }
230
231 if (calculatePointAndNormalOnPath(m_pathMeasure, skLength, point, normal Angle, &m_accumulatedLength))
232 return true;
233 }
234
235 normalAngle = 0;
236 point = FloatPoint(0, 0);
237 return false;
238 }
239
204 void Path::clear() 240 void Path::clear()
205 { 241 {
206 m_path.reset(); 242 m_path.reset();
207 } 243 }
208 244
209 bool Path::isEmpty() const 245 bool Path::isEmpty() const
210 { 246 {
211 return m_path.isEmpty(); 247 return m_path.isEmpty();
212 } 248 }
213 249
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 484
449 #if !ASSERT_DISABLED 485 #if !ASSERT_DISABLED
450 bool ellipseIsRenderable(float startAngle, float endAngle) 486 bool ellipseIsRenderable(float startAngle, float endAngle)
451 { 487 {
452 return (std::abs(endAngle - startAngle) < 2 * piFloat) 488 return (std::abs(endAngle - startAngle) < 2 * piFloat)
453 || WebCoreFloatNearlyEqual(std::abs(endAngle - startAngle), 2 * piFloat) ; 489 || WebCoreFloatNearlyEqual(std::abs(endAngle - startAngle), 2 * piFloat) ;
454 } 490 }
455 #endif 491 #endif
456 492
457 } 493 }
OLDNEW
« no previous file with comments | « Source/platform/graphics/Path.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698