1
/****************************************************************************
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
7
** This file is part of the QtGui module of the Qt Toolkit.
9
** $QT_BEGIN_LICENSE:LGPL$
10
** No Commercial Usage
11
** This file contains pre-release code and may not be distributed.
12
** You may use this file in accordance with the terms and conditions
13
** contained in the Technology Preview License Agreement accompanying
16
** GNU Lesser General Public License Usage
17
** Alternatively, this file may be used under the terms of the GNU Lesser
18
** General Public License version 2.1 as published by the Free Software
19
** Foundation and appearing in the file LICENSE.LGPL included in the
20
** packaging of this file. Please review the following information to
21
** ensure the GNU Lesser General Public License version 2.1 requirements
22
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
** In addition, as a special exception, Nokia gives you certain additional
25
** rights. These rights are described in the Nokia Qt LGPL Exception
26
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28
** If you have questions regarding the use of this file, please contact
29
** Nokia at qt-info@nokia.com.
40
****************************************************************************/
42
#include "qpaintdevice.h"
46
#include "qapplication.h"
49
#include <private/qt_mac_p.h>
50
#include <private/qprintengine_mac_p.h>
51
#include <private/qpixmap_mac_p.h>
52
#include <private/qpixmap_raster_p.h>
56
/*****************************************************************************
57
Internal variables and functions
58
*****************************************************************************/
61
float qt_mac_defaultDpi_x()
63
// Mac OS X currently assumes things to be 72 dpi.
64
// (see http://developer.apple.com/releasenotes/GraphicsImaging/RN-ResolutionIndependentUI/)
65
// This may need to be re-worked as we go further in the resolution-independence stuff.
70
float qt_mac_defaultDpi_y()
72
// Mac OS X currently assumes things to be 72 dpi.
73
// (see http://developer.apple.com/releasenotes/GraphicsImaging/RN-ResolutionIndependentUI/)
74
// This may need to be re-worked as we go further in the resolution-independence stuff.
81
Returns the QuickDraw CGrafPtr of the paint device. 0 is returned
82
if it can't be obtained. Do not hold the pointer around for long
83
as it can be relocated.
85
\warning This function is only available on Mac OS X.
88
Q_GUI_EXPORT GrafPtr qt_mac_qd_context(const QPaintDevice *device)
90
if (device->devType() == QInternal::Pixmap) {
91
return static_cast<GrafPtr>(static_cast<const QPixmap *>(device)->macQDHandle());
92
} else if(device->devType() == QInternal::Widget) {
93
return static_cast<GrafPtr>(static_cast<const QWidget *>(device)->macQDHandle());
94
} else if(device->devType() == QInternal::Printer) {
95
QPaintEngine *engine = static_cast<const QPrinter *>(device)->paintEngine();
96
return static_cast<GrafPtr>(static_cast<const QMacPrintEngine *>(engine)->handle());
101
extern CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *pdev);
105
Returns the CoreGraphics CGContextRef of the paint device. 0 is
106
returned if it can't be obtained. It is the caller's responsiblity to
107
CGContextRelease the context when finished using it.
109
\warning This function is only available on Mac OS X.
112
Q_GUI_EXPORT CGContextRef qt_mac_cg_context(const QPaintDevice *pdev)
114
if (pdev->devType() == QInternal::Pixmap) {
115
const QPixmap *pm = static_cast<const QPixmap*>(pdev);
116
CGColorSpaceRef colorspace = qt_mac_colorSpaceForDeviceType(pdev);
117
uint flags = kCGImageAlphaPremultipliedFirst;
118
#ifdef kCGBitmapByteOrder32Host //only needed because CGImage.h added symbols in the minor version
119
flags |= kCGBitmapByteOrder32Host;
121
CGContextRef ret = 0;
123
// It would make sense to put this into a mac #ifdef'ed
124
// virtual function in the QPixmapData at some point
125
if (pm->data->classId() == QPixmapData::MacClass) {
126
const QMacPixmapData *pmData = static_cast<const QMacPixmapData*>(pm->data.data());
127
ret = CGBitmapContextCreate(pmData->pixels, pmData->w, pmData->h,
128
8, pmData->bytesPerRow, colorspace,
131
qWarning("QPaintDevice: Unable to create context for pixmap (%d/%d/%d)",
132
pmData->w, pmData->h, (pmData->bytesPerRow * pmData->h));
133
} else if (pm->data->classId() == QPixmapData::RasterClass) {
134
QImage *image = pm->data->buffer();
135
ret = CGBitmapContextCreate(image->bits(), image->width(), image->height(),
136
8, image->bytesPerLine(), colorspace, flags);
139
CGContextTranslateCTM(ret, 0, pm->height());
140
CGContextScaleCTM(ret, 1, -1);
142
} else if (pdev->devType() == QInternal::Widget) {
143
CGContextRef ret = static_cast<CGContextRef>(static_cast<const QWidget *>(pdev)->macCGHandle());
144
CGContextRetain(ret);
146
} else if (pdev->devType() == QInternal::MacQuartz) {
147
return static_cast<const QMacQuartzPaintDevice *>(pdev)->cgContext();