@@ -47,10 +47,36 @@ double
4747_points_to_pixels (RendererAggObject* renderer, double pt) {
4848 // convert a value in points to pixels depending on renderer dpi and
4949 // scrren pixels per inch
50- return pt*PIXELS_PER_INCH/72.0 *renderer->dpi /72.0 ;
50+ return ( int )( pt*PIXELS_PER_INCH/72.0 *renderer->dpi /72.0 )+ 0.5 ;
5151
5252}
5353
54+
55+ int
56+ _gc_antialiased (PyObject *gc) {
57+
58+
59+ // return whether to use antialiased drawing on the object; default true
60+
61+
62+ PyObject *antialiased;
63+ int isaa;
64+ int defaultVal=1 ;
65+
66+ // TODO: PyObject_GetAttrString returns ownership - do I need to manipulate the ref count here
67+ antialiased = PyObject_GetAttrString ( gc, " _antialiased" );
68+
69+ if (antialiased==NULL ) {
70+ printf (" Failed to find _antialiased attribute\n " );
71+ return defaultVal; // defaultVal true
72+ }
73+
74+ isaa = (int )PyInt_AsLong (antialiased);
75+
76+ // printf("Returning antialiased=%d\n", isaa);
77+ return isaa;
78+ }
79+
5480agg::gen_stroke::line_cap_e
5581_gc_get_linecap (PyObject *gc) {
5682
@@ -294,13 +320,16 @@ newRendererAggObject(PyObject *args)
294320
295321 self->rbuf = new agg::rendering_buffer;
296322 self->rbuf ->attach (buffer, width, height, stride);
297- self->sline = new scanline;
298-
323+ self->sline_p8 = new scanline_p8;
324+ self->sline_bin = new scanline_bin;
325+
326+
299327 self->pixf = new pixfmt (*self->rbuf );
300328 self->rbase = new renderer_base (*self->pixf );
301329 self->rbase ->clear (agg::rgba (1 , 1 , 1 ));
302330
303331 self->ren = new renderer (*self->rbase );
332+ self->ren_bin = new renderer_bin (*self->rbase );
304333 self->ras = new rasterizer ();
305334 self->buffer = buffer;
306335 self->dpi = dpi;
@@ -358,7 +387,7 @@ RendererAgg_draw_ellipse(RendererAggObject *renderer, PyObject* args) {
358387 }
359388 renderer->ren ->color (*facecolor);
360389 renderer->ras ->add_path (path);
361- renderer->ras ->render (*renderer->sline , *renderer->ren );
390+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
362391 delete facecolor;
363392 }
364393
@@ -374,7 +403,7 @@ RendererAgg_draw_ellipse(RendererAggObject *renderer, PyObject* args) {
374403 renderer->ren ->color (*edgecolor);
375404 // self->ras->gamma(agg::gamma_power(gamma));
376405 renderer->ras ->add_path (stroke);
377- renderer->ras ->render (*renderer->sline , *renderer->ren );
406+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
378407 delete edgecolor;
379408 Py_INCREF (Py_None);
380409 return Py_None;
@@ -453,7 +482,7 @@ RendererAgg_draw_polygon(RendererAggObject *renderer, PyObject* args) {
453482 }
454483 renderer->ren ->color (*facecolor);
455484 renderer->ras ->add_path (path);
456- renderer->ras ->render (*renderer->sline , *renderer->ren );
485+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
457486 delete facecolor;
458487 }
459488
@@ -464,7 +493,7 @@ RendererAgg_draw_polygon(RendererAggObject *renderer, PyObject* args) {
464493 renderer->ren ->color (*edgecolor);
465494 // self->ras->gamma(agg::gamma_power(gamma));
466495 renderer->ras ->add_path (stroke);
467- renderer->ras ->render (*renderer->sline , *renderer->ren );
496+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
468497 delete edgecolor;
469498 Py_INCREF (Py_None);
470499 return Py_None;
@@ -505,7 +534,7 @@ RendererAgg_draw_rectangle(RendererAggObject *renderer, PyObject* args) {
505534 }
506535 renderer->ren ->color (*facecolor);
507536 renderer->ras ->add_path (path);
508- renderer->ras ->render (*renderer->sline , *renderer->ren );
537+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
509538 delete facecolor;
510539 }
511540
@@ -515,7 +544,7 @@ RendererAgg_draw_rectangle(RendererAggObject *renderer, PyObject* args) {
515544 renderer->ren ->color (*edgecolor);
516545 // self->ras->gamma(agg::gamma_power(gamma));
517546 renderer->ras ->add_path (stroke);
518- renderer->ras ->render (*renderer->sline , *renderer->ren );
547+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
519548 delete edgecolor;
520549 Py_INCREF (Py_None);
521550 return Py_None;
@@ -528,8 +557,7 @@ RendererAgg_draw_lines(RendererAggObject *renderer, PyObject* args) {
528557
529558 PyObject *gc;
530559 PyObject *x, *y;
531-
532-
560+
533561 if (!PyArg_ParseTuple (args, " OOO" , &gc, &x, &y))
534562 return NULL ;
535563
@@ -601,21 +629,20 @@ RendererAgg_draw_lines(RendererAggObject *renderer, PyObject* args) {
601629
602630 double thisX, thisY;
603631 unsigned winHeight = renderer->rbase ->height ();
604- thisX = _seqitem_as_double (x, 0 );
605- thisY = winHeight - _seqitem_as_double (y, 0 );
632+ thisX = ( int )( _seqitem_as_double (x, 0 ))+ 0.5 ;
633+ thisY = ( int )( winHeight - _seqitem_as_double (y, 0 ))+ 0.5 ;
606634 path.move_to (thisX, thisY);
607635 for (int i=1 ; i<Nx; ++i) {
608- thisX = _seqitem_as_double (x, i);
609- thisY = winHeight - _seqitem_as_double (y, i);
636+ thisX = ( int )( _seqitem_as_double (x, i))+ 0.5 ;
637+ thisY = ( int )( winHeight - _seqitem_as_double (y, i)) + 0.5 ;
610638 path.line_to (thisX, thisY);
611639 }
612640
613- renderer-> ren -> color (*color);
641+
614642
615643
616644 if (! useDashes ) {
617645 agg::conv_stroke<agg::path_storage> stroke (path);
618- stroke.width (1.0 );
619646 stroke.line_cap (cap);
620647 stroke.line_join (join);
621648 stroke.width (lw);
@@ -648,18 +675,29 @@ RendererAgg_draw_lines(RendererAggObject *renderer, PyObject* args) {
648675 off = _points_to_pixels (renderer, _seqitem_as_double (dashSeq, 2 *i+1 ));
649676 dash.add_dash (on, off);
650677 }
651- stroke.width (1.0 );
652678 stroke.line_cap (cap);
653679 stroke.line_join (join);
654680 stroke.width (lw);
655681 renderer->ras ->add_path (stroke);
656682 Py_XDECREF (dashSeq);
657683 }
658-
659-
660684
685+
686+ if ( _gc_antialiased (gc) ) {
687+ // if ( 0 ) {
688+ renderer->ren ->color (*color);
689+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
690+ }
691+ else {
692+ renderer->ren_bin ->color (*color);
693+ renderer->ras ->render (*renderer->sline_bin , *renderer->ren_bin );
694+ }
661695
662- renderer->ras ->render (*renderer->sline , *renderer->ren );
696+
697+ /*
698+ renderer->ren->color(*color);
699+ renderer->ras->render(*renderer->sline_p8, *renderer->ren);
700+ */
663701 delete color;
664702
665703 Py_INCREF (Py_None);
@@ -722,16 +760,27 @@ RendererAgg_draw_text(RendererAggObject *renderer, PyObject* args) {
722760 // printf("%u %u %u %u %d %d\n", iwidth, iheight, font->image.width, font->image.height, x, y);
723761 pixfmt::color_type p;
724762 p.r = int (255 *r); p.b = int (255 *b); p.g = int (255 *g); p.a = int (255 *a);
725-
763+
726764 for (size_t i=0 ; i<font->image .width ; ++i) {
727765 for (size_t j=0 ; j<font->image .height ; ++j) {
728- if (i+x>=iwidth) continue ;
766+ if (i+x>=iwidth) continue ;
729767 if (j+y>=iheight) continue ;
768+
730769 renderer->pixf ->blend_pixel (i+x, j+y, p,
731770 font->image .buffer [i + j*font->image .width ]);
732- }
771+ }
733772 }
773+ /* // display the chars to screen for debugging
774+ printf("\n\n%s\n", font->text);
775+ for ( size_t i = 0; i < font->image.height; i++ ) {
776+ printf("%u ", i);
777+ for ( size_t j = 0; j < font->image.width; j++ ) {
778+ printf("%3u ", font->image.buffer[j + i*font->image.width]);
734779
780+ }
781+ printf("\n");
782+ }
783+ */
735784 Py_INCREF (Py_None);
736785 return Py_None;
737786
0 commit comments