koPictureImage.cc
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <qbuffer.h>
00022 #include <qpainter.h>
00023 #include <qimage.h>
00024 #include <qpixmap.h>
00025 #include <qapplication.h>
00026 #include <qdragobject.h>
00027
00028 #include <kdebug.h>
00029 #include <kmimetype.h>
00030
00031 #include "koPictureKey.h"
00032 #include "koPictureImage.h"
00033
00034 KoPictureImage::KoPictureImage(void) : m_cacheIsInFastMode(true)
00035 {
00036
00037 m_cachedPixmap.setOptimization(QPixmap::MemoryOptim);
00038 }
00039
00040 KoPictureImage::~KoPictureImage(void)
00041 {
00042 }
00043
00044 KoPictureBase* KoPictureImage::newCopy(void) const
00045 {
00046 return new KoPictureImage(*this);
00047 }
00048
00049 KoPictureType::Type KoPictureImage::getType(void) const
00050 {
00051 return KoPictureType::TypeImage;
00052 }
00053
00054 bool KoPictureImage::isNull(void) const
00055 {
00056 return m_originalImage.isNull();
00057 }
00058
00059 void KoPictureImage::scaleAndCreatePixmap(const QSize& size, bool fastMode)
00060 {
00061 if ((size==m_cachedSize)
00062 && ((fastMode) || (!m_cacheIsInFastMode)))
00063 {
00064
00065
00066
00067
00068 return;
00069 }
00070
00071
00072 if ( !isSlowResizeModeAllowed() )
00073 {
00074 kdDebug(30003) << "User has disallowed slow mode!" << endl;
00075 fastMode = true;
00076 }
00077
00078
00079 if ( fastMode )
00080 {
00081 m_cachedPixmap.convertFromImage(m_originalImage.scale( size ), QPixmap::Color);
00082 m_cacheIsInFastMode=true;
00083 }
00084 else
00085 {
00086 m_cachedPixmap.convertFromImage(m_originalImage.smoothScale( size ), QPixmap::Color);
00087 m_cacheIsInFastMode=false;
00088 }
00089 m_cachedSize=size;
00090 }
00091
00092 void KoPictureImage::draw(QPainter& painter, int x, int y, int width, int height, int sx, int sy, int sw, int sh, bool fastMode)
00093 {
00094
00095 if ( !width || !height )
00096 return;
00097 QSize origSize = getOriginalSize();
00098 const bool scaleImage = painter.device()->isExtDev()
00099 && ((width <= origSize.width()) || (height <= origSize.height()));
00100 if( scaleImage )
00101 {
00102
00103 double xScale = double(width) / double(origSize.width());
00104 double yScale = double(height) / double(origSize.height());
00105
00106 painter.save();
00107 painter.translate( x, y );
00108 painter.scale( xScale, yScale );
00109
00110
00111
00112 painter.drawImage(0, 0, m_originalImage);
00113 painter.restore();
00114 }
00115 else
00116 {
00117 QSize screenSize( width, height );
00118
00119
00120 scaleAndCreatePixmap(screenSize, fastMode);
00121
00122
00123
00124 painter.drawPixmap( x + sx, y + sy, m_cachedPixmap, sx, sy, sw, sh );
00125 }
00126 }
00127
00128 bool KoPictureImage::load(const QByteArray& array, const QString& )
00129 {
00130 m_rawData=array;
00131
00132 QBuffer buffer(m_rawData);
00133 buffer.open(IO_ReadWrite);
00134 QImageIO imageIO(&buffer,NULL);
00135
00136 if (!imageIO.read())
00137 {
00138 buffer.close();
00139 kdError(30003) << "Image could not be loaded!" << endl;
00140 return false;
00141 }
00142 buffer.close();
00143 m_originalImage=imageIO.image();
00144
00145 return true;
00146 }
00147
00148 bool KoPictureImage::save(QIODevice* io)
00149 {
00150
00151 Q_ULONG size=io->writeBlock(m_rawData);
00152 return (size==m_rawData.size());
00153 }
00154
00155 QSize KoPictureImage::getOriginalSize(void) const
00156 {
00157 return m_originalImage.size();
00158 }
00159
00160 QPixmap KoPictureImage::generatePixmap(const QSize& size, bool smoothScale)
00161 {
00162 scaleAndCreatePixmap(size,!smoothScale);
00163 return m_cachedPixmap;
00164 }
00165
00166 QString KoPictureImage::getMimeType(const QString& extension) const
00167 {
00168 QString fileName("/tmp/temp.");
00169 fileName+=extension;
00170 QString mimetype=KMimeType::findByURL(fileName,0,true,true)->name();
00171 kdDebug(30003) << "Image is mime type: " << mimetype << endl;
00172 return mimetype;
00173 }
00174
00175 QDragObject* KoPictureImage::dragObject( QWidget *dragSource, const char *name )
00176 {
00177 return new QImageDrag( m_originalImage, dragSource, name );
00178 }
00179
00180 QImage KoPictureImage::generateImage(const QSize& size)
00181 {
00182
00183 return m_originalImage.smoothScale( size );
00184 }
00185
00186 void KoPictureImage::clearCache(void)
00187 {
00188 m_cachedPixmap.resize(0, 0);
00189 m_cacheIsInFastMode=true;
00190 m_cachedSize=QSize();
00191 }
This file is part of the documentation for lib Library Version 1.3.5.