From 1446d8c6f776c82a191b18c48fdaca85b9a4804a Mon Sep 17 00:00:00 2001 From: "pekka.aho" Date: Sat, 19 Apr 2008 19:06:26 +0300 Subject: [PATCH] native theme zooming fix --- widget/src/qt/nsNativeThemeQt.cpp | 81 +++++++++++++------------------ widget/src/qt/nsNativeThemeQt.h | 8 ++- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/widget/src/qt/nsNativeThemeQt.cpp b/widget/src/qt/nsNativeThemeQt.cpp index fb33fef0554c..b6f5aad8f66a 100644 --- a/widget/src/qt/nsNativeThemeQt.cpp +++ b/widget/src/qt/nsNativeThemeQt.cpp @@ -71,7 +71,7 @@ #include "gfxQPainterSurface.h" #include "nsIRenderingContext.h" -nsNativeThemeQt::nsNativeThemeQt() : mP2A(0) +nsNativeThemeQt::nsNativeThemeQt() { combo = new QComboBox((QWidget *)0); combo->resize(0, 0); @@ -85,19 +85,13 @@ nsNativeThemeQt::~nsNativeThemeQt() NS_IMPL_ISUPPORTS1(nsNativeThemeQt, nsITheme) -static QRect qRectInPixels(const nsRect &aRect, - const nsTransform2D *aTrans, const PRInt32 p2a) +static inline QRect qRectInPixels(const nsRect &aRect, + const PRInt32 p2a) { - int x = aRect.x; - int y = aRect.y; - int w = aRect.width; - int h = aRect.height; - aTrans->TransformCoord(&x,&y,&w,&h); - return QRect( - NSAppUnitsToIntPixels(x, p2a), - NSAppUnitsToIntPixels(y, p2a), - NSAppUnitsToIntPixels(w, p2a), - NSAppUnitsToIntPixels(h, p2a)); + return QRect(NSAppUnitsToIntPixels(aRect.x, p2a), + NSAppUnitsToIntPixels(aRect.y, p2a), + NSAppUnitsToIntPixels(aRect.width, p2a), + NSAppUnitsToIntPixels(aRect.height, p2a)); } NS_IMETHODIMP @@ -111,29 +105,38 @@ nsNativeThemeQt::DrawWidgetBackground(nsIRenderingContext* aContext, gfxContext* context = aContext->ThebesContext(); nsRefPtr surface = context->CurrentSurface(); - gfxASurface* raw = surface; - gfxQPainterSurface* qSurface = (gfxQPainterSurface*)raw; + + if (surface->GetType() != gfxASurface::SurfaceTypeQPainter) + return NS_ERROR_NOT_IMPLEMENTED; + + gfxQPainterSurface* qSurface = (gfxQPainterSurface*) (surface.get()); QPainter* qPainter = qSurface->GetQPainter(); // qDebug("aWidgetType = %d", aWidgetType); if (!qPainter) return NS_OK; - EnsuremP2A(aContext); - QStyle* style = qApp->style(); // const QPalette::ColorGroup cg = qApp->palette().currentColorGroup(); - nsTransform2D* curTrans; - aContext->GetCurrentTransform(curTrans); - - QRect r = qRectInPixels(aRect, curTrans, mP2A); - QRect cr = qRectInPixels(aClipRect, curTrans, mP2A); - -// context->UpdateGC(); qPainter->save(); - qPainter->translate(r.x(), r.y()); - r.translate(-r.x(), -r.y()); + + gfxPoint offs = surface->GetDeviceOffset(); + qPainter->translate(offs.x, offs.y); + + gfxMatrix ctm = context->CurrentMatrix(); + if (!ctm.HasNonTranslation()) { + ctm.x0 = NSToCoordRound(ctm.x0); + ctm.y0 = NSToCoordRound(ctm.y0); + } + + QMatrix qctm(ctm.xx, ctm.xy, ctm.yx, ctm.yy, ctm.x0, ctm.y0); + qPainter->setWorldMatrix(qctm, true); + + PRInt32 p2a = GetAppUnitsPerDevPixel(aContext); + + QRect r = qRectInPixels(aRect, p2a); + QRect cr = qRectInPixels(aClipRect, p2a); // qDebug("rect=%d %d %d %d\nr=%d %d %d %d", // aRect.x, aRect.y, aRect.width, aRect.height, @@ -363,6 +366,8 @@ nsNativeThemeQt::GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame* a QStyle *s = qApp->style(); + PRInt32 p2a = GetAppUnitsPerDevPixel(aContext); + switch (aWidgetType) { case NS_THEME_RADIO_SMALL: case NS_THEME_RADIO: @@ -370,12 +375,7 @@ nsNativeThemeQt::GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame* a case NS_THEME_CHECKBOX: { nsRect frameRect = aFrame->GetRect(); - EnsuremP2A(aContext); - - nsTransform2D* curTrans; - aContext->GetCurrentTransform(curTrans); - - QRect qRect = qRectInPixels(frameRect, curTrans, mP2A); + QRect qRect = qRectInPixels(frameRect, p2a); QStyleOptionButton option; @@ -395,12 +395,7 @@ nsNativeThemeQt::GetMinimumWidgetSize(nsIRenderingContext* aContext, nsIFrame* a case NS_THEME_BUTTON: { nsRect frameRect = aFrame->GetRect(); - EnsuremP2A(aContext); - - nsTransform2D* curTrans; - aContext->GetCurrentTransform(curTrans); - - QRect qRect = qRectInPixels(frameRect, curTrans, mP2A); + QRect qRect = qRectInPixels(frameRect, p2a); QStyleOptionButton option; @@ -562,15 +557,7 @@ nsNativeThemeQt::ThemeNeedsComboboxDropmarker() return PR_FALSE; } -void -nsNativeThemeQt::EnsuremP2A(nsIRenderingContext* aContext) -{ - if (!mP2A) { - nsCOMPtr dctx = nsnull; - aContext->GetDeviceContext(*getter_AddRefs(dctx)); - mP2A = dctx->AppUnitsPerDevPixel(); - } -} + void nsNativeThemeQt::ButtonStyle(nsIFrame* aFrame, diff --git a/widget/src/qt/nsNativeThemeQt.h b/widget/src/qt/nsNativeThemeQt.h index 712af0b18a30..d5583d60b594 100644 --- a/widget/src/qt/nsNativeThemeQt.h +++ b/widget/src/qt/nsNativeThemeQt.h @@ -45,6 +45,7 @@ #include "nsCOMPtr.h" #include "nsIAtom.h" #include "nsNativeTheme.h" +#include "nsIDeviceContext.h" class QComboBox; class QStyleOptionButton; @@ -101,7 +102,11 @@ public: private: - void EnsuremP2A(nsIRenderingContext* aContext); + inline PRInt32 GetAppUnitsPerDevPixel(nsIRenderingContext* aContext){ + nsCOMPtr dctx = nsnull; + aContext->GetDeviceContext(*getter_AddRefs(dctx)); + return dctx->AppUnitsPerDevPixel(); + } void ButtonStyle(nsIFrame* aFrame, QRect aRect, @@ -124,6 +129,5 @@ private: PRInt32 frameWidth; - PRInt32 mP2A; };