freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master eca9e12 1/2: [ftgrid] Display monochrome and LC


From: Alexei Podtelezhnikov
Subject: [freetype2-demos] master eca9e12 1/2: [ftgrid] Display monochrome and LCD bitmaps.
Date: Sun, 21 Feb 2016 03:56:03 +0000

branch: master
commit eca9e124436d498ccbca9ba111daffdd7f43822f
Author: Alexei Podtelezhnikov <address@hidden>
Commit: Alexei Podtelezhnikov <address@hidden>

    [ftgrid] Display monochrome and LCD bitmaps.
    
    * src/ftgrid.c (grid_status_draw_outline): Rework to use...
    (bitmap_scale): New function that implements bitmap scaling.
---
 ChangeLog    |    7 +++
 src/ftgrid.c |  142 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 121 insertions(+), 28 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1bdecda..c70cd30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-02-20  Alexei Podtelezhnikov  <address@hidden>
+
+       [ftgrid] Display monochrome and LCD bitmaps.
+
+       * src/ftgrid.c (grid_status_draw_outline): Rework to use...
+       (bitmap_scale): New function that implements bitmap scaling.
+
 2016-02-13  Alexei Podtelezhnikov  <address@hidden>
 
        [graph] Actually clear cache when full.
diff --git a/src/ftgrid.c b/src/ftgrid.c
index 449c55e..efd0bd8 100644
--- a/src/ftgrid.c
+++ b/src/ftgrid.c
@@ -527,6 +527,103 @@
 
 
   static void
+  bitmap_scale( grBitmap*   bit,
+                FT_F26Dot6  scale )
+  {
+    unsigned char*  s = bit->buffer;
+    unsigned char*  t;
+    unsigned char*  line;
+    int             pitch;
+    int             i, j, k;
+
+    pitch = bit->pitch > 0 ?  bit->pitch
+                           : -bit->pitch;
+
+    t = (unsigned char*)malloc( pitch * bit->rows * scale * scale );
+    if ( !t )
+      return;
+
+    line = t;
+
+    switch( bit->mode )
+    {
+      case gr_pixel_mode_mono:
+        for ( i = 0; i < bit->rows; i++ )
+        {
+          for ( j = 0; j < pitch * scale * 8; j++ )
+            if ( s[i * pitch + j / scale / 8] & ( 0x80 >> ( j / scale & 7 ) ) )
+              line[j / 8] |= 0x80 >> ( j & 7 );
+            else
+              line[j / 8] &= ~( 0x80 >> ( j & 7 ) );
+
+          for ( k = 1; k < scale; k++, line += pitch * scale )
+            memcpy( line + pitch * scale, line, pitch * scale );
+          line += pitch * scale;
+        }
+        break;
+
+      case gr_pixel_mode_gray:
+        for ( i = 0; i < bit->rows; i++ )
+        {
+          for ( j = 0; j < pitch; j++ )
+            memset( line + j * scale, s[i * pitch + j], scale );
+
+          for ( k = 1; k < scale; k++, line += pitch * scale )
+            memcpy( line + pitch * scale, line, pitch * scale );
+          line += pitch * scale;
+        }
+        break;
+
+      case gr_pixel_mode_lcd:
+      case gr_pixel_mode_lcd2:
+        for ( i = 0; i < bit->rows; i++ )
+        {
+          for ( j = 0; j < pitch; j += 3 )
+            for ( k = 0; k < scale; k++ )
+            {
+              line[j * scale + 3 * k    ] = s[i * pitch + j    ];
+              line[j * scale + 3 * k + 1] = s[i * pitch + j + 1];
+              line[j * scale + 3 * k + 2] = s[i * pitch + j + 2];
+            }
+
+          for ( k = 1; k < scale; k++, line += pitch * scale )
+            memcpy( line + pitch * scale, line, pitch * scale );
+          line += pitch * scale;
+        }
+        break;
+
+      case gr_pixel_mode_lcdv:
+      case gr_pixel_mode_lcdv2:
+        for ( i = 0; i < bit->rows; i += 3 )
+        {
+          for ( j = 0; j < pitch; j++ )
+          {
+            memset( line + j * scale,
+                    s[i * pitch +             j], scale );
+            memset( line + j * scale +     pitch * scale,
+                    s[i * pitch +     pitch + j], scale );
+            memset( line + j * scale + 2 * pitch * scale,
+                    s[i * pitch + 2 * pitch + j], scale );
+          }
+
+          for ( k = 1; k < scale; k++, line += 3 * pitch * scale )
+            memcpy( line + 3 * pitch * scale, line, 3 * pitch * scale );
+          line += 3 * pitch * scale;
+        }
+        break;
+
+      default:
+        return;
+    }
+
+    bit->buffer = t;
+    bit->rows  *= scale;
+    bit->width *= scale;
+    bit->pitch *= scale;
+  }
+
+
+  static void
   grid_status_draw_outline( GridStatus       st,
                             FTDemo_Handle*   handle,
                             FTDemo_Display*  display )
@@ -593,38 +690,27 @@
       /* render scaled bitmap */
       if ( st->do_bitmap )
       {
-        int             i, ii, j, jj;
-        FT_Bitmap       bitm;
-        FT_BitmapGlyph  bitg;
+        int             left, top, x_advance, y_advance;
+        grBitmap        bitg;
+        FT_Glyph        glyf;
 
 
         FT_Get_Glyph( slot, &glyph );
-        FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, NULL, 1 );
-        bitg = (FT_BitmapGlyph)glyph;
-
-        bitm.width      = (unsigned int)scale;
-        bitm.rows       = (unsigned int)scale;
-        bitm.pitch      = (int)bitm.width;
-        bitm.num_grays  = 256;
-        bitm.pixel_mode = FT_PIXEL_MODE_GRAY;
-        bitm.buffer     = (unsigned char*)malloc( scale * scale );
-
-        for ( ii = oy - bitg->top * scale,
-              i = 0; i < bitg->bitmap.rows; i++, ii += scale )
-          for ( jj = ox + bitg->left * scale,
-                j = 0; j < bitg->bitmap.width; j++, jj += scale )
-          {
-            memset( bitm.buffer,
-                    bitg->bitmap.buffer[i * bitg->bitmap.pitch + j],
-                    scale * scale );
-            ft_bitmap_draw( &bitm,
-                            jj,
-                            ii,
-                            display,
-                            st->axis_color );
-          }
+        error  = FTDemo_Glyph_To_Bitmap( handle, glyph, &bitg, &left, &top,
+                                         &x_advance, &y_advance, &glyf);
+
+        if ( !error )
+        {
+          bitmap_scale( &bitg, scale );
+
+          grBlitGlyphToBitmap( display->bitmap, &bitg,
+                               ox + left * scale, oy - top * scale,
+                               st->axis_color );
+
+          if ( glyf )
+            FT_Done_Glyph( glyf );
+        }
 
-        free( bitm.buffer );
         FT_Done_Glyph( glyph );
       }
 



reply via email to

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