4#ifndef QOPENGLPAINTENGINE_P_H
5#define QOPENGLPAINTENGINE_P_H
18#include <qopenglpaintdevice.h>
20#include <private/qpaintengineex_p.h>
21#include <private/qopenglengineshadermanager_p.h>
22#include <private/qopengl2pexvertexarray_p.h>
23#include <private/qfontengine_p.h>
24#include <private/qdatabuffer_p.h>
25#include <private/qtriangulatingstroker_p.h>
27#include <private/qopenglextensions_p.h>
29#include <QOpenGLVertexArrayObject>
30#include <QOpenGLBuffer>
36 ImageArrayDrawingMode,
37 ImageOpacityArrayDrawingMode
42#define GL_STENCIL_HIGH_BIT GLuint(0x80
)
43#define QT_UNKNOWN_TEXTURE_UNIT GLuint(-1
)
44#define QT_DEFAULT_TEXTURE_UNIT GLuint(0
)
45#define QT_BRUSH_TEXTURE_UNIT GLuint(0
)
46#define QT_IMAGE_TEXTURE_UNIT GLuint(0
)
47#define QT_MASK_TEXTURE_UNIT GLuint(1
)
48#define QT_BACKGROUND_TEXTURE_UNIT GLuint(2
)
50class QOpenGL2PaintEngineExPrivate;
75 Q_DECLARE_PRIVATE(QOpenGL2PaintEngineEx)
77 QOpenGL2PaintEngineEx();
78 ~QOpenGL2PaintEngineEx();
80 bool begin(QPaintDevice *device) override;
84 virtual void clipEnabledChanged() override;
85 virtual void penChanged() override;
86 virtual void brushChanged() override;
87 virtual void brushOriginChanged() override;
88 virtual void opacityChanged() override;
89 virtual void compositionModeChanged() override;
90 virtual void renderHintsChanged() override;
91 virtual void transformChanged() override;
93 virtual void drawPixmap(
const QRectF &r,
const QPixmap &pm,
const QRectF &sr) override;
94 virtual void drawPixmapFragments(
const QPainter::PixmapFragment *fragments,
int fragmentCount,
const QPixmap &pixmap,
95 QPainter::PixmapFragmentHints hints) override;
96 virtual void drawImage(
const QRectF &r,
const QImage &pm,
const QRectF &sr,
97 Qt::ImageConversionFlags flags = Qt::AutoColor) override;
98 virtual void drawTextItem(
const QPointF &p,
const QTextItem &textItem) override;
99 virtual void fill(
const QVectorPath &path,
const QBrush &brush) override;
100 virtual void stroke(
const QVectorPath &path,
const QPen &pen) override;
101 virtual void clip(
const QVectorPath &path, Qt::ClipOperation op) override;
103 virtual void drawStaticTextItem(QStaticTextItem *textItem) override;
105 bool drawTexture(
const QRectF &r, GLuint textureId,
const QSize &size,
const QRectF &sr);
107 Type type()
const override {
return OpenGL2; }
109 virtual void setState(QPainterState *s) override;
110 virtual QPainterState *createState(QPainterState *orig)
const override;
111 inline QOpenGL2PaintEngineState *state() {
112 return static_cast<QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
114 inline const QOpenGL2PaintEngineState *state()
const {
115 return static_cast<
const QOpenGL2PaintEngineState *>(QPaintEngineEx::state());
118 void beginNativePainting() override;
119 void endNativePainting() override;
121 void invalidateState();
123 void setRenderTextActive(
bool);
125 bool isNativePaintingActive()
const;
126 bool requiresPretransformedGlyphPositions(QFontEngine *,
const QTransform &)
const override {
return false; }
127 bool shouldDrawCachedGlyphs(QFontEngine *,
const QTransform &)
const override;
130 Q_DISABLE_COPY_MOVE(QOpenGL2PaintEngineEx)
132 friend class QOpenGLEngineShaderManager;
137#define QT_GL_VERTEX_ARRAY_TRACKED_COUNT 3
141 Q_DECLARE_PUBLIC(QOpenGL2PaintEngineEx)
185 void fill(
const QVectorPath &path);
186 void stroke(
const QVectorPath &path,
const QPen &pen);
187 void drawTexture(
const QOpenGLRect& dest,
const QOpenGLRect& src,
const QSize &textureSize,
bool opaque,
bool pattern =
false);
188 void drawPixmapFragments(
const QPainter::PixmapFragment *fragments,
int fragmentCount,
const QPixmap &pixmap,
189 QPainter::PixmapFragmentHints hints);
190 void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem);
193 inline void uploadData(
unsigned int arrayIndex,
const GLfloat *data, GLuint count);
194 inline bool uploadIndexData(
const void *data, GLenum indexValueType, GLuint count);
197 void drawVertexArrays(
const float *data,
int *stops,
int stopCount, GLenum primitive);
199 drawVertexArrays((
const float *) vertexArray.data(), vertexArray.stops(), vertexArray.stopCount(), primitive);
203 void composite(
const QOpenGLRect& boundingRect);
206 void fillStencilWithVertexArray(
const float *data,
int count,
int *stops,
int stopCount,
const QOpenGLRect &bounds, StencilFillMode mode);
208 fillStencilWithVertexArray((
const float *) vertexArray.data(), 0, vertexArray.stops(), vertexArray.stopCount(),
209 vertexArray.boundingRect(),
210 useWindingFill ? WindingFillMode : OddEvenFillMode);
219 return shaderManager->getUniformLocation(uniform);
223 void writeClip(
const QVectorPath &path, uint value);
306 Q_ASSERT(arrayIndex < 3);
308 if (arrayIndex == QT_VERTEX_COORDS_ATTR) {
310 vertexBuffer.allocate(data, count *
sizeof(
float));
312 if (arrayIndex == QT_TEXTURE_COORDS_ATTR) {
313 texCoordBuffer.bind();
314 texCoordBuffer.allocate(data, count *
sizeof(
float));
316 if (arrayIndex == QT_OPACITY_ATTR) {
317 opacityBuffer.bind();
318 opacityBuffer.allocate(data, count *
sizeof(
float));
320 funcs.glVertexAttribPointer(arrayIndex, 1, GL_FLOAT, GL_FALSE, 0,
nullptr);
322 funcs.glVertexAttribPointer(arrayIndex, 2, GL_FLOAT, GL_FALSE, 0,
nullptr);
328 Q_ASSERT(indexValueType == GL_UNSIGNED_SHORT || indexValueType == GL_UNSIGNED_INT);
330 indexBuffer.allocate(
332 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