|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Shinya Kitaoka |
810553 |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TVECTORIMAGE_INCLUDED
|
|
Toshihiro Shimizu |
890ddd |
#define TVECTORIMAGE_INCLUDED
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
262a92 |
#include <memory></memory>
|
|
Shinya Kitaoka |
262a92 |
|
|
Toshihiro Shimizu |
890ddd |
#include "timage.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// da togliere spostando cose in altri file!!
|
|
Toshihiro Shimizu |
890ddd |
#include "traster.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstream.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <set></set>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#undef DVAPI
|
|
Toshihiro Shimizu |
890ddd |
#undef DVVAR
|
|
Toshihiro Shimizu |
890ddd |
#ifdef TVECTORIMAGE_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 |
|
|
Shinya Kitaoka |
6f0974 |
//#define NEW_REGION_FILL
|
|
Toshihiro Shimizu |
890ddd |
#define DISEGNO_OUTLINE 0
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// Forward declarations
|
|
Toshihiro Shimizu |
890ddd |
class TVectorImageP;
|
|
Toshihiro Shimizu |
890ddd |
class TStroke;
|
|
Toshihiro Shimizu |
890ddd |
class TRegion;
|
|
Toshihiro Shimizu |
890ddd |
class TRegionId;
|
|
Toshihiro Shimizu |
890ddd |
class TColorStyle;
|
|
Toshihiro Shimizu |
890ddd |
class TVectorRenderData;
|
|
Toshihiro Shimizu |
890ddd |
class TRegionId;
|
|
Toshihiro Shimizu |
890ddd |
class TFilledRegionInf;
|
|
Shinya Kitaoka |
120a6e |
namespace TThread {
|
|
Toshihiro Shimizu |
890ddd |
class Mutex;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#define REGION_COMPUTING_PRECISION 128.0
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const double c_newAutocloseTolerance = 1.15;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
class VIStroke;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
TVectorImage: describe a vector image.
|
|
Toshihiro Shimizu |
890ddd |
A vector image is a set of strokes and regions.
|
|
Toshihiro Shimizu |
890ddd |
\relates TImage
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
d1f6c4 |
class DVAPI TVectorImage final : public TImage {
|
|
Shinya Kitaoka |
120a6e |
class Imp;
|
|
Shinya Kitaoka |
120a6e |
int pickGroup(const TPointD &pos, bool onEnteredGroup) const;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
std::unique_ptr<imp> m_imp;</imp>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
struct IntersectionBranch {
|
|
Shinya Kitaoka |
120a6e |
int m_strokeIndex;
|
|
Shinya Kitaoka |
120a6e |
int m_style;
|
|
Shinya Kitaoka |
120a6e |
double m_w;
|
|
Shinya Kitaoka |
120a6e |
UINT m_currInter;
|
|
Shinya Kitaoka |
120a6e |
UINT m_nextBranch;
|
|
Shinya Kitaoka |
120a6e |
bool m_gettingOut;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
//! if the vectorimage is loaded from disc, loaded=true
|
|
Shinya Kitaoka |
120a6e |
TVectorImage(bool loaded = false);
|
|
Shinya Kitaoka |
120a6e |
virtual ~TVectorImage();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
TImage::Type getType() const override { return VECTOR; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*!Set valid regions flags
|
|
Shinya Kitaoka |
120a6e |
call validateRegions() after region/stroke changes
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
void validateRegions(bool state = false);
|
|
Shinya Kitaoka |
120a6e |
//! Get valid regions flags
|
|
Shinya Kitaoka |
120a6e |
/*! Call validateRegions() after region/stroke changes
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
bool areValidRegions();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return a clone of image
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP clone() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Create a new \b TImage
|
|
Shinya Kitaoka |
473e70 |
TImage *cloneImage() const override;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Transform a stroke using an affine \b TAffine
|
|
Shinya Kitaoka |
120a6e |
void transform(const TAffine &aff, bool doChangeThickness = false);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// usato solo in pli
|
|
Shinya Kitaoka |
120a6e |
//! Put a region in the regions' container
|
|
Shinya Kitaoka |
120a6e |
void putRegion(TRegion *region);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return the regions' count
|
|
Shinya Kitaoka |
120a6e |
UINT getRegionCount() const;
|
|
Shinya Kitaoka |
120a6e |
//! Get a region at index position
|
|
Shinya Kitaoka |
120a6e |
TRegion *getRegion(UINT index) const;
|
|
Shinya Kitaoka |
120a6e |
//! Get a region at \b TRegionId id
|
|
Shinya Kitaoka |
120a6e |
TRegion *getRegion(TRegionId) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! returns the region equivalent to region, 0 if does not exists.
|
|
Shinya Kitaoka |
120a6e |
TRegion *findRegion(const TRegion ®ion) const;
|
|
Shinya Kitaoka |
120a6e |
// calcola tutte le regioni che intersecano rect(e qualcuna in piu' a
|
|
Shinya Kitaoka |
120a6e |
// volte...)
|
|
Shinya Kitaoka |
120a6e |
void findRegions(const TRectD &rect);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return the strokes' count
|
|
Shinya Kitaoka |
120a6e |
UINT getStrokeCount() const;
|
|
Shinya Kitaoka |
120a6e |
//! Get a \b TStroke stroke at index position
|
|
Shinya Kitaoka |
120a6e |
TStroke *getStroke(UINT index) const;
|
|
Shinya Kitaoka |
120a6e |
//! Get a \b VIStroke stroke at index position
|
|
Shinya Kitaoka |
120a6e |
VIStroke *getVIStroke(UINT index) const;
|
|
Shinya Kitaoka |
120a6e |
//! Get a \b VIStroke stroke at id
|
|
Shinya Kitaoka |
120a6e |
VIStroke *getStrokeById(int id) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Get the stroke index by id
|
|
Shinya Kitaoka |
120a6e |
int getStrokeIndexById(int id) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Get the stroke index by id
|
|
Shinya Kitaoka |
120a6e |
int getStrokeIndex(TStroke *stroke) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Group strokes in the \b fromIndex - \b toIndex range
|
|
Shinya Kitaoka |
120a6e |
/*! Only adjacent strokes can be grouped*/
|
|
Shinya Kitaoka |
120a6e |
void group(int fromIndex, int count);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Ungroup all the strokes in the group of index \b index.
|
|
Shinya Kitaoka |
120a6e |
/*! Return the number of ungroped stroke.*/
|
|
Shinya Kitaoka |
120a6e |
int ungroup(int index);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool isStrokeGrouped(UINT index) const { return getGroupDepth(index) > 0; }
|
|
Shinya Kitaoka |
120a6e |
//! Return a value grater of zero if stroke of index \b index is contained in
|
|
Shinya Kitaoka |
120a6e |
//! a group
|
|
Shinya Kitaoka |
120a6e |
/*! The returned number is the depth of the nested group containing the
|
|
Shinya Kitaoka |
120a6e |
* stroke.*/
|
|
Shinya Kitaoka |
120a6e |
int getGroupDepth(UINT index) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! it says if two strokes are in the same group, even qhen the image is
|
|
Shinya Kitaoka |
120a6e |
//! entered in a group.
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool sameSubGroup(int strokeIndex0, int strokeIndex1) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int getCommonGroupDepth(int strokeIndex0, int strokeIndex1) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return -1 if two object are contained in the same group.
|
|
Shinya Kitaoka |
120a6e |
/*! Objects can be strokes or regions: they are identified by \b index1 and \b
|
|
Shinya Kitaoka |
120a6e |
index2.
|
|
Shinya Kitaoka |
120a6e |
If objects aren't in the same group, the method return the number of
|
|
Shinya Kitaoka |
120a6e |
equal level into the nested groups.*/
|
|
Shinya Kitaoka |
120a6e |
int areDifferentGroup(UINT index1, bool isRegion1, UINT index2,
|
|
Shinya Kitaoka |
120a6e |
bool isRegion2) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// utility functions
|
|
Shinya Kitaoka |
120a6e |
//! Return true if two strokes has common parent groups.
|
|
Shinya Kitaoka |
120a6e |
bool sameParentGroupStrokes(UINT index1, UINT index2) const {
|
|
Shinya Kitaoka |
120a6e |
int ret = areDifferentGroup(index1, false, index2, false);
|
|
Shinya Kitaoka |
120a6e |
return (ret == -1 || ret >= 1);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//! Return true if two objects are contained into the same group.
|
|
Shinya Kitaoka |
120a6e |
bool sameGroup(UINT index1, UINT index2) const {
|
|
Shinya Kitaoka |
120a6e |
return areDifferentGroup(index1, false, index2, false) == -1;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//! Return true if a stroke and a region have common parent groups.
|
|
Shinya Kitaoka |
120a6e |
bool sameGroupStrokeAndRegion(UINT strokeIndex, UINT regionIndex) const {
|
|
Shinya Kitaoka |
120a6e |
return areDifferentGroup(strokeIndex, false, regionIndex, true) == -1;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// entering and exiting groups
|
|
Shinya Kitaoka |
120a6e |
bool inCurrentGroup(int strokeIndex) const;
|
|
Shinya Kitaoka |
120a6e |
bool canEnterGroup(int strokeIndex) const;
|
|
Shinya Kitaoka |
120a6e |
bool selectable(int strokeIndex) const;
|
|
Shinya Kitaoka |
120a6e |
bool enterGroup(int index);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// return -1 if no possible to exit, otherwise a stroke index which has same
|
|
Shinya Kitaoka |
120a6e |
// id of the exiting group
|
|
Shinya Kitaoka |
120a6e |
int exitGroup();
|
|
Shinya Kitaoka |
120a6e |
bool isEnteredGroupStroke(int index) const;
|
|
Shinya Kitaoka |
120a6e |
bool canMoveStrokes(int strokeIndex, int count, int moveBefore) const;
|
|
Shinya Kitaoka |
120a6e |
// returns depth of group inside.
|
|
Shinya Kitaoka |
120a6e |
int isInsideGroup() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int pickGroup(const TPointD &pos) const;
|
|
Shinya Kitaoka |
120a6e |
int getGroupByStroke(UINT index) const;
|
|
Shinya Kitaoka |
120a6e |
int getGroupByRegion(UINT index) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*!
|
|
Shinya Kitaoka |
120a6e |
get the stroke nearest at point
|
|
Shinya Kitaoka |
120a6e |
\note outw is stroke parameter w in [0,1]
|
|
Shinya Kitaoka |
120a6e |
\par p [input] is point nearest stroke
|
|
Shinya Kitaoka |
120a6e |
\par outw [output] is parameter of minimum in stroke
|
|
Shinya Kitaoka |
120a6e |
\par strokeIndex [output] is index of stroke in vector image
|
|
Shinya Kitaoka |
120a6e |
\par dist2 [output] is the square value of distance
|
|
Shinya Kitaoka |
120a6e |
\ret true if a value is found
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
bool getNearestStroke(const TPointD &p,
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// output
|
|
Shinya Kitaoka |
120a6e |
double &outw, UINT &strokeIndex, double &dist2,
|
|
Shinya Kitaoka |
120a6e |
bool inCurrentGroup = true) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Enable or disable the style of a stroke according to the \b enable param.
|
|
Shinya Kitaoka |
120a6e |
static void enableStrokeStyle(int index, bool enable);
|
|
Shinya Kitaoka |
120a6e |
//! Return true if the style of the stroke identified by \b index is enabled.
|
|
Shinya Kitaoka |
120a6e |
static bool isStrokeStyleEnabled(int index);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Remove the stroke of index \b index and if \b doComputeRegions is true
|
|
Shinya Kitaoka |
120a6e |
//! recompute the regions
|
|
Shinya Kitaoka |
120a6e |
TStroke *removeStroke(int index, bool doComputeRegions = true);
|
|
Shinya Kitaoka |
120a6e |
//! Remove the strokes identified by indexes in the vector \b toBeRemoved
|
|
Shinya Kitaoka |
120a6e |
/*! If \b deleteThem is true strokes are really delete;
|
|
Shinya Kitaoka |
120a6e |
if \b doComputeRegions is true recompute the regions*/
|
|
Shinya Kitaoka |
120a6e |
void removeStrokes(const std::vector<int> &tobeRemoved, bool deleteThem,</int>
|
|
Shinya Kitaoka |
120a6e |
bool recomputeRegions);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Delete the \b TStroke stroke of index \b index
|
|
Shinya Kitaoka |
120a6e |
void deleteStroke(int index);
|
|
Shinya Kitaoka |
120a6e |
//! Delete the \b VIStroke stroke
|
|
Shinya Kitaoka |
120a6e |
void deleteStroke(VIStroke *stroke);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Add a stroke at the end of the vector; returns position of the stroke (or
|
|
Shinya Kitaoka |
120a6e |
//! -1 if not added)
|
|
Shinya Kitaoka |
120a6e |
int addStroke(TStroke *, bool discardPoints = true);
|
|
Shinya Kitaoka |
120a6e |
int addStrokeToGroup(TStroke *stroke, int strokeIndex);
|
|
Shinya Kitaoka |
120a6e |
//! Replace the stroke at index \b index with \b newStroke
|
|
Shinya Kitaoka |
120a6e |
void replaceStroke(int index, TStroke *newStroke);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Insert a \b VIStroke \b vs at index \b strokeIndex
|
|
Shinya Kitaoka |
120a6e |
void insertStrokeAt(VIStroke *vs, int strokeIndex,
|
|
Shinya Kitaoka |
120a6e |
bool recomputeRegions = true); //! Move \b count strokes
|
|
Shinya Kitaoka |
120a6e |
//! starting from \b
|
|
Shinya Kitaoka |
120a6e |
//! fromIndex before the
|
|
Shinya Kitaoka |
120a6e |
//! stroke identified by
|
|
Shinya Kitaoka |
120a6e |
//! the \b moveBefore
|
|
Shinya Kitaoka |
120a6e |
//! index.
|
|
Shinya Kitaoka |
120a6e |
void moveStrokes(int fromIndex, int count, int moveBefore);
|
|
Shinya Kitaoka |
120a6e |
//! Find regions of a \b TVectorImage
|
|
Jeremy Bullock |
29ea81 |
void findRegions();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Gmt. VA TOLTO IL PRIMA POSSIBILE.
|
|
Toshihiro Shimizu |
890ddd |
// E' una pessima cosa rendere platform dependent l'interfaccia pubblica di una
|
|
Toshihiro Shimizu |
890ddd |
// classe cosi' importante come la VectorImage
|
|
Toshihiro Shimizu |
890ddd |
#if defined(LINUX) || defined(MACOSX)
|
|
Shinya Kitaoka |
120a6e |
void render(const TVectorRenderData &rd, TRaster32P &ras);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! Make the rendering of the vector image, return a \b TRaster32P with the
|
|
Shinya Kitaoka |
120a6e |
//! image rendered
|
|
Shinya Kitaoka |
120a6e |
TRaster32P render(bool onlyStrokes);
|
|
Shinya Kitaoka |
120a6e |
//! Return the region which contains \b p, if none regions contains \b p
|
|
Shinya Kitaoka |
120a6e |
//! return 0
|
|
Shinya Kitaoka |
120a6e |
TRegion *getRegion(const TPointD &p);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Fill the region which contains \b p with \b styleId. it returns the style
|
|
Shinya Kitaoka |
120a6e |
//! of the region before filling or -1 if not filled.
|
|
Shinya Kitaoka |
120a6e |
int fill(const TPointD &p, int styleId, bool onlyEmpty = false);
|
|
Shinya Kitaoka |
120a6e |
//! Fill all the regions and strokes contained in \b selectArea or contained
|
|
Shinya Kitaoka |
120a6e |
//! into the regions formed by the stroke \b s with the style \b styleId.
|
|
Shinya Kitaoka |
120a6e |
/*! If \b onlyUnfilled is true, only regions filled with the style 0 are
|
|
Shinya Kitaoka |
120a6e |
filled with the new stile.
|
|
Shinya Kitaoka |
120a6e |
If \b fillAreas is true regions are filled.
|
|
Shinya Kitaoka |
120a6e |
If \b fillLines is true stroke are filled.*/
|
|
Shinya Kitaoka |
120a6e |
bool selectFill(const TRectD &selectArea, TStroke *s, int styleId,
|
|
Shinya Kitaoka |
120a6e |
bool onlyUnfilled, bool fillAreas, bool fillLines);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Fill all regions contained in the \b stroke area with \b styleIndex
|
|
Shinya Kitaoka |
120a6e |
void areaFill(TStroke *stroke, int styleIndex, bool onlyUnfilled);
|
|
Shinya Kitaoka |
120a6e |
//! Fill the stroke which contains \b p with \b newStyleId; it returns the
|
|
Shinya Kitaoka |
120a6e |
//! style of stroke before filling or -1 if not filled.
|
|
Shinya Kitaoka |
120a6e |
int fillStrokes(const TPointD &p, int newStyleId);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return true if \b computeRegion method was called
|
|
Shinya Kitaoka |
120a6e |
bool isComputedRegionAlmostOnce() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return the image bounding box in the image coordinate system
|
|
Shinya Kitaoka |
473e70 |
TRectD getBBox() const override;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Call the following method after stroke modification
|
|
Shinya Kitaoka |
120a6e |
//! \note you must specify, using the second argument, whether the
|
|
Shinya Kitaoka |
120a6e |
//! modification was a reflection
|
|
Shinya Kitaoka |
120a6e |
void notifyChangedStrokes(const std::vector<int> &strokeIndexArray,</int>
|
|
Shinya Kitaoka |
120a6e |
const std::vector<tstroke *=""> &oldStrokeArray,</tstroke>
|
|
Shinya Kitaoka |
120a6e |
bool areFlipped = false);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Call the following method after stroke modification
|
|
Shinya Kitaoka |
120a6e |
void notifyChangedStrokes(int strokeIndex, TStroke *oldStroke = 0,
|
|
Shinya Kitaoka |
120a6e |
bool isFlipped = false);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
UINT getFillData(std::unique_ptr<intersectionbranch[]> &v);</intersectionbranch[]>
|
|
Shinya Kitaoka |
120a6e |
void setFillData(std::unique_ptr<intersectionbranch[]> const &v, UINT size,</intersectionbranch[]>
|
|
Shinya Kitaoka |
120a6e |
bool doComputeRegions = true);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void drawAutocloses(const TVectorRenderData &rd) const; // debug method
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*! Includes a (transformed) copy of imgs in this. If setSelected==true then
|
|
Shinya Kitaoka |
120a6e |
selects imported strokes.
|
|
Shinya Kitaoka |
120a6e |
It also includes the color informations.
|
|
Shinya Kitaoka |
120a6e |
Try to assign the same stroke ids (if unused)
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
void enableRegionComputing(bool enabled, bool notIntersectingStrokes);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
/*! if enabled, region edges are joined together when possible. for flash
|
|
Shinya Kitaoka |
120a6e |
* render, should be disabled!
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
void enableMinimizeEdges(bool enabled);
|
|
Shinya Kitaoka |
120a6e |
/*! Creates a new Image using the selected strokes. If removeFlag==true then
|
|
Shinya Kitaoka |
120a6e |
removes selected strokes
|
|
Shinya Kitaoka |
120a6e |
It includes (in the new image) the color informations too.
|
|
Shinya Kitaoka |
120a6e |
It mantains stroke ids.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP splitSelected(bool removeFlag);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Merge the image with the \b img.
|
|
Shinya Kitaoka |
120a6e |
void mergeImage(const TVectorImageP &img, const TAffine &affine,
|
|
Shinya Kitaoka |
120a6e |
bool sameStrokeId = true);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void mergeImage(const TVectorImageP &img, const TAffine &affine,
|
|
Shinya Kitaoka |
120a6e |
const std::map<int, int=""> &styleTable,</int,>
|
|
Shinya Kitaoka |
120a6e |
bool sameStrokeId = true);
|
|
Shinya Kitaoka |
120a6e |
//! Merge the image with the vector of image \b images.
|
|
Shinya Kitaoka |
120a6e |
void mergeImage(const std::vector<const *="" tvectorimage=""> &images);</const>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Insert the \b TVectorImageP \b img
|
|
Shinya Kitaoka |
120a6e |
void insertImage(const TVectorImageP &img,
|
|
Shinya Kitaoka |
120a6e |
const std::vector<int> &dstIndices);</int>
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP splitImage(const std::vector<int> &indices, bool removeFlag);</int>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Return the used styles in the image
|
|
Shinya Kitaoka |
120a6e |
void getUsedStyles(std::set<int> &styles) const;</int>
|
|
Shinya Kitaoka |
120a6e |
//! Reassign all stroke's style
|
|
Shinya Kitaoka |
120a6e |
void reassignStyles(std::map<int, int=""> &table);</int,>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Transfer the stroke style of the \b sourceStroke in the \b sourceImage to
|
|
Shinya Kitaoka |
120a6e |
//! the style
|
|
Shinya Kitaoka |
120a6e |
static void transferStrokeColors(TVectorImageP sourceImage, int sourceStroke,
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP destinationImage,
|
|
Shinya Kitaoka |
120a6e |
int destinationStroke);
|
|
Shinya Kitaoka |
120a6e |
//! Set the edges of the stroke identified by \b strokeIndex with the styles
|
|
Shinya Kitaoka |
120a6e |
//! \b leftColorIndex and \brightColorIndex.
|
|
Shinya Kitaoka |
120a6e |
void setEdgeColors(int strokeIndex, int leftColorIndex, int rightColorIndex);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*! This functions splits stroke with index 'strokeIndex' in n+1 strokes,
|
|
Shinya Kitaoka |
120a6e |
where n is the size of vector sortedW,
|
|
Shinya Kitaoka |
120a6e |
cutting it in points w specified in sortedW. SortedW must be sorted in
|
|
Shinya Kitaoka |
120a6e |
ascending order.
|
|
Shinya Kitaoka |
120a6e |
Resulting strokes are put in VectorImage in position
|
|
Shinya Kitaoka |
120a6e |
strokeIndex,strokeIndex+1, ... strokeIndex+n.
|
|
Shinya Kitaoka |
120a6e |
Information on fill colors are maintened, as much as possible. */
|
|
Shinya Kitaoka |
120a6e |
void splitStroke(int strokeIndex,
|
|
Shinya Kitaoka |
120a6e |
const std::vector<doublepair> &sortedWRanges);</doublepair>
|
|
Shinya Kitaoka |
120a6e |
VIStroke *joinStroke(int index1, int index2, int cpIndex1, int cpIndex2,
|
|
Shinya Kitaoka |
120a6e |
bool isSmooth);
|
|
Shinya Kitaoka |
120a6e |
VIStroke *extendStroke(int index, const TThickPoint &p, int cpIndex,
|
|
Shinya Kitaoka |
120a6e |
bool isSmooth);
|
|
Shinya Kitaoka |
120a6e |
/*! this method removes the parts of the stroke that are not bounds of
|
|
Shinya Kitaoka |
120a6e |
regions. only ending parts are removed.
|
|
Shinya Kitaoka |
120a6e |
If the entire stroke is not bounding any region, it is kept entitely.
|
|
Shinya Kitaoka |
120a6e |
it returns the original stroke (for undo)*/
|
|
Shinya Kitaoka |
120a6e |
TStroke *removeEndpoints(int strokeIndex);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*! this method replaces the stroke at index with oldstroke. Oldstroke is
|
|
Shinya Kitaoka |
120a6e |
supposed to contain
|
|
Shinya Kitaoka |
120a6e |
existing stroke. this method is used for undoing removeEndpoints . */
|
|
Shinya Kitaoka |
120a6e |
void restoreEndpoints(int index, TStroke *oldStroke);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! Set the autoclose tolerance to the specified value.
|
|
Shinya Kitaoka |
120a6e |
void setAutocloseTolerance(double val);
|
|
Shinya Kitaoka |
120a6e |
//! Return the autoclose tolerance.
|
|
Shinya Kitaoka |
120a6e |
double getAutocloseTolerance() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! forces the recomputing of all regions (it is actually done only after
|
|
Shinya Kitaoka |
120a6e |
//! having loaded the vectorimage)
|
|
Shinya Kitaoka |
120a6e |
void recomputeRegionsIfNeeded();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*! Remove all image strokes and all image regions with style index contained
|
|
Shinya Kitaoka |
120a6e |
* in \b styleIds vector.*/
|
|
Shinya Kitaoka |
120a6e |
void eraseStyleIds(const std::vector<int> styleIds);</int>
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TThread::Mutex *getMutex() const;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef _DEBUG
|
|
Shinya Kitaoka |
120a6e |
void checkIntersections();
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void computeRegion(const TPointD &p, int styleId);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
6f0974 |
#ifdef NEW_REGION_FILL
|
|
Shinya Kitaoka |
120a6e |
void resetRegionFinder();
|
|
Shinya Kitaoka |
6f0974 |
#endif
|
|
Shinya Kitaoka |
6f0974 |
|
|
Shinya Kitaoka |
120a6e |
private: // not implemented
|
|
Shinya Kitaoka |
120a6e |
TVectorImage(const TVectorImage &);
|
|
Shinya Kitaoka |
120a6e |
TVectorImage &operator=(const TVectorImage &);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
DVAPI VIStroke *cloneVIStroke(VIStroke *vs);
|
|
Toshihiro Shimizu |
890ddd |
DVAPI void deleteVIStroke(VIStroke *vs);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
DVAPI void getClosingPoints(const TRectD &rect, double fac,
|
|
Shinya Kitaoka |
120a6e |
const TVectorImageP &vi,
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::pair<int, double="">> &startPoints,</std::pair<int,>
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::pair<int, double="">> &endPoints);</std::pair<int,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
template class DVAPI TSmartPointerT<tvectorimage>;</tvectorimage>
|
|
Toshihiro Shimizu |
890ddd |
template class DVAPI TDerivedSmartPointerT<tvectorimage, timage="">;</tvectorimage,>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DVAPI TVectorImageP final
|
|
Shinya Kitaoka |
d1f6c4 |
: public TDerivedSmartPointerT<tvectorimage, timage=""> {</tvectorimage,>
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP() {}
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP(TVectorImage *image) : DerivedSmartPointer(image) {}
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP(TImageP image) : DerivedSmartPointer(image) {}
|
|
Shinya Kitaoka |
9f5a1b |
#if !defined(_WIN32)
|
|
Shinya Kitaoka |
120a6e |
TVectorImageP(TImage *image) : DerivedSmartPointer(TImageP(image)) {}
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Shinya Kitaoka |
120a6e |
operator TImageP() { return TImageP(m_pointer); }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// GMT: DA TOGLIERE. vedi sopra
|
|
Toshihiro Shimizu |
890ddd |
#ifdef LINUX
|
|
Shinya Kitaoka |
120a6e |
DVAPI void hardRenderVectorImage(const TVectorRenderData &rd, TRaster32P &r,
|
|
Shinya Kitaoka |
120a6e |
const TVectorImageP &vimg);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TInputStreamInterface {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TInputStreamInterface() {}
|
|
Shinya Kitaoka |
120a6e |
virtual ~TInputStreamInterface() {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(double &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(int &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(std::string &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(UCHAR &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(USHORT &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(TRaster32P &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TInputStreamInterface &operator>>(TPixel32 &pixel);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual VersionNumber versionNumber() const { return VersionNumber(); }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI TOutputStreamInterface {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
TOutputStreamInterface() {}
|
|
Shinya Kitaoka |
120a6e |
virtual ~TOutputStreamInterface() {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(double) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(int) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(std::string) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(UCHAR) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(USHORT) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(const TRaster32P &) = 0;
|
|
Shinya Kitaoka |
120a6e |
virtual TOutputStreamInterface &operator<<(const TPixel32 &pixel);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#if DISEGNO_OUTLINE == 1
|
|
Toshihiro Shimizu |
890ddd |
extern int CurrStrokeIndex;
|
|
Toshihiro Shimizu |
890ddd |
#include "tvectorimage.h"
|
|
Toshihiro Shimizu |
890ddd |
extern const TVectorImage *CurrVimg;
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
#ifndef DISEGNO_OUTLINE
|
|
Toshihiro Shimizu |
890ddd |
*&^&%^^$%&^%$(^(
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif
|