Revision: 3914
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=3914&view=rev
Author: mdboom
Date: 2007-10-04 11:57:27 -0700 (Thu, 04 Oct 2007)
Log Message:
-----------
Progress on agg_buffer_to_array example.
Modified Paths:
--------------
branches/transforms/examples/agg_buffer_to_array.py
branches/transforms/examples/polar_demo.py
branches/transforms/lib/matplotlib/artist.py
branches/transforms/lib/matplotlib/image.py
branches/transforms/lib/matplotlib/projections/polar.py
branches/transforms/lib/matplotlib/transforms.py
branches/transforms/src/_backend_agg.cpp
branches/transforms/src/_backend_agg.h
Modified: branches/transforms/examples/agg_buffer_to_array.py
===================================================================
--- branches/transforms/examples/agg_buffer_to_array.py 2007-10-04 17:22:01 UTC
(rev 3913)
+++ branches/transforms/examples/agg_buffer_to_array.py 2007-10-04 18:57:27 UTC
(rev 3914)
@@ -12,7 +12,7 @@
# grab rhe pixel buffer and dumpy it into a numpy array
buf = fig.canvas.buffer_rgba(0,0)
-l, b, w, h = fig.bbox.get_bounds()
+l, b, w, h = fig.bbox.bounds
X = npy.fromstring(buf, npy.uint8)
X.shape = h,w,4
Modified: branches/transforms/examples/polar_demo.py
===================================================================
--- branches/transforms/examples/polar_demo.py 2007-10-04 17:22:01 UTC (rev
3913)
+++ branches/transforms/examples/polar_demo.py 2007-10-04 18:57:27 UTC (rev
3914)
@@ -40,7 +40,7 @@
# information on how to customize the grid locations and labels
import numpy as npy
-from matplotlib.pyplot import figure, show, rc
+from matplotlib.pyplot import figure, show, rc, grid
# radar green, solid grid lines
rc('grid', color='#316931', linewidth=1, linestyle='-')
@@ -55,6 +55,7 @@
theta = 2*npy.pi*r
ax.plot(theta, r, color='#ee8d18', lw=3)
ax.set_rmax(2.0)
+grid(True)
ax.set_title("And there was much rejoicing!", fontsize=20)
show()
Modified: branches/transforms/lib/matplotlib/artist.py
===================================================================
--- branches/transforms/lib/matplotlib/artist.py 2007-10-04 17:22:01 UTC
(rev 3913)
+++ branches/transforms/lib/matplotlib/artist.py 2007-10-04 18:57:27 UTC
(rev 3914)
@@ -350,7 +350,7 @@
def _set_gc_clip(self, gc):
'set the clip properly for the gc'
if self.clipbox is not None:
- gc.set_clip_rectangle(self.clipbox.bounds)
+ gc.set_clip_rectangle(self.clipbox)
gc.set_clip_path(self._clippath)
def draw(self, renderer, *args, **kwargs):
Modified: branches/transforms/lib/matplotlib/image.py
===================================================================
--- branches/transforms/lib/matplotlib/image.py 2007-10-04 17:22:01 UTC (rev
3913)
+++ branches/transforms/lib/matplotlib/image.py 2007-10-04 18:57:27 UTC (rev
3914)
@@ -149,17 +149,17 @@
dyintv = ymax-ymin
# the viewport scale factor
- sx = dxintv/self.axes.viewLim.width()
- sy = dyintv/self.axes.viewLim.height()
+ sx = dxintv/self.axes.viewLim.width
+ sy = dyintv/self.axes.viewLim.height
if im.get_interpolation()!=_image.NEAREST:
im.apply_translation(-1, -1)
# the viewport translation
- tx = (xmin-self.axes.viewLim.xmin())/dxintv * numcols
- ty = (ymin-self.axes.viewLim.ymin())/dyintv * numrows
+ tx = (xmin-self.axes.viewLim.xmin)/dxintv * numcols
+ ty = (ymin-self.axes.viewLim.ymin)/dyintv * numrows
- l, b, widthDisplay, heightDisplay = self.axes.bbox.get_bounds()
+ l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds
widthDisplay *= magnification
heightDisplay *= magnification
@@ -180,8 +180,9 @@
def draw(self, renderer, *args, **kwargs):
if not self.get_visible(): return
im = self.make_image(renderer.get_image_magnification())
- l, b, widthDisplay, heightDisplay = self.axes.bbox.get_bounds()
- renderer.draw_image(l, b, im, self.axes.bbox)
+ l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds
+ print self.axes.bbox.frozen()
+ renderer.draw_image(l, b, im, self.axes.bbox.frozen())
def contains(self, mouseevent):
"""Test whether the mouse event occured within the image.
Modified: branches/transforms/lib/matplotlib/projections/polar.py
===================================================================
--- branches/transforms/lib/matplotlib/projections/polar.py 2007-10-04
17:22:01 UTC (rev 3913)
+++ branches/transforms/lib/matplotlib/projections/polar.py 2007-10-04
18:57:27 UTC (rev 3914)
@@ -12,14 +12,29 @@
IdentityTransform, Transform, TransformWrapper
class PolarAxes(Axes):
+ """
+ A polar graph projection, where the input dimensions are theta, r.
+
+ Theta starts pointing east and goes anti-clockwise.
+ """
name = 'polar'
class PolarTransform(Transform):
+ """
+ The base polar transform. This handles projection theta and r into
+ Cartesian coordinate space, but does not perform the ultimate affine
+ transformation into the correct position.
+ """
input_dims = 2
output_dims = 2
is_separable = False
def __init__(self, resolution):
+ """
+ Create a new polar transform. Resolution is the number of steps
+ to interpolate between each input line segment to approximate its
+ path in curved polar space.
+ """
Transform.__init__(self)
self._resolution = resolution
@@ -32,19 +47,34 @@
x += r * npy.cos(t)
y += r * npy.sin(t)
return xy
+ transform.__doc__ = Transform.transform.__doc__
+
transform_non_affine = transform
+ transform_non_affine.__doc__ = Transform.transform_non_affine.__doc__
def transform_path(self, path):
if len(path.vertices) == 2:
path = path.interpolated(self._resolution)
return Path(self.transform(path.vertices), path.codes)
+ transform_path.__doc__ = Transform.transform_path.__doc__
+
transform_path_non_affine = transform_path
+ transform_path_non_affine.__doc__ =
Transform.transform_path_non_affine.__doc__
def inverted(self):
return PolarAxes.InvertedPolarTransform()
+ inverted.__doc__ = Transform.inverted.__doc__
class PolarAffine(Affine2DBase):
+ """
+ The affine part of the polar projection. Scales the output so
+ that maximum radius rests on the edge of the axes circle.
+ """
def __init__(self, limits):
+ """
+ limits is the view limit of the data. The only part of
+ its bounds that is used is ymax (for the radius maximum).
+ """
Affine2DBase.__init__(self)
self._limits = limits
self.set_children(limits)
@@ -60,8 +90,13 @@
self._inverted = None
self._invalid = 0
return self._mtx
+ get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__
class InvertedPolarTransform(Transform):
+ """
+ The inverse of the polar transform, mapping Cartesian
+ coordinate space back to t and r.
+ """
input_dims = 2
output_dims = 2
is_separable = False
@@ -73,21 +108,34 @@
theta = npy.arccos(x / r)
theta = npy.where(y < 0, 2 * npy.pi - theta, theta)
return npy.concatenate((theta, r), 1)
+ transform.__doc__ = Transform.transform.__doc__
def inverted(self):
return PolarAxes.PolarTransform()
+ inverted.__doc__ = Transform.inverted.__doc__
class ThetaFormatter(Formatter):
+ """
+ Used to format the theta tick labels. Converts the native
+ unit of radians into degrees and adds a degree symbol.
+ """
def __call__(self, x, pos=None):
+ # \u00b0 : degree symbol
return u"%d\u00b0" % ((x / npy.pi) * 180.0)
class RadialLocator(Locator):
+ """
+ Used to locate radius ticks.
+
+ Ensures that all ticks are strictly positive. For all other
+ tasks, it delegates to the base Locator (which may be
+ different depending on the scale of the r-axis.
+ """
def __init__(self, base):
self.base = base
def __call__(self):
ticks = self.base()
- # MGDTODO: Use numpy
return [x for x in ticks if x > 0]
def autoscale(self):
@@ -105,6 +153,10 @@
RESOLUTION = 100
def __init__(self, *args, **kwargs):
+ """
+ Create a new Polar Axes for a polar plot.
+ """
+
self._rpad = 0.05
Axes.__init__(self, *args, **kwargs)
self.set_aspect('equal', adjustable='box', anchor='C')
@@ -120,7 +172,7 @@
self.yaxis.set_major_locator(self.RadialLocator(self.yaxis.get_major_locator()))
def _set_lim_and_transforms(self):
- self.dataLim = Bbox([[0.0, 0.0], [npy.pi * 2.0, 1.0]])
+ self.dataLim = Bbox.unit()
self.viewLim = Bbox.unit()
self.transAxes = BboxTransform(Bbox.unit(), self.bbox)
@@ -134,14 +186,20 @@
# An affine transformation on the data, generally to limit the
# range of the axes
self.transProjectionAffine = self.PolarAffine(self.viewLim)
-
+
+ # The complete data transformation stack -- from data all the
+ # way to display coordinates
self.transData = self.transScale + self.transProjection + \
(self.transProjectionAffine + self.transAxes)
+ # This is the transform for theta-axis ticks. It is
+ # equivalent to transData, except it always puts r == 1.0 at
+ # the edge of the axis circle.
self._xaxis_transform = (
self.transProjection +
self.PolarAffine(Bbox.unit()) +
self.transAxes)
+ # The theta labels are moved from radius == 0.0 to radius == 1.1
self._theta_label1_position = Affine2D().translate(0.0, 1.1)
self._xaxis_text1_transform = (
self._theta_label1_position +
@@ -150,10 +208,14 @@
self._xaxis_text2_transform = (
self._theta_label2_position +
self._xaxis_transform)
-
+
+ # This is the transform for r-axis ticks. It scales the theta
+ # axis so the gridlines from 0.0 to 1.0, now go from 0.0 to
+ # 2pi.
self._yaxis_transform = (
Affine2D().scale(npy.pi * 2.0, 1.0) +
self.transData)
+ # The r-axis labels are put at an angle and padded in the r-direction
self._r_label1_position = Affine2D().translate(22.5, self._rpad)
self._yaxis_text1_transform = (
self._r_label1_position +
@@ -166,6 +228,9 @@
Affine2D().scale(1.0 / 360.0, 1.0) +
self._yaxis_transform
)
+
+ def get_xaxis_transform(self):
+ return self._xaxis_transform
def get_xaxis_text1_transform(self, pixelPad):
return self._xaxis_text1_transform, 'center', 'center'
@@ -173,6 +238,9 @@
def get_xaxis_text2_transform(self, pixelPad):
return self._xaxis_text2_transform, 'center', 'center'
+ def get_yaxis_transform(self):
+ return self._yaxis_transform
+
def get_yaxis_text1_transform(self, pixelPad):
return self._yaxis_text1_transform, 'center', 'center'
@@ -181,63 +249,7 @@
def get_axes_patch(self):
return Circle((0.5, 0.5), 0.5)
-
- def start_pan(self, x, y, button):
- angle = self._r_label1_position.to_values()[4] / 180.0 * npy.pi
- mode = ''
- if button == 1:
- epsilon = npy.pi / 45.0
- t, r = self.transData.inverted().transform_point((x, y))
- if t >= angle - epsilon and t <= angle + epsilon:
- mode = 'drag_r_labels'
- elif button == 3:
- mode = 'zoom'
- self._pan_start = cbook.Bunch(
- rmax = self.get_rmax(),
- trans = self.transData.frozen(),
- trans_inverse = self.transData.inverted().frozen(),
- r_label_angle = self._r_label1_position.to_values()[4],
- x = x,
- y = y,
- mode = mode
- )
-
- def end_pan(self):
- del self._pan_start
-
- def drag_pan(self, button, key, x, y):
- p = self._pan_start
-
- if p.mode == 'drag_r_labels':
- startt, startr = p.trans_inverse.transform_point((p.x, p.y))
- t, r = p.trans_inverse.transform_point((x, y))
-
- # Deal with theta
- dt0 = t - startt
- dt1 = startt - t
- if abs(dt1) < abs(dt0):
- dt = abs(dt1) * sign(dt0) * -1.0
- else:
- dt = dt0 * -1.0
- dt = (dt / npy.pi) * 180.0
-
- rpad = self._r_label1_position.to_values()[5]
- self._r_label1_position.clear().translate(
- p.r_label_angle - dt, rpad)
- self._r_label2_position.clear().translate(
- p.r_label_angle - dt, -rpad)
-
- elif p.mode == 'zoom':
- startt, startr = p.trans_inverse.transform_point((p.x, p.y))
- t, r = p.trans_inverse.transform_point((x, y))
-
- dr = r - startr
-
- # Deal with r
- scale = r / startr
- self.set_rmax(p.rmax / scale)
-
def set_rmax(self, rmax):
self.viewLim.ymax = rmax
angle = self._r_label1_position.to_values()[4]
@@ -249,6 +261,11 @@
def get_rmax(self):
return self.viewLim.ymax
+ def set_yscale(self, *args, **kwargs):
+ Axes.set_yscale(self, *args, **kwargs)
+ self.yaxis.set_major_locator(
+ self.RadialLocator(self.yaxis.get_major_locator()))
+
set_rscale = Axes.set_yscale
set_rticks = Axes.set_yticks
@@ -330,24 +347,19 @@
set_rgrids.__doc__ = cbook.dedent(set_rgrids.__doc__) % kwdocd
- def set_rscale(self, *args, **kwargs):
- return self.set_yscale(*args, **kwargs)
-
def set_xscale(self, *args, **kwargs):
raise NotImplementedError("You can not set the xscale on a polar
plot.")
- def set_yscale(self, *args, **kwargs):
- Axes.set_yscale(self, *args, **kwargs)
- self.yaxis.set_major_locator(
- self.RadialLocator(self.yaxis.get_major_locator()))
-
def set_xlim(self, *args, **kargs):
- # The xlim's a fixed, no matter what you do
+ # The xlim is fixed, no matter what you do
self.viewLim.intervalx = (0.0, npy.pi * 2.0)
def format_coord(self, theta, r):
'return a format string formatting the coordinate'
theta /= math.pi
+ # \u03b8: lower-case theta
+ # \u03c0: lower-case pi
+ # \u00b0: degree symbol
return u'\u03b8=%0.3f\u03c0 (%0.3f\u00b0), r=%0.3f' % (theta, theta *
180.0, r)
def get_data_ratio(self):
@@ -356,7 +368,65 @@
this should always be 1.0
'''
return 1.0
+
+ ### Interactive panning
+ def start_pan(self, x, y, button):
+ angle = self._r_label1_position.to_values()[4] / 180.0 * npy.pi
+ mode = ''
+ if button == 1:
+ epsilon = npy.pi / 45.0
+ t, r = self.transData.inverted().transform_point((x, y))
+ if t >= angle - epsilon and t <= angle + epsilon:
+ mode = 'drag_r_labels'
+ elif button == 3:
+ mode = 'zoom'
+
+ self._pan_start = cbook.Bunch(
+ rmax = self.get_rmax(),
+ trans = self.transData.frozen(),
+ trans_inverse = self.transData.inverted().frozen(),
+ r_label_angle = self._r_label1_position.to_values()[4],
+ x = x,
+ y = y,
+ mode = mode
+ )
+
+ def end_pan(self):
+ del self._pan_start
+
+ def drag_pan(self, button, key, x, y):
+ p = self._pan_start
+
+ if p.mode == 'drag_r_labels':
+ startt, startr = p.trans_inverse.transform_point((p.x, p.y))
+ t, r = p.trans_inverse.transform_point((x, y))
+
+ # Deal with theta
+ dt0 = t - startt
+ dt1 = startt - t
+ if abs(dt1) < abs(dt0):
+ dt = abs(dt1) * sign(dt0) * -1.0
+ else:
+ dt = dt0 * -1.0
+ dt = (dt / npy.pi) * 180.0
+
+ rpad = self._r_label1_position.to_values()[5]
+ self._r_label1_position.clear().translate(
+ p.r_label_angle - dt, rpad)
+ self._r_label2_position.clear().translate(
+ p.r_label_angle - dt, -rpad)
+
+ elif p.mode == 'zoom':
+ startt, startr = p.trans_inverse.transform_point((p.x, p.y))
+ t, r = p.trans_inverse.transform_point((x, y))
+
+ dr = r - startr
+
+ # Deal with r
+ scale = r / startr
+ self.set_rmax(p.rmax / scale)
+
# These are a couple of aborted attempts to project a polar plot using
# cubic bezier curves.
Modified: branches/transforms/lib/matplotlib/transforms.py
===================================================================
--- branches/transforms/lib/matplotlib/transforms.py 2007-10-04 17:22:01 UTC
(rev 3913)
+++ branches/transforms/lib/matplotlib/transforms.py 2007-10-04 18:57:27 UTC
(rev 3914)
@@ -191,7 +191,7 @@
return Bbox(self.get_points().copy())
frozen.__doc__ = TransformNode.__doc__
- def __array__(self):
+ def __array__(self, *args, **kwargs):
return self.get_points()
def _get_xmin(self):
Modified: branches/transforms/src/_backend_agg.cpp
===================================================================
--- branches/transforms/src/_backend_agg.cpp 2007-10-04 17:22:01 UTC (rev
3913)
+++ branches/transforms/src/_backend_agg.cpp 2007-10-04 18:57:27 UTC (rev
3914)
@@ -187,7 +187,6 @@
GCAgg::GCAgg(const Py::Object &gc, double dpi, bool snapto) :
dpi(dpi), snapto(snapto), isaa(true), linewidth(1.0), alpha(1.0),
- cliprect(NULL),
Ndash(0), dashOffset(0.0), dasha(NULL)
{
_VERBOSE("GCAgg::GCAgg");
@@ -295,34 +294,14 @@
}
}
-// MGDTODO: Convert directly from Bbox object (numpy)
void
GCAgg::_set_clip_rectangle( const Py::Object& gc) {
//set the clip rectangle from the gc
_VERBOSE("GCAgg::_set_clip_rectangle");
-
- delete [] cliprect;
- cliprect = NULL;
-
+
Py::Object o ( gc.getAttr( "_cliprect" ) );
- if (o.ptr() == Py_None) {
- return;
- }
-
- Py::SeqBase<Py::Object> rect( o );
-
- double l = Py::Float(rect[0]) ;
- double b = Py::Float(rect[1]) ;
- double w = Py::Float(rect[2]) ;
- double h = Py::Float(rect[3]) ;
-
- cliprect = new double[4];
- //todo check for memory alloc failure
- cliprect[0] = l;
- cliprect[1] = b;
- cliprect[2] = w;
- cliprect[3] = h;
+ cliprect = o;
}
void
@@ -387,25 +366,29 @@
};
-
template<class R>
void
-RendererAgg::set_clipbox(double *cliprect, R rasterizer) {
+RendererAgg::set_clipbox(Py::Object& cliprect, R rasterizer) {
//set the clip rectangle from the gc
_VERBOSE("RendererAgg::set_clipbox");
- if (cliprect!=NULL) {
+ if (cliprect.ptr() != Py_None) {
+ PyArrayObject* bbox = (PyArrayObject*) PyArray_FromObject(cliprect.ptr(),
PyArray_DOUBLE, 2, 2);
+
+ if (!bbox || bbox->nd != 2 || bbox->dimensions[0] != 2 ||
bbox->dimensions[1] != 2)
+ throw Py::TypeError
+ ("Expected a Bbox object.");
- double l = cliprect[0] ;
- double b = cliprect[1] ;
- double w = cliprect[2] ;
- double h = cliprect[3] ;
-
- rasterizer->clip_box((int)l, (int)(height-(b+h)), (int)(l+w),
(int)(height-b));
+ double l = *(double*)PyArray_GETPTR2(bbox, 0, 0);
+ double b = *(double*)PyArray_GETPTR2(bbox, 0, 1);
+ double r = *(double*)PyArray_GETPTR2(bbox, 1, 0);
+ double t = *(double*)PyArray_GETPTR2(bbox, 1, 1);
+
+ rasterizer->clip_box((int)l, (int)(height-t), (int)r, (int)(height-b));
}
+
_VERBOSE("RendererAgg::set_clipbox done");
-
}
std::pair<bool, agg::rgba>
@@ -485,17 +468,24 @@
RendererAgg::copy_from_bbox(const Py::Tuple& args) {
//copy region in bbox to buffer and return swig/agg buffer object
args.verify_length(1);
+
+ Py::Object box_obj = args[0];
+
+ PyArrayObject* bbox = (PyArrayObject*) PyArray_FromObject(box_obj.ptr(),
PyArray_DOUBLE, 2, 2);
+ if (!bbox || bbox->nd != 2 || bbox->dimensions[0] != 2 ||
bbox->dimensions[1] != 2)
+ throw Py::TypeError
+ ("Expected a Bbox object.");
+
+ double l = *(double*)PyArray_GETPTR2(bbox, 0, 0);
+ double b = *(double*)PyArray_GETPTR2(bbox, 0, 1);
+ double r = *(double*)PyArray_GETPTR2(bbox, 1, 0);
+ double t = *(double*)PyArray_GETPTR2(bbox, 1, 1);
- agg::rect r = bbox_to_rect<int>(args[0]);
- /*
- r.x1 -=5;
- r.y1 -=5;
- r.x2 +=5;
- r.y2 +=5;
- */
- int boxwidth = r.x2-r.x1;
- int boxheight = r.y2-r.y1;
+ agg::rect rect((int)l, (int)(height-t), (int)r, (int)(height-b));
+
+ int boxwidth = rect.x2-rect.x1;
+ int boxheight = rect.y2-rect.y1;
int boxstride = boxwidth*4;
agg::buffer buf(boxwidth, boxheight, boxstride, false);
if (buf.data ==NULL) {
@@ -508,8 +498,8 @@
pixfmt pf(rbuf);
renderer_base rb(pf);
//rb.clear(agg::rgba(1, 0, 0)); //todo remove me
- rb.copy_from(*renderingBuffer, &r, -r.x1, -r.y1);
- BufferRegion* reg = new BufferRegion(buf, r, true);
+ rb.copy_from(*renderingBuffer, &rect, -rect.x1, -rect.y1);
+ BufferRegion* reg = new BufferRegion(buf, rect, true);
return Py::asObject(reg);
}
@@ -535,64 +525,6 @@
return Py::Object();
}
-/**
- * Helper function to convert a Python Bbox object to an agg rectangle
- */
-template<class T>
-agg::rect_base<T>
-RendererAgg::bbox_to_rect(const Py::Object& o) {
- //return the agg::rect for bbox, flipping y
- PyArrayObject *bbox = (PyArrayObject *)
PyArray_ContiguousFromObject(o.ptr(), PyArray_DOUBLE, 2, 2);
-
- if (!bbox || bbox->nd != 2 || bbox->dimensions[0] != 2 ||
bbox->dimensions[1] != 2)
- throw Py::TypeError
- ("Expected a Bbox object.");
-
- double l = bbox->data[0];
- double b = bbox->data[1];
- double r = bbox->data[2];
- double t = bbox->data[3];
- T height = (T)(b - t);
-
- agg::rect_base<T> rect((T)l, height-(T)t, (T)r, height-(T)b ) ;
- if (!rect.is_valid())
- throw Py::ValueError("Invalid rectangle in bbox_to_rect");
- return rect;
-}
-
-void
-RendererAgg::set_clip_from_bbox(const Py::Object& o) {
-
- // do not puut this in the else below. We want to unconditionally
- // clear the clip
- theRasterizer->reset_clipping();
- rendererBase->reset_clipping(true);
-
- if (o.ptr() != Py_None) { //using clip
- // Bbox::check(args[0]) failing; something about cross module?
- // set the clip rectangle
- // flipy
- agg::rect_base<double> r = bbox_to_rect<double>(o);
- theRasterizer->clip_box(r.x1, r.y1, r.x2, r.y2);
- rendererBase->clip_box((int)r.x1, (int)r.y1, (int)r.x2, (int)r.y2);
- }
-
-}
-
-/****************************/
-
-int RendererAgg::intersectCheck(double yCoord, double x1, double y1, double
x2, double y2, int* intersectPoint)
-{
- /* Returns 0 if no intersection or 1 if yes */
- /* If yes, changes intersectPoint to the x coordinate of the point of
intersection */
- if ((y1>=yCoord) != (y2>=yCoord)) {
- /* Don't need to check for y1==y2 because the above condition rejects it
automatically */
- *intersectPoint = (int)( ( x1 * (y2 - yCoord) + x2 * (yCoord - y1) ) / (y2
- y1) + 0.5);
- return 1;
- }
- return 0;
-}
-
bool RendererAgg::render_clippath(const GCAgg& gc) {
typedef agg::conv_transform<PathIterator> transformed_path_t;
typedef agg::conv_curve<transformed_path_t> curve_t;
@@ -633,6 +565,7 @@
typedef agg::renderer_scanline_aa_solid<amask_ren_type>
amask_aa_renderer_type;
typedef agg::renderer_scanline_bin_solid<amask_ren_type>
amask_bin_renderer_type;
+ rendererBase->reset_clipping(true);
theRasterizer->reset_clipping();
args.verify_length(5, 6);
@@ -802,6 +735,7 @@
};
+// MGDTODO: Support clip paths
Py::Object
RendererAgg::draw_text_image(const Py::Tuple& args) {
_VERBOSE("RendererAgg::draw_text");
@@ -877,6 +811,7 @@
}
+// MGDTODO: Support clip paths
Py::Object
RendererAgg::draw_image(const Py::Tuple& args) {
_VERBOSE("RendererAgg::draw_image");
@@ -885,8 +820,11 @@
float x = Py::Float(args[0]);
float y = Py::Float(args[1]);
Image *image = static_cast<Image*>(args[2].ptr());
+ Py::Object box_obj = args[3];
- set_clip_from_bbox(args[3]);
+ theRasterizer->reset_clipping();
+ rendererBase->reset_clipping(true);
+ set_clipbox(box_obj, rendererBase);
pixfmt pixf(*(image->rbufOut));
Modified: branches/transforms/src/_backend_agg.h
===================================================================
--- branches/transforms/src/_backend_agg.h 2007-10-04 17:22:01 UTC (rev
3913)
+++ branches/transforms/src/_backend_agg.h 2007-10-04 18:57:27 UTC (rev
3914)
@@ -111,7 +111,6 @@
~GCAgg() {
delete [] dasha;
- delete [] cliprect;
}
double dpi;
@@ -126,7 +125,7 @@
double alpha;
agg::rgba color;
- double *cliprect;
+ Py::Object cliprect;
Py::Object clippath;
agg::trans_affine clippath_trans;
@@ -214,16 +213,12 @@
const int debug;
protected:
- template<class T>
- agg::rect_base<T> bbox_to_rect( const Py::Object& o);
double points_to_pixels( const Py::Object& points);
double points_to_pixels_snapto( const Py::Object& points);
- int intersectCheck(double, double, double, double, double, int*);
- void set_clip_from_bbox(const Py::Object& o);
agg::rgba rgb_to_color(const Py::SeqBase<Py::Object>& rgb, double alpha);
facepair_t _get_rgba_face(const Py::Object& rgbFace, double alpha);
template<class R>
- void set_clipbox(double *cliprect, R rasterizer);
+ void set_clipbox(Py::Object& cliprect, R rasterizer);
bool render_clippath(const GCAgg& gc);
private:
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: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins