Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef LEVELSELECTION_H
Toshihiro Shimizu 890ddd
#define LEVELSELECTION_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/selection.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tcommon.h"
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 TNZTOOLS_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 TVectorImage;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//====================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*******************************************************************************
Toshihiro Shimizu 890ddd
//    LevelSelection  declaration
Toshihiro Shimizu 890ddd
//*******************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \brief    Selection type for level-based multi-frame selections targetting
Toshihiro Shimizu 890ddd
            primitives described by predefined filtering functions.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI LevelSelection : public TSelection {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  enum FramesMode     //!  Possible frames selection modes.
Shinya Kitaoka 120a6e
  { FRAMES_NONE,      //!< No frame is selected.
Shinya Kitaoka 120a6e
    FRAMES_CURRENT,   //!< Selects the (context-defined) current frame.
Shinya Kitaoka 120a6e
    FRAMES_SELECTED,  //!< Selects the frames specified in \p
Shinya Kitaoka 38fd86
                      //! TTool::getSelectedFrames().
Shinya Kitaoka 120a6e
    FRAMES_ALL,       //!< Selects the whole level.
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  enum Filter          //!  Possible selection filters.
Shinya Kitaoka 120a6e
  { EMPTY,             //!< Selection is empty - everyting is filtered out.
Shinya Kitaoka 120a6e
    WHOLE,             //!< Selects everything - nothing is filtered out.
Shinya Kitaoka 120a6e
    SELECTED_STYLES,   //!< Acts only entities with selected palette styles.
Shinya Kitaoka 120a6e
    BOUNDARY_STROKES,  //!< Acts only on boundary strokes (applies only to
Shinya Kitaoka 38fd86
                       //! vector images).
Shinya Kitaoka 120a6e
  };
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  typedef std::set<int></int>
Shinya Kitaoka 120a6e
      styles_container;  //!< Container of style indexes used together with the
Shinya Kitaoka 120a6e
                         //!  \p SELECTED_STYLES filter.
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  LevelSelection();  //!< Constructs an empty level selection.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*! \remark   The selection is hereby considered empty \a only if it either
Shinya Kitaoka 120a6e
     has
Shinya Kitaoka 120a6e
          FramesMode FRAMES_NONE or Filter EMPTY. It is user's responsibility
Shinya Kitaoka 120a6e
          to check whether nontrivial selections are empty or not. */
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  bool isEmpty() const override;  //!< Returns whether the selection is empty.
Shinya Kitaoka 38fd86
  void selectNone()
Shinya Kitaoka 38fd86
      override;  //!< Resets the selection to empty. This is functionally
Shinya Kitaoka 38fd86
                 //!  equivalent to <tt>operator=(LevelSelection());</tt>
Shinya Kitaoka 120a6e
  FramesMode framesMode() const { return m_framesMode; }
Shinya Kitaoka 120a6e
  FramesMode &framesMode()  //!  Returns current frames selection mode.
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    return m_framesMode;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Filter filter() const { return m_filter; }
Shinya Kitaoka 120a6e
  Filter &filter()  //!  Returns current styles selection mode.
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    return m_filter;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const styles_container &styles() const { return m_styles; }
Shinya Kitaoka 120a6e
  styles_container &styles() {
Shinya Kitaoka 120a6e
    return m_styles;
Shinya Kitaoka 120a6e
  }  //!< Returns selected palette styles used with the
Shinya Kitaoka 120a6e
     //!  \p SELECTED_STYLES filter.
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  FramesMode m_framesMode;  //!< Selected level frames.
Shinya Kitaoka 120a6e
  Filter m_filter;          //!< Selection filter.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<int> m_styles;  //!< Selected palette styles used with the \p</int>
Shinya Kitaoka 38fd86
                           //! SELECTED_STYLES filter.
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*******************************************************************************
Toshihiro Shimizu 890ddd
//    Related standalone functions
Toshihiro Shimizu 890ddd
//*******************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \brief    Calculates the strokes on the boundary of a vector image.
Toshihiro Shimizu 890ddd
  \details  Boundary strokes are those with a side entirely adjacent
Toshihiro Shimizu 890ddd
            to a region with style index \p 0.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \return   The indexes of boundary strokes in the input image.
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI std::vector<int> getBoundaryStrokes(TVectorImage &vi);</int>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \brief    Applies a selection filter to a given vector image.
Toshihiro Shimizu 890ddd
  \return   The stroke indexes included in the filtered selection.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  \remark   In case the filter is LevelSelection::BOUNDARY_STROKES, the
Shinya Kitaoka 120a6e
  resulting
Toshihiro Shimizu 890ddd
            selection is composed of all strokes which are even partially
Toshihiro Shimizu 890ddd
            adjacent to a region with style index \p 0.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \sa       Function getBoundaryStrokes().
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
DVAPI std::vector<int> getSelectedStrokes(</int>
Shinya Kitaoka 120a6e
    TVectorImage &vi,  //!< Vector image whose strokes will be selected.
Shinya Kitaoka 120a6e
    const LevelSelection
Shinya Kitaoka 120a6e
        &levelSelection  //!< Selection filter for the specified image.
Shinya Kitaoka 120a6e
    );
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // LEVELSELECTION_H