13QSvgGlyph::QSvgGlyph(QChar unicode,
const QPainterPath &path, qreal horizAdvX)
14 : m_unicode(unicode), m_path(path), m_horizAdvX(horizAdvX)
20QSvgFont::QSvgFont(qreal horizAdvX)
21 : m_horizAdvX(horizAdvX)
26QString QSvgFont::familyName()
const
32void QSvgFont::addGlyph(QChar unicode,
const QPainterPath &path, qreal horizAdvX )
34 m_glyphs.insert(unicode, QSvgGlyph(unicode, path,
35 (horizAdvX==-1)?m_horizAdvX:horizAdvX));
38bool QSvgFont::addMissingGlyph(
const QPainterPath &path, qreal horizAdvX)
41 qWarning(
"The font already has a 'missing-glyph' element.");
44 m_missingGlyph.reset(
new QSvgGlyph(QChar(), path, (horizAdvX == -1) ? m_horizAdvX : horizAdvX));
49void QSvgFont::draw(QPainter *p,
const QPointF &point,
const QString &str,
50 qreal pixelSize, Qt::Alignment alignment)
const
52 draw_helper(p, point, str, pixelSize, alignment,
nullptr);
55QRectF QSvgFont::boundingRect(QPainter *p,
const QPointF &point,
const QString &str,
56 qreal pixelSize, Qt::Alignment alignment)
const
59 draw_helper(p, point, str, pixelSize, alignment, &bounds);
63void QSvgFont::draw_helper(QPainter *p,
const QPointF &point,
const QString &str, qreal pixelSize,
64 Qt::Alignment alignment, QRectF *boundingRect)
const
66 const bool isPainting = (boundingRect ==
nullptr);
70 p->scale(pixelSize / m_unitsPerEm, -pixelSize / m_unitsPerEm);
74 QString::const_iterator itr = str.constBegin();
75 for ( ; itr != str.constEnd(); ++itr) {
77 if (!m_glyphs.contains(*itr)) {
79 textWidth +=
static_cast<
int>(m_missingGlyph->m_horizAdvX);
82 textWidth +=
static_cast<
int>(m_glyphs[unicode].m_horizAdvX);
85 QPoint alignmentOffset(0, 0);
86 if (alignment == Qt::AlignHCenter) {
87 alignmentOffset.setX(-textWidth / 2);
88 }
else if (alignment == Qt::AlignRight) {
89 alignmentOffset.setX(-textWidth);
92 p->translate(alignmentOffset);
96 qreal penWidth = p->pen().widthF();
97 penWidth /= (pixelSize/m_unitsPerEm);
99 pen.setWidthF(penWidth);
102 itr = str.constBegin();
103 for ( ; itr != str.constEnd(); ++itr) {
104 QSvgGlyph foundGlyph;
105 QChar unicode = *itr;
106 if (m_glyphs.contains(*itr)) {
107 foundGlyph = m_glyphs[unicode];
111 foundGlyph = *m_missingGlyph;
115 p->drawPath(foundGlyph.m_path);
118 QPainterPathStroker stroker;
119 stroker.setWidth(penWidth);
120 stroker.setJoinStyle(p->pen().joinStyle());
121 stroker.setMiterLimit(p->pen().miterLimit());
122 QPainterPath stroke = stroker.createStroke(foundGlyph.m_path);
123 *boundingRect |= p->transform().map(stroke).boundingRect();
126 p->translate(foundGlyph.m_horizAdvX, 0);
132void QSvgFont::setFamilyName(
const QString &name)
137void QSvgFont::setUnitsPerEm(qreal upem)