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:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/plugins/imageformats/svg/main.cpp

    r651 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)
     
    6363QStringList QSvgPlugin::keys() const
    6464{
    65     return QStringList() << QLatin1String("svg");
     65    return QStringList() << QLatin1String("svg") << QLatin1String("svgz");
    6666}
    6767
    6868QImageIOPlugin::Capabilities QSvgPlugin::capabilities(QIODevice *device, const QByteArray &format) const
    6969{
    70     //### canRead disabled for now because it's hard to detect
    71     //    whether the file is actually svg without parsing it
    72     //if (device->isReadable() && QSvgIOHandler::canRead(device))
    73 
    74     if (format == "svg")
     70    if (format == "svg" || format == "svgz")
    7571        return Capabilities(CanRead);
    76     else
    77         return 0;
    78 
    79 
    80     if (!device->isOpen())
     72    if (!format.isEmpty())
    8173        return 0;
    8274
    8375    Capabilities cap;
    84     if (device->isReadable())
     76    if (device->isReadable() && QSvgIOHandler::canRead(device))
    8577        cap |= CanRead;
    8678    return cap;
  • trunk/src/plugins/imageformats/svg/qsvgiohandler.cpp

    r651 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)
     
    4949#include "qpainter.h"
    5050#include "qvariant.h"
     51#include "qbuffer.h"
    5152#include "qdebug.h"
    5253
     
    5657{
    5758public:
    58     QSvgIOHandlerPrivate()
    59         : r(new QSvgRenderer()), loaded(false)
     59    QSvgIOHandlerPrivate(QSvgIOHandler *qq)
     60        : q(qq), loaded(false), readDone(false), backColor(Qt::transparent)
    6061    {}
    61     ~QSvgIOHandlerPrivate()
    62     {
    63         delete r;
    64     }
    6562
    6663    bool load(QIODevice *device);
    67     static bool findSvgTag(QIODevice *device);
    68 
    69     QSvgRenderer *r;
    70     QSize         defaultSize;
    71     QSize         currentSize;
    72     bool          loaded;
     64
     65    QSvgIOHandler   *q;
     66    QSvgRenderer     r;
     67    QXmlStreamReader xmlReader;
     68    QSize            defaultSize;
     69    QRect            clipRect;
     70    QSize            scaledSize;
     71    QRect            scaledClipRect;
     72    bool             loaded;
     73    bool             readDone;
     74    QColor           backColor;
    7375};
    7476
     77
    7578bool QSvgIOHandlerPrivate::load(QIODevice *device)
    7679{
    7780    if (loaded)
    7881        return true;
    79 
    80     if (r->load(device->readAll())) {
    81         defaultSize = QSize(r->viewBox().width(), r->viewBox().height());
    82         if (currentSize.isEmpty())
    83             currentSize = defaultSize;
    84     }
    85     loaded = r->isValid();
     82    if (q->format().isEmpty())
     83        q->canRead();
     84
     85    // # The SVG renderer doesn't handle trailing, unrelated data, so we must
     86    // assume that all available data in the device is to be read.
     87    bool res = false;
     88    QBuffer *buf = qobject_cast<QBuffer *>(device);
     89    if (buf) {
     90        const QByteArray &ba = buf->data();
     91        res = r.load(QByteArray::fromRawData(ba.constData() + buf->pos(), ba.size() - buf->pos()));
     92        buf->seek(ba.size());
     93    } else if (q->format() == "svgz") {
     94        res = r.load(device->readAll());
     95    } else {
     96        xmlReader.setDevice(device);
     97        res = r.load(&xmlReader);
     98    }
     99
     100    if (res) {
     101        defaultSize = QSize(r.viewBox().width(), r.viewBox().height());
     102        loaded = true;
     103    }
    86104
    87105    return loaded;
    88106}
    89107
    90 bool QSvgIOHandlerPrivate::findSvgTag(QIODevice *device)
    91 {
    92     qint64 pos = device->pos();
    93     device->seek(0);
    94     char buffer[256];
    95     const char svg_tag[] = "<svg";
    96 
    97     while (1) {
    98         int size = device->read(buffer, 256);
    99         for (int i=0; i<size - 5; ++i) {
    100             if (!memcmp(buffer + i, svg_tag, 4)) {
    101                 if (buffer[i+4] == ' ' || buffer[i+4] == '\t'
    102                     || buffer[i+4] == '\n' || buffer[i+4] == '\r')
    103                 {
    104                     device->seek(pos);
    105                     return true;
    106                 }
     108
     109QSvgIOHandler::QSvgIOHandler()
     110    : d(new QSvgIOHandlerPrivate(this))
     111{
     112
     113}
     114
     115
     116QSvgIOHandler::~QSvgIOHandler()
     117{
     118    delete d;
     119}
     120
     121
     122bool QSvgIOHandler::canRead() const
     123{
     124    if (!device())
     125        return false;
     126    if (d->loaded && !d->readDone)
     127        return true;        // Will happen if we have been asked for the size
     128
     129    QByteArray buf = device()->peek(8);
     130    if (buf.startsWith("\x1f\x8b")) {
     131        setFormat("svgz");
     132        return true;
     133    } else if (buf.contains("<?xml") || buf.contains("<svg")) {
     134        setFormat("svg");
     135        return true;
     136    }
     137    return false;
     138}
     139
     140
     141QByteArray QSvgIOHandler::name() const
     142{
     143    return "svg";
     144}
     145
     146
     147bool QSvgIOHandler::read(QImage *image)
     148{
     149    if (!d->readDone && d->load(device())) {
     150        bool xform = (d->clipRect.isValid() || d->scaledSize.isValid() || d->scaledClipRect.isValid());
     151        QSize finalSize = d->defaultSize;
     152        QRectF bounds;
     153        if (xform && !d->defaultSize.isEmpty()) {
     154            bounds = QRectF(QPointF(0,0), QSizeF(d->defaultSize));
     155            QPoint tr1, tr2;
     156            QSizeF sc(1, 1);
     157            if (d->clipRect.isValid()) {
     158                tr1 = -d->clipRect.topLeft();
     159                finalSize = d->clipRect.size();
    107160            }
     161            if (d->scaledSize.isValid()) {
     162                sc = QSizeF(qreal(d->scaledSize.width()) / finalSize.width(),
     163                            qreal(d->scaledSize.height()) / finalSize.height());
     164                finalSize = d->scaledSize;
     165            }
     166            if (d->scaledClipRect.isValid()) {
     167                tr2 = -d->scaledClipRect.topLeft();
     168                finalSize = d->scaledClipRect.size();
     169            }
     170            QTransform t;
     171            t.translate(tr2.x(), tr2.y());
     172            t.scale(sc.width(), sc.height());
     173            t.translate(tr1.x(), tr1.y());
     174            bounds = t.mapRect(bounds);
    108175        }
    109         if (device->atEnd())
    110             break;
    111         device->seek(device->pos()-4);
    112     }
    113     device->seek(pos);
    114     return false;
    115 }
    116 
    117 QSvgIOHandler::QSvgIOHandler()
    118     : d(new QSvgIOHandlerPrivate())
    119 {
    120 
    121 }
    122 
    123 
    124 QSvgIOHandler::~QSvgIOHandler()
    125 {
    126     delete d;
    127 }
    128 
    129 
    130 bool QSvgIOHandler::canRead() const
    131 {
    132     return QSvgIOHandlerPrivate::findSvgTag(device());
    133 }
    134 
    135 
    136 QByteArray QSvgIOHandler::name() const
    137 {
    138     return "svg";
    139 }
    140 
    141 
    142 bool QSvgIOHandler::read(QImage *image)
    143 {
    144     if (d->load(device())) {
    145         *image = QImage(d->currentSize, QImage::Format_ARGB32_Premultiplied);
    146         if (!d->currentSize.isEmpty()) {
    147             image->fill(0x00000000);
     176        *image = QImage(finalSize, QImage::Format_ARGB32_Premultiplied);
     177        if (!finalSize.isEmpty()) {
     178            image->fill(d->backColor.rgba());
    148179            QPainter p(image);
    149             d->r->render(&p);
     180            d->r.render(&p, bounds);
    150181            p.end();
    151182        }
     183        d->readDone = true;
    152184        return true;
    153185    }
     
    167199        return d->defaultSize;
    168200        break;
     201    case ClipRect:
     202        return d->clipRect;
     203        break;
    169204    case ScaledSize:
    170         return d->currentSize;
     205        return d->scaledSize;
     206        break;
     207    case ScaledClipRect:
     208        return d->scaledClipRect;
     209        break;
     210    case BackgroundColor:
     211        return d->backColor;
    171212        break;
    172213    default:
     
    180221{
    181222    switch(option) {
    182     case Size:
    183         d->defaultSize = value.toSize();
    184         d->currentSize = value.toSize();
     223    case ClipRect:
     224        d->clipRect = value.toRect();
    185225        break;
    186226    case ScaledSize:
    187         d->currentSize = value.toSize();
     227        d->scaledSize = value.toSize();
     228        break;
     229    case ScaledClipRect:
     230        d->scaledClipRect = value.toRect();
     231        break;
     232    case BackgroundColor:
     233        d->backColor = value.value<QColor>();
    188234        break;
    189235    default:
     
    199245    case ImageFormat:
    200246    case Size:
     247    case ClipRect:
    201248    case ScaledSize:
     249    case ScaledClipRect:
     250    case BackgroundColor:
    202251        return true;
    203252    default:
     
    207256}
    208257
     258
    209259bool QSvgIOHandler::canRead(QIODevice *device)
    210260{
    211     return QSvgIOHandlerPrivate::findSvgTag(device);
     261    QByteArray buf = device->peek(8);
     262    return buf.startsWith("\x1f\x8b") || buf.contains("<?xml") || buf.contains("<svg");
    212263}
    213264
  • trunk/src/plugins/imageformats/svg/qsvgiohandler.h

    r651 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)
Note: See TracChangeset for help on using the changeset viewer.