Revision: 6865
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6865&view=rev
Author: mdboom
Date: 2009-02-02 16:29:37 +0000 (Mon, 02 Feb 2009)
Log Message:
-----------
Create path_cleanup code for use by the Mac OS-X backend. Refactor C++ code to
follow Numpy's guidelines for linking multiple C files into a single extension.
Remove dependency of Agg backend on _image.cpp and _ft2font.cpp (simplifies
linking problems and reduces generated code size).
Modified Paths:
--------------
trunk/matplotlib/lib/matplotlib/delaunay/VoronoiDiagramGenerator.cpp
trunk/matplotlib/setupext.py
trunk/matplotlib/src/_backend_agg.cpp
trunk/matplotlib/src/_backend_gdk.c
trunk/matplotlib/src/_gtkagg.cpp
trunk/matplotlib/src/_image.cpp
trunk/matplotlib/src/_image.h
trunk/matplotlib/src/_path.cpp
trunk/matplotlib/src/agg_py_path_iterator.h
trunk/matplotlib/src/agg_py_transforms.h
trunk/matplotlib/src/ft2font.cpp
trunk/matplotlib/src/numerix.h
trunk/matplotlib/src/path_converters.h
Added Paths:
-----------
trunk/matplotlib/src/agg_py_transforms.cpp
trunk/matplotlib/src/path_cleanup.cpp
trunk/matplotlib/src/path_cleanup.h
Modified: trunk/matplotlib/lib/matplotlib/delaunay/VoronoiDiagramGenerator.cpp
===================================================================
--- trunk/matplotlib/lib/matplotlib/delaunay/VoronoiDiagramGenerator.cpp
2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/lib/matplotlib/delaunay/VoronoiDiagramGenerator.cpp
2009-02-02 16:29:37 UTC (rev 6865)
@@ -12,9 +12,9 @@
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
*/
-/*
- * This code was originally written by Stephan Fortune in C code. Shane
O'Sullivan,
- * have since modified it, encapsulating it in a C++ class and, fixing memory
leaks and
+/*
+ * This code was originally written by Stephan Fortune in C code. Shane
O'Sullivan,
+ * have since modified it, encapsulating it in a C++ class and, fixing memory
leaks and
* adding accessors to the Voronoi Edges.
* Permission to use, copy, modify, and distribute this software for any
* purpose without fee is hereby granted, provided that this entire notice
@@ -26,13 +26,17 @@
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
* OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
*/
-
+
/*
* Subsequently, Robert Kern modified it to yield Python objects.
* Copyright 2005 Robert Kern <[email protected]>
* See LICENSE.txt in the scipy source directory.
*/
+#include <Python.h>
+#define NO_IMPORT_ARRAY
+#include "numpy/arrayobject.h"
+
#include "VoronoiDiagramGenerator.h"
VoronoiDiagramGenerator::VoronoiDiagramGenerator()
@@ -74,9 +78,9 @@
nsites=numPoints;
plot = 0;
- triangulate = 0;
+ triangulate = 0;
debug = 1;
- sorted = 0;
+ sorted = 0;
freeinit(&sfl, sizeof (Site));
sites = (struct Site *) myalloc(nsites*sizeof( *sites));
@@ -108,9 +112,9 @@
//printf("\n%f %f\n",xValues[i],yValues[i]);
}
-
+
qsort(sites, nsites, sizeof (*sites), scomp);
-
+
siteidx = 0;
geominit();
double temp = 0;
@@ -130,9 +134,9 @@
borderMinY = minY;
borderMaxX = maxX;
borderMaxY = maxY;
-
- siteidx = 0;
+ siteidx = 0;
+
voronoi(triangulate);
return true;
@@ -187,25 +191,25 @@
struct Halfedge * VoronoiDiagramGenerator::ELgethash(int b)
{
struct Halfedge *he;
-
- if(b<0 || b>=ELhashsize)
+
+ if(b<0 || b>=ELhashsize)
return((struct Halfedge *) NULL);
- he = ELhash[b];
- if (he == (struct Halfedge *) NULL || he->ELedge != (struct Edge *)
DELETED )
+ he = ELhash[b];
+ if (he == (struct Halfedge *) NULL || he->ELedge != (struct Edge *)
DELETED )
return (he);
-
+
/* Hash table points to deleted half edge. Patch as necessary. */
ELhash[b] = (struct Halfedge *) NULL;
- if ((he -> ELrefcnt -= 1) == 0)
+ if ((he -> ELrefcnt -= 1) == 0)
makefree((Freenode*)he, &hfl);
return ((struct Halfedge *) NULL);
-}
+}
struct Halfedge * VoronoiDiagramGenerator::ELleftbnd(struct Point *p)
{
int i, bucket;
struct Halfedge *he;
-
+
/* Use hash table to get close to desired halfedge */
bucket = (int)((p->x - xmin)/deltax * ELhashsize); //use the hash
function to find the place in the hash map that this HalfEdge should be
@@ -214,12 +218,12 @@
he = ELgethash(bucket);
if(he == (struct Halfedge *) NULL) //if the HE isn't found,
search backwards and forwards in the hash map for the first non-null entry
- {
+ {
for(i=1; 1 ; i += 1)
- {
- if ((he=ELgethash(bucket-i)) != (struct Halfedge *) NULL)
+ {
+ if ((he=ELgethash(bucket-i)) != (struct Halfedge *) NULL)
break;
- if ((he=ELgethash(bucket+i)) != (struct Halfedge *) NULL)
+ if ((he=ELgethash(bucket+i)) != (struct Halfedge *) NULL)
break;
};
totalsearch += i;
@@ -228,22 +232,22 @@
/* Now search linear list of halfedges for the correct one */
if (he==ELleftend || (he != ELrightend && right_of(he,p)))
{
- do
+ do
{
he = he -> ELright;
} while (he!=ELrightend && right_of(he,p)); //keep going right on
the list until either the end is reached, or you find the 1st edge which the
point
he = he -> ELleft; //isn't to the right of
}
else //if the point is to the left of the
HalfEdge, then search left for the HE just to the left of the point
- do
+ do
{
he = he -> ELleft;
} while (he!=ELleftend && !right_of(he,p));
-
+
/* Update hash table and reference counts */
if(bucket > 0 && bucket <ELhashsize-1)
- {
- if(ELhash[bucket] != (struct Halfedge *) NULL)
+ {
+ if(ELhash[bucket] != (struct Halfedge *) NULL)
{
ELhash[bucket] -> ELrefcnt -= 1;
}
@@ -277,9 +281,9 @@
struct Site * VoronoiDiagramGenerator::leftreg(struct Halfedge *he)
{
- if(he -> ELedge == (struct Edge *)NULL)
+ if(he -> ELedge == (struct Edge *)NULL)
return(bottomsite);
- return( he -> ELpm == le ?
+ return( he -> ELpm == le ?
he -> ELedge -> reg[le] : he -> ELedge -> reg[re]);
}
@@ -293,7 +297,7 @@
}
void VoronoiDiagramGenerator::geominit()
-{
+{
double sn;
freeinit(&efl, sizeof(Edge));
@@ -309,17 +313,17 @@
struct Edge * VoronoiDiagramGenerator::bisect(struct Site *s1, struct Site *s2)
{
double dx,dy,adx,ady;
- struct Edge *newedge;
+ struct Edge *newedge;
newedge = (struct Edge *) getfree(&efl);
-
+
newedge -> reg[0] = s1; //store the sites that this edge is bisecting
newedge -> reg[1] = s2;
- ref(s1);
+ ref(s1);
ref(s2);
newedge -> ep[0] = (struct Site *) NULL; //to begin with, there are no
endpoints on the bisector - it goes to infinity
newedge -> ep[1] = (struct Site *) NULL;
-
+
dx = s2->coord.x - s1->coord.x; //get the difference in x dist
between the sites
dy = s2->coord.y - s1->coord.y;
adx = dx>0 ? dx : -dx; //make sure that the difference
in positive
@@ -327,18 +331,18 @@
newedge -> c = (double)(s1->coord.x * dx + s1->coord.y * dy + (dx*dx +
dy*dy)*0.5);//get the slope of the line
if (adx>ady)
- {
+ {
newedge -> a = 1.0; newedge -> b = dy/dx; newedge -> c /= dx;//set
formula of line, with x fixed to 1
}
else
- {
+ {
newedge -> b = 1.0; newedge -> a = dx/dy; newedge -> c /= dy;//set
formula of line, with y fixed to 1
};
-
+
newedge -> edgenbr = nedges;
//printf("\nbisect(%d) ((%f,%f) and
(%f,%f)",nedges,s1->coord.x,s1->coord.y,s2->coord.x,s2->coord.y);
-
+
nedges += 1;
return(newedge);
}
@@ -351,40 +355,40 @@
double d, xint, yint;
int right_of_site;
struct Site *v;
-
+
e1 = el1 -> ELedge;
e2 = el2 -> ELedge;
- if(e1 == (struct Edge*)NULL || e2 == (struct Edge*)NULL)
+ if(e1 == (struct Edge*)NULL || e2 == (struct Edge*)NULL)
return ((struct Site *) NULL);
//if the two edges bisect the same parent, return null
- if (e1->reg[1] == e2->reg[1])
+ if (e1->reg[1] == e2->reg[1])
return ((struct Site *) NULL);
-
+
d = e1->a * e2->b - e1->b * e2->a;
- if (-1.0e-10<d && d<1.0e-10)
+ if (-1.0e-10<d && d<1.0e-10)
return ((struct Site *) NULL);
-
+
xint = (e1->c*e2->b - e2->c*e1->b)/d;
yint = (e2->c*e1->a - e1->c*e2->a)/d;
-
+
if( (e1->reg[1]->coord.y < e2->reg[1]->coord.y) ||
(e1->reg[1]->coord.y == e2->reg[1]->coord.y &&
e1->reg[1]->coord.x < e2->reg[1]->coord.x) )
- {
- el = el1;
+ {
+ el = el1;
e = e1;
}
else
- {
- el = el2;
+ {
+ el = el2;
e = e2;
};
-
+
right_of_site = xint >= e -> reg[1] -> coord.x;
- if ((right_of_site && el -> ELpm == le) || (!right_of_site && el -> ELpm
== re))
+ if ((right_of_site && el -> ELpm == le) || (!right_of_site && el -> ELpm
== re))
return ((struct Site *) NULL);
-
+
//create a new site at the point of intersection - this is a new vector
event waiting to happen
v = (struct Site *) getfree(&sfl);
v -> refcnt = 0;
@@ -400,22 +404,22 @@
struct Site *topsite;
int right_of_site, above, fast;
double dxp, dyp, dxs, t1, t2, t3, yl;
-
+
e = el -> ELedge;
topsite = e -> reg[1];
right_of_site = p -> x > topsite -> coord.x;
if(right_of_site && el -> ELpm == le) return(1);
if(!right_of_site && el -> ELpm == re) return (0);
-
+
if (e->a == 1.0)
{ dyp = p->y - topsite->coord.y;
dxp = p->x - topsite->coord.x;
fast = 0;
if ((!right_of_site & (e->b<0.0)) | (right_of_site & (e->b>=0.0)) )
- { above = dyp>= e->b*dxp;
+ { above = dyp>= e->b*dxp;
fast = above;
}
- else
+ else
{ above = p->x + p->y*e->b > e-> c;
if(e->b<0.0) above = !above;
if (!above) fast = 1;
@@ -442,7 +446,7 @@
{
e -> ep[lr] = s;
ref(s);
- if(e -> ep[re-lr]== (struct Site *) NULL)
+ if(e -> ep[re-lr]== (struct Site *) NULL)
return;
clip_line(e);
@@ -473,7 +477,7 @@
void VoronoiDiagramGenerator::deref(struct Site *v)
{
v -> refcnt -= 1;
- if (v -> refcnt == 0 )
+ if (v -> refcnt == 0 )
makefree((Freenode*)v, &sfl);
}
@@ -486,7 +490,7 @@
void VoronoiDiagramGenerator::PQinsert(struct Halfedge *he,struct Site * v,
double offset)
{
struct Halfedge *last, *next;
-
+
he -> vertex = v;
ref(v);
he -> ystar = (double)(v -> coord.y + offset);
@@ -494,23 +498,23 @@
while ((next = last -> PQnext) != (struct Halfedge *) NULL &&
(he -> ystar > next -> ystar ||
(he -> ystar == next -> ystar && v -> coord.x >
next->vertex->coord.x)))
- {
+ {
last = next;
};
- he -> PQnext = last -> PQnext;
+ he -> PQnext = last -> PQnext;
last -> PQnext = he;
PQcount += 1;
}
-//remove the HalfEdge from the list of vertices
+//remove the HalfEdge from the list of vertices
void VoronoiDiagramGenerator::PQdelete(struct Halfedge *he)
{
struct Halfedge *last;
-
+
if(he -> vertex != (struct Site *) NULL)
- {
+ {
last = &PQhash[PQbucket(he)];
- while (last -> PQnext != he)
+ while (last -> PQnext != he)
last = last -> PQnext;
last -> PQnext = he -> PQnext;
@@ -523,7 +527,7 @@
int VoronoiDiagramGenerator::PQbucket(struct Halfedge *he)
{
int bucket;
-
+
bucket = (int)((he->ystar - ymin)/deltay * PQhashsize);
if (bucket<0) bucket = 0;
if (bucket>=PQhashsize) bucket = PQhashsize-1 ;
@@ -542,7 +546,7 @@
struct Point VoronoiDiagramGenerator::PQ_min()
{
struct Point answer;
-
+
while(PQhash[PQmin].PQnext == (struct Halfedge *)NULL) {PQmin += 1;};
answer.x = PQhash[PQmin].PQnext -> vertex -> coord.x;
answer.y = PQhash[PQmin].PQnext -> ystar;
@@ -552,7 +556,7 @@
struct Halfedge * VoronoiDiagramGenerator::PQextractmin()
{
struct Halfedge *curr;
-
+
curr = PQhash[PQmin].PQnext;
PQhash[PQmin].PQnext = curr -> PQnext;
PQcount -= 1;
@@ -562,8 +566,8 @@
bool VoronoiDiagramGenerator::PQinitialize()
{
- int i;
-
+ int i;
+
PQcount = 0;
PQmin = 0;
PQhashsize = 4 * sqrt_nsites;
@@ -586,23 +590,23 @@
char * VoronoiDiagramGenerator::getfree(struct Freelist *fl)
{
- int i;
+ int i;
struct Freenode *t;
if(fl->head == (struct Freenode *) NULL)
- {
+ {
t = (struct Freenode *) myalloc(sqrt_nsites * fl->nodesize);
if(t == 0)
return 0;
-
+
currentMemoryBlock->next = new FreeNodeArrayList;
currentMemoryBlock = currentMemoryBlock->next;
currentMemoryBlock->memory = t;
currentMemoryBlock->next = 0;
- for(i=0; i<sqrt_nsites; i+=1)
- makefree((struct Freenode *)((char *)t+i*fl->nodesize), fl);
+ for(i=0; i<sqrt_nsites; i+=1)
+ makefree((struct Freenode *)((char *)t+i*fl->nodesize), fl);
};
t = fl -> head;
fl -> head = (fl -> head) -> nextfree;
@@ -721,7 +725,7 @@
char * VoronoiDiagramGenerator::myalloc(unsigned n)
{
- char *t=0;
+ char *t=0;
t=(char*)malloc(n);
total_alloc += n;
return(t);
@@ -732,7 +736,7 @@
/* #include <plot.h> */
void VoronoiDiagramGenerator::openpl(){}
void VoronoiDiagramGenerator::line(double x1, double y1, double x2, double y2)
-{
+{
pushGraphEdge(x1,y1,x2,y2);
}
@@ -743,20 +747,20 @@
void VoronoiDiagramGenerator::out_bisector(struct Edge *e)
{
-
+
}
void VoronoiDiagramGenerator::out_ep(struct Edge *e)
{
-
-
+
+
}
void VoronoiDiagramGenerator::out_vertex(struct Site *v)
{
-
+
}
@@ -764,13 +768,13 @@
{
if(!triangulate & plot & !debug)
circle (s->coord.x, s->coord.y, cradius);
-
+
}
void VoronoiDiagramGenerator::out_triple(struct Site *s1, struct Site
*s2,struct Site * s3)
{
-
+
}
@@ -778,7 +782,7 @@
void VoronoiDiagramGenerator::plotinit()
{
// double dx,dy,d;
-//
+//
// dy = ymax - ymin;
// dx = xmax - xmin;
// d = (double)(( dx > dy ? dx : dy) * 1.1);
@@ -804,7 +808,7 @@
// y1 = e->reg[0]->coord.y;
// y2 = e->reg[1]->coord.y;
//
-// //if the distance between the two points this line was created from is
less than
+// //if the distance between the two points this line was created from is
less than
// //the square root of 2, then ignore it
// if(sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))) <
minDistanceBetweenSites)
// {
@@ -816,16 +820,16 @@
// pymax = borderMaxY;
//
// if(e -> a == 1.0 && e ->b >= 0.0)
-// {
+// {
// s1 = e -> ep[1];
// s2 = e -> ep[0];
// }
-// else
+// else
// {
// s1 = e -> ep[0];
// s2 = e -> ep[1];
// };
-//
+//
// if(e -> a == 1.0)
// {
// y1 = pymin;
@@ -833,7 +837,7 @@
// {
// y1 = s1->coord.y;
// }
-// if(y1>pymax)
+// if(y1>pymax)
// {
// // printf("\nClipped (1) y1 = %f to %f",y1,pymax);
// y1 = pymax;
@@ -841,17 +845,17 @@
// }
// x1 = e -> c - e -> b * y1;
// y2 = pymax;
-// if (s2!=(struct Site *)NULL && s2->coord.y < pymax)
+// if (s2!=(struct Site *)NULL && s2->coord.y < pymax)
// y2 = s2->coord.y;
//
-// if(y2<pymin)
+// if(y2<pymin)
// {
// //printf("\nClipped (2) y2 = %f to %f",y2,pymin);
// y2 = pymin;
// //return;
// }
// x2 = (e->c) - (e->b) * y2;
-// if (((x1> pxmax) & (x2>pxmax)) | ((x1<pxmin)&(x2<pxmin)))
+// if (((x1> pxmax) & (x2>pxmax)) | ((x1<pxmin)&(x2<pxmin)))
// {
// //printf("\nClipLine jumping out(3), x1 = %f, pxmin = %f, pxmax
= %f",x1,pxmin,pxmax);
// return;
@@ -868,9 +872,9 @@
// else
// {
// x1 = pxmin;
-// if (s1!=(struct Site *)NULL && s1->coord.x > pxmin)
+// if (s1!=(struct Site *)NULL && s1->coord.x > pxmin)
// x1 = s1->coord.x;
-// if(x1>pxmax)
+// if(x1>pxmax)
// {
// //printf("\nClipped (3) x1 = %f to %f",x1,pxmin);
// //return;
@@ -878,16 +882,16 @@
// }
// y1 = e -> c - e -> a * x1;
// x2 = pxmax;
-// if (s2!=(struct Site *)NULL && s2->coord.x < pxmax)
+// if (s2!=(struct Site *)NULL && s2->coord.x < pxmax)
// x2 = s2->coord.x;
-// if(x2<pxmin)
+// if(x2<pxmin)
// {
// //printf("\nClipped (4) x2 = %f to %f",x2,pxmin);
// //return;
// x2 = pxmin;
// }
// y2 = e -> c - e -> a * x2;
-// if (((y1> pymax) & (y2>pymax)) | ((y1<pymin)&(y2<pymin)))
+// if (((y1> pymax) & (y2>pymax)) | ((y1<pymin)&(y2<pymin)))
// {
// //printf("\nClipLine jumping out(6), y1 = %f, pymin = %f, pymax
= %f",y2,pymin,pymax);
// return;
@@ -901,7 +905,7 @@
// if(y2<pymin)
// { y2 = pymin; x2 = (e -> c - y2)/e -> a;};
// };
-//
+//
// //printf("\nPushing line (%f,%f,%f,%f)",x1,y1,x2,y2);
// line(x1,y1,x2,y2);
}
@@ -920,7 +924,7 @@
int pm;
struct Halfedge *lbnd, *rbnd, *llbnd, *rrbnd, *bisector;
struct Edge *e;
-
+
PQinitialize();
bottomsite = nextone();
out_site(bottomsite);
@@ -928,16 +932,16 @@
if(!retval)
return false;
-
+
newsite = nextone();
while(1)
{
- if(!PQempty())
+ if(!PQempty())
newintstar = PQ_min();
-
+
//if the lowest site has a smaller y value than the lowest vector
intersection, process the site
- //otherwise process the vector intersection
+ //otherwise process the vector intersection
if (newsite != (struct Site *)NULL && (PQempty() || newsite ->
coord.y < newintstar.y
|| (newsite->coord.y == newintstar.y && newsite->coord.x <
newintstar.x)))
@@ -946,31 +950,31 @@
lbnd = ELleftbnd(&(newsite->coord)); //get the
first HalfEdge to the LEFT of the new site
rbnd = ELright(lbnd); //get the first
HalfEdge to the RIGHT of the new site
bot = rightreg(lbnd); //if this halfedge
has no edge, , bot = bottom site (whatever that is)
- e = bisect(bot, newsite); //create a new edge
that bisects
- bisector = HEcreate(e, le); //create a new
HalfEdge, setting its ELpm field to 0
- ELinsert(lbnd, bisector); //insert this new
bisector edge between the left and right vectors in a linked list
+ e = bisect(bot, newsite); //create a new edge
that bisects
+ bisector = HEcreate(e, le); //create a new
HalfEdge, setting its ELpm field to 0
+ ELinsert(lbnd, bisector); //insert this new
bisector edge between the left and right vectors in a linked list
if ((p = intersect(lbnd, bisector)) != (struct Site *) NULL)
//if the new bisector intersects with the left edge, remove the left edge's
vertex, and put in the new one
- {
+ {
PQdelete(lbnd);
PQinsert(lbnd, p, dist(p,newsite));
};
- lbnd = bisector;
+ lbnd = bisector;
bisector = HEcreate(e, re); //create a new
HalfEdge, setting its ELpm field to 1
ELinsert(lbnd, bisector); //insert the new HE
to the right of the original bisector earlier in the IF stmt
if ((p = intersect(bisector, rbnd)) != (struct Site *) NULL)
//if this new bisector intersects with the
- {
+ {
PQinsert(bisector, p, dist(p,newsite)); //push the
HE into the ordered linked list of vertices
};
- newsite = nextone();
+ newsite = nextone();
}
- else if (!PQempty()) /* intersection is smallest - this is a vector
event */
- {
- lbnd = PQextractmin(); //pop the HalfEdge
with the lowest vector off the ordered list of vectors
+ else if (!PQempty()) /* intersection is smallest - this is a vector
event */
+ {
+ lbnd = PQextractmin(); //pop the HalfEdge
with the lowest vector off the ordered list of vectors
llbnd = ELleft(lbnd); //get the HalfEdge to
the left of the above HE
rbnd = ELright(lbnd); //get the HalfEdge to
the right of the above HE
- rrbnd = ELright(rbnd); //get the HalfEdge
to the right of the HE to the right of the lowest HE
+ rrbnd = ELright(rbnd); //get the HalfEdge
to the right of the HE to the right of the lowest HE
bot = leftreg(lbnd); //get the Site to the
left of the left HE which it bisects
top = rightreg(rbnd); //get the Site to the
right of the right HE which it bisects
@@ -980,16 +984,16 @@
makevertex(v); //set the vertex number
- couldn't do this earlier since we didn't know when it would be processed
endpoint(lbnd->ELedge,lbnd->ELpm,v); //set the endpoint of the
left HalfEdge to be this vector
endpoint(rbnd->ELedge,rbnd->ELpm,v); //set the endpoint of the
right HalfEdge to be this vector
- ELdelete(lbnd); //mark the lowest HE
for deletion - can't delete yet because there might be pointers to it in Hash
Map
+ ELdelete(lbnd); //mark the lowest HE
for deletion - can't delete yet because there might be pointers to it in Hash
Map
PQdelete(rbnd); //remove all vertex
events to do with the right HE
- ELdelete(rbnd); //mark the right HE for
deletion - can't delete yet because there might be pointers to it in Hash Map
+ ELdelete(rbnd); //mark the right HE for
deletion - can't delete yet because there might be pointers to it in Hash Map
pm = le; //set the pm variable to
zero
-
+
if (bot->coord.y > top->coord.y) //if the site to the left
of the event is higher than the Site
{ //to the right of it,
then swap them and set the 'pm' variable to 1
- temp = bot;
- bot = top;
- top = temp;
+ temp = bot;
+ bot = top;
+ top = temp;
pm = re;
}
e = bisect(bot, top); //create an Edge (or
line) that is between the two Sites. This creates
@@ -1001,27 +1005,27 @@
//Site, then this endpoint
is put in position 0; otherwise in pos 1
deref(v); //delete the vector 'v'
- //if left HE and the new bisector don't intersect, then delete the
left HE, and reinsert it
+ //if left HE and the new bisector don't intersect, then delete the
left HE, and reinsert it
if((p = intersect(llbnd, bisector)) != (struct Site *) NULL)
- {
+ {
PQdelete(llbnd);
PQinsert(llbnd, p, dist(p,bot));
};
- //if right HE and the new bisector don't intersect, then reinsert
it
+ //if right HE and the new bisector don't intersect, then reinsert
it
if ((p = intersect(bisector, rrbnd)) != (struct Site *) NULL)
- {
+ {
PQinsert(bisector, p, dist(p,bot));
};
}
else break;
};
-
+
for(lbnd=ELright(ELleftend); lbnd != ELrightend; lbnd=ELright(lbnd))
- {
+ {
e = lbnd -> ELedge;
clip_line(e);
@@ -1031,7 +1035,7 @@
cleanup();
return true;
-
+
}
@@ -1050,16 +1054,16 @@
{
struct Site *s;
if(siteidx < nsites)
- {
+ {
s = &sites[siteidx];
siteidx += 1;
return(s);
}
- else
+ else
return( (struct Site *)NULL);
}
-bool VoronoiDiagramGenerator::getNextDelaunay(int& ep0, double& ep0x, double&
ep0y,
+bool VoronoiDiagramGenerator::getNextDelaunay(int& ep0, double& ep0x, double&
ep0y,
int& ep1, double& ep1x, double& ep1y,
int& reg0, int& reg1)
{
@@ -1076,7 +1080,7 @@
reg1 = iterEdgeList->reg1nbr;
iterEdgeList = iterEdgeList->next;
-
+
return true;
}
Modified: trunk/matplotlib/setupext.py
===================================================================
--- trunk/matplotlib/setupext.py 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/setupext.py 2009-02-02 16:29:37 UTC (rev 6865)
@@ -1079,7 +1079,8 @@
deps.extend(glob.glob('CXX/*.cxx'))
deps.extend(glob.glob('CXX/*.c'))
- module = Extension('matplotlib.ft2font', deps)
+ module = Extension('matplotlib.ft2font', deps,
+ define_macros=[('PY_ARRAYAUNIQUE_SYMBOL',
'MPL_ARRAY_API')])
add_ft2font_flags(module)
ext_modules.append(module)
BUILT_FT2FONT = True
@@ -1100,12 +1101,13 @@
def build_gtkagg(ext_modules, packages):
global BUILT_GTKAGG
if BUILT_GTKAGG: return # only build it if you you haven't already
- deps = ['src/_gtkagg.cpp', 'src/mplutils.cpp']#, 'src/_transforms.cpp']
+ deps = ['src/agg_py_transforms.cpp', 'src/_gtkagg.cpp', 'src/mplutils.cpp']
deps.extend(glob.glob('CXX/*.cxx'))
deps.extend(glob.glob('CXX/*.c'))
module = Extension('matplotlib.backends._gtkagg',
deps,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL',
'MPL_ARRAY_API')]
)
# add agg flags before pygtk because agg only supports freetype1
@@ -1164,6 +1166,7 @@
module = Extension('matplotlib.backends._macosx',
['src/_macosx.m'],
extra_link_args = ['-framework','Cocoa'],
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL',
'MPL_ARRAY_API')]
)
add_numpy_flags(module)
ext_modules.append(module)
@@ -1182,6 +1185,7 @@
'matplotlib._png',
deps,
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_png_flags(module)
@@ -1194,7 +1198,6 @@
global BUILT_AGG
if BUILT_AGG: return # only build it if you you haven't already
-
agg = (
'agg_trans_affine.cpp',
'agg_bezier_arc.cpp',
@@ -1204,22 +1207,20 @@
'agg_image_filters.cpp',
)
-
deps = ['%s/src/%s'%(AGG_VERSION, name) for name in agg]
- deps.extend(('src/_image.cpp', 'src/ft2font.cpp', 'src/mplutils.cpp'))
+ deps.extend(['src/mplutils.cpp', 'src/agg_py_transforms.cpp'])
deps.extend(glob.glob('CXX/*.cxx'))
deps.extend(glob.glob('CXX/*.c'))
-
temp_copy('src/_backend_agg.cpp', 'src/backend_agg.cpp')
deps.append('src/backend_agg.cpp')
module = Extension(
'matplotlib.backends._backend_agg',
deps,
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_numpy_flags(module)
-
add_agg_flags(module)
add_ft2font_flags(module)
ext_modules.append(module)
@@ -1242,11 +1243,14 @@
deps.extend(glob.glob('CXX/*.c'))
temp_copy('src/_path.cpp', 'src/path.cpp')
- deps.extend(['src/path.cpp'])
+ deps.extend(['src/agg_py_transforms.cpp',
+ 'src/path_cleanup.cpp',
+ 'src/path.cpp'])
module = Extension(
'matplotlib._path',
deps,
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_numpy_flags(module)
@@ -1275,6 +1279,7 @@
'matplotlib._image',
deps,
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_numpy_flags(module)
@@ -1294,7 +1299,9 @@
"delaunay_utils.cpp", "natneighbors.cpp"]
sourcefiles = [os.path.join('lib/matplotlib/delaunay',s) for s in
sourcefiles]
delaunay = Extension('matplotlib._delaunay',sourcefiles,
- include_dirs=numpy_inc_dirs)
+ include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL',
'MPL_ARRAY_API')]
+ )
add_numpy_flags(delaunay)
add_base_flags(delaunay)
ext_modules.append(delaunay)
@@ -1310,6 +1317,7 @@
'matplotlib._cntr',
[ 'src/cntr.c'],
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_numpy_flags(module)
add_base_flags(module)
@@ -1325,6 +1333,7 @@
'matplotlib.nxutils',
[ 'src/nxutils.c'],
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_numpy_flags(module)
add_base_flags(module)
@@ -1343,6 +1352,7 @@
['src/backend_gdk.c'],
libraries = [],
include_dirs=numpy_inc_dirs,
+ define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')]
)
add_numpy_flags(module)
Modified: trunk/matplotlib/src/_backend_agg.cpp
===================================================================
--- trunk/matplotlib/src/_backend_agg.cpp 2009-02-02 16:19:33 UTC (rev
6864)
+++ trunk/matplotlib/src/_backend_agg.cpp 2009-02-02 16:29:37 UTC (rev
6865)
@@ -37,7 +37,6 @@
#include "swig_runtime.h"
#include "MPL_isnan.h"
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#include "agg_py_transforms.h"
@@ -253,7 +252,7 @@
Py::Tuple path_and_transform = method.apply(Py::Tuple());
if (path_and_transform[0].ptr() != Py_None) {
clippath = path_and_transform[0];
- clippath_trans = py_to_agg_transformation_matrix(path_and_transform[1]);
+ clippath_trans =
py_to_agg_transformation_matrix(path_and_transform[1].ptr());
}
}
@@ -471,9 +470,9 @@
Py::Object gc_obj = args[0];
Py::Object marker_path_obj = args[1];
- agg::trans_affine marker_trans = py_to_agg_transformation_matrix(args[2]);
+ agg::trans_affine marker_trans =
py_to_agg_transformation_matrix(args[2].ptr());
Py::Object path_obj = args[3];
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[4]);
+ agg::trans_affine trans =
py_to_agg_transformation_matrix(args[4].ptr());
Py::Object face_obj;
if (args.size() == 6)
face_obj = args[5];
@@ -748,7 +747,7 @@
rendererBase.reset_clipping(true);
if (args.size() == 6) {
clippath = args[4];
- clippath_trans = py_to_agg_transformation_matrix(args[5], false);
+ clippath_trans = py_to_agg_transformation_matrix(args[5].ptr(), false);
has_clippath = render_clippath(clippath, clippath_trans);
}
@@ -963,7 +962,7 @@
Py::Object gc_obj = args[0];
Py::Object path_obj = args[1];
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[2]);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr());
Py::Object face_obj;
if (args.size() == 4)
face_obj = args[3];
@@ -1071,7 +1070,7 @@
transforms.reserve(Ntransforms);
for (i = 0; i < Ntransforms; ++i) {
agg::trans_affine trans = py_to_agg_transformation_matrix
- (transforms_obj[i], false);
+ (transforms_obj[i].ptr(), false);
trans *= master_transform;
transforms.push_back(trans);
@@ -1212,14 +1211,14 @@
args.verify_length(14);
//segments, trans, clipbox, colors, linewidths, antialiaseds
- agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[0]);
+ agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[0].ptr());
Py::Object cliprect = args[1];
Py::Object clippath = args[2];
- agg::trans_affine clippath_trans =
py_to_agg_transformation_matrix(args[3], false);
+ agg::trans_affine clippath_trans =
py_to_agg_transformation_matrix(args[3].ptr(), false);
Py::SeqBase<Py::Object> paths = args[4];
Py::SeqBase<Py::Object> transforms_obj = args[5];
Py::Object offsets_obj = args[6];
- agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[7]);
+ agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[7].ptr());
Py::Object facecolors_obj = args[8];
Py::Object edgecolors_obj = args[9];
Py::SeqBase<Py::Float> linewidths = args[10];
@@ -1328,15 +1327,15 @@
//segments, trans, clipbox, colors, linewidths, antialiaseds
- agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[0]);
+ agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[0].ptr());
Py::Object cliprect = args[1];
Py::Object clippath = args[2];
- agg::trans_affine clippath_trans =
py_to_agg_transformation_matrix(args[3], false);
+ agg::trans_affine clippath_trans =
py_to_agg_transformation_matrix(args[3].ptr(), false);
size_t mesh_width = Py::Int(args[4]);
size_t mesh_height = Py::Int(args[5]);
PyObject* coordinates = args[6].ptr();
Py::Object offsets_obj = args[7];
- agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[8]);
+ agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[8].ptr());
Py::Object facecolors_obj = args[9];
bool antialiased = (bool)Py::Int(args[10]);
bool showedges = (bool)Py::Int(args[11]);
Modified: trunk/matplotlib/src/_backend_gdk.c
===================================================================
--- trunk/matplotlib/src/_backend_gdk.c 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/_backend_gdk.c 2009-02-02 16:29:37 UTC (rev 6865)
@@ -3,7 +3,6 @@
*/
#include "Python.h"
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#include <pygtk/pygtk.h>
Modified: trunk/matplotlib/src/_gtkagg.cpp
===================================================================
--- trunk/matplotlib/src/_gtkagg.cpp 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/_gtkagg.cpp 2009-02-02 16:29:37 UTC (rev 6865)
@@ -10,9 +10,8 @@
#include <fstream>
#include "agg_basics.h"
-#include "_backend_agg.h"
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
+#include "_backend_agg.h"
#include "agg_py_transforms.h"
// the extension module
Modified: trunk/matplotlib/src/_image.cpp
===================================================================
--- trunk/matplotlib/src/_image.cpp 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/_image.cpp 2009-02-02 16:29:37 UTC (rev 6865)
@@ -11,7 +11,6 @@
#include <cmath>
#include <cstdio>
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#include "agg_color_rgba.h"
@@ -98,18 +97,7 @@
"\n"
"Flip the output image upside down"
;
-Py::Object
-Image::flipud_out(const Py::Tuple& args) {
- _VERBOSE("Image::flipud_out");
- args.verify_length(0);
- int stride = rbufOut->stride();
- //std::cout << "flip before: " << rbufOut->stride() << std::endl;
- rbufOut->attach(bufferOut, colsOut, rowsOut, -stride);
- //std::cout << "flip after: " << rbufOut->stride() << std::endl;
- return Py::Object();
-}
-
char Image::flipud_in__doc__[] =
"flipud()\n"
"\n"
@@ -1756,8 +1744,6 @@
d["ASPECT_FREE"] = Py::Int(Image::ASPECT_FREE);
d["ASPECT_PRESERVE"] = Py::Int(Image::ASPECT_PRESERVE);
-
-
}
Modified: trunk/matplotlib/src/_image.h
===================================================================
--- trunk/matplotlib/src/_image.h 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/_image.h 2009-02-02 16:29:37 UTC (rev 6865)
@@ -39,7 +39,15 @@
Py::Object set_interpolation(const Py::Tuple& args);
Py::Object set_aspect(const Py::Tuple& args);
Py::Object set_bg(const Py::Tuple& args);
- Py::Object flipud_out(const Py::Tuple& args);
+ inline Py::Object flipud_out(const Py::Tuple& args) {
+ args.verify_length(0);
+ int stride = rbufOut->stride();
+ //std::cout << "flip before: " << rbufOut->stride() << std::endl;
+ rbufOut->attach(bufferOut, colsOut, rowsOut, -stride);
+ //std::cout << "flip after: " << rbufOut->stride() << std::endl;
+ return Py::Object();
+ }
+
Py::Object flipud_in(const Py::Tuple& args);
Py::Object set_resample(const Py::Tuple& args);
Py::Object get_resample(const Py::Tuple& args);
Modified: trunk/matplotlib/src/_path.cpp
===================================================================
--- trunk/matplotlib/src/_path.cpp 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/_path.cpp 2009-02-02 16:29:37 UTC (rev 6865)
@@ -56,7 +56,10 @@
"convert_path_to_polygons(path, trans, width,
height)");
add_varargs_method("cleanup_path", &_path_module::cleanup_path,
"cleanup_path(path, trans, remove_nans, clip,
quantize, simplify, curves)");
-
+ /* TEST CODE -- REMOVE LATER */
+ add_varargs_method("cleanup_path_test",
&_path_module::cleanup_path_test,
+ "TEST");
+ /* **************************************** */
initialize("Helper functions for paths");
}
@@ -76,6 +79,8 @@
Py::Object path_intersects_path(const Py::Tuple& args);
Py::Object convert_path_to_polygons(const Py::Tuple& args);
Py::Object cleanup_path(const Py::Tuple& args);
+ /* TEST CODE -- REMOVE LATER */
+ Py::Object cleanup_path_test(const Py::Tuple& args);
};
//
@@ -244,7 +249,7 @@
double x = Py::Float(args[0]);
double y = Py::Float(args[1]);
PathIterator path(args[2]);
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[3], false);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr(),
false);
if (::point_in_path(x, y, path, trans))
return Py::Int(1);
@@ -259,7 +264,7 @@
double y = Py::Float(args[1]);
double r = Py::Float(args[2]);
PathIterator path(args[3]);
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[4]);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[4].ptr());
if (::point_on_path(x, y, r, path, trans))
return Py::Int(1);
@@ -305,7 +310,7 @@
args.verify_length(2);
PathIterator path(args[0]);
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[1], false);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(),
false);
npy_intp extent_dims[] = { 2, 2, 0 };
double* extents_data = NULL;
@@ -347,7 +352,7 @@
double x0, y0, x1, y1;
PathIterator path(args[0]);
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[1], false);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(),
false);
if (!py_convert_bbox(args[2].ptr(), x0, y0, x1, y1))
{
throw Py::ValueError("Must pass Bbox object as arg 3 of
update_path_extents");
@@ -465,11 +470,11 @@
args.verify_length(5);
//segments, trans, clipbox, colors, linewidths, antialiaseds
- agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[0]);
+ agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[0].ptr());
Py::SeqBase<Py::Object> paths = args[1];
Py::SeqBase<Py::Object> transforms_obj = args[2];
Py::Object offsets_obj = args[3];
- agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[4], false);
+ agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[4].ptr(), false);
PyArrayObject* offsets = NULL;
double x0, y0, x1, y1, xm, ym;
@@ -497,7 +502,7 @@
for (i = 0; i < Ntransforms; ++i)
{
agg::trans_affine trans = py_to_agg_transformation_matrix
- (transforms_obj[i], false);
+ (transforms_obj[i].ptr(), false);
trans *= master_transform;
transforms.push_back(trans);
}
@@ -558,11 +563,11 @@
double x = Py::Float(args[0]);
double y = Py::Float(args[1]);
double radius = Py::Float(args[2]);
- agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[3]);
+ agg::trans_affine master_transform =
py_to_agg_transformation_matrix(args[3].ptr());
Py::SeqBase<Py::Object> paths = args[4];
Py::SeqBase<Py::Object> transforms_obj = args[5];
Py::SeqBase<Py::Object> offsets_obj = args[6];
- agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[7]);
+ agg::trans_affine offset_trans =
py_to_agg_transformation_matrix(args[7].ptr());
bool filled = Py::Int(args[8]);
PyArrayObject* offsets =
(PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
@@ -586,7 +591,7 @@
for (i = 0; i < Ntransforms; ++i)
{
agg::trans_affine trans = py_to_agg_transformation_matrix
- (transforms_obj[i], false);
+ (transforms_obj[i].ptr(), false);
trans *= master_transform;
transforms.push_back(trans);
}
@@ -658,9 +663,9 @@
args.verify_length(4);
PathIterator a(args[0]);
- agg::trans_affine atrans = py_to_agg_transformation_matrix(args[1], false);
+ agg::trans_affine atrans = py_to_agg_transformation_matrix(args[1].ptr(),
false);
PathIterator b(args[2]);
- agg::trans_affine btrans = py_to_agg_transformation_matrix(args[3], false);
+ agg::trans_affine btrans = py_to_agg_transformation_matrix(args[3].ptr(),
false);
return Py::Int(::path_in_path(a, atrans, b, btrans));
}
@@ -1153,7 +1158,7 @@
args.verify_length(4);
PathIterator path(args[0]);
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[1], false);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(),
false);
double width = Py::Float(args[2]);
double height = Py::Float(args[3]);
@@ -1256,7 +1261,7 @@
args.verify_length(7);
PathIterator path(args[0]);
- agg::trans_affine trans = py_to_agg_transformation_matrix(args[1], false);
+ agg::trans_affine trans = py_to_agg_transformation_matrix(args[1].ptr(),
false);
bool remove_nans = args[2].isTrue();
Py::Object clip_obj = args[3];
@@ -1349,6 +1354,39 @@
return result;
}
+/************************************************************/
+/* TEST CODE */
+extern "C" {
+ void* get_path_iterator(
+ PyObject* path, PyObject* trans, int remove_nans,
int do_clip,
+ double rect[4], e_quantize_mode quantize_mode, int
do_simplify);
+
+ unsigned get_vertex(void* pipeline, double* x, double* y);
+
+ void free_path_iterator(void* pipeline);
+}
+
+Py::Object _path_module::cleanup_path_test(const Py::Tuple& args)
+{
+ args.verify_length(2);
+
+ double rect[] = { 0.0, 0.0, 640.0, 480.0 };
+
+ void* iterator = get_path_iterator(args[0].ptr(), args[1].ptr(), 1, 1,
rect, QUANTIZE_AUTO, 1);
+
+ unsigned cmd;
+ double x, y;
+ while ((cmd = get_vertex(iterator, &x, &y)) != 0 /* STOP */) {
+ printf("%f %f %d\n", x, y, cmd);
+ }
+
+ free_path_iterator(iterator);
+
+ return Py::None();
+}
+/* END OF TEST CODE */
+/************************************************************/
+
extern "C"
DL_EXPORT(void)
init_path(void)
Modified: trunk/matplotlib/src/agg_py_path_iterator.h
===================================================================
--- trunk/matplotlib/src/agg_py_path_iterator.h 2009-02-02 16:19:33 UTC (rev
6864)
+++ trunk/matplotlib/src/agg_py_path_iterator.h 2009-02-02 16:29:37 UTC (rev
6865)
@@ -2,7 +2,6 @@
#define __AGG_PY_PATH_ITERATOR_H__
#include "CXX/Objects.hxx"
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#include "agg_path_storage.h"
@@ -39,7 +38,7 @@
public:
/* path_obj is an instance of the class Path as defined in path.py */
- PathIterator(const Py::Object& path_obj) :
+ inline PathIterator(const Py::Object& path_obj) :
m_vertices(NULL), m_codes(NULL), m_iterator(0), m_should_simplify(false),
m_simplify_threshold(1.0 / 9.0)
{
Added: trunk/matplotlib/src/agg_py_transforms.cpp
===================================================================
--- trunk/matplotlib/src/agg_py_transforms.cpp (rev 0)
+++ trunk/matplotlib/src/agg_py_transforms.cpp 2009-02-02 16:29:37 UTC (rev
6865)
@@ -0,0 +1,98 @@
+#include <Python.h>
+
+#define NO_IMPORT_ARRAY
+#include "numpy/arrayobject.h"
+
+#include "CXX/Objects.hxx"
+#include "agg_trans_affine.h"
+
+/** A helper function to convert from a Numpy affine transformation matrix
+ * to an agg::trans_affine.
+ */
+agg::trans_affine
+py_to_agg_transformation_matrix(PyObject* obj, bool errors = true)
+{
+ PyArrayObject* matrix = NULL;
+
+ try
+ {
+ if (obj == Py_None)
+ throw std::exception();
+ matrix = (PyArrayObject*) PyArray_FromObject(obj, PyArray_DOUBLE, 2,
2);
+ if (!matrix)
+ throw std::exception();
+ if (PyArray_NDIM(matrix) == 2 || PyArray_DIM(matrix, 0) == 3 ||
PyArray_DIM(matrix, 1) == 3)
+ {
+ size_t stride0 = PyArray_STRIDE(matrix, 0);
+ size_t stride1 = PyArray_STRIDE(matrix, 1);
+ char* row0 = PyArray_BYTES(matrix);
+ char* row1 = row0 + stride0;
+
+ double a = *(double*)(row0);
+ row0 += stride1;
+ double c = *(double*)(row0);
+ row0 += stride1;
+ double e = *(double*)(row0);
+
+ double b = *(double*)(row1);
+ row1 += stride1;
+ double d = *(double*)(row1);
+ row1 += stride1;
+ double f = *(double*)(row1);
+
+ Py_XDECREF(matrix);
+
+ return agg::trans_affine(a, b, c, d, e, f);
+ }
+
+ throw std::exception();
+ }
+ catch (...)
+ {
+ if (errors)
+ {
+ Py_XDECREF(matrix);
+ throw Py::TypeError("Invalid affine transformation matrix");
+ }
+ }
+
+ Py_XDECREF(matrix);
+ return agg::trans_affine();
+}
+
+bool
+py_convert_bbox(PyObject* bbox_obj, double& l, double& b, double& r, double& t)
+{
+ PyArrayObject* bbox = NULL;
+
+ if (bbox_obj == Py_None)
+ return false;
+
+ try
+ {
+ bbox = (PyArrayObject*) PyArray_FromObject(bbox_obj, PyArray_DOUBLE,
2, 2);
+
+ if (!bbox || PyArray_NDIM(bbox) != 2 || PyArray_DIM(bbox, 0) != 2 ||
PyArray_DIM(bbox, 1) != 2)
+ {
+ throw Py::TypeError
+ ("Argument 3 to agg_to_gtk_drawable must be a Bbox object.");
+ }
+
+ l = *(double*)PyArray_GETPTR2(bbox, 0, 0);
+ b = *(double*)PyArray_GETPTR2(bbox, 0, 1);
+ r = *(double*)PyArray_GETPTR2(bbox, 1, 0);
+ t = *(double*)PyArray_GETPTR2(bbox, 1, 1);
+
+ Py_XDECREF(bbox);
+ bbox = NULL;
+ return true;
+ }
+ catch (...)
+ {
+ Py_XDECREF(bbox);
+ bbox = NULL;
+ throw;
+ }
+
+ return false;
+}
Modified: trunk/matplotlib/src/agg_py_transforms.h
===================================================================
--- trunk/matplotlib/src/agg_py_transforms.h 2009-02-02 16:19:33 UTC (rev
6864)
+++ trunk/matplotlib/src/agg_py_transforms.h 2009-02-02 16:29:37 UTC (rev
6865)
@@ -1,99 +1,15 @@
#ifndef __AGG_PY_TRANSFORMS_H__
#define __AGG_PY_TRANSFORMS_H__
-#define PY_ARRAY_TYPES_PREFIX NumPy
-#include "numpy/arrayobject.h"
-
-#include "CXX/Objects.hxx"
#include "agg_trans_affine.h"
/** A helper function to convert from a Numpy affine transformation matrix
* to an agg::trans_affine.
*/
-agg::trans_affine py_to_agg_transformation_matrix(const Py::Object& obj, bool
errors = true)
-{
- PyArrayObject* matrix = NULL;
+agg::trans_affine
+py_to_agg_transformation_matrix(PyObject* obj, bool errors = true);
- try
- {
- if (obj.ptr() == Py_None)
- throw std::exception();
- matrix = (PyArrayObject*) PyArray_FromObject(obj.ptr(),
PyArray_DOUBLE, 2, 2);
- if (!matrix)
- throw std::exception();
- if (PyArray_NDIM(matrix) == 2 || PyArray_DIM(matrix, 0) == 3 ||
PyArray_DIM(matrix, 1) == 3)
- {
- size_t stride0 = PyArray_STRIDE(matrix, 0);
- size_t stride1 = PyArray_STRIDE(matrix, 1);
- char* row0 = PyArray_BYTES(matrix);
- char* row1 = row0 + stride0;
+bool
+py_convert_bbox(PyObject* bbox_obj, double& l, double& b, double& r, double&
t);
- double a = *(double*)(row0);
- row0 += stride1;
- double c = *(double*)(row0);
- row0 += stride1;
- double e = *(double*)(row0);
-
- double b = *(double*)(row1);
- row1 += stride1;
- double d = *(double*)(row1);
- row1 += stride1;
- double f = *(double*)(row1);
-
- Py_XDECREF(matrix);
-
- return agg::trans_affine(a, b, c, d, e, f);
- }
-
- throw std::exception();
- }
- catch (...)
- {
- if (errors)
- {
- Py_XDECREF(matrix);
- throw Py::TypeError("Invalid affine transformation matrix");
- }
- }
-
- Py_XDECREF(matrix);
- return agg::trans_affine();
-}
-
-bool py_convert_bbox(PyObject* bbox_obj, double& l, double& b, double& r,
double& t)
-{
- PyArrayObject* bbox = NULL;
-
- if (bbox_obj == Py_None)
- return false;
-
- try
- {
- bbox = (PyArrayObject*) PyArray_FromObject(bbox_obj, PyArray_DOUBLE,
2, 2);
-
- if (!bbox || PyArray_NDIM(bbox) != 2 || PyArray_DIM(bbox, 0) != 2 ||
PyArray_DIM(bbox, 1) != 2)
- {
- throw Py::TypeError
- ("Argument 3 to agg_to_gtk_drawable must be a Bbox object.");
- }
-
- l = *(double*)PyArray_GETPTR2(bbox, 0, 0);
- b = *(double*)PyArray_GETPTR2(bbox, 0, 1);
- r = *(double*)PyArray_GETPTR2(bbox, 1, 0);
- t = *(double*)PyArray_GETPTR2(bbox, 1, 1);
-
- Py_XDECREF(bbox);
- bbox = NULL;
- return true;
- }
- catch (...)
- {
- Py_XDECREF(bbox);
- bbox = NULL;
- throw;
- }
-
- return false;
-}
-
#endif // __AGG_PY_TRANSFORMS_H__
Modified: trunk/matplotlib/src/ft2font.cpp
===================================================================
--- trunk/matplotlib/src/ft2font.cpp 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/ft2font.cpp 2009-02-02 16:29:37 UTC (rev 6865)
@@ -2,7 +2,6 @@
#include "mplutils.h"
#include <sstream>
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#define FIXED_MAJOR(val) (*((short *) &val+1))
Modified: trunk/matplotlib/src/numerix.h
===================================================================
--- trunk/matplotlib/src/numerix.h 2009-02-02 16:19:33 UTC (rev 6864)
+++ trunk/matplotlib/src/numerix.h 2009-02-02 16:29:37 UTC (rev 6865)
@@ -3,7 +3,6 @@
#ifndef _NUMERIX_H
#define _NUMERIX_H
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#if (NDARRAY_VERSION >= 0x00090908)
#include "numpy/oldnumeric.h"
Added: trunk/matplotlib/src/path_cleanup.cpp
===================================================================
--- trunk/matplotlib/src/path_cleanup.cpp (rev 0)
+++ trunk/matplotlib/src/path_cleanup.cpp 2009-02-02 16:29:37 UTC (rev
6865)
@@ -0,0 +1,84 @@
+#include <Python.h>
+#define NO_IMPORT_ARRAY
+#include "numpy/arrayobject.h"
+
+#include "agg_py_path_iterator.h"
+#include "agg_conv_transform.h"
+#include "agg_py_transforms.h"
+#include "path_converters.h"
+
+class PathCleanupIterator {
+ typedef agg::conv_transform<PathIterator> transformed_path_t;
+ typedef PathNanRemover<transformed_path_t> nan_removal_t;
+ typedef PathClipper<nan_removal_t> clipped_t;
+ typedef PathQuantizer<clipped_t> quantized_t;
+ typedef PathSimplifier<quantized_t> simplify_t;
+
+ Py::Object m_path_obj;
+ PathIterator m_path_iter;
+ agg::trans_affine m_transform;
+ transformed_path_t m_transformed;
+ nan_removal_t m_nan_removed;
+ clipped_t m_clipped;
+ quantized_t m_quantized;
+ simplify_t m_simplify;
+
+public:
+ PathCleanupIterator(PyObject* path, agg::trans_affine trans,
+ bool remove_nans, bool do_clip,
+ const agg::rect_base<double>& rect,
+ e_quantize_mode quantize_mode, bool do_simplify) :
+ m_path_obj(path, true),
+ m_path_iter(m_path_obj),
+ m_transform(trans),
+ m_transformed(m_path_iter, m_transform),
+ m_nan_removed(m_transformed, remove_nans, m_path_iter.has_curves()),
+ m_clipped(m_nan_removed, do_clip, rect),
+ m_quantized(m_clipped, quantize_mode, m_path_iter.total_vertices()),
+ m_simplify(m_quantized, do_simplify && m_path_iter.should_simplify(),
+ m_path_iter.simplify_threshold())
+ {
+ Py_INCREF(path);
+ m_path_iter.rewind(0);
+ }
+
+ unsigned vertex(double* x, double* y)
+ {
+ return m_simplify.vertex(x, y);
+ }
+};
+
+extern "C" {
+ void*
+ get_path_iterator(
+ PyObject* path, PyObject* trans, int remove_nans, int do_clip,
+ double rect[4], e_quantize_mode quantize_mode, int do_simplify)
+ {
+ agg::trans_affine agg_trans = py_to_agg_transformation_matrix(trans,
false);
+ agg::rect_base<double> clip_rect(rect[0], rect[1], rect[2], rect[3]);
+
+ PathCleanupIterator* pipeline = new PathCleanupIterator(
+ path, agg_trans, remove_nans != 0, do_clip != 0,
+ clip_rect, quantize_mode, do_simplify != 0);
+
+ return (void*)pipeline;
+ }
+
+ unsigned
+ get_vertex(void* pipeline, double* x, double* y)
+ {
+ PathCleanupIterator* pipeline_iter = (PathCleanupIterator*)pipeline;
+
+ unsigned code = pipeline_iter->vertex(x, y);
+ return code;
+ }
+
+ void
+ free_path_iterator(void* pipeline)
+ {
+ PathCleanupIterator* pipeline_iter = (PathCleanupIterator*)pipeline;
+
+ delete pipeline_iter;
+ }
+}
+
Added: trunk/matplotlib/src/path_cleanup.h
===================================================================
--- trunk/matplotlib/src/path_cleanup.h (rev 0)
+++ trunk/matplotlib/src/path_cleanup.h 2009-02-02 16:29:37 UTC (rev 6865)
@@ -0,0 +1,24 @@
+#ifndef PATH_CLEANUP_H
+#define PATH_CLEANUP_H
+
+#include <Python.h>
+
+enum e_quantize_mode
+{
+ QUANTIZE_AUTO,
+ QUANTIZE_FALSE,
+ QUANTIZE_TRUE
+};
+
+void*
+get_path_iterator(
+ PyObject* path, PyObject* trans, int remove_nans, int do_clip,
+ double rect[4], e_quantize_mode quantize_mode, int do_simplify);
+
+unsigned
+get_vertex(void* pipeline, double* x, double* y);
+
+void
+free_path_iterator(void* pipeline);
+
+#endif /* PATH_CLEANUP_H */
Modified: trunk/matplotlib/src/path_converters.h
===================================================================
--- trunk/matplotlib/src/path_converters.h 2009-02-02 16:19:33 UTC (rev
6864)
+++ trunk/matplotlib/src/path_converters.h 2009-02-02 16:29:37 UTC (rev
6865)
@@ -2,7 +2,6 @@
#define __PATH_CONVERTERS_H__
#include "CXX/Objects.hxx"
-#define PY_ARRAY_TYPES_PREFIX NumPy
#include "numpy/arrayobject.h"
#include "agg_path_storage.h"
#include "agg_clip_liang_barsky.h"
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:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins