~oif-team/ubuntu/natty/qt4-x11/xi2.1

« back to all changes in this revision

Viewing changes to src/gui/painting/qpaintdevice_mac.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Alessandro Ghersi
  • Date: 2009-11-02 18:30:08 UTC
  • mfrom: (1.2.2 upstream)
  • mto: (15.2.5 experimental)
  • mto: This revision was merged to the branch mainline in revision 88.
  • Revision ID: james.westby@ubuntu.com-20091102183008-b6a4gcs128mvfb3m
Tags: upstream-4.6.0~beta1
ImportĀ upstreamĀ versionĀ 4.6.0~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/****************************************************************************
 
2
**
 
3
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
 
4
** All rights reserved.
 
5
** Contact: Nokia Corporation (qt-info@nokia.com)
 
6
**
 
7
** This file is part of the QtGui module of the Qt Toolkit.
 
8
**
 
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
 
14
** this package.
 
15
**
 
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.
 
23
**
 
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.
 
27
**
 
28
** If you have questions regarding the use of this file, please contact
 
29
** Nokia at qt-info@nokia.com.
 
30
**
 
31
**
 
32
**
 
33
**
 
34
**
 
35
**
 
36
**
 
37
**
 
38
** $QT_END_LICENSE$
 
39
**
 
40
****************************************************************************/
 
41
 
 
42
#include "qpaintdevice.h"
 
43
#include "qpainter.h"
 
44
#include "qwidget.h"
 
45
#include "qbitmap.h"
 
46
#include "qapplication.h"
 
47
#include "qprinter.h"
 
48
#include <qdebug.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>
 
53
 
 
54
QT_BEGIN_NAMESPACE
 
55
 
 
56
/*****************************************************************************
 
57
  Internal variables and functions
 
58
 *****************************************************************************/
 
59
 
 
60
/*! \internal */
 
61
float qt_mac_defaultDpi_x()
 
62
{
 
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.
 
66
    return 72;
 
67
}
 
68
 
 
69
/*! \internal */
 
70
float qt_mac_defaultDpi_y()
 
71
{
 
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.
 
75
    return 72;
 
76
}
 
77
 
 
78
 
 
79
/*! \internal
 
80
 
 
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.
 
84
 
 
85
    \warning This function is only available on Mac OS X.
 
86
*/
 
87
 
 
88
Q_GUI_EXPORT GrafPtr qt_mac_qd_context(const QPaintDevice *device)
 
89
{
 
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());
 
97
    }
 
98
    return 0;
 
99
}
 
100
 
 
101
extern CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *pdev);
 
102
 
 
103
/*! \internal
 
104
 
 
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.
 
108
 
 
109
    \warning This function is only available on Mac OS X.
 
110
*/
 
111
 
 
112
Q_GUI_EXPORT CGContextRef qt_mac_cg_context(const QPaintDevice *pdev)
 
113
{
 
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;
 
120
#endif
 
121
        CGContextRef ret = 0;
 
122
 
 
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,
 
129
                                                     flags);
 
130
            if(!ret)
 
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);
 
137
        }
 
138
 
 
139
        CGContextTranslateCTM(ret, 0, pm->height());
 
140
        CGContextScaleCTM(ret, 1, -1);
 
141
        return ret;
 
142
    } else if (pdev->devType() == QInternal::Widget) {
 
143
        CGContextRef ret = static_cast<CGContextRef>(static_cast<const QWidget *>(pdev)->macCGHandle());
 
144
        CGContextRetain(ret);
 
145
        return ret;
 
146
    } else if (pdev->devType() == QInternal::MacQuartz) {
 
147
        return static_cast<const QMacQuartzPaintDevice *>(pdev)->cgContext();
 
148
    }
 
149
    return 0;
 
150
}
 
151
 
 
152
QT_END_NAMESPACE