[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 );
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master eca9e12 1/2: [ftgrid] Display monochrome and LCD bitmaps.,
Alexei Podtelezhnikov <=