summaryrefslogtreecommitdiffstats
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/doc/snippets/clipboard/clipwindow.cpp4
-rw-r--r--src/gui/doc/snippets/draganddrop/mainwindow.cpp8
-rw-r--r--src/gui/doc/snippets/separations/viewer.cpp4
-rw-r--r--src/gui/kernel/qwindow.cpp8
-rw-r--r--src/gui/kernel/qwindow.h3
-rw-r--r--src/gui/opengl/qopengldebug.cpp14
-rw-r--r--src/gui/opengl/qopenglfunctions.cpp6
-rw-r--r--src/gui/opengl/qopenglpaintengine.cpp53
-rw-r--r--src/gui/opengl/qopenglpaintengine_p.h4
-rw-r--r--src/gui/opengl/qopenglproxy_win.cpp3
-rw-r--r--src/gui/opengl/qopenglshaderprogram.cpp23
-rw-r--r--src/gui/opengl/qopenglshaderprogram.h2
-rw-r--r--src/gui/opengl/qopengltextureglyphcache.cpp78
-rw-r--r--src/gui/opengl/qopengltextureglyphcache_p.h9
-rw-r--r--src/gui/opengl/qopenglversionfunctions.cpp2
-rw-r--r--src/gui/opengl/qopenglvertexarrayobject.cpp149
-rw-r--r--src/gui/painting/qoutlinemapper.cpp2
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp20
-rw-r--r--src/gui/painting/qpaintengine_raster_p.h2
-rw-r--r--src/gui/painting/qpaintengineex.cpp2
-rw-r--r--src/gui/painting/qpainter.cpp6
-rw-r--r--src/gui/painting/qpainterpath.h2
-rw-r--r--src/gui/painting/qtextureglyphcache.cpp43
-rw-r--r--src/gui/painting/qtextureglyphcache_p.h8
-rw-r--r--src/gui/text/qfontengine.cpp29
-rw-r--r--src/gui/text/qfontengine_ft.cpp10
-rw-r--r--src/gui/text/qfontengine_ft_p.h2
-rw-r--r--src/gui/text/qfontengine_p.h15
-rw-r--r--src/gui/text/qfontengineglyphcache_p.h17
-rw-r--r--src/gui/text/qplatformfontdatabase.cpp104
-rw-r--r--src/gui/text/qtextengine.cpp15
-rw-r--r--src/gui/text/qtextobject.cpp4
-rw-r--r--src/gui/text/qtextobject.h2
33 files changed, 388 insertions, 265 deletions
diff --git a/src/gui/doc/snippets/clipboard/clipwindow.cpp b/src/gui/doc/snippets/clipboard/clipwindow.cpp
index 657ea4e652..19a685b9d4 100644
--- a/src/gui/doc/snippets/clipboard/clipwindow.cpp
+++ b/src/gui/doc/snippets/clipboard/clipwindow.cpp
@@ -59,8 +59,8 @@ ClipWindow::ClipWindow(QWidget *parent)
//! [0]
connect(clipboard, SIGNAL(dataChanged()), this, SLOT(updateClipboard()));
//! [0]
- connect(mimeTypeCombo, SIGNAL(activated(const QString &)),
- this, SLOT(updateData(const QString &)));
+ connect(mimeTypeCombo, SIGNAL(activated(QString)),
+ this, SLOT(updateData(QString)));
QVBoxLayout *currentLayout = new QVBoxLayout(currentItem);
currentLayout->addWidget(mimeTypeLabel);
diff --git a/src/gui/doc/snippets/draganddrop/mainwindow.cpp b/src/gui/doc/snippets/draganddrop/mainwindow.cpp
index dc1b39422d..c8d0bf4e09 100644
--- a/src/gui/doc/snippets/draganddrop/mainwindow.cpp
+++ b/src/gui/doc/snippets/draganddrop/mainwindow.cpp
@@ -54,10 +54,10 @@ MainWindow::MainWindow(QWidget *parent)
QLabel *dataLabel = new QLabel(tr("Amount of data (bytes):"), centralWidget);
dragWidget = new DragWidget(centralWidget);
- connect(dragWidget, SIGNAL(mimeTypes(const QStringList &)),
- this, SLOT(setMimeTypes(const QStringList &)));
- connect(dragWidget, SIGNAL(dragResult(const QString &)),
- this, SLOT(setDragResult(const QString &)));
+ connect(dragWidget, SIGNAL(mimeTypes(QStringList)),
+ this, SLOT(setMimeTypes(QStringList)));
+ connect(dragWidget, SIGNAL(dragResult(QString)),
+ this, SLOT(setDragResult(QString)));
QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
mainLayout->addWidget(mimeTypeLabel);
diff --git a/src/gui/doc/snippets/separations/viewer.cpp b/src/gui/doc/snippets/separations/viewer.cpp
index 84ef7b7567..6a0f49ee2f 100644
--- a/src/gui/doc/snippets/separations/viewer.cpp
+++ b/src/gui/doc/snippets/separations/viewer.cpp
@@ -119,8 +119,8 @@ void Viewer::createMenus()
connect(openAction, SIGNAL(triggered()), this, SLOT(chooseFile()));
connect(saveAction, SIGNAL(triggered()), this, SLOT(saveImage()));
connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
- connect(brightnessMenu, SIGNAL(triggered(QAction *)), this,
- SLOT(setBrightness(QAction *)));
+ connect(brightnessMenu, SIGNAL(triggered(QAction*)), this,
+ SLOT(setBrightness(QAction*)));
}
/*
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index 51548aa371..04a2615c81 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -727,9 +727,15 @@ Qt::WindowType QWindow::type() const
void QWindow::setTitle(const QString &title)
{
Q_D(QWindow);
- d->windowTitle = title;
+ bool changed = false;
+ if (d->windowTitle != title) {
+ d->windowTitle = title;
+ changed = true;
+ }
if (d->platformWindow)
d->platformWindow->setWindowTitle(title);
+ if (changed)
+ emit windowTitleChanged(title);
}
QString QWindow::title() const
diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h
index ca261ff7ce..3278b7233c 100644
--- a/src/gui/kernel/qwindow.h
+++ b/src/gui/kernel/qwindow.h
@@ -103,7 +103,7 @@ class Q_GUI_EXPORT QWindow : public QObject, public QSurface
// C++ properties in qwindow.cpp AND as QML properties in qquickwindow.cpp.
// http://qt-project.org/doc/qt-5.0/qtqml/qtqml-cppintegration-definetypes.html#type-revisions-and-versions
- Q_PROPERTY(QString title READ title WRITE setTitle)
+ Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY windowTitleChanged)
Q_PROPERTY(Qt::WindowModality modality READ modality WRITE setModality NOTIFY modalityChanged)
Q_PROPERTY(Qt::WindowFlags flags READ flags WRITE setFlags)
Q_PROPERTY(int x READ x WRITE setX NOTIFY xChanged)
@@ -297,6 +297,7 @@ Q_SIGNALS:
void screenChanged(QScreen *screen);
void modalityChanged(Qt::WindowModality modality);
void windowStateChanged(Qt::WindowState windowState);
+ void windowTitleChanged(const QString &title);
void xChanged(int arg);
void yChanged(int arg);
diff --git a/src/gui/opengl/qopengldebug.cpp b/src/gui/opengl/qopengldebug.cpp
index 90d062f4dd..2355d0a8a7 100644
--- a/src/gui/opengl/qopengldebug.cpp
+++ b/src/gui/opengl/qopengldebug.cpp
@@ -43,6 +43,7 @@
#include <QtCore/qglobal.h>
#include <QtCore/qvarlengtharray.h>
#include <QtGui/qopengl.h>
+#include <QtGui/qopenglfunctions.h>
#include "qopengldebug.h"
@@ -1364,7 +1365,20 @@ bool QOpenGLDebugLogger::initialize()
GET_DEBUG_PROC_ADDRESS(glGetDebugMessageLog);
GET_DEBUG_PROC_ADDRESS(glPushDebugGroup);
GET_DEBUG_PROC_ADDRESS(glPopDebugGroup);
+
+ // Windows' Desktop GL doesn't allow resolution of "basic GL entry points"
+ // through wglGetProcAddress
+#if defined(Q_OS_WIN) && !defined(QT_OPENGL_ES_2)
+ {
+ HMODULE handle = static_cast<HMODULE>(QOpenGLFunctions::platformGLHandle());
+ if (!handle)
+ handle = GetModuleHandleA("opengl32.dll");
+ d->glGetPointerv = reinterpret_cast<qt_glGetPointerv_t>(GetProcAddress(handle, QByteArrayLiteral("glGetPointerv")));
+ }
+#else
GET_DEBUG_PROC_ADDRESS(glGetPointerv)
+#endif
+
#undef GET_DEBUG_PROC_ADDRESS
glGetIntegerv(GL_MAX_DEBUG_MESSAGE_LENGTH, &d->maxMessageLength);
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp
index 150e7dcb32..60743b3a27 100644
--- a/src/gui/opengl/qopenglfunctions.cpp
+++ b/src/gui/opengl/qopenglfunctions.cpp
@@ -314,7 +314,8 @@ static int qt_gl_resolve_features()
if (extensions.match("GL_ARB_multisample"))
features |= QOpenGLFunctions::Multisample;
if (extensions.match("GL_ARB_texture_non_power_of_two"))
- features |= QOpenGLFunctions::NPOTTextures;
+ features |= QOpenGLFunctions::NPOTTextures |
+ QOpenGLFunctions::NPOTTextureRepeat;
// assume version 2.0 or higher
features |= QOpenGLFunctions::BlendColor |
@@ -327,7 +328,8 @@ static int qt_gl_resolve_features()
QOpenGLFunctions::Shaders |
QOpenGLFunctions::StencilSeparate |
QOpenGLFunctions::BlendEquationSeparate |
- QOpenGLFunctions::NPOTTextures;
+ QOpenGLFunctions::NPOTTextures |
+ QOpenGLFunctions::NPOTTextureRepeat;
if (format.majorVersion() >= 3)
features |= QOpenGLFunctions::Framebuffers;
diff --git a/src/gui/opengl/qopenglpaintengine.cpp b/src/gui/opengl/qopenglpaintengine.cpp
index e91ada7b3a..63127668a5 100644
--- a/src/gui/opengl/qopenglpaintengine.cpp
+++ b/src/gui/opengl/qopenglpaintengine.cpp
@@ -1434,19 +1434,18 @@ void QOpenGL2PaintEngineEx::drawStaticTextItem(QStaticTextItem *textItem)
QFontEngine *fontEngine = textItem->fontEngine();
if (shouldDrawCachedGlyphs(fontEngine, s->matrix)) {
- QFontEngineGlyphCache::Type glyphType = fontEngine->glyphFormat >= 0
- ? QFontEngineGlyphCache::Type(textItem->fontEngine()->glyphFormat)
- : d->glyphCacheType;
- if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) {
+ QFontEngine::GlyphFormat glyphFormat = fontEngine->glyphFormat != QFontEngine::Format_None
+ ? fontEngine->glyphFormat : d->glyphCacheFormat;
+ if (glyphFormat == QFontEngine::Format_A32) {
if (d->device->context()->format().alphaBufferSize() > 0 || s->matrix.type() > QTransform::TxTranslate
|| (s->composition_mode != QPainter::CompositionMode_Source
&& s->composition_mode != QPainter::CompositionMode_SourceOver))
{
- glyphType = QFontEngineGlyphCache::Raster_A8;
+ glyphFormat = QFontEngine::Format_A8;
}
}
- d->drawCachedGlyphs(glyphType, textItem);
+ d->drawCachedGlyphs(glyphFormat, textItem);
} else {
QPaintEngineEx::drawStaticTextItem(textItem);
}
@@ -1483,17 +1482,15 @@ void QOpenGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &text
QTransform::TransformationType txtype = s->matrix.type();
- QFontEngineGlyphCache::Type glyphType = ti.fontEngine->glyphFormat >= 0
- ? QFontEngineGlyphCache::Type(ti.fontEngine->glyphFormat)
- : d->glyphCacheType;
+ QFontEngine::GlyphFormat glyphFormat = ti.fontEngine->glyphFormat != QFontEngine::Format_None
+ ? ti.fontEngine->glyphFormat : d->glyphCacheFormat;
-
- if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) {
+ if (glyphFormat == QFontEngine::Format_A32) {
if (d->device->context()->format().alphaBufferSize() > 0 || txtype > QTransform::TxTranslate
|| (state()->composition_mode != QPainter::CompositionMode_Source
&& state()->composition_mode != QPainter::CompositionMode_SourceOver))
{
- glyphType = QFontEngineGlyphCache::Raster_A8;
+ glyphFormat = QFontEngine::Format_A8;
}
}
@@ -1512,7 +1509,7 @@ void QOpenGL2PaintEngineEx::drawTextItem(const QPointF &p, const QTextItem &text
staticTextItem.numGlyphs = glyphs.size();
staticTextItem.glyphPositions = positions.data();
- d->drawCachedGlyphs(glyphType, &staticTextItem);
+ d->drawCachedGlyphs(glyphFormat, &staticTextItem);
}
return;
}
@@ -1537,7 +1534,7 @@ namespace {
QSize cacheSize;
QOpenGL2PEXVertexArray vertexCoordinateArray;
QOpenGL2PEXVertexArray textureCoordinateArray;
- QFontEngineGlyphCache::Type glyphType;
+ QFontEngine::GlyphFormat glyphFormat;
int cacheSerialNumber;
};
@@ -1572,7 +1569,7 @@ bool QOpenGL2PaintEngineEx::shouldDrawCachedGlyphs(QFontEngine *fontEngine, cons
return QPaintEngineEx::shouldDrawCachedGlyphs(fontEngine, t);
}
-void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type glyphType,
+void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat,
QStaticTextItem *staticTextItem)
{
Q_Q(QOpenGL2PaintEngineEx);
@@ -1596,9 +1593,9 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
}
QOpenGLTextureGlyphCache *cache =
- (QOpenGLTextureGlyphCache *) fe->glyphCache(cacheKey, glyphType, glyphCacheTransform);
- if (!cache || cache->cacheType() != glyphType || cache->contextGroup() == 0) {
- cache = new QOpenGLTextureGlyphCache(glyphType, glyphCacheTransform);
+ (QOpenGLTextureGlyphCache *) fe->glyphCache(cacheKey, glyphFormat, glyphCacheTransform);
+ if (!cache || cache->glyphFormat() != glyphFormat || cache->contextGroup() == 0) {
+ cache = new QOpenGLTextureGlyphCache(glyphFormat, glyphCacheTransform);
fe->setGlyphCache(cacheKey, cache);
recreateVertexArrays = true;
}
@@ -1611,7 +1608,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
recreateVertexArrays = true;
} else {
QOpenGLStaticTextUserData *userData = static_cast<QOpenGLStaticTextUserData *>(staticTextItem->userData());
- if (userData->glyphType != glyphType) {
+ if (userData->glyphFormat != glyphFormat) {
recreateVertexArrays = true;
} else if (userData->cacheSerialNumber != cache->serialNumber()) {
recreateVertexArrays = true;
@@ -1636,12 +1633,12 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
if (cache->width() == 0 || cache->height() == 0)
return;
- if (glyphType == QFontEngineGlyphCache::Raster_ARGB)
+ if (glyphFormat == QFontEngine::Format_ARGB)
transferMode(ImageArrayDrawingMode);
else
transferMode(TextDrawingMode);
- int margin = fe->glyphMargin(glyphType);
+ int margin = fe->glyphMargin(glyphFormat);
GLfloat dx = 1.0 / cache->width();
GLfloat dy = 1.0 / cache->height();
@@ -1663,7 +1660,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
userData = static_cast<QOpenGLStaticTextUserData*>(staticTextItem->userData());
}
- userData->glyphType = glyphType;
+ userData->glyphFormat = glyphFormat;
userData->cacheSerialNumber = cache->serialNumber();
// Use cache if backend optimizations is turned on
@@ -1735,7 +1732,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
#endif
}
- if (glyphType != QFontEngineGlyphCache::Raster_ARGB || recreateVertexArrays) {
+ if (glyphFormat != QFontEngine::Format_ARGB || recreateVertexArrays) {
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinates->data());
setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinates->data());
}
@@ -1748,7 +1745,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
QBrush pensBrush = q->state()->pen.brush();
setBrush(pensBrush);
- if (glyphType == QFontEngineGlyphCache::Raster_RGBMask) {
+ if (glyphFormat == QFontEngine::Format_A32) {
// Subpixel antialiasing without gamma correction
@@ -1821,7 +1818,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
glBlendFunc(GL_ONE, GL_ONE);
}
compositionModeDirty = true;
- } else if (glyphType == QFontEngineGlyphCache::Raster_ARGB) {
+ } else if (glyphFormat == QFontEngine::Format_ARGB) {
currentBrush = noBrush;
shaderManager->setSrcPixelType(QOpenGLEngineShaderManager::ImageSrc);
if (prepareForCachedGlyphDraw(*cache))
@@ -1836,7 +1833,7 @@ void QOpenGL2PaintEngineExPrivate::drawCachedGlyphs(QFontEngineGlyphCache::Type
QOpenGLTextureGlyphCache::FilterMode filterMode = (s->matrix.type() > QTransform::TxTranslate)?QOpenGLTextureGlyphCache::Linear:QOpenGLTextureGlyphCache::Nearest;
if (lastMaskTextureUsed != cache->texture() || cache->filterMode() != filterMode) {
- if (glyphType == QFontEngineGlyphCache::Raster_ARGB)
+ if (glyphFormat == QFontEngine::Format_ARGB)
funcs.glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
else
funcs.glActiveTexture(GL_TEXTURE0 + QT_MASK_TEXTURE_UNIT);
@@ -2012,12 +2009,12 @@ bool QOpenGL2PaintEngineEx::begin(QPaintDevice *pdev)
glDisable(GL_DEPTH_TEST);
glDisable(GL_SCISSOR_TEST);
- d->glyphCacheType = QFontEngineGlyphCache::Raster_A8;
+ d->glyphCacheFormat = QFontEngine::Format_A8;
#ifndef QT_OPENGL_ES_2
if (!QOpenGLFunctions::isES()) {
glDisable(GL_MULTISAMPLE);
- d->glyphCacheType = QFontEngineGlyphCache::Raster_RGBMask;
+ d->glyphCacheFormat = QFontEngine::Format_A32;
d->multisamplingAlwaysEnabled = false;
} else
#endif // QT_OPENGL_ES_2
diff --git a/src/gui/opengl/qopenglpaintengine_p.h b/src/gui/opengl/qopenglpaintengine_p.h
index d51f0e5256..4f0e2e52a4 100644
--- a/src/gui/opengl/qopenglpaintengine_p.h
+++ b/src/gui/opengl/qopenglpaintengine_p.h
@@ -212,7 +212,7 @@ public:
void drawTexture(const QOpenGLRect& dest, const QOpenGLRect& src, const QSize &textureSize, bool opaque, bool pattern = false);
void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap,
QPainter::PixmapFragmentHints hints);
- void drawCachedGlyphs(QFontEngineGlyphCache::Type glyphType, QStaticTextItem *staticTextItem);
+ void drawCachedGlyphs(QFontEngine::GlyphFormat glyphFormat, QStaticTextItem *staticTextItem);
// Calls glVertexAttributePointer if the pointer has changed
inline void setVertexAttributePointer(unsigned int arrayIndex, const GLfloat *pointer);
@@ -267,7 +267,7 @@ public:
int width, height;
QOpenGLContext *ctx;
EngineMode mode;
- QFontEngineGlyphCache::Type glyphCacheType;
+ QFontEngine::GlyphFormat glyphCacheFormat;
bool vertexAttributeArraysEnabledState[QT_GL_VERTEX_ARRAY_TRACKED_COUNT];
diff --git a/src/gui/opengl/qopenglproxy_win.cpp b/src/gui/opengl/qopenglproxy_win.cpp
index 83c3073f63..88f3a1d11d 100644
--- a/src/gui/opengl/qopenglproxy_win.cpp
+++ b/src/gui/opengl/qopenglproxy_win.cpp
@@ -680,9 +680,6 @@ static HMODULE qgl_loadLib(const char *name, bool warnOnFail = true)
QWindowsOpenGL::QWindowsOpenGL()
: m_eglLib(0)
{
- if (qEnvironmentVariableIsSet("QT_OPENGLPROXY_DEBUG"))
- QLoggingCategory::setFilterRules(QStringLiteral("qt.gui.openglproxy=true"));
-
enum RequestedLib {
Unknown,
Desktop,
diff --git a/src/gui/opengl/qopenglshaderprogram.cpp b/src/gui/opengl/qopenglshaderprogram.cpp
index 06f40eafd0..164e5e6925 100644
--- a/src/gui/opengl/qopenglshaderprogram.cpp
+++ b/src/gui/opengl/qopenglshaderprogram.cpp
@@ -123,7 +123,8 @@ QT_BEGIN_NAMESPACE
on the return value from programId(). Then the application should
call link(), which will notice that the program has already been
specified and linked, allowing other operations to be performed
- on the shader program.
+ on the shader program. The shader program's id can be explicitly
+ created using the create() function.
\sa QOpenGLShader
*/
@@ -639,6 +640,26 @@ QOpenGLShaderProgram::~QOpenGLShaderProgram()
{
}
+/*!
+ Requests the shader program's id to be created immediately. Returns \c true
+ if successful; \c false otherwise.
+
+ This function is primarily useful when combining QOpenGLShaderProgram
+ with other OpenGL functions that operate directly on the shader
+ program id, like \c {GL_OES_get_program_binary}.
+
+ When the shader program is used normally, the shader program's id will
+ be created on demand.
+
+ \sa programId()
+
+ \since 5.3
+ */
+bool QOpenGLShaderProgram::create()
+{
+ return init();
+}
+
bool QOpenGLShaderProgram::init()
{
Q_D(QOpenGLShaderProgram);
diff --git a/src/gui/opengl/qopenglshaderprogram.h b/src/gui/opengl/qopenglshaderprogram.h
index b894ae3af8..91754842e6 100644
--- a/src/gui/opengl/qopenglshaderprogram.h
+++ b/src/gui/opengl/qopenglshaderprogram.h
@@ -130,6 +130,8 @@ public:
bool bind();
void release();
+ bool create();
+
GLuint programId() const;
int maxGeometryOutputVertices() const;
diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp
index 0d9a2359bd..3524c1cb1a 100644
--- a/src/gui/opengl/qopengltextureglyphcache.cpp
+++ b/src/gui/opengl/qopengltextureglyphcache.cpp
@@ -51,13 +51,14 @@ QT_BEGIN_NAMESPACE
QBasicAtomicInt qopengltextureglyphcache_serial_number = Q_BASIC_ATOMIC_INITIALIZER(1);
-QOpenGLTextureGlyphCache::QOpenGLTextureGlyphCache(QFontEngineGlyphCache::Type type, const QTransform &matrix)
- : QImageTextureGlyphCache(type, matrix)
+QOpenGLTextureGlyphCache::QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix)
+ : QImageTextureGlyphCache(format, matrix)
, m_textureResource(0)
, pex(0)
, m_blitProgram(0)
, m_filterMode(Nearest)
, m_serialNumber(qopengltextureglyphcache_serial_number.fetchAndAddRelaxed(1))
+ , m_buffer(QOpenGLBuffer::VertexBuffer)
{
#ifdef QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
qDebug(" -> QOpenGLTextureGlyphCache() %p for context %p.", this, QOpenGLContext::currentContext());
@@ -88,6 +89,11 @@ QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache()
#endif
}
+static inline bool isCoreProfile()
+{
+ return QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile;
+}
+
void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
{
QOpenGLContext *ctx = const_cast<QOpenGLContext *>(QOpenGLContext::currentContext());
@@ -122,7 +128,7 @@ void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
m_textureResource->m_width = width;
m_textureResource->m_height = height;
- if (m_type == QFontEngineGlyphCache::Raster_RGBMask || m_type == QFontEngineGlyphCache::Raster_ARGB) {
+ if (m_format == QFontEngine::Format_A32 || m_format == QFontEngine::Format_ARGB) {
QVarLengthArray<uchar> data(width * height * 4);
for (int i = 0; i < data.size(); ++i)
data[i] = 0;
@@ -131,7 +137,14 @@ void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
QVarLengthArray<uchar> data(width * height);
for (int i = 0; i < data.size(); ++i)
data[i] = 0;
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
+#if !defined(QT_OPENGL_ES_2)
+ const GLint internalFormat = isCoreProfile() ? GL_R8 : GL_ALPHA;
+ const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA;
+#else
+ const GLint internalFormat = GL_ALPHA;
+ const GLenum format = GL_ALPHA;
+#endif
+ glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, 0, format, GL_UNSIGNED_BYTE, &data[0]);
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -139,6 +152,31 @@ void QOpenGLTextureGlyphCache::createTextureData(int width, int height)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
m_filterMode = Nearest;
+
+ if (!m_buffer.isCreated()) {
+ m_buffer.create();
+ m_buffer.bind();
+ static GLfloat buf[sizeof(m_vertexCoordinateArray) + sizeof(m_textureCoordinateArray)];
+ memcpy(buf, m_vertexCoordinateArray, sizeof(m_vertexCoordinateArray));
+ memcpy(buf + (sizeof(m_vertexCoordinateArray) / sizeof(GLfloat)),
+ m_textureCoordinateArray,
+ sizeof(m_textureCoordinateArray));
+ m_buffer.allocate(buf, sizeof(buf));
+ m_buffer.release();
+ }
+
+ if (!m_vao.isCreated())
+ m_vao.create();
+}
+
+void QOpenGLTextureGlyphCache::setupVertexAttribs()
+{
+ m_buffer.bind();
+ m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
+ m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, sizeof(m_vertexCoordinateArray), 2);
+ m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+ m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+ m_buffer.release();
}
void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height)
@@ -237,16 +275,19 @@ void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height)
m_blitProgram->bindAttributeLocation("textureCoordArray", QT_TEXTURE_COORDS_ATTR);
m_blitProgram->link();
+
+ if (m_vao.isCreated()) {
+ m_vao.bind();
+ setupVertexAttribs();
+ }
}
- funcs.glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_vertexCoordinateArray);
- funcs.glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_textureCoordinateArray);
+ if (m_vao.isCreated())
+ m_vao.bind();
+ else
+ setupVertexAttribs();
m_blitProgram->bind();
- m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
- m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
- m_blitProgram->disableAttributeArray(int(QT_OPACITY_ATTR));
-
blitProgram = m_blitProgram;
} else {
@@ -276,8 +317,12 @@ void QOpenGLTextureGlyphCache::resizeTextureData(int width, int height)
glViewport(0, 0, pex->width, pex->height);
pex->updateClipScissorTest();
} else {
- m_blitProgram->disableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
- m_blitProgram->disableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+ if (m_vao.isCreated()) {
+ m_vao.release();
+ } else {
+ m_blitProgram->disableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+ m_blitProgram->disableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+ }
}
}
@@ -395,7 +440,14 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed
glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y + i, maskWidth, 1, GL_ALPHA, GL_UNSIGNED_BYTE, mask.scanLine(i));
} else {
#endif
- glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_ALPHA, GL_UNSIGNED_BYTE, mask.bits());
+
+#if !defined(QT_OPENGL_ES_2)
+ const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA;
+#else
+ const GLenum format = GL_ALPHA;
+#endif
+ glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, format, GL_UNSIGNED_BYTE, mask.bits());
+
#if 0
}
#endif
diff --git a/src/gui/opengl/qopengltextureglyphcache_p.h b/src/gui/opengl/qopengltextureglyphcache_p.h
index d9456db6ed..1e2c031018 100644
--- a/src/gui/opengl/qopengltextureglyphcache_p.h
+++ b/src/gui/opengl/qopengltextureglyphcache_p.h
@@ -57,6 +57,8 @@
#include <private/qopenglcontext_p.h>
#include <qopenglshaderprogram.h>
#include <qopenglfunctions.h>
+#include <qopenglbuffer.h>
+#include <qopenglvertexarrayobject.h>
// #define QT_GL_TEXTURE_GLYPH_CACHE_DEBUG
@@ -109,7 +111,7 @@ public:
class Q_GUI_EXPORT QOpenGLTextureGlyphCache : public QImageTextureGlyphCache
{
public:
- QOpenGLTextureGlyphCache(QFontEngineGlyphCache::Type type, const QTransform &matrix);
+ QOpenGLTextureGlyphCache(QFontEngine::GlyphFormat glyphFormat, const QTransform &matrix);
~QOpenGLTextureGlyphCache();
virtual void createTextureData(int width, int height);
@@ -152,6 +154,8 @@ public:
void clear();
private:
+ void setupVertexAttribs();
+
QOpenGLGlyphTexture *m_textureResource;
QOpenGL2PaintEngineExPrivate *pex;
@@ -162,6 +166,9 @@ private:
GLfloat m_textureCoordinateArray[8];
int m_serialNumber;
+
+ QOpenGLBuffer m_buffer;
+ QOpenGLVertexArrayObject m_vao;
};
QT_END_NAMESPACE
diff --git a/src/gui/opengl/qopenglversionfunctions.cpp b/src/gui/opengl/qopenglversionfunctions.cpp
index 428f6e8a8b..5df7463e8a 100644
--- a/src/gui/opengl/qopenglversionfunctions.cpp
+++ b/src/gui/opengl/qopenglversionfunctions.cpp
@@ -191,6 +191,8 @@ QAbstractOpenGLFunctions::~QAbstractOpenGLFunctions()
delete d_ptr;
}
+/*! \internal
+ */
bool QAbstractOpenGLFunctions::initializeOpenGLFunctions()
{
Q_D(QAbstractOpenGLFunctions);
diff --git a/src/gui/opengl/qopenglvertexarrayobject.cpp b/src/gui/opengl/qopenglvertexarrayobject.cpp
index e26c6ec25a..52fd482b53 100644
--- a/src/gui/opengl/qopenglvertexarrayobject.cpp
+++ b/src/gui/opengl/qopenglvertexarrayobject.cpp
@@ -45,34 +45,35 @@
#include <QtGui/qopenglcontext.h>
#include <QtGui/qopenglfunctions.h>
-#if !defined(QT_OPENGL_ES_2)
#include <QtGui/qopenglfunctions_3_0.h>
#include <QtGui/qopenglfunctions_3_2_core.h>
-#endif
QT_BEGIN_NAMESPACE
+class QOpenGLFunctions_3_0;
+class QOpenGLFunctions_3_2_Core;
+
class QVertexArrayObjectHelper
{
public:
QVertexArrayObjectHelper(QOpenGLContext *context)
{
Q_ASSERT(context);
-#if !defined(QT_OPENGL_ES_2)
- if (context->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object"))) {
- GenVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress(QByteArrayLiteral("glGenVertexArraysAPPLE")));
- DeleteVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress(QByteArrayLiteral("glDeleteVertexArraysAPPLE")));
- BindVertexArray = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress(QByteArrayLiteral("glBindVertexArrayAPPLE")));
+ if (QOpenGLFunctions::isES()) {
+ GenVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress(QByteArrayLiteral("glGenVertexArraysOES")));
+ DeleteVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress(QByteArrayLiteral("glDeleteVertexArraysOES")));
+ BindVertexArray = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress(QByteArrayLiteral("glBindVertexArrayOES")));
} else {
- GenVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress(QByteArrayLiteral("glGenVertexArrays")));
- DeleteVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress(QByteArrayLiteral("glDeleteVertexArrays")));
- BindVertexArray = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress(QByteArrayLiteral("glBindVertexArray")));
+ if (context->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object"))) {
+ GenVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress(QByteArrayLiteral("glGenVertexArraysAPPLE")));
+ DeleteVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress(QByteArrayLiteral("glDeleteVertexArraysAPPLE")));
+ BindVertexArray = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress(QByteArrayLiteral("glBindVertexArrayAPPLE")));
+ } else {
+ GenVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress(QByteArrayLiteral("glGenVertexArrays")));
+ DeleteVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress(QByteArrayLiteral("glDeleteVertexArrays")));
+ BindVertexArray = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress(QByteArrayLiteral("glBindVertexArray")));
+ }
}
-#else
- GenVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , GLuint *)>(context->getProcAddress(QByteArrayLiteral("glGenVertexArraysOES")));
- DeleteVertexArrays = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLsizei , const GLuint *)>(context->getProcAddress(QByteArrayLiteral("glDeleteVertexArraysOES")));
- BindVertexArray = reinterpret_cast<void (QOPENGLF_APIENTRYP)(GLuint )>(context->getProcAddress(QByteArrayLiteral("glBindVertexArrayOES")));
-#endif
}
inline void glGenVertexArrays(GLsizei n, GLuint *arrays)
@@ -102,23 +103,15 @@ class QOpenGLVertexArrayObjectPrivate : public QObjectPrivate
public:
QOpenGLVertexArrayObjectPrivate()
: vao(0)
-#if defined(QT_OPENGL_ES_2)
- , vaoFuncs(0)
-#else
, vaoFuncsType(NotSupported)
-#endif
, context(0)
{
}
~QOpenGLVertexArrayObjectPrivate()
{
-#if defined(QT_OPENGL_ES_2)
- delete vaoFuncs;
-#else
- if ((vaoFuncsType == ARB) || (vaoFuncsType == APPLE))
+ if (vaoFuncsType == ARB || vaoFuncsType == APPLE || vaoFuncsType == OES)
delete vaoFuncs.helper;
-#endif
}
bool create();
@@ -131,9 +124,6 @@ public:
GLuint vao;
-#if defined(QT_OPENGL_ES_2)
- QVertexArrayObjectHelper *vaoFuncs;
-#else
union {
QOpenGLFunctions_3_0 *core_3_0;
QOpenGLFunctions_3_2_Core *core_3_2;
@@ -144,9 +134,10 @@ public:
Core_3_0,
Core_3_2,
ARB,
- APPLE
+ APPLE,
+ OES
} vaoFuncsType;
-#endif
+
QOpenGLContext *context;
};
@@ -157,13 +148,6 @@ bool QOpenGLVertexArrayObjectPrivate::create()
return false;
}
-#if !defined(QT_OPENGL_ES_2)
- if (QOpenGLFunctions::isES()) {
- qWarning("QOpenGLVertexArrayObject: Not supported on dynamic GL ES");
- return false;
- }
-#endif
-
Q_Q(QOpenGLVertexArrayObject);
if (context)
QObject::disconnect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
@@ -176,35 +160,40 @@ bool QOpenGLVertexArrayObjectPrivate::create()
context = ctx;
QObject::connect(context, SIGNAL(aboutToBeDestroyed()), q, SLOT(_q_contextAboutToBeDestroyed()));
-#if defined(QT_OPENGL_ES_2)
- if (ctx->hasExtension(QByteArrayLiteral("GL_OES_vertex_array_object"))) {
- vaoFuncs = new QVertexArrayObjectHelper(ctx);
- vaoFuncs->glGenVertexArrays(1, &vao);
- }
-#else
- vaoFuncs.core_3_0 = 0;
- vaoFuncsType = NotSupported;
- QSurfaceFormat format = ctx->format();
- if (format.version() >= qMakePair<int, int>(3,2)) {
- vaoFuncs.core_3_2 = ctx->versionFunctions<QOpenGLFunctions_3_2_Core>();
- vaoFuncsType = Core_3_2;
- vaoFuncs.core_3_2->initializeOpenGLFunctions();
- vaoFuncs.core_3_2->glGenVertexArrays(1, &vao);
- } else if (format.majorVersion() >= 3) {
- vaoFuncs.core_3_0 = ctx->versionFunctions<QOpenGLFunctions_3_0>();
- vaoFuncsType = Core_3_0;
- vaoFuncs.core_3_0->initializeOpenGLFunctions();
- vaoFuncs.core_3_0->glGenVertexArrays(1, &vao);
- } else if (ctx->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
- vaoFuncs.helper = new QVertexArrayObjectHelper(ctx);
- vaoFuncsType = ARB;
- vaoFuncs.helper->glGenVertexArrays(1, &vao);
- } else if (ctx->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object"))) {
- vaoFuncs.helper = new QVertexArrayObjectHelper(ctx);
- vaoFuncsType = APPLE;
- vaoFuncs.helper->glGenVertexArrays(1, &vao);
- }
+ if (QOpenGLFunctions::isES()) {
+ if (ctx->hasExtension(QByteArrayLiteral("GL_OES_vertex_array_object"))) {
+ vaoFuncs.helper = new QVertexArrayObjectHelper(ctx);
+ vaoFuncsType = OES;
+ vaoFuncs.helper->glGenVertexArrays(1, &vao);
+ }
+ } else {
+ vaoFuncs.core_3_0 = 0;
+ vaoFuncsType = NotSupported;
+ QSurfaceFormat format = ctx->format();
+#ifndef QT_OPENGL_ES_2
+ if (format.version() >= qMakePair<int, int>(3,2)) {
+ vaoFuncs.core_3_2 = ctx->versionFunctions<QOpenGLFunctions_3_2_Core>();
+ vaoFuncsType = Core_3_2;
+ vaoFuncs.core_3_2->initializeOpenGLFunctions();
+ vaoFuncs.core_3_2->glGenVertexArrays(1, &vao);
+ } else if (format.majorVersion() >= 3) {
+ vaoFuncs.core_3_0 = ctx->versionFunctions<QOpenGLFunctions_3_0>();
+ vaoFuncsType = Core_3_0;
+ vaoFuncs.core_3_0->initializeOpenGLFunctions();
+ vaoFuncs.core_3_0->glGenVertexArrays(1, &vao);
+ } else
#endif
+ if (ctx->hasExtension(QByteArrayLiteral("GL_ARB_vertex_array_object"))) {
+ vaoFuncs.helper = new QVertexArrayObjectHelper(ctx);
+ vaoFuncsType = ARB;
+ vaoFuncs.helper->glGenVertexArrays(1, &vao);
+ } else if (ctx->hasExtension(QByteArrayLiteral("GL_APPLE_vertex_array_object"))) {
+ vaoFuncs.helper = new QVertexArrayObjectHelper(ctx);
+ vaoFuncsType = APPLE;
+ vaoFuncs.helper->glGenVertexArrays(1, &vao);
+ }
+ }
+
return (vao != 0);
}
@@ -212,25 +201,25 @@ void QOpenGLVertexArrayObjectPrivate::destroy()
{
if (!vao)
return;
-#if defined(QT_OPENGL_ES_2)
- if (vaoFuncs)
- vaoFuncs->glDeleteVertexArrays(1, &vao);
-#else
+
switch (vaoFuncsType) {
+#ifndef QT_OPENGL_ES_2
case Core_3_2:
vaoFuncs.core_3_2->glDeleteVertexArrays(1, &vao);
break;
case Core_3_0:
vaoFuncs.core_3_0->glDeleteVertexArrays(1, &vao);
break;
+#endif
case ARB:
case APPLE:
+ case OES:
vaoFuncs.helper->glDeleteVertexArrays(1, &vao);
break;
- case NotSupported:
+ default:
break;
}
-#endif
+
vao = 0;
}
@@ -244,48 +233,44 @@ void QOpenGLVertexArrayObjectPrivate::_q_contextAboutToBeDestroyed()
void QOpenGLVertexArrayObjectPrivate::bind()
{
-#if defined(QT_OPENGL_ES_2)
- if (vaoFuncs)
- vaoFuncs->glBindVertexArray(vao);
-#else
switch (vaoFuncsType) {
+#ifndef QT_OPENGL_ES_2
case Core_3_2:
vaoFuncs.core_3_2->glBindVertexArray(vao);
break;
case Core_3_0:
vaoFuncs.core_3_0->glBindVertexArray(vao);
break;
+#endif
case ARB:
case APPLE:
+ case OES:
vaoFuncs.helper->glBindVertexArray(vao);
break;
- case NotSupported:
+ default:
break;
}
-#endif
}
void QOpenGLVertexArrayObjectPrivate::release()
{
-#if defined(QT_OPENGL_ES_2)
- if (vaoFuncs)
- vaoFuncs->glBindVertexArray(0);
-#else
switch (vaoFuncsType) {
+#ifndef QT_OPENGL_ES_2
case Core_3_2:
vaoFuncs.core_3_2->glBindVertexArray(0);
break;
case Core_3_0:
vaoFuncs.core_3_0->glBindVertexArray(0);
break;
+#endif
case ARB:
case APPLE:
+ case OES:
vaoFuncs.helper->glBindVertexArray(0);
break;
- case NotSupported:
+ default:
break;
}
-#endif
}
diff --git a/src/gui/painting/qoutlinemapper.cpp b/src/gui/painting/qoutlinemapper.cpp
index 8b47dae5ff..6a38ed6c70 100644
--- a/src/gui/painting/qoutlinemapper.cpp
+++ b/src/gui/painting/qoutlinemapper.cpp
@@ -48,7 +48,7 @@
QT_BEGIN_NAMESPACE
-#define qreal_to_fixed_26_6(f) (int(f * 64))
+#define qreal_to_fixed_26_6(f) (qRound(f * 64))
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 9a2e49618c..67896f786d 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -523,7 +523,7 @@ bool QRasterPaintEngine::begin(QPaintDevice *device)
#endif
if (d->mono_surface)
- d->glyphCacheType = QFontEngineGlyphCache::Raster_Mono;
+ d->glyphCacheFormat = QFontEngine::Format_Mono;
#if defined(Q_OS_WIN)
else if (clearTypeFontsEnabled())
#else
@@ -532,11 +532,11 @@ bool QRasterPaintEngine::begin(QPaintDevice *device)
{
QImage::Format format = static_cast<QImage *>(d->device)->format();
if (format == QImage::Format_ARGB32_Premultiplied || format == QImage::Format_RGB32)
- d->glyphCacheType = QFontEngineGlyphCache::Raster_RGBMask;
+ d->glyphCacheFormat = QFontEngine::Format_A32;
else
- d->glyphCacheType = QFontEngineGlyphCache::Raster_A8;
+ d->glyphCacheFormat = QFontEngine::Format_A8;
} else
- d->glyphCacheType = QFontEngineGlyphCache::Raster_A8;
+ d->glyphCacheFormat = QFontEngine::Format_A8;
setActive(true);
return true;
@@ -2819,12 +2819,12 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs,
}
} else {
- QFontEngineGlyphCache::Type glyphType = fontEngine->glyphFormat >= 0 ? QFontEngineGlyphCache::Type(fontEngine->glyphFormat) : d->glyphCacheType;
+ QFontEngine::GlyphFormat glyphFormat = fontEngine->glyphFormat != QFontEngine::Format_None ? fontEngine->glyphFormat : d->glyphCacheFormat;
QImageTextureGlyphCache *cache =
- static_cast<QImageTextureGlyphCache *>(fontEngine->glyphCache(0, glyphType, s->matrix));
+ static_cast<QImageTextureGlyphCache *>(fontEngine->glyphCache(0, glyphFormat, s->matrix));
if (!cache) {
- cache = new QImageTextureGlyphCache(glyphType, s->matrix);
+ cache = new QImageTextureGlyphCache(glyphFormat, s->matrix);
fontEngine->setGlyphCache(0, cache);
}
@@ -2842,7 +2842,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs,
else if (depth == 1)
rightShift = 3; // divide by 8
- int margin = fontEngine->glyphMargin(glyphType);
+ int margin = fontEngine->glyphMargin(glyphFormat);
const uchar *bits = image.bits();
for (int i=0; i<numGlyphs; ++i) {
@@ -2865,7 +2865,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs,
const uchar *glyphBits = bits + ((c.x << leftShift) >> rightShift) + c.y * bpl;
- if (glyphType == QFontEngineGlyphCache::Raster_ARGB) {
+ if (glyphFormat == QFontEngine::Format_ARGB) {
// The current state transform has already been applied to the positions,
// so we prevent drawImage() from re-applying the transform by clearing
// the state for the duration of the call.
@@ -3064,7 +3064,7 @@ void QRasterPaintEngine::drawTextItem(const QPointF &p, const QTextItem &textIte
Q_D(QRasterPaintEngine);
fprintf(stderr," - QRasterPaintEngine::drawTextItem(), (%.2f,%.2f), string=%s ct=%d\n",
p.x(), p.y(), QString::fromRawData(ti.chars, ti.num_chars).toLatin1().data(),
- d->glyphCacheType);
+ d->glyphCacheFormat);
#endif
if (ti.glyphs.numGlyphs == 0)
diff --git a/src/gui/painting/qpaintengine_raster_p.h b/src/gui/painting/qpaintengine_raster_p.h
index 00a9ae750c..4bfdbd91e0 100644
--- a/src/gui/painting/qpaintengine_raster_p.h
+++ b/src/gui/painting/qpaintengine_raster_p.h
@@ -336,7 +336,7 @@ public:
QSpanData solid_color_filler;
- QFontEngineGlyphCache::Type glyphCacheType;
+ QFontEngine::GlyphFormat glyphCacheFormat;
QScopedPointer<QClipData> baseClip;
diff --git a/src/gui/painting/qpaintengineex.cpp b/src/gui/painting/qpaintengineex.cpp
index 6e72b5db7f..e75a59cc91 100644
--- a/src/gui/painting/qpaintengineex.cpp
+++ b/src/gui/painting/qpaintengineex.cpp
@@ -1088,7 +1088,7 @@ bool QPaintEngineEx::requiresPretransformedGlyphPositions(QFontEngine *, const Q
bool QPaintEngineEx::shouldDrawCachedGlyphs(QFontEngine *fontEngine, const QTransform &m) const
{
- if (fontEngine->glyphFormat == QFontEngineGlyphCache::Raster_ARGB)
+ if (fontEngine->glyphFormat == QFontEngine::Format_ARGB)
return true;
qreal pixelSize = fontEngine->fontDef.pixelSize;
diff --git a/src/gui/painting/qpainter.cpp b/src/gui/painting/qpainter.cpp
index 1fc044aa44..e35cdd370e 100644
--- a/src/gui/painting/qpainter.cpp
+++ b/src/gui/painting/qpainter.cpp
@@ -171,9 +171,6 @@ static bool qt_painter_thread_test(int devType, const char *what)
void QPainterPrivate::checkEmulation()
{
Q_ASSERT(extended);
- if (extended->flags() & QPaintEngineEx::DoNotEmulate)
- return;
-
bool doEmulation = false;
if (state->bgMode == Qt::OpaqueMode)
doEmulation = true;
@@ -186,6 +183,9 @@ void QPainterPrivate::checkEmulation()
if (pg && pg->coordinateMode() > QGradient::LogicalMode)
doEmulation = true;
+ if (doEmulation && extended->flags() & QPaintEngineEx::DoNotEmulate)
+ return;
+
if (doEmulation) {
if (extended != emulationEngine) {
if (!emulationEngine)
diff --git a/src/gui/painting/qpainterpath.h b/src/gui/painting/qpainterpath.h
index c922867eb9..db65e14af9 100644
--- a/src/gui/painting/qpainterpath.h
+++ b/src/gui/painting/qpainterpath.h
@@ -244,7 +244,7 @@ class Q_GUI_EXPORT QPainterPathStroker
Q_DECLARE_PRIVATE(QPainterPathStroker)
public:
QPainterPathStroker();
- QPainterPathStroker(const QPen &pen);
+ explicit QPainterPathStroker(const QPen &pen);
~QPainterPathStroker();
void setWidth(qreal width);
diff --git a/src/gui/painting/qtextureglyphcache.cpp b/src/gui/painting/qtextureglyphcache.cpp
index e340c1e613..83edeb41a6 100644
--- a/src/gui/painting/qtextureglyphcache.cpp
+++ b/src/gui/painting/qtextureglyphcache.cpp
@@ -130,14 +130,6 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
QHash<GlyphAndSubPixelPosition, Coord> listItemCoordinates;
int rowHeight = 0;
- QFontEngine::GlyphFormat format;
- switch (m_type) {
- case Raster_A8: format = QFontEngine::Format_A8; break;
- case Raster_RGBMask: format = QFontEngine::Format_A32; break;
- case Raster_ARGB: format = QFontEngine::Format_ARGB; break;
- default: format = QFontEngine::Format_Mono; break;
- }
-
// check each glyph for its metrics and get the required rowHeight.
for (int i=0; i < numGlyphs; ++i) {
const glyph_t glyph = glyphs[i];
@@ -159,12 +151,12 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
// we ask for the alphaMapBoundingBox(), the glyph will be loaded, rasterized and its
// proper metrics will be cached and used later.
if (fontEngine->hasInternalCaching()) {
- QImage *locked = fontEngine->lockedAlphaMapForGlyph(glyph, subPixelPosition, format);
+ QImage *locked = fontEngine->lockedAlphaMapForGlyph(glyph, subPixelPosition, m_format);
if (locked && !locked->isNull())
fontEngine->unlockAlphaMapForGlyph();
}
- glyph_metrics_t metrics = fontEngine->alphaMapBoundingBox(glyph, subPixelPosition, m_transform, format);
+ glyph_metrics_t metrics = fontEngine->alphaMapBoundingBox(glyph, subPixelPosition, m_transform, m_format);
#ifdef CACHE_DEBUG
printf("(%4x): w=%.2f, h=%.2f, xoff=%.2f, yoff=%.2f, x=%.2f, y=%.2f\n",
@@ -186,7 +178,7 @@ bool QTextureGlyphCache::populate(QFontEngine *fontEngine, int numGlyphs, const
continue;
}
// align to 8-bit boundary
- if (m_type == QFontEngineGlyphCache::Raster_Mono)
+ if (m_format == QFontEngine::Format_Mono)
glyph_width = (glyph_width+7)&~7;
Coord c = { 0, 0, // will be filled in later
@@ -289,11 +281,14 @@ void QTextureGlyphCache::fillInPendingGlyphs()
QImage QTextureGlyphCache::textureMapForGlyph(glyph_t g, QFixed subPixelPosition) const
{
- if (m_type == QFontEngineGlyphCache::Raster_RGBMask)
+ switch (m_format) {
+ case QFontEngine::Format_A32:
return m_current_fontengine->alphaRGBMapForGlyph(g, subPixelPosition, m_transform);
- else if (m_type == QFontEngineGlyphCache::Raster_ARGB)
+ case QFontEngine::Format_ARGB:
return m_current_fontengine->bitmapForGlyph(g, subPixelPosition, m_transform);
- return m_current_fontengine->alphaMapForGlyph(g, subPixelPosition, m_transform);
+ default:
+ return m_current_fontengine->alphaMapForGlyph(g, subPixelPosition, m_transform);
+ }
}
/************************************************************************
@@ -307,11 +302,11 @@ void QImageTextureGlyphCache::resizeTextureData(int width, int height)
void QImageTextureGlyphCache::createTextureData(int width, int height)
{
- switch (m_type) {
- case QFontEngineGlyphCache::Raster_Mono:
+ switch (m_format) {
+ case QFontEngine::Format_Mono:
m_image = QImage(width, height, QImage::Format_Mono);
break;
- case QFontEngineGlyphCache::Raster_A8: {
+ case QFontEngine::Format_A8: {
m_image = QImage(width, height, QImage::Format_Indexed8);
m_image.fill(0);
QVector<QRgb> colors(256);
@@ -320,12 +315,14 @@ void QImageTextureGlyphCache::createTextureData(int width, int height)
*it = 0xff000000 | i | (i<<8) | (i<<16);
m_image.setColorTable(colors);
break; }
- case QFontEngineGlyphCache::Raster_RGBMask:
+ case QFontEngine::Format_A32:
m_image = QImage(width, height, QImage::Format_RGB32);
break;
- case QFontEngineGlyphCache::Raster_ARGB:
+ case QFontEngine::Format_ARGB:
m_image = QImage(width, height, QImage::Format_ARGB32_Premultiplied);
break;
+ default:
+ Q_UNREACHABLE();
}
}
@@ -341,8 +338,8 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP
}
#endif
- if (m_type == QFontEngineGlyphCache::Raster_RGBMask
- || m_type == QFontEngineGlyphCache::Raster_ARGB) {
+ if (m_format == QFontEngine::Format_A32
+ || m_format == QFontEngine::Format_ARGB) {
QImage ref(m_image.bits() + (c.x * 4 + c.y * m_image.bytesPerLine()),
qMax(mask.width(), c.w), qMax(mask.height(), c.h), m_image.bytesPerLine(),
m_image.format());
@@ -351,7 +348,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP
p.fillRect(0, 0, c.w, c.h, QColor(0,0,0,0)); // TODO optimize this
p.drawImage(0, 0, mask);
p.end();
- } else if (m_type == QFontEngineGlyphCache::Raster_Mono) {
+ } else if (m_format == QFontEngine::Format_Mono) {
if (mask.depth() > 1) {
// TODO optimize this
mask = mask.alphaChannel();
@@ -414,7 +411,7 @@ void QImageTextureGlyphCache::fillTexture(const Coord &c, glyph_t g, QFixed subP
#ifdef CACHE_DEBUG
// QPainter p(&m_image);
// p.drawLine(
- int margin = m_current_fontengine ? m_current_fontengine->glyphMargin(m_type) : 0;
+ int margin = m_current_fontengine ? m_current_fontengine->glyphMargin(m_format) : 0;
QPoint base(c.x + margin, c.y + margin + c.baseLineY-1);
if (m_image.rect().contains(base))
m_image.setPixel(base, 255);
diff --git a/src/gui/painting/qtextureglyphcache_p.h b/src/gui/painting/qtextureglyphcache_p.h
index d93f57ad80..84f62717f6 100644
--- a/src/gui/painting/qtextureglyphcache_p.h
+++ b/src/gui/painting/qtextureglyphcache_p.h
@@ -75,8 +75,8 @@ class QTextItemInt;
class Q_GUI_EXPORT QTextureGlyphCache : public QFontEngineGlyphCache
{
public:
- QTextureGlyphCache(QFontEngineGlyphCache::Type type, const QTransform &matrix)
- : QFontEngineGlyphCache(matrix, type), m_current_fontengine(0),
+ QTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix)
+ : QFontEngineGlyphCache(format, matrix), m_current_fontengine(0),
m_w(0), m_h(0), m_cx(0), m_cy(0), m_currentRowHeight(0)
{ }
@@ -163,8 +163,8 @@ inline uint qHash(const QTextureGlyphCache::GlyphAndSubPixelPosition &g)
class Q_GUI_EXPORT QImageTextureGlyphCache : public QTextureGlyphCache
{
public:
- QImageTextureGlyphCache(QFontEngineGlyphCache::Type type, const QTransform &matrix)
- : QTextureGlyphCache(type, matrix) { }
+ QImageTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix)
+ : QTextureGlyphCache(format, matrix) { }
virtual void createTextureData(int width, int height);
virtual void resizeTextureData(int width, int height);
virtual void fillTexture(const Coord &c, glyph_t glyph, QFixed subPixelPosition);
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index 14ce5d2396..83e64a51a6 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -41,6 +41,7 @@
#include <qdebug.h>
#include <private/qfontengine_p.h>
+#include <private/qfontengineglyphcache_p.h>
#include "qbitmap.h"
#include "qpainter.h"
@@ -253,7 +254,7 @@ QFontEngine::QFontEngine()
fsType = 0;
symbol = false;
- glyphFormat = -1;
+ glyphFormat = Format_None;
m_subPixelPositionCount = 0;
#ifdef QT_BUILD_INTERNAL
@@ -979,12 +980,12 @@ void QFontEngine::setGlyphCache(const void *key, QFontEngineGlyphCache *data)
}
-QFontEngineGlyphCache *QFontEngine::glyphCache(const void *key, QFontEngineGlyphCache::Type type, const QTransform &transform) const
+QFontEngineGlyphCache *QFontEngine::glyphCache(const void *key, GlyphFormat format, const QTransform &transform) const
{
for (QLinkedList<GlyphCacheEntry>::const_iterator it = m_glyphCaches.constBegin(), end = m_glyphCaches.constEnd(); it != end; ++it) {
QFontEngineGlyphCache *c = it->cache.data();
if (key == it->context
- && type == c->cacheType()
+ && format == c->glyphFormat()
&& qtransform_equals_no_translate(c->m_transform, transform)) {
return c;
}
@@ -1354,6 +1355,28 @@ QFixed QFontEngine::lastRightBearing(const QGlyphLayout &glyphs, bool round)
return 0;
}
+
+QFontEngine::GlyphCacheEntry::GlyphCacheEntry()
+ : context(0)
+{
+}
+
+QFontEngine::GlyphCacheEntry::GlyphCacheEntry(const GlyphCacheEntry &o)
+ : context(o.context), cache(o.cache)
+{
+}
+
+QFontEngine::GlyphCacheEntry::~GlyphCacheEntry()
+{
+}
+
+QFontEngine::GlyphCacheEntry &QFontEngine::GlyphCacheEntry::operator=(const GlyphCacheEntry &o)
+{
+ context = o.context;
+ cache = o.cache;
+ return *this;
+}
+
// ------------------------------------------------------------------
// The box font engine
// ------------------------------------------------------------------
diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp
index 665932e4a5..c13f60ff69 100644
--- a/src/gui/text/qfontengine_ft.cpp
+++ b/src/gui/text/qfontengine_ft.cpp
@@ -690,11 +690,9 @@ bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format,
this->antialias = antialias;
if (!antialias)
- glyphFormat = QFontEngineGlyphCache::Raster_Mono;
- else if (format == Format_A8)
- glyphFormat = QFontEngineGlyphCache::Raster_A8;
- else if (format == Format_A32)
- glyphFormat = QFontEngineGlyphCache::Raster_RGBMask;
+ glyphFormat = QFontEngine::Format_Mono;
+ else
+ glyphFormat = defaultFormat;
face_id = faceId;
@@ -1619,7 +1617,7 @@ void QFontEngineFT::recalcAdvances(QGlyphLayout *glyphs, QFontEngine::ShaperFlag
face = lockFace();
g = loadGlyph(cacheEnabled ? &defaultGlyphSet : 0, glyphs->glyphs[i], 0, Format_None, true);
glyphs->advances[i] = design ? QFixed::fromFixed(face->glyph->linearHoriAdvance >> 10)
- : QFixed::fromFixed(face->glyph->metrics.horiAdvance);
+ : QFixed::fromFixed(face->glyph->metrics.horiAdvance).round();
if (!cacheEnabled)
delete g;
}
diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h
index 7df66b9678..ad1598ba6d 100644
--- a/src/gui/text/qfontengine_ft_p.h
+++ b/src/gui/text/qfontengine_ft_p.h
@@ -264,7 +264,7 @@ private:
virtual void unlockAlphaMapForGlyph();
virtual void removeGlyphFromCache(glyph_t glyph);
- virtual int glyphMargin(QFontEngineGlyphCache::Type /* type */) { return 0; }
+ virtual int glyphMargin(QFontEngine::GlyphFormat /* format */) { return 0; }
virtual int glyphCount() const;
diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h
index 532ebaf8ff..0bfb9e70e2 100644
--- a/src/gui/text/qfontengine_p.h
+++ b/src/gui/text/qfontengine_p.h
@@ -60,11 +60,10 @@
#include "private/qtextengine_p.h"
#include "private/qfont_p.h"
-#include <private/qfontengineglyphcache_p.h>
-
QT_BEGIN_NAMESPACE
class QPainterPath;
+class QFontEngineGlyphCache;
struct QGlyphLayout;
@@ -246,7 +245,7 @@ public:
virtual Type type() const = 0;
virtual int glyphCount() const;
- virtual int glyphMargin(QFontEngineGlyphCache::Type type) { return type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0; }
+ virtual int glyphMargin(GlyphFormat format) { return format == Format_A32 ? 2 : 0; }
virtual QFontEngine *cloneWithSize(qreal /*pixelSize*/) const { return 0; }
@@ -258,7 +257,7 @@ public:
void clearGlyphCache(const void *key);
void setGlyphCache(const void *key, QFontEngineGlyphCache *data);
- QFontEngineGlyphCache *glyphCache(const void *key, QFontEngineGlyphCache::Type type, const QTransform &transform) const;
+ QFontEngineGlyphCache *glyphCache(const void *key, GlyphFormat format, const QTransform &transform) const;
static const uchar *getCMap(const uchar *table, uint tableSize, bool *isSymbolFont, int *cmapSize);
static quint32 getTrueTypeGlyphIndex(const uchar *cmap, uint unicode);
@@ -300,7 +299,7 @@ public:
QVector<KernPair> kerning_pairs;
void loadKerningPairs(QFixed scalingFactor);
- int glyphFormat;
+ GlyphFormat glyphFormat;
QImage currentlyLockedAlphaMap;
int m_subPixelPositionCount; // Number of positions within a single pixel for this cache
@@ -313,6 +312,12 @@ protected:
private:
struct GlyphCacheEntry {
+ GlyphCacheEntry();
+ GlyphCacheEntry(const GlyphCacheEntry &);
+ ~GlyphCacheEntry();
+
+ GlyphCacheEntry &operator=(const GlyphCacheEntry &);
+
const void *context;
QExplicitlySharedDataPointer<QFontEngineGlyphCache> cache;
bool operator==(const GlyphCacheEntry &other) const { return context == other.context && cache == other.cache; }
diff --git a/src/gui/text/qfontengineglyphcache_p.h b/src/gui/text/qfontengineglyphcache_p.h
index ac01c78399..65be14b90f 100644
--- a/src/gui/text/qfontengineglyphcache_p.h
+++ b/src/gui/text/qfontengineglyphcache_p.h
@@ -58,6 +58,7 @@
#include "QtCore/qatomic.h"
#include <QtCore/qvarlengtharray.h>
#include "private/qfont_p.h"
+#include "private/qfontengine_p.h"
@@ -66,22 +67,18 @@ QT_BEGIN_NAMESPACE
class QFontEngineGlyphCache: public QSharedData
{
public:
- enum Type {
- Raster_RGBMask,
- Raster_A8,
- Raster_Mono,
- Raster_ARGB
- };
-
- QFontEngineGlyphCache(const QTransform &matrix, Type type) : m_transform(matrix), m_type(type) { }
+ QFontEngineGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix) : m_format(format), m_transform(matrix)
+ {
+ Q_ASSERT(m_format != QFontEngine::Format_None);
+ }
virtual ~QFontEngineGlyphCache() { }
- Type cacheType() const { return m_type; }
+ QFontEngine::GlyphFormat glyphFormat() const { return m_format; }
const QTransform &transform() const { return m_transform; }
+ QFontEngine::GlyphFormat m_format;
QTransform m_transform;
- QFontEngineGlyphCache::Type m_type;
};
typedef QHash<void *, QList<QFontEngineGlyphCache *> > GlyphPointerHash;
typedef QHash<int, QList<QFontEngineGlyphCache *> > GlyphIntHash;
diff --git a/src/gui/text/qplatformfontdatabase.cpp b/src/gui/text/qplatformfontdatabase.cpp
index 7936831e13..3049e0ab5e 100644
--- a/src/gui/text/qplatformfontdatabase.cpp
+++ b/src/gui/text/qplatformfontdatabase.cpp
@@ -500,58 +500,60 @@ QSupportedWritingSystems QPlatformFontDatabase::writingSystemsFromTrueTypeBits(q
}
}
}
- if (codePageRange[0] & ((1 << Latin1CsbBit) | (1 << CentralEuropeCsbBit) | (1 << TurkishCsbBit) | (1 << BalticCsbBit))) {
- writingSystems.setSupported(QFontDatabase::Latin);
- hasScript = true;
- //qDebug("font %s supports Latin", familyName.latin1());
- }
- if (codePageRange[0] & (1 << CyrillicCsbBit)) {
- writingSystems.setSupported(QFontDatabase::Cyrillic);
- hasScript = true;
- //qDebug("font %s supports Cyrillic", familyName.latin1());
- }
- if (codePageRange[0] & (1 << GreekCsbBit)) {
- writingSystems.setSupported(QFontDatabase::Greek);
- hasScript = true;
- //qDebug("font %s supports Greek", familyName.latin1());
- }
- if (codePageRange[0] & (1 << HebrewCsbBit)) {
- writingSystems.setSupported(QFontDatabase::Hebrew);
- hasScript = true;
- //qDebug("font %s supports Hebrew", familyName.latin1());
- }
- if (codePageRange[0] & (1 << ArabicCsbBit)) {
- writingSystems.setSupported(QFontDatabase::Arabic);
- hasScript = true;
- //qDebug("font %s supports Arabic", familyName.latin1());
- }
- if (codePageRange[0] & (1 << VietnameseCsbBit)) {
- writingSystems.setSupported(QFontDatabase::Vietnamese);
- hasScript = true;
- //qDebug("font %s supports Vietnamese", familyName.latin1());
- }
- if (codePageRange[0] & (1 << SimplifiedChineseCsbBit)) {
- writingSystems.setSupported(QFontDatabase::SimplifiedChinese);
- hasScript = true;
- //qDebug("font %s supports Simplified Chinese", familyName.latin1());
- }
- if (codePageRange[0] & (1 << TraditionalChineseCsbBit)) {
- writingSystems.setSupported(QFontDatabase::TraditionalChinese);
- hasScript = true;
- //qDebug("font %s supports Traditional Chinese", familyName.latin1());
- }
- if (codePageRange[0] & (1 << JapaneseCsbBit)) {
- writingSystems.setSupported(QFontDatabase::Japanese);
- hasScript = true;
- //qDebug("font %s supports Japanese", familyName.latin1());
- }
- if (codePageRange[0] & ((1 << KoreanCsbBit) | (1 << KoreanJohabCsbBit))) {
- writingSystems.setSupported(QFontDatabase::Korean);
- hasScript = true;
- //qDebug("font %s supports Korean", familyName.latin1());
+ if (!hasScript) {
+ if (codePageRange[0] & ((1 << Latin1CsbBit) | (1 << CentralEuropeCsbBit) | (1 << TurkishCsbBit) | (1 << BalticCsbBit))) {
+ writingSystems.setSupported(QFontDatabase::Latin);
+ hasScript = true;
+ //qDebug("font %s supports Latin", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << CyrillicCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Cyrillic);
+ hasScript = true;
+ //qDebug("font %s supports Cyrillic", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << GreekCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Greek);
+ hasScript = true;
+ //qDebug("font %s supports Greek", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << HebrewCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Hebrew);
+ hasScript = true;
+ //qDebug("font %s supports Hebrew", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << ArabicCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Arabic);
+ hasScript = true;
+ //qDebug("font %s supports Arabic", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << VietnameseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Vietnamese);
+ hasScript = true;
+ //qDebug("font %s supports Vietnamese", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << SimplifiedChineseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::SimplifiedChinese);
+ hasScript = true;
+ //qDebug("font %s supports Simplified Chinese", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << TraditionalChineseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::TraditionalChinese);
+ hasScript = true;
+ //qDebug("font %s supports Traditional Chinese", familyName.latin1());
+ }
+ if (codePageRange[0] & (1 << JapaneseCsbBit)) {
+ writingSystems.setSupported(QFontDatabase::Japanese);
+ hasScript = true;
+ //qDebug("font %s supports Japanese", familyName.latin1());
+ }
+ if (codePageRange[0] & ((1 << KoreanCsbBit) | (1 << KoreanJohabCsbBit))) {
+ writingSystems.setSupported(QFontDatabase::Korean);
+ hasScript = true;
+ //qDebug("font %s supports Korean", familyName.latin1());
+ }
+ if (!hasScript)
+ writingSystems.setSupported(QFontDatabase::Symbol);
}
- if (!hasScript)
- writingSystems.setSupported(QFontDatabase::Symbol);
return writingSystems;
}
diff --git a/src/gui/text/qtextengine.cpp b/src/gui/text/qtextengine.cpp
index eb31c520ed..63e2af8d15 100644
--- a/src/gui/text/qtextengine.cpp
+++ b/src/gui/text/qtextengine.cpp
@@ -1133,6 +1133,21 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
uint cluster = infos[i].cluster;
if (last_cluster != cluster) {
+ if (Q_UNLIKELY(g.glyphs[i] == 0)) {
+ // hide characters that should normally be invisible
+ switch (string[item_pos + str_pos]) {
+ case QChar::LineFeed:
+ case 0x000c: // FormFeed
+ case QChar::CarriageReturn:
+ case QChar::LineSeparator:
+ case QChar::ParagraphSeparator:
+ g.attributes[i].dontPrint = true;
+ break;
+ default:
+ break;
+ }
+ }
+
// fix up clusters so that the cluster indices will be monotonic
// and thus we never return out-of-order indices
while (last_cluster++ < cluster && str_pos < item_length)
diff --git a/src/gui/text/qtextobject.cpp b/src/gui/text/qtextobject.cpp
index bd1e970583..c0342c0d4e 100644
--- a/src/gui/text/qtextobject.cpp
+++ b/src/gui/text/qtextobject.cpp
@@ -1242,9 +1242,9 @@ QString QTextBlock::text() const
\sa charFormat(), blockFormat()
*/
-QList<QTextLayout::FormatRange> QTextBlock::textFormats() const
+QVector<QTextLayout::FormatRange> QTextBlock::textFormats() const
{
- QList<QTextLayout::FormatRange> formats;
+ QVector<QTextLayout::FormatRange> formats;
if (!p || !n)
return formats;
diff --git a/src/gui/text/qtextobject.h b/src/gui/text/qtextobject.h
index 6a127f0315..8138854348 100644
--- a/src/gui/text/qtextobject.h
+++ b/src/gui/text/qtextobject.h
@@ -223,7 +223,7 @@ public:
QString text() const;
- QList<QTextLayout::FormatRange> textFormats() const;
+ QVector<QTextLayout::FormatRange> textFormats() const;
const QTextDocument *document() const;