Ignore:
Timestamp:
Feb 11, 2010, 11:19:06 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.1 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/gui/painting/qbrush.cpp

    r2 r561  
    22**
    33** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    4 ** Contact: Qt Software Information (qt-info@nokia.com)
     4** All rights reserved.
     5** Contact: Nokia Corporation (qt-info@nokia.com)
    56**
    67** This file is part of the QtGui module of the Qt Toolkit.
     
    2122** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    2223**
    23 ** In addition, as a special exception, Nokia gives you certain
    24 ** additional rights. These rights are described in the Nokia Qt LGPL
    25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
    26 ** package.
     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.
    2727**
    2828** GNU General Public License Usage
     
    3434** met: http://www.gnu.org/copyleft/gpl.html.
    3535**
    36 ** If you are unsure which license is appropriate for your use, please
    37 ** contact the sales department at qt-sales@nokia.com.
     36** If you have questions regarding the use of this file, please contact
     37** Nokia at qt-info@nokia.com.
    3838** $QT_END_LICENSE$
    3939**
     
    218218// returns true if the brush has a pixmap (or bitmap) set as the
    219219// brush texture, false otherwise
    220 bool qHasPixmapTexture(const QBrush& brush)
     220bool Q_GUI_EXPORT qHasPixmapTexture(const QBrush& brush)
    221221{
    222222    if (brush.style() != Qt::TexturePattern)
    223223        return false;
    224     QTexturedBrushData *tx_data = static_cast<QTexturedBrushData *>(brush.d);
     224    QTexturedBrushData *tx_data = static_cast<QTexturedBrushData *>(brush.d.data());
    225225    return tx_data->m_has_pixmap_texture;
    226226}
     
    231231};
    232232
     233struct QBrushDataPointerDeleter
     234{
     235    static inline void deleteData(QBrushData *d)
     236    {
     237        switch (d->style) {
     238        case Qt::TexturePattern:
     239            delete static_cast<QTexturedBrushData*>(d);
     240            break;
     241        case Qt::LinearGradientPattern:
     242        case Qt::RadialGradientPattern:
     243        case Qt::ConicalGradientPattern:
     244            delete static_cast<QGradientBrushData*>(d);
     245            break;
     246        default:
     247            delete d;
     248        }
     249    }
     250
     251    static inline void cleanup(QBrushData *d)
     252    {
     253        if (d && !d->ref.deref()) {
     254            deleteData(d);
     255        }
     256    }
     257};
    233258
    234259/*!
    235260    \class QBrush
    236     \ingroup multimedia
     261    \ingroup painting
    237262    \ingroup shared
    238263
     
    365390    switch(style) {
    366391    case Qt::NoBrush:
    367         d = nullBrushInstance();
     392        d.reset(nullBrushInstance());
    368393        d->ref.ref();
    369394        if (d->color != color) setColor(color);
    370395        return;
    371396    case Qt::TexturePattern:
    372         d = new QTexturedBrushData;
     397        d.reset(new QTexturedBrushData);
    373398        break;
    374399    case Qt::LinearGradientPattern:
    375400    case Qt::RadialGradientPattern:
    376401    case Qt::ConicalGradientPattern:
    377         d = new QGradientBrushData;
     402        d.reset(new QGradientBrushData);
    378403        break;
    379404    default:
    380         d = new QBrushData;
     405        d.reset(new QBrushData);
    381406        break;
    382407    }
     
    392417
    393418QBrush::QBrush()
    394 {
    395     d = nullBrushInstance();
     419    : d(nullBrushInstance())
     420{
    396421    Q_ASSERT(d);
    397422    d->ref.ref();
     
    436461        init(Qt::black, style);
    437462    else {
    438         d = nullBrushInstance();
     463        d.reset(nullBrushInstance());
    439464        d->ref.ref();
    440465    }
     
    452477        init(color, style);
    453478    else {
    454         d = nullBrushInstance();
     479        d.reset(nullBrushInstance());
    455480        d->ref.ref();
    456481    }
     
    469494        init(color, style);
    470495    else {
    471         d = nullBrushInstance();
     496        d.reset(nullBrushInstance());
    472497        d->ref.ref();
    473498    }
     
    511536
    512537QBrush::QBrush(const QBrush &other)
    513 {
    514     d = other.d;
     538    : d(other.d.data())
     539{
    515540    d->ref.ref();
    516541}
     
    536561
    537562    init(QColor(), enum_table[gradient.type()]);
    538     QGradientBrushData *grad = static_cast<QGradientBrushData *>(d);
     563    QGradientBrushData *grad = static_cast<QGradientBrushData *>(d.data());
    539564    grad->gradient = gradient;
    540565}
     
    546571QBrush::~QBrush()
    547572{
    548     if (!d->ref.deref())
    549         cleanUp(d);
    550573}
    551574
    552575void QBrush::cleanUp(QBrushData *x)
    553576{
    554     switch (x->style) {
    555     case Qt::TexturePattern:
    556         delete static_cast<QTexturedBrushData*>(x);
    557         break;
    558     case Qt::LinearGradientPattern:
    559     case Qt::RadialGradientPattern:
    560     case Qt::ConicalGradientPattern:
    561         delete static_cast<QGradientBrushData*>(x);
    562         break;
    563     default:
    564         delete x;
    565     }
     577    QBrushDataPointerDeleter::deleteData(x);
    566578}
    567579
     
    572584        return;
    573585
    574     QBrushData *x;
     586    QScopedPointer<QBrushData> x;
    575587    switch(newStyle) {
    576588    case Qt::TexturePattern: {
    577589        QTexturedBrushData *tbd = new QTexturedBrushData;
    578590        if (d->style == Qt::TexturePattern) {
    579             QTexturedBrushData *data = static_cast<QTexturedBrushData *>(d);
     591            QTexturedBrushData *data = static_cast<QTexturedBrushData *>(d.data());
    580592            if (data->m_has_pixmap_texture)
    581593                tbd->setPixmap(data->pixmap());
     
    583595                tbd->setImage(data->image());
    584596        }
    585         x = tbd;
     597        x.reset(tbd);
    586598        break;
    587599        }
     
    589601    case Qt::RadialGradientPattern:
    590602    case Qt::ConicalGradientPattern:
    591         x = new QGradientBrushData;
    592         static_cast<QGradientBrushData *>(x)->gradient =
    593             static_cast<QGradientBrushData *>(d)->gradient;
     603        x.reset(new QGradientBrushData);
     604        static_cast<QGradientBrushData *>(x.data())->gradient =
     605            static_cast<QGradientBrushData *>(d.data())->gradient;
    594606        break;
    595607    default:
    596         x = new QBrushData;
     608        x.reset(new QBrushData);
    597609        break;
    598610    }
     
    601613    x->color = d->color;
    602614    x->transform = d->transform;
    603     if (!d->ref.deref())
    604         cleanUp(d);
    605     d = x;
     615    d.reset(x.take());
    606616}
    607617
     
    616626QBrush &QBrush::operator=(const QBrush &b)
    617627{
     628    if (d == b.d)
     629        return *this;
     630
    618631    b.d->ref.ref();
    619     if (!d->ref.deref())
    620         cleanUp(d);
    621     d = b.d;
     632    d.reset(b.d.data());
    622633    return *this;
    623634}
     
    714725    if (d->style != Qt::TexturePattern)
    715726        return 0;
    716     QTexturedBrushData *data  = static_cast<QTexturedBrushData*>(d);
     727    QTexturedBrushData *data  = static_cast<QTexturedBrushData*>(d.data());
    717728    QPixmap &pixmap = data->pixmap();
    718729    return pixmap.isNull() ? 0 : &pixmap;
     
    731742{
    732743    return d->style == Qt::TexturePattern
    733                      ? ((QTexturedBrushData*) d)->pixmap()
     744                     ? (static_cast<QTexturedBrushData *>(d.data()))->pixmap()
    734745                     : QPixmap();
    735746}
     
    749760    if (!pixmap.isNull()) {
    750761        detach(Qt::TexturePattern);
    751         QTexturedBrushData *data = static_cast<QTexturedBrushData *>(d);
     762        QTexturedBrushData *data = static_cast<QTexturedBrushData *>(d.data());
    752763        data->setPixmap(pixmap);
    753764    } else {
     
    772783{
    773784    return d->style == Qt::TexturePattern
    774                      ? ((QTexturedBrushData *) d)->image()
     785                     ? (static_cast<QTexturedBrushData *>(d.data()))->image()
    775786                     : QImage();
    776787}
     
    797808    if (!image.isNull()) {
    798809        detach(Qt::TexturePattern);
    799         QTexturedBrushData *data = static_cast<QTexturedBrushData *>(d);
     810        QTexturedBrushData *data = static_cast<QTexturedBrushData *>(d.data());
    800811        data->setImage(image);
    801812    } else {
     
    813824        || d->style == Qt::RadialGradientPattern
    814825        || d->style == Qt::ConicalGradientPattern) {
    815         return &static_cast<const QGradientBrushData *>(d)->gradient;
     826        return &static_cast<const QGradientBrushData *>(d.data())->gradient;
    816827    }
    817828    return 0;
     
    847858        return true;
    848859    } else if (d->style == Qt::TexturePattern) {
    849         return !texture().hasAlpha();
     860        return qHasPixmapTexture(*this)
     861            ? !texture().hasAlphaChannel() && !texture().isQBitmap()
     862            : !textureImage().hasAlphaChannel();
    850863    }
    851864
     
    924937        switch (d->style) {
    925938        case Qt::TexturePattern: {
    926             QPixmap &us = ((QTexturedBrushData *) d)->pixmap();
    927             QPixmap &them = ((QTexturedBrushData *) b.d)->pixmap();
     939            QPixmap &us = (static_cast<QTexturedBrushData *>(d.data()))->pixmap();
     940            QPixmap &them = (static_cast<QTexturedBrushData *>(b.d.data()))->pixmap();
    928941            return ((us.isNull() && them.isNull()) || us.cacheKey() == them.cacheKey());
    929942        }
     
    932945        case Qt::ConicalGradientPattern:
    933946            {
    934                 QGradientBrushData *d1 = static_cast<QGradientBrushData *>(d);
    935                 QGradientBrushData *d2 = static_cast<QGradientBrushData *>(b.d);
     947                QGradientBrushData *d1 = static_cast<QGradientBrushData *>(d.data());
     948                QGradientBrushData *d2 = static_cast<QGradientBrushData *>(b.d.data());
    936949                return d1->gradient == d2->gradient;
    937950            }
     
    958971{
    959972#ifndef Q_BROKEN_DEBUG_STREAM
    960     dbg.nospace() << "QBrush(" << b.color() << ',' << b.style() << ')';
     973    static const char *BRUSH_STYLES[] = {
     974     "NoBrush",
     975     "SolidPattern",
     976     "Dense1Pattern",
     977     "Dense2Pattern",
     978     "Dense3Pattern",
     979     "Dense4Pattern",
     980     "Dense5Pattern",
     981     "Dense6Pattern",
     982     "Dense7Pattern",
     983     "HorPattern",
     984     "VerPattern",
     985     "CrossPattern",
     986     "BDiagPattern",
     987     "FDiagPattern",
     988     "DiagCrossPattern",
     989     "LinearGradientPattern",
     990     "RadialGradientPattern",
     991     "ConicalGradientPattern",
     992     "TexturePattern"
     993    };
     994
     995    dbg.nospace() << "QBrush(" << b.color() << ',' << BRUSH_STYLES[b.style()] << ')';
    961996    return dbg.space();
    962997#else
     
    11521187/*!
    11531188    \class QGradient
    1154     \ingroup multimedia
     1189    \ingroup painting
    11551190    \ingroup shared
    11561191
     
    15161551/*!
    15171552    \class QLinearGradient
    1518     \ingroup multimedia
     1553    \ingroup painting
    15191554
    15201555    \brief The QLinearGradient class is used in combination with QBrush to
     
    16951730/*!
    16961731    \class QRadialGradient
    1697     \ingroup multimedia
     1732    \ingroup painting
    16981733
    16991734    \brief The QRadialGradient class is used in combination with QBrush to
     
    19521987/*!
    19531988    \class QConicalGradient
    1954     \ingroup multimedia
     1989    \ingroup painting
    19551990
    19561991    \brief The QConicalGradient class is used in combination with QBrush to
Note: See TracChangeset for help on using the changeset viewer.