/* * Copyright (c) 2005 Casper Boemann * * 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, Boston, MA 02110-1301, USA. */ #include "kis_global.h" #include "kis_memento.h" #include "kis_tile.h" #include "kis_tile_global.h" KisMemento::KisMemento(TQ_UINT32 pixelSize) : KShared() { m_hashTable = new KisTile * [1024]; TQ_CHECK_PTR(m_hashTable); m_redoHashTable = new KisTile * [1024]; TQ_CHECK_PTR(m_redoHashTable); for(int i = 0; i < 1024; i++) { m_hashTable [i] = 0; m_redoHashTable [i] = 0; } m_numTiles = 0; m_defPixel = new TQ_UINT8[pixelSize]; m_redoDefPixel = new TQ_UINT8[pixelSize]; m_valid = true; } KisMemento::~KisMemento() { // Deep delete every tile for(int i = 0; i < 1024; i++) { deleteAll(m_hashTable[i]); deleteAll(m_redoHashTable[i]); } delete [] m_hashTable; delete [] m_redoHashTable; // Delete defPixel arrays; delete [] m_defPixel; delete [] m_redoDefPixel; } KisMemento::DeletedTileList::~DeletedTileList() { clear(); } void KisMemento::DeletedTileList::clear() { // They are not tiles just references. The actual tiles have already been deleted, // so just delete the references. const DeletedTile *deletedTile = m_firstDeletedTile; while (deletedTile) { const DeletedTile *d = deletedTile; deletedTile = deletedTile->next(); delete d; } m_firstDeletedTile = 0; } void KisMemento::deleteAll(KisTile *tile) { while(tile) { KisTile *deltile = tile; tile = tile->getNext(); delete deltile; } } void KisMemento::extent(TQ_INT32 &x, TQ_INT32 &y, TQ_INT32 &w, TQ_INT32 &h) const { TQ_INT32 maxX = TQ_INT32_MIN; TQ_INT32 maxY = TQ_INT32_MIN; x = TQ_INT32_MAX; y = TQ_INT32_MAX; for(int i = 0; i < 1024; i++) { KisTile *tile = m_hashTable[i]; while(tile) { if(x > tile->getCol() * KisTile::WIDTH) x = tile->getCol() * KisTile::WIDTH; if(maxX < (tile->getCol() + 1) * KisTile::WIDTH - 1) maxX = (tile->getCol() + 1) * KisTile::WIDTH - 1; if(y > tile->getRow() * KisTile::HEIGHT) y = tile->getRow() * KisTile::HEIGHT; if(maxY < (tile->getRow() +1) * KisTile::HEIGHT - 1) maxY = (tile->getRow() +1) * KisTile::HEIGHT - 1; tile = tile->getNext(); } } if(maxX < x) w = 0; else w = maxX - x +1; if(maxY < y) h = 0; else h = maxY - y +1; } TQRect KisMemento::extent() const { TQ_INT32 x; TQ_INT32 y; TQ_INT32 w; TQ_INT32 h; extent(x, y, w, h); return TQRect(x, y, w, h); } bool KisMemento::containsTile(TQ_INT32 col, TQ_INT32 row, TQ_UINT32 tileHash) const { const KisTile *tile = m_hashTable[tileHash]; while (tile != 0) { if (tile->getRow() == row && tile->getCol() == col) { return true; } tile = tile->getNext(); } return false; }