1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt SVG 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 The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/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 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include "qsvgfont_p.h"
41
42#include "qpainter.h"
43#include "qpen.h"
44#include "qdebug.h"
45#include "qpicture.h"
46
47QT_BEGIN_NAMESPACE
48
49QSvgGlyph::QSvgGlyph(QChar unicode, const QPainterPath &path, qreal horizAdvX)
50 : m_unicode(unicode), m_path(path), m_horizAdvX(horizAdvX)
51{
52
53}
54
55
56QSvgFont::QSvgFont(qreal horizAdvX)
57 : m_horizAdvX(horizAdvX)
58{
59}
60
61
62QString QSvgFont::familyName() const
63{
64 return m_familyName;
65}
66
67
68void QSvgFont::addGlyph(QChar unicode, const QPainterPath &path, qreal horizAdvX )
69{
70 m_glyphs.insert(akey: unicode, avalue: QSvgGlyph(unicode, path,
71 (horizAdvX==-1)?m_horizAdvX:horizAdvX));
72}
73
74
75void QSvgFont::draw(QPainter *p, const QPointF &point, const QString &str, qreal pixelSize, Qt::Alignment alignment) const
76{
77 p->save();
78 p->translate(offset: point);
79 p->scale(sx: pixelSize / m_unitsPerEm, sy: -pixelSize / m_unitsPerEm);
80
81 // Calculate the text width to be used for alignment
82 int textWidth = 0;
83 QString::const_iterator itr = str.constBegin();
84 for ( ; itr != str.constEnd(); ++itr) {
85 QChar unicode = *itr;
86 if (!m_glyphs.contains(akey: *itr)) {
87 unicode = 0;
88 if (!m_glyphs.contains(akey: unicode))
89 continue;
90 }
91 textWidth += static_cast<int>(m_glyphs[unicode].m_horizAdvX);
92 }
93
94 QPoint alignmentOffset(0, 0);
95 if (alignment == Qt::AlignHCenter) {
96 alignmentOffset.setX(-textWidth / 2);
97 } else if (alignment == Qt::AlignRight) {
98 alignmentOffset.setX(-textWidth);
99 }
100
101 p->translate(offset: alignmentOffset);
102
103 // since in SVG the embedded font ain't really a path
104 // the outline has got to stay untransformed...
105 qreal penWidth = p->pen().widthF();
106 penWidth /= (pixelSize/m_unitsPerEm);
107 QPen pen = p->pen();
108 pen.setWidthF(penWidth);
109 p->setPen(pen);
110
111 itr = str.constBegin();
112 for ( ; itr != str.constEnd(); ++itr) {
113 QChar unicode = *itr;
114 if (!m_glyphs.contains(akey: *itr)) {
115 unicode = 0;
116 if (!m_glyphs.contains(akey: unicode))
117 continue;
118 }
119 p->drawPath(path: m_glyphs[unicode].m_path);
120 p->translate(dx: m_glyphs[unicode].m_horizAdvX, dy: 0);
121 }
122
123 p->restore();
124}
125
126void QSvgFont::setFamilyName(const QString &name)
127{
128 m_familyName = name;
129}
130
131void QSvgFont::setUnitsPerEm(qreal upem)
132{
133 m_unitsPerEm = upem;
134}
135
136QT_END_NAMESPACE
137

source code of qtsvg/src/svg/qsvgfont.cpp