From kde-core-devel Mon Feb 11 15:33:42 2002 From: Malte Starostik Date: Mon, 11 Feb 2002 15:33:42 +0000 To: kde-core-devel Subject: Re: Thumbnail Standard, XCF reader X-MARC-Message: https://marc.info/?l=kde-core-devel&m=101344174820660 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------Boundary-00=_6KKDLIIC1SXZVB7R0JAW" --------------Boundary-00=_6KKDLIIC1SXZVB7R0JAW Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Am Montag, 11. Februar 2002 16:25:16 schrieb Dirk Mueller: > On Mon, 11 Feb 2002, Malte Starostik wrote: > > As it adds to the interoperability with "foreign" applications, I'd > > really like to commit this for 3.0, but not without an okay. > > Did you forget to append the patch ? If you insist :-) -- Malte Starostik PGP: 1024D/D2F3C787 [C138 2121 FAF3 410A 1C2A 27CD 5431 7745 D2F3 C787] --------------Boundary-00=_6KKDLIIC1SXZVB7R0JAW Content-Type: text/x-diff; charset="iso-8859-1"; name="kio.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="kio.diff" Index: kio/previewjob.cpp =================================================================== RCS file: /home/kde/kdelibs/kio/kio/previewjob.cpp,v retrieving revision 1.27 diff -u -3 -d -p -r1.27 previewjob.cpp --- kio/previewjob.cpp 2002/01/25 08:41:17 1.27 +++ kio/previewjob.cpp 2002/02/11 15:31:04 @@ -72,13 +72,19 @@ struct KIO::PreviewJobPrivate PreviewItem currentItem; // The modification time of that URL time_t tOrig; - // Path to thumbnail cache for this directory + // Path to thumbnail cache for the current size QString thumbPath; + // Original URL of current item in TMS format + // (file:///path/to/file instead of file:/path/to/file) + QString origName; + // Thumbnail file name for current item + QString thumbName; // Size of thumbnail int width; int height; - // named thumbnail size for caching - QString sizeName; + // Unscaled size of thumbnail (128 or 256 if cache is enabled) + int cacheWidth; + int cacheHeight; // Whether the thumbnail should be scaled bool bScale; // Whether we should save the thumbnail @@ -114,6 +120,8 @@ PreviewJob::PreviewJob( const KFileItemL d->enabledPlugins = enabledPlugins; d->width = width; d->height = height ? height : width; + d->cacheWidth = d->width; + d->cacheHeight = d->height; d->iconSize = iconSize; d->iconAlpha = iconAlpha; d->deleteItems = deleteItems; @@ -183,22 +191,11 @@ void PreviewJob::startPreview() if (bNeedCache) { - KGlobal::dirs()->addResourceType( "thumbnails", "share/thumbnails/" ); - if (d->width == d->height) - { - if (d->width == 48) - d->sizeName = "small"; - else if (d->width == 64) - d->sizeName = "med"; - else if (d->width == 90) - d->sizeName = "large"; - else if (d->width == 112) - d->sizeName = "xxl"; - else - d->sizeName.setNum(d->width); - } - else - d->sizeName = QString::fromLatin1("%1x%2").arg(d->width).arg(d->height); + if (d->width <= 128 && d->height <= 128) d->cacheWidth = d->cacheHeight = 128; + else d->cacheWidth = d->cacheHeight = 256; + d->thumbPath = QDir::homeDirPath() + "/.thumbnails/" + + (d->cacheWidth == 128 ? "normal/" : "large/"); + KStandardDirs::makeDir(d->thumbPath, 0700); } else d->bSave = false; @@ -233,7 +230,6 @@ void PreviewJob::removeItem( const KFile void PreviewJob::determineNextFile() { - KURL oldURL; if (d->currentItem.item) { if (!d->succeeded) @@ -254,23 +250,6 @@ void PreviewJob::determineNextFile() d->currentItem = d->items.first(); d->succeeded = false; d->items.remove(d->items.begin()); - if (d->bSave) - { - oldURL.setPath(QDir::cleanDirPath(oldURL.directory())); - KURL newURL = d->currentItem.item->url(); - newURL.setPath(QDir::cleanDirPath(newURL.directory())); - // different path, determine cache dir - if (oldURL != newURL) - { - KMD5 md5(QFile::encodeName(newURL.url())); - QCString hash = md5.hexDigest(); - d->thumbPath = locateLocal("thumbnails", - QString::fromLatin1( hash.data(), 4 ) + "/" + - QString::fromLatin1( hash.data()+4, 4 ) + "/" + - QString::fromLatin1( hash.data()+8 ) + "/" + - d->sizeName + "/"); - } - } KIO::Job *job = KIO::stat( d->currentItem.item->url(), false ); addSubjob(job); } @@ -355,18 +334,25 @@ bool PreviewJob::statResultThumbnail() if ( d->thumbPath.isEmpty() ) return false; - QString thumbPath = d->thumbPath + d->currentItem.item->url().fileName(); - struct stat st; - if ( ::stat( QFile::encodeName( thumbPath ), &st ) != 0 || - st.st_mtime < d->tOrig ) - return false; + KURL url = d->currentItem.item->url(); + // Don't include the password if any + url.setPass(QString::null); + // The TMS defines local files as file:///path/to/file instead of KDE's + // (file:/path/to/file) + if (url.protocol() == "file") d->origName = "file://" + url.path(); + else d->origName = url.url(); - QPixmap pix; - if ( !pix.load( thumbPath ) ) - return false; + KMD5 md5( QFile::encodeName( d->origName ) ); + d->thumbName = QFile::encodeName( md5.hexDigest() ) + ".png"; + QImage thumb; + if ( !thumb.load( d->thumbPath + d->thumbName ) ) return false; + + if ( thumb.text( "Thumb::URI", 0 ) != d->origName ) return false; + if ( thumb.text( "Thumb::MTime", 0 ).toInt() != d->tOrig ) return false; + // Found it, use it - emitPreview(pix); + emitPreview( thumb ); d->succeeded = true; determineNextFile(); return true; @@ -400,10 +386,11 @@ void PreviewJob::createThumbnail( QStrin KIO::TransferJob *job = KIO::get(thumbURL, false, false); addSubjob(job); connect(job, SIGNAL(data(KIO::Job *, const QByteArray &)), SLOT(slotThumbData(KIO::Job *, const QByteArray &))); + bool save = d->bSave && d->currentItem.plugin->property("CacheThumbnail").toBool(); job->addMetaData("mimeType", d->currentItem.item->mimetype()); - job->addMetaData("width", QString().setNum(d->width)); - job->addMetaData("height", QString().setNum(d->height)); - job->addMetaData("iconSize", QString().setNum(d->iconSize)); + job->addMetaData("width", QString().setNum(save ? d->cacheWidth : d->width)); + job->addMetaData("height", QString().setNum(save ? d->cacheHeight : d->height)); + job->addMetaData("iconSize", QString().setNum(save ? 64 : d->iconSize)); job->addMetaData("iconAlpha", QString().setNum(d->iconAlpha)); job->addMetaData("plugin", d->currentItem.plugin->library()); if (d->shmid == -1) @@ -412,7 +399,7 @@ void PreviewJob::createThumbnail( QStrin shmdt((char*)d->shmaddr); shmctl(d->shmid, IPC_RMID, 0); } - d->shmid = shmget(IPC_PRIVATE, d->width * d->height * 4, IPC_CREAT|0600); + d->shmid = shmget(IPC_PRIVATE, d->cacheWidth * d->cacheHeight * 4, IPC_CREAT|0600); if (d->shmid != -1) { d->shmaddr = static_cast(shmat(d->shmid, 0, SHM_RDONLY)); @@ -433,36 +420,44 @@ void PreviewJob::createThumbnail( QStrin void PreviewJob::slotThumbData(KIO::Job *, const QByteArray &data) { bool save = d->bSave && d->currentItem.plugin->property("CacheThumbnail").toBool(); - QPixmap pix; + QImage thumb; if (d->shmaddr) { QDataStream str(data, IO_ReadOnly); int width, height, depth; bool alpha; str >> width >> height >> depth >> alpha; - QImage img(d->shmaddr, width, height, depth, 0, 0, QImage::IgnoreEndian); - img.setAlphaBuffer(alpha); - pix.convertFromImage(img); - if (save) - { - QByteArray saveData; - QDataStream saveStr(saveData, IO_WriteOnly); - saveStr << img; - saveThumbnail(saveData); - } + thumb = QImage(d->shmaddr, width, height, depth, 0, 0, QImage::IgnoreEndian); + thumb.setAlphaBuffer(alpha); } - else + else thumb.loadFromData(data); + if (save) { - pix.loadFromData(data); - if (save) - saveThumbnail(data); + thumb.setText("Thumb::URI", 0, d->origName); + thumb.setText("Thumb::MTime", 0, QString::number(d->tOrig)); + thumb.setText("Thumb::Mimetype", 0, d->currentItem.item->mimetype()); + thumb.setText("Software", 0, "KDE Preview Generator"); + KTempFile temp(d->thumbPath + "kde-tmp-", ".png"); + thumb.save(temp.name(), "PNG"); + rename(QFile::encodeName(temp.name()), QFile::encodeName(d->thumbPath + d->thumbName)); } - emitPreview(pix); + emitPreview( thumb ); d->succeeded = true; } -void PreviewJob::emitPreview(const QPixmap &pix) +void PreviewJob::emitPreview(const QImage &thumb) { + QPixmap pix; + if (thumb.width() > d->width || thumb.height() > d->height) + { + double imgRatio = (double)thumb.height() / (double)thumb.width(); + if (imgRatio > (double)d->height / (double)d->width) + pix.convertFromImage( + thumb.smoothScale((int)QMAX((double)d->height / imgRatio, 1), d->height)); + else pix.convertFromImage( + thumb.smoothScale(d->width, (int)QMAX((double)d->width * imgRatio, 1))); + } + else pix.convertFromImage(thumb); emit gotPreview(d->currentItem.item, pix); } @@ -471,16 +466,6 @@ void PreviewJob::emitFailed(const KFileI if (!item) item = d->currentItem.item; emit failed(item); -} - -void PreviewJob::saveThumbnail(const QByteArray &imgData) -{ - QFile file( d->thumbPath + d->currentItem.item->url().fileName() ); - if ( file.open(IO_WriteOnly) ) - { - file.writeBlock( imgData.data(), imgData.size() ); - file.close(); - } } QStringList PreviewJob::availablePlugins() Index: kio/previewjob.h =================================================================== RCS file: /home/kde/kdelibs/kio/kio/previewjob.h,v retrieving revision 1.9 diff -u -3 -d -p -r1.9 previewjob.h --- kio/previewjob.h 2001/12/14 12:18:35 1.9 +++ kio/previewjob.h 2002/02/11 15:31:04 @@ -87,9 +87,8 @@ namespace KIO { private: void determineNextFile(); - void emitPreview(const QPixmap &pix); + void emitPreview(const QImage &thumb); void emitFailed(const KFileItem *item = 0); - void saveThumbnail(const QByteArray &imgData); private: struct PreviewJobPrivate *d; --------------Boundary-00=_6KKDLIIC1SXZVB7R0JAW Content-Type: text/x-diff; charset="iso-8859-1"; name="libkonq.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="libkonq.diff" Index: konq_iconviewwidget.cc =================================================================== RCS file: /home/kde/kdebase/libkonq/konq_iconviewwidget.cc,v retrieving revision 1.183 diff -u -3 -d -p -r1.183 konq_iconviewwidget.cc --- konq_iconviewwidget.cc 2002/01/28 20:58:01 1.183 +++ konq_iconviewwidget.cc 2002/02/11 15:31:19 @@ -639,9 +639,11 @@ void KonqIconViewWidget::startImagePrevi if (iconSize < 28) size = 48; else if (iconSize < 40) - size = 60; + size = 64; + else if (iconSize < 60) + size = 96; else - size = 90; + size = 128; d->pPreviewJob = KIO::filePreview( items, size, size, iconSize, m_pSettings->textPreviewIconTransparency(), true /* scale */, --------------Boundary-00=_6KKDLIIC1SXZVB7R0JAW Content-Type: text/x-diff; charset="iso-8859-1"; name="qt-copy-src-kernel.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="qt-copy-src-kernel.diff" Index: qpngio.cpp =================================================================== RCS file: /home/kde/qt-copy/src/kernel/qpngio.cpp,v retrieving revision 1.38 diff -u -3 -d -p -r1.38 qpngio.cpp --- qpngio.cpp 2002/01/26 20:45:16 1.38 +++ qpngio.cpp 2002/02/11 15:31:43 @@ -311,6 +311,16 @@ png_get_valid(png_ptr, info_ptr, PNG_INF image.setDotsPerMeterX(png_get_x_pixels_per_meter(png_ptr,info_ptr)); image.setDotsPerMeterY(png_get_y_pixels_per_meter(png_ptr,info_ptr)); +#ifndef QT_NO_IMAGE_TEXT + png_textp text_ptr; + int num_text=0; + png_get_text(png_ptr,info_ptr,&text_ptr,&num_text); + while (num_text--) { + image.setText(text_ptr->key,0,text_ptr->text); + text_ptr++; + } +#endif + delete [] row_pointers; iio->setImage(image); --------------Boundary-00=_6KKDLIIC1SXZVB7R0JAW--