|
Shinya Kitaoka |
810553 |
// #pragma once // could not use by INCLUDE_HPP
|
|
Shinya Kitaoka |
810553 |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TROP_BORDERS_H
|
|
Toshihiro Shimizu |
890ddd |
#define TROP_BORDERS_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
262a92 |
#include <memory></memory>
|
|
Shinya Kitaoka |
262a92 |
|
|
Toshihiro Shimizu |
890ddd |
// TnzCore includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tsmartpointer.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tgeometry.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "traster.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "trastercm.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// tcg includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tcg_wrap.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcg/tcg_vertex.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcg/tcg_edge.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcg/tcg_face.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tcg/tcg_mesh.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TRop::borders includes
|
|
Toshihiro Shimizu |
890ddd |
#include "../common/trop/pixelselectors.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "../common/trop/raster_edge_iterator.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "../common/trop/borders_extractor.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#undef DVAPI
|
|
Toshihiro Shimizu |
890ddd |
#undef DVVAR
|
|
Toshihiro Shimizu |
890ddd |
#ifdef TROP_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 |
The TRop::borders namespace contains functions and classes that perform
|
|
Toshihiro Shimizu |
890ddd |
contours extraction of a specified raster (either greyscale, fullcolor
|
|
Toshihiro Shimizu |
890ddd |
or colormap).
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
Image contours are currently extracted in a not-hierarchycal fashion
|
|
Toshihiro Shimizu |
890ddd |
(ie in succession) and supplied through a reimplementable reader class.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
//==============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace TRop {
|
|
Shinya Kitaoka |
120a6e |
namespace borders {
|
|
Toshihiro Shimizu |
890ddd |
|
|
|
2fc36c |
// Standard type instantiations
|
|
|
2fc36c |
|
|
|
2fc36c |
template class DVAPI RasterEdgeIterator<pixelselector<tpixel32>>;</pixelselector<tpixel32>
|
|
|
2fc36c |
template class DVAPI RasterEdgeIterator<pixelselector<tpixel64>>;</pixelselector<tpixel64>
|
|
|
2fc36c |
template class DVAPI RasterEdgeIterator<pixelselector<tpixelgr8>>;</pixelselector<tpixelgr8>
|
|
|
2fc36c |
template class DVAPI RasterEdgeIterator<pixelselector<tpixelgr16>>;</pixelselector<tpixelgr16>
|
|
|
2fc36c |
template class DVAPI RasterEdgeIterator<pixelselector<tpixelcm32>>;</pixelselector<tpixelcm32>
|
|
|
2fc36c |
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Borders Extraction Reader (callbacks container)
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
The BordersReader class defines the supported callbacks fired from the
|
|
Toshihiro Shimizu |
890ddd |
borders extraction routines.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
class DVAPI BordersReader {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
virtual void openContainer(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 &innerColor,
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void openContainer(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixel64 &innerColor,
|
|
Shinya Kitaoka |
120a6e |
const TPixel64 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void openContainer(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR8 &innerColor,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR8 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void openContainer(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR16 &innerColor,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR16 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void openContainer(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
TUINT32 innerColorIdx, TUINT32 outerColorIdx) {
|
|
Shinya Kitaoka |
120a6e |
} // colormap
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual void addElement(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void addElement(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixel64 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void addElement(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR8 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void addElement(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR16 &outerColor) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void addElement(const TPoint &pos, const TPoint &dir,
|
|
Shinya Kitaoka |
120a6e |
TUINT32 outerColorIdx) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual void closeContainer() {}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Borders Extraction functions
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Generic readBorders
|
|
Shinya Kitaoka |
120a6e |
void DVAPI readBorders_simple(const TRasterP &raster, BordersReader &reader,
|
|
Shinya Kitaoka |
120a6e |
bool onlyCorners = true);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Greymap readBorders with transparency color
|
|
Toshihiro Shimizu |
890ddd |
void DVAPI readBorders_simple(const TRasterGR8P &raster, BordersReader &reader,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR8 &transparencyColor,
|
|
Shinya Kitaoka |
120a6e |
bool onlyCorners = true);
|
|
Toshihiro Shimizu |
890ddd |
void DVAPI readBorders_simple(const TRasterGR16P &raster, BordersReader &reader,
|
|
Shinya Kitaoka |
120a6e |
const TPixelGR16 &transparencyColor,
|
|
Shinya Kitaoka |
120a6e |
bool onlyCorners = true);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
// Colormap readBorders with ink/paint antialias chooser
|
|
Toshihiro Shimizu |
890ddd |
void DVAPI readBorders_simple(const TRasterCM32P &raster, BordersReader &reader,
|
|
Shinya Kitaoka |
120a6e |
bool onlyCorners = true, int toneThreshold = 128);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Mesh Extraction (classes)
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
typedef tcg::Vertex<tpoint> Vertex;</tpoint>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class Edge final : public tcg::Edge {
|
|
Shinya Kitaoka |
120a6e |
TPoint m_directions[2];
|
|
Shinya Kitaoka |
120a6e |
int m_imageIndex;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
const TPoint &direction(int i) const { return m_directions[i]; }
|
|
Shinya Kitaoka |
120a6e |
TPoint &direction(int i) { return m_directions[i]; }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
//! The edge index in the overall image extraction procedure. This value can
|
|
Shinya Kitaoka |
120a6e |
//! be used to
|
|
Shinya Kitaoka |
120a6e |
//! univocally associate external data to an image edge.
|
|
Shinya Kitaoka |
120a6e |
int imageIndex() const { return m_imageIndex; }
|
|
Shinya Kitaoka |
120a6e |
int &imageIndex() { return m_imageIndex; }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class Face final : public tcg::Face {
|
|
Shinya Kitaoka |
120a6e |
tcg::list<int> m_meshes;</int>
|
|
Shinya Kitaoka |
120a6e |
int m_imageIndex;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
const tcg::list<int> &meshes() const { return m_meshes; }</int>
|
|
Shinya Kitaoka |
120a6e |
tcg::list<int> &meshes() { return m_meshes; }</int>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int meshesCount() const { return m_meshes.size(); }
|
|
Shinya Kitaoka |
120a6e |
int mesh(int m) const { return m_meshes[m]; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
//! The face index in the overall image extraction procedure. This value can
|
|
Shinya Kitaoka |
120a6e |
//! be used to
|
|
Shinya Kitaoka |
120a6e |
//! univocally associate external data to an image face.
|
|
Shinya Kitaoka |
120a6e |
int imageIndex() const { return m_imageIndex; }
|
|
Shinya Kitaoka |
120a6e |
int &imageIndex() { return m_imageIndex; }
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class ImageMesh final : public TSmartObject,
|
|
Shinya Kitaoka |
d1f6c4 |
public tcg::Mesh<vertex, edge,="" face=""> {};</vertex,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------
|
|
|
2fc36c |
}
|
|
|
2fc36c |
} // namespace TRop::borders
|
|
|
2fc36c |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
|
2fc36c |
template class DVAPI TSmartPointerT<trop::borders::imagemesh>;</trop::borders::imagemesh>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
|
2fc36c |
|
|
|
2fc36c |
namespace TRop {
|
|
|
2fc36c |
namespace borders {
|
|
|
2fc36c |
|
|
Toshihiro Shimizu |
890ddd |
typedef TSmartPointerT<imagemesh> ImageMeshP;</imagemesh>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Mesh Extraction (reader)
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DVAPI ImageMeshesReader {
|
|
Shinya Kitaoka |
120a6e |
class Imp;
|
|
Shinya Kitaoka |
120a6e |
std::unique_ptr<imp> m_imp;</imp>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReader();
|
|
Shinya Kitaoka |
120a6e |
virtual ~ImageMeshesReader();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const Face &outerFace() const;
|
|
Shinya Kitaoka |
120a6e |
Face &outerFace();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const tcg::list<imagemeshp> &meshes() const;</imagemeshp>
|
|
Shinya Kitaoka |
120a6e |
tcg::list<imagemeshp> &meshes();</imagemeshp>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void clear();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
// Face reader functions. Nested meshes are stored by default in a
|
|
Shinya Kitaoka |
120a6e |
// global list of meshes retrievable with the meshes() accessor.
|
|
Shinya Kitaoka |
120a6e |
// Each Mesh Face will be filled with the list of its sub-meshes in
|
|
Shinya Kitaoka |
120a6e |
// the form of indices to the global list.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void openFace(ImageMesh *mesh, int faceIdx);
|
|
Shinya Kitaoka |
120a6e |
void addMesh(ImageMesh *mesh);
|
|
Shinya Kitaoka |
120a6e |
void closeFace();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
void closeEdge(ImageMesh *mesh, int edgeIdx);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
// Not implemented
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReader(const ImageMeshesReader &);
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReader &operator=(const ImageMeshesReader &);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//--------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename pixel=""></typename>
|
|
Shinya Kitaoka |
120a6e |
class ImageMeshesReaderT : public ImageMeshesReader {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
typedef PixelSelector<pixel> pixel_selector_type;</pixel>
|
|
Shinya Kitaoka |
120a6e |
typedef typename pixel_selector_type::value_type value_type;
|
|
Shinya Kitaoka |
120a6e |
typedef RasterEdgeIterator<pixel_selector_type> raster_edge_iterator;</pixel_selector_type>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
pixel_selector_type m_selector;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReaderT() : m_selector(false) {}
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReaderT(const pixel_selector_type &selector)
|
|
Shinya Kitaoka |
120a6e |
: m_selector(selector) {}
|
|
Shinya Kitaoka |
120a6e |
~ImageMeshesReaderT() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
const pixel_selector_type &pixelSelector() const { return m_selector; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
virtual void openFace(ImageMesh *mesh, int faceIdx,
|
|
Shinya Kitaoka |
120a6e |
const value_type &colorValue) {
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReader::openFace(mesh, faceIdx);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
virtual void addMesh(ImageMesh *mesh) { ImageMeshesReader::addMesh(mesh); }
|
|
Shinya Kitaoka |
120a6e |
virtual void closeFace() { ImageMeshesReader::closeFace(); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
// Edge reader functions. Edges are not stored by default.
|
|
Shinya Kitaoka |
120a6e |
// Users should reimplement these methods to store or process edge
|
|
Shinya Kitaoka |
120a6e |
// data for the required purpose.
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
virtual void openEdge(const raster_edge_iterator &it) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void addVertex(const raster_edge_iterator &it) {}
|
|
Shinya Kitaoka |
120a6e |
virtual void closeEdge(ImageMesh *mesh, int edgeIdx) {
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReader::closeEdge(mesh, edgeIdx);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Mesh Extraction (functions)
|
|
Toshihiro Shimizu |
890ddd |
//**********************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename pixel=""></typename>
|
|
Shinya Kitaoka |
120a6e |
void readMeshes(const TRasterPT<pixel> &raster,</pixel>
|
|
Shinya Kitaoka |
120a6e |
ImageMeshesReaderT<pixel> &reader);</pixel>
|
|
|
2fc36c |
|
|
|
2fc36c |
//--------------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Shinya Kitaoka |
120a6e |
} // namespace TRop::borders
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
#endif // TROP_BORDERS_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef INCLUDE_HPP
|
|
Toshihiro Shimizu |
890ddd |
#include "../common/trop/borders_extractor.hpp"
|
|
Toshihiro Shimizu |
890ddd |
#include "../common/trop/raster_edge_iterator.hpp"
|
|
Toshihiro Shimizu |
890ddd |
#endif
|