... |
... |
@@ -586,13 +586,83 @@ |
586
|
586
|
&x_advance, &y_advance, &glyf);
|
587
|
587
|
if ( !error )
|
588
|
588
|
{
|
589
|
|
- bitmap_scale( st, &bitg, scale );
|
|
589
|
+ int width = bitg.width;
|
|
590
|
+ int rows = bitg.rows;
|
|
591
|
+ int delta, pix = 1, piy = 1;
|
590
|
592
|
|
591
|
|
- grBlitGlyphToSurface( display->surface, &bitg,
|
592
|
|
- ox + left * scale, oy - top * scale,
|
593
|
|
- st->axis_color );
|
594
|
593
|
|
595
|
|
- grDoneBitmap( &bitg );
|
|
594
|
+ switch ( bitg.mode )
|
|
595
|
+ {
|
|
596
|
+ case gr_pixel_mode_lcd:
|
|
597
|
+ case gr_pixel_mode_lcd2:
|
|
598
|
+ width /= 3;
|
|
599
|
+ pix = 3;
|
|
600
|
+ break;
|
|
601
|
+ case gr_pixel_mode_lcdv:
|
|
602
|
+ case gr_pixel_mode_lcdv2:
|
|
603
|
+ rows /= 3;
|
|
604
|
+ piy = 3;
|
|
605
|
+ break;
|
|
606
|
+ case gr_pixel_mode_bgra:
|
|
607
|
+ pix = 4;
|
|
608
|
+ break;
|
|
609
|
+ default:
|
|
610
|
+ break;
|
|
611
|
+ }
|
|
612
|
+
|
|
613
|
+ /* extreme zoom needs early crop to avoid memory overallocation */
|
|
614
|
+ delta = oy - top * scale;
|
|
615
|
+ if ( delta < 0 )
|
|
616
|
+ {
|
|
617
|
+ delta /= scale;
|
|
618
|
+ rows += delta;
|
|
619
|
+ top += delta;
|
|
620
|
+ if ( bitg.pitch > 0 )
|
|
621
|
+ bitg.buffer -= delta * bitg.pitch * piy;
|
|
622
|
+ }
|
|
623
|
+
|
|
624
|
+ delta = oy + ( rows - top ) * scale - display->bitmap->rows;
|
|
625
|
+ if ( delta > 0 )
|
|
626
|
+ {
|
|
627
|
+ delta /= scale;
|
|
628
|
+ rows -= delta;
|
|
629
|
+ if ( bitg.pitch < 0 )
|
|
630
|
+ bitg.buffer += delta * bitg.pitch * piy;
|
|
631
|
+ }
|
|
632
|
+
|
|
633
|
+ bitg.rows = rows * piy;
|
|
634
|
+
|
|
635
|
+ delta = ox + left * scale;
|
|
636
|
+ if ( delta < 0 )
|
|
637
|
+ {
|
|
638
|
+ delta /= scale;
|
|
639
|
+ width += delta;
|
|
640
|
+ left -= delta;
|
|
641
|
+ bitg.buffer -= delta * pix;
|
|
642
|
+ }
|
|
643
|
+
|
|
644
|
+ delta = ox + ( left + width ) * scale - display->bitmap->width;
|
|
645
|
+ if ( delta > 0 )
|
|
646
|
+ {
|
|
647
|
+ delta /= scale;
|
|
648
|
+ width -= delta;
|
|
649
|
+ }
|
|
650
|
+
|
|
651
|
+ if ( bitg.mode == gr_pixel_mode_bgra )
|
|
652
|
+ pix = 1;
|
|
653
|
+
|
|
654
|
+ bitg.width = width * pix;
|
|
655
|
+
|
|
656
|
+ if ( width > 0 && rows > 0 )
|
|
657
|
+ {
|
|
658
|
+ bitmap_scale( st, &bitg, scale );
|
|
659
|
+
|
|
660
|
+ grBlitGlyphToSurface( display->surface, &bitg,
|
|
661
|
+ ox + left * scale, oy - top * scale,
|
|
662
|
+ st->axis_color );
|
|
663
|
+
|
|
664
|
+ grDoneBitmap( &bitg );
|
|
665
|
+ }
|
596
|
666
|
|
597
|
667
|
if ( glyf )
|
598
|
668
|
FT_Done_Glyph( glyf );
|