// vim: set tabstop=4 shiftwidth=4 expandtab: /* Gwenview: an image viewer Copyright 2008 Aurélien Gâteau This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA. */ // Self #include "moc_preloader.cpp" // Qt // KDE #include // Local #include namespace Gwenview { struct PreloaderPrivate { Preloader* q; Document::Ptr mDocument; QSize mSize; void forgetDocument() { // Forget about the document. Keeping a reference to it would prevent it // from being garbage collected. QObject::disconnect(mDocument.data(), 0, q, 0); mDocument = 0; } }; Preloader::Preloader(QObject* parent) : QObject(parent) , d(new PreloaderPrivate) { d->q = this; } Preloader::~Preloader() { delete d; } void Preloader::preload(const KUrl& url, const QSize& size) { kDebug() << "url=" << url; if (d->mDocument) { disconnect(d->mDocument.data(), 0, this, 0); } d->mDocument = DocumentFactory::instance()->load(url); d->mSize = size; connect(d->mDocument.data(), SIGNAL(metaInfoUpdated()), SLOT(doPreload())); if (d->mDocument->size().isValid()) { kDebug() << "size is already available"; doPreload(); } } void Preloader::doPreload() { if (!d->mDocument) { return; } if (d->mDocument->loadingState() == Document::LoadingFailed) { kDebug() << "loading failed"; d->forgetDocument(); return; } if (!d->mDocument->size().isValid()) { kDebug() << "size not available yet"; return; } qreal zoom = qMin( d->mSize.width() / qreal(d->mDocument->width()), d->mSize.height() / qreal(d->mDocument->height()) ); if (zoom < Document::maxDownSampledZoom()) { kDebug() << "preloading down sampled, zoom=" << zoom; d->mDocument->prepareDownSampledImageForZoom(zoom); } else { kDebug() << "preloading full image"; d->mDocument->startLoadingFullImage(); } d->forgetDocument(); } } // namespace