summaryrefslogtreecommitdiffstats
path: root/src/gui/painting
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-08-13 16:33:27 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-08-15 18:28:37 +0200
commit258d35ceb3142d654d02799516c433ccf7094313 (patch)
treeb8e87dc4fc1591759988d61cea015716c7ccb60a /src/gui/painting
parentc8e7fe7f3583f03cc0af680aea2b25c25249ee6e (diff)
Add support for accelerated glyph rendering in the directfb plugin
Change-Id: I44ae087c900e5cffdada45845cb7f34aab89b8ab Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/gui/painting')
-rw-r--r--src/gui/painting/qblittable_p.h14
-rw-r--r--src/gui/painting/qpaintengine_blitter.cpp35
-rw-r--r--src/gui/painting/qpaintengine_blitter_p.h1
3 files changed, 50 insertions, 0 deletions
diff --git a/src/gui/painting/qblittable_p.h b/src/gui/painting/qblittable_p.h
index f65549d63c..0f846741b3 100644
--- a/src/gui/painting/qblittable_p.h
+++ b/src/gui/painting/qblittable_p.h
@@ -64,6 +64,9 @@ public:
SourceOverScaledPixmapCapability = 0x0008,
AlphaFillRectCapability = 0x0010,
OpacityPixmapCapability = 0x0020,
+ DrawScaledCachedGlyphsCapability = 0x0040,
+ SubPixelGlyphsCapability = 0x0080,
+ ComplexClipCapability = 0x0100,
// Internal ones
OutlineCapability = 0x0001000
@@ -92,6 +95,17 @@ public:
Q_UNUSED(opacity);
qWarning("Please implement drawPixmapOpacity function in your platform or remove OpacityPixmapCapability from it");
}
+ virtual bool drawCachedGlyphs(const QPaintEngineState *state, QFontEngine::GlyphFormat glyphFormat, int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine) {
+ Q_UNUSED(state);
+ Q_UNUSED(glyphFormat);
+ Q_UNUSED(numGlyphs);
+ Q_UNUSED(glyphs);
+ Q_UNUSED(positions);
+ Q_UNUSED(fontEngine);
+ qWarning("Please implement drawCachedGlyphs function in your platform or remove DrawCachedGlyphsCapability from it");
+ return true;
+ }
+
QImage *lock();
void unlock();
diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp
index 67a692e2db..9a3b8f421b 100644
--- a/src/gui/painting/qpaintengine_blitter.cpp
+++ b/src/gui/painting/qpaintengine_blitter.cpp
@@ -132,6 +132,19 @@ public:
return checkStateAgainstMask(capabillitiesState, opacityPixmapMask);
}
+ bool canBlitterDrawCachedGlyphs(const QTransform &transform, QFontEngine::GlyphFormat requestedGlyphFormat, bool complexClip) const
+ {
+ if (transform.type() > QTransform::TxScale)
+ return false;
+ if (!(m_capabilities & QBlittable::DrawScaledCachedGlyphsCapability))
+ return false;
+ if (requestedGlyphFormat == QFontEngine::Format_ARGB && !(m_capabilities & QBlittable::SubPixelGlyphsCapability))
+ return false;
+ if (complexClip && !(m_capabilities & QBlittable::ComplexClipCapability))
+ return false;
+ return true;
+ }
+
inline void updateState(uint mask, bool on) {
updateStateBits(&capabillitiesState, mask, on);
}
@@ -798,6 +811,28 @@ void QBlitterPaintEngine::drawStaticTextItem(QStaticTextItem *sti)
#endif
}
+bool QBlitterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine)
+{
+ Q_D(QBlitterPaintEngine);
+ QFontEngine::GlyphFormat glyphFormat = d->glyphCacheFormat;
+ if (fontEngine->glyphFormat != QFontEngine::Format_None)
+ glyphFormat = fontEngine->glyphFormat;
+
+ const QClipData *clipData = d->clip();
+ const bool complexClip = clipData && !clipData->hasRectClip;
+
+ const QPainterState *s = state();
+ if (d->caps.canBlitterDrawCachedGlyphs(s->transform(), glyphFormat, complexClip)) {
+ d->unlock();
+ const bool result = d->pmData->blittable()->drawCachedGlyphs(s, glyphFormat, numGlyphs, glyphs, positions, fontEngine);
+ // Lock again as the raster paint engine might draw decorations now.
+ d->lock();
+ return result;
+ } else {
+ return QRasterPaintEngine::drawCachedGlyphs(numGlyphs, glyphs, positions, fontEngine);
+ }
+}
+
QT_END_NAMESPACE
#endif //QT_NO_BLITTABLE
diff --git a/src/gui/painting/qpaintengine_blitter_p.h b/src/gui/painting/qpaintengine_blitter_p.h
index b70ee5fc5c..56661a7d90 100644
--- a/src/gui/painting/qpaintengine_blitter_p.h
+++ b/src/gui/painting/qpaintengine_blitter_p.h
@@ -96,6 +96,7 @@ public:
void drawPoints(const QPoint *points, int pointCount);
void stroke(const QVectorPath &path, const QPen &pen);
void drawStaticTextItem(QStaticTextItem *);
+ bool drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine);
};
QT_END_NAMESPACE