1212#include < Python.h>
1313#include < stdlib.h>
1414
15+ #include " agg_basics.h"
1516#include " _backend_agg.h"
1617#include " _transforms.h"
1718
@@ -46,7 +47,9 @@ PyAggImagePhoto(ClientData clientdata, Tcl_Interp* interp,
4647 // vars for blitting
4748 PyObject* bboxo;
4849 Bbox* bbox;
50+ agg::int8u *destbuffer;
4951 double l,b,r,t;
52+ int destx, desty, destwidth, destheight, deststride;
5053
5154 long mode;
5255 long nval;
@@ -83,11 +86,26 @@ PyAggImagePhoto(ClientData clientdata, Tcl_Interp* interp,
8386 b = bbox->ll_api ()->y_api ()->val ();
8487 r = bbox->ur_api ()->x_api ()->val ();
8588 t = bbox->ur_api ()->y_api ()->val ();
86- // int casts messes up precision, so must round
87- l = round (l);
88- b = round (b);
89- r = round (r);
90- t = round (t);
89+
90+ destx = (int )l;
91+ desty = (int )b;
92+ destwidth = (int )(r-l);
93+ destheight = (int )(t-b);
94+ deststride = 4 *destwidth;
95+
96+ destbuffer = new agg::int8u[deststride*destheight];
97+ if (destbuffer == NULL ) {
98+ throw Py::MemoryError (" _tkagg could not allocate memory for destbuffer" );
99+ }
100+
101+ agg::rendering_buffer destrbuf;
102+ destrbuf.attach (destbuffer, destwidth, destheight, deststride);
103+ pixfmt destpf (destrbuf);
104+ renderer_base destrb (destpf);
105+
106+ agg::rect_base<int > region (destx, desty, (int )r, (int )t);
107+ destrb.copy_from (*aggRenderer->renderingBuffer , ®ion,
108+ -destx, -desty);
91109 } else {
92110 bbox = NULL ;
93111 }
@@ -112,15 +130,22 @@ PyAggImagePhoto(ClientData clientdata, Tcl_Interp* interp,
112130 }
113131 }
114132
115- block.width = aggRenderer->get_width ();
116- block.height = aggRenderer->get_height ();
117- // std::cout << "w,h: " << block.width << " " << block.height << std::endl;
118- block.pitch = block.width * nval;
119- block.pixelPtr = aggRenderer->pixBuffer ;
120-
121133 if (bbox) {
122- Tk_PhotoPutBlock (photo, &block, (int )l, (int )b, (int )(r-l), (int )(t-b));
134+
135+ block.width = destwidth;
136+ block.height = destheight;
137+ block.pitch = deststride;
138+ block.pixelPtr = destbuffer;
139+
140+ Tk_PhotoPutBlock (photo, &block, destx, desty, destwidth, destheight);
141+ delete [] destbuffer;
142+
123143 } else {
144+ block.width = aggRenderer->get_width ();
145+ block.height = aggRenderer->get_height ();
146+ block.pitch = block.width * nval;
147+ block.pixelPtr = aggRenderer->pixBuffer ;
148+
124149 /* Clear current contents */
125150 Tk_PhotoBlank (photo);
126151 /* Copy opaque block to photo image, and leave the rest to TK */
0 commit comments