Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TOOLSUTILS_H
Toshihiro Shimizu 890ddd
#define TOOLSUTILS_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
#include "tvectorimage.h"
Toshihiro Shimizu 890ddd
#include "ttoonzimage.h"
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "tregion.h"
Toshihiro Shimizu 890ddd
#include "tcurves.h"
Toshihiro Shimizu 890ddd
#include "tpixel.h"
Toshihiro Shimizu 890ddd
#include "tfilepath.h"
Toshihiro Shimizu 890ddd
#include "tpalette.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/txshsimplelevel.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzTools includes
Toshihiro Shimizu 890ddd
#include "tools/tool.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "historytypes.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
#include <qmenu></qmenu>
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 TVectorImageP;
Toshihiro Shimizu 890ddd
class TTileSetCM32;
Toshihiro Shimizu 890ddd
class TTileSetFullColor;
Toshihiro Shimizu 890ddd
class TStageObjectSpline;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
//    Mixed Tool utilities
Toshihiro Shimizu 890ddd
//*****************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace ToolUtils {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef std::vector<tstroke *=""> ArrayOfStroke;</tstroke>
Toshihiro Shimizu 890ddd
typedef ArrayOfStroke::const_iterator citAS;
Toshihiro Shimizu 890ddd
typedef ArrayOfStroke::iterator itAS;
Toshihiro Shimizu 890ddd
typedef std::vector<tthickquadratic *=""> ArrayOfTQ;</tthickquadratic>
Toshihiro Shimizu 890ddd
typedef std::vector<double> ArrayOfDouble;</double>
Toshihiro Shimizu 890ddd
typedef ArrayOfTQ::iterator itATQ;
Toshihiro Shimizu 890ddd
typedef ArrayOfTQ::const_iterator citATQ;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// inserito per rendere piu' piccolo il numero di punti delle stroke
Shinya Kitaoka 120a6e
// ricampionate
Toshihiro Shimizu 890ddd
const double ReduceControlPointCorrection = 2.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// controlla la dimensione del raggio di pick sotto la quale click and up
Toshihiro Shimizu 890ddd
//  risulta insesibile
Toshihiro Shimizu 890ddd
const double PickRadius = 1.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void DVAPI drawRect(const TRectD &rect, const TPixel32 &color,
Shinya Kitaoka 120a6e
                    unsigned short stipple, bool doContrast = false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVAPI fillRect(const TRectD &rect, const TPixel32 &color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawPoint(const TPointD &q, double pixelSize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawCross(const TPointD &q, double pixelSize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawArrow(const TSegment &s, double pixelSize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVAPI drawSquare(const TPointD &pos, double r, const TPixel32 &color);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawRectWhitArrow(const TPointD &pos, double r);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
QRadialGradient getBrushPad(int size, double hardness);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! Divide il primo rettangolo in piu' sottorettsngoli, in base all'intersezione
Shinya Kitaoka 120a6e
//! con il secondo
Toshihiro Shimizu 890ddd
QList<trect> splitRect(const TRect &first, const TRect &second);</trect>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! Return a transparent TRaster32P conteaining the self looped stroke fileed
Shinya Kitaoka 120a6e
//! with white!
Shinya Kitaoka 120a6e
//! If the stroke isn't self looped, the first point of the stroke is addee at
Shinya Kitaoka 120a6e
//! the end.
Shinya Kitaoka 120a6e
//! The returned image has the size of the stroke bounding box intrsected with
Shinya Kitaoka 120a6e
//! the \b imageBounds.
Toshihiro Shimizu 890ddd
//! If this intersection is empty a TRaster32P() is returned.
Shinya Kitaoka 120a6e
TRaster32P convertStrokeToImage(TStroke *stroke, const TRect &imageBounds,
Shinya Kitaoka 120a6e
                                TPoint &pos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void drawBalloon(
Shinya Kitaoka 120a6e
    const TPointD &pos,     // position "pointed" by the balloon (world units)
Shinya Kitaoka 120a6e
    std::string text,       // balloon text
Shinya Kitaoka 120a6e
    const TPixel32 &color,  // ballon background color (text is black)
Shinya Kitaoka 120a6e
    TPoint delta,  // text position (pixels; pos is the origin; y grows upward)
Shinya Kitaoka 120a6e
    bool isPicking = false,
Shinya Kitaoka 120a6e
    std::vector<trectd> *otherBalloons =</trectd>
Shinya Kitaoka 120a6e
        0);  // avoid other balloons positions; add the new ballons positions
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
enum HookType { NormalHook, PassHookA, PassHookB, OtherLevelHook };
Shinya Kitaoka 120a6e
void drawHook(const TPointD &p, HookType type, bool highlighted = false,
Shinya Kitaoka 120a6e
              bool onionSkin = false);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TStroke *merge(const ArrayOfStroke &a);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//================================================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI TToolUndo : public TUndo {
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  TXshSimpleLevelP m_level;
Shinya Kitaoka 120a6e
  TFrameId m_frameId;
Shinya Kitaoka 120a6e
  int m_row, m_col;
Shinya Kitaoka 120a6e
  bool m_isEditingLevel;
Shinya Kitaoka 120a6e
  bool m_createdFrame;
Shinya Kitaoka 120a6e
  bool m_createdLevel;
Shinya Kitaoka 120a6e
  bool m_animationSheetEnabled;
Shinya Kitaoka 120a6e
  std::vector<int> m_cellsData;  // represent original frame range when</int>
Shinya Kitaoka 120a6e
                                 // m_animationSheetEnabled, m_createdFrame and
Shinya Kitaoka 120a6e
                                 // !m_isEditingLevel; see tool.cpp
Shinya Kitaoka 120a6e
  TPaletteP m_oldPalette;
Shinya Kitaoka 120a6e
  std::string m_imageId;
Shinya Kitaoka 120a6e
  static int m_idCount;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void insertLevelAndFrameIfNeeded() const;
Shinya Kitaoka 120a6e
  void removeLevelAndFrameIfNeeded() const;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void notifyImageChanged() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TToolUndo(TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
            bool createdFrame = false, bool createdLevel = false,
Shinya Kitaoka 120a6e
            const TPaletteP &oldPalette = 0);
Shinya Kitaoka 120a6e
  ~TToolUndo();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  virtual QString getToolName() { return QString("Tool"); }
Shinya Kitaoka 473e70
Shinya Kitaoka 473e70
  QString getHistoryString() override {
Shinya Kitaoka 120a6e
    return QObject::tr("%1   Level : %2  Frame : %3")
Shinya Kitaoka 120a6e
        .arg(getToolName())
Shinya Kitaoka 120a6e
        .arg(QString::fromStdWString(m_level->getName()))
Shinya Kitaoka 120a6e
        .arg(QString::number(m_frameId.getNumber()));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//================================================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI TRasterUndo : public TToolUndo {
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  TTileSetCM32 *m_tiles;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TToonzImageP getImage() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TRasterUndo(TTileSetCM32 *tiles, TXshSimpleLevel *level,
Shinya Kitaoka 120a6e
              const TFrameId &frameId, bool createdFrame, bool createdLevel,
Shinya Kitaoka 120a6e
              const TPaletteP &oldPalette);  // get tiles ownership
Shinya Kitaoka 120a6e
  ~TRasterUndo();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  int getSize() const override;
Shinya Kitaoka 473e70
  void undo() const override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  QString getToolName() override { return QString("Raster Tool"); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//================================================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DVAPI TFullColorRasterUndo : public TToolUndo {
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  TTileSetFullColor *m_tiles;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TRasterImageP getImage() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TFullColorRasterUndo(TTileSetFullColor *tiles, TXshSimpleLevel *level,
Shinya Kitaoka 120a6e
                       const TFrameId &frameId, bool createdFrame,
Shinya Kitaoka 120a6e
                       bool createdLevel,
Shinya Kitaoka 120a6e
                       const TPaletteP &oldPalette);  // get tiles ownership
Shinya Kitaoka 120a6e
  ~TFullColorRasterUndo();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  int getSize() const override;
Shinya Kitaoka 473e70
  void undo() const override;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  std::vector<trect> paste(const TRasterImageP &ti,</trect>
Shinya Kitaoka 120a6e
                           const TTileSetFullColor *tileSet) const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class UndoModifyStroke : public TToolUndo {
Shinya Kitaoka 120a6e
  std::vector<tthickpoint> m_before, m_after;</tthickpoint>
Shinya Kitaoka 120a6e
  bool m_selfLoopBefore, m_selfLoopAfter;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int m_row;
Shinya Kitaoka 120a6e
  int m_column;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  int m_strokeIndex;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  UndoModifyStroke(TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
                   int strokeIndex);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ~UndoModifyStroke();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void onAdd() override;
Shinya Kitaoka 473e70
  void undo() const override;
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class UndoModifyStrokeAndPaint : public UndoModifyStroke {
Shinya Kitaoka 120a6e
  std::vector<tfilledregioninf> *m_fillInformation;</tfilledregioninf>
Shinya Kitaoka 120a6e
  TRectD m_oldBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoModifyStrokeAndPaint(TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
                           int strokeIndex);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ~UndoModifyStrokeAndPaint();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void onAdd() override;
Shinya Kitaoka 473e70
  void undo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  QString getToolName() override { return QObject::tr("Modify Stroke Tool"); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class UndoModifyListStroke : public TToolUndo {
Shinya Kitaoka 120a6e
  std::list<undomodifystroke *=""> m_strokeList;</undomodifystroke>
Shinya Kitaoka 120a6e
  std::list<undomodifystroke *="">::iterator m_beginIt, m_endIt;</undomodifystroke>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::vector<tfilledregioninf> *m_fillInformation;</tfilledregioninf>
Shinya Kitaoka 120a6e
  TRectD m_oldBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoModifyListStroke(TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
                       const std::vector<tstroke *=""> &strokeList);</tstroke>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ~UndoModifyListStroke();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void onAdd() override;
Shinya Kitaoka 473e70
  void undo() const override;
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  QString getToolName() override { return QObject::tr("Modify Stroke Tool"); }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class UndoPencil : public TToolUndo {
Shinya Kitaoka 120a6e
  int m_strokeId;
Shinya Kitaoka 120a6e
  TStroke *m_stroke;
Shinya Kitaoka 120a6e
  std::vector<tfilledregioninf> *m_fillInformation;</tfilledregioninf>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool m_autogroup;
Shinya Kitaoka 120a6e
  bool m_autofill;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoPencil(TStroke *stroke, std::vector<tfilledregioninf> *fillInformation,</tfilledregioninf>
Shinya Kitaoka 120a6e
             TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
             bool m_createdFrame, bool m_createdLevel, bool autogroup = false,
Shinya Kitaoka 120a6e
             bool autofill = false);
Shinya Kitaoka 120a6e
  ~UndoPencil();
Shinya Kitaoka 473e70
  void undo() const override;
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getToolName() override { return QString("Vector Brush Tool"); }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::BrushTool; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*--  Hardness=100 又は Pencilモード のときのGeometricToolのUndo --*/
Shinya Kitaoka 120a6e
class UndoRasterPencil : public TRasterUndo {
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  TStroke *m_stroke;
Shinya Kitaoka 120a6e
  bool m_selective, m_filled, m_doAntialias;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*-- HistoryにPrimitive名を表示するため --*/
Shinya Kitaoka 120a6e
  std::string m_primitiveName;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoRasterPencil(TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
                   TStroke *stroke, bool selective, bool filled,
Shinya Kitaoka 120a6e
                   bool doAntialias, bool createdFrame, bool createdLevel,
Shinya Kitaoka 120a6e
                   std::string primitiveName);
Shinya Kitaoka 120a6e
  ~UndoRasterPencil();
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  QString getToolName() override {
Shinya Kitaoka 120a6e
    return QString("Geometric Tool : %1")
Shinya Kitaoka 120a6e
        .arg(QString::fromStdString(m_primitiveName));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::GeometricTool; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class UndoFullColorPencil : public TFullColorRasterUndo {
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 120a6e
  TStroke *m_stroke;
Shinya Kitaoka 120a6e
  double m_opacity;
Shinya Kitaoka 120a6e
  bool m_doAntialias;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoFullColorPencil(TXshSimpleLevel *level, const TFrameId &frameId,
Shinya Kitaoka 120a6e
                      TStroke *stroke, double opacity, bool doAntialias,
Shinya Kitaoka 120a6e
                      bool createdFrame, bool createdLevel);
Shinya Kitaoka 120a6e
  ~UndoFullColorPencil();
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Shinya Kitaoka 473e70
  QString getToolName() override { return QString("Geometric Tool"); }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::GeometricTool; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// undo class (path strokes). call it BEFORE and register it AFTER path change
Toshihiro Shimizu 890ddd
//
Shinya Kitaoka 120a6e
class UndoPath : public TUndo {
Shinya Kitaoka 120a6e
  TStageObjectSpline *m_spline;
Shinya Kitaoka 120a6e
  std::vector<tthickpoint> m_before, m_after;</tthickpoint>
Shinya Kitaoka 120a6e
  bool m_selfLoopBefore;
Shinya Kitaoka 120a6e
  // TStroke *m_before;
Shinya Kitaoka 120a6e
  // TStroke *m_after;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoPath(TStageObjectSpline *spline);
Shinya Kitaoka 120a6e
  ~UndoPath();
Shinya Kitaoka 473e70
  void onAdd() override;
Shinya Kitaoka 473e70
  void undo() const override;
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 473e70
  int getSize() const override;
Shinya Kitaoka 473e70
  QString getHistoryString() override { return QObject::tr("Modify Spline"); }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::ControlPointEditorTool; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// UndoControlPointEditor
Toshihiro Shimizu 890ddd
//
Shinya Kitaoka 120a6e
class UndoControlPointEditor : public TToolUndo {
Shinya Kitaoka 120a6e
  std::pair<int, *="" vistroke=""> m_oldStroke;</int,>
Shinya Kitaoka 120a6e
  std::pair<int, *="" vistroke=""> m_newStroke;</int,>
Shinya Kitaoka 120a6e
  bool m_isStrokeDelete;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int m_row;
Shinya Kitaoka 120a6e
  int m_column;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  UndoControlPointEditor(TXshSimpleLevel *level, const TFrameId &frameId);
Shinya Kitaoka 120a6e
  ~UndoControlPointEditor();
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void onAdd() override;
Shinya Kitaoka 120a6e
  void addOldStroke(int index, VIStroke *vs);
Shinya Kitaoka 120a6e
  void addNewStroke(int index, VIStroke *vs);
Shinya Kitaoka 120a6e
  void isStrokeDelete(bool isStrokeDelete) {
Shinya Kitaoka 120a6e
    m_isStrokeDelete = isStrokeDelete;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  void undo() const override;
Shinya Kitaoka 473e70
  void redo() const override;
Shinya Kitaoka 120a6e
Shinya Kitaoka 473e70
  int getSize() const override {
Shinya Kitaoka 120a6e
    return sizeof(*this) +
Shinya Kitaoka 120a6e
           /*(m_oldFillInformation.capacity()+m_newFillInformation.capacity())*sizeof(TFilledRegionInf) +*/
Shinya Kitaoka 120a6e
           500;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 473e70
Shinya Kitaoka 473e70
  QString getToolName() override { return QString("Control Point Editor"); }
Shinya Kitaoka 473e70
  int getHistoryType() override { return HistoryType::ControlPointEditorTool; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// DragMenu
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class DragMenu : public QMenu {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  DragMenu();
Shinya Kitaoka 120a6e
  QAction *exec(const QPoint &p, QAction *action = 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
protected:
Shinya Kitaoka 473e70
  void mouseReleaseEvent(QMouseEvent *e) override;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// ChooseColumnMenu
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class ColumChooserMenu : public DragMenu {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  ColumChooserMenu(TXsheet *xsh, const std::vector<int> &columnIndexes);</int>
Shinya Kitaoka 120a6e
  int execute();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class ConeSubVolume {
Shinya Kitaoka 120a6e
  const static double m_values[21];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  ConeSubVolume() {}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // calcola il sottovolume di un cono di raggio e volume unitario in base
Shinya Kitaoka 120a6e
  static double compute(double cover);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! Return the right value in both case: LevelFrame and SceneFrame.
Toshihiro Shimizu 890ddd
TFrameId DVAPI getFrameId();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Shinya Kitaoka 120a6e
    The following functions set the specified (or current) level frame as edited
Shinya Kitaoka 120a6e
   (ie to be saved),
Toshihiro Shimizu 890ddd
    and, in the colormap case, update the associated savebox.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    The 'Minimize Savebox after Editing' preference is used to determine if the
Shinya Kitaoka 120a6e
   savebox has to be
Toshihiro Shimizu 890ddd
    shrunk to the image's bounding box or include the previous savebox.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DVAPI updateSaveBox(const TXshSimpleLevelP &sl, const TFrameId &fid);
Shinya Kitaoka 120a6e
void DVAPI updateSaveBox(const TXshSimpleLevelP &sl, const TFrameId &fid,
Shinya Kitaoka 120a6e
                         TImageP img);
Toshihiro Shimizu 890ddd
void DVAPI updateSaveBox();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool DVAPI isJustCreatedSpline(TImage *image);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TRectD DVAPI interpolateRect(const TRectD &rect1, const TRectD &rect2,
Shinya Kitaoka 120a6e
                             double t);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// bool DVAPI isASubRegion(int reg, const vector<tregion*> ®ions);</tregion*>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! Returns a TRectD that contains all points in \b points
Shinya Kitaoka 120a6e
//! If \b maxThickness is not zero, the TRectD is computed using this value.
Shinya Kitaoka 120a6e
TRectD DVAPI getBounds(const std::vector<tthickpoint> &points,</tthickpoint>
Shinya Kitaoka 120a6e
                       double maxThickness = 0);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! Ritorna un raster uguale a quello dato ma ruotato di 90 gradi
Shinya Kitaoka 120a6e
//! Il parametro toRight indica se si sta ruotando a destra o a sinistra!
Toshihiro Shimizu 890ddd
template <typename pixel=""></typename>
Shinya Kitaoka 120a6e
TRasterPT<pixel> rotate90(const TRasterPT<pixel> &ras, bool toRight) {</pixel></pixel>
Shinya Kitaoka 120a6e
  if (!ras) return TRasterPT<pixel>(0);</pixel>
Shinya Kitaoka 120a6e
  int lx = ras->getLy();
Shinya Kitaoka 120a6e
  int ly = ras->getLx();
Shinya Kitaoka 120a6e
  TRasterPT<pixel> workRas(lx, ly);</pixel>
Shinya Kitaoka 120a6e
  for (int i = 0; i < ras->getLx(); i++) {
Shinya Kitaoka 120a6e
    for (int j = 0; j < ras->getLy(); j++) {
Shinya Kitaoka 120a6e
      if (toRight)
Shinya Kitaoka 120a6e
        workRas->pixels(ly - 1 - i)[j] = ras->pixels(j)[i];
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        workRas->pixels(i)[lx - 1 - j] = ras->pixels(j)[i];
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return workRas;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace ToolUtils
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // TOOLSUTILS_H