You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ksquirrel/ksquirrel/sq_pixmapcache.cpp

168 lines
3.7 KiB

/***************************************************************************
sq_pixmapcache.cpp - description
-------------------
begin : Sep 28 2004
copyright : (C) 2004 by Baryshev Dmitry
email : ksquirrel.iv@gmail.com
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "sq_pixmapcache.h"
#include "sq_thumbnailsize.h"
#include "sq_dirthumbs.h"
SQ_PixmapCache * SQ_PixmapCache::m_instance = 0;
SQ_PixmapCache::SQ_PixmapCache(TQObject *parent, int limit)
: TQObject(parent), TQMap<KURL, SQ_Thumbnail>()
{
m_instance = this;
cache_limit = limit << 10;
dir = new SQ_DirThumbs;
valid_full = false;
}
SQ_PixmapCache::~SQ_PixmapCache()
{
delete dir;
}
/*
* Write all entries to disk and clear cache.
*/
void SQ_PixmapCache::sync()
{
// nothing to sync
if(empty())
return;
iterator itEnd = end();
// go through array and sync each entry
for(iterator it = begin();it != itEnd;++it)
syncEntry(it.key(), it.data());
// remove all entries from cache
clear();
}
/*
* Write one entry to disk and remove it from cache.
*/
void SQ_PixmapCache::syncEntry(const KURL &key, SQ_Thumbnail &thumb)
{
// let SQ_DirThumbs save thumbnail
dir->saveThumbnail(key, thumb);
}
/*
* Insert new entry to cache
*/
void SQ_PixmapCache::insert(const KURL &key, const SQ_Thumbnail &thumb)
{
// thumbnail is null ?
if(thumb.thumbnail.isNull())
return;
// calc new cache size
last_full += entrySize(thumb);
// add new entry
TQMap<KURL, SQ_Thumbnail>::insert(key, thumb);
}
/*
* Remove entry from cache.
*/
void SQ_PixmapCache::removeEntry(const KURL &key)
{
iterator it = find(key);
// no item to remove ?
if(it == end())
return;
last_full -= entrySize(it.data());
TQMap<KURL, SQ_Thumbnail>::remove(key);
}
/*
* Remove entry from cache and from disk.
*/
void SQ_PixmapCache::removeEntryFull(const KURL &key)
{
// remove from memory
removeEntry(key);
// remove from disk
dir->removeFile(key);
}
/*
* Check if pixmap, represented by 'key', is already in cache.
*/
bool SQ_PixmapCache::contains2(const KURL &key, SQ_Thumbnail &th)
{
iterator it = find(key);
// item found
if(it != end())
{
th = it.data();
return true;
}
// not found
return false;
}
/*
* Calculate total size used by cache (not exact!)
*/
int SQ_PixmapCache::totalSize()
{
if(valid_full)
return last_full;
int total = 0;
iterator itEnd = end();
for(iterator it = begin();it != itEnd;++it)
{
total += entrySize(it.data());
}
last_full = total;
valid_full = true;
return total;
}
void SQ_PixmapCache::clear()
{
valid_full = false;
TQMap<KURL, SQ_Thumbnail>::clear();
}
int SQ_PixmapCache::entrySize(const SQ_Thumbnail &th) const
{
return th.thumbnail.width() * th.thumbnail.height() * 4;
}