diff options
author | Jason Barron <jbarron@trolltech.com> | 2010-02-26 12:47:45 (GMT) |
---|---|---|
committer | Jason Barron <jbarron@trolltech.com> | 2010-07-12 07:03:09 (GMT) |
commit | 8c6bfd9f2d34822e39812c07e821fa17ab3fdcb2 (patch) | |
tree | 6aa897a6c31bf8eb9611b039fc83f2b48a8a627e /src/openvg | |
parent | 940930dd8102511e6890ed661cf3d2dd88c2e1f4 (diff) | |
download | Qt-8c6bfd9f2d34822e39812c07e821fa17ab3fdcb2.zip Qt-8c6bfd9f2d34822e39812c07e821fa17ab3fdcb2.tar.gz Qt-8c6bfd9f2d34822e39812c07e821fa17ab3fdcb2.tar.bz2 |
Ensure glyphs are upright instead of upside-down.
The OpenVG paint engine traditionally takes glyph images from the
alphaMapForGlyph() function which returns the glyph image in the
upright projection. When it constructs a VGImage from this image, it
passes a positive data stride which will read the top scanline of the
source image into the bottom scanline of the VGImage due to the VG
coordinate system. It then uses the path transform where the 'sy' value
of the matrix is set to -1 and this re-inverts everything when drawing.
With the Symbian based glyph cache, the VGImage is constructed from a
RSgImage which is a hardware resource and compensates for the
coordinate system used by VG and GL at the time it is created. In
the case of the hardware glyph cache, the glyph image is read into the
RSgImage using a negative data stride so it does not need to be
inverted when drawn. To allow for this, introduce a flag which
indicates that the 'sy' entry of the matrix should be flipped such that
the glyph is drawn normally.
Also in this patch is a change to the glyph origin which now uses the
bottom of the glyph metric bounding rect instead of the top due to
orientation of the glyph inside the VGImage.
Reviewed-by: Alessandro Portale
Diffstat (limited to 'src/openvg')
-rw-r--r-- | src/openvg/qpaintengine_vg.cpp | 6 | ||||
-rw-r--r-- | src/openvg/qvg_symbian.cpp | 7 | ||||
-rw-r--r-- | src/openvg/qvgfontglyphcache_p.h | 3 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index 01c7a7e..4992ef5 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -3272,6 +3272,7 @@ QVGFontGlyphCache::QVGFontGlyphCache() { font = vgCreateFont(0); scaleX = scaleY = 0.0; + invertedGlyphs = false; memset(cachedGlyphsMask, 0, sizeof(cachedGlyphsMask)); } @@ -3430,6 +3431,11 @@ void QVGPaintEngine::drawStaticTextItem(QStaticTextItem *textItem) #if defined(QVG_NO_IMAGE_GLYPHS) glyphTransform.scale(glyphCache->scaleX, glyphCache->scaleY); #endif + + // Some glyph caches can create the VGImage upright + if (glyphCache->invertedGlyphs) + glyphTransform.scale(1, -1); + d->setTransform(VG_MATRIX_GLYPH_USER_TO_SURFACE, glyphTransform); // Add the glyphs from the text item into the glyph cache. diff --git a/src/openvg/qvg_symbian.cpp b/src/openvg/qvg_symbian.cpp index e6086d0..8c954e6 100644 --- a/src/openvg/qvg_symbian.cpp +++ b/src/openvg/qvg_symbian.cpp @@ -322,6 +322,11 @@ void* QVGPixmapData::toNativeType(NativeType type) return 0; } +QSymbianVGFontGlyphCache::QSymbianVGFontGlyphCache() : QVGFontGlyphCache() +{ + invertedGlyphs = true; +} + void QSymbianVGFontGlyphCache::cacheGlyphs(QVGPaintEnginePrivate *d, const QTextItemInt &ti, const QVarLengthArray<glyph_t> &glyphs) @@ -359,7 +364,7 @@ void QSymbianVGFontGlyphCache::cacheGlyphs(QVGPaintEnginePrivate *d, VGfloat origin[2]; VGfloat escapement[2]; origin[0] = -glyphBounds.iTl.iX + 0.5f; - origin[1] = -glyphBounds.iTl.iY + 0.5f; + origin[1] = glyphBounds.iBr.iY + 0.5f; escapement[0] = metrics.HorizAdvance(); escapement[1] = 0; vgSetGlyphToImage(font, iter.GlyphCode(), vgImage, origin, escapement); diff --git a/src/openvg/qvgfontglyphcache_p.h b/src/openvg/qvgfontglyphcache_p.h index ee11082..8f25322 100644 --- a/src/openvg/qvgfontglyphcache_p.h +++ b/src/openvg/qvgfontglyphcache_p.h @@ -74,6 +74,7 @@ public: VGFont font; VGfloat scaleX; VGfloat scaleY; + bool invertedGlyphs; uint cachedGlyphsMask[256 / 32]; QSet<glyph_t> cachedGlyphs; @@ -82,6 +83,8 @@ public: #if defined(Q_OS_SYMBIAN) class QSymbianVGFontGlyphCache : public QVGFontGlyphCache { +public: + QSymbianVGFontGlyphCache(); void cacheGlyphs(QVGPaintEnginePrivate *d, const QTextItemInt &ti, const QVarLengthArray<glyph_t> &glyphs); |