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.
digikam/digikam/utilities/imageeditor/canvas/undocache.cpp

179 lines
3.7 KiB

/* ============================================================
*
* This file is a part of digiKam project
* http://www.digikam.org
*
* Date : 2005-02-05
* Description : undo cache manager for image editor
*
* Copyright (C) 2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
* Copyright (C) 2005 by Joern Ahrens <joern.ahrens@kdemail.net>
*
* 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, 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.
*
* ============================================================ */
// C Ansi includes.
extern "C"
{
#include <unistd.h>
}
// Qt includes.
#include <qcstring.h>
#include <qstring.h>
#include <qfile.h>
#include <qdatastream.h>
#include <qstringlist.h>
// KDE includes.
#include <kstandarddirs.h>
#include <kaboutdata.h>
#include <kinstance.h>
#include <kglobal.h>
// Local includes.
#include "ddebug.h"
#include "undocache.h"
namespace Digikam
{
class UndoCachePriv
{
public:
QString cachePrefix;
QStringList cacheFilenames;
};
UndoCache::UndoCache()
{
d = new UndoCachePriv;
QString cacheDir;
cacheDir = locateLocal("cache",
KGlobal::instance()->aboutData()->programName() + '/');
d->cachePrefix = QString("%1undocache-%2")
.arg(cacheDir)
.arg(getpid());
}
UndoCache::~UndoCache()
{
clear();
delete d;
}
/**
* delete all cache files
*/
void UndoCache::clear()
{
for (QStringList::iterator it = d->cacheFilenames.begin();
it != d->cacheFilenames.end(); ++it)
{
::unlink(QFile::encodeName(*it));
}
d->cacheFilenames.clear();
}
/**
* write the data into a cache file
*/
bool UndoCache::putData(int level, int w, int h, int bytesDepth, uchar* data)
{
QString cacheFile = QString("%1-%2.bin")
.arg(d->cachePrefix)
.arg(level);
QFile file(cacheFile);
if (file.exists() || !file.open(IO_WriteOnly))
return false;
QDataStream ds(&file);
ds << w;
ds << h;
ds << bytesDepth;
QByteArray ba(w*h*bytesDepth);
memcpy (ba.data(), data, w*h*bytesDepth);
ds << ba;
file.close();
d->cacheFilenames.append(cacheFile);
return true;
}
/**
* get the data from a cache file
*/
uchar* UndoCache::getData(int level, int& w, int& h, int& bytesDepth, bool del)
{
QString cacheFile = QString("%1-%2.bin")
.arg(d->cachePrefix)
.arg(level);
QFile file(cacheFile);
if (!file.open(IO_ReadOnly))
return 0;
QDataStream ds(&file);
ds >> w;
ds >> h;
ds >> bytesDepth;
uchar *data = new uchar[w*h*bytesDepth];
if (!data)
return 0;
QByteArray ba(w*h*bytesDepth);
ds >> ba;
memcpy (data, ba.data(), w*h*bytesDepth);
file.close();
if(del)
{
::unlink(QFile::encodeName(cacheFile));
d->cacheFilenames.remove(cacheFile);
}
return data;
}
/**
* delete a cache file
*/
void UndoCache::erase(int level)
{
QString cacheFile = QString("%1-%2.bin")
.arg(d->cachePrefix)
.arg(level);
if(d->cacheFilenames.find(cacheFile) == d->cacheFilenames.end())
return;
::unlink(QFile::encodeName(cacheFile));
}
} // namespace Digikam