|
Shinya Kitaoka |
810553 |
#pragma once
|
|
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 |
|
|
|
e280ae |
#ifdef _MSC_VER
|
|
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>
|
|
Shinya Kitaoka |
120a6e |
namespace std {
|
|
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 |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TLevelReader : public TSmartObject {
|
|
Shinya Kitaoka |
120a6e |
DECLARE_CLASS_CODE
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
TImageInfo *m_info;
|
|
Shinya Kitaoka |
120a6e |
TFilePath m_path;
|
|
Shinya Kitaoka |
120a6e |
TContentHistory *m_contentHistory;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TLevelReader(const TFilePath &path);
|
|
Shinya Kitaoka |
120a6e |
virtual ~TLevelReader();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
// not implemented
|
|
Shinya Kitaoka |
120a6e |
TLevelReader(const TLevelReader &);
|
|
Shinya Kitaoka |
120a6e |
TLevelReader &operator=(const TLevelReader &src);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
virtual TLevelP loadInfo();
|
|
Shinya Kitaoka |
120a6e |
virtual QString getCreator() { return ""; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
virtual void doReadPalette(bool) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void enableRandomAccessRead(bool) {}
|
|
Shinya Kitaoka |
120a6e |
virtual TImageReaderP getFrameReader(TFrameId);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// TLevelReader keeps ownership: DO NOT DELETE
|
|
Shinya Kitaoka |
120a6e |
virtual const TImageInfo *getImageInfo(TFrameId);
|
|
Shinya Kitaoka |
120a6e |
virtual const TImageInfo *getImageInfo();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TImageReaderP getFrameReader(int f) { return getFrameReader(TFrameId(f)); };
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
virtual TSoundTrack *loadSoundTrack();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFilePath getFilePath() const { return m_path; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static void getSupportedFormats(QStringList &names);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
enum FormatType { UnsupportedFormat, RasterLevel, VectorLevel };
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static FormatType getFormatType(std::string extension);
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
fc0d80 |
static void define(QString extension, int reader,
|
|
shun-iwasawa |
fc0d80 |
// nel caso in cui ci siano piu' lettori per lo stesso
|
|
shun-iwasawa |
fc0d80 |
// formato (es. flash)
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
fc0d80 |
TLevelReaderCreateProc *proc);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static inline void define(QString extension, TLevelReaderCreateProc *proc) {
|
|
Shinya Kitaoka |
120a6e |
define(extension, 0, proc);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! TLevelReader keeps the ownership of TContentHistory. Don't delete it
|
|
Shinya Kitaoka |
120a6e |
const TContentHistory *getContentHistory() const { return m_contentHistory; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
TFrameId::FrameFormat m_frameFormat;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
template class DVAPI TSmartPointerT<tlevelreader>;</tlevelreader>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DVAPI TLevelReaderP final : public TSmartPointerT<tlevelreader> {</tlevelreader>
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
// il costruttore "non banale"
|
|
Shinya Kitaoka |
120a6e |
TLevelReaderP(const TFilePath &filepath, int reader = 0);
|
|
Shinya Kitaoka |
120a6e |
// il costruttore di default
|
|
Shinya Kitaoka |
120a6e |
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 |
|
|
Shinya Kitaoka |
120a6e |
typedef TLevelWriter *TLevelWriterCreateProc(const TFilePath &path,
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup *);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
3bfa54 |
typedef TPropertyGroup *TWriterInfoCreateProc(const std::string &ext);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TLevelWriter : public TSmartObject {
|
|
Shinya Kitaoka |
120a6e |
DECLARE_CLASS_CODE
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
TFilePath m_path;
|
|
Shinya Kitaoka |
120a6e |
double m_frameRate;
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup *m_properties;
|
|
Shinya Kitaoka |
120a6e |
TContentHistory *m_contentHistory;
|
|
Shinya Kitaoka |
120a6e |
QString m_creator;
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
fc0d80 |
// if template is not used, frame number is set to TFrameId::NO_FRAME
|
|
shun-iwasawa |
fc0d80 |
TFrameId m_frameFormatTemplateFId;
|
|
shun-iwasawa |
fc0d80 |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TLevelWriter(const TFilePath &path,
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup *winfo = 0); // ottiene l'ownership
|
|
Shinya Kitaoka |
120a6e |
virtual ~TLevelWriter();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void setCreator(const QString &creator) { m_creator = creator; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual void setPalette(TPalette *){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual void setOverwritePaletteFlag(bool overwrite){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Maps a list of existing level frames to a new list of frames.
|
|
Shinya Kitaoka |
120a6e |
/*!
|
|
Shinya Kitaoka |
120a6e |
This function allows an existing level to reorganize (or discard)
|
|
Shinya Kitaoka |
120a6e |
its \a disk content. It is typically implemented by TLevelWriters
|
|
Shinya Kitaoka |
120a6e |
that support random access writing <\I>, which can therefore
|
|
Shinya Kitaoka |
120a6e |
write new frames on top of an existing level.
|
|
Shinya Kitaoka |
120a6e |
\n\n
|
|
Shinya Kitaoka |
120a6e |
This function requires that frames present on disk \a and in the
|
|
Shinya Kitaoka |
120a6e |
table be remapped, while frames on disk \a not in the table be
|
|
Shinya Kitaoka |
120a6e |
\b deleted. Eventual frames present in the table but not on disk
|
|
Shinya Kitaoka |
120a6e |
are ignored.
|
|
Shinya Kitaoka |
120a6e |
\n\n
|
|
Shinya Kitaoka |
120a6e |
The default implementation provides renumbering for standard
|
|
Shinya Kitaoka |
120a6e |
Toonz multi-file level types (levelName.####c.ext), and does nothing
|
|
Shinya Kitaoka |
120a6e |
if the specified path is not compatible with the multi-file format.
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
virtual void renumberFids(const std::map<tframeid, tframeid=""> &table);</tframeid,>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Usate per le TLV
|
|
Shinya Kitaoka |
120a6e |
// Introdotte per le TLV (versione 13) che salvano l'iconcina
|
|
Shinya Kitaoka |
120a6e |
// nel file stesso.
|
|
Shinya Kitaoka |
120a6e |
virtual void setIconSize(TDimension){};
|
|
Shinya Kitaoka |
120a6e |
virtual TDimension getIconSize() const { return TDimension(); };
|
|
Shinya Kitaoka |
120a6e |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
// not implemented
|
|
Shinya Kitaoka |
120a6e |
TLevelWriter(const TLevelWriter &);
|
|
Shinya Kitaoka |
120a6e |
TLevelWriter &operator=(const TLevelWriter &src);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
virtual TImageWriterP getFrameWriter(TFrameId);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TImageWriterP getFrameWriter(int f) { return getFrameWriter(TFrameId(f)); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup *getProperties() { return m_properties; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void save(const TLevelP &level);
|
|
Shinya Kitaoka |
120a6e |
virtual void saveSoundTrack(TSoundTrack *st);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
virtual void setFrameRate(double fps);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TFilePath getFilePath() const { return m_path; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static void getSupportedFormats(QStringList &names, bool onlyRenderFormats);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// note gets the contentHistory. can be 0
|
|
Shinya Kitaoka |
120a6e |
const TContentHistory *getContentHistory() const { return m_contentHistory; }
|
|
Shinya Kitaoka |
120a6e |
TContentHistory *getContentHistory() { return m_contentHistory; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// destroys the old contentHistory and replaces it with the new one. Gets
|
|
Shinya Kitaoka |
120a6e |
// ownership
|
|
Shinya Kitaoka |
120a6e |
// note. set the content history first
|
|
Shinya Kitaoka |
120a6e |
void setContentHistory(TContentHistory *contentHistory);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static void define(QString extension, TLevelWriterCreateProc *proc,
|
|
Shinya Kitaoka |
120a6e |
bool isRenderFormat);
|
|
shun-iwasawa |
fc0d80 |
|
|
shun-iwasawa |
fc0d80 |
void setFrameFormatTemplateFId(const TFrameId &tmplFId) {
|
|
shun-iwasawa |
fc0d80 |
m_frameFormatTemplateFId = tmplFId;
|
|
shun-iwasawa |
fc0d80 |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
template class DVAPI TSmartPointerT<tlevelwriter>;</tlevelwriter>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DVAPI TLevelWriterP final : public TSmartPointerT<tlevelwriter> {</tlevelwriter>
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
// il costruttore "non banale"
|
|
Shinya Kitaoka |
120a6e |
TLevelWriterP(const TFilePath &filepath,
|
|
Shinya Kitaoka |
120a6e |
TPropertyGroup *winfo =
|
|
Shinya Kitaoka |
120a6e |
0); // non si prende l'ownership del TPropertyGroup
|
|
Shinya Kitaoka |
120a6e |
// il costruttore di default
|
|
Shinya Kitaoka |
120a6e |
TLevelWriterP() {}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Some useful utility inlines
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
inline bool isMovieType(std::string type) {
|
|
turtletooth |
04d8fd |
return (type == "mov" || type == "avi" || type == "3gp" || type == "webm" ||
|
|
justburner |
64e039 |
type == "mp4" || type == "apng");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
inline bool isMovieType(const TFilePath &fp) {
|
|
Shinya Kitaoka |
120a6e |
std::string type(fp.getType());
|
|
Shinya Kitaoka |
120a6e |
return isMovieType(type);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
justburner |
b375f4 |
inline bool isMovieTypeOpaque(std::string type) {
|
|
justburner |
b375f4 |
return (type == "avi" || type == "3gp" || type == "mp4");
|
|
justburner |
b375f4 |
}
|
|
justburner |
b375f4 |
|
|
justburner |
b375f4 |
//-----------------------------------------------------------
|
|
justburner |
b375f4 |
|
|
justburner |
b375f4 |
inline bool isMovieTypeOpaque(const TFilePath &fp) {
|
|
justburner |
b375f4 |
std::string type(fp.getType());
|
|
justburner |
b375f4 |
return isMovieTypeOpaque(type);
|
|
justburner |
b375f4 |
}
|
|
justburner |
b375f4 |
|
|
justburner |
b375f4 |
//-----------------------------------------------------------
|
|
justburner |
b375f4 |
|
|
justburner |
69bbaf |
inline bool isSequencialRequired(std::string type) {
|
|
justburner |
69bbaf |
return (type == "mov" || type == "avi" || type == "3gp");
|
|
justburner |
69bbaf |
}
|
|
justburner |
69bbaf |
|
|
justburner |
69bbaf |
//-----------------------------------------------------------
|
|
justburner |
69bbaf |
|
|
justburner |
69bbaf |
inline bool isSequencialRequired(const TFilePath &fp) {
|
|
justburner |
69bbaf |
std::string type(fp.getType());
|
|
justburner |
69bbaf |
return isSequencialRequired(type);
|
|
justburner |
69bbaf |
}
|
|
justburner |
69bbaf |
|
|
justburner |
69bbaf |
//-----------------------------------------------------------
|
|
justburner |
69bbaf |
|
|
justburner |
b375f4 |
inline bool isMultipleFrameType(std::string type) {
|
|
justburner |
b375f4 |
return (type == "tlv" || type == "tzl" || type == "pli" || type == "mov" ||
|
|
justburner |
b375f4 |
type == "avi" || type == "3gp" || type == "gif" || type == "mp4" ||
|
|
justburner |
64e039 |
type == "webm" || type == "apng");
|
|
justburner |
b375f4 |
}
|
|
justburner |
b375f4 |
|
|
justburner |
b375f4 |
//-----------------------------------------------------------
|
|
justburner |
b375f4 |
|
|
justburner |
b375f4 |
inline bool isMultipleFrameType(const TFilePath &fp) {
|
|
justburner |
b375f4 |
std::string type(fp.getType());
|
|
justburner |
b375f4 |
return isMultipleFrameType(type);
|
|
justburner |
b375f4 |
}
|
|
justburner |
b375f4 |
|
|
justburner |
b375f4 |
//-----------------------------------------------------------
|
|
justburner |
b375f4 |
|
|
Shinya Kitaoka |
120a6e |
inline bool doesSupportRandomAccess(const TFilePath &fp,
|
|
Shinya Kitaoka |
120a6e |
bool isToonzOutput = false) {
|
|
Shinya Kitaoka |
120a6e |
return (fp.getDots() == "..") || (isToonzOutput && fp.getType() == "mov");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif
|