summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2013-05-24 13:51:01 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-28 08:07:26 +0200
commit7f1ad7c7c95ba37c172fa5819b2ba4f78bb3ceb6 (patch)
tree09d114fb31b7318fe43ed6ad1bf96af4dc722626 /src/plugins
parent9fdb9b269b65b56ac87b938e49053a6549a9ca92 (diff)
Fix transparent toplevels on Mac OS X again..
We're using QWindow::format() to decide opacity or not in a few places, but this used to resolve to QPlatformFormat::format() which would in turn return a default format without alpha set. Instead, return the format requested by the user. Masked windows were always broken as converting a 32-bit image to an Indexed8, doesn't give a grayscale image, but rather a randomly spreadout set of indices based on the colortable generated by the converToFormat function. Task-number: QTBUG-28531 Change-Id: I537288f85c70b1e6194785b9ebcb5ea1f9581cee Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm5
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm19
3 files changed, 18 insertions, 7 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 60f448044e..91eaea21b6 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -118,6 +118,7 @@ public:
bool setKeyboardGrabEnabled(bool grab);
bool setMouseGrabEnabled(bool grab);
QMargins frameMargins() const;
+ QSurfaceFormat format() const;
void requestActivateWindow();
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index c8ef967f20..0dec048a9d 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -253,6 +253,11 @@ QCocoaWindow::~QCocoaWindow()
[m_nsWindowDelegate release];
}
+QSurfaceFormat QCocoaWindow::format() const
+{
+ return window()->requestedFormat();
+}
+
void QCocoaWindow::setGeometry(const QRect &rect)
{
if (geometry() == rect)
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 0916a1faa8..ee6a9616a6 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -340,15 +340,20 @@ static QTouchDevice *touchDevice = 0;
}
const QRect &rect = region->boundingRect();
- QImage maskImage(rect.size(), QImage::Format_RGB888);
- maskImage.fill(Qt::white);
- QPainter p(&maskImage);
- p.setRenderHint(QPainter::Antialiasing);
+ QImage tmp(rect.size(), QImage::Format_RGB32);
+ tmp.fill(Qt::white);
+ QPainter p(&tmp);
p.setClipRegion(*region);
- p.fillRect(rect, QBrush(Qt::black));
+ p.fillRect(rect, Qt::black);
p.end();
-
- maskImage = maskImage.convertToFormat(QImage::Format_Indexed8);
+ QImage maskImage = QImage(rect.size(), QImage::Format_Indexed8);
+ for (int y=0; y<rect.height(); ++y) {
+ const uint *src = (const uint *) tmp.constScanLine(y);
+ uchar *dst = maskImage.scanLine(y);
+ for (int x=0; x<rect.width(); ++x) {
+ dst[x] = src[x] & 0xff;
+ }
+ }
m_maskImage = qt_mac_toCGImage(maskImage, true, &m_maskData);
}