Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TLEVEL_IO_INCLUDED
Toshihiro Shimizu 890ddd
#define TLEVEL_IO_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tlevel.h"
Toshihiro Shimizu 890ddd
#include "timage_io.h"
Toshihiro Shimizu 890ddd
#include "tproperty.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#pragma warning(disable : 4290)
Toshihiro Shimizu 890ddd
#pragma warning(disable : 4251)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <typeinfo></typeinfo>
Toshihiro Shimizu 890ddd
namespace std
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
using ::type_info;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TIMAGE_IO_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================================================
Toshihiro Shimizu 890ddd
// forward declaration
Toshihiro Shimizu 890ddd
class TSoundTrack;
Toshihiro Shimizu 890ddd
class TImageInfo;
Toshihiro Shimizu 890ddd
class TContentHistory;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TLevelReader;
Toshihiro Shimizu 890ddd
typedef TLevelReader *TLevelReaderCreateProc(const TFilePath &path);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TLevelReader : public TSmartObject
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DECLARE_CLASS_CODE
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	TImageInfo *m_info;
Toshihiro Shimizu 890ddd
	TFilePath m_path;
Toshihiro Shimizu 890ddd
	TContentHistory *m_contentHistory;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TLevelReader(const TFilePath &path);
Toshihiro Shimizu 890ddd
	virtual ~TLevelReader();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TLevelReader(const TLevelReader &);
Toshihiro Shimizu 890ddd
	TLevelReader &operator=(const TLevelReader &src);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	virtual TLevelP loadInfo();
Toshihiro Shimizu 890ddd
	virtual QString getCreator() { return ""; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void doReadPalette(bool) {}
Toshihiro Shimizu 890ddd
	virtual void enableRandomAccessRead(bool) {}
Toshihiro Shimizu 890ddd
	virtual TImageReaderP getFrameReader(TFrameId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// TLevelReader keeps ownership: DO NOT DELETE
Toshihiro Shimizu 890ddd
	virtual const TImageInfo *getImageInfo(TFrameId);
Toshihiro Shimizu 890ddd
	virtual const TImageInfo *getImageInfo();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TImageReaderP getFrameReader(int f)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getFrameReader(TFrameId(f));
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual TSoundTrack *loadSoundTrack();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath getFilePath() const { return m_path; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static void getSupportedFormats(QStringList &names);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	enum FormatType {
Toshihiro Shimizu 890ddd
		UnsupportedFormat,
Toshihiro Shimizu 890ddd
		RasterLevel,
Toshihiro Shimizu 890ddd
		VectorLevel
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static FormatType getFormatType(string extension);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static void define(
Toshihiro Shimizu 890ddd
		QString extension,
Toshihiro Shimizu 890ddd
		int reader,
Toshihiro Shimizu 890ddd
		// nel caso in cui ci siano piu' lettori per lo stesso formato
Toshihiro Shimizu 890ddd
		// (es. flash)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TLevelReaderCreateProc *proc);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static inline void define(
Toshihiro Shimizu 890ddd
		QString extension,
Toshihiro Shimizu 890ddd
		TLevelReaderCreateProc *proc) { define(extension, 0, proc); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! TLevelReader keeps the ownership of TContentHistory. Don't delete it
Toshihiro Shimizu 890ddd
	const TContentHistory *getContentHistory() const { return m_contentHistory; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	TFrameId::FrameFormat m_frameFormat;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TSmartPointerT<tlevelreader>;</tlevelreader>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TLevelReaderP : public TSmartPointerT<tlevelreader></tlevelreader>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// il costruttore "non banale"
Toshihiro Shimizu 890ddd
	TLevelReaderP(const TFilePath &filepath, int reader = 0);
Toshihiro Shimizu 890ddd
	// il costruttore di default
Toshihiro Shimizu 890ddd
	TLevelReaderP() {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===========================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TLevelWriter;
Toshihiro Shimizu 890ddd
class TPropertyGroup;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TLevelWriter *TLevelWriterCreateProc(const TFilePath &path, TPropertyGroup *);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TPropertyGroup *TWriterInfoCreateProc(const string &ext);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TLevelWriter : public TSmartObject
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DECLARE_CLASS_CODE
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	TFilePath m_path;
Toshihiro Shimizu 890ddd
	double m_frameRate;
Toshihiro Shimizu 890ddd
	TPropertyGroup *m_properties;
Toshihiro Shimizu 890ddd
	TContentHistory *m_contentHistory;
Toshihiro Shimizu 890ddd
	QString m_creator;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TLevelWriter(const TFilePath &path, TPropertyGroup *winfo = 0); //ottiene l'ownership
Toshihiro Shimizu 890ddd
	virtual ~TLevelWriter();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setCreator(const QString &creator) { m_creator = creator; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void setPalette(TPalette *){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void setOverwritePaletteFlag(bool overwrite){};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Maps a list of existing level frames to a new list of frames.
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
    This function allows an existing level to reorganize (or discard)
Toshihiro Shimizu 890ddd
    its \a disk content. It is typically implemented by TLevelWriters
Toshihiro Shimizu 890ddd
    that support  random access writing <\I>, which can therefore
Toshihiro Shimizu 890ddd
    write new frames on top of an existing level.
Toshihiro Shimizu 890ddd
    \n\n
Toshihiro Shimizu 890ddd
    This function requires that frames present on disk \a and in the
Toshihiro Shimizu 890ddd
    table be remapped, while frames on disk \a not in the table be
Toshihiro Shimizu 890ddd
    \b deleted. Eventual frames present in the table but not on disk
Toshihiro Shimizu 890ddd
    are ignored.
Toshihiro Shimizu 890ddd
    \n\n
Toshihiro Shimizu 890ddd
    The default implementation provides renumbering for standard
Toshihiro Shimizu 890ddd
    Toonz multi-file level types (levelName.####c.ext), and does nothing
Toshihiro Shimizu 890ddd
    if the specified path is not compatible with the multi-file format.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	virtual void renumberFids(const std::map<tframeid, tframeid=""> &table);</tframeid,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Usate per le TLV
Toshihiro Shimizu 890ddd
	// Introdotte per le TLV (versione 13) che salvano l'iconcina
Toshihiro Shimizu 890ddd
	// nel file stesso.
Toshihiro Shimizu 890ddd
	virtual void setIconSize(TDimension){};
Toshihiro Shimizu 890ddd
	virtual TDimension getIconSize() const { return TDimension(); };
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TLevelWriter(const TLevelWriter &);
Toshihiro Shimizu 890ddd
	TLevelWriter &operator=(const TLevelWriter &src);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	virtual TImageWriterP getFrameWriter(TFrameId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TImageWriterP getFrameWriter(int f)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getFrameWriter(TFrameId(f));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPropertyGroup *getProperties() { return m_properties; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void save(const TLevelP &level);
Toshihiro Shimizu 890ddd
	virtual void saveSoundTrack(TSoundTrack *st);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void setFrameRate(double fps);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath getFilePath() const { return m_path; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static void getSupportedFormats(QStringList &names, bool onlyRenderFormats);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// note gets the contentHistory. can be 0
Toshihiro Shimizu 890ddd
	const TContentHistory *getContentHistory() const { return m_contentHistory; }
Toshihiro Shimizu 890ddd
	TContentHistory *getContentHistory() { return m_contentHistory; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// destroys the old contentHistory and replaces it with the new one. Gets ownership
Toshihiro Shimizu 890ddd
	// note. set the content history first
Toshihiro Shimizu 890ddd
	void setContentHistory(TContentHistory *contentHistory);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	static void define(
Toshihiro Shimizu 890ddd
		QString extension,
Toshihiro Shimizu 890ddd
		TLevelWriterCreateProc *proc, bool isRenderFormat);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TSmartPointerT<tlevelwriter>;</tlevelwriter>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TLevelWriterP : public TSmartPointerT<tlevelwriter></tlevelwriter>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// il costruttore "non banale"
Toshihiro Shimizu 890ddd
	TLevelWriterP(const TFilePath &filepath, TPropertyGroup *winfo = 0); //non si prende l'ownership del TPropertyGroup
Toshihiro Shimizu 890ddd
	// il costruttore di default
Toshihiro Shimizu 890ddd
	TLevelWriterP() {}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  Some useful utility inlines
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool isMovieType(string type)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (type == "mov" || type == "avi" || type == "3gp");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool isMovieType(const TFilePath &fp)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	string type(fp.getType());
Toshihiro Shimizu 890ddd
	return isMovieType(type);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool doesSupportRandomAccess(const TFilePath &fp, bool isToonzOutput = false)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (fp.getDots() == "..") || (isToonzOutput && fp.getType() == "mov");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif