1616#include < cstdio>
1717#include < sstream>
1818
19- #include " agg_basics.h"
20- #include " _backend_agg_wrapper.h"
2119#include " py_converters.h"
2220
2321extern " C"
@@ -50,14 +48,14 @@ static int PyAggImagePhoto(ClientData clientdata, Tcl_Interp *interp, int argc,
5048{
5149 Tk_PhotoHandle photo;
5250 Tk_PhotoImageBlock block;
53- PyObject *aggo ;
51+ PyObject *bufferobj ;
5452
5553 // vars for blitting
5654 PyObject *bboxo;
5755
5856 size_t aggl, bboxl;
5957 bool has_bbox;
60- agg::int8u *destbuffer;
58+ uint8_t *destbuffer;
6159 int destx, desty, destwidth, destheight, deststride;
6260 // unsigned long tmp_ptr;
6361
@@ -84,12 +82,17 @@ static int PyAggImagePhoto(ClientData clientdata, Tcl_Interp *interp, int argc,
8482 Tcl_AppendResult (interp, " error casting pointer" , (char *)NULL );
8583 return TCL_ERROR;
8684 }
87- aggo = (PyObject *)aggl;
88-
89- // TODO: This is really brittle and will break when RendererAgg
90- // comes in multiple flavors
91- RendererAgg *aggRenderer = ((PyRendererAgg *)(aggo))->x ;
92- int srcheight = (int )aggRenderer->get_height ();
85+ bufferobj = (PyObject *)aggl;
86+
87+ numpy::array_view<uint8_t , 3 > buffer;
88+ try {
89+ buffer = numpy::array_view<uint8_t , 3 >(bufferobj);
90+ } catch (...) {
91+ Tcl_AppendResult (interp, " buffer is of wrong type" , (char *)NULL );
92+ PyErr_Clear ();
93+ return TCL_ERROR;
94+ }
95+ int srcheight = buffer.dim (0 );
9396
9497 /* XXX insert aggRenderer type check */
9598
@@ -127,13 +130,11 @@ static int PyAggImagePhoto(ClientData clientdata, Tcl_Interp *interp, int argc,
127130 return TCL_ERROR;
128131 }
129132
130- agg::rendering_buffer destrbuf;
131- destrbuf.attach (destbuffer, destwidth, destheight, deststride);
132- pixfmt destpf (destrbuf);
133- renderer_base destrb (destpf);
134-
135- agg::rect_base<int > region (destx, desty, (int )rect.x2 , srcheight - (int )rect.y1 );
136- destrb.copy_from (aggRenderer->renderingBuffer , ®ion, -destx, -desty);
133+ for (int i = 0 ; i < destheight; ++i) {
134+ memcpy (destbuffer + (deststride * i),
135+ &buffer (i + desty, destx, 0 ),
136+ deststride);
137+ }
137138 } else {
138139 has_bbox = false ;
139140 destbuffer = NULL ;
@@ -170,10 +171,10 @@ static int PyAggImagePhoto(ClientData clientdata, Tcl_Interp *interp, int argc,
170171 delete[] destbuffer;
171172
172173 } else {
173- block.width = aggRenderer-> get_width ( );
174- block.height = aggRenderer-> get_height ( );
174+ block.width = buffer. dim ( 1 );
175+ block.height = buffer. dim ( 0 );
175176 block.pitch = (int )block.width * nval;
176- block.pixelPtr = aggRenderer-> pixBuffer ;
177+ block.pixelPtr = buffer. data () ;
177178
178179 /* Clear current contents */
179180 Tk_PhotoBlank (photo);
0 commit comments