Revision: 4392
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4392&view=rev
Author: mdboom
Date: 2007年11月20日 05:50:04 -0800 (2007年11月20日)
Log Message:
-----------
Removing trailing whitespace so a merge from trunk will be possible.
Modified Paths:
--------------
branches/transforms/src/_backend_agg.cpp
Modified: branches/transforms/src/_backend_agg.cpp
===================================================================
--- branches/transforms/src/_backend_agg.cpp 2007年11月20日 13:29:20 UTC (rev 4391)
+++ branches/transforms/src/_backend_agg.cpp 2007年11月20日 13:50:04 UTC (rev 4392)
@@ -50,7 +50,7 @@
the C++ representation as a std::vector<std::pair<double, double> >
(GCAgg::dash_t)
*/
-void convert_dashes(const Py::Tuple& dashes, double dpi, GCAgg::dash_t& dashes_out,
+void convert_dashes(const Py::Tuple& dashes, double dpi, GCAgg::dash_t& dashes_out,
double& dashOffset_out) {
if (dashes.length()!=2)
throw Py::ValueError(Printf("Dash descriptor must be a length 2 tuple; found %d", dashes.length()).str());
@@ -59,11 +59,11 @@
dashOffset_out = 0.0;
if (dashes[0].ptr() == Py_None)
return;
-
+
dashOffset_out = double(Py::Float(dashes[0])) * dpi/72.0;
Py::SeqBase<Py::Object> dashSeq = dashes[1];
-
+
size_t Ndash = dashSeq.length();
if (Ndash % 2 != 0)
throw Py::ValueError(Printf("Dash sequence must be an even length sequence; found %d", Ndash).str());
@@ -89,9 +89,9 @@
public:
conv_quantize(VertexSource& source, bool quantize) :
m_source(&source), m_quantize(quantize) {}
-
- void rewind(unsigned path_id) {
- m_source->rewind(path_id);
+
+ void rewind(unsigned path_id) {
+ m_source->rewind(path_id);
}
unsigned vertex(double* x, double* y) {
@@ -142,9 +142,9 @@
GCAgg::get_color(const Py::Object& gc) {
_VERBOSE("GCAgg::get_color");
Py::Tuple rgb = Py::Tuple( gc.getAttr("_rgb") );
-
+
double alpha = Py::Float( gc.getAttr("_alpha") );
-
+
double r = Py::Float(rgb[0]);
double g = Py::Float(rgb[1]);
double b = Py::Float(rgb[2]);
@@ -161,7 +161,7 @@
void
GCAgg::_set_linecap(const Py::Object& gc) {
_VERBOSE("GCAgg::_set_linecap");
-
+
std::string capstyle = Py::String( gc.getAttr( "_capstyle" ) );
if (capstyle=="butt")
@@ -177,9 +177,9 @@
void
GCAgg::_set_joinstyle(const Py::Object& gc) {
_VERBOSE("GCAgg::_set_joinstyle");
-
+
std::string joinstyle = Py::String( gc.getAttr("_joinstyle") );
-
+
if (joinstyle=="miter")
join = agg::miter_join;
else if (joinstyle=="round")
@@ -194,7 +194,7 @@
GCAgg::_set_dashes(const Py::Object& gc) {
//return the dashOffset, dashes sequence tuple.
_VERBOSE("GCAgg::_set_dashes");
-
+
Py::Object dash_obj( gc.getAttr( "_dashes" ) );
if (dash_obj.ptr() == Py_None) {
dashes.clear();
@@ -207,7 +207,7 @@
void
GCAgg::_set_clip_rectangle( const Py::Object& gc) {
//set the clip rectangle from the gc
-
+
_VERBOSE("GCAgg::_set_clip_rectangle");
Py::Object o ( gc.getAttr( "_cliprect" ) );
@@ -217,9 +217,9 @@
void
GCAgg::_set_clip_path( const Py::Object& gc) {
//set the clip path from the gc
-
+
_VERBOSE("GCAgg::_set_clip_path");
-
+
Py::Object method_obj = gc.getAttr("get_clip_path");
Py::Callable method(method_obj);
Py::Tuple path_and_transform = method.apply(Py::Tuple());
@@ -243,12 +243,12 @@
{
_VERBOSE("RendererAgg::RendererAgg");
unsigned stride(width*4);
-
-
+
+
pixBuffer = new agg::int8u[NUMBYTES];
renderingBuffer = new agg::rendering_buffer;
renderingBuffer->attach(pixBuffer, width, height, stride);
-
+
alphaBuffer = new agg::int8u[NUMBYTES];
alphaMaskRenderingBuffer = new agg::rendering_buffer;
alphaMaskRenderingBuffer->attach(alphaBuffer, width, height, stride);
@@ -258,33 +258,33 @@
rendererBaseAlphaMask = new renderer_base_alpha_mask_type(*pixfmtAlphaMask);
rendererAlphaMask = new renderer_alpha_mask_type(*rendererBaseAlphaMask);
scanlineAlphaMask = new agg::scanline_p8();
-
-
+
+
slineP8 = new scanline_p8;
slineBin = new scanline_bin;
-
+
pixFmt = new pixfmt(*renderingBuffer);
rendererBase = new renderer_base(*pixFmt);
rendererBase->clear(agg::rgba(1, 1, 1, 0));
-
+
rendererAA = new renderer_aa(*rendererBase);
rendererBin = new renderer_bin(*rendererBase);
theRasterizer = new rasterizer();
//theRasterizer->filling_rule(agg::fill_even_odd);
//theRasterizer->filling_rule(agg::fill_non_zero);
-
+
};
template<class R>
void
RendererAgg::set_clipbox(const Py::Object& cliprect, R rasterizer) {
//set the clip rectangle from the gc
-
+
_VERBOSE("RendererAgg::set_clipbox");
double l, b, r, t;
if (py_convert_bbox(cliprect.ptr(), l, b, r, t)) {
- rasterizer->clip_box(int(round(l)) + 1, height - int(round(b)),
+ rasterizer->clip_box(int(round(l)) + 1, height - int(round(b)),
int(round(r)), height - int(round(t)));
}
@@ -295,7 +295,7 @@
RendererAgg::_get_rgba_face(const Py::Object& rgbFace, double alpha) {
_VERBOSE("RendererAgg::_get_rgba_face");
std::pair<bool, agg::rgba> face;
-
+
if (rgbFace.ptr() == Py_None) {
face.first = false;
}
@@ -311,7 +311,7 @@
SafeSnap::snap (const float& x, const float& y) {
xsnap = (int)x + 0.5;
ysnap = (int)y + 0.5;
-
+
if ( first || ( (xsnap!=lastxsnap) || (ysnap!=lastysnap) ) ) {
lastxsnap = xsnap;
lastysnap = ysnap;
@@ -328,7 +328,7 @@
lastysnap = ysnap;
lastx = x;
lasty = y;
- return SnapData(false, xsnap, ysnap);
+ return SnapData(false, xsnap, ysnap);
}
// ok the real points are not identical but the rounded ones, so do
@@ -343,12 +343,12 @@
lastysnap = ysnap;
lastx = x;
lasty = y;
- return SnapData(true, xsnap, ysnap);
-}
+ return SnapData(true, xsnap, ysnap);
+}
template<class Path>
bool should_snap(Path& path, const agg::trans_affine& trans) {
- // If this is a straight horizontal or vertical line, quantize to nearest
+ // If this is a straight horizontal or vertical line, quantize to nearest
// pixels
double x0, y0, x1, y1;
unsigned code;
@@ -385,11 +385,11 @@
Py::Object box_obj = args[0];
double l, b, r, t;
- if (!py_convert_bbox(box_obj.ptr(), l, b, r, t))
+ if (!py_convert_bbox(box_obj.ptr(), l, b, r, t))
throw Py::TypeError("Invalid bbox provided to copy_from_bbox");
-
+
agg::rect_i rect((int)l, height - (int)t, (int)r, height - (int)b);
-
+
BufferRegion* reg = NULL;
try {
reg = new BufferRegion(rect, true);
@@ -403,7 +403,7 @@
agg::rendering_buffer rbuf;
rbuf.attach(reg->data, reg->width, reg->height, reg->stride);
-
+
pixfmt pf(rbuf);
renderer_base rb(pf);
rb.copy_from(*renderingBuffer, &rect, -rect.x1, -rect.y1);
@@ -415,20 +415,20 @@
//copy BufferRegion to buffer
args.verify_length(1);
BufferRegion* region = static_cast<BufferRegion*>(args[0].ptr());
-
+
if (region->data==NULL)
return Py::Object();
//throw Py::ValueError("Cannot restore_region from NULL data");
-
-
+
+
agg::rendering_buffer rbuf;
rbuf.attach(region->data,
region->width,
region->height,
region->stride);
-
+
rendererBase->copy_from(rbuf, 0, region->rect.x1, region->rect.y1);
-
+
return Py::Object();
}
@@ -438,8 +438,8 @@
bool has_clippath = (clippath.ptr() != Py_None);
- if (has_clippath &&
- (clippath.ptr() != lastclippath.ptr() ||
+ if (has_clippath &&
+ (clippath.ptr() != lastclippath.ptr() ||
clippath_trans != lastclippath_transform)) {
agg::trans_affine trans(clippath_trans);
trans *= agg::trans_affine_scaling(1.0, -1.0);
@@ -471,7 +471,7 @@
typedef agg::renderer_scanline_bin_solid<amask_ren_type> amask_bin_renderer_type;
args.verify_length(5, 6);
-
+
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]);
@@ -485,7 +485,7 @@
marker_trans *= agg::trans_affine_scaling(1.0, -1.0);
trans *= agg::trans_affine_scaling(1.0, -1.0);
trans *= agg::trans_affine_translation(0.0, (double)height);
-
+
PathIterator marker_path(marker_path_obj);
transformed_path_t marker_path_transformed(marker_path, marker_trans);
curve_t marker_path_curve(marker_path_transformed);
@@ -498,11 +498,11 @@
path_quantized.rewind(0);
facepair_t face = _get_rgba_face(face_obj, gc.alpha);
-
+
//maxim's suggestions for cached scanlines
agg::scanline_storage_aa8 scanlines;
theRasterizer->reset();
-
+
agg::int8u* fillCache = NULL;
agg::int8u* strokeCache = NULL;
@@ -515,7 +515,7 @@
fillCache = new agg::int8u[fillSize]; // or any container
scanlines.serialize(fillCache);
}
-
+
stroke_t stroke(marker_path_curve);
stroke.width(gc.linewidth);
stroke.line_cap(gc.cap);
@@ -531,7 +531,7 @@
rendererBase->reset_clipping(true);
set_clipbox(gc.cliprect, rendererBase);
bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
-
+
double x, y;
agg::serialized_scanlines_adaptor_aa8 sa;
@@ -580,16 +580,16 @@
delete[] strokeCache;
throw;
}
-
+
delete [] fillCache;
delete [] strokeCache;
return Py::Object();
-
+
}
/**
- * This is a custom span generator that converts spans in the
+ * This is a custom span generator that converts spans in the
* 8-bit inverted greyscale font buffer to rgba that agg can use.
*/
template<class ChildGenerator>
@@ -605,9 +605,9 @@
child_type* _gen;
color_type _color;
span_alloc_type _allocator;
-
+
public:
- font_to_rgba(child_type* gen, color_type color) :
+ font_to_rgba(child_type* gen, color_type color) :
_gen(gen),
_color(color) {
}
@@ -626,7 +626,7 @@
} while (--len);
}
- void prepare()
+ void prepare()
{
_gen->prepare();
}
@@ -642,18 +642,18 @@
typedef agg::span_allocator<agg::rgba8> color_span_alloc_type;
typedef agg::span_interpolator_linear<> interpolator_type;
typedef agg::image_accessor_clip<agg::pixfmt_gray8> image_accessor_type;
- typedef agg::span_image_filter_gray_2x2<image_accessor_type, interpolator_type>
+ typedef agg::span_image_filter_gray_2x2<image_accessor_type, interpolator_type>
image_span_gen_type;
typedef font_to_rgba<image_span_gen_type> span_gen_type;
- typedef agg::renderer_scanline_aa<renderer_base, color_span_alloc_type, span_gen_type>
+ typedef agg::renderer_scanline_aa<renderer_base, color_span_alloc_type, span_gen_type>
renderer_type;
-
+
args.verify_length(5);
-
+
FT2Image *image = static_cast<FT2Image*>(args[0].ptr());
if (!image->get_buffer())
return Py::Object();
-
+
int x(0),y(0);
try {
x = Py::Int( args[1] );
@@ -663,21 +663,21 @@
//x,y out of range; todo issue warning?
return Py::Object();
}
-
+
double angle = Py::Float( args[3] );
GCAgg gc = GCAgg(args[4], dpi);
-
+
theRasterizer->reset_clipping();
rendererBase->reset_clipping(true);
set_clipbox(gc.cliprect, theRasterizer);
const unsigned char* const buffer = image->get_buffer();
agg::rendering_buffer srcbuf
- ((agg::int8u*)buffer, image->get_width(),
+ ((agg::int8u*)buffer, image->get_width(),
image->get_height(), image->get_width());
agg::pixfmt_gray8 pixf_img(srcbuf);
-
+
agg::trans_affine mtx;
mtx *= agg::trans_affine_translation(0, -(int)image->get_height());
mtx *= agg::trans_affine_rotation(-angle * agg::pi / 180.0);
@@ -702,10 +702,10 @@
image_span_gen_type image_span_generator(ia, interpolator, filter);
span_gen_type output_span_generator(&image_span_generator, gc.color);
renderer_type ri(*rendererBase, sa, output_span_generator);
-
+
theRasterizer->add_path(rect2);
agg::render_scanlines(*theRasterizer, *slineP8, ri);
-
+
return Py::Object();
}
@@ -716,7 +716,7 @@
_VERBOSE("RendererAgg::draw_image");
args.verify_length(4, 6);
-
+
float x = Py::Float(args[0]);
float y = Py::Float(args[1]);
Image *image = static_cast<Image*>(args[2].ptr());
@@ -727,7 +727,7 @@
clippath = args[4];
clippath_trans = py_to_agg_transformation_matrix(args[5], false);
}
-
+
theRasterizer->reset_clipping();
rendererBase->reset_clipping(true);
set_clipbox(box_obj, rendererBase);
@@ -739,13 +739,13 @@
rendererBase->blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut)));
image->flipud_out(empty);
-
+
return Py::Object();
}
template<class PathIteratorType>
-void RendererAgg::_draw_path(PathIteratorType& path, agg::trans_affine trans,
- bool has_clippath, const facepair_t& face,
+void RendererAgg::_draw_path(PathIteratorType& path, agg::trans_affine trans,
+ bool has_clippath, const facepair_t& face,
const GCAgg& gc, bool check_snap) {
typedef agg::conv_transform<PathIteratorType> transformed_path_t;
typedef conv_quantize<transformed_path_t> quantize_t;
@@ -768,7 +768,7 @@
transformed_path_t tpath(path, trans);
quantize_t quantized(tpath, snap);
// Benchmarking shows that there is no noticable slowdown to always
- // treating paths as having curved segments. Doing so greatly
+ // treating paths as having curved segments. Doing so greatly
// simplifies the code
curve_t curve(quantized);
@@ -824,14 +824,14 @@
val1 = (int)val1 + 0.5;
}
dash.add_dash(val0, val1);
- }
+ }
stroke_dash_t stroke(dash);
stroke.line_cap(gc.cap);
stroke.line_join(gc.join);
stroke.width(linewidth);
theRasterizer->add_path(stroke);
}
-
+
if (gc.isaa && !(snap)) {
if (has_clippath) {
pixfmt_amask_type pfa(*pixFmt, *alphaMask);
@@ -856,7 +856,7 @@
}
}
}
-}
+}
Py::Object
RendererAgg::draw_path(const Py::Tuple& args) {
@@ -873,14 +873,14 @@
PathIterator path(path_obj);
GCAgg gc = GCAgg(gc_obj, dpi);
facepair_t face = _get_rgba_face(face_obj, gc.alpha);
-
+
theRasterizer->reset_clipping();
rendererBase->reset_clipping(true);
set_clipbox(gc.cliprect, theRasterizer);
bool has_clippath = render_clippath(gc.clippath, gc.clippath_trans);
_draw_path(path, trans, has_clippath, face, gc, true);
-
+
return Py::Object();
}
@@ -909,26 +909,26 @@
try {
offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2);
- if (!offsets ||
- (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
+ if (!offsets ||
+ (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) ||
(PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) {
throw Py::ValueError("Offsets array must be Nx2");
}
PyArrayObject* facecolors = (PyArrayObject*)PyArray_FromObject
(facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
- if (!facecolors ||
- (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) ||
+ if (!facecolors ||
+ (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) ||
(PyArray_NDIM(facecolors) == 2 && PyArray_DIM(facecolors, 1) != 4))
throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty");
PyArrayObject* edgecolors = (PyArrayObject*)PyArray_FromObject
(edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2);
- if (!edgecolors ||
- (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) ||
+ if (!edgecolors ||
+ (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) ||
(PyArray_NDIM(edgecolors) == 2 && PyArray_DIM(edgecolors, 1) != 4))
throw Py::ValueError("Edgecolors must be a Nx4 numpy array");
-
+
size_t Npaths = path_generator.num_paths();
size_t Noffsets = offsets->dimensions[0];
size_t N = std::max(Npaths, Noffsets);
@@ -941,9 +941,9 @@
if ((Nfacecolors == 0 && Nedgecolors == 0) || Npaths == 0)
return Py::Object();
-
+
size_t i = 0;
-
+
// Convert all of the transforms up front
typedef std::vector<agg::trans_affine> transforms_t;
transforms_t transforms;
@@ -954,23 +954,23 @@
trans *= master_transform;
transforms.push_back(trans);
}
-
+
// Convert all the dashes up front
typedef std::vector<std::pair<double, GCAgg::dash_t> > dashes_t;
dashes_t dashes;
dashes.resize(Nlinestyles);
i = 0;
- for (dashes_t::iterator d = dashes.begin();
+ for (dashes_t::iterator d = dashes.begin();
d != dashes.end(); ++d, ++i) {
convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second, d->first);
}
-
+
// Handle any clipping globally
theRasterizer->reset_clipping();
rendererBase->reset_clipping(true);
set_clipbox(cliprect, theRasterizer);
bool has_clippath = render_clippath(clippath, clippath_trans);
-
+
// Set some defaults, assuming no face or edge
gc.linewidth = 0.0;
facepair_t face;
@@ -991,7 +991,7 @@
offset_trans.transform(&xo, &yo);
trans *= agg::trans_affine_translation(xo, yo);
}
-
+
if (Nfacecolors) {
size_t fi = i % Nfacecolors;
face.second = agg::rgba(*(double*)PyArray_GETPTR2(facecolors, fi, 0),
@@ -999,7 +999,7 @@
*(double*)PyArray_GETPTR2(facecolors, fi, 2),
*(double*)PyArray_GETPTR2(facecolors, fi, 3));
}
-
+
if (Nedgecolors) {
size_t ei = i % Nedgecolors;
gc.color = agg::rgba(*(double*)PyArray_GETPTR2(edgecolors, ei, 0),
@@ -1016,7 +1016,7 @@
gc.dashOffset = dashes[i % Nlinestyles].first;
}
}
-
+
gc.isaa = bool(Py::Int(antialiaseds[i % Naa]));
_draw_path(path, trans, has_clippath, face, gc, check_snap);
@@ -1044,7 +1044,7 @@
m_paths(paths), m_npaths(paths.size()) {
}
-
+
inline size_t num_paths() const {
return m_npaths;
}
@@ -1058,7 +1058,7 @@
RendererAgg::draw_path_collection(const Py::Tuple& args) {
_VERBOSE("RendererAgg::draw_path_collection");
args.verify_length(13);
-
+
//segments, trans, clipbox, colors, linewidths, antialiaseds
agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[0]);
Py::Object cliprect = args[1];
@@ -1108,7 +1108,7 @@
QuadMeshPathIterator(size_t m, size_t n, PyArrayObject* coordinates) :
m_iterator(0), m_m(m), m_n(n), m_coordinates(coordinates) {
}
-
+
static const size_t offsets[5][2];
inline unsigned vertex(unsigned idx, double* x, double* y) {
@@ -1127,7 +1127,7 @@
inline void rewind(unsigned path_id) {
m_iterator = path_id;
}
-
+
inline unsigned total_vertices() {
return 5;
}
@@ -1146,14 +1146,14 @@
if (!coordinates_array) {
throw Py::ValueError("Invalid coordinates array.");
}
-
+
PyArray_Dims shape;
npy_intp dims[] = { meshHeight + 1, meshWidth + 1, 2 };
shape.ptr = dims;
shape.len = 3;
m_coordinates = (PyArrayObject*)PyArray_Newshape(coordinates_array, &shape, PyArray_CORDER);
}
-
+
inline ~QuadMeshGenerator() {
Py_XDECREF(m_coordinates);
}
@@ -1178,7 +1178,7 @@
RendererAgg::draw_quad_mesh(const Py::Tuple& args) {
_VERBOSE("RendererAgg::draw_quad_mesh");
args.verify_length(12);
-
+
//segments, trans, clipbox, colors, linewidths, antialiaseds
agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[0]);
Py::Object cliprect = args[1];
@@ -1192,7 +1192,7 @@
Py::Object facecolors_obj = args[9];
bool antialiased = (bool)Py::Int(args[10]);
bool showedges = (bool)Py::Int(args[11]);
-
+
QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates);
Py::SeqBase<Py::Object> transforms_obj;
@@ -1238,10 +1238,10 @@
Py::Object
RendererAgg::write_rgba(const Py::Tuple& args) {
_VERBOSE("RendererAgg::write_rgba");
-
+
args.verify_length(1);
std::string fname = Py::String(args[0]);
-
+
std::ofstream of2( fname.c_str(), std::ios::binary|std::ios::out);
for (size_t i=0; i<NUMBYTES; i++) {
of2.write((char*)&(pixBuffer[i]), sizeof(char));
@@ -1253,7 +1253,7 @@
PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr);
PyObject* write_method = PyObject_GetAttrString(py_file_obj, "write");
PyObject_CallFunction(write_method, "s#", data, length);
-
+
// MGDTODO: Check NULL on failure
}
@@ -1272,9 +1272,9 @@
RendererAgg::write_png(const Py::Tuple& args)
{
_VERBOSE("RendererAgg::write_png");
-
+
args.verify_length(1, 2);
-
+
FILE *fp = NULL;
Py::Object py_fileobj = Py::Object(args[0]);
if (py_fileobj.isString()) {
@@ -1294,34 +1294,34 @@
png_bytep *row_pointers = NULL;
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
-
+
try {
struct png_color_8_struct sig_bit;
png_uint_32 row;
-
+
row_pointers = new png_bytep[height];
for (row = 0; row < height; ++row) {
row_pointers[row] = pixBuffer + row * width * 4;
}
-
+
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL) {
throw Py::RuntimeError("Could not create write struct");
}
-
+
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
throw Py::RuntimeError("Could not create info struct");
}
-
+
if (setjmp(png_ptr->jmpbuf)) {
throw Py::RuntimeError("Error building image");
}
-
+
if (fp) {
png_init_io(png_ptr, fp);
} else {
- png_set_write_fn(png_ptr, (void*)py_fileobj.ptr(),
+ png_set_write_fn(png_ptr, (void*)py_fileobj.ptr(),
&write_png_data, &flush_png_data);
}
png_set_IHDR(png_ptr, info_ptr,
@@ -1335,7 +1335,7 @@
size_t dots_per_meter = (size_t)(dpi / (2.54 / 100.0));
png_set_pHYs(png_ptr, info_ptr, dots_per_meter, dots_per_meter, PNG_RESOLUTION_METER);
}
-
+
// this a a color image!
sig_bit.gray = 0;
sig_bit.red = 8;
@@ -1344,23 +1344,23 @@
/* if the image has an alpha channel then */
sig_bit.alpha = 8;
png_set_sBIT(png_ptr, info_ptr, &sig_bit);
-
+
png_write_info(png_ptr, info_ptr);
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, info_ptr);
-
+
/* Changed calls to png_destroy_write_struct to follow
http://www.libpng.org/pub/png/libpng-manual.txt.
This ensures the info_ptr memory is released.
*/
-
+
} catch (...) {
if (fp) fclose(fp);
delete [] row_pointers;
if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr);
throw;
}
-
+
png_destroy_write_struct(&png_ptr, &info_ptr);
delete [] row_pointers;
if (fp) fclose(fp);
@@ -1372,9 +1372,9 @@
Py::Object
RendererAgg::tostring_rgb(const Py::Tuple& args) {
//"Return the rendered buffer as an RGB string";
-
+
_VERBOSE("RendererAgg::tostring_rgb");
-
+
args.verify_length(0);
int row_len = width*3;
unsigned char* buf_tmp = new unsigned char[row_len * height];
@@ -1387,10 +1387,10 @@
width,
height,
row_len);
-
+
agg::color_conv(&renderingBufferTmp, renderingBuffer, agg::color_conv_rgba32_to_rgb24());
-
-
+
+
//todo: how to do this with native CXX
PyObject* o = Py_BuildValue("s#",
buf_tmp,
@@ -1403,9 +1403,9 @@
Py::Object
RendererAgg::tostring_argb(const Py::Tuple& args) {
//"Return the rendered buffer as an RGB string";
-
+
_VERBOSE("RendererAgg::tostring_argb");
-
+
args.verify_length(0);
int row_len = width*4;
unsigned char* buf_tmp = new unsigned char[row_len * height];
@@ -1418,10 +1418,10 @@
width,
height,
row_len);
-
+
agg::color_conv(&renderingBufferTmp, renderingBuffer, agg::color_conv_rgba32_to_argb32());
-
-
+
+
//todo: how to do this with native CXX
PyObject* o = Py_BuildValue("s#",
buf_tmp,
@@ -1433,9 +1433,9 @@
Py::Object
RendererAgg::tostring_bgra(const Py::Tuple& args) {
//"Return the rendered buffer as an RGB string";
-
+
_VERBOSE("RendererAgg::tostring_bgra");
-
+
args.verify_length(0);
int row_len = width*4;
unsigned char* buf_tmp = new unsigned char[row_len * height];
@@ -1448,10 +1448,10 @@
width,
height,
row_len);
-
+
agg::color_conv(&renderingBufferTmp, renderingBuffer, agg::color_conv_rgba32_to_bgra32());
-
-
+
+
//todo: how to do this with native CXX
PyObject* o = Py_BuildValue("s#",
buf_tmp,
@@ -1463,9 +1463,9 @@
Py::Object
RendererAgg::buffer_rgba(const Py::Tuple& args) {
//"expose the rendered buffer as Python buffer object, starting from postion x,y";
-
+
_VERBOSE("RendererAgg::buffer_rgba");
-
+
args.verify_length(2);
int startw = Py::Int(args[0]);
int starth = Py::Int(args[1]);
@@ -1479,12 +1479,12 @@
Py::Object
RendererAgg::clear(const Py::Tuple& args) {
//"clear the rendered buffer";
-
+
_VERBOSE("RendererAgg::clear");
-
+
args.verify_length(0);
rendererBase->clear(agg::rgba(1, 1, 1, 0));
-
+
return Py::Object();
}
@@ -1492,12 +1492,12 @@
agg::rgba
RendererAgg::rgb_to_color(const Py::SeqBase<Py::Object>& rgb, double alpha) {
_VERBOSE("RendererAgg::rgb_to_color");
-
+
double r = Py::Float(rgb[0]);
double g = Py::Float(rgb[1]);
double b = Py::Float(rgb[2]);
return agg::rgba(r, g, b, alpha);
-
+
}
@@ -1510,8 +1510,8 @@
double p = Py::Float( points ) ;
//return (int)(p*PIXELS_PER_INCH/72.0*dpi/72.0)+0.5;
return (int)(p*dpi/72.0)+0.5;
-
-
+
+
}
double
@@ -1524,10 +1524,10 @@
RendererAgg::~RendererAgg() {
-
+
_VERBOSE("RendererAgg::~RendererAgg");
-
-
+
+
delete slineP8;
delete slineBin;
delete theRasterizer;
@@ -1536,7 +1536,7 @@
delete rendererBase;
delete pixFmt;
delete renderingBuffer;
-
+
delete alphaMask;
delete alphaMaskRenderingBuffer;
delete [] alphaBuffer;
@@ -1545,23 +1545,23 @@
delete rendererBaseAlphaMask;
delete rendererAlphaMask;
delete scanlineAlphaMask;
-
+
}
/* ------------ module methods ------------- */
Py::Object _backend_agg_module::new_renderer (const Py::Tuple &args,
const Py::Dict &kws)
{
-
+
if (args.length() != 3 )
{
throw Py::RuntimeError("Incorrect # of args to RendererAgg(width, height, dpi).");
}
-
+
int debug;
if ( kws.hasKey("debug") ) debug = Py::Int( kws["debug"] );
else debug=0;
-
+
int width = Py::Int(args[0]);
int height = Py::Int(args[1]);
double dpi = Py::Float(args[2]);
@@ -1572,7 +1572,7 @@
void BufferRegion::init_type() {
behaviors().name("BufferRegion");
behaviors().doc("A wrapper to pass agg buffer objects to and from the python level");
-
+
add_varargs_method("to_string", &BufferRegion::to_string,
"to_string()");
}
@@ -1582,7 +1582,7 @@
{
behaviors().name("RendererAgg");
behaviors().doc("The agg backend extension module");
-
+
add_varargs_method("draw_path", &RendererAgg::draw_path,
"draw_path(gc, path, transform, rgbFace)\n");
add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection,
@@ -1620,12 +1620,12 @@
init_backend_agg(void)
{
//static _backend_agg_module* _backend_agg = new _backend_agg_module;
-
+
_VERBOSE("init_backend_agg");
-
+
import_array();
-
+
static _backend_agg_module* _backend_agg = NULL;
_backend_agg = new _backend_agg_module;
-
+
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.