Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/image/qpixmap.cpp

    r769 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    8383
    8484#include "qpixmap_raster_p.h"
     85#include "private/qstylehelper_p.h"
    8586
    8687QT_BEGIN_NAMESPACE
     
    579580QSize QPixmap::size() const
    580581{
    581     return data ? QSize(data->width(), data->height()) : QSize();
     582    return data ? QSize(data->width(), data->height()) : QSize(0, 0);
    582583}
    583584
     
    636637        return;
    637638
     639    // QPixmap.data member may be QRuntimePixmapData so use pixmapData() function to get
     640    // the actual underlaying runtime pixmap data.
     641    QPixmapData *pd = pixmapData();
     642
    638643    // Create new pixmap
    639     QPixmap pm(QSize(w, h), data ? data->type : QPixmapData::PixmapType);
     644    QPixmap pm(QSize(w, h), pd ? pd->type : QPixmapData::PixmapType);
    640645    bool uninit = false;
    641646#if defined(Q_WS_X11)
    642     QX11PixmapData *x11Data = data && data->classId() == QPixmapData::X11Class ? static_cast<QX11PixmapData*>(data.data()) : 0;
     647    QX11PixmapData *x11Data = pd && pd->classId() == QPixmapData::X11Class ? static_cast<QX11PixmapData*>(pd) : 0;
    643648    if (x11Data) {
    644649        pm.x11SetScreen(x11Data->xinfo.screen());
     
    646651    }
    647652#elif defined(Q_WS_MAC)
    648     QMacPixmapData *macData = data && data->classId() == QPixmapData::MacClass ? static_cast<QMacPixmapData*>(data.data()) : 0;
     653    QMacPixmapData *macData = pd && pd->classId() == QPixmapData::MacClass ? static_cast<QMacPixmapData*>(pd) : 0;
    649654    if (macData)
    650655        uninit = macData->uninit;
     
    660665#if defined(Q_WS_X11)
    661666    if (x11Data && x11Data->x11_mask) {
    662         QX11PixmapData *pmData = static_cast<QX11PixmapData*>(pm.data.data());
    663         pmData->x11_mask = (Qt::HANDLE)XCreatePixmap(X11->display,
    664                                                      RootWindow(x11Data->xinfo.display(),
    665                                                                 x11Data->xinfo.screen()),
    666                                                       w, h, 1);
    667         GC gc = XCreateGC(X11->display, pmData->x11_mask, 0, 0);
    668         XCopyArea(X11->display, x11Data->x11_mask, pmData->x11_mask, gc, 0, 0, qMin(width(), w), qMin(height(), h), 0, 0);
    669         XFreeGC(X11->display, gc);
     667        QPixmapData *newPd = pm.pixmapData();
     668        QX11PixmapData *pmData = (newPd && newPd->classId() == QPixmapData::X11Class)
     669                                 ? static_cast<QX11PixmapData*>(newPd) : 0;
     670        if (pmData) {
     671            pmData->x11_mask = (Qt::HANDLE)XCreatePixmap(X11->display,
     672                                                         RootWindow(x11Data->xinfo.display(),
     673                                                                    x11Data->xinfo.screen()),
     674                                                         w, h, 1);
     675            GC gc = XCreateGC(X11->display, pmData->x11_mask, 0, 0);
     676            XCopyArea(X11->display, x11Data->x11_mask, pmData->x11_mask, gc, 0, 0,
     677                      qMin(width(), w), qMin(height(), h), 0, 0);
     678            XFreeGC(X11->display, gc);
     679        }
    670680    }
    671681#endif
     
    766776    Creates and returns a mask for this pixmap based on the given \a
    767777    maskColor. If the \a mode is Qt::MaskInColor, all pixels matching the
    768     maskColor will be opaque. If \a mode is Qt::MaskOutColor, all pixels
    769     matching the maskColor will be transparent.
     778    maskColor will be transparent. If \a mode is Qt::MaskOutColor, all pixels
     779    matching the maskColor will be opaque.
    770780
    771781    This function is slow because it involves converting to/from a
     
    826836
    827837    QFileInfo info(fileName);
    828     QString key = QLatin1String("qt_pixmap_") + info.absoluteFilePath() + QLatin1Char('_') + QString::number(info.lastModified().toTime_t()) + QLatin1Char('_') +
    829         QString::number(info.size()) + QLatin1Char('_') + QString::number(data ? data->pixelType() : QPixmapData::PixmapType);
     838    QString key = QLatin1Literal("qt_pixmap")
     839                  % info.absoluteFilePath()
     840                  % HexString<uint>(info.lastModified().toTime_t())
     841                  % HexString<quint64>(info.size())
     842                  % HexString<uint>(data ? data->pixelType() : QPixmapData::PixmapType);
     843
     844    // Note: If no extension is provided, we try to match the
     845    // file against known plugin extensions
     846    if (!info.completeSuffix().isEmpty() && !info.exists())
     847        return false;
    830848
    831849    if (QPixmapCache::find(key, *this))
     
    10721090        sendResizeEvents(widget);
    10731091
     1092    widget->d_func()->prepareToRender(QRegion(),
     1093        QWidget::DrawWindowBackground | QWidget::DrawChildren | QWidget::IgnoreMask);
     1094
    10741095    QRect r(rect);
    10751096    if (r.width() < 0)
     
    10821103
    10831104    QPixmap res(r.size());
    1084     widget->render(&res, QPoint(), r,
    1085                    QWidget::DrawWindowBackground | QWidget::DrawChildren | QWidget::IgnoreMask);
     1105    if (!qt_widget_private(widget)->isOpaque)
     1106        res.fill(Qt::transparent);
     1107
     1108    widget->d_func()->render(&res, QPoint(), r, QWidget::DrawWindowBackground
     1109                             | QWidget::DrawChildren | QWidget::IgnoreMask, true);
    10861110    return res;
    10871111}
     
    11611185{
    11621186#if defined(Q_WS_X11)
    1163     if (data && data->classId() == QPixmapData::X11Class)
    1164         return static_cast<const QX11PixmapData*>(data.constData())->handle();
     1187    const QPixmapData *pd = pixmapData();
     1188    if (pd) {
     1189        if (pd->classId() == QPixmapData::X11Class)
     1190            return static_cast<const QX11PixmapData*>(pd)->handle();
     1191        else
     1192            qWarning("QPixmap::handle(): Pixmap is not an X11 class pixmap");
     1193    }
    11651194#endif
    11661195    return 0;
     
    12791308    valid image file.
    12801309
    1281     \sa QPixmap::save(), {Format of the QDataStream Operators}
     1310    \sa QPixmap::save(), {Serializing Qt Data Types}
    12821311*/
    12831312
     
    12921321    Reads an image from the given \a stream into the given \a pixmap.
    12931322
    1294     \sa QPixmap::load(), {Format of the QDataStream Operators}
     1323    \sa QPixmap::load(), {Serializing Qt Data Types}
    12951324*/
    12961325
     
    13641393
    13651394/*!
    1366     \fn bool QPixmap::convertFromImage(const QImage &image, Qt::ImageConversionFlags flags)
    1367 
    1368     Use the static fromImage() function instead.
    1369 */
     1395    Replaces this pixmap's data with the given \a image using the
     1396    specified \a flags to control the conversion.  The \a flags
     1397    argument is a bitwise-OR of the \l{Qt::ImageConversionFlags}.
     1398    Passing 0 for \a flags sets all the default options. Returns true
     1399    if the result is that this pixmap is not null.
     1400
     1401    Note: this function was part of Qt 3 support in Qt 4.6 and earlier.
     1402    It has been promoted to official API status in 4.7 to support updating
     1403    the pixmap's image without creating a new QPixmap as fromImage() would.
     1404
     1405    \sa fromImage()
     1406    \since 4.7
     1407*/
     1408bool QPixmap::convertFromImage(const QImage &image, Qt::ImageConversionFlags flags)
     1409{
     1410    if (image.isNull() || !data)
     1411        *this = QPixmap::fromImage(image, flags);
     1412    else
     1413        data->fromImage(image, flags);
     1414    return !isNull();
     1415}
    13701416
    13711417/*!
     
    17351781    pixmap.
    17361782
     1783    \note When using the native X11 graphics system, the pixmap
     1784    becomes invalid when the QApplication instance is destroyed.
     1785
    17371786    \sa QBitmap, QImage, QImageReader, QImageWriter
    17381787*/
     
    17531802    mask, otherwise returns false.
    17541803
    1755     \warning This is potentially an expensive operation.
    1756 
    17571804    \sa hasAlphaChannel(), mask()
    17581805*/
    17591806bool QPixmap::hasAlpha() const
    17601807{
    1761     return data && (data->hasAlphaChannel() || !data->mask().isNull());
     1808#if defined(Q_WS_X11)
     1809    if (data && data->hasAlphaChannel())
     1810        return true;
     1811    QPixmapData *pd = pixmapData();
     1812    if (pd && pd->classId() == QPixmapData::X11Class) {
     1813        QX11PixmapData *x11Data = static_cast<QX11PixmapData*>(pd);
     1814#ifndef QT_NO_XRENDER
     1815        if (x11Data->picture && x11Data->d == 32)
     1816            return true;
     1817#endif
     1818        if (x11Data->d == 1 || x11Data->x11_mask)
     1819            return true;
     1820    }
     1821    return false;
     1822#else
     1823    return data && data->hasAlphaChannel();
     1824#endif
    17621825}
    17631826
     
    19271990        return;
    19281991
    1929     QPixmapData::ClassId id = data->classId();
     1992    // QPixmap.data member may be QRuntimePixmapData so use pixmapData() function to get
     1993    // the actual underlaying runtime pixmap data.
     1994    QPixmapData *pd = pixmapData();
     1995    QPixmapData::ClassId id = pd->classId();
    19301996    if (id == QPixmapData::RasterClass) {
    1931         QRasterPixmapData *rasterData = static_cast<QRasterPixmapData*>(data.data());
     1997        QRasterPixmapData *rasterData = static_cast<QRasterPixmapData*>(pd);
    19321998        rasterData->image.detach();
    19331999    }
    19342000
    19352001    if (data->is_cached && data->ref == 1)
    1936         QImagePixmapCleanupHooks::executePixmapDataModificationHooks(data.data());
     2002        QImagePixmapCleanupHooks::executePixmapDataModificationHooks(pd);
    19372003
    19382004#if defined(Q_WS_MAC)
    1939     QMacPixmapData *macData = id == QPixmapData::MacClass ? static_cast<QMacPixmapData*>(data.data()) : 0;
     2005    QMacPixmapData *macData = id == QPixmapData::MacClass ? static_cast<QMacPixmapData*>(pd) : 0;
    19402006    if (macData) {
    19412007        if (macData->cg_mask) {
     
    19522018
    19532019#if defined(Q_WS_X11)
    1954     if (data->classId() == QPixmapData::X11Class) {
    1955         QX11PixmapData *d = static_cast<QX11PixmapData*>(data.data());
     2020    if (pd->classId() == QPixmapData::X11Class) {
     2021        QX11PixmapData *d = static_cast<QX11PixmapData*>(pd);
    19562022        d->flags &= ~QX11PixmapData::Uninitialized;
    19572023
     
    19832049    use QBitmap::fromImage() instead.
    19842050
    1985     \sa toImage(), {QPixmap#Pixmap Conversion}{Pixmap Conversion}
     2051    \sa fromImageReader(), toImage(), {QPixmap#Pixmap Conversion}{Pixmap Conversion}
    19862052*/
    19872053QPixmap QPixmap::fromImage(const QImage &image, Qt::ImageConversionFlags flags)
     
    19982064
    19992065/*!
     2066    \fn QPixmap QPixmap::fromImageReader(QImageReader *imageReader, Qt::ImageConversionFlags flags)
     2067
     2068    Create a QPixmap from an image read directly from an \a imageReader.
     2069    The \a flags argument is a bitwise-OR of the \l{Qt::ImageConversionFlags}.
     2070    Passing 0 for \a flags sets all the default options.
     2071
     2072    On some systems, reading an image directly to QPixmap can use less memory than
     2073    reading a QImage to convert it to QPixmap.
     2074
     2075    \sa fromImage(), toImage(), {QPixmap#Pixmap Conversion}{Pixmap Conversion}
     2076*/
     2077QPixmap QPixmap::fromImageReader(QImageReader *imageReader, Qt::ImageConversionFlags flags)
     2078{
     2079    QGraphicsSystem *gs = QApplicationPrivate::graphicsSystem();
     2080    QScopedPointer<QPixmapData> data(gs ? gs->createPixmapData(QPixmapData::PixmapType)
     2081            : QGraphicsSystem::createDefaultPixmapData(QPixmapData::PixmapType));
     2082    data->fromImageReader(imageReader, flags);
     2083    return QPixmap(data.take());
     2084}
     2085
     2086/*!
    20002087    \fn QPixmap QPixmap::grabWindow(WId window, int x, int y, int
    20012088    width, int height)
     
    20432130QPixmapData* QPixmap::pixmapData() const
    20442131{
    2045     return data.data();
    2046 }
     2132    if (data) {
     2133        QPixmapData* pm = data.data();
     2134        return pm->runtimeData() ? pm->runtimeData() : pm;
     2135    }
     2136
     2137    return 0;
     2138}
     2139
    20472140
    20482141/*!
Note: See TracChangeset for help on using the changeset viewer.