39#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
40#include <glibmm/datetime.h>
61 SECONDARY_DIAGONAL = 1
64 typedef std::pair<PixelGraph::const_iterator, PixelGraph::const_iterator>
66 typedef std::pair<Edge, int> EdgeWeight;
68 void operator()(
const PixelGraph &graph,
unsigned radius);
71 const guint8 (&a)[4],
const guint8 (&b)[4]);
76 EdgeWeight diagonals[2];
84 return to_voronoi(Gdk::Pixbuf::create_from_file(filename), options);
90#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
92 = _voronoi<Precision, false>(
buf, options);
94 Glib::DateTime profiling_info[2];
95 profiling_info[0] = Glib::DateTime::create_now_utc();
99 profiling_info[1] = Glib::DateTime::create_now_utc();
100 std::cerr <<
"Tracer::Splines construction time: "
101 << profiling_info[1].difference(profiling_info[0])
106 return Splines(_voronoi<Precision, false>(
buf, options));
119#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
121 = _voronoi<Precision, false>(
buf, options);
123 Glib::DateTime profiling_info[2];
124 profiling_info[0] = Glib::DateTime::create_now_utc();
133#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
134 profiling_info[1] = Glib::DateTime::create_now_utc();
135 std::cerr <<
"Tracer::HomogeneousSplines<" <<
typeid(
Precision).
name()
136 <<
">(Tracer::SimplifiedVoronoi<" <<
typeid(
Precision).
name()
137 <<
",false>) construction time: "
138 << profiling_info[1].difference(profiling_info[0])
140 profiling_info[0] = Glib::DateTime::create_now_utc();
144 end = splines.
end() ; it !=
end ; ++it ) {
146 it2 = it->vertices.begin(), end2 = it->vertices.end()
147 ; it2 != end2 ; ++it2 ) {
151 it2 = it->holes.begin(), end2 = it->holes.end()
152 ; it2 != end2 ; ++it2 ) {
154 it3 = it2->begin(), end3 = it2->end()
155 ; it3 != end3 ; ++it3 ) {
161#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
162 profiling_info[1] = Glib::DateTime::create_now_utc();
163 std::cerr <<
"Tracer::Kopf2011::to_grouped_voronoi internal work time: "
164 << profiling_info[1].difference(profiling_info[0])
166 profiling_info[0] = Glib::DateTime::create_now_utc();
170 profiling_info[1] = Glib::DateTime::create_now_utc();
171 std::cerr <<
"Tracer::Splines construction time: "
172 << profiling_info[1].difference(profiling_info[0])
184 return to_splines(Gdk::Pixbuf::create_from_file(filename), options);
190#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
192 = _voronoi<Precision, true>(
buf, options);
194 Glib::DateTime profiling_info[2];
195 profiling_info[0] = Glib::DateTime::create_now_utc();
199 profiling_info[1] = Glib::DateTime::create_now_utc();
200 std::cerr <<
"Tracer::HomogeneousSplines<" <<
typeid(
Precision).
name()
201 <<
"> construction time: "
202 << profiling_info[1].difference(profiling_info[0])
205 profiling_info[0] = Glib::DateTime::create_now_utc();
209 profiling_info[1] = Glib::DateTime::create_now_utc();
210 std::cerr <<
"Tracer::Splines construction time: "
211 << profiling_info[1].difference(profiling_info[0])
222template<
class T,
bool adjust_splines>
227#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
228 Glib::DateTime profiling_info[2];
229 profiling_info[0] = Glib::DateTime::create_now_utc();
234#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
235 profiling_info[1] = Glib::DateTime::create_now_utc();
236 std::cerr <<
"Tracer::PixelGraph creation time: "
237 << profiling_info[1].difference(profiling_info[0]) << std::endl;
242 assert(graph.
width() > 0);
243 assert(graph.
height() > 0);
249#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
250 profiling_info[0] = Glib::DateTime::create_now_utc();
257#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
258 profiling_info[1] = Glib::DateTime::create_now_utc();
259 std::cerr <<
"Tracer::PixelGraph::connectAllNeighbors() time: "
260 << profiling_info[1].difference(profiling_info[0]) << std::endl;
267#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
268 profiling_info[0] = Glib::DateTime::create_now_utc();
275#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
276 profiling_info[1] = Glib::DateTime::create_now_utc();
277 std::cerr <<
"Tracer::Kopf2011::"
278 "_disconnect_neighbors_with_dissimilar_colors(Tracer::PixelGraph) time: "
279 << profiling_info[1].difference(profiling_info[0]) << std::endl;
286#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
287 profiling_info[0] = Glib::DateTime::create_now_utc();
296#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
297 profiling_info[1] = Glib::DateTime::create_now_utc();
298 std::cerr <<
"Tracer::PixelGraph::crossingEdges() time: "
299 << profiling_info[1].difference(profiling_info[0]) << std::endl;
300 profiling_info[0] = Glib::DateTime::create_now_utc();
305#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
306 profiling_info[1] = Glib::DateTime::create_now_utc();
307 std::cerr <<
"Tracer::Kopf2011::_remove_crossing_edges_safe"
308 "(Tracer::PixelGraph) time: "
309 << profiling_info[1].difference(profiling_info[0])
317#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
318 profiling_info[0] = Glib::DateTime::create_now_utc();
324#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
325 profiling_info[1] = Glib::DateTime::create_now_utc();
326 std::cerr <<
"Tracer::Kopf2011::_remove_crossing_edges_unsafe"
327 "(Tracer::PixelGraph) time: "
328 << profiling_info[1].difference(profiling_info[0]) << std::endl;
337#ifdef LIBDEPIXELIZE_PROFILE_KOPF2011
338 profiling_info[0] = Glib::DateTime::create_now_utc();
342 profiling_info[1] = Glib::DateTime::create_now_utc();
343 std::cerr <<
"Tracer::SimplifiedVoronoi<" <<
typeid(T).
name() <<
','
344 << (adjust_splines ?
"true" :
"false")
345 <<
">(Tracer::PixelGraph) construction time: "
346 << profiling_info[1].difference(profiling_info[0]) << std::endl;
362 it->adj.top = similar_colors(it->rgba, (it - graph.
width())->rgba);
363 if ( it->adj.topright ) {
365 = similar_colors(it->rgba, (it - graph.
width() + 1)->rgba);
368 it->adj.right = similar_colors(it->rgba, (it + 1)->rgba);
369 if ( it->adj.bottomright ) {
371 = similar_colors(it->rgba, (it + graph.
width() + 1)->rgba);
373 if ( it->adj.bottom ) {
375 = similar_colors(it->rgba, (it + graph.
width())->rgba);
377 if ( it->adj.bottomleft ) {
379 = similar_colors(it->rgba, (it + graph.
width() - 1)->rgba);
382 it->adj.left = similar_colors(it->rgba, (it - 1)->rgba);
383 if ( it->adj.topleft ) {
384 it->adj.topleft = similar_colors(it->rgba,
385 (it - graph.
width() - 1)->rgba);
399 for (
typename T::reverse_iterator it = container.rbegin(),
400 end = container.rend() ; it !=
end ; ) {
409 if ( !a->adj.right || !a->adj.bottom || !b->adj.bottom
416 a->adj.bottomright = 0;
420 b->adj.bottomleft = 0;
424 typename T::iterator
current = --(it.base());
437 std::vector< std::pair<int, int> > weights(
edges.size(),
438 std::make_pair(0, 0));
441 for (
typename T::size_type i = 0 ; i !=
edges.size() ; ++i ) {
461 using Heuristics::SparsePixels;
462 SparsePixels sparse_pixels;
464 sparse_pixels.diagonals[SparsePixels::MAIN_DIAGONAL].first
466 sparse_pixels.diagonals[SparsePixels::SECONDARY_DIAGONAL].first
472 += sparse_pixels.diagonals[SparsePixels::MAIN_DIAGONAL].second
475 += sparse_pixels.diagonals[SparsePixels::SECONDARY_DIAGONAL].second
480 for (
typename T::size_type i = 0 ; i !=
edges.size() ; ++i ) {
489 if ( weights[i].first > weights[i].second ) {
490 b->adj.bottomleft = 0;
492 }
else if ( weights[i].first < weights[i].second ) {
493 a->adj.bottomright = 0;
496 a->adj.bottomright = 0;
497 b->adj.bottomleft = 0;
516 for (
int i = 0 ; i != 2 ; ++i ) {
524 while ( it->adjsize() == 2 ) {
531 guintptr aux = (it->adj.top
537 + (it->adj.bottomright
541 + (it->adj.bottomleft
556 count += local_count;
562inline void Heuristics::SparsePixels::operator ()(
const PixelGraph &graph,
569 for (
int i = 0 ; i != 2 ; ++i )
570 diagonals[i].second = 0;
577 unsigned x = graph.
toX(diagonals[MAIN_DIAGONAL].first.first);
578 unsigned y = graph.
toY(diagonals[MAIN_DIAGONAL].first.first);
579 unsigned displace = radius - 1;
582 unsigned minor = std::min(x, y);
584 if ( displace > minor ) {
586 radius = displace + 1;
592 if ( x + displace >=
unsigned(graph.
width()) ) {
593 displace = unsigned(graph.
width()) - x - 1;
597 if ( y + displace >=
unsigned(graph.
height()) ) {
598 displace = unsigned(graph.
height()) - y - 1;
609 for (
unsigned i = radius - 1 ; i ; --i )
613 for (
unsigned i = 0 ; i != 2 * radius ; ++i ) {
614 for (
unsigned j = 0 ; j != 2 * radius ; ++j ) {
615 for (
int k = 0 ; k != 2 ; ++k ) {
618 diagonals[k].first.second->rgba);
630 int minor = std::min(diagonals[0].second, diagonals[1].second);
631 for (
int i = 0 ; i != 2 ; ++i )
632 diagonals[i].second -= minor;
633 std::swap(diagonals[0].second, diagonals[1].second);
638 const guint8 (&a)[4],
639 const guint8 (&b)[4])
648 if ( a->adjsize() == 1 || b->adjsize() == 1 )
std::vector< Polygon >::iterator iterator
static Splines to_splines(const std::string &filename, const Options &options=Options())
static Splines to_voronoi(const std::string &filename, const Options &options=Options())
static void _remove_crossing_edges_safe(T &container)
This method removes crossing edges if the 2x2 block is fully connected.
static void _disconnect_neighbors_with_dissimilar_colors(PixelGraph &graph)
static Splines to_grouped_voronoi(const std::string &filename, const Options &options=Options())
static SimplifiedVoronoi< T, adjust_splines > _voronoi(const Glib::RefPtr< Gdk::Pixbuf const > &buf, const Options &options)
static void _remove_crossing_edges_unsafe(PixelGraph &graph, T &edges, const Options &options)
This method removes crossing edges using the heuristics.
iterator nodeLeft(iterator n)
void connectAllNeighbors()
int toY(const_iterator n) const
std::vector< EdgePair > EdgePairContainer
EdgePairContainer crossingEdges()
std::vector< Node >::const_iterator const_iterator
iterator nodeTopLeft(iterator n)
iterator nodeBottomLeft(iterator n)
std::vector< Node >::iterator iterator
iterator nodeBottomRight(iterator n)
iterator nodeTopRight(iterator n)
iterator nodeRight(iterator n)
iterator nodeTop(iterator n)
iterator nodeBottom(iterator n)
int toX(const_iterator n) const
static char const *const current
bool islands(PixelGraph::const_iterator a, PixelGraph::const_iterator b)
int curves(const PixelGraph &graph, PixelGraph::const_iterator a, PixelGraph::const_iterator b)
bool similar_colors(const guint8 a[], const guint8 b[])
const T * to_ptr(typename std::vector< T >::const_iterator it)
Edges edges(Path const &p, Crossings const &cr, unsigned ix)
void invert(const double v[16], double alpha[16])
Points::iterator points_iter
std::vector< Points >::iterator holes_iter
double sparsePixelsMultiplier
unsigned sparsePixelsRadius