5#ifndef QOPENGLPAINTENGINE_P_H
6#define QOPENGLPAINTENGINE_P_H
19#include <qopenglpaintdevice.h>
21#include <private/qpaintengineex_p.h>
22#include <private/qopenglengineshadermanager_p.h>
23#include <private/qopengl2pexvertexarray_p.h>
24#include <private/qfontengine_p.h>
25#include <private/qdatabuffer_p.h>
26#include <private/qtriangulatingstroker_p.h>
28#include <private/qopenglextensions_p.h>
30#include <QOpenGLVertexArrayObject>
31#include <QOpenGLBuffer>
37 ImageArrayDrawingMode,
38 ImageOpacityArrayDrawingMode
43#define GL_STENCIL_HIGH_BIT GLuint(0x80
)
44#define QT_UNKNOWN_TEXTURE_UNIT GLuint(-1
)
45#define QT_DEFAULT_TEXTURE_UNIT GLuint(0
)
46#define QT_BRUSH_TEXTURE_UNIT GLuint(0
)
47#define QT_IMAGE_TEXTURE_UNIT GLuint(0
)
48#define QT_MASK_TEXTURE_UNIT GLuint(1
)
49#define QT_BACKGROUND_TEXTURE_UNIT GLuint(2
)
51class QOpenGL2PaintEngineExPrivate;
76 Q_DECLARE_PRIVATE(QOpenGL2PaintEngineEx)
78 QOpenGL2PaintEngineEx();
79 ~QOpenGL2PaintEngineEx();
81 bool begin(QPaintDevice *device) override;
85 virtual void clipEnabledChanged() override;
86 virtual void penChanged() override;
87 virtual void brushChanged() override;
88 virtual void brushOriginChanged() override;
89 virtual void opacityChanged() override;
90 virtual void compositionModeChanged() override;
91 virtual void renderHintsChanged() override;
92 virtual void transformChanged() override;
94 virtual void drawPixmap(
const QRectF &r,
const QPixmap &pm,
const QRectF &sr) override;
95 virtual void drawPixmapFragments(
const QPainter::PixmapFragment *fragments,
int fragmentCount,
const QPixmap &pixmap,
96 QPainter::PixmapFragmentHints hints) override;
97 virtual void drawImage(
const QRectF &r,
const QImage &pm,
const QRectF &sr,
98 Qt::ImageConversionFlags flags = Qt::AutoColor) override;
99 virtual void drawTextItem(
const QPointF &p,
const QTextItem &textItem) override;
100 virtual void fill(
const QVectorPath &path,
const QBrush &brush) override;
101 virtual void stroke(
const QVectorPath &path,
const QPen &pen) override;
102 virtual void clip(
const QVectorPath &path, Qt::ClipOperation op) override;
104 virtual void drawStaticTextItem(QStaticTextItem *textItem) override;
106 bool drawTexture(
const QRectF &r, GLuint textureId,
const QSize &size,
const QRectF &sr);
108 Type type()
const override {
return OpenGL2; }
110 virtual void setState(QPainterState *s) override;
111 virtual QPainterState *createState(QPainterState *orig)
const override;
112 inline QOpenGL2PaintEngineState *state() {
113 return static_cast<QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
115 inline const QOpenGL2PaintEngineState *state()
const {
116 return static_cast<
const QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
119 void beginNativePainting() override;
120 void endNativePainting() override;
122 void invalidateState();
124 void setRenderTextActive(
bool);
126 bool isNativePaintingActive()
const;
127 bool requiresPretransformedGlyphPositions(QFontEngine *,
const QTransform &)
const override {
return false; }
128 bool shouldDrawCachedGlyphs(QFontEngine *,
const QTransform &)
const override;
131 Q_DISABLE_COPY_MOVE(QOpenGL2PaintEngineEx)
133 friend class QOpenGLEngineShaderManager;
138#define QT_GL_VERTEX_ARRAY_TRACKED_COUNT 3
142 Q_DECLARE_PUBLIC(QOpenGL2PaintEngineEx)
186 void fill(
const QVectorPath &path);
187 void stroke(
const QVectorPath &path,
const QPen &pen);
188 void drawTexture(
const QOpenGLRect& dest,
const QOpenGLRect& src,
const QSize &textureSize,
bool opaque,
bool pattern =
false);
189 void drawPixmapFragments(
const QPainter::PixmapFragment *fragments,
int fragmentCount,
const QPixmap &pixmap,
190 QPainter::PixmapFragmentHints hints);
191 void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem);
194 inline void uploadData(
unsigned int arrayIndex,
const GLfloat *data, GLuint count);
195 inline bool uploadIndexData(
const void *data, GLenum indexValueType, GLuint count);
198 void drawVertexArrays(
const float *data,
int *stops,
int stopCount, GLenum primitive);
200 drawVertexArrays((
const float *) vertexArray.data(), vertexArray.stops(), vertexArray.stopCount(), primitive);
204 void composite(
const QOpenGLRect& boundingRect);
207 void fillStencilWithVertexArray(
const float *data,
int count,
int *stops,
int stopCount,
const QOpenGLRect &bounds, StencilFillMode mode);
209 fillStencilWithVertexArray((
const float *) vertexArray.data(), 0, vertexArray.stops(), vertexArray.stopCount(),
210 vertexArray.boundingRect(),
211 useWindingFill ? WindingFillMode : OddEvenFillMode);
220 return shaderManager->getUniformLocation(uniform);
224 void writeClip(
const QVectorPath &path, uint value);
307 Q_ASSERT(arrayIndex < 3);
309 if (arrayIndex == QT_VERTEX_COORDS_ATTR) {
311 vertexBuffer.allocate(data, count *
sizeof(
float));
313 if (arrayIndex == QT_TEXTURE_COORDS_ATTR) {
314 texCoordBuffer.bind();
315 texCoordBuffer.allocate(data, count *
sizeof(
float));
317 if (arrayIndex == QT_OPACITY_ATTR) {
318 opacityBuffer.bind();
319 opacityBuffer.allocate(data, count *
sizeof(
float));
321 funcs.glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0,
nullptr);
323 funcs.glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0,
nullptr);
329 Q_ASSERT(indexValueType == GL_UNSIGNED_SHORT || indexValueType == GL_UNSIGNED_INT);
331 indexBuffer.allocate(
333 count * (indexValueType == GL_UNSIGNED_SHORT ?
sizeof(quint16) :
sizeof(quint32)));
QOpenGLEngineShaderManager * shaderManager
void drawVertexArrays(QOpenGL2PEXVertexArray &vertexArray, GLenum primitive)
GLfloat staticVertexCoordinateArray[8]
void updateBrushUniforms()
bool uploadIndexData(const void *data, GLenum indexValueType, GLuint count)
GLuint elementIndicesVBOId
static void cleanupVectorPath(QPaintEngineEx *engine, void *data)
void writeClip(const QVectorPath &path, uint value)
void updateCompositionMode()
void updateTexture(GLenum textureUnit, const T &texture, GLenum wrapMode, GLenum filterMode, TextureUpdateMode updateMode=UpdateIfNeeded)
QOpenGL2PaintEngineExPrivate(QOpenGL2PaintEngineEx *q_ptr)
QOpenGL2PEXVertexArray vertexCoordinateArray
GLfloat staticTextureCoordinateArray[8]
void systemStateChanged() override
QFontEngine::GlyphFormat glyphCacheFormat
QOpenGLBuffer vertexBuffer
QDashedStrokeProcessor dasher
QVarLengthArray< GLuint, 8 > unusedVBOSToClean
void transferMode(EngineMode newMode)
~QOpenGL2PaintEngineExPrivate()
QList< GLushort > elementIndices
QRect currentScissorBounds
QOpenGLBuffer opacityBuffer
void composite(const QOpenGLRect &boundingRect)
bool multisamplingAlwaysEnabled
GLuint bindTexture(const T &texture, bool *newTextureCreated)
bool prepareForCachedGlyphDraw(const QFontEngineGlyphCache &cache)
void stroke(const QVectorPath &path, const QPen &pen)
QOpenGL2PEXVertexArray textureCoordinateArray
void updateBrushTexture()
QOpenGLBuffer texCoordBuffer
void drawTexture(const QOpenGLRect &dest, const QOpenGLRect &src, const QSize &textureSize, bool opaque, bool pattern=false)
void activateTextureUnit(GLenum textureUnit)
static QOpenGLEngineShaderManager * shaderManagerForEngine(QOpenGL2PaintEngineEx *engine)
bool compositionModeDirty
QRegion dirtyStencilRegion
QTriangulatingStroker stroker
void setVertexAttribArrayEnabled(int arrayIndex, bool enabled=true)
QOpenGLPaintDevice * device
void uploadData(unsigned int arrayIndex, const GLfloat *data, GLuint count)
QOpenGLBuffer indexBuffer
void fill(const QVectorPath &path)
void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap, QPainter::PixmapFragmentHints hints)
bool prepareForDraw(bool srcPixelsAreOpaque)
void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem)
void fillStencilWithVertexArray(const float *data, int count, int *stops, int stopCount, const QOpenGLRect &bounds, StencilFillMode mode)
const GLfloat * vertexAttribPointers[3]
QOpenGLVertexArrayObject vao
QOpenGL2PaintEngineEx * q
void setBrush(const QBrush &brush)
void drawVertexArrays(const float *data, int *stops, int stopCount, GLenum primitive)
void fillStencilWithVertexArray(QOpenGL2PEXVertexArray &vertexArray, bool useWindingFill)
void setScissor(const QRect &rect)
bool vertexAttributeArraysEnabledState[QT_GL_VERTEX_ARRAY_TRACKED_COUNT]
QDataBuffer< GLfloat > opacityArray
QPointer< QOpenGLContext > ctx
GLuint location(const QOpenGLEngineShaderManager::Uniform uniform)
GLenum lastTextureUnitUsed
static QOpenGL2PaintEngineExPrivate * getData(QOpenGL2PaintEngineEx *engine)
QVarLengthArray< GLuint, 8 > unusedIBOSToClean
bool nativePaintingActive
void updateClipScissorTest()
void clearClip(uint value)
uint compositionModeChanged
uint needsClipBufferClear
QOpenGL2PaintEngineState()
QOpenGL2PaintEngineState(const QOpenGL2PaintEngineState &other)
~QOpenGL2PaintEngineState()
QOpenGLCustomShaderStagePrivate()
QPointer< QOpenGLEngineShaderManager > m_manager
virtual void setUniforms(QOpenGLShaderProgram *)
void removeFromPainter(QPainter *)
QByteArray source() const
bool setOnPainter(QPainter *)
QOpenGLShaderProgram * program
QList< uint > uniformLocations
bool usePmvMatrixAttribute
QByteArray customStageSource
~QOpenGLEngineShaderProg()
bool operator==(const QOpenGLEngineShaderProg &other) const
QOpenGLEngineShaderProg()
Combined button and popup list for selecting options.
static const GLuint QT_TEXTURE_COORDS_ATTR
static const GLuint QT_PMV_MATRIX_2_ATTR
static const GLuint QT_OPACITY_ATTR
static const GLuint QT_PMV_MATRIX_1_ATTR
static QT_BEGIN_NAMESPACE const GLuint QT_VERTEX_COORDS_ATTR
static const GLuint QT_PMV_MATRIX_3_ATTR
#define QT_GL_VERTEX_ARRAY_TRACKED_COUNT
#define QT_UNKNOWN_TEXTURE_UNIT