257 lines
7 KiB
C++
257 lines
7 KiB
C++
|
|
||
|
|
||
|
#include "toonz/ttileset.h"
|
||
|
#include "tcodec.h"
|
||
|
#include "timagecache.h"
|
||
|
#include "ttoonzimage.h"
|
||
|
#include "trasterimage.h"
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSet::Tile::Tile()
|
||
|
: m_rasterBounds(TRect()), m_dim(), m_pixelSize(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSet::Tile::Tile(const TRasterP &ras, const TPoint &p)
|
||
|
: m_rasterBounds(ras->getBounds() + p), m_dim(ras->getSize()), m_pixelSize(ras->getPixelSize())
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSet::Tile::~Tile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSet::~TTileSet()
|
||
|
{
|
||
|
clearPointerContainer(m_tiles);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
void TTileSet::add(Tile *tile)
|
||
|
{
|
||
|
m_tiles.push_back(tile);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
void TTileSet::getRects(vector<TRect> &rects) const
|
||
|
{
|
||
|
for (Tiles::const_iterator it = m_tiles.begin(); it != m_tiles.end(); ++it)
|
||
|
rects.push_back((*it)->m_rasterBounds);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TRect TTileSet::getBBox() const
|
||
|
{
|
||
|
if (m_tiles.empty()) {
|
||
|
return TRect();
|
||
|
}
|
||
|
Tiles::const_iterator it = m_tiles.begin();
|
||
|
TRect bbox = (*it)->m_rasterBounds;
|
||
|
for (; it != m_tiles.end(); ++it)
|
||
|
bbox += (*it)->m_rasterBounds;
|
||
|
return bbox;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
int TTileSet::getMemorySize() const
|
||
|
{
|
||
|
int i, size = 0;
|
||
|
for (i = 0; i < m_tiles.size(); i++) {
|
||
|
size += m_tiles[i]->getSize();
|
||
|
}
|
||
|
return size;
|
||
|
}
|
||
|
|
||
|
//******************************************************************************************
|
||
|
|
||
|
TTileSetCM32::Tile::Tile()
|
||
|
: TTileSet::Tile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetCM32::Tile::Tile(const TRasterCM32P &ras, const TPoint &p)
|
||
|
: TTileSet::Tile(TRasterP(ras), p)
|
||
|
{
|
||
|
TImageCache::instance()->add(id(), TToonzImageP(ras, ras->getBounds()));
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetCM32::Tile::~Tile()
|
||
|
{
|
||
|
TImageCache::instance()->remove(id());
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetCM32::~TTileSetCM32()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
void TTileSetCM32::Tile::getRaster(TRasterCM32P &ras) const
|
||
|
{
|
||
|
TToonzImageP timg = (TToonzImageP)TImageCache::instance()->get(id(), true);
|
||
|
if (!timg)
|
||
|
return;
|
||
|
ras = timg->getRaster();
|
||
|
assert(ras);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetCM32::Tile *TTileSetCM32::Tile::clone() const
|
||
|
{
|
||
|
Tile *tile = new Tile();
|
||
|
tile->m_rasterBounds = m_rasterBounds;
|
||
|
TToonzImageP timg = (TToonzImageP)TImageCache::instance()->get(id(), true);
|
||
|
if (!timg)
|
||
|
return tile;
|
||
|
TImageCache::instance()->add(tile->id(), timg->clone());
|
||
|
return tile;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
void TTileSetCM32::add(const TRasterP &ras, TRect rect)
|
||
|
{
|
||
|
TRect bounds = ras->getBounds();
|
||
|
if (!bounds.overlaps(rect))
|
||
|
return;
|
||
|
rect *= bounds;
|
||
|
assert(!rect.isEmpty());
|
||
|
assert(bounds.contains(rect));
|
||
|
TTileSet::add(new Tile(ras->extract(rect)->clone(), rect.getP00()));
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
const TTileSetCM32::Tile *TTileSetCM32::getTile(int index) const
|
||
|
{
|
||
|
assert(0 <= index && index < getTileCount());
|
||
|
TTileSetCM32::Tile *tile = dynamic_cast<TTileSetCM32::Tile *>(m_tiles[index]);
|
||
|
assert(tile);
|
||
|
return tile;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetCM32::Tile *TTileSetCM32::editTile(int index) const
|
||
|
{
|
||
|
assert(0 <= index && index < getTileCount());
|
||
|
TTileSetCM32::Tile *tile = dynamic_cast<TTileSetCM32::Tile *>(m_tiles[index]);
|
||
|
assert(tile);
|
||
|
return tile;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetCM32 *TTileSetCM32::clone() const
|
||
|
{
|
||
|
TTileSetCM32 *tileSet = new TTileSetCM32(m_srcImageSize);
|
||
|
Tiles::const_iterator it = m_tiles.begin();
|
||
|
for (; it != m_tiles.end(); ++it)
|
||
|
tileSet->m_tiles.push_back((*it)->clone());
|
||
|
return tileSet;
|
||
|
}
|
||
|
|
||
|
//******************************************************************************************
|
||
|
|
||
|
TTileSetFullColor::Tile::Tile()
|
||
|
: TTileSet::Tile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetFullColor::Tile::Tile(const TRasterP &ras, const TPoint &p)
|
||
|
: TTileSet::Tile(ras, p)
|
||
|
{
|
||
|
TImageCache::instance()->add(id(), TRasterImageP(ras));
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetFullColor::Tile::~Tile()
|
||
|
{
|
||
|
TImageCache::instance()->remove(id());
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetFullColor::~TTileSetFullColor()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
void TTileSetFullColor::Tile::getRaster(TRasterP &ras) const
|
||
|
{
|
||
|
TRasterImageP img = (TRasterImageP)TImageCache::instance()->get(id(), true);
|
||
|
if (!img)
|
||
|
return;
|
||
|
ras = img->getRaster();
|
||
|
assert(!!ras);
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetFullColor::Tile *TTileSetFullColor::Tile::clone() const
|
||
|
{
|
||
|
Tile *tile = new Tile();
|
||
|
tile->m_rasterBounds = m_rasterBounds;
|
||
|
TRasterImageP img = (TRasterImageP)TImageCache::instance()->get(id(), true);
|
||
|
if (!img)
|
||
|
return tile;
|
||
|
TRasterImageP clonedImage(img->getRaster()->clone());
|
||
|
TImageCache::instance()->add(tile->id(), clonedImage);
|
||
|
return tile;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
void TTileSetFullColor::add(const TRasterP &ras, TRect rect)
|
||
|
{
|
||
|
TRect bounds = ras->getBounds();
|
||
|
if (!bounds.overlaps(rect))
|
||
|
return;
|
||
|
rect *= bounds;
|
||
|
assert(!rect.isEmpty());
|
||
|
assert(bounds.contains(rect));
|
||
|
TTileSet::add(new Tile(ras->extract(rect)->clone(), rect.getP00()));
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
const TTileSetFullColor::Tile *TTileSetFullColor::getTile(int index) const
|
||
|
{
|
||
|
assert(0 <= index && index < getTileCount());
|
||
|
TTileSetFullColor::Tile *tile = dynamic_cast<TTileSetFullColor::Tile *>(m_tiles[index]);
|
||
|
assert(tile);
|
||
|
return tile;
|
||
|
}
|
||
|
|
||
|
//------------------------------------------------------------------------------------------
|
||
|
|
||
|
TTileSetFullColor *TTileSetFullColor::clone() const
|
||
|
{
|
||
|
TTileSetFullColor *tileSet = new TTileSetFullColor(m_srcImageSize);
|
||
|
Tiles::const_iterator it = m_tiles.begin();
|
||
|
for (; it != m_tiles.end(); ++it)
|
||
|
tileSet->m_tiles.push_back((*it)->clone());
|
||
|
return tileSet;
|
||
|
}
|