[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freetype2-demos] master 1fc2b60 1/2: [ftgrid] Use fixed-point scale and
From: |
Alexei Podtelezhnikov |
Subject: |
[freetype2-demos] master 1fc2b60 1/2: [ftgrid] Use fixed-point scale and integer origin. |
Date: |
Thu, 11 Feb 2016 04:51:33 +0000 |
branch: master
commit 1fc2b60ed90b42b88a82452617b213ea801fd83c
Author: Alexei Podtelezhnikov <address@hidden>
Commit: Alexei Podtelezhnikov <address@hidden>
[ftgrid] Use fixed-point scale and integer origin.
* src/ftgrid.c (status): Change field types.
(grid_status_init, grid_status_rescale_initial, grid_status_draw_grid,
grid_hint_draw_segment, grid_status_draw_outline): Updated.
---
ChangeLog | 8 +++++
src/ftgrid.c | 97 +++++++++++++++++++++++++++++----------------------------
2 files changed, 57 insertions(+), 48 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 9ba8975..f7d09b8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-02-10 Alexei Podtelezhnikov <address@hidden>
+
+ [ftgrid] Use fixed-point scale and integer origin.
+
+ * src/ftgrid.c (status): Change field types.
+ (grid_status_init, grid_status_rescale_initial, grid_status_draw_grid,
+ grid_hint_draw_segment, grid_status_draw_outline): Updated.
+
2016-02-07 Werner Lemberg <address@hidden>
* Version 2.6.3 released.
diff --git a/src/ftgrid.c b/src/ftgrid.c
index 55489b6..c455f53 100644
--- a/src/ftgrid.c
+++ b/src/ftgrid.c
@@ -99,14 +99,13 @@
int Num; /* glyph index */
int font_index;
- double scale;
- double x_origin;
- double y_origin;
- double margin;
+ FT_F26Dot6 scale;
+ int x_origin;
+ int y_origin;
- double scale_0;
- double x_origin_0;
- double y_origin_0;
+ FT_F26Dot6 scale_0;
+ int x_origin_0;
+ int y_origin_0;
int disp_width;
int disp_height;
@@ -155,10 +154,9 @@
st->width = DIM_X;
st->height = DIM_Y;
- st->scale = 1.0;
+ st->scale = 64;
st->x_origin = 0;
st->y_origin = 0;
- st->margin = 0.05;
st->do_horz_hints = 1;
st->do_vert_hints = 1;
@@ -199,8 +197,9 @@
grid_status_rescale_initial( GridStatus st,
FTDemo_Handle* handle )
{
- FT_Size size;
- FT_Error err = FTDemo_Get_Size( handle, &size );
+ FT_Size size;
+ FT_Error err = FTDemo_Get_Size( handle, &size );
+ FT_F26Dot6 margin = 4;
if ( !err )
@@ -212,7 +211,7 @@
int xmax = FT_MulFix( face->bbox.xMax, size->metrics.x_scale );
int ymax = FT_MulFix( face->bbox.yMax, size->metrics.y_scale );
- double x_scale, y_scale;
+ FT_F26Dot6 x_scale, y_scale;
xmin &= ~63;
@@ -221,30 +220,33 @@
ymax = ( ymax + 63 ) & ~63;
if ( xmax - xmin )
- x_scale = st->disp_width * ( 1.0 - 2 * st->margin ) / ( xmax - xmin );
+ x_scale = st->disp_width * ( 64 - 2 * margin ) / ( xmax - xmin );
else
- x_scale = 1.0;
+ x_scale = 64;
if ( ymax - ymin )
- y_scale = st->disp_height * ( 1.0 - 2 * st->margin ) / ( ymax - ymin );
+ y_scale = st->disp_height * ( 64 - 2 * margin ) / ( ymax - ymin );
else
- y_scale = 1.0;
+ y_scale = 64;
if ( x_scale <= y_scale )
st->scale = x_scale;
else
st->scale = y_scale;
- st->x_origin = st->disp_width * st->margin - xmin * st->scale;
- st->y_origin = st->disp_height * ( 1 - st->margin ) + ymin * st->scale;
+ st->x_origin = st->disp_width * margin - xmin * st->scale;
+ st->y_origin = st->disp_height * ( 64 - margin ) + ymin * st->scale;
}
else
{
- st->scale = 1.;
- st->x_origin = st->disp_width * st->margin;
- st->y_origin = st->disp_height * st->margin;
+ st->scale = 64;
+ st->x_origin = st->disp_width * margin;
+ st->y_origin = st->disp_height * ( 64 - margin );
}
+ st->x_origin >>= 6;
+ st->y_origin >>= 6;
+
st->scale_0 = st->scale;
st->x_origin_0 = st->x_origin;
st->y_origin_0 = st->y_origin;
@@ -254,31 +256,31 @@
static void
grid_status_draw_grid( GridStatus st )
{
- int x_org = (int)st->x_origin;
- int y_org = (int)st->y_origin;
- double xy_incr = 64.0 * st->scale;
+ int x_org = st->x_origin;
+ int y_org = st->y_origin;
+ FT_F26Dot6 xy_incr = st->scale;
- if ( xy_incr >= 2. )
+ if ( xy_incr >= 2 )
{
- double x2 = x_org;
- double y2 = y_org;
+ int x2 = x_org;
+ int y2 = y_org;
for ( ; x2 < st->disp_width; x2 += xy_incr )
- grFillVLine( st->disp_bitmap, (int)x2, 0,
+ grFillVLine( st->disp_bitmap, x2, 0,
st->disp_height, st->grid_color );
- for ( x2 = x_org - xy_incr; (int)x2 >= 0; x2 -= xy_incr )
- grFillVLine( st->disp_bitmap, (int)x2, 0,
+ for ( x2 = x_org - xy_incr; x2 >= 0; x2 -= xy_incr )
+ grFillVLine( st->disp_bitmap, x2, 0,
st->disp_height, st->grid_color );
for ( ; y2 < st->disp_height; y2 += xy_incr )
- grFillHLine( st->disp_bitmap, 0, (int)y2,
+ grFillHLine( st->disp_bitmap, 0, y2,
st->disp_width, st->grid_color );
- for ( y2 = y_org - xy_incr; (int)y2 >= 0; y2 -= xy_incr )
- grFillHLine( st->disp_bitmap, 0, (int)y2,
+ for ( y2 = y_org - xy_incr; y2 >= 0; y2 -= xy_incr )
+ grFillHLine( st->disp_bitmap, 0, y2,
st->disp_width, st->grid_color );
}
@@ -296,8 +298,8 @@
AF_GlyphHints hints )
{
FT_Int dimension;
- int x_org = (int)st->x_origin;
- int y_org = (int)st->y_origin;
+ int x_org = st->x_origin;
+ int y_org = st->y_origin;
for ( dimension = 1; dimension >= 0; dimension-- )
@@ -322,17 +324,17 @@
if ( dimension == 0 ) /* AF_DIMENSION_HORZ is 0 */
{
- pos = x_org + (int)( offset * st->scale );
+ pos = x_org + ( ( offset * st->scale ) >> 6 );
grFillVLine( st->disp_bitmap, pos, 0,
st->disp_height, st->segment_color );
}
else
{
- pos = y_org - (int)( offset * st->scale );
+ pos = y_org - ( ( offset * st->scale ) >> 6 );
if ( is_blue )
{
- int blue_pos = y_org - (int)( blue_offset * st->scale );
+ int blue_pos = y_org - ( ( blue_offset * st->scale ) >> 6 );
if ( blue_pos == pos )
@@ -529,9 +531,9 @@
{
FT_Size size;
FT_GlyphSlot slot;
- double scale = 64.0 * st->scale;
- int ox = (int)st->x_origin;
- int oy = (int)st->y_origin;
+ FT_F26Dot6 scale = st->scale;
+ int ox = st->x_origin;
+ int oy = st->y_origin;
if ( st->stroker == NULL )
@@ -571,9 +573,8 @@
/* show advance width */
grFillVLine( st->disp_bitmap,
- (int)( st->x_origin +
- size->face->glyph->metrics.horiAdvance *
- st->scale ),
+ st->x_origin +
+ ( size->face->glyph->metrics.horiAdvance * st->scale >> 6 ),
0,
st->disp_height,
st->axis_color );
@@ -593,8 +594,8 @@
FT_Vector* vec = &gimage->points[nn];
- vec->x = (FT_F26Dot6)( vec->x * scale );
- vec->y = (FT_F26Dot6)( vec->y * scale );
+ vec->x *= scale;
+ vec->y *= scale;
}
/* stroke then draw it */
@@ -614,8 +615,8 @@
{
for ( nn = 0; nn < gimage->n_points; nn++ )
circle_draw(
- (FT_F26Dot6)( st->x_origin * 64 + gimage->points[nn].x ),
- (FT_F26Dot6)( st->y_origin * 64 - gimage->points[nn].y ),
+ st->x_origin * 64 + gimage->points[nn].x,
+ st->y_origin * 64 - gimage->points[nn].y,
128,
handle,
display,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master 1fc2b60 1/2: [ftgrid] Use fixed-point scale and integer origin.,
Alexei Podtelezhnikov <=