2006-10-05 Nikolas Zimmermann <zimmermann@kde.org>
[WebKit-https.git] / WebCore / kcanvas / device / qt / RenderPathQt.cpp
1 /*
2     Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <wildfox@kde.org>
3                   2004, 2005, 2006 Rob Buis <buis@kde.org>
4                   2005 Eric Seidel <eric.seidel@kdemail.net>
5
6     This file is part of the KDE project
7
8     This library is free software; you can redistribute it and/or
9     modify it under the terms of the GNU Library General Public
10     License as published by the Free Software Foundation; either
11     version 2 of the License, or (at your option) any later version.
12
13     This library is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16     Library General Public License for more details.
17
18     You should have received a copy of the GNU Library General Public License
19     aint with this library; see the file COPYING.LIB.  If not, write to
20     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21     Boston, MA 02111-1307, USA.
22 */
23
24 #include "config.h"
25 #include "RenderPath.h"
26 #include "KCanvasRenderingStyle.h"
27 #include "KRenderingStrokePainter.h"
28
29 #include <QDebug>
30 #include <QPainterPathStroker>
31
32 namespace WebCore {
33     
34 bool RenderPath::strokeContains(const FloatPoint& point, bool requiresStroke) const
35 {
36     if (path().isEmpty())
37         return false;
38
39     if (requiresStroke && !KSVGPainterFactory::strokePaintServer(style(), this))
40         return false;
41
42     return false;
43 }
44
45 static QPainterPath getPathStroke(const QPainterPath &path, const KRenderingStrokePainter &strokePainter)
46 {
47     QPainterPathStroker s;
48     s.setWidth(strokePainter.strokeWidth());
49     if(strokePainter.strokeCapStyle() == CAP_BUTT)
50         s.setCapStyle(Qt::FlatCap);
51     else if(strokePainter.strokeCapStyle() == CAP_ROUND)
52         s.setCapStyle(Qt::RoundCap);
53
54     if(strokePainter.strokeJoinStyle() == JOIN_MITER) {
55         s.setJoinStyle(Qt::MiterJoin);
56         s.setMiterLimit((qreal)strokePainter.strokeMiterLimit());
57     } else if(strokePainter.strokeJoinStyle() == JOIN_ROUND)
58         s.setJoinStyle(Qt::RoundJoin);
59
60     const KCDashArray& dashes = strokePainter.dashArray();
61     unsigned int dashLength = !dashes.isEmpty() ? dashes.size() : 0;
62     if(dashLength) {
63         QVector<qreal> pattern;
64         unsigned int count = (dashLength % 2) == 0 ? dashLength : dashLength * 2;
65
66         for(unsigned int i = 0; i < count; i++)
67             pattern.append(dashes[i % dashLength] / (float)s.width());
68
69         s.setDashPattern(pattern);
70         // TODO: dash-offset, does/will qt4 API allow it? (Rob)
71     }
72
73     return s.createStroke(path);
74 }
75
76 FloatRect RenderPath::strokeBBox() const
77 {
78     KRenderingStrokePainter strokePainter = KSVGPainterFactory::strokePainter(style(), this);
79     QPainterPath outline = getPathStroke(*(path().platformPath()), strokePainter);
80     return outline.boundingRect();
81 }
82
83 }
84
85 // vim:ts=4:noet