Details
-
Suggestion
-
Resolution: Invalid
-
Not Evaluated
-
None
-
4.7.2
-
None
-
Wince6.0/iMx515
Description
according to last mailing list, anti-aliasing on wince/qt is unavailable.
but i found anti-aliasing enable method.
QFontEngineWin::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) designed to RGB32
when wince use 16bpp problems occured
qGray function is for RGB32/24 not RGB565
this patch is make font 256 gray anti-aliasing
i don't know how make RGB mask for text
if U can make RGB mask, it will be able to subpixel font rendering too.
==============================================================================================================
wince_Antialiasing.diff
--- D:/Qt/qt-4.7.1-wince6L/src/gui/text/qfontengine_win.cpp.org 화 4 26 10:55:54 2011 +++ D:/Qt/qt-4.7.1-wince6L/src/gui/text/qfontengine_win.cpp 화 4 26 10:56:15 2011 @@ -1190,7 +1190,6 @@ return ni; } - extern uint qt_pow_gamma[256]; QImage QFontEngineWin::alphaMapForGlyph(glyph_t glyph, const QTransform &xform) @@ -1221,26 +1220,24 @@ // Copy data... Cannot use QPainter here as GDI has messed up the // Alpha channel of the ni.image pixels... - for (int y=0; y<mask->height(); ++y) { - uchar *dest = indexed.scanLine(y); - if (mask->image.format() == QImage::Format_RGB16) { - const qint16 *src = (qint16 *) ((const QImage &) mask->image).scanLine(y); - for (int x=0; x<mask->width(); ++x) - dest[x] = 255 - qGray(src[x]); - } else { - const uint *src = (uint *) ((const QImage &) mask->image).scanLine(y); - for (int x=0; x<mask->width(); ++x) { + const QImage source = mask->image.depth() == 32 + ? mask->image + : mask->image.convertToFormat(QImage::Format_RGB32); + + for (int y=0; y<source.height(); ++y) { + uchar *dest = indexed.scanLine(y); + const uint *src = (uint *) source.scanLine(y); + for (int x=0; x<source.width(); ++x) { #ifdef Q_OS_WINCE - dest[x] = 255 - qGray(src[x]); + dest[x] = 255 - qGray(src[x]); #else - if (QNativeImage::systemFormat() == QImage::Format_RGB16) - dest[x] = 255 - qGray(src[x]); - else - dest[x] = 255 - (qt_pow_gamma[qGray(src[x])] * 255. / 2047.); + if (QNativeImage::systemFormat() == QImage::Format_RGB16) + dest[x] = 255 - qGray(src[x]); + else + dest[x] = 255 - (qt_pow_gamma[qGray(src[x])] * 255. / 2047.); #endif - } - } - } + } + } // Cleanup... delete mask; @@ -1257,12 +1254,16 @@ QImage QFontEngineWin::alphaRGBMapForGlyph(glyph_t glyph, int margin, const QTransform &t) { HFONT font = hfont; + if (qt_cleartype_enabled) { + LOGFONT lf = logfont; + lf.lfQuality = ANTIALIASED_QUALITY; + font = CreateFontIndirect(&lf); + } int contrast; SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &contrast, 0); SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, (void *) 1000, 0); - - QNativeImage *mask = drawGDIGlyph(font, glyph, margin, t, QImage::Format_RGB32); + QNativeImage *mask = drawGDIGlyph(font, glyph, margin, t, QNativeImage::systemFormat()); SystemParametersInfo(SPI_SETFONTSMOOTHINGCONTRAST, 0, (void *) contrast, 0); if (mask == 0) @@ -1278,11 +1279,14 @@ uint *dest = (uint *) rgbMask.scanLine(y); const uint *src = (uint *) source.scanLine(y); for (int x=0; x<mask->width(); ++x) { dest[x] = 0xffffffff - (0x00ffffff & src[x]); } } delete mask; + if (qt_cleartype_enabled) { + DeleteObject(font); + } return rgbMask; }