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