Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qsgopenvgglyphnode.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
#
include
"qsgopenvgglyphnode_p.h"
5
#
include
"qopenvgcontext_p.h"
6
#
include
"qsgopenvgcontext_p.h"
7
#
include
"qsgopenvghelpers.h"
8
#
include
"qsgopenvgfontglyphcache.h"
9
#
include
"qopenvgoffscreensurface.h"
10
#
include
<
cmath
>
11
12
QT_BEGIN_NAMESPACE
13
14
QSGOpenVGGlyphNode::QSGOpenVGGlyphNode(QSGRenderContext *rc)
15
: m_geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 0)
16
, m_style(QQuickText::Normal)
17
, m_glyphCache(
nullptr
)
18
{
19
// Set Dummy material to avoid asserts
20
setMaterial((QSGMaterial*)1);
21
setGeometry(&m_geometry);
22
m_fontColorPaint = vgCreatePaint();
23
m_styleColorPaint = vgCreatePaint();
24
25
// Get handle to Glyph Cache
26
m_renderContext =
static_cast
<QSGOpenVGRenderContext*>(rc);
27
}
28
29
QSGOpenVGGlyphNode
::~
QSGOpenVGGlyphNode
()
30
{
31
if
(m_glyphCache)
32
m_glyphCache->release(m_glyphRun.glyphIndexes());
33
34
vgDestroyPaint(m_fontColorPaint);
35
vgDestroyPaint(m_styleColorPaint);
36
}
37
38
void
QSGOpenVGGlyphNode
::
setGlyphs
(
const
QPointF &position,
const
QGlyphRun &glyphs)
39
{
40
// Obtain glyph cache for font
41
auto
oldGlyphCache = m_glyphCache;
42
m_glyphCache = m_renderContext->glyphCache(glyphs.rawFont());
43
if
(m_glyphCache != oldGlyphCache) {
44
if
(oldGlyphCache)
45
oldGlyphCache->release(m_glyphRun.glyphIndexes());
46
}
47
m_glyphCache->populate(glyphs.glyphIndexes());
48
49
m_position = position;
50
m_glyphRun = glyphs;
51
m_bounding_rect = glyphs.boundingRect().translated(m_position - QPointF(0.0, glyphs.rawFont().ascent()));
52
53
// Recreate ajustments
54
m_xAdjustments.clear();
55
m_yAdjustments.clear();
56
57
for
(
int
i = 1; i < glyphs.positions().count(); ++i) {
58
m_xAdjustments.append(glyphs.positions().at(i).x() - glyphs.positions().at(i-1).x());
59
m_yAdjustments.append(glyphs.positions().at(i).y() - glyphs.positions().at(i-1).y());
60
}
61
}
62
63
void
QSGOpenVGGlyphNode
::
setColor
(
const
QColor &color)
64
{
65
m_color = color;
66
vgSetParameteri(m_fontColorPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
67
vgSetParameterfv(m_fontColorPaint, VG_PAINT_COLOR, 4, QSGOpenVGHelpers::qColorToVGColor(m_color,
opacity
()).constData());
68
}
69
70
void
QSGOpenVGGlyphNode
::
setStyle
(QQuickText::TextStyle style)
71
{
72
m_style = style;
73
}
74
75
void
QSGOpenVGGlyphNode
::
setStyleColor
(
const
QColor &color)
76
{
77
m_styleColor = color;
78
vgSetParameteri(m_styleColorPaint, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
79
vgSetParameterfv(m_styleColorPaint, VG_PAINT_COLOR, 4, QSGOpenVGHelpers::qColorToVGColor(m_styleColor,
opacity
()).constData());
80
}
81
82
QPointF
QSGOpenVGGlyphNode
::
baseLine
()
const
83
{
84
return
QPointF();
85
}
86
87
void
QSGOpenVGGlyphNode
::
setPreferredAntialiasingMode
(
QSGGlyphNode
::
AntialiasingMode
)
88
{
89
}
90
91
void
QSGOpenVGGlyphNode
::
update
()
92
{
93
}
94
95
void
QSGOpenVGGlyphNode
::
render
()
96
{
97
if
(m_glyphRun.positions().count() == 0)
98
return
;
99
100
// Rendering Style
101
qreal offset = 1.0;
102
103
QOpenVGOffscreenSurface
*offscreenSurface =
nullptr
;
104
105
// Set Transform
106
vgSeti(VG_MATRIX_MODE, VG_MATRIX_GLYPH_USER_TO_SURFACE);
107
if
(
transform
().isAffine()) {
108
vgLoadMatrix(
transform
().constData());
109
}
else
{
110
vgLoadIdentity();
111
offscreenSurface =
new
QOpenVGOffscreenSurface
(QSize(
std
::ceil(m_bounding_rect.width()),
std
::ceil(m_bounding_rect.height())));
112
offscreenSurface
->
makeCurrent
(
)
;
113
}
114
115
// Set Quality
116
vgSeti(VG_RENDERING_QUALITY, VG_RENDERING_QUALITY_BETTER);
117
118
119
switch
(m_style) {
120
case
QQuickText::Normal:
break
;
121
case
QQuickText::Outline:
122
// Set the correct fill state
123
vgSetPaint(m_styleColorPaint, VG_FILL_PATH);
124
drawGlyphsAtOffset(QPointF(0, offset));
125
drawGlyphsAtOffset(QPointF(0, -offset));
126
drawGlyphsAtOffset(QPointF(offset, 0));
127
drawGlyphsAtOffset(QPointF(-offset, 0));
128
break
;
129
case
QQuickText::Raised:
130
vgSetPaint(m_styleColorPaint, VG_FILL_PATH);
131
drawGlyphsAtOffset(QPointF(0, offset));
132
break
;
133
case
QQuickText::Sunken:
134
vgSetPaint(m_styleColorPaint, VG_FILL_PATH);
135
drawGlyphsAtOffset(QPointF(0, -offset));
136
break
;
137
}
138
139
// Set the correct fill state
140
vgSetPaint(m_fontColorPaint, VG_FILL_PATH);
141
drawGlyphsAtOffset(QPointF(0.0, 0.0));
142
143
if
(!
transform
().isAffine()) {
144
vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
145
vgLoadMatrix(
transform
().constData());
146
offscreenSurface
->
doneCurrent
(
)
;
147
vgDrawImage(offscreenSurface->image());
148
delete
offscreenSurface;
149
}
150
}
151
152
void
QSGOpenVGGlyphNode
::
setOpacity
(
float
opacity)
153
{
154
if
(
QSGOpenVGRenderable
::
opacity
() != opacity) {
155
QSGOpenVGRenderable
::
setOpacity
(opacity);
156
// Update Colors
157
setColor(m_color);
158
setStyleColor(m_styleColor);
159
}
160
}
161
162
void
QSGOpenVGGlyphNode
::drawGlyphsAtOffset(
const
QPointF &offset)
163
{
164
QPointF firstPosition = m_glyphRun.positions()[0] + (m_position - QPointF(0, m_glyphRun.rawFont().ascent()));
165
VGfloat origin[2];
166
origin[0] = firstPosition.x() + offset.x();
167
origin[1] = firstPosition.y() + offset.y();
168
vgSetfv(VG_GLYPH_ORIGIN, 2, origin);
169
170
vgDrawGlyphs(m_glyphCache->font(),
171
m_glyphRun.glyphIndexes().count(),
172
(VGuint*)m_glyphRun.glyphIndexes().constData(),
173
m_xAdjustments.constData(),
174
m_yAdjustments.constData(),
175
VG_FILL_PATH,
176
VG_TRUE);
177
}
178
179
QT_END_NAMESPACE
QOpenVGOffscreenSurface
Definition
qopenvgoffscreensurface.h:12
QOpenVGOffscreenSurface::makeCurrent
void makeCurrent()
Definition
qopenvgoffscreensurface.cpp:53
QOpenVGOffscreenSurface::doneCurrent
void doneCurrent()
Definition
qopenvgoffscreensurface.cpp:65
QSGOpenVGGlyphNode
Definition
qsgopenvgglyphnode_p.h:22
QSGOpenVGGlyphNode::setColor
void setColor(const QColor &color) override
Definition
qsgopenvgglyphnode.cpp:63
QSGOpenVGGlyphNode::update
void update() override
Definition
qsgopenvgglyphnode.cpp:91
QSGOpenVGGlyphNode::~QSGOpenVGGlyphNode
~QSGOpenVGGlyphNode()
Definition
qsgopenvgglyphnode.cpp:29
QSGOpenVGGlyphNode::setStyle
void setStyle(QQuickText::TextStyle style) override
Definition
qsgopenvgglyphnode.cpp:70
QSGOpenVGGlyphNode::setStyleColor
void setStyleColor(const QColor &color) override
Definition
qsgopenvgglyphnode.cpp:75
QSGOpenVGGlyphNode::setPreferredAntialiasingMode
void setPreferredAntialiasingMode(AntialiasingMode) override
Definition
qsgopenvgglyphnode.cpp:87
QSGOpenVGGlyphNode::baseLine
QPointF baseLine() const override
Definition
qsgopenvgglyphnode.cpp:82
QSGOpenVGGlyphNode::setOpacity
void setOpacity(float opacity) override
Definition
qsgopenvgglyphnode.cpp:152
QSGOpenVGGlyphNode::render
void render() override
Definition
qsgopenvgglyphnode.cpp:95
QSGOpenVGGlyphNode::setGlyphs
void setGlyphs(const QPointF &position, const QGlyphRun &glyphs) override
Definition
qsgopenvgglyphnode.cpp:38
QSGOpenVGRenderable
Definition
qsgopenvgrenderable.h:16
QSGOpenVGRenderable::opacity
float opacity() const
Definition
qsgopenvgrenderable.cpp:31
QSGOpenVGRenderable::transform
const QOpenVGMatrix & transform() const
Definition
qsgopenvgrenderable.cpp:46
QSGOpenVGRenderable::setOpacity
virtual void setOpacity(float opacity)
Definition
qsgopenvgrenderable.cpp:19
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qtdeclarative
src
plugins
scenegraph
openvg
qsgopenvgglyphnode.cpp
Generated on
for Qt by
1.18.0