Compile with -no-widgets.

Remove QApplication usage in qcocoasystemtrayicon.mm

Move qt_mac_cg_context from qpaintengine_mac.mm to
qcocoahelpers.mm to make it available in no-widgets
builds.

(Move qt_mac_colorSpaceForDeviceType as well; color
space support needs to be cleaned up later on.)

Change-Id: I724fdb09538d65eae56c26165f3ba53b6814ea78
Reviewed-by: Liang Qi <liang.qi@digia.com>
This commit is contained in:
Morten Johan Sorvig 2012-10-17 14:23:32 +02:00 committed by The Qt Project
parent a0af6c8e4a
commit cfa0f3bd56
4 changed files with 59 additions and 49 deletions

View File

@ -99,6 +99,7 @@ void qt_mac_transformProccessToForegroundApplication();
QString qt_mac_removeMnemonics(const QString &original);
CGColorSpaceRef qt_mac_genericColorSpace();
CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget);
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice);
QString qt_mac_applicationName();
inline int qt_mac_flipYCoordinate(int y)
@ -157,6 +158,8 @@ public:
}
};
CGContextRef qt_mac_cg_context(const QPaintDevice *pdev);
QT_END_NAMESPACE
#endif //QCOCOAHELPERS_H

View File

@ -48,6 +48,10 @@
#include <qpa/qplatformscreen.h>
#include <private/qguiapplication_p.h>
#ifndef QT_NO_WIDGETS
#include <QtWidgets/QWidget>
#endif
QT_BEGIN_NAMESPACE
//
@ -551,6 +555,17 @@ void qt_mac_cleanUpMacColorSpaces()
m_displayColorSpaceHash.clear();
}
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice)
{
#ifdef QT_NO_WIDGETS
return qt_mac_displayColorSpace(0);
#else
bool isWidget = (paintDevice->devType() == QInternal::Widget);
return qt_mac_displayColorSpace(isWidget ? static_cast<const QWidget *>(paintDevice): 0);
#endif
}
QString qt_mac_applicationName()
{
QString appName;
@ -696,4 +711,44 @@ QString qt_mac_removeAmpersandEscapes(QString s)
return s.trimmed();
}
/*! \internal
Returns the CoreGraphics CGContextRef of the paint device. 0 is
returned if it can't be obtained. It is the caller's responsibility to
CGContextRelease the context when finished using it.
\warning This function is only available on Mac OS X.
\warning This function is duplicated in qmacstyle_mac.mm
*/
CGContextRef qt_mac_cg_context(const QPaintDevice *pdev)
{
if (pdev->devType() == QInternal::Pixmap) {
const QPixmap *pm = static_cast<const QPixmap*>(pdev);
CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(pdev);
uint flags = kCGImageAlphaPremultipliedFirst;
flags |= kCGBitmapByteOrder32Host;
CGContextRef ret = 0;
QPlatformPixmap *data = const_cast<QPixmap *>(pm)->data_ptr().data();
if (data && data->classId() == QPlatformPixmap::RasterClass) {
QImage *image = data->buffer();
ret = CGBitmapContextCreate(image->bits(), image->width(), image->height(),
8, image->bytesPerLine(), colorspace, flags);
} else {
qDebug() << "qt_mac_cg_context: Unsupported pixmap class";
}
CGContextTranslateCTM(ret, 0, pm->height());
CGContextScaleCTM(ret, 1, -1);
return ret;
} else if (pdev->devType() == QInternal::Widget) {
//CGContextRef ret = static_cast<CGContextRef>(static_cast<const QWidget *>(pdev)->macCGHandle());
///CGContextRetain(ret);
//return ret;
qDebug() << "qt_mac_cg_context: not implemented: Widget class";
return 0;
}
return 0;
}
QT_END_NAMESPACE

View File

@ -79,7 +79,6 @@
#include "qcocoasystemtrayicon.h"
#include <qtemporaryfile.h>
#include <qimagewriter.h>
#include <qapplication.h>
#include <qdebug.h>
#include "qcocoamenu.h"
@ -238,7 +237,7 @@ void QCocoaSystemTrayIcon::showMessage(const QString &title, const QString &mess
return;
QPixmap notificationIconPixmap = icon.pixmap(32, 32);
QTemporaryFile notificationIconFile;
QString notificationType(QLatin1String("Notification")), notificationIcon, notificationApp(QApplication::applicationName());
QString notificationType(QLatin1String("Notification")), notificationIcon, notificationApp(qt_mac_applicationName());
if (notificationApp.isEmpty())
notificationApp = QLatin1String("Application");
if (!notificationIconPixmap.isNull() && notificationIconFile.open()) {

View File

@ -116,13 +116,6 @@ void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig
}
}
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice)
{
bool isWidget = (paintDevice->devType() == QInternal::Widget);
return QCoreGraphicsPaintEngine::macDisplayColorSpace(isWidget ? static_cast<const QWidget *>(paintDevice)
: 0);
}
// Implemented for qt_mac_p.h
QMacCGContext::QMacCGContext(QPainter *p)
{
@ -206,46 +199,6 @@ CGAffineTransform qt_mac_convert_transform_to_cg(const QTransform &t) {
return CGAffineTransformMake(t.m11(), t.m12(), t.m21(), t.m22(), t.dx(), t.dy());
}
/*! \internal
Returns the CoreGraphics CGContextRef of the paint device. 0 is
returned if it can't be obtained. It is the caller's responsibility to
CGContextRelease the context when finished using it.
\warning This function is only available on Mac OS X.
\warning This function is duplicated in qmacstyle_mac.mm
*/
CGContextRef qt_mac_cg_context(const QPaintDevice *pdev)
{
if (pdev->devType() == QInternal::Pixmap) {
const QPixmap *pm = static_cast<const QPixmap*>(pdev);
CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(pdev);
uint flags = kCGImageAlphaPremultipliedFirst;
flags |= kCGBitmapByteOrder32Host;
CGContextRef ret = 0;
QPlatformPixmap *data = const_cast<QPixmap *>(pm)->data_ptr().data();
if (data && data->classId() == QPlatformPixmap::RasterClass) {
QImage *image = data->buffer();
ret = CGBitmapContextCreate(image->bits(), image->width(), image->height(),
8, image->bytesPerLine(), colorspace, flags);
} else {
qDebug() << "qt_mac_cg_context: Unsupported pixmap class";
}
CGContextTranslateCTM(ret, 0, pm->height());
CGContextScaleCTM(ret, 1, -1);
return ret;
} else if (pdev->devType() == QInternal::Widget) {
//CGContextRef ret = static_cast<CGContextRef>(static_cast<const QWidget *>(pdev)->macCGHandle());
///CGContextRetain(ret);
//return ret;
qDebug() << "qt_mac_cg_context: not implemented: Widget class";
return 0;
}
return 0;
}
inline static QCFType<CGColorRef> cgColorForQColor(const QColor &col, QPaintDevice *pdev)
{
CGFloat components[] = {