Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
#ifndef TXSHSIMPLELEVEL_INCLUDED
Toshihiro Shimizu 890ddd
#define TXSHSIMPLELEVEL_INCLUDED
Toshihiro Shimizu 890ddd
Shinya Kitaoka e5734a
#include <memory></memory>
Shinya Kitaoka e5734a
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txshlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshleveltypes.h"
Toshihiro Shimizu 890ddd
#include "toonz/imagemanager.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "traster.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qobject></qobject>
Toshihiro Shimizu 890ddd
#include <qstringlist></qstringlist>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// boost includes
Toshihiro Shimizu 890ddd
#include <boost container="" flat_set.hpp=""></boost>
Toshihiro Shimizu 890ddd
#include <boost container="" flat_map.hpp=""></boost>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// STD includes
Toshihiro Shimizu 890ddd
#include <set></set>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TOONZLIB_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
Toshihiro Shimizu 890ddd
//    Forward declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ImageBuilder;
Toshihiro Shimizu 890ddd
class LevelProperties;
Toshihiro Shimizu 890ddd
class TPalette;
Toshihiro Shimizu 890ddd
class TContentHistory;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*************************************************************************************************
Toshihiro Shimizu 890ddd
//    TXshSimpleLevel  declaration
Toshihiro Shimizu 890ddd
//*************************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \brief    The \p TXshLevel specialization for image levels.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
  \todo     Substitute m_frames with a sorted vector or
Toshihiro Shimizu 890ddd
            a boost flat_set.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class DVAPI TXshSimpleLevel final : public TXshLevel {
Shinya Kitaoka 120a6e
  Q_OBJECT
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  PERSIST_DECLARATION(TXshSimpleLevel)
Shinya Kitaoka 120a6e
  DECLARE_CLASS_CODE
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  /*! \details  Level frames may have special properties depending on
Shinya Kitaoka 120a6e
          the level type they are part of.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
\sa       \p TXshSimpleLevel::getFrameStatus() and
Shinya Kitaoka 120a6e
          \p setFrameStatus() for further details.                  */
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
  enum FrameStatusBit  //!  Describes a level's frame status.
shun-iwasawa 481b59
  {
shun-iwasawa 481b59
    Normal         = 0x0,  //!< Frame has no special status.
Shinya Kitaoka 120a6e
    Scanned        = 0x1,  //!< A fullcolor frame (only tlv levels).
Shinya Kitaoka 120a6e
    Cleanupped     = 0x2,  //!< A cleanupped frame (only tlv levels).
Shinya Kitaoka 120a6e
    CleanupPreview = 0x4   //!< A cleanup preview (only fullcolor levels).
Shinya Kitaoka 120a6e
  };
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
public:
Shinya Kitaoka 120a6e
  static bool
Shinya Kitaoka 120a6e
      m_rasterizePli;  //!< \internal  Not the proper place for this data.
Shinya Kitaoka 120a6e
  static bool m_fillFullColorRaster;  //!< \internal  Not the proper place for
Shinya Kitaoka 38fd86
                                      //! this data.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
public:
Shinya Kitaoka 120a6e
  TXshSimpleLevel(
Shinya Kitaoka 120a6e
      const std::wstring &name =
Shinya Kitaoka 120a6e
          std::wstring());  //!< Constructs a TXshSimpleLevel with a name
Shinya Kitaoka 120a6e
  ~TXshSimpleLevel();
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  TXshSimpleLevel *getSimpleLevel() override {
Shinya Kitaoka 120a6e
    return this;
Shinya Kitaoka 120a6e
  }  //!< Reimplemented for TXshLevel.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isSubsequence() const { return m_isSubsequence; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool is16BitChannelLevel() const {
Shinya Kitaoka 120a6e
    return getType() == OVL_XSHLEVEL && m_16BitChannelLevel;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  void set16BitChannelLevel(bool value) {
Shinya Kitaoka 120a6e
    m_16BitChannelLevel = (value && getType() == OVL_XSHLEVEL);
Shinya Kitaoka 120a6e
  }
shun-iwasawa 481b59
  bool isFloatChannelLevel() const {
shun-iwasawa 481b59
    return getType() == OVL_XSHLEVEL && m_floatChannelLevel;
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
  void setFloatChannelLevel(bool value) {
shun-iwasawa 481b59
    m_floatChannelLevel = (value && getType() == OVL_XSHLEVEL);
shun-iwasawa 481b59
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isReadOnly() const { return m_isReadOnly; }
Shinya Kitaoka 120a6e
  void setIsReadOnly(bool value) { m_isReadOnly = value; }
Shinya Kitaoka 120a6e
  void updateReadOnly();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  LevelProperties *getProperties()
Shinya Kitaoka 120a6e
      const  //!< Returns a pointer to the \a owned level properties.
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    return m_properties.get();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  void clonePropertiesFrom(const TXshSimpleLevel *oldSl);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPalette *getPalette()
Shinya Kitaoka 120a6e
      const;  //!< Returns a pointer to the \a shared level palette.
Shinya Kitaoka 120a6e
  void setPalette(TPalette *palette);  //!< Assigns a palette to the level.
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  TFilePath getPath() const override { return m_path; }
Shinya Kitaoka 120a6e
  void setPath(const TFilePath &path, bool retainCachedImages = false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFilePath getScannedPath() const { return m_scannedPath; }
Shinya Kitaoka 120a6e
  void setScannedPath(const TFilePath &path);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \details      Each level frame have a corresponding image retrievable
Shinya Kitaoka 120a6e
              with the getFrame() method and similar.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
\remark       Consider using functions getFrameCount() and getFrameId()
Shinya Kitaoka 120a6e
              to avoid a container copy.                                      */
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::vector<tframeid> getFids()</tframeid>
Shinya Kitaoka 120a6e
      const;  //!< Returns a copy of the level's frame ids.
Shinya Kitaoka 38fd86
  void getFids(
Shinya Kitaoka 38fd86
      std::vector<tframeid> &fids) const override;  //!< Copies fids() into</tframeid>
Shinya Kitaoka 38fd86
                                                    //! fids.  \deprecated  Use
Shinya Kitaoka 38fd86
  //! the return valued
Shinya Kitaoka 38fd86
  //! variation instead.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFrameId getFirstFid()
Shinya Kitaoka 120a6e
      const;  //!< Returns the first level frame's id; roughly equivalent to
Shinya Kitaoka 120a6e
              //!  <tt>index2fid(0)</tt>.
Shinya Kitaoka 120a6e
  TFrameId getLastFid()
Shinya Kitaoka 120a6e
      const;  //!< Returns the last level frame's id; roughly equivalent to
Shinya Kitaoka 120a6e
              //!  <tt>index2fid(getFrameCount()-1)</tt>.
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  bool isEmpty() const override {
Shinya Kitaoka 120a6e
    return m_frames.empty();
Shinya Kitaoka 120a6e
  }  //!< Returns whether the level is empty.
Shinya Kitaoka 120a6e
  bool isFid(const TFrameId &fid)
Shinya Kitaoka 120a6e
      const;  //!< Returns whether a given frameId is in the level.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \details  Unlike function index2fid(), getFrameId() \a asserts
Shinya Kitaoka 120a6e
          beyond current frames count.                              */
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const TFrameId &getFrameId(
Shinya Kitaoka 120a6e
      int index) const;  //!< Returns the frame id at specified index.
Shinya Kitaoka 473e70
  int getFrameCount() const override {
Shinya Kitaoka 120a6e
    return m_frames.size();
Shinya Kitaoka 120a6e
  }  //!< Returns the level's frames count.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \details  Function index2fid() attempts guessing frame ids for
Shinya Kitaoka 120a6e
          frame indexes beyond current frames count. See function
Shinya Kitaoka 120a6e
          guessStep() for further details.                          */
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFrameId index2fid(int index) const;  //!< Returns a frame id corresponding to
Shinya Kitaoka 38fd86
                                        //! the specified frame index, or
Shinya Kitaoka 38fd86
  //!  an invalid frame otherwise.
Shinya Kitaoka 120a6e
  int fid2index(const TFrameId &fid) const;  //!< Returns the frame \a index
Shinya Kitaoka 38fd86
                                             //! corresponding to the specified
Shinya Kitaoka 38fd86
  //! frame id,
Shinya Kitaoka 38fd86
  //!  or \p -1 if not found.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*
Shinya Kitaoka 120a6e
if the table contains 'fid' it returns fid2index(fid).
Shinya Kitaoka 120a6e
if fid is greater than the last fid in the table, it returns a "guessed" index.
Shinya Kitaoka 120a6e
e.g. if fids = [1,3,5,7] then fid2index(11) == 5
Shinya Kitaoka 120a6e
if fid is smaller than the last fid in the table (and is not contained in the
Shinya Kitaoka 120a6e
table) it returns the proper insertion index
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  int guessIndex(const TFrameId &fid) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Analyzes the level's frames table and returns the alleged entries \a step
Shinya Kitaoka 120a6e
  //! - ie the distance
Shinya Kitaoka 120a6e
  //! from each entry to the next.
Shinya Kitaoka 120a6e
  int guessStep() const;
Toshihiro Shimizu 890ddd
shun-iwasawa fc0d80
  void formatFId(TFrameId &fid, TFrameId tmplFId);
Shinya Kitaoka 120a6e
  void setFrame(const TFrameId &fid, const TImageP &img);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TImageP getFrame(const TFrameId &fid, UCHAR imgManagerParamsMask,
Shinya Kitaoka 120a6e
                   int subsampling) const;
Shinya Kitaoka 120a6e
  TImageP getFrame(const TFrameId &fid, bool toBeModified) const {
Shinya Kitaoka 120a6e
    return getFrame(
Shinya Kitaoka 120a6e
        fid, toBeModified ? ImageManager::toBeModified : ImageManager::none, 0);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TImageP getFullsampledFrame(const TFrameId &fid,
Shinya Kitaoka 120a6e
                              UCHAR imgManagerParamsMask) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TImageInfo *getFrameInfo(const TFrameId &fid, bool toBeModified);
Shinya Kitaoka 120a6e
  TImageP getFrameIcon(const TFrameId &fid) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // load icon (and image) data of all frames into cache
Shinya Kitaoka 120a6e
  void loadAllIconsAndPutInCache(bool cacheImagesAsWell);
Toshihiro Shimizu 890ddd
shun-iwasawa 76a039
  TRasterImageP getFrameToCleanup(const TFrameId &fid,
shun-iwasawa 76a039
                                  bool toBeLineProcessed) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::string getImageId(const TFrameId &fid, int frameStatus = -1) const;
Shinya Kitaoka 120a6e
  std::string getIconId(const TFrameId &fid, int frameStatus = -1) const;
Shinya Kitaoka 120a6e
  std::string getIconId(const TFrameId &fid, const TDimension &size) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void eraseFrame(const TFrameId &fid);
Shinya Kitaoka 120a6e
  void clearFrames();
Shinya Kitaoka 120a6e
  void invalidateFrames();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void invalidateFrame(const TFrameId &fid);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*!
Shinya Kitaoka 120a6e
Set the range of frame that can be edited and saved.
Shinya Kitaoka 120a6e
Editable range is contained in \b m_editableRange.
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  void setEditableRange(unsigned int from, unsigned int to,
Shinya Kitaoka 120a6e
                        const std::wstring &userName);
Shinya Kitaoka 120a6e
  void mergeTemporaryHookFile(unsigned int from, unsigned int to,
Shinya Kitaoka 120a6e
                              const TFilePath &hookFile);
Shinya Kitaoka 120a6e
  void clearEditableRange();
Shinya Kitaoka 120a6e
  std::wstring getEditableFileName();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<tframeid></tframeid>
Shinya Kitaoka 120a6e
  getEditableRange();  //!< Returns the set of editable frames.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int getFrameStatus(const TFrameId &fid) const;
Shinya Kitaoka 120a6e
  void setFrameStatus(const TFrameId &fid, int status);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*! \details      This function will implicitly convert the input path
Shinya Kitaoka 120a6e
              extension to a correctly formatted \a tlv. Behavior
Shinya Kitaoka 120a6e
              is undefined in case the level is not of fullcolor type.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
\deprecated   Function is obviously an implementation detail of the
Shinya Kitaoka 120a6e
              cleanup process. Should be moved there.                         */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void makeTlv(const TFilePath &tlvPath);  //!< Transforms the level from \a
Shinya Kitaoka 38fd86
                                           //! fullcolor to tlv (colormap),
Shinya Kitaoka 120a6e
  //!  and assigns the specified level path.
Shinya Kitaoka 120a6e
  TImageP createEmptyFrame();
Toshihiro Shimizu 890ddd
shun-iwasawa 377482
  void initializePalette();
shun-iwasawa 377482
  void initializeResolutionAndDpi(const TDimension &dim = TDimension(),
shun-iwasawa 377482
                                  double dpi            = 0);
shun-iwasawa 377482
Shinya Kitaoka 120a6e
  TDimension getResolution();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TPointD getImageDpi(const TFrameId &fid = TFrameId::NO_FRAME,
Shinya Kitaoka 120a6e
                      int frameStatus     = -1);
Shinya Kitaoka 120a6e
  int getImageSubsampling(const TFrameId &fid) const;
Shinya Kitaoka 120a6e
  TPointD getDpi(const TFrameId &fid = TFrameId::NO_FRAME,
Shinya Kitaoka 120a6e
                 int frameStatus     = -1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*! \brief    Returns the bbox for the level's fid, specified in standard
Shinya Kitaoka 120a6e
          \a inch coordinates (which are \a different from Toonz's
Shinya Kitaoka 120a6e
          standard world coordinates, by a \p Stage::inch factor).            */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TRectD getBBox(const TFrameId &fid) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void setDirtyFlag(bool on) override;
Shinya Kitaoka 120a6e
  bool getDirtyFlag() const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Updates content history (invokes setDirtyFlag(true))
Shinya Kitaoka 120a6e
  //! \warning Not what users may expect!
Shinya Kitaoka 120a6e
  void touchFrame(const TFrameId &fid);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void loadData(TIStream &is) override;
Shinya Kitaoka 473e70
  void saveData(TOStream &os) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Loads the level from disk, translating encoded level paths relative
Shinya Kitaoka 120a6e
  //! to the level's scene path.
Shinya Kitaoka 473e70
  void load() override;
Shinya Kitaoka 120a6e
  void load(const std::vector<tframeid> &fIds);</tframeid>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Saves the level to disk, with the same path deduction from load()
Shinya Kitaoka 473e70
  void save() override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*!
Shinya Kitaoka 120a6e
Save the level in the specified fp.
Shinya Kitaoka 120a6e
The oldFp is used when the current scene path change...
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  void save(const TFilePath &fp, const TFilePath &oldFp = TFilePath(),
Shinya Kitaoka 120a6e
            bool overwritePalette = true);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! note gets the contentHistory. can be 0
Shinya Kitaoka 120a6e
  const TContentHistory *getContentHistory() const {
Shinya Kitaoka 120a6e
    return m_contentHistory.get();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  TContentHistory *getContentHistory() { return m_contentHistory.get(); }
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
  void setContentHistory(TContentHistory *contentHistory);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Set elements of m_renumberTable with m_frames.
Shinya Kitaoka 120a6e
  void setRenumberTable();
Shinya Kitaoka 120a6e
  const std::map<tframeid, tframeid=""> &renumberTable() const {</tframeid,>
Shinya Kitaoka 120a6e
    return m_renumberTable;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  //! Renumbers the level frames to the specified fids (fids and this->fids()
Shinya Kitaoka 120a6e
  //! must have the same size).
Shinya Kitaoka 120a6e
  void renumber(const std::vector<tframeid> &fids);</tframeid>
Toshihiro Shimizu 890ddd
John Dancel 862914
  bool isFrameReadOnly(TFrameId fid);
John Dancel 862914
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  // Auxiliary files management: hooks, tpl, etc.
Shinya Kitaoka 120a6e
  // May throw; copy and rename perform touchparentdir
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  static void copyFiles(const TFilePath &dst,
Shinya Kitaoka 120a6e
                        const TFilePath &src);  //!< Copy files from src to dst.
Shinya Kitaoka 120a6e
  static void renameFiles(
Shinya Kitaoka 120a6e
      const TFilePath &dst,
Shinya Kitaoka 120a6e
      const TFilePath &src);  //!< Rename files from src to dst.
Shinya Kitaoka 120a6e
  static void removeFiles(const TFilePath &fp);  //!< Remove files at fp.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  //! Get the auxiliary files list: hooks, tpl, etc.
Shinya Kitaoka 120a6e
  static void getFiles(const TFilePath &fp, TFilePathSet &fpset);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*!
Shinya Kitaoka 120a6e
Translates a level path into the corresponding hook path (no check for
Shinya Kitaoka 120a6e
the existence of said hook file).
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  static TFilePath getHookPath(const TFilePath &levelPath);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*!
Shinya Kitaoka 120a6e
\brief    Returns the list of \a existing hook files associated to the
Shinya Kitaoka 120a6e
        specified level, sorted by modification date (last modified at front).
Shinya Kitaoka 120a6e
        The list stores local paths<\I> relative to
Shinya Kitaoka 120a6e
        decodedLevelPath.getParentDir().
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
\note     A level may have multiple hook files if the hook set was edited
Shinya Kitaoka 120a6e
        with older Toonz versions. Use this function if you need to access all
Shinya Kitaoka 120a6e
        of them. Only the latest file format is considered when loading a level.
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  static QStringList getHookFiles(const TFilePath &decodedLevelPath);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*!
Shinya Kitaoka 120a6e
\brief    Returns the path of the newest \a existing hook file associated to the
Shinya Kitaoka 120a6e
        specified \b decoded level path - or an empty path if none was found.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
\note     In case there are more than one hook file (ie files from older
Shinya Kitaoka 120a6e
        Toonz version), the latest file version is used.
Shinya Kitaoka 120a6e
*/
Shinya Kitaoka 120a6e
  static TFilePath getExistingHookFile(const TFilePath &decodedLevelPath);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  static void setCompatibilityMasks(int writeMask, int neededMask,
Shinya Kitaoka 120a6e
                                    int forbiddenMask);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public Q_SLOTS:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void onPaletteChanged();  //!< Invoked when some colorstyle has been changed
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  typedef boost::container::flat_set<tframeid> FramesSet;</tframeid>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  std::unique_ptr<levelproperties> m_properties;</levelproperties>
Shinya Kitaoka 120a6e
  std::unique_ptr<tcontenthistory> m_contentHistory;</tcontenthistory>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TPalette *m_palette;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  FramesSet m_frames;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::map<tframeid, tframeid=""></tframeid,>
Shinya Kitaoka 120a6e
      m_renumberTable;  //!< Maps disk-frames to level-frames.
Shinya Kitaoka 120a6e
  //!  Typically, the 2 match - however, the situation changes
Shinya Kitaoka 120a6e
  //!  after an explicit frame renumbering process. In case
Shinya Kitaoka 120a6e
  //!  a level-frame is deleted, the table entry is removed;
Shinya Kitaoka 120a6e
  //!  it will be physically removed only when the level is saved.
Shinya Kitaoka 120a6e
  //!  A similar thing happens with newly inserted frames.
Shinya Kitaoka 120a6e
  std::map<tframeid, int=""> m_framesStatus;</tframeid,>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<tframeid> m_editableRange;</tframeid>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFilePath m_path, m_scannedPath;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::string m_idBase;
Shinya Kitaoka 120a6e
  std::wstring m_editableRangeUserInfo;
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
  bool m_isSubsequence, m_16BitChannelLevel, m_floatChannelLevel, m_isReadOnly,
Shinya Kitaoka 120a6e
      m_temporaryHookMerged;  //!< Used only during hook merge (and hence during
Shinya Kitaoka 38fd86
                              //! saving)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  //! Save simple level in scene-decoded path \p decodedFp.
Shinya Kitaoka 120a6e
  void saveSimpleLevel(
Shinya Kitaoka 120a6e
      const TFilePath &decodedFp,
Shinya Kitaoka 120a6e
      bool overwritePalette = true);  // Difference from save(..)?
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  // Not copyable
Shinya Kitaoka 120a6e
  TXshSimpleLevel(const TXshSimpleLevel &);
Shinya Kitaoka 120a6e
  TXshSimpleLevel &operator=(const TXshSimpleLevel &);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=====================================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
template class DV_EXPORT_API TSmartPointerT<txshsimplelevel>;</txshsimplelevel>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
typedef TSmartPointerT<txshsimplelevel> TXshSimpleLevelP;</txshsimplelevel>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=====================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVAPI setLoadingLevelRange(const TFrameId &fromFid, const TFrameId &toFid);
Toshihiro Shimizu 890ddd
void DVAPI getLoadingLevelRange(TFrameId &fromFid, TFrameId &toFid);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // TXSHSIMPLELEVEL_INCLUDED