19#include <QtGui/private/qtguiglobal_p.h>
20#include "QtGui/qpainterpath.h"
21#include "private/qdatabuffer_p.h"
22#include "private/qnumeric_p.h"
28#if defined QFIXED_IS_26_6
30#define qt_real_to_fixed(real) qfixed(real * 64
)
31#define qt_int_to_fixed(real) qfixed(int(real) << 6
)
32#define qt_fixed_to_real(fixed) qreal(fixed / qreal(64
))
33#define qt_fixed_to_int(fixed) int(fixed >> 6
)
39 bool operator==(
const qfixed2d &other)
const {
return x == other.x && y == other.y; }
41#elif defined QFIXED_IS_32_32
43#define qt_real_to_fixed(real) qfixed(real * double(qint64(1
) << 32
))
44#define qt_fixed_to_real(fixed) qreal(fixed / double(qint64(1
) << 32
))
50 bool operator==(
const qfixed2d &other)
const {
return x == other.x && y == other.y; }
52#elif defined QFIXED_IS_16_16
54#define qt_real_to_fixed(real) qfixed(real * qreal(1
<< 16
))
55#define qt_fixed_to_real(fixed) qreal(fixed / qreal(1
<< 16
))
61 bool operator==(
const qfixed2d &other)
const {
return x == other.x && y == other.y; }
65#define qt_real_to_fixed(real) qfixed(real)
66#define qt_fixed_to_real(fixed) fixed
74 && qFuzzyCompare(
y, other
.y); }
78#define QT_PATH_KAPPA 0.5522847498
81 QPointF *controlPoints,
int *point_count);
99 QPainterPath::ElementType type;
103 inline bool isMoveTo()
const {
return type == QPainterPath::MoveToElement; }
104 inline bool isLineTo()
const {
return type == QPainterPath::LineToElement; }
105 inline bool isCurveTo()
const {
return type == QPainterPath::CurveToElement; }
107 operator qfixed2d () { qfixed2d pt = { x, y };
return pt; }
111 virtual ~QStrokerOps();
113 void setMoveToHook(qStrokerMoveToHook moveToHook) { m_moveTo = moveToHook; }
114 void setLineToHook(qStrokerLineToHook lineToHook) { m_lineTo = lineToHook; }
115 void setCubicToHook(qStrokerCubicToHook cubicToHook) { m_cubicTo = cubicToHook; }
117 virtual void begin(
void *customData);
120 inline void moveTo(qfixed x, qfixed y);
121 inline void lineTo(qfixed x, qfixed y);
122 inline void cubicTo(qfixed x1, qfixed y1, qfixed x2, qfixed y2, qfixed ex, qfixed ey);
124 void strokePath(
const QPainterPath &path,
void *data,
const QTransform &matrix);
125 void strokePolygon(
const QPointF *points,
int pointCount,
bool implicit_close,
126 void *data,
const QTransform &matrix);
127 void strokeEllipse(
const QRectF &ellipse,
void *data,
const QTransform &matrix);
129 QRectF clipRect()
const {
return m_clip_rect; }
130 void setClipRect(
const QRectF &clip) { m_clip_rect = clip; }
132 void setCurveThresholdFromTransform(
const QTransform &transform)
135 qt_scaleForTransform(transform, &scale);
136 m_dashThreshold = scale == 0 ? qreal(0.5) : (qreal(0.5) / scale);
139 void setCurveThreshold(qfixed threshold) { m_curveThreshold = threshold; }
140 qfixed curveThreshold()
const {
return m_curveThreshold; }
143 inline void emitMoveTo(qfixed x, qfixed y);
144 inline void emitLineTo(qfixed x, qfixed y);
145 inline void emitCubicTo(qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey);
147 virtual void processCurrentSubpath() = 0;
148 QDataBuffer<Element> m_elements;
151 qfixed m_curveThreshold;
152 qfixed m_dashThreshold;
155 qStrokerMoveToHook m_moveTo;
156 qStrokerLineToHook m_lineTo;
157 qStrokerCubicToHook m_cubicTo;
177 void setStrokeWidth(qfixed width)
179 m_strokeWidth = width;
182 qfixed strokeWidth()
const {
return m_strokeWidth; }
184 void setCapStyle(Qt::PenCapStyle capStyle) { m_capStyle = joinModeForCap(capStyle); }
185 Qt::PenCapStyle capStyle()
const {
return capForJoinMode(m_capStyle); }
186 LineJoinMode capStyleMode()
const {
return m_capStyle; }
188 void setJoinStyle(Qt::PenJoinStyle style) { m_joinStyle = joinModeForJoin(style); }
189 Qt::PenJoinStyle joinStyle()
const {
return joinForJoinMode(m_joinStyle); }
190 LineJoinMode joinStyleMode()
const {
return m_joinStyle; }
192 void setMiterLimit(qfixed length) { m_miterLimit = length; }
193 qfixed miterLimit()
const {
return m_miterLimit; }
195 void setForceOpen(
bool state) { m_forceOpen = state; }
196 bool forceOpen()
const {
return m_forceOpen; }
198 void joinPoints(qfixed x, qfixed y,
const QLineF &nextLine, LineJoinMode join);
199 inline void emitMoveTo(qfixed x, qfixed y);
200 inline void emitLineTo(qfixed x, qfixed y);
201 inline void emitCubicTo(qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey);
204 static Qt::PenCapStyle capForJoinMode(LineJoinMode mode);
205 static LineJoinMode joinModeForCap(Qt::PenCapStyle);
207 static Qt::PenJoinStyle joinForJoinMode(LineJoinMode mode);
208 static LineJoinMode joinModeForJoin(Qt::PenJoinStyle joinStyle);
210 void processCurrentSubpath() override;
212 qfixed m_strokeWidth;
215 LineJoinMode m_capStyle;
216 LineJoinMode m_joinStyle;
230 QDashStroker(QStroker *stroker);
233 QStroker *stroker()
const {
return m_stroker; }
235 static QList<qfixed> patternForStyle(Qt::PenStyle style);
236 static int repetitionLimit() {
return 10000; }
238 void setDashPattern(
const QList<qfixed> &dashPattern) { m_dashPattern = dashPattern; }
239 QList<qfixed> dashPattern()
const {
return m_dashPattern; }
241 void setDashOffset(qreal offset) { m_dashOffset = offset; }
242 qreal dashOffset()
const {
return m_dashOffset; }
244 void begin(
void *data) override;
247 inline void setStrokeWidth(qreal width) { m_stroke_width = width; }
248 inline void setMiterLimit(qreal limit) { m_miter_limit = limit; }
251 void processCurrentSubpath() override;
254 QList<qfixed> m_dashPattern;
257 qreal m_stroke_width;
263
264
266inline void QStrokerOps::emitMoveTo(qfixed x, qfixed y)
269 m_moveTo(x, y, m_customData);
272inline void QStrokerOps::emitLineTo(qfixed x, qfixed y)
275 m_lineTo(x, y, m_customData);
278inline void QStrokerOps::emitCubicTo(qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey)
281 m_cubicTo(c1x, c1y, c2x, c2y, ex, ey, m_customData);
284inline void QStrokerOps::moveTo(qfixed x, qfixed y)
286 if (m_elements.size()>1)
287 processCurrentSubpath();
289 Element e = { QPainterPath::MoveToElement, x, y };
293inline void QStrokerOps::lineTo(qfixed x, qfixed y)
295 Element e = { QPainterPath::LineToElement, x, y };
299inline void QStrokerOps::cubicTo(qfixed x1, qfixed y1, qfixed x2, qfixed y2, qfixed ex, qfixed ey)
301 Element c1 = { QPainterPath::CurveToElement, x1, y1 };
302 Element c2 = { QPainterPath::CurveToDataElement, x2, y2 };
303 Element e = { QPainterPath::CurveToDataElement, ex, ey };
310
311
312inline void QStroker::emitMoveTo(qfixed x, qfixed y)
318 QStrokerOps::emitMoveTo(x, y);
321inline void QStroker::emitLineTo(qfixed x, qfixed y)
327 QStrokerOps::emitLineTo(x, y);
330inline void QStroker::emitCubicTo(qfixed c1x, qfixed c1y,
331 qfixed c2x, qfixed c2y,
332 qfixed ex, qfixed ey)
334 if (c2x == ex && c2y == ey) {
335 if (c1x == ex && c1y == ey) {
348 QStrokerOps::emitCubicTo(c1x, c1y, c2x, c2y, ex, ey);
352
353
354inline void QDashStroker::begin(
void *data)
357 m_stroker->begin(data);
358 QStrokerOps::begin(data);
361inline void QDashStroker::end()
Combined button and popup list for selecting options.
Q_GUI_EXPORT bool qt_scaleForTransform(const QTransform &transform, qreal *scale)
static void qpaintengineex_cubicTo(qreal c1x, qreal c1y, qreal c2x, qreal c2y, qreal ex, qreal ey, void *data)
static const QPainterPath::ElementType qpaintengineex_ellipse_types[]
static const QPainterPath::ElementType qpaintengineex_rect4_types_32[]
QDebug Q_GUI_EXPORT & operator<<(QDebug &s, const QVectorPath &path)
const QVectorPath & qtVectorPathForPath(const QPainterPath &path)
static void qpaintengineex_lineTo(qreal x, qreal y, void *data)
#define QT_MAX_CACHED_GLYPH_SIZE
static const QPainterPath::ElementType qpaintengineex_roundedrect_types[]
static const QPainterPath::ElementType qpaintengineex_line_types_16[]
static void qpaintengineex_moveTo(qreal x, qreal y, void *data)
void(* qStrokerCubicToHook)(qfixed c1x, qfixed c1y, qfixed c2x, qfixed c2y, qfixed ex, qfixed ey, void *data)
void(* qStrokerLineToHook)(qfixed x, qfixed y, void *data)
QPointF qt_curves_for_arc(const QRectF &rect, qreal startAngle, qreal sweepLength, QPointF *controlPoints, int *point_count)
void(* qStrokerMoveToHook)(qfixed x, qfixed y, void *data)
qreal qt_t_for_arc_angle(qreal angle)
#define qt_fixed_to_real(fixed)
#define qt_real_to_fixed(real)
QT_BEGIN_NAMESPACE typedef qreal qfixed
StrokeHandler(int reserve)
QDataBuffer< QPainterPath::ElementType > types
bool operator==(const qfixed2d &other) const