qtbase: Fix duplicate symbol errors in static build on Mac

There is some code duplication between QMacStyle anf the Cocoa QPA
plugin regarding painting and bridging with Cocoa.

Task-number: QTBUG-29725
Change-Id: I347407a9bca47b6fccd77fb924688bd35135d96b
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
(cherry picked from commit 5f948eb62ddb9f429f46ade08f32072212cda493)
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
This commit is contained in:
Gabriel de Dietrich 2013-03-05 16:52:08 +01:00 committed by The Qt Project
parent 426f2ccafc
commit 613cef516c
3 changed files with 34 additions and 29 deletions

View File

@ -466,10 +466,9 @@ QString qt_mac_removeMnemonics(const QString &original)
return returnText; return returnText;
} }
static CGColorSpaceRef m_genericColorSpace = 0;
CGColorSpaceRef m_genericColorSpace = 0; static QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash;
QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash; static bool m_postRoutineRegistered = false;
bool m_postRoutineRegistered = false;
CGColorSpaceRef qt_mac_genericColorSpace() CGColorSpaceRef qt_mac_genericColorSpace()
{ {

View File

@ -76,7 +76,7 @@ QT_BEGIN_NAMESPACE
QCoreGraphicsPaintEngine utility functions QCoreGraphicsPaintEngine utility functions
*****************************************************************************/ *****************************************************************************/
void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform) static void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform)
{ {
CGAffineTransform old_xform = CGAffineTransformIdentity; CGAffineTransform old_xform = CGAffineTransformIdentity;
if (orig_xform) { //setup xforms if (orig_xform) { //setup xforms

View File

@ -458,6 +458,9 @@ static QString qt_mac_removeMnemonics(const QString &original)
return returnText; return returnText;
} }
static CGContextRef qt_mac_cg_context(const QPaintDevice *pdev);
namespace {
class QMacCGContext class QMacCGContext
{ {
CGContextRef context; CGContextRef context;
@ -465,7 +468,6 @@ public:
QMacCGContext(QPainter *p); QMacCGContext(QPainter *p);
inline QMacCGContext() { context = 0; } inline QMacCGContext() { context = 0; }
inline QMacCGContext(const QPaintDevice *pdev) { inline QMacCGContext(const QPaintDevice *pdev) {
extern CGContextRef qt_mac_cg_context(const QPaintDevice *);
context = qt_mac_cg_context(pdev); context = qt_mac_cg_context(pdev);
} }
inline QMacCGContext(CGContextRef cg, bool takeOwnership=false) { inline QMacCGContext(CGContextRef cg, bool takeOwnership=false) {
@ -495,6 +497,7 @@ public:
return *this; return *this;
} }
}; };
} // anonymous namespace
static QColor qcolorFromCGColor(CGColorRef cgcolor) static QColor qcolorFromCGColor(CGColorRef cgcolor)
{ {
@ -578,11 +581,11 @@ QRegion qt_mac_fromHIShapeRef(HIShapeRef shape)
} }
CGColorSpaceRef m_genericColorSpace = 0; CGColorSpaceRef m_genericColorSpace = 0;
QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash; static QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash;
bool m_postRoutineRegistered = false; bool m_postRoutineRegistered = false;
CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget); static CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget);
CGColorSpaceRef qt_mac_genericColorSpace() static CGColorSpaceRef qt_mac_genericColorSpace()
{ {
#if 0 #if 0
if (!m_genericColorSpace) { if (!m_genericColorSpace) {
@ -606,11 +609,26 @@ CGColorSpaceRef qt_mac_genericColorSpace()
#endif #endif
} }
static void qt_mac_cleanUpMacColorSpaces()
{
if (m_genericColorSpace) {
CFRelease(m_genericColorSpace);
m_genericColorSpace = 0;
}
QHash<CGDirectDisplayID, CGColorSpaceRef>::const_iterator it = m_displayColorSpaceHash.constBegin();
while (it != m_displayColorSpaceHash.constEnd()) {
if (it.value())
CFRelease(it.value());
++it;
}
m_displayColorSpaceHash.clear();
}
/* /*
Ideally, we should pass the widget in here, and use CGGetDisplaysWithRect() etc. Ideally, we should pass the widget in here, and use CGGetDisplaysWithRect() etc.
to support multiple displays correctly. to support multiple displays correctly.
*/ */
CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget) static CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget)
{ {
CGColorSpaceRef colorSpace; CGColorSpaceRef colorSpace;
@ -639,27 +657,11 @@ CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget)
m_displayColorSpaceHash.insert(displayID, colorSpace); m_displayColorSpaceHash.insert(displayID, colorSpace);
if (!m_postRoutineRegistered) { if (!m_postRoutineRegistered) {
m_postRoutineRegistered = true; m_postRoutineRegistered = true;
void qt_mac_cleanUpMacColorSpaces();
qAddPostRoutine(qt_mac_cleanUpMacColorSpaces); qAddPostRoutine(qt_mac_cleanUpMacColorSpaces);
} }
return colorSpace; return colorSpace;
} }
void qt_mac_cleanUpMacColorSpaces()
{
if (m_genericColorSpace) {
CFRelease(m_genericColorSpace);
m_genericColorSpace = 0;
}
QHash<CGDirectDisplayID, CGColorSpaceRef>::const_iterator it = m_displayColorSpaceHash.constBegin();
while (it != m_displayColorSpaceHash.constEnd()) {
if (it.value())
CFRelease(it.value());
++it;
}
m_displayColorSpaceHash.clear();
}
bool qt_macWindowIsTextured(const QWidget *window) bool qt_macWindowIsTextured(const QWidget *window)
{ {
NSWindow *nswindow = static_cast<NSWindow*>( NSWindow *nswindow = static_cast<NSWindow*>(
@ -6489,7 +6491,7 @@ int QMacStyle::layoutSpacing(QSizePolicy::ControlType control1,
return_SIZE(10, 8, 6); // guess return_SIZE(10, 8, 6); // guess
} }
void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform) static void qt_mac_clip_cg(CGContextRef hd, const QRegion &rgn, CGAffineTransform *orig_xform)
{ {
CGAffineTransform old_xform = CGAffineTransformIdentity; CGAffineTransform old_xform = CGAffineTransformIdentity;
if (orig_xform) { //setup xforms if (orig_xform) { //setup xforms
@ -6530,6 +6532,9 @@ void qt_mac_scale_region(QRegion *region, qreal scaleFactor)
region->setRects(&scaledRects[0], scaledRects.count()); region->setRects(&scaledRects[0], scaledRects.count());
} }
static CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice);
namespace {
QMacCGContext::QMacCGContext(QPainter *p) QMacCGContext::QMacCGContext(QPainter *p)
{ {
QPaintEngine *pe = p->paintEngine(); QPaintEngine *pe = p->paintEngine();
@ -6542,7 +6547,6 @@ QMacCGContext::QMacCGContext(QPainter *p)
devType == QInternal::Pixmap || devType == QInternal::Pixmap ||
devType == QInternal::Image)) { devType == QInternal::Image)) {
extern CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice);
CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(pe->paintDevice()); CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(pe->paintDevice());
uint flags = kCGImageAlphaPremultipliedFirst; uint flags = kCGImageAlphaPremultipliedFirst;
flags |= kCGBitmapByteOrder32Host; flags |= kCGBitmapByteOrder32Host;
@ -6584,7 +6588,9 @@ QMacCGContext::QMacCGContext(QPainter *p)
} }
} }
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice) } // anonymous namespace
static CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice)
{ {
bool isWidget = (paintDevice->devType() == QInternal::Widget); bool isWidget = (paintDevice->devType() == QInternal::Widget);
return qt_mac_displayColorSpace(isWidget ? static_cast<const QWidget *>(paintDevice) : 0); return qt_mac_displayColorSpace(isWidget ? static_cast<const QWidget *>(paintDevice) : 0);