Fix GroupBox painting on Windows when not using widgets

This is simply removing some slow and rather ugly hacks that tried
to reconstruct broken data from the windows xp theme. After testing
without these hacks on both XP and Windows 7, I believe we can
conclude that these workarounds are no longer required and even
breaks our look and feel in several places.

Task-number: QTBUG-29888
Change-Id: Ifaffd660e8d9ed6dfd43657745c3fa1606d33a7c
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
bb10
Jens Bache-Wiig 2013-04-17 13:32:44 +02:00 committed by The Qt Project
parent e25db96884
commit 1770f25857
2 changed files with 3 additions and 48 deletions

View File

@ -569,30 +569,6 @@ void QWindowsXPStylePrivate::setTransparency(QWidget *widget, XPThemeData &theme
SetWindowRgn(winId(widget), hrgn, true);
}
/*! \internal
Returns true if the native doublebuffer contains a pixel which
has a non-0xFF alpha value. Should only be use when its
guaranteed that data painted into the buffer wasn't a proper
alpha pixmap.
*/
bool QWindowsXPStylePrivate::hasAnyData(const QRect &rect)
{
const int startX = rect.left();
const int startY = rect.top();
const int w = rect.width();
const int h = rect.height();
for (int y = startY; y < h; ++y) {
register DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW);
for (int x = startX; x < w; ++x, ++buffer) {
int alpha = (*buffer) >> 24;
if (alpha != 0xFF) // buffer has been touched
return true;
}
}
return false;
}
/*! \internal
Returns true if the native doublebuffer contains pixels with
varying alpha value.
@ -857,7 +833,6 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
bool stateHasData = true; // We assume so;
bool hasAlpha = false;
bool partIsTransparent;
bool inspectData;
bool potentialInvalidAlpha;
QString pixmapCacheKey = QStringLiteral("$qt_xp_");
@ -882,9 +857,6 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
bool haveCachedPixmap = false;
bool isCached = data.dataValid;
if (isCached) {
if (!(stateHasData = data.hasAnyData))
return; // Cached NOOP
inspectData = data.wasAlphaSwapped;
partIsTransparent = data.partIsTransparent;
hasAlpha = data.hasAlphaChannel;
alphaType = data.alphaType;
@ -907,13 +879,6 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
pGetThemeBool(themeData.handle(), themeData.partId, themeData.stateId, TMT_BORDERONLY, &tmt_borderonly);
pGetThemeColor(themeData.handle(), themeData.partId, themeData.stateId, TMT_TRANSPARENTCOLOR, &tmt_transparentcolor);
pGetThemePropertyOrigin(themeData.handle(), themeData.partId, themeData.stateId, TMT_CAPTIONMARGINS, &proporigin);
inspectData = (tmt_transparentcolor != 0 || tmt_borderonly || proporigin == PO_PART || proporigin == PO_STATE);
// ### This is a vista-specific workaround for broken alpha in titlebar pixmaps
if ((QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA && (QSysInfo::WindowsVersion & QSysInfo::WV_NT_based))) {
if (themeData.partId == WP_CAPTION || themeData.partId == WP_SMALLCAPTION)
inspectData = false;
}
partIsTransparent = isTransparent(themeData);
@ -922,14 +887,13 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
if (proporigin == PO_PART || proporigin == PO_STATE) {
int tmt_glyphtype = GT_NONE;
pGetThemeEnumValue(themeData.handle(), themeData.partId, themeData.stateId, TMT_GLYPHTYPE, &tmt_glyphtype);
potentialInvalidAlpha = partIsTransparent && !inspectData && tmt_glyphtype == GT_IMAGEGLYPH;
potentialInvalidAlpha = partIsTransparent && tmt_glyphtype == GT_IMAGEGLYPH;
}
#ifdef DEBUG_XP_STYLE
printf("---[ NOT CACHED ]-----------------------> Name(%-10s) Part(%d) State(%d)\n",
qPrintable(themeData.name), themeData.partId, themeData.stateId);
printf("-->partIsTransparen = %d\n", partIsTransparent);
printf("-->inspectData = %d\n", inspectData);
printf("-->potentialInvalidAlpha = %d\n", potentialInvalidAlpha);
showProperties(themeData);
#endif
@ -979,7 +943,7 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
// Clear the buffer
if (alphaType != NoAlpha) {
// Consider have separate "memset" function for small chunks for more speedup
memset(bufferPixels, inspectData ? 0xFF : 0x00, bufferW * h * 4);
memset(bufferPixels, 0x00, bufferW * h * 4);
}
// Difference between area and rect
@ -1021,8 +985,6 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
// If not cached, analyze the buffer data to figure
// out alpha type, and if it contains data
if (!isCached) {
if (inspectData)
stateHasData = hasAnyData(rect);
// SHORTCUT: If the part's state has no data, cache it for NOOP later
if (!stateHasData) {
memset(&data, 0, sizeof(data));
@ -1038,10 +1000,6 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
#endif
}
// Swap alpha values, if needed
if (inspectData)
wasAlphaSwapped = swapAlphaChannel(rect);
// Fix alpha values, if needed
if (potentialInvalidAlpha)
wasAlphaFixed = fixAlphaChannel(rect);
@ -1143,7 +1101,6 @@ void QWindowsXPStylePrivate::drawBackgroundThruNativeBuffer(XPThemeData &themeDa
data.partIsTransparent = partIsTransparent;
data.alphaType = alphaType;
data.hasAlphaChannel = hasAlpha;
data.hasAnyData = stateHasData;
data.wasAlphaSwapped = wasAlphaSwapped;
data.hadInvalidAlpha = wasAlphaFixed;
alphaCache.insert(key, data);

View File

@ -274,12 +274,11 @@ struct ThemeMapData {
bool dataValid : 1; // Only used to detect if hash value is ok
bool partIsTransparent : 1;
bool hasAnyData : 1; // False = part & state has not data, NOP
bool hasAlphaChannel : 1; // True = part & state has real Alpha
bool wasAlphaSwapped : 1; // True = alpha channel needs to be swapped
bool hadInvalidAlpha : 1; // True = alpha channel contained invalid alpha values
ThemeMapData() : dataValid(false), partIsTransparent(false), hasAnyData(false),
ThemeMapData() : dataValid(false), partIsTransparent(false),
hasAlphaChannel(false), wasAlphaSwapped(false), hadInvalidAlpha(false) {}
};
@ -339,7 +338,6 @@ public:
void drawBackgroundThruNativeBuffer(XPThemeData &themeData);
void drawBackgroundDirectly(XPThemeData &themeData);
bool hasAnyData(const QRect &rect);
bool hasAlphaChannel(const QRect &rect);
bool fixAlphaChannel(const QRect &rect);
bool swapAlphaChannel(const QRect &rect, bool allPixels = false);