Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtGui module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | #include "qoutlinemapper_p.h" | - |
43 | #include <private/qpainterpath_p.h> | - |
44 | #include "qmath.h" | - |
45 | #include <private/qbezier_p.h> | - |
46 | | - |
47 | #include <stdlib.h> | - |
48 | | - |
49 | QT_BEGIN_NAMESPACE | - |
50 | | - |
51 | static const qreal aliasedCoordinateDelta = 0.5 - 0.015625; | - |
52 | | - |
53 | #define qreal_to_fixed_26_6(f) (int(f * 64)) | - |
54 | | - |
55 | | - |
56 | | - |
57 | | - |
58 | static const QRectF boundingRect(const QPointF *points, int pointCount) | - |
59 | { | - |
60 | const QPointF *e = points; executed (the execution status of this line is deduced): const QPointF *e = points; | - |
61 | const QPointF *last = points + pointCount; executed (the execution status of this line is deduced): const QPointF *last = points + pointCount; | - |
62 | qreal minx, maxx, miny, maxy; executed (the execution status of this line is deduced): qreal minx, maxx, miny, maxy; | - |
63 | minx = maxx = e->x(); executed (the execution status of this line is deduced): minx = maxx = e->x(); | - |
64 | miny = maxy = e->y(); executed (the execution status of this line is deduced): miny = maxy = e->y(); | - |
65 | while (++e < last) { evaluated: ++e < last yes Evaluation Count:1092545 | yes Evaluation Count:136931 |
| 136931-1092545 |
66 | if (e->x() < minx) evaluated: e->x() < minx yes Evaluation Count:147928 | yes Evaluation Count:944617 |
| 147928-944617 |
67 | minx = e->x(); executed: minx = e->x(); Execution Count:147928 | 147928 |
68 | else if (e->x() > maxx) evaluated: e->x() > maxx yes Evaluation Count:224539 | yes Evaluation Count:720078 |
| 224539-720078 |
69 | maxx = e->x(); executed: maxx = e->x(); Execution Count:224539 | 224539 |
70 | if (e->y() < miny) evaluated: e->y() < miny yes Evaluation Count:117340 | yes Evaluation Count:975205 |
| 117340-975205 |
71 | miny = e->y(); executed: miny = e->y(); Execution Count:117340 | 117340 |
72 | else if (e->y() > maxy) evaluated: e->y() > maxy yes Evaluation Count:210729 | yes Evaluation Count:764476 |
| 210729-764476 |
73 | maxy = e->y(); executed: maxy = e->y(); Execution Count:210729 | 210729 |
74 | } | - |
75 | return QRectF(QPointF(minx, miny), QPointF(maxx, maxy)); executed: return QRectF(QPointF(minx, miny), QPointF(maxx, maxy)); Execution Count:136931 | 136931 |
76 | } | - |
77 | | - |
78 | void QOutlineMapper::curveTo(const QPointF &cp1, const QPointF &cp2, const QPointF &ep) { | - |
79 | #ifdef QT_DEBUG_CONVERT | - |
80 | printf("QOutlineMapper::curveTo() (%f, %f)\n", ep.x(), ep.y()); | - |
81 | #endif | - |
82 | | - |
83 | QBezier bezier = QBezier::fromPoints(m_elements.last(), cp1, cp2, ep); executed (the execution status of this line is deduced): QBezier bezier = QBezier::fromPoints(m_elements.last(), cp1, cp2, ep); | - |
84 | bezier.addToPolygon(m_elements, m_curve_threshold); executed (the execution status of this line is deduced): bezier.addToPolygon(m_elements, m_curve_threshold); | - |
85 | m_element_types.reserve(m_elements.size()); executed (the execution status of this line is deduced): m_element_types.reserve(m_elements.size()); | - |
86 | for (int i = m_elements.size() - m_element_types.size(); i; --i) evaluated: i yes Evaluation Count:232172 | yes Evaluation Count:11216 |
| 11216-232172 |
87 | m_element_types << QPainterPath::LineToElement; executed: m_element_types << QPainterPath::LineToElement; Execution Count:232172 | 232172 |
88 | Q_ASSERT(m_elements.size() == m_element_types.size()); executed (the execution status of this line is deduced): qt_noop(); | - |
89 | } executed: } Execution Count:11216 | 11216 |
90 | | - |
91 | | - |
92 | QT_FT_Outline *QOutlineMapper::convertPath(const QPainterPath &path) | - |
93 | { | - |
94 | Q_ASSERT(!path.isEmpty()); executed (the execution status of this line is deduced): qt_noop(); | - |
95 | int elmCount = path.elementCount(); executed (the execution status of this line is deduced): int elmCount = path.elementCount(); | - |
96 | #ifdef QT_DEBUG_CONVERT | - |
97 | printf("QOutlineMapper::convertPath(), size=%d\n", elmCount); | - |
98 | #endif | - |
99 | beginOutline(path.fillRule()); executed (the execution status of this line is deduced): beginOutline(path.fillRule()); | - |
100 | | - |
101 | for (int index=0; index<elmCount; ++index) { evaluated: index<elmCount yes Evaluation Count:40 | yes Evaluation Count:8 |
| 8-40 |
102 | const QPainterPath::Element &elm = path.elementAt(index); executed (the execution status of this line is deduced): const QPainterPath::Element &elm = path.elementAt(index); | - |
103 | | - |
104 | switch (elm.type) { | - |
105 | | - |
106 | case QPainterPath::MoveToElement: | - |
107 | if (index == elmCount - 1) partially evaluated: index == elmCount - 1 no Evaluation Count:0 | yes Evaluation Count:8 |
| 0-8 |
108 | continue; never executed: continue; | 0 |
109 | moveTo(elm); executed (the execution status of this line is deduced): moveTo(elm); | - |
110 | break; executed: break; Execution Count:8 | 8 |
111 | | - |
112 | case QPainterPath::LineToElement: | - |
113 | lineTo(elm); executed (the execution status of this line is deduced): lineTo(elm); | - |
114 | break; executed: break; Execution Count:32 | 32 |
115 | | - |
116 | case QPainterPath::CurveToElement: | - |
117 | curveTo(elm, path.elementAt(index + 1), path.elementAt(index + 2)); never executed (the execution status of this line is deduced): curveTo(elm, path.elementAt(index + 1), path.elementAt(index + 2)); | - |
118 | index += 2; never executed (the execution status of this line is deduced): index += 2; | - |
119 | break; | 0 |
120 | | - |
121 | default: | - |
122 | break; // This will never hit.. | 0 |
123 | } | - |
124 | } executed: } Execution Count:40 | 40 |
125 | | - |
126 | endOutline(); executed (the execution status of this line is deduced): endOutline(); | - |
127 | return outline(); executed: return outline(); Execution Count:8 | 8 |
128 | } | - |
129 | | - |
130 | QT_FT_Outline *QOutlineMapper::convertPath(const QVectorPath &path) | - |
131 | { | - |
132 | int count = path.elementCount(); executed (the execution status of this line is deduced): int count = path.elementCount(); | - |
133 | | - |
134 | #ifdef QT_DEBUG_CONVERT | - |
135 | printf("QOutlineMapper::convertPath(VP), size=%d\n", count); | - |
136 | #endif | - |
137 | beginOutline(path.hasWindingFill() ? Qt::WindingFill : Qt::OddEvenFill); executed (the execution status of this line is deduced): beginOutline(path.hasWindingFill() ? Qt::WindingFill : Qt::OddEvenFill); | - |
138 | | - |
139 | if (path.elements()) { evaluated: path.elements() yes Evaluation Count:135228 | yes Evaluation Count:858 |
| 858-135228 |
140 | // TODO: if we do closing of subpaths in convertElements instead we | - |
141 | // could avoid this loop | - |
142 | const QPainterPath::ElementType *elements = path.elements(); executed (the execution status of this line is deduced): const QPainterPath::ElementType *elements = path.elements(); | - |
143 | const QPointF *points = reinterpret_cast<const QPointF *>(path.points()); executed (the execution status of this line is deduced): const QPointF *points = reinterpret_cast<const QPointF *>(path.points()); | - |
144 | | - |
145 | for (int index = 0; index < count; ++index) { evaluated: index < count yes Evaluation Count:899189 | yes Evaluation Count:135228 |
| 135228-899189 |
146 | switch (elements[index]) { | - |
147 | case QPainterPath::MoveToElement: | - |
148 | if (index == count - 1) partially evaluated: index == count - 1 no Evaluation Count:0 | yes Evaluation Count:219198 |
| 0-219198 |
149 | continue; never executed: continue; | 0 |
150 | moveTo(points[index]); executed (the execution status of this line is deduced): moveTo(points[index]); | - |
151 | break; executed: break; Execution Count:219198 | 219198 |
152 | | - |
153 | case QPainterPath::LineToElement: | - |
154 | lineTo(points[index]); executed (the execution status of this line is deduced): lineTo(points[index]); | - |
155 | break; executed: break; Execution Count:668775 | 668775 |
156 | | - |
157 | case QPainterPath::CurveToElement: | - |
158 | curveTo(points[index], points[index+1], points[index+2]); executed (the execution status of this line is deduced): curveTo(points[index], points[index+1], points[index+2]); | - |
159 | index += 2; executed (the execution status of this line is deduced): index += 2; | - |
160 | break; executed: break; Execution Count:11216 | 11216 |
161 | | - |
162 | default: | - |
163 | break; // This will never hit.. | 0 |
164 | } | - |
165 | } executed: } Execution Count:899189 | 899189 |
166 | | - |
167 | } else { executed: } Execution Count:135228 | 135228 |
168 | // ### We can kill this copying and just use the buffer straight... | - |
169 | | - |
170 | m_elements.resize(count); executed (the execution status of this line is deduced): m_elements.resize(count); | - |
171 | if (count) evaluated: count yes Evaluation Count:851 | yes Evaluation Count:7 |
| 7-851 |
172 | memcpy(m_elements.data(), path.points(), count* sizeof(QPointF)); executed: memcpy(m_elements.data(), path.points(), count* sizeof(QPointF)); Execution Count:851 | 851 |
173 | | - |
174 | m_element_types.resize(0); executed (the execution status of this line is deduced): m_element_types.resize(0); | - |
175 | } executed: } Execution Count:858 | 858 |
176 | | - |
177 | endOutline(); executed (the execution status of this line is deduced): endOutline(); | - |
178 | return outline(); executed: return outline(); Execution Count:136086 | 136086 |
179 | } | - |
180 | | - |
181 | | - |
182 | void QOutlineMapper::endOutline() | - |
183 | { | - |
184 | closeSubpath(); executed (the execution status of this line is deduced): closeSubpath(); | - |
185 | | - |
186 | if (m_elements.isEmpty()) { evaluated: m_elements.isEmpty() yes Evaluation Count:9 | yes Evaluation Count:136935 |
| 9-136935 |
187 | memset(&m_outline, 0, sizeof(m_outline)); executed (the execution status of this line is deduced): memset(&m_outline, 0, sizeof(m_outline)); | - |
188 | return; executed: return; Execution Count:9 | 9 |
189 | } | - |
190 | | - |
191 | QPointF *elements = m_elements.data(); executed (the execution status of this line is deduced): QPointF *elements = m_elements.data(); | - |
192 | | - |
193 | // Transform the outline | - |
194 | if (m_txop == QTransform::TxNone) { evaluated: m_txop == QTransform::TxNone yes Evaluation Count:100293 | yes Evaluation Count:36642 |
| 36642-100293 |
195 | // Nothing to do. | - |
196 | } else if (m_txop == QTransform::TxTranslate) { executed: } Execution Count:100293 evaluated: m_txop == QTransform::TxTranslate yes Evaluation Count:34630 | yes Evaluation Count:2012 |
| 2012-100293 |
197 | for (int i = 0; i < m_elements.size(); ++i) { evaluated: i < m_elements.size() yes Evaluation Count:503156 | yes Evaluation Count:34630 |
| 34630-503156 |
198 | QPointF &e = elements[i]; executed (the execution status of this line is deduced): QPointF &e = elements[i]; | - |
199 | e = QPointF(e.x() + m_dx, e.y() + m_dy); executed (the execution status of this line is deduced): e = QPointF(e.x() + m_dx, e.y() + m_dy); | - |
200 | } executed: } Execution Count:503156 | 503156 |
201 | } else if (m_txop == QTransform::TxScale) { executed: } Execution Count:34630 evaluated: m_txop == QTransform::TxScale yes Evaluation Count:29 | yes Evaluation Count:1983 |
| 29-34630 |
202 | for (int i = 0; i < m_elements.size(); ++i) { evaluated: i < m_elements.size() yes Evaluation Count:88091 | yes Evaluation Count:29 |
| 29-88091 |
203 | QPointF &e = elements[i]; executed (the execution status of this line is deduced): QPointF &e = elements[i]; | - |
204 | e = QPointF(m_m11 * e.x() + m_dx, m_m22 * e.y() + m_dy); executed (the execution status of this line is deduced): e = QPointF(m_m11 * e.x() + m_dx, m_m22 * e.y() + m_dy); | - |
205 | } executed: } Execution Count:88091 | 88091 |
206 | } else if (m_txop < QTransform::TxProject) { executed: } Execution Count:29 evaluated: m_txop < QTransform::TxProject yes Evaluation Count:1979 | yes Evaluation Count:4 |
| 4-1979 |
207 | for (int i = 0; i < m_elements.size(); ++i) { evaluated: i < m_elements.size() yes Evaluation Count:145581 | yes Evaluation Count:1979 |
| 1979-145581 |
208 | QPointF &e = elements[i]; executed (the execution status of this line is deduced): QPointF &e = elements[i]; | - |
209 | e = QPointF(m_m11 * e.x() + m_m21 * e.y() + m_dx, executed (the execution status of this line is deduced): e = QPointF(m_m11 * e.x() + m_m21 * e.y() + m_dx, | - |
210 | m_m22 * e.y() + m_m12 * e.x() + m_dy); executed (the execution status of this line is deduced): m_m22 * e.y() + m_m12 * e.x() + m_dy); | - |
211 | } executed: } Execution Count:145581 | 145581 |
212 | } else { executed: } Execution Count:1979 | 1979 |
213 | const QVectorPath vp((qreal *)elements, m_elements.size(), executed (the execution status of this line is deduced): const QVectorPath vp((qreal *)elements, m_elements.size(), | - |
214 | m_element_types.size() ? m_element_types.data() : 0); executed (the execution status of this line is deduced): m_element_types.size() ? m_element_types.data() : 0); | - |
215 | QPainterPath path = vp.convertToPainterPath(); executed (the execution status of this line is deduced): QPainterPath path = vp.convertToPainterPath(); | - |
216 | path = QTransform(m_m11, m_m12, m_m13, m_m21, m_m22, m_m23, m_dx, m_dy, m_m33).map(path); executed (the execution status of this line is deduced): path = QTransform(m_m11, m_m12, m_m13, m_m21, m_m22, m_m23, m_dx, m_dy, m_m33).map(path); | - |
217 | if (!(m_outline.flags & QT_FT_OUTLINE_EVEN_ODD_FILL)) partially evaluated: !(m_outline.flags & 0x2) no Evaluation Count:0 | yes Evaluation Count:4 |
| 0-4 |
218 | path.setFillRule(Qt::WindingFill); never executed: path.setFillRule(Qt::WindingFill); | 0 |
219 | uint old_txop = m_txop; executed (the execution status of this line is deduced): uint old_txop = m_txop; | - |
220 | m_txop = QTransform::TxNone; executed (the execution status of this line is deduced): m_txop = QTransform::TxNone; | - |
221 | if (path.isEmpty()) partially evaluated: path.isEmpty() no Evaluation Count:0 | yes Evaluation Count:4 |
| 0-4 |
222 | m_valid = false; never executed: m_valid = false; | 0 |
223 | else | - |
224 | convertPath(path); executed: convertPath(path); Execution Count:4 | 4 |
225 | m_txop = old_txop; executed (the execution status of this line is deduced): m_txop = old_txop; | - |
226 | return; executed: return; Execution Count:4 | 4 |
227 | } | - |
228 | | - |
229 | controlPointRect = boundingRect(elements, m_elements.size()); executed (the execution status of this line is deduced): controlPointRect = boundingRect(elements, m_elements.size()); | - |
230 | | - |
231 | #ifdef QT_DEBUG_CONVERT | - |
232 | printf(" - control point rect (%.2f, %.2f) %.2f x %.2f, clip=(%d,%d, %dx%d)\n", | - |
233 | controlPointRect.x(), controlPointRect.y(), | - |
234 | controlPointRect.width(), controlPointRect.height(), | - |
235 | m_clip_rect.x(), m_clip_rect.y(), m_clip_rect.width(), m_clip_rect.height()); | - |
236 | #endif | - |
237 | | - |
238 | | - |
239 | // Check for out of dev bounds... | - |
240 | const bool do_clip = !m_in_clip_elements && ((controlPointRect.left() < -QT_RASTER_COORD_LIMIT partially evaluated: !m_in_clip_elements yes Evaluation Count:136931 | no Evaluation Count:0 |
partially evaluated: controlPointRect.left() < -QT_RASTER_COORD_LIMIT no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
241 | || controlPointRect.right() > QT_RASTER_COORD_LIMIT partially evaluated: controlPointRect.right() > QT_RASTER_COORD_LIMIT no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
242 | || controlPointRect.top() < -QT_RASTER_COORD_LIMIT partially evaluated: controlPointRect.top() < -QT_RASTER_COORD_LIMIT no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
243 | || controlPointRect.bottom() > QT_RASTER_COORD_LIMIT partially evaluated: controlPointRect.bottom() > QT_RASTER_COORD_LIMIT no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
244 | || controlPointRect.width() > QT_RASTER_COORD_LIMIT partially evaluated: controlPointRect.width() > QT_RASTER_COORD_LIMIT no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
245 | || controlPointRect.height() > QT_RASTER_COORD_LIMIT)); partially evaluated: controlPointRect.height() > QT_RASTER_COORD_LIMIT no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
246 | | - |
247 | if (do_clip) { partially evaluated: do_clip no Evaluation Count:0 | yes Evaluation Count:136931 |
| 0-136931 |
248 | clipElements(elements, elementTypes(), m_elements.size()); never executed (the execution status of this line is deduced): clipElements(elements, elementTypes(), m_elements.size()); | - |
249 | } else { | 0 |
250 | convertElements(elements, elementTypes(), m_elements.size()); executed (the execution status of this line is deduced): convertElements(elements, elementTypes(), m_elements.size()); | - |
251 | } executed: } Execution Count:136931 | 136931 |
252 | } | - |
253 | | - |
254 | void QOutlineMapper::convertElements(const QPointF *elements, | - |
255 | const QPainterPath::ElementType *types, | - |
256 | int element_count) | - |
257 | { | - |
258 | | - |
259 | if (types) { evaluated: types yes Evaluation Count:136080 | yes Evaluation Count:851 |
| 851-136080 |
260 | // Translate into FT coords | - |
261 | const QPointF *e = elements; executed (the execution status of this line is deduced): const QPointF *e = elements; | - |
262 | for (int i=0; i<element_count; ++i) { evaluated: i<element_count yes Evaluation Count:1225147 | yes Evaluation Count:136080 |
| 136080-1225147 |
263 | switch (*types) { | - |
264 | case QPainterPath::MoveToElement: | - |
265 | { | - |
266 | QT_FT_Vector pt_fixed = { qreal_to_fixed_26_6(e->x()), executed (the execution status of this line is deduced): QT_FT_Vector pt_fixed = { (int(e->x() * 64)), | - |
267 | qreal_to_fixed_26_6(e->y()) }; executed (the execution status of this line is deduced): (int(e->y() * 64)) }; | - |
268 | if (i != 0) evaluated: i != 0 yes Evaluation Count:83972 | yes Evaluation Count:136080 |
| 83972-136080 |
269 | m_contours << m_points.size() - 1; executed: m_contours << m_points.size() - 1; Execution Count:83972 | 83972 |
270 | m_points << pt_fixed; executed (the execution status of this line is deduced): m_points << pt_fixed; | - |
271 | m_tags << QT_FT_CURVE_TAG_ON; executed (the execution status of this line is deduced): m_tags << 1; | - |
272 | } | - |
273 | break; executed: break; Execution Count:220052 | 220052 |
274 | | - |
275 | case QPainterPath::LineToElement: | - |
276 | { | - |
277 | QT_FT_Vector pt_fixed = { qreal_to_fixed_26_6(e->x()), executed (the execution status of this line is deduced): QT_FT_Vector pt_fixed = { (int(e->x() * 64)), | - |
278 | qreal_to_fixed_26_6(e->y()) }; executed (the execution status of this line is deduced): (int(e->y() * 64)) }; | - |
279 | m_points << pt_fixed; executed (the execution status of this line is deduced): m_points << pt_fixed; | - |
280 | m_tags << QT_FT_CURVE_TAG_ON; executed (the execution status of this line is deduced): m_tags << 1; | - |
281 | } | - |
282 | break; executed: break; Execution Count:1005095 | 1005095 |
283 | | - |
284 | case QPainterPath::CurveToElement: | - |
285 | { | - |
286 | QT_FT_Vector cp1_fixed = { qreal_to_fixed_26_6(e->x()), never executed (the execution status of this line is deduced): QT_FT_Vector cp1_fixed = { (int(e->x() * 64)), | - |
287 | qreal_to_fixed_26_6(e->y()) }; never executed (the execution status of this line is deduced): (int(e->y() * 64)) }; | - |
288 | ++e; never executed (the execution status of this line is deduced): ++e; | - |
289 | QT_FT_Vector cp2_fixed = { qreal_to_fixed_26_6((e)->x()), never executed (the execution status of this line is deduced): QT_FT_Vector cp2_fixed = { (int((e)->x() * 64)), | - |
290 | qreal_to_fixed_26_6((e)->y()) }; never executed (the execution status of this line is deduced): (int((e)->y() * 64)) }; | - |
291 | ++e; never executed (the execution status of this line is deduced): ++e; | - |
292 | QT_FT_Vector ep_fixed = { qreal_to_fixed_26_6((e)->x()), never executed (the execution status of this line is deduced): QT_FT_Vector ep_fixed = { (int((e)->x() * 64)), | - |
293 | qreal_to_fixed_26_6((e)->y()) }; never executed (the execution status of this line is deduced): (int((e)->y() * 64)) }; | - |
294 | | - |
295 | m_points << cp1_fixed << cp2_fixed << ep_fixed; never executed (the execution status of this line is deduced): m_points << cp1_fixed << cp2_fixed << ep_fixed; | - |
296 | m_tags << QT_FT_CURVE_TAG_CUBIC never executed (the execution status of this line is deduced): m_tags << 2 | - |
297 | << QT_FT_CURVE_TAG_CUBIC never executed (the execution status of this line is deduced): << 2 | - |
298 | << QT_FT_CURVE_TAG_ON; never executed (the execution status of this line is deduced): << 1; | - |
299 | | - |
300 | types += 2; never executed (the execution status of this line is deduced): types += 2; | - |
301 | i += 2; never executed (the execution status of this line is deduced): i += 2; | - |
302 | } | - |
303 | break; | 0 |
304 | default: | - |
305 | break; | 0 |
306 | } | - |
307 | ++types; executed (the execution status of this line is deduced): ++types; | - |
308 | ++e; executed (the execution status of this line is deduced): ++e; | - |
309 | } executed: } Execution Count:1225147 | 1225147 |
310 | } else { executed: } Execution Count:136080 | 136080 |
311 | // Plain polygon... | - |
312 | const QPointF *last = elements + element_count; executed (the execution status of this line is deduced): const QPointF *last = elements + element_count; | - |
313 | const QPointF *e = elements; executed (the execution status of this line is deduced): const QPointF *e = elements; | - |
314 | while (e < last) { evaluated: e < last yes Evaluation Count:4329 | yes Evaluation Count:851 |
| 851-4329 |
315 | QT_FT_Vector pt_fixed = { qreal_to_fixed_26_6(e->x()), executed (the execution status of this line is deduced): QT_FT_Vector pt_fixed = { (int(e->x() * 64)), | - |
316 | qreal_to_fixed_26_6(e->y()) }; executed (the execution status of this line is deduced): (int(e->y() * 64)) }; | - |
317 | m_points << pt_fixed; executed (the execution status of this line is deduced): m_points << pt_fixed; | - |
318 | m_tags << QT_FT_CURVE_TAG_ON; executed (the execution status of this line is deduced): m_tags << 1; | - |
319 | ++e; executed (the execution status of this line is deduced): ++e; | - |
320 | } executed: } Execution Count:4329 | 4329 |
321 | } executed: } Execution Count:851 | 851 |
322 | | - |
323 | // close the very last subpath | - |
324 | m_contours << m_points.size() - 1; executed (the execution status of this line is deduced): m_contours << m_points.size() - 1; | - |
325 | | - |
326 | m_outline.n_contours = m_contours.size(); executed (the execution status of this line is deduced): m_outline.n_contours = m_contours.size(); | - |
327 | m_outline.n_points = m_points.size(); executed (the execution status of this line is deduced): m_outline.n_points = m_points.size(); | - |
328 | | - |
329 | m_outline.points = m_points.data(); executed (the execution status of this line is deduced): m_outline.points = m_points.data(); | - |
330 | m_outline.tags = m_tags.data(); executed (the execution status of this line is deduced): m_outline.tags = m_tags.data(); | - |
331 | m_outline.contours = m_contours.data(); executed (the execution status of this line is deduced): m_outline.contours = m_contours.data(); | - |
332 | | - |
333 | #ifdef QT_DEBUG_CONVERT | - |
334 | printf("QOutlineMapper::endOutline\n"); | - |
335 | | - |
336 | printf(" - contours: %d\n", m_outline.n_contours); | - |
337 | for (int i=0; i<m_outline.n_contours; ++i) { | - |
338 | printf(" - %d\n", m_outline.contours[i]); | - |
339 | } | - |
340 | | - |
341 | printf(" - points: %d\n", m_outline.n_points); | - |
342 | for (int i=0; i<m_outline.n_points; ++i) { | - |
343 | printf(" - %d -- %.2f, %.2f, (%d, %d)\n", i, | - |
344 | (double) (m_outline.points[i].x / 64.0), | - |
345 | (double) (m_outline.points[i].y / 64.0), | - |
346 | (int) m_outline.points[i].x, (int) m_outline.points[i].y); | - |
347 | } | - |
348 | #endif | - |
349 | } executed: } Execution Count:136931 | 136931 |
350 | | - |
351 | void QOutlineMapper::clipElements(const QPointF *elements, | - |
352 | const QPainterPath::ElementType *types, | - |
353 | int element_count) | - |
354 | { | - |
355 | // We could save a bit of time by actually implementing them fully | - |
356 | // instead of going through convenience functionallity, but since | - |
357 | // this part of code hardly every used, it shouldn't matter. | - |
358 | | - |
359 | m_in_clip_elements = true; never executed (the execution status of this line is deduced): m_in_clip_elements = true; | - |
360 | | - |
361 | QPainterPath path; never executed (the execution status of this line is deduced): QPainterPath path; | - |
362 | | - |
363 | if (!(m_outline.flags & QT_FT_OUTLINE_EVEN_ODD_FILL)) never evaluated: !(m_outline.flags & 0x2) | 0 |
364 | path.setFillRule(Qt::WindingFill); never executed: path.setFillRule(Qt::WindingFill); | 0 |
365 | | - |
366 | if (types) { | 0 |
367 | for (int i=0; i<element_count; ++i) { never evaluated: i<element_count | 0 |
368 | switch (types[i]) { | - |
369 | case QPainterPath::MoveToElement: | - |
370 | path.moveTo(elements[i]); never executed (the execution status of this line is deduced): path.moveTo(elements[i]); | - |
371 | break; | 0 |
372 | | - |
373 | case QPainterPath::LineToElement: | - |
374 | path.lineTo(elements[i]); never executed (the execution status of this line is deduced): path.lineTo(elements[i]); | - |
375 | break; | 0 |
376 | | - |
377 | case QPainterPath::CurveToElement: | - |
378 | path.cubicTo(elements[i], elements[i+1], elements[i+2]); never executed (the execution status of this line is deduced): path.cubicTo(elements[i], elements[i+1], elements[i+2]); | - |
379 | i += 2; never executed (the execution status of this line is deduced): i += 2; | - |
380 | break; | 0 |
381 | default: | - |
382 | break; | 0 |
383 | } | - |
384 | } | 0 |
385 | } else { | 0 |
386 | path.moveTo(elements[0]); never executed (the execution status of this line is deduced): path.moveTo(elements[0]); | - |
387 | for (int i=1; i<element_count; ++i) never evaluated: i<element_count | 0 |
388 | path.lineTo(elements[i]); never executed: path.lineTo(elements[i]); | 0 |
389 | } | 0 |
390 | | - |
391 | QPainterPath clipPath; never executed (the execution status of this line is deduced): QPainterPath clipPath; | - |
392 | clipPath.addRect(m_clip_rect); never executed (the execution status of this line is deduced): clipPath.addRect(m_clip_rect); | - |
393 | QPainterPath clippedPath = path.intersected(clipPath); never executed (the execution status of this line is deduced): QPainterPath clippedPath = path.intersected(clipPath); | - |
394 | uint old_txop = m_txop; never executed (the execution status of this line is deduced): uint old_txop = m_txop; | - |
395 | m_txop = QTransform::TxNone; never executed (the execution status of this line is deduced): m_txop = QTransform::TxNone; | - |
396 | if (clippedPath.isEmpty()) never evaluated: clippedPath.isEmpty() | 0 |
397 | m_valid = false; never executed: m_valid = false; | 0 |
398 | else | - |
399 | convertPath(clippedPath); never executed: convertPath(clippedPath); | 0 |
400 | m_txop = old_txop; never executed (the execution status of this line is deduced): m_txop = old_txop; | - |
401 | | - |
402 | m_in_clip_elements = false; never executed (the execution status of this line is deduced): m_in_clip_elements = false; | - |
403 | } | 0 |
404 | | - |
405 | QT_END_NAMESPACE | - |
406 | | - |
| | |