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#ifndef QOPENGLTEXTUREGLYPHCACHE_P_H
5#define QOPENGLTEXTUREGLYPHCACHE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtOpenGL/qtopenglglobal.h>
19#include <private/qtextureglyphcache_p.h>
20#include <private/qopenglcontext_p.h>
21#include <qopenglshaderprogram.h>
22#include <qopenglfunctions.h>
23#include <qopenglbuffer.h>
24#include <qopenglvertexarrayobject.h>
25
26// #define QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
27
28QT_BEGIN_NAMESPACE
29
30class QOpenGL2PaintEngineExPrivate;
31
32class QOpenGLGlyphTexture : public QOpenGLSharedResource
33{
34public:
35 explicit QOpenGLGlyphTexture(QOpenGLContext *ctx)
36 : QOpenGLSharedResource(ctx->shareGroup())
37 , m_width(0)
38 , m_height(0)
39 {
40 if (!ctx->d_func()->workaround_brokenFBOReadBack)
41 QOpenGLFunctions(ctx).glGenFramebuffers(n: 1, framebuffers: &m_fbo);
42
43#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
44 qDebug(" -> QOpenGLGlyphTexture() %p for context %p.", this, ctx);
45#endif
46 }
47
48 void freeResource(QOpenGLContext *context) override
49 {
50 QOpenGLContext *ctx = context;
51#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
52 qDebug("~QOpenGLGlyphTexture() %p for context %p.", this, ctx);
53#endif
54 if (!ctx->d_func()->workaround_brokenFBOReadBack)
55 ctx->functions()->glDeleteFramebuffers(n: 1, framebuffers: &m_fbo);
56 if (m_width || m_height)
57 ctx->functions()->glDeleteTextures(n: 1, textures: &m_texture);
58 }
59
60 void invalidateResource() override
61 {
62 m_texture = 0;
63 m_fbo = 0;
64 m_width = 0;
65 m_height = 0;
66 }
67
68 GLuint m_texture;
69 GLuint m_fbo;
70 int m_width;
71 int m_height;
72};
73
74class Q_OPENGL_EXPORT QOpenGLTextureGlyphCache : public QImageTextureGlyphCache
75{
76public:
77 QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat glyphFormat, const QTransform &matrix, const QColor &color = QColor());
78 ~QOpenGLTextureGlyphCache();
79
80 virtual void createTextureData(int width, int height) override;
81 virtual void resizeTextureData(int width, int height) override;
82 virtual void fillTexture(const Coord &c,
83 glyph_t glyph,
84 const QFixedPoint &subPixelPosition) override;
85 virtual int glyphPadding() const override;
86 virtual int maxTextureWidth() const override;
87 virtual int maxTextureHeight() const override;
88
89 inline GLuint texture() const {
90 QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
91 QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
92 return glyphTexture ? glyphTexture->m_texture : 0;
93 }
94
95 inline int width() const {
96 QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
97 QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
98 return glyphTexture ? glyphTexture->m_width : 0;
99 }
100 inline int height() const {
101 QOpenGLTextureGlyphCache *that = const_cast<QOpenGLTextureGlyphCache *>(this);
102 QOpenGLGlyphTexture *glyphTexture = that->m_textureResource;
103 return glyphTexture ? glyphTexture->m_height : 0;
104 }
105
106 inline void setPaintEnginePrivate(QOpenGL2PaintEngineExPrivate *p) { pex = p; }
107
108 inline const QOpenGLContextGroup *contextGroup() const { return m_textureResource ? m_textureResource->group() : nullptr; }
109
110 inline int serialNumber() const { return m_serialNumber; }
111
112 enum FilterMode {
113 Nearest,
114 Linear
115 };
116 FilterMode filterMode() const { return m_filterMode; }
117 void setFilterMode(FilterMode m) { m_filterMode = m; }
118
119 void clear();
120
121 QOpenGL2PaintEngineExPrivate *paintEnginePrivate() const
122 {
123 return pex;
124 }
125
126private:
127 void setupVertexAttribs();
128
129 QOpenGLGlyphTexture *m_textureResource;
130
131 QOpenGL2PaintEngineExPrivate *pex;
132 QOpenGLShaderProgram *m_blitProgram;
133 FilterMode m_filterMode;
134
135 GLfloat m_vertexCoordinateArray[8];
136 GLfloat m_textureCoordinateArray[8];
137
138 int m_serialNumber;
139
140 QOpenGLBuffer m_buffer;
141 QOpenGLVertexArrayObject m_vao;
142};
143
144QT_END_NAMESPACE
145
146#endif // QOPENGLTEXTUREGLYPHCACHE_P_H
147
148

source code of qtbase/src/opengl/qopengltextureglyphcache_p.h