freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Git][freetype/freetype-demos][master] [tgrid] Avoid memory guzzling.


From: Alexei Podtelezhnikov (@apodtele)
Subject: [Git][freetype/freetype-demos][master] [tgrid] Avoid memory guzzling.
Date: Wed, 18 Dec 2024 18:51:39 +0000

Alexei Podtelezhnikov pushed to branch master at FreeType / FreeType Demo Programs

Commits:

  • 2bbb6d39
    by Alexei Podtelezhnikov (Алексей Подтележников) at 2024-12-18T18:51:35+00:00
    [tgrid] Avoid memory guzzling.
    
    * src/ftgrid.c (grid_status_draw_outline:DO_BITMAP): Pseudo-crop the glyph 
    bitmap enough to cover visible area after scaling and avoid huge memory
    allocations.

1 changed file:

Changes:

  • src/ftgrid.c
    ... ... @@ -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 );
    


  • reply via email to

    [Prev in Thread] Current Thread [Next in Thread]