@@ -47,10 +47,36 @@ double
47
47
_points_to_pixels (RendererAggObject* renderer, double pt) {
48
48
// convert a value in points to pixels depending on renderer dpi and
49
49
// 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 ;
51
51
52
52
}
53
53
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
+
54
80
agg::gen_stroke::line_cap_e
55
81
_gc_get_linecap (PyObject *gc) {
56
82
@@ -294,13 +320,16 @@ newRendererAggObject(PyObject *args)
294
320
295
321
self->rbuf = new agg::rendering_buffer;
296
322
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
+
299
327
self->pixf = new pixfmt (*self->rbuf );
300
328
self->rbase = new renderer_base (*self->pixf );
301
329
self->rbase ->clear (agg::rgba (1 , 1 , 1 ));
302
330
303
331
self->ren = new renderer (*self->rbase );
332
+ self->ren_bin = new renderer_bin (*self->rbase );
304
333
self->ras = new rasterizer ();
305
334
self->buffer = buffer;
306
335
self->dpi = dpi;
@@ -358,7 +387,7 @@ RendererAgg_draw_ellipse(RendererAggObject *renderer, PyObject* args) {
358
387
}
359
388
renderer->ren ->color (*facecolor);
360
389
renderer->ras ->add_path (path);
361
- renderer->ras ->render (*renderer->sline , *renderer->ren );
390
+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
362
391
delete facecolor;
363
392
}
364
393
@@ -374,7 +403,7 @@ RendererAgg_draw_ellipse(RendererAggObject *renderer, PyObject* args) {
374
403
renderer->ren ->color (*edgecolor);
375
404
// self->ras->gamma(agg::gamma_power(gamma));
376
405
renderer->ras ->add_path (stroke);
377
- renderer->ras ->render (*renderer->sline , *renderer->ren );
406
+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
378
407
delete edgecolor;
379
408
Py_INCREF (Py_None);
380
409
return Py_None;
@@ -453,7 +482,7 @@ RendererAgg_draw_polygon(RendererAggObject *renderer, PyObject* args) {
453
482
}
454
483
renderer->ren ->color (*facecolor);
455
484
renderer->ras ->add_path (path);
456
- renderer->ras ->render (*renderer->sline , *renderer->ren );
485
+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
457
486
delete facecolor;
458
487
}
459
488
@@ -464,7 +493,7 @@ RendererAgg_draw_polygon(RendererAggObject *renderer, PyObject* args) {
464
493
renderer->ren ->color (*edgecolor);
465
494
// self->ras->gamma(agg::gamma_power(gamma));
466
495
renderer->ras ->add_path (stroke);
467
- renderer->ras ->render (*renderer->sline , *renderer->ren );
496
+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
468
497
delete edgecolor;
469
498
Py_INCREF (Py_None);
470
499
return Py_None;
@@ -505,7 +534,7 @@ RendererAgg_draw_rectangle(RendererAggObject *renderer, PyObject* args) {
505
534
}
506
535
renderer->ren ->color (*facecolor);
507
536
renderer->ras ->add_path (path);
508
- renderer->ras ->render (*renderer->sline , *renderer->ren );
537
+
684D
renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
509
538
delete facecolor;
510
539
}
511
540
@@ -515,7 +544,7 @@ RendererAgg_draw_rectangle(RendererAggObject *renderer, PyObject* args) {
515
544
renderer->ren ->color (*edgecolor);
516
545
// self->ras->gamma(agg::gamma_power(gamma));
517
546
renderer->ras ->add_path (stroke);
518
- renderer->ras ->render (*renderer->sline , *renderer->ren );
547
+ renderer->ras ->render (*renderer->sline_p8 , *renderer->ren );
519
548
delete edgecolor;
520
549
Py_INCREF (Py_None);
521
550
return Py_None;
@@ -528,8 +557,7 @@ RendererAgg_draw_lines(RendererAggObject *renderer, PyObject* args) {
528
557
529
558
PyObject *gc;
530
559
PyObject *x, *y;
531
-
532
-
560
+
533
561
if (!PyArg_ParseTuple (args, " OOO" , &gc, &x, &y))
534
562
return NULL ;
535
563
@@ -601,21 +629,20 @@ RendererAgg_draw_lines(RendererAggObject *renderer, PyObject* args) {
601
629
602
630
double thisX, thisY;
603
631
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 ;
606
634
path.move_to (thisX, thisY);
607
635
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 ;
610
638
path.line_to (thisX, thisY);
611
639
}
612
640
613
- renderer-> ren -> color (*color);
641
+
614
642
615
643
616
644
if (! useDashes ) {
617
645
agg::conv_stroke<agg::path_storage> stroke (path);
618
- stroke.width (1.0 );
619
646
stroke.line_cap (cap);
620
647
stroke.line_join (join);
621
648
stroke.width (lw);
@@ -648,18 +675,29 @@ RendererAgg_draw_lines(RendererAggObject *renderer, PyObject* args) {
648
675
off = _points_to_pixels (renderer, _seqitem_as_double (dashSeq, 2 *i+1 ));
649
676
dash.add_dash (on, off);
650
677
}
651
- stroke.width (1.0 );
652
678
stroke.line_cap (cap);
653
679
stroke.line_join (join);
654
680
stroke.width (lw);
655
681
renderer->ras ->add_path (stroke);
656
682
Py_XDECREF (dashSeq);
657
683
}
658
-
659
-
660
684
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
+ }
661
695
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
+ */
663
701
delete color;
664
702
665
703
Py_INCREF (Py_None);
@@ -722,16 +760,27 @@ RendererAgg_draw_text(RendererAggObject *renderer, PyObject* args) {
722
760
// printf("%u %u %u %u %d %d\n", iwidth, iheight, font->image.width, font->image.height, x, y);
723
761
pixfmt::color_type p;
724
762
p.r = int (255 *r); p.b = int (255 *b); p.g = int (255 *g); p.a = int (255 *a);
725
-
763
+
726
764
for (size_t i=0 ; i<font->image .width ; ++i) {
727
765
for (size_t j=0 ; j<font->image .height ; ++j) {
728
- if (i+x>=iwidth) continue ;
766
+ if (i+x>=iwidth) continue ;
729
767
if (j+y>=iheight) continue ;
768
+
730
769
renderer->pixf ->blend_pixel (i+x, j+y, p,
731
770
font->image .buffer [i + j*font->image .width ]);
732
- }
771
+ }
733
772
}
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]);
734
779
780
+ }
781
+ printf("\n");
782
+ }
783
+ */
735
784
Py_INCREF (Py_None);
736
785
return Py_None;
737
786
0 commit comments