1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Copyright (c) 2008, Google Inc.
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Redistribution and use in source and binary forms, with or without
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// modification, are permitted provided that the following conditions are
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// met:
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//     * Redistributions of source code must retain the above copyright
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// notice, this list of conditions and the following disclaimer.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//     * Redistributions in binary form must reproduce the above
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// copyright notice, this list of conditions and the following disclaimer
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// in the documentation and/or other materials provided with the
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// distribution.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//     * Neither the name of Google Inc. nor the names of its
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// contributors may be used to endorse or promote products derived from
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// this software without specific prior written permission.
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project//
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Path.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "AffineTransform.h"
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatRect.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "ImageBuffer.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "StrokeStyleApplier.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SkPath.h"
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SkRegion.h"
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SkiaUtils.h"
41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/MathExtras.h>
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPath::Path()
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path = new SkPath;
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPath::Path(const Path& other)
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path = new SkPath(*other.m_path);
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPath::~Path()
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    delete m_path;
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectPath& Path::operator=(const Path& other)
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    *m_path = *other.m_path;
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return *this;
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Path::isEmpty() const
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return m_path->isEmpty();
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool Path::hasCurrentPoint() const
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return m_path->getPoints(NULL, 0) != 0;
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
77967717af5423377c967781471ee106e2bb4e11c8Ben MurdochFloatPoint Path::currentPoint() const
78967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
79967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // FIXME: return current point of subpath.
80967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    float quietNaN = std::numeric_limits<float>::quiet_NaN();
81967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return FloatPoint(quietNaN, quietNaN);
82967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
83967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Path::contains(const FloatPoint& point, WindRule rule) const
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return SkPathContainsPoint(m_path, point,
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project      rule == RULE_NONZERO ? SkPath::kWinding_FillType : SkPath::kEvenOdd_FillType);
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::translate(const FloatSize& size)
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->offset(WebCoreFloatToSkScalar(size.width()), WebCoreFloatToSkScalar(size.height()));
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectFloatRect Path::boundingRect() const
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return m_path->getBounds();
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::moveTo(const FloatPoint& point)
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->moveTo(point);
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addLineTo(const FloatPoint& point)
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->lineTo(point);
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addQuadCurveTo(const FloatPoint& cp, const FloatPoint& ep)
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->quadTo(cp, ep);
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addBezierCurveTo(const FloatPoint& p1, const FloatPoint& p2, const FloatPoint& ep)
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->cubicTo(p1, p2, ep);
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addArcTo(const FloatPoint& p1, const FloatPoint& p2, float radius)
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->arcTo(p1, p2, WebCoreFloatToSkScalar(radius));
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::closeSubpath()
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->close();
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addArc(const FloatPoint& p, float r, float sa, float ea, bool anticlockwise) {
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkScalar cx = WebCoreFloatToSkScalar(p.x());
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkScalar cy = WebCoreFloatToSkScalar(p.y());
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkScalar radius = WebCoreFloatToSkScalar(r);
134cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SkScalar s360 = SkIntToScalar(360);
135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkRect oval;
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    oval.set(cx - radius, cy - radius, cx + radius, cy + radius);
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    float sweep = ea - sa;
140cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SkScalar startDegrees = WebCoreFloatToSkScalar(sa * 180 / piFloat);
141cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    SkScalar sweepDegrees = WebCoreFloatToSkScalar(sweep * 180 / piFloat);
142cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Check for a circle.
143cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (sweepDegrees >= s360 || sweepDegrees <= -s360) {
144cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // Move to the start position (0 sweep means we add a single point).
145cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        m_path->arcTo(oval, startDegrees, 0, false);
146cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // Draw the circle.
14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        m_path->addOval(oval, anticlockwise ?
14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            SkPath::kCCW_Direction : SkPath::kCW_Direction);
149cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // Force a moveTo the end position.
150cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        m_path->arcTo(oval, startDegrees + sweepDegrees, 0, true);
151cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    } else {
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Counterclockwise arcs should be drawn with negative sweeps, while
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // clockwise arcs should be drawn with positive sweeps. Check to see
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // if the situation is reversed and correct it by adding or subtracting
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // a full circle
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (anticlockwise && sweepDegrees > 0) {
157cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            sweepDegrees -= s360;
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } else if (!anticlockwise && sweepDegrees < 0) {
159cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            sweepDegrees += s360;
160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_path->arcTo(oval, startDegrees, sweepDegrees, false);
163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addRect(const FloatRect& rect)
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->addRect(rect);
169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::addEllipse(const FloatRect& rect)
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->addOval(rect);
174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::clear()
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_path->reset();
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic FloatPoint* convertPathPoints(FloatPoint dst[], const SkPoint src[], int count)
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    for (int i = 0; i < count; i++) {
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        dst[i].setX(SkScalarToFloat(src[i].fX));
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        dst[i].setY(SkScalarToFloat(src[i].fY));
186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return dst;
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Path::apply(void* info, PathApplierFunction function) const
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPath::Iter iter(*m_path, false);
193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPoint pts[4];
194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    PathElement pathElement;
195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    FloatPoint pathPoints[3];
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    for (;;) {
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        switch (iter.next(pts)) {
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SkPath::kMove_Verb:
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.type = PathElementMoveToPoint;
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.points = convertPathPoints(pathPoints, &pts[0], 1);
202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SkPath::kLine_Verb:
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.type = PathElementAddLineToPoint;
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.points = convertPathPoints(pathPoints, &pts[1], 1);
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SkPath::kQuad_Verb:
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.type = PathElementAddQuadCurveToPoint;
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.points = convertPathPoints(pathPoints, &pts[1], 2);
210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SkPath::kCubic_Verb:
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.type = PathElementAddCurveToPoint;
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.points = convertPathPoints(pathPoints, &pts[1], 3);
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SkPath::kClose_Verb:
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.type = PathElementCloseSubpath;
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            pathElement.points = convertPathPoints(pathPoints, 0, 0);
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            break;
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        case SkPath::kDone_Verb:
220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return;
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        function(info, &pathElement);
223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2265e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockvoid Path::transform(const AffineTransform& xform)
2275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block{
2285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    m_path->transform(xform);
2295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block}
2305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
2312bde8e466a4451c7319e3a072d118917957d6554Steve BlockFloatRect Path::strokeBoundingRect(StrokeStyleApplier* applier) const
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    GraphicsContext* scratch = scratchContext();
234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    scratch->save();
235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (applier)
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        applier->strokeStyle(scratch);
238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    SkPaint paint;
2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    scratch->platformContext()->setupPaintForStroking(&paint, 0, 0);
2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    SkPath boundingPath;
2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    paint.getFillPath(*platformPath(), &boundingPath);
2432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
2442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    FloatRect r = boundingPath.getBounds();
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    scratch->restore();
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return r;
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Path::strokeContains(StrokeStyleApplier* applier, const FloatPoint& point) const
250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(applier);
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    GraphicsContext* scratch = scratchContext();
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    scratch->save();
254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    applier->strokeStyle(scratch);
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPaint paint;
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    scratch->platformContext()->setupPaintForStroking(&paint, 0, 0);
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPath strokePath;
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    paint.getFillPath(*platformPath(), &strokePath);
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool contains = SkPathContainsPoint(&strokePath, point,
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                                        SkPath::kWinding_FillType);
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    scratch->restore();
265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return contains;
266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace WebCore
268