void Task::updateThumbnail() { if ( !isOnCurrentDesktop() ) return; if ( !isActive() ) return; if ( !_grab.isNull() ) // We're already processing one... return; // // We do this as a two stage process to remove the delay caused // by the thumbnail generation. This makes things much smoother // on slower machines. // QWidget *rootWin = qApp->desktop(); #ifdef KDE_3_2 QRect geom = _info.geometry(); #else QRect geom = _info.geometry; #endif _grab = QPixmap::grabWindow( rootWin->winId(), geom.x(), geom.y(), geom.width(), geom.height() ); if ( !_grab.isNull() ) QTimer::singleShot( 200, this, SLOT( generateThumbnail() ) ); }
QImage NemoThumbnailProvider::requestImage(const QString &id, QSize *size, const QSize &requestedSize) { setupCache(); // needed for stupid things like gallery model, which pass us a url if (id.startsWith("file://")) { // qWarning() << Q_FUNC_INFO << "Removing file:// prefix, before: " << id; QString &nid = const_cast<QString &>(id); nid = nid.remove(0, 7); } TDEBUG() << Q_FUNC_INFO << "Requested image: " << id << " with size " << requestedSize; // sourceSize should indicate what size thumbnail you want. i.e. if you want a 120x120px thumbnail, // set sourceSize: Qt.size(120, 120). if (!requestedSize.isValid()) qFatal("You must request a sourceSize whenever you use nemoThumbnail"); if (size) *size = requestedSize; QByteArray hashData = cacheKey(id, requestedSize); QImage img = attemptCachedServe(id, hashData); if (!img.isNull()) { TDEBUG() << Q_FUNC_INFO << "Read " << id << " from cache"; return img; } return generateThumbnail(id, hashData, requestedSize); }
int main(int argc, char* argv[]) { TIFF* in; TIFF* out; int c; while ((c = getopt(argc, argv, "w:h:c:")) != -1) { switch (c) { case 'w': tnw = strtoul(optarg, NULL, 0); break; case 'h': tnh = strtoul(optarg, NULL, 0); break; case 'c': contrast = streq(optarg, "exp50") ? EXP50 : streq(optarg, "exp60") ? EXP60 : streq(optarg, "exp70") ? EXP70 : streq(optarg, "exp80") ? EXP80 : streq(optarg, "exp90") ? EXP90 : streq(optarg, "exp") ? EXP : streq(optarg, "linear")? LINEAR : EXP; break; default: usage(); } } if (argc-optind != 2) usage(); out = TIFFOpen(argv[optind+1], "w"); if (out == NULL) return 2; in = TIFFOpen(argv[optind], "r"); if( in == NULL ) return 2; thumbnail = (uint8*) _TIFFmalloc(tnw * tnh); if (!thumbnail) { TIFFError(TIFFFileName(in), "Can't allocate space for thumbnail buffer."); return 1; } if (in != NULL) { initScale(); do { if (!generateThumbnail(in, out)) goto bad; if (!cpIFD(in, out) || !TIFFWriteDirectory(out)) goto bad; } while (TIFFReadDirectory(in)); (void) TIFFClose(in); } (void) TIFFClose(out); return 0; bad: (void) TIFFClose(out); return 1; }
// ## See if DELETE+INSERT is the best approach. Sqlite3 supports INSERT OR IGNORE which could aslo be used // ## Also check other upsert methods QList<QSqlRecord> VideoParser::updateMediaInfos(const QList<QFileInfo> &fis, const QString &searchPath, QSqlDatabase db) { Q_UNUSED(searchPath); QList<QSqlRecord> records; QSqlQuery query(db); ScopedTransaction transaction(db); foreach(const QFileInfo &fi, fis) { DEBUG << "Updating " << fi.absoluteFilePath(); query.prepare("DELETE FROM video WHERE filepath=:filepath"); query.bindValue(":filepath", fi.absoluteFilePath()); if (!query.exec()) qWarning() << query.lastError().text(); if (!query.prepare("INSERT INTO video (filepath, title, thumbnail, uri, directory, mtime, ctime, filesize, show, season) " " VALUES (:filepath, :title, :thumbnail, :uri, :directory, :mtime, :ctime, :filesize, :show, :season)")) { qWarning() << query.lastError().text(); return records; } query.bindValue(":filepath", fi.absoluteFilePath()); query.bindValue(":title", determineTitle(fi)); query.bindValue(":thumbnail", generateThumbnail(m_settings, fi)); query.bindValue(":uri", QUrl::fromLocalFile(fi.absoluteFilePath()).toEncoded()); query.bindValue(":directory", fi.absolutePath() + '/'); query.bindValue(":mtime", fi.lastModified().toTime_t()); query.bindValue(":ctime", fi.created().toTime_t()); query.bindValue(":filesize", fi.size()); QPair<QString, QString> showAndSeason = determineShowAndSeason(fi, searchPath); query.bindValue(":show", showAndSeason.first); query.bindValue(":season", showAndSeason.second); if (!query.exec()) qWarning() << query.lastError().text(); QSqlRecord record; record.append(QSqlField("id", QVariant::Int)); record.setValue(0, query.lastInsertId()); QMap<QString, QVariant> boundValues = query.boundValues(); for (QMap<QString, QVariant>::const_iterator it = boundValues.constBegin(); it != boundValues.constEnd(); ++it) { QString key = it.key().mid(1); // remove the ':' record.append(QSqlField(key, (QVariant::Type) it.value().type())); record.setValue(key, it.value()); } records.append(record); }
Common::Error BladeRunnerEngine::saveGameState(int slot, const Common::String &desc) { Common::OutSaveFile *saveFile = BladeRunner::SaveFileManager::openForSaving(_targetName, slot); if (saveFile == nullptr || saveFile->err()) { delete saveFile; return Common::kReadingFailed; } Graphics::Surface thumbnail = generateThumbnail(); BladeRunner::SaveFileHeader header; header._name = desc; BladeRunner::SaveFileManager::writeHeader(*saveFile, header); saveGame(*saveFile, thumbnail); saveFile->finalize(); thumbnail.free(); delete saveFile; return Common::kNoError; }
void VideoThumbnailer::generateThumbnail(const QString& videoFile, QImage &image) { ImageWriter* imageWriter = new ImageWriter(); generateThumbnail(videoFile, *imageWriter, image); delete imageWriter; }