Revision: 6176
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6176&view=rev
Author: mdboom
Date: 2008-10-10 16:51:04 +0000 (Fri, 10 Oct 2008)
Log Message:
-----------
Simplify and remove redundant code.
Modified Paths:
--------------
trunk/matplotlib/src/agg_py_path_iterator.h
Modified: trunk/matplotlib/src/agg_py_path_iterator.h
===================================================================
--- trunk/matplotlib/src/agg_py_path_iterator.h 2008-10-09 11:37:01 UTC (rev
6175)
+++ trunk/matplotlib/src/agg_py_path_iterator.h 2008-10-10 16:51:04 UTC (rev
6176)
@@ -145,20 +145,20 @@
m_haveMin(false), m_lastMax(false), m_maxX(0.0), m_maxY(0.0),
m_minX(0.0), m_minY(0.0), m_lastWrittenX(0.0), m_lastWrittenY(0.0),
m_done(false)
-#if DEBUG_SIMPLIFY
- , m_pushed(0), m_skipped(0)
-#endif
+ #if DEBUG_SIMPLIFY
+ , m_pushed(0), m_skipped(0)
+ #endif
{
// empty
}
-#if DEBUG_SIMPLIFY
- ~SimplifyPath()
- {
- if (m_simplify)
- printf("%d %d\n", m_pushed, m_skipped);
- }
-#endif
+ #if DEBUG_SIMPLIFY
+ ~SimplifyPath()
+ {
+ if (m_simplify)
+ printf("%d %d\n", m_pushed, m_skipped);
+ }
+ #endif
void rewind(unsigned path_id)
{
@@ -198,30 +198,18 @@
// will be popped from the queue in subsequent calls. The following
// block will empty the queue before proceeding to the main loop below.
// -- Michael Droettboom
- if (m_queue_read < m_queue_write)
- {
- const item& front = m_queue[m_queue_read++];
- unsigned cmd = front.cmd;
- *x = front.x;
- *y = front.y;
-#if DEBUG_SIMPLIFY
- printf((cmd == agg::path_cmd_move_to) ? "|" : "-");
- printf(" 1 %f %f\n", *x, *y);
-#endif
+ if (flush_queue(&cmd, x, y)) {
return cmd;
}
- m_queue_read = 0;
- m_queue_write = 0;
-
// If the queue is now empty, and the path was fully consumed
// in the last call to the main loop, return agg::path_cmd_stop to
// signal that there are no more points to emit.
if (m_done)
{
-#if DEBUG_SIMPLIFY
- printf(".\n");
-#endif
+ #if DEBUG_SIMPLIFY
+ printf(".\n");
+ #endif
return agg::path_cmd_stop;
}
@@ -242,16 +230,16 @@
//if we are starting a new path segment, move to the first point
// + init
-#if DEBUG_SIMPLIFY
- printf("x, y, code: %f, %f, %d\n", *x, *y, cmd);
-#endif
+ #if DEBUG_SIMPLIFY
+ printf("x, y, code: %f, %f, %d\n", *x, *y, cmd);
+ #endif
if (m_moveto || cmd == agg::path_cmd_move_to)
{
// m_moveto check is not generally needed because
// m_source generates an initial moveto; but it
// is retained for safety in case circumstances
// arise where this is not true.
- if (m_origdNorm2 && !m_after_moveto)
+ if (m_origdNorm2 != 0.0 && !m_after_moveto)
{
// m_origdNorm2 is nonzero only if we have a vector;
// the m_after_moveto check ensures we push this
@@ -267,7 +255,7 @@
// line segment, hence a break in the line, just
// like clipping, so we treat it the same way.
m_clipped = true;
- if (m_queue_read < m_queue_write)
+ if (queue_nonempty())
{
// If we did a push, empty the queue now.
break;
@@ -279,9 +267,9 @@
// Don't render line segments less than one pixel long
if (fabs(*x - m_lastx) < 1.0 && fabs(*y - m_lasty) < 1.0)
{
-#if DEBUG_SIMPLIFY
- m_skipped++;
-#endif
+ #if DEBUG_SIMPLIFY
+ m_skipped++;
+ #endif
continue;
}
@@ -296,9 +284,9 @@
m_lastx = *x;
m_lasty = *y;
m_clipped = true;
-#if DEBUG_SIMPLIFY
- m_skipped++;
-#endif
+ #if DEBUG_SIMPLIFY
+ m_skipped++;
+ #endif
continue;
}
@@ -307,11 +295,11 @@
// this orig vector is the reference vector we will build
// up the line to
- if (m_origdNorm2 == 0)
+ if (m_origdNorm2 == 0.0)
{
if (m_clipped)
{
- m_queue[m_queue_write++].set(agg::path_cmd_move_to,
m_lastx, m_lasty);
+ queue_push(agg::path_cmd_move_to, m_lastx, m_lasty);
m_clipped = false;
}
@@ -329,9 +317,9 @@
m_lasty = m_maxY = *y;
m_lastWrittenX = m_minX = m_lastx;
m_lastWrittenY = m_minY = m_lasty;
-#if DEBUG_SIMPLIFY
- m_skipped++;
-#endif
+ #if DEBUG_SIMPLIFY
+ m_skipped++;
+ #endif
continue;
}
@@ -395,9 +383,9 @@
m_lastx = *x;
m_lasty = *y;
-#if DEBUG_SIMPLIFY
- m_skipped++;
-#endif
+ #if DEBUG_SIMPLIFY
+ m_skipped++;
+ #endif
continue;
}
//if we get here, then this vector was not similar enough to the
@@ -422,33 +410,23 @@
{
if (m_haveMin)
{
- m_queue[m_queue_write++].set(agg::path_cmd_line_to,
m_minX, m_minY);
+ queue_push(agg::path_cmd_line_to, m_minX, m_minY);
}
- m_queue[m_queue_write++].set(agg::path_cmd_line_to, m_maxX,
m_maxY);
+ queue_push(agg::path_cmd_line_to, m_maxX, m_maxY);
}
m_done = true;
}
// Return the first item in the queue, if any, otherwise
// indicate that we're done.
- if (m_queue_read < m_queue_write)
- {
- const item& front = m_queue[m_queue_read++];
- unsigned cmd = front.cmd;
- *x = front.x;
- *y = front.y;
-#if DEBUG_SIMPLIFY
- printf((cmd == agg::path_cmd_move_to) ? "|" : "-");
- printf(" 3 %f %f\n", *x, *y);
-
-#endif
+ if (flush_queue(&cmd, x, y)) {
return cmd;
}
else
{
-#if DEBUG_SIMPLIFY
- printf(".\n");
-#endif
+ #if DEBUG_SIMPLIFY
+ printf(".\n");
+ #endif
return agg::path_cmd_stop;
}
}
@@ -459,6 +437,7 @@
bool m_simplify;
double m_width, m_height;
+ static const int m_queue_size = 6;
struct item
{
item() {}
@@ -474,7 +453,7 @@
};
int m_queue_read;
int m_queue_write;
- item m_queue[6];
+ item m_queue[m_queue_size];
bool m_moveto;
bool m_after_moveto;
@@ -497,23 +476,65 @@
double m_lastWrittenY;
bool m_done;
-#if DEBUG_SIMPLIFY
- unsigned m_pushed;
- unsigned m_skipped;
-#endif
+ #if DEBUG_SIMPLIFY
+ unsigned m_pushed;
+ unsigned m_skipped;
+ #endif
- void _push(double* x, double* y)
+ inline void queue_push(const unsigned cmd, const double& x, const double&
y)
{
+ #if DEBUG_SIMPLIFY
+ if (m_queue_write >= m_queue_size)
+ throw "Simplification queue overflow";
+ #endif
+ m_queue[m_queue_write++].set(cmd, x, y);
+ }
+
+ inline bool queue_nonempty()
+ {
+ return m_queue_read < m_queue_write;
+ }
+
+ inline bool flush_queue(unsigned *cmd, double *x, double *y)
+ {
+ if (!queue_nonempty())
+ {
+ #if DEBUG_SIMPLIFY
+ if (m_queue_read >= m_queue_size)
+ throw "Simplification queue overflow";
+ #endif
+
+ const item& front = m_queue[m_queue_read++];
+ *cmd = front.cmd;
+ *x = front.x;
+ *y = front.y;
+
+ #if DEBUG_SIMPLIFY
+ printf((cmd == agg::path_cmd_move_to) ? "|" : "-");
+ printf(" 1 %f %f\n", *x, *y);
+ #endif
+
+ return true;
+ }
+
+ m_queue_read = 0;
+ m_queue_write = 0;
+
+ return false;
+ }
+
+ inline void _push(double* x, double* y)
+ {
if (m_haveMin)
{
- m_queue[m_queue_write++].set(agg::path_cmd_line_to, m_minX,
m_minY);
+ queue_push(agg::path_cmd_line_to, m_minX, m_minY);
}
- m_queue[m_queue_write++].set(agg::path_cmd_line_to, m_maxX, m_maxY);
+ queue_push(agg::path_cmd_line_to, m_maxX, m_maxY);
//if we clipped some segments between this line and the next line
//we are starting, we also need to move to the last point.
if (m_clipped) {
- m_queue[m_queue_write++].set(agg::path_cmd_move_to, m_lastx,
m_lasty);
+ queue_push(agg::path_cmd_move_to, m_lastx, m_lasty);
}
else if (!m_lastMax)
{
@@ -523,7 +544,7 @@
//the line just drawn.
//Would be move_to if not for the artifacts
- m_queue[m_queue_write++].set(agg::path_cmd_line_to, m_lastx,
m_lasty);
+ queue_push(agg::path_cmd_line_to, m_lastx, m_lasty);
}
//now reset all the variables to get ready for the next line
@@ -544,7 +565,6 @@
#if DEBUG_SIMPLIFY
m_pushed += m_queue_write - m_queue_read;
#endif
-
}
};
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins