Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef FLIPBOOK_H
Toshihiro Shimizu 890ddd
#define FLIPBOOK_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/flipconsole.h"
Toshihiro Shimizu 890ddd
#include "imageviewer.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tlevel_io.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
#include "tsound.h"
Toshihiro Shimizu 890ddd
#include "filebrowserpopup.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tfx.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheet.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qtimer></qtimer>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/flipconsoleowner.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class QPoint;
Toshihiro Shimizu 890ddd
class TPalette;
Toshihiro Shimizu 890ddd
class TFilePath;
Toshihiro Shimizu 890ddd
class FlipBook;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class SaveImagesPopup final : public FileBrowserPopup {
Shinya Kitaoka 120a6e
  Q_OBJECT
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  FlipBook *m_flip;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SaveImagesPopup(FlipBook *flip);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  bool execute() override;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class LoadImagesPopup final : public FileBrowserPopup {
Shinya Kitaoka 120a6e
  Q_OBJECT
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  DVGui::LineEdit *m_fromField;
Shinya Kitaoka 120a6e
  DVGui::LineEdit *m_toField;
Shinya Kitaoka 120a6e
  DVGui::LineEdit *m_stepField;
Shinya Kitaoka 120a6e
  DVGui::LineEdit *m_shrinkField;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int m_minFrame, m_maxFrame;
Shinya Kitaoka 120a6e
  int m_from, m_to, m_step, m_shrink;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QStringList m_appendFilterTypes;
Shinya Kitaoka 120a6e
  QStringList m_loadFilterTypes;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  FlipBook *m_flip;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  LoadImagesPopup(FlipBook *flip);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  bool execute() override;
Shinya Kitaoka 473e70
  bool executeApply() override;
Shinya Kitaoka 120a6e
  bool doLoad(bool append);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public slots:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void onFilePathClicked(const TFilePath &);
Shinya Kitaoka 120a6e
  void onEditingFinished();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// FlipBookPool
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FlipBook;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class FlipBookPool {
Shinya Kitaoka 120a6e
  std::map<int, *="" flipbook=""> m_pool;</int,>
Shinya Kitaoka 120a6e
  std::map<int, qrect=""> m_geometryPool;</int,>
Shinya Kitaoka 120a6e
  int m_overallFlipCount;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TFilePath m_historyPath;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  FlipBookPool();
Shinya Kitaoka 120a6e
  ~FlipBookPool();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  static FlipBookPool *instance();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void load(const TFilePath &historyPath);
Shinya Kitaoka 120a6e
  void save() const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  FlipBook *pop();
Shinya Kitaoka 120a6e
  void push(FlipBook *flipbook);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
// FlipBook
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
class TSoundOutputDevice;
Toshihiro Shimizu 890ddd
class TSoundTrack;
Toshihiro Shimizu 890ddd
class SaveImagesPopup;
Toshihiro Shimizu 890ddd
class LoadImagesPopup;
Toshihiro Shimizu 890ddd
class TFx;
Toshihiro Shimizu 890ddd
class TXsheet;
Toshihiro Shimizu 890ddd
class TXshSimpleLevel;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TPanelTitleBar;
Toshihiro Shimizu 890ddd
class TPanelTitleBarButton;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class FlipBook : public QWidget,
Shinya Kitaoka 120a6e
                 public TSoundOutputDeviceListener,
Shinya Kitaoka 120a6e
                 public FlipConsoleOwner {
Shinya Kitaoka 120a6e
  Q_OBJECT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  int m_poolIndex;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QString m_viewerTitle;
Shinya Kitaoka 120a6e
  QString m_title, m_title1;
Shinya Kitaoka 120a6e
  ImageViewer *m_imageViewer;
Shinya Kitaoka 120a6e
  FlipConsole *m_flipConsole;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int m_shrink;
Shinya Kitaoka 120a6e
  int m_framesCount;
Shinya Kitaoka 120a6e
  TRect m_loadbox;
Shinya Kitaoka 120a6e
  TDimension m_dim;
Shinya Kitaoka 120a6e
  std::map<std::string, trect=""></std::string,>
Shinya Kitaoka 120a6e
      m_loadboxes;  // id in the cash, rect loaded actually
Shinya Kitaoka 120a6e
  class Level {
Shinya Kitaoka 120a6e
  public:
Shinya Kitaoka 120a6e
    Level(const TLevelP &level, const TFilePath &fp, int fromIndex, int toIndex,
Shinya Kitaoka 120a6e
          int step)
Shinya Kitaoka 120a6e
        : m_level(level)
Shinya Kitaoka 120a6e
        , m_fp(fp)
Shinya Kitaoka 120a6e
        , m_fromIndex(fromIndex)
Shinya Kitaoka 120a6e
        , m_toIndex(toIndex)
Shinya Kitaoka 120a6e
        , m_step(step)
Shinya Kitaoka 120a6e
        , m_randomAccessRead(false)
shun-iwasawa e6b124
        , m_incrementalIndexing(false)
shun-iwasawa 481b59
        , m_premultiply(false)
shun-iwasawa 481b59
        , m_colorSpaceGamma(LevelOptions::DefaultColorSpaceGamma) {}
Shinya Kitaoka 120a6e
    TLevelP m_level;
Shinya Kitaoka 120a6e
    int m_fromIndex, m_toIndex, m_step;
Shinya Kitaoka 120a6e
    bool m_incrementalIndexing;
Shinya Kitaoka 120a6e
    bool m_randomAccessRead;
shun-iwasawa e6b124
shun-iwasawa e6b124
    // Specified if the level is needed to be premultiplied on display.
shun-iwasawa e6b124
    // It will be true for the files of which the "premultiply" option is
shun-iwasawa e6b124
    // activated in the Preferences > Loading > "Level Settings by File Format".
shun-iwasawa e6b124
    // By default, PNG will be loaded with being premultiplied so that it will
shun-iwasawa e6b124
    // be displayed properly.
shun-iwasawa e6b124
    bool m_premultiply;
shun-iwasawa e6b124
shun-iwasawa 481b59
    // Gamma value to be used when converting EXR files to nonlinear.
shun-iwasawa 481b59
    // It may be set to some value in the Preferences > Loading > "Level
shun-iwasawa 481b59
    // Settings by File Format".
shun-iwasawa 481b59
    double m_colorSpaceGamma;
shun-iwasawa 481b59
Shinya Kitaoka 120a6e
    TFilePath m_fp;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    TFrameId flipbookIndexToLevelFrame(int index);
Shinya Kitaoka 120a6e
    int getIndexesCount();
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::vector<level> m_levels;</level>
Shinya Kitaoka 120a6e
  std::vector<qstring> m_levelNames;</qstring>
Shinya Kitaoka 120a6e
  TPalette *m_palette;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool m_playSound;
Shinya Kitaoka 120a6e
  std::vector<std::string> m_addedInCache;</std::string>
Shinya Kitaoka 120a6e
  TSoundOutputDevice *m_player;
Shinya Kitaoka 120a6e
  TSoundTrack *m_snd;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // bool m_doCompare;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // questi sono per il saving dei frame
Shinya Kitaoka 120a6e
  TLevelWriterP m_lw;
Shinya Kitaoka 120a6e
  TLevelReaderP m_lr;
Shinya Kitaoka 120a6e
  TXshSimpleLevel *m_xl;
Shinya Kitaoka 120a6e
  int m_currentFrameToSave;
Shinya Kitaoka 120a6e
  SaveImagesPopup *m_savePopup;
Shinya Kitaoka 120a6e
  LoadImagesPopup *m_loadPopup;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool m_isPreviewFx;
Shinya Kitaoka 120a6e
  TFxP m_previewedFx;
Shinya Kitaoka 120a6e
  TXsheetP m_previewXsh;
Shinya Kitaoka 120a6e
  QTimer m_previewUpdateTimer;
Shinya Kitaoka 120a6e
  bool m_freezed;
Shinya Kitaoka 120a6e
  UCHAR m_flags;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPanelTitleBarButton *m_freezeButton;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  enum Flags { eDontKeepFilesOpened = 0x1 };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  FlipBook(QWidget *parent = 0, QString viewerTitle = QString(),
manongjohn 77dd6e
           std::vector<int> flipConsoleButtonMask =</int>
manongjohn 77dd6e
               {FlipConsole::eFilledRaster, FlipConsole::eDefineSubCamera,
manongjohn 77dd6e
                FlipConsole::eLocator, FlipConsole::eZoomIn,
manongjohn 77dd6e
                FlipConsole::eZoomOut, FlipConsole::eFlipHorizontal,
manongjohn 77dd6e
                FlipConsole::eFlipVertical, FlipConsole::eResetView},
Shinya Kitaoka 120a6e
           UCHAR flags = 0, bool isColorModel = false);
Shinya Kitaoka 120a6e
  ~FlipBook();
Shinya Kitaoka 120a6e
  void setLevel(const TFilePath &path, TPalette *palette = 0, int from = -1,
Shinya Kitaoka 120a6e
                int to = -1, int step = 1, int shrink = 1, TSoundTrack *snd = 0,
Shinya Kitaoka 120a6e
                bool append = false, bool isToonzOutput = false);
Shinya Kitaoka 120a6e
  void setLevel(TFx *previewedFx, TXsheet *xsh, TLevel *level,
Shinya Kitaoka 120a6e
                TPalette *palette = 0, int from = -1, int to = -1, int step = 1,
Shinya Kitaoka 120a6e
                int currentFrame = 1, TSoundTrack *snd = 0);
Shinya Kitaoka 120a6e
  void setLevel(TXshSimpleLevel *xl);
Shinya Kitaoka 473e70
  void onPlayCompleted() override {}
Shinya Kitaoka 120a6e
  bool doSaveImages(TFilePath fp);
Shinya Kitaoka 120a6e
  int getCurrentFrame() { return m_flipConsole->getCurrentFrame(); }
Shinya Kitaoka 120a6e
  QString getLevelZoomTitle() const { return m_title1 + m_title; }
Shinya Kitaoka 120a6e
  void setTitle(const QString &title);
Shinya Kitaoka 120a6e
  QString getTitle() const { return m_viewerTitle; }
Shinya Kitaoka 120a6e
  void showFrame(int frame);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TFx *getPreviewedFx() const;
Shinya Kitaoka 120a6e
  TXsheet *getPreviewXsheet() const;
Shinya Kitaoka 120a6e
  bool isFreezed() const { return m_freezed; }
Shinya Kitaoka 120a6e
  TRectD getPreviewedImageGeometry() const;
Shinya Kitaoka 120a6e
  void schedulePreviewedFxUpdate();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool canAppend();
Shinya Kitaoka 120a6e
  bool isSavable() const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setPoolIndex(int poolIndex) { m_poolIndex = poolIndex; }
Shinya Kitaoka 120a6e
  int getPoolIndex() const { return m_poolIndex; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // show / hide the red border line indicating the frame is under rendering
Shinya Kitaoka 120a6e
  void setIsRemakingPreviewFx(bool on) {
Shinya Kitaoka 120a6e
    m_imageViewer->setIsRemakingPreviewFx(on);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  void addFreezeButtonToTitleBar();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void setProgressBarStatus(const std::vector<uchar> *pbStatus);</uchar>
Shinya Kitaoka 120a6e
  const std::vector<uchar> *getProgressBarStatus() const;</uchar>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void adaptGeometry(const TRect &interestingImgRect, const TRect &imgRect);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // When Fx preview is called without the subcamera,
Shinya Kitaoka 120a6e
  // render the full region of camera by resize flipbook and
Shinya Kitaoka 120a6e
  // zoom-out the rendered image.
Shinya Kitaoka 120a6e
  void adaptGeometryForFullPreview(const TRect &imgRect);
Shinya Kitaoka 120a6e
shun-iwasawa b272a7
  void adaptGeometryToCurrentSize();
shun-iwasawa b272a7
  void zoomAndAdaptGeometry(bool forward);
shun-iwasawa b272a7
Shinya Kitaoka 120a6e
  void reset();
Shinya Kitaoka 120a6e
shun-iwasawa fe0983
  void onDrawFrame(int frame, const ImagePainter::VisualSettings &vs,
shun-iwasawa fe0983
                   QElapsedTimer *timer, qint64 targetInstant) override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void minimize(bool doMinimize);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  ImageViewer *getImageViewer() { return m_imageViewer; }
Shinya Kitaoka 120a6e
  TRect getLoadbox() const { return m_loadbox; }
Shinya Kitaoka 120a6e
  void setLoadbox(const TRect &box);
Shinya Kitaoka 120a6e
  TDimension getImageSize() const { return m_dim; }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void swapBuffers() override;
Shinya Kitaoka 473e70
  void changeSwapBehavior(bool enable) override;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  // When viewing the tlv, try to cache all frames at the beginning.
Shinya Kitaoka 120a6e
  // NOTE : fromFrame and toFrame are frame numbers displayed on the flipbook
Shinya Kitaoka 120a6e
  void loadAndCacheAllTlvImages(Level level, int fromFrame, int toFrame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  friend class PreviewFxManager;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  void clearCache();
Shinya Kitaoka 120a6e
  void adaptWidGeometry(const TRect &interestWidRect, const TRect &imgWidRect,
Shinya Kitaoka 120a6e
                        bool keepPosition);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void dragEnterEvent(QDragEnterEvent *e) override;
Shinya Kitaoka 473e70
  void dropEvent(QDropEvent *e) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void playAudioFrame(int frame);
Shinya Kitaoka 120a6e
  TImageP getCurrentImage(int frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void showEvent(QShowEvent *e) override;
Shinya Kitaoka 473e70
  void hideEvent(QHideEvent *e) override;
Shinya Kitaoka 473e70
  void focusInEvent(QFocusEvent *e) override;
Shinya Kitaoka 473e70
  void resizeEvent(QResizeEvent *e) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void enterEvent(QEvent *e) override { m_flipConsole->makeCurrent(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
signals:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void closeFlipBook(FlipBook *);
Shinya Kitaoka 120a6e
  // when freeze button is released, emit the signal to PreviewFxManager for
Shinya Kitaoka 120a6e
  // re-rendering
Shinya Kitaoka 120a6e
  void unfreezed(FlipBook *);
Shinya Kitaoka 120a6e
  // when using the flip module, this signal is to show the loaded level names
Shinya Kitaoka 120a6e
  // in application's title bar
Shinya Kitaoka 120a6e
  void imageLoaded(QString &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected slots:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void onDoubleClick(QMouseEvent *me);
Shinya Kitaoka 120a6e
  void onButtonPressed(FlipConsole::EGadget button);
Shinya Kitaoka 120a6e
  void onCloseButtonPressed();
Shinya Kitaoka 120a6e
  void saveImage();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void freeze(bool on);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public slots:
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void saveImages();
Shinya Kitaoka 120a6e
  void loadImages();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void performFxUpdate();
Shinya Kitaoka 120a6e
  void regenerate();
Shinya Kitaoka 120a6e
  void regenerateFrame();
Shinya Kitaoka 120a6e
  void clonePreview();
Shinya Kitaoka 120a6e
  void freezePreview();
Shinya Kitaoka 120a6e
  void unfreezePreview();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// utility
shun_iwasawa cc002f
// returns pointer to the opened flipbook to control modality.
Toshihiro Shimizu 890ddd
shun_iwasawa cc002f
FlipBook *viewFile(const TFilePath &fp, int from = -1, int to = -1,
shun_iwasawa cc002f
                   int step = -1, int shrink = -1, TSoundTrack *snd = 0,
shun_iwasawa cc002f
                   FlipBook *flipbook = 0, bool append = false,
shun_iwasawa cc002f
                   bool isToonzOutput = false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // FLIPBOOK_H