src/hbcore/image/hbiconsource.cpp
changeset 34 ed14f46c0e55
parent 7 923ff622b8b9
equal deleted inserted replaced
31:7516d6d86cf5 34:ed14f46c0e55
    32 #endif // HB_BOOTSTRAPPED
    32 #endif // HB_BOOTSTRAPPED
    33 #include <QtSvg/QSvgRenderer>
    33 #include <QtSvg/QSvgRenderer>
    34 #include <QPicture>
    34 #include <QPicture>
    35 #include <QScopedPointer>
    35 #include <QScopedPointer>
    36 #include <QImageReader>
    36 #include <QImageReader>
    37 #include <QPixmap>
    37 #include <QImage>
    38 #include <QDir>
    38 #include <QDir>
    39 #include <QFile>
    39 #include <QFile>
    40 #include <QByteArray>
    40 #include <QByteArray>
    41 #ifndef HB_BOOTSTRAPPED
    41 #ifndef HB_BOOTSTRAPPED
    42 #ifdef HB_NVG_CS_ICON
    42 #ifdef HB_NVG_CS_ICON
    43 #include "hbnvg_p.h"
    43 #include "hbnvg_p.h"
    44 #endif // HB_NVG_CS_ICON
    44 #endif // HB_NVG_CS_ICON
    45 #endif // HB_BOOTSTRAPPED
    45 #endif // HB_BOOTSTRAPPED
    46 
    46 
       
    47 
    47 #ifdef HB_BOOTSTRAPPED
    48 #ifdef HB_BOOTSTRAPPED
    48 
    49 
    49 // Copied from HbIconLoader::formatFromPath,
    50 // Copied from HbIconLoader::formatFromPath,
    50 // to avoid IconLoader dependency in ThemeIndexer, which needs this source file.
    51 // to avoid IconLoader dependency in ThemeIndexer, which needs this source file.
    51 QString iconTypeFromFilename(const QString &iconPath)
    52 QString iconTypeFromFilename(const QString &iconPath)
   117 */
   118 */
   118 
   119 
   119 HbIconSource::HbIconSource(const QString &filename) :
   120 HbIconSource::HbIconSource(const QString &filename) :
   120     mFilename(filename),
   121     mFilename(filename),
   121     mPicture(0),
   122     mPicture(0),
   122     mPixmap(0),
   123     mImage(0),
   123     mByteArray(0),
   124     mByteArray(0),
   124     mSvgRenderer(0),
   125     mSvgRenderer(0),
   125     mImageReader(0)
   126     mImageReader(0)
   126 {
   127 {
   127     mFullFilename = QDir(mFilename).absolutePath();
   128     mFullFilename = QDir(mFilename).absolutePath();
   129 
   130 
   130 HbIconSource::HbIconSource(const QString &filename, const QString &type) :
   131 HbIconSource::HbIconSource(const QString &filename, const QString &type) :
   131     mFilename(filename),
   132     mFilename(filename),
   132     mType(type),
   133     mType(type),
   133     mPicture(0),
   134     mPicture(0),
   134     mPixmap(0),
   135     mImage(0),
   135     mByteArray(0),
   136     mByteArray(0),
   136     mSvgRenderer(0),
   137     mSvgRenderer(0),
   137     mImageReader(0)
   138     mImageReader(0)
   138 {
   139 {
   139     mFullFilename = QDir(mFilename).absolutePath();
   140     mFullFilename = QDir(mFilename).absolutePath();
   142 HbIconSource::~HbIconSource()
   143 HbIconSource::~HbIconSource()
   143 {
   144 {
   144     delete mImageReader;
   145     delete mImageReader;
   145     delete mSvgRenderer;
   146     delete mSvgRenderer;
   146     delete mPicture;
   147     delete mPicture;
   147     delete mPixmap;
   148     delete mImage;
   148     delete mByteArray;
   149     delete mByteArray;
   149 }
   150 }
   150 
   151 
   151 QString HbIconSource::filename() const
   152 QString HbIconSource::filename() const
   152 {
   153 {
   226                     mDefaultSize = img.size();
   227                     mDefaultSize = img.size();
   227                 }
   228                 }
   228             }
   229             }
   229             releaseImageReader();
   230             releaseImageReader();
   230         } else if (mType != "BLOB") {
   231         } else if (mType != "BLOB") {
   231             if (!mPixmap) {
   232             if (!mImage) {
   232                 mPixmap = new QPixmap(mFilename);
   233                 mImage = new QImage(mFilename);
   233             }
   234                 if (mImage->isNull()) {
   234             mDefaultSize = mPixmap->size();
   235                     qWarning("HbIconSource::defaultSize: Cannot load %s", qPrintable(mFilename));
       
   236                 }
       
   237             }
       
   238             mDefaultSize = mImage->size();
   235         }
   239         }
   236     }
   240     }
   237 
   241 
   238     return QSizeF(mDefaultSize);
   242     return QSizeF(mDefaultSize);
   239 }
   243 }
   243  */
   247  */
   244 QSvgRenderer *HbIconSource::svgRenderer()
   248 QSvgRenderer *HbIconSource::svgRenderer()
   245 {
   249 {
   246     if (!mSvgRenderer) {
   250     if (!mSvgRenderer) {
   247         mSvgRenderer = new QSvgRenderer(mFilename);
   251         mSvgRenderer = new QSvgRenderer(mFilename);
       
   252         if (!mSvgRenderer->isValid()) {
       
   253             qWarning("HbIconSource::svgRenderer: Invalid SVG document: %s", qPrintable(mFilename));
       
   254         }
   248     }
   255     }
   249     return mSvgRenderer && mSvgRenderer->isValid() ? mSvgRenderer : 0;
   256     return mSvgRenderer && mSvgRenderer->isValid() ? mSvgRenderer : 0;
   250 }
   257 }
   251 
   258 
   252 /*!
   259 /*!
   303 QImageReader *HbIconSource::imageReader()
   310 QImageReader *HbIconSource::imageReader()
   304 {
   311 {
   305     if (!mImageReader) {
   312     if (!mImageReader) {
   306         type(); // make sure type is initialized
   313         type(); // make sure type is initialized
   307         mImageReader = new QImageReader(mFilename, mType.toLatin1());
   314         mImageReader = new QImageReader(mFilename, mType.toLatin1());
       
   315         if (!mImageReader->canRead()) {
       
   316             qWarning("HbIconSource::imageReader: Cannot read image %s", qPrintable(mFilename));
       
   317         }
   308     }
   318     }
   309     return mImageReader && mImageReader->canRead() ? mImageReader : 0;
   319     return mImageReader && mImageReader->canRead() ? mImageReader : 0;
   310 }
   320 }
   311 
   321 
   312 /*!
   322 /*!
   326 void HbIconSource::takeImageReader()
   336 void HbIconSource::takeImageReader()
   327 {
   337 {
   328     mImageReader = 0;
   338     mImageReader = 0;
   329 }
   339 }
   330 
   340 
   331 QPixmap *HbIconSource::pixmap()
   341 /*!
   332 {
   342   Returns the QImage, reading from the file, if needed.
   333     if (!mPixmap) {
   343 
   334         mPixmap = new QPixmap(mFilename);
   344   If image() has been called before and the data is still available
   335     }
   345   then no file access is done.
   336 
   346 
   337     return mPixmap;
   347   HbIconSource works with QImage everywhere so it can be used outside
   338 }
   348   the gui thread too.
   339 
   349  */
   340 void HbIconSource::deletePixmapIfLargerThan(int limitInBytes)
   350 QImage *HbIconSource::image()
   341 {
   351 {
   342     if (mPixmap) {
   352     if (!mImage) {
   343         QSize size = mPixmap->size();
   353         // Must use QImage so this function can be called outside the
   344         int sizeInBytes = size.width() * size.height() * mPixmap->depth();
   354         // main thread.
       
   355         mImage = new QImage(mFilename);
       
   356         if (mImage->isNull()) {
       
   357             qWarning("HbIconSource::image: Cannot load %s", qPrintable(mFilename));
       
   358         }
       
   359     }
       
   360     return mImage;
       
   361 }
       
   362 
       
   363 void HbIconSource::deleteImageIfLargerThan(int limitInBytes)
       
   364 {
       
   365     if (mImage) {
       
   366         QSize size = mImage->size();
       
   367         int sizeInBytes = size.width() * size.height() * mImage->depth();
   345         sizeInBytes /= 8; // depth is in bits, we want bytes
   368         sizeInBytes /= 8; // depth is in bits, we want bytes
   346 
   369 
   347         if (sizeInBytes > limitInBytes) {
   370         if (sizeInBytes > limitInBytes) {
   348             delete mPixmap;
   371             delete mImage;
   349             mPixmap = 0;
   372             mImage = 0;
   350         }
   373         }
   351     }
   374     }
   352 }
   375 }
   353 
   376 
   354 bool HbIconSource::canKeepOpen() const
   377 bool HbIconSource::canKeepOpen() const