📄 loader.cpp
字号:
// we have to delete our tiled bg variant here
// because the frame has changed (in order to keep it in sync)
delete bg;
bg = 0;
}
if((status == QMovie::EndOfMovie && (!m || m->frameNumber() <= 1)) ||
((status == QMovie::EndOfLoop) && (m_showAnimations == KHTMLSettings::KAnimationLoopOnce)) ||
((status == QMovie::EndOfFrame) && (m_showAnimations == KHTMLSettings::KAnimationDisabled))
)
{
if(imgSource)
{
setShowAnimations( KHTMLSettings::KAnimationDisabled );
// monochrome alphamasked images are usually about 10000 times
// faster to draw, so this is worth the hack
if (p && monochrome && p->depth() > 1 )
{
QPixmap* pix = new QPixmap;
pix->convertFromImage( p->convertToImage().convertDepth( 1 ), MonoOnly|AvoidDither );
if ( p->mask() )
pix->setMask( *p->mask() );
delete p;
p = pix;
monochrome = false;
}
}
CachedObjectClientWalker w(m_clients);
while (CachedObjectClient *c = w.next())
c->notifyFinished(this);
}
if((status == QMovie::EndOfFrame) || (status == QMovie::EndOfMovie))
{
#ifdef CACHE_DEBUG
QRect r(valid_rect());
qDebug("movie Status frame update %d/%d/%d/%d, pixmap size %d/%d", r.x(), r.y(), r.right(), r.bottom(),
pixmap().size().width(), pixmap().size().height());
#endif
do_notify(pixmap(), valid_rect());
}
}
void CachedImage::movieResize(const QSize& /*s*/)
{
// do_notify(m->framePixmap(), QRect());
}
#endif // APPLE_CHANGES
void CachedImage::setShowAnimations( KHTMLSettings::KAnimationAdvice showAnimations )
{
m_showAnimations = showAnimations;
#if !APPLE_CHANGES
if ( (m_showAnimations == KHTMLSettings::KAnimationDisabled) && imgSource ) {
imgSource->cleanBuffer();
delete p;
p = new QPixmap(m->framePixmap());
m->disconnectUpdate( this, SLOT( movieUpdated( const QRect &) ));
m->disconnectStatus( this, SLOT( movieStatus( int ) ));
m->disconnectResize( this, SLOT( movieResize( const QSize& ) ) );
QTimer::singleShot(0, this, SLOT( deleteMovie()));
imgSource = 0;
}
#endif
}
#if !APPLE_CHANGES
void CachedImage::deleteMovie()
{
delete m; m = 0;
}
#endif // APPLE_CHANGES
void CachedImage::clear()
{
delete m; m = 0;
delete p; p = 0;
delete bg; bg = 0;
#if !APPLE_CHANGES
bgColor = qRgba( 0, 0, 0, 0xff );
#endif
delete pixPart; pixPart = 0;
formatType = 0;
#if !APPLE_CHANGES
typeChecked = false;
#endif
setSize(0);
// No need to delete imageSource - QMovie does it for us
imgSource = 0;
#if APPLE_CHANGES
if (m_decoderCallback) {
m_decoderCallback->clear();
m_decoderCallback->deref();
m_decoderCallback = 0;
}
#endif
}
void CachedImage::data ( QBuffer &_buffer, bool eof )
{
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << this << "in CachedImage::data(buffersize " << _buffer.buffer().size() <<", eof=" << eof << endl;
#endif
#if !APPLE_CHANGES
if ( !typeChecked )
{
formatType = QImageDecoder::formatName( (const uchar*)_buffer.buffer().data(), _buffer.size());
typeChecked = true;
if ( formatType ) // movie format exists
{
imgSource = new ImageSource( _buffer.buffer());
m = new QMovie( imgSource, 8192 );
m->connectUpdate( this, SLOT( movieUpdated( const QRect &) ));
m->connectStatus( this, SLOT( movieStatus(int)));
m->connectResize( this, SLOT( movieResize( const QSize& ) ) );
}
}
if ( imgSource )
{
imgSource->setEOF(eof);
imgSource->maybeReady();
}
if(eof)
{
// QMovie currently doesn't support all kinds of image formats
// so we need to use a QPixmap here when we finished loading the complete
// picture and display it then all at once.
if(typeChecked && !formatType)
{
#ifdef CACHE_DEBUG
kdDebug(6060) << "CachedImage::data(): reloading as pixmap:" << endl;
#endif
p = new QPixmap( _buffer.buffer() );
// set size of image.
#ifdef CACHE_DEBUG
kdDebug(6060) << "CachedImage::data(): image is null: " << p->isNull() << endl;
#endif
if(p->isNull())
{
errorOccured = true;
do_notify(pixmap(), QRect(0, 0, 16, 16)); // load "broken image" icon
}
else
do_notify(*p, p->rect());
}
QSize s = pixmap_size();
setSize(s.width() * s.height() * 2);
}
#else // APPLE_CHANGES
bool canDraw = false;
m_dataSize = _buffer.size();
#if !NOKIA_CHANGES
// If we're at eof and don't have a pixmap yet, the data
// must have arrived in one chunk. This avoids the attempt
// to perform incremental decoding.
if (eof && !p) {
p = new QPixmap(_buffer.buffer(), KWQResponseMIMEType(m_response));
if (m_decoderCallback)
m_decoderCallback->notifyFinished();
canDraw = true;
} else
#endif
{
// Always attempt to load the image incrementally.
if (!p)
p = new QPixmap(KWQResponseMIMEType(m_response));
#if NOKIA_CHANGES
// the data might be fed by switching from image off to image on in
// user settings.
if( !m_decoderCallback ) {
m_decoderCallback = new CachedImageCallback(this);
}
#endif
canDraw = p->receivedData(_buffer.buffer(), eof, m_decoderCallback);
}
// If we have a decoder, we'll be notified when decoding has completed.
if (!m_decoderCallback) {
if (canDraw || eof) {
if (p->isNull()) {
errorOccured = true;
QPixmap ep = pixmap();
do_notify (ep, ep.rect());
Cache::removeCacheEntry (this);
}
else
do_notify(*p, p->rect());
QSize s = pixmap_size();
setSize(s.width() * s.height() * 2);
}
if (eof) {
m_loading = false;
checkNotify();
}
}
#endif // APPLE_CHANGES
}
void CachedImage::error( int /*err*/, const char */*text*/ )
{
#ifdef CACHE_DEBUG
kdDebug(6060) << "CahcedImage::error" << endl;
#endif
clear();
#if !APPLE_CHANGES
typeChecked = true;
#endif
errorOccured = true;
do_notify(pixmap(), QRect(0, 0, 16, 16));
#if APPLE_CHANGES
m_loading = false;
checkNotify();
#endif
}
void CachedImage::checkNotify()
{
if(m_loading) return;
CachedObjectClientWalker w(m_clients);
while (CachedObjectClient *c = w.next()) {
c->notifyFinished(this);
}
}
// -------------------------------------------------------------------------------------------
#ifdef KHTML_XSLT
CachedXSLStyleSheet::CachedXSLStyleSheet(DocLoader* dl, const DOMString &url, KIO::CacheControl _cachePolicy, time_t _expireDate)
: CachedObject(url, XSLStyleSheet, _cachePolicy, _expireDate)
{
// It's XML we want.
setAccept(QString::fromLatin1("text/xml, application/xml, application/xhtml+xml, text/xsl, application/rss+xml, application/atom+xml"));
// load the file
Cache::loader()->load(dl, this, false);
m_loading = true;
m_codec = QTextCodec::codecForName("iso8859-1");
}
void CachedXSLStyleSheet::ref(CachedObjectClient *c)
{
CachedObject::ref(c);
if (!m_loading)
c->setStyleSheet(m_url, m_sheet);
}
void CachedXSLStyleSheet::deref(CachedObjectClient *c)
{
Cache::flush();
CachedObject::deref(c);
if (canDelete() && m_free)
delete this;
}
void CachedXSLStyleSheet::data(QBuffer &buffer, bool eof)
{
if(!eof) return;
buffer.close();
setSize(buffer.buffer().size());
QString data = m_codec->toUnicode( buffer.buffer().data(), size() );
m_sheet = DOMString(data);
m_loading = false;
checkNotify();
}
void CachedXSLStyleSheet::checkNotify()
{
if (m_loading)
return;
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "CachedCSSStyleSheet:: finishedLoading " << m_url.string() << endl;
#endif
CachedObjectClientWalker w(m_clients);
while (CachedObjectClient *c = w.next())
c->setStyleSheet(m_url, m_sheet);
}
void CachedXSLStyleSheet::error( int /*err*/, const char */*text*/ )
{
m_loading = false;
checkNotify();
}
#endif
#ifndef KHTML_NO_XBL
CachedXBLDocument::CachedXBLDocument(DocLoader* dl, const DOMString &url, KIO::CacheControl _cachePolicy, time_t _expireDate)
: CachedObject(url, XBL, _cachePolicy, _expireDate), m_document(0)
{
// It's XML we want.
setAccept( QString::fromLatin1("text/xml, application/xml, application/xhtml+xml, text/xsl, application/rss+xml, application/atom+xml") );
// Load the file
Cache::loader()->load(dl, this, false);
m_loading = true;
m_codec = QTextCodec::codecForName("iso8859-1");
}
CachedXBLDocument::~CachedXBLDocument()
{
if (m_document)
m_document->deref();
}
void CachedXBLDocument::ref(CachedObjectClient *c)
{
CachedObject::ref(c);
if (!m_loading)
c->setXBLDocument(m_url, m_document);
}
void CachedXBLDocument::deref(CachedObjectClient *c)
{
Cache::flush();
CachedObject::deref(c);
if (canDelete() && m_free)
delete this;
}
void CachedXBLDocument::data( QBuffer &buffer, bool eof )
{
if (!eof) return;
assert(!m_document);
m_document = new XBL::XBLDocumentImpl();
m_document->ref();
m_document->open();
QString data = m_codec->toUnicode(buffer.buffer().data(), buffer.buffer().size());
m_document->write(data);
setSize(buffer.buffer().size());
buffer.close();
m_document->finishParsing();
m_document->close();
m_loading = false;
checkNotify();
}
void CachedXBLDocument::checkNotify()
{
if(m_loading) return;
#ifdef CACHE_DEBUG
kdDebug( 6060 ) << "CachedXBLDocument:: finishedLoading " << m_url.string() << endl;
#endif
CachedObjectClientWalker w(m_clients);
while (CachedObjectClient *c = w.next())
c->setXBLDocument(m_url, m_document);
}
void CachedXBLDocument::error( int /*err*/, const char */*text*/ )
{
m_loading = false;
checkNotify();
}
#endif
// ------------------------------------------------------------------------------------------
Request::Request(DocLoader* dl, CachedObject *_object, bool _incremental)
{
object = _object;
object->setRequest(this);
incremental = _incremental;
m_docLoader = dl;
}
Request::~Request()
{
object->setRequest(0);
}
// ------------------------------------------------------------------------------------------
DocLoader::DocLoader(KHTMLPart* part, DocumentImpl* doc)
{
m_cachePolicy = KIO::CC_Verify;
m_expireDate = 0;
m_bautoloadImages = true;
m_showAnimations = KHTMLSettings::KAnimationEnabled;
m_part = part;
m_doc = doc;
#if APPLE_CHANGES
Cache::init();
#endif
Cache::docloader->append( this );
}
DocLoader::~DocLoader()
{
Cache::docloader->remove( this );
}
void DocLoader::setExpireDate(time_t _expireDate)
{
m_expireDate = _expireDate;
}
bool DocLoader::needReload(const KURL &fullURL)
{
bool reload = false;
if (m_cachePolicy == KIO::CC_Verify)
{
if (!m_reloadedURLs.contains(fullURL.url()))
{
CachedObject *existing = Cache::cache->find(fullURL.url());
if (existing && existing->isExpired())
{
Cache::removeCacheEntry(existing);
m_reloadedURLs.append(fullURL.url());
reload = true;
}
}
}
else if ((m_cachePolicy == KIO::CC_Reload) || (m_cachePolicy == KIO::CC_Refresh))
{
if (!m_reloadedURLs.contains(fullURL.url()))
{
CachedObject *existing = Cache::cache->find(fullURL.url());
if (existing)
{
Cache::removeCacheEntry(existing);
}
m_reloadedURLs.append(fullURL.url());
reload = true;
}
}
return reload;
}
CachedImage *DocLoader::requestImage( const DOM::DOMString &url)
{
KURL fullURL = m_doc->completeURL( url.string() );
if ( m_part && m_part->onlyLocalReferences() && fullURL.protocol() != "file") return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -