4#ifndef QTRIANGULATINGSTROKER_P_H
5#define QTRIANGULATINGSTROKER_P_H
18#include <QtCore/qmath.h>
19#include <QtGui/private/qtguiglobal_p.h>
20#include <private/qdatabuffer_p.h>
21#include <qvarlengtharray.h>
22#include <private/qvectorpath_p.h>
23#include <private/qbezier_p.h>
24#include <private/qnumeric_p.h>
25#include <private/qmath_p.h>
32 QTriangulatingStroker() : m_vertices(0), m_cx(0), m_cy(0), m_nvx(0), m_nvy(0), m_width(1), m_miter_limit(2),
33 m_roundness(0), m_sin_theta(0), m_cos_theta(0), m_inv_scale(1), m_curvyness_mul(1), m_curvyness_add(0),
34 m_join_style(Qt::BevelJoin), m_cap_style(Qt::SquareCap) {}
36 void process(
const QVectorPath &path,
const QPen &pen,
const QRectF &clip, QPainter::RenderHints hints);
38 inline int vertexCount()
const {
return m_vertices.size(); }
39 inline const float *vertices()
const {
return m_vertices.data(); }
41 inline void setInvScale(qreal invScale) { m_inv_scale = invScale; }
44 inline void emitLineSegment(
float x,
float y,
float nx,
float ny);
45 void moveTo(
const qreal *pts);
46 inline void lineTo(
const qreal *pts);
47 void cubicTo(
const qreal *pts);
48 void join(
const qreal *pts);
49 inline void normalVector(
float x1,
float y1,
float x2,
float y2,
float *nx,
float *ny);
50 void endCap(
const qreal *pts);
51 void arcPoints(
float cx,
float cy,
float fromX,
float fromY,
float toX,
float toY, QVarLengthArray<
float> &points);
52 void endCapOrJoinClosed(
const qreal *start,
const qreal *cur,
bool implicitClose,
bool endsAtStart);
55 QDataBuffer<
float> m_vertices;
66 float m_curvyness_mul;
67 float m_curvyness_add;
69 Qt::PenJoinStyle m_join_style;
70 Qt::PenCapStyle m_cap_style;
76 QDashedStrokeProcessor();
78 void process(
const QVectorPath &path,
const QPen &pen,
const QRectF &clip, QPainter::RenderHints hints);
80 inline void addElement(QPainterPath::ElementType type, qreal x, qreal y) {
86 inline int elementCount()
const {
return m_types.size(); }
87 inline qreal *points()
const {
return m_points.data(); }
88 inline QPainterPath::ElementType *elementTypes()
const {
return m_types.data(); }
90 inline void setInvScale(qreal invScale) { m_inv_scale = invScale; }
93 QDataBuffer<qreal> m_points;
94 QDataBuffer<QPainterPath::ElementType> m_types;
95 QDashStroker m_dash_stroker;
99inline void QTriangulatingStroker::normalVector(
float x1,
float y1,
float x2,
float y2,
100 float *nx,
float *ny)
102 const float dx = x2 - x1;
103 const float dy = y2 - y1;
104 const float pw = m_width / qHypot(dx, dy);
110inline void QTriangulatingStroker::emitLineSegment(
float x,
float y,
float vx,
float vy)
112 m_vertices.add(x + vx);
113 m_vertices.add(y + vy);
114 m_vertices.add(x - vx);
115 m_vertices.add(y - vy);
118void QTriangulatingStroker::lineTo(
const qreal *pts)
120 emitLineSegment(pts[0], pts[1], m_nvx, m_nvy);
static void qdashprocessor_moveTo(qreal x, qreal y, void *data)
static void qdashprocessor_cubicTo(qreal, qreal, qreal, qreal, qreal, qreal, void *)
static void skipDuplicatePoints(const qreal **pts, const qreal *endPts)
static void qdashprocessor_lineTo(qreal x, qreal y, void *data)