freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master 0647db9: Remove `slight' auto-hinting mode. Add


From: Werner LEMBERG
Subject: [freetype2-demos] master 0647db9: Remove `slight' auto-hinting mode. Add sub-pixel `light' mode.
Date: Tue, 2 May 2017 07:38:05 -0400 (EDT)

branch: master
commit 0647db90a13abdd8f35c39060c69227c8eca0de4
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    Remove `slight' auto-hinting mode.  Add sub-pixel `light' mode.
    
    * src/ftcommon.h (LCD_MODE_SLIGHT): Replace with...
    (LCD_MODE_LIGHT_SUBPIXEL): ...this new enum value.
    
    * src/ftcommon.c (FTDemo_Update_Current_Flags,
    FTDemo_Glyph_To_Bitmap): Updated.
    (string_load): Handle `LCD_MODE_LIGHT_SUBPIXEL'.
    Make integer delta support actually work.
    (string_render_prepare): Support `LCD_MODE_LIGHT_SUBPIXEL'.
    
    * src/ftdiff.c (HintMode): Replace HINT_MODE_AUTOHINT_SLIGHT with
    HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL.
    (render_mode_names, render_state_draw, event_help): Updated.
    
    * src/ftgrid.c (grid_status_draw_outline): Show fractional advance
    width.
    (event_lcd_mode_change, Process_Event): Updated.
    
    * src/ftstring.c (event_lcdmode_change): Updated.
    
    * src/ftview.c (lcd_modes): New array to map indices (as produced by
    key presses) to LCD modes; we omit LCD_MODE_LIGHT_SUBPIXEL, which
    doesn't make much sense within ftview.
    (N_LCD_IDXS): New macro.
    (status): Replace `lcd_mode' with `lcd_idx'.
    (event_help): Revert change from 2017-04-19.
    (Process_Event): Updated to use `lcd_modes' array.
    Remove references to LCD_MODE_LIGHT.
    (write_header, usage, parse_cmdline, main): Updated.
    
    * src/ftinspect.h (AntiAliasing): Remove `AntiAliasing_Slight'.
    
    * src/ftinspect.cpp (Engine::update, MainGUI::checkHinting,
    MainGUI::checkAutoHinting, MainGUI::checkAntiAliasing,
    MainGUI::createLayout): Updated.
---
 ChangeLog         |  41 ++++++++++++++++-
 src/ftcommon.c    |  39 +++++++++-------
 src/ftcommon.h    |   2 +-
 src/ftdiff.c      |  34 +++++++-------
 src/ftgrid.c      |  51 +++++++++++----------
 src/ftinspect.cpp |  15 +-----
 src/ftinspect.h   |   1 -
 src/ftstring.c    |   4 +-
 src/ftview.c      | 135 ++++++++++++++++++++++++++++++------------------------
 9 files changed, 185 insertions(+), 137 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cc61c17..cfc9bb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,42 @@
+2017-05-02  Werner Lemberg  <address@hidden>
+
+       Remove `slight' auto-hinting mode.  Add sub-pixel `light' mode.
+
+       * src/ftcommon.h (LCD_MODE_SLIGHT): Replace with...
+       (LCD_MODE_LIGHT_SUBPIXEL): ...this new enum value.
+
+       * src/ftcommon.c (FTDemo_Update_Current_Flags,
+       FTDemo_Glyph_To_Bitmap): Updated.
+       (string_load): Handle `LCD_MODE_LIGHT_SUBPIXEL'.
+       Make integer delta support actually work.
+       (string_render_prepare): Support `LCD_MODE_LIGHT_SUBPIXEL'.
+
+       * src/ftdiff.c (HintMode): Replace HINT_MODE_AUTOHINT_SLIGHT with
+       HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL.
+       (render_mode_names, render_state_draw, event_help): Updated.
+
+       * src/ftgrid.c (grid_status_draw_outline): Show fractional advance
+       width.
+       (event_lcd_mode_change, Process_Event): Updated.
+
+       * src/ftstring.c (event_lcdmode_change): Updated.
+
+       * src/ftview.c (lcd_modes): New array to map indices (as produced by
+       key presses) to LCD modes; we omit LCD_MODE_LIGHT_SUBPIXEL, which
+       doesn't make much sense within ftview.
+       (N_LCD_IDXS): New macro.
+       (status): Replace `lcd_mode' with `lcd_idx'.
+       (event_help): Revert change from 2017-04-19.
+       (Process_Event): Updated to use `lcd_modes' array.
+       Remove references to LCD_MODE_LIGHT.
+       (write_header, usage, parse_cmdline, main): Updated.
+
+       * src/ftinspect.h (AntiAliasing): Remove `AntiAliasing_Slight'.
+
+       * src/ftinspect.cpp (Engine::update, MainGUI::checkHinting,
+       MainGUI::checkAutoHinting, MainGUI::checkAntiAliasing,
+       MainGUI::createLayout): Updated.
+
 2017-04-19  Werner Lemberg  <address@hidden>
 
        Support new `slight' auto-hinting mode.
@@ -3937,7 +3976,7 @@
        Render_Embolden, Render_All, Render_Text, Render_Waterfall): Ditto.
 
 2011-05-01  Just Fill Bugs  <address@hidden>
-            Werner Lemberg  <address@hidden>
+           Werner Lemberg  <address@hidden>
 
        [ftgrid] Show autohinter segments.  Toggle with key `s'.
 
diff --git a/src/ftcommon.c b/src/ftcommon.c
index b85971b..68c9b33 100644
--- a/src/ftcommon.c
+++ b/src/ftcommon.c
@@ -619,13 +619,10 @@
         break;
 
       case LCD_MODE_LIGHT:
+      case LCD_MODE_LIGHT_SUBPIXEL:
         target = FT_LOAD_TARGET_LIGHT;
         break;
 
-      case LCD_MODE_SLIGHT:
-        target = FT_LOAD_TARGET_SLIGHT;
-        break;
-
       case LCD_MODE_RGB:
       case LCD_MODE_BGR:
         target = FT_LOAD_TARGET_LCD;
@@ -719,13 +716,10 @@
         break;
 
       case LCD_MODE_LIGHT:
+      case LCD_MODE_LIGHT_SUBPIXEL:
         render_mode = FT_RENDER_MODE_LIGHT;
         break;
 
-      case LCD_MODE_SLIGHT:
-        render_mode = FT_RENDER_MODE_SLIGHT;
-        break;
-
       case LCD_MODE_RGB:
       case LCD_MODE_BGR:
         render_mode = FT_RENDER_MODE_LCD;
@@ -1133,12 +1127,19 @@
         glyph->vadvance.x = 0;
         glyph->vadvance.y = -metrics->vertAdvance;
 
-        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )
-          glyph->delta = -1 * 64;
-        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )
-          glyph->delta = 1 * 64;
+        if ( handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL )
+          glyph->delta = face->glyph->lsb_delta - face->glyph->rsb_delta;
         else
-          glyph->delta = 0;
+        {
+          if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )
+            glyph->delta = -1 * 64;
+          else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )
+            glyph->delta = 1 * 64;
+          else
+            glyph->delta = 0;
+
+          prev_rsb_delta = face->glyph->rsb_delta;
+        }
       }
     }
 
@@ -1196,6 +1197,9 @@
         advances[i].x >>= 10;
         advances[i].y >>= 10;
 
+        if ( handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL )
+          advances[i].x += glyph->delta;
+
         if ( prev_advance )
         {
           prev_advance->x += track_kern;
@@ -1211,7 +1215,8 @@
             prev_advance->x += kern.x;
             prev_advance->y += kern.y;
 
-            if ( sc->kerning_mode > KERNING_MODE_NORMAL )
+            if ( handle->lcd_mode != LCD_MODE_LIGHT_SUBPIXEL &&
+                 sc->kerning_mode > KERNING_MODE_NORMAL      )
               prev_advance->x += glyph->delta;
           }
         }
@@ -1219,7 +1224,8 @@
 
       if ( prev_advance )
       {
-        if ( handle->hinted )
+        if ( handle->lcd_mode != LCD_MODE_LIGHT_SUBPIXEL &&
+             handle->hinted                              )
         {
           prev_advance->x = ROUND( prev_advance->x );
           prev_advance->y = ROUND( prev_advance->y );
@@ -1235,7 +1241,8 @@
 
     if ( prev_advance )
     {
-      if ( handle->hinted )
+      if ( handle->lcd_mode != LCD_MODE_LIGHT_SUBPIXEL &&
+           handle->hinted                              )
       {
         prev_advance->x = ROUND( prev_advance->x );
         prev_advance->y = ROUND( prev_advance->y );
diff --git a/src/ftcommon.h b/src/ftcommon.h
index d51c934..67f01ca 100644
--- a/src/ftcommon.h
+++ b/src/ftcommon.h
@@ -137,7 +137,7 @@
     LCD_MODE_MONO = 0,
     LCD_MODE_AA,
     LCD_MODE_LIGHT,
-    LCD_MODE_SLIGHT,
+    LCD_MODE_LIGHT_SUBPIXEL,
     LCD_MODE_RGB,
     LCD_MODE_BGR,
     LCD_MODE_VRGB,
diff --git a/src/ftdiff.c b/src/ftdiff.c
index 3a53e1b..e320861 100644
--- a/src/ftdiff.c
+++ b/src/ftdiff.c
@@ -156,7 +156,7 @@
     HINT_MODE_UNHINTED,
     HINT_MODE_AUTOHINT,
     HINT_MODE_AUTOHINT_LIGHT,
-    HINT_MODE_AUTOHINT_SLIGHT,
+    HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL,
     HINT_MODE_BYTECODE,
     HINT_MODE_MAX
 
@@ -167,7 +167,7 @@
     "unhinted",
     "auto-hinter",
     "light auto-hinter",
-    "slight auto-hinter",
+    "light auto-hinter (subp.)",
     "native hinter"
   };
 
@@ -610,12 +610,10 @@
     if ( rmode == HINT_MODE_AUTOHINT )
       load_flags = FT_LOAD_FORCE_AUTOHINT;
 
-    if ( rmode == HINT_MODE_AUTOHINT_LIGHT )
+    if ( rmode == HINT_MODE_AUTOHINT_LIGHT          ||
+         rmode == HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL )
       load_flags = FT_LOAD_TARGET_LIGHT;
 
-    if ( rmode == HINT_MODE_AUTOHINT_SLIGHT )
-      load_flags = FT_LOAD_TARGET_SLIGHT;
-
     if ( rmode == HINT_MODE_UNHINTED )
       load_flags |= FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP;
 
@@ -702,8 +700,8 @@
         x_origin += vec.x;
       }
 
-      if ( rmode != HINT_MODE_AUTOHINT_SLIGHT &&
-           column->use_deltas                 )
+      if ( rmode != HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL &&
+           column->use_deltas                         )
       {
         if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )
           x_origin -= 64;
@@ -712,11 +710,11 @@
       }
       prev_rsb_delta = face->glyph->rsb_delta;
 
-      /* implement sub-pixel positioning for */
-      /* un-hinted and slight hinting mode   */
-      if ( ( rmode == HINT_MODE_UNHINTED        ||
-             rmode == HINT_MODE_AUTOHINT_SLIGHT )  &&
-           slot->format == FT_GLYPH_FORMAT_OUTLINE )
+      /* implement sub-pixel positioning for       */
+      /* un-hinted and (second) light hinting mode */
+      if ( ( rmode == HINT_MODE_UNHINTED                ||
+             rmode == HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL ) &&
+           slot->format == FT_GLYPH_FORMAT_OUTLINE        )
       {
         FT_Pos  shift = x_origin & 63;
 
@@ -740,8 +738,8 @@
       }
       else
       {
-        if ( rmode == HINT_MODE_UNHINTED        ||
-             rmode == HINT_MODE_AUTOHINT_SLIGHT )
+        if ( rmode == HINT_MODE_UNHINTED                ||
+             rmode == HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL )
           xmax = slot->linearHoriAdvance >> 10;
         else
           xmax = slot->advance.x;
@@ -782,8 +780,8 @@
                                   (int)map->width, (int)map->rows,
                                   map->pitch, map->buffer );
       }
-      if ( rmode == HINT_MODE_UNHINTED        ||
-           rmode == HINT_MODE_AUTOHINT_SLIGHT )
+      if ( rmode == HINT_MODE_UNHINTED                ||
+           rmode == HINT_MODE_AUTOHINT_LIGHT_SUBPIXEL )
         x_origin += slot->linearHoriAdvance >> 10;
       else
         x_origin += slot->advance.x;
@@ -1138,7 +1136,7 @@
     grWriteln( " per-column parameters:" );
     grLn();
     grWriteln( "  d            toggle lsb/rsb deltas" );
-    grWriteln( "  h            toggle hinting mode" );
+    grWriteln( "  h            cycle hinting mode" );
     grWriteln( "  H            cycle hinting engine (if CFF or TTF)" );
     grWriteln( "  w            toggle warping (if light auto-hinting" );
     grWriteln( "  k            toggle kerning (only from `kern' table)" );
diff --git a/src/ftgrid.c b/src/ftgrid.c
index 3a395f8..ce7a567 100644
--- a/src/ftgrid.c
+++ b/src/ftgrid.c
@@ -685,7 +685,10 @@
     /* show advance width */
     grFillVLine( st->disp_bitmap,
                  st->x_origin +
-                   ( size->face->glyph->metrics.horiAdvance * st->scale >> 6 ),
+                   ( ( size->face->glyph->metrics.horiAdvance +
+                       size->face->glyph->lsb_delta           -
+                       size->face->glyph->rsb_delta           ) *
+                     st->scale >> 6 ),
                  0,
                  st->disp_height,
                  st->axis_color );
@@ -1176,8 +1179,8 @@
     case LCD_MODE_LIGHT:
       lcd_mode = "light AA";
       break;
-    case LCD_MODE_SLIGHT:
-      lcd_mode = "slight AA";
+    case LCD_MODE_LIGHT_SUBPIXEL:
+      lcd_mode = "light AA (subpixel positioning)";
       break;
     case LCD_MODE_RGB:
       lcd_mode = "LCD (horiz. RGB)";
@@ -1507,10 +1510,10 @@
 
 #ifdef FT_DEBUG_AUTOFIT
     case grKEY( '1' ):
-      if ( handle->hinted                          &&
-           ( handle->autohint                    ||
-             handle->lcd_mode == LCD_MODE_LIGHT  ||
-             handle->lcd_mode == LCD_MODE_SLIGHT ) )
+      if ( handle->hinted                                  &&
+           ( handle->autohint                            ||
+             handle->lcd_mode == LCD_MODE_LIGHT          ||
+             handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL ) )
       {
         status.header = "dumping glyph edges to stdout";
         af_glyph_hints_dump_edges( _af_debug_hints, 1 );
@@ -1518,10 +1521,10 @@
       break;
 
     case grKEY( '2' ):
-      if ( handle->hinted                          &&
-           ( handle->autohint                    ||
-             handle->lcd_mode == LCD_MODE_LIGHT  ||
-             handle->lcd_mode == LCD_MODE_SLIGHT ) )
+      if ( handle->hinted                                  &&
+           ( handle->autohint                            ||
+             handle->lcd_mode == LCD_MODE_LIGHT          ||
+             handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL ) )
       {
         status.header = "dumping glyph segments to stdout";
         af_glyph_hints_dump_segments( _af_debug_hints, 1 );
@@ -1529,10 +1532,10 @@
       break;
 
     case grKEY( '3' ):
-      if ( handle->hinted                          &&
-           ( handle->autohint                    ||
-             handle->lcd_mode == LCD_MODE_LIGHT  ||
-             handle->lcd_mode == LCD_MODE_SLIGHT ) )
+      if ( handle->hinted                                  &&
+           ( handle->autohint                            ||
+             handle->lcd_mode == LCD_MODE_LIGHT          ||
+             handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL ) )
       {
         status.header = "dumping glyph points to stdout";
         af_glyph_hints_dump_points( _af_debug_hints, 1 );
@@ -1586,9 +1589,9 @@
       break;
 
     case grKEY( 'H' ):
-      if ( !( handle->autohint                    ||
-              handle->lcd_mode == LCD_MODE_LIGHT  ||
-              handle->lcd_mode == LCD_MODE_SLIGHT ) )
+      if ( !( handle->autohint                            ||
+              handle->lcd_mode == LCD_MODE_LIGHT          ||
+              handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL ) )
       {
         FT_Face    face;
         FT_Module  module;
@@ -1622,9 +1625,9 @@
 
 #ifdef FT_DEBUG_AUTOFIT
     case grKEY( 'V' ):
-      if ( handle->autohint                    ||
-           handle->lcd_mode == LCD_MODE_LIGHT  ||
-           handle->lcd_mode == LCD_MODE_SLIGHT )
+      if ( handle->autohint                            ||
+           handle->lcd_mode == LCD_MODE_LIGHT          ||
+           handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL )
       {
         status.do_vert_hints = !status.do_vert_hints;
         status.header = status.do_vert_hints ? "vertical hinting enabled"
@@ -1635,9 +1638,9 @@
       break;
 
     case grKEY( 'B' ):
-      if ( handle->autohint                    ||
-           handle->lcd_mode == LCD_MODE_LIGHT  ||
-           handle->lcd_mode == LCD_MODE_SLIGHT )
+      if ( handle->autohint                            ||
+           handle->lcd_mode == LCD_MODE_LIGHT          ||
+           handle->lcd_mode == LCD_MODE_LIGHT_SUBPIXEL )
       {
         status.do_blue_hints = !status.do_blue_hints;
         status.header = status.do_blue_hints ? "blue zone hinting enabled"
diff --git a/src/ftinspect.cpp b/src/ftinspect.cpp
index 2759381..69986bd 100644
--- a/src/ftinspect.cpp
+++ b/src/ftinspect.cpp
@@ -576,10 +576,6 @@ Engine::update()
         target = FT_LOAD_TARGET_LIGHT;
         break;
 
-      case MainGUI::AntiAliasing_Slight:
-        target = FT_LOAD_TARGET_SLIGHT;
-        break;
-
       case MainGUI::AntiAliasing_LCD:
       case MainGUI::AntiAliasing_LCD_BGR:
         target = FT_LOAD_TARGET_LCD;
@@ -1518,7 +1514,6 @@ MainGUI::checkHinting()
     warpingCheckBox->setEnabled(false);
 
     antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Light, false);
-    antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Slight, false);
   }
 
   drawGlyph();
@@ -1562,7 +1557,6 @@ MainGUI::checkAutoHinting()
       warpingCheckBox->setEnabled(true);
 
     antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Light, true);
-    antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Slight, true);
   }
   else
   {
@@ -1580,10 +1574,8 @@ MainGUI::checkAutoHinting()
     warpingCheckBox->setEnabled(false);
 
     antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Light, false);
-    antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Slight, false);
 
-    if (antiAliasingComboBoxx->currentIndex() == AntiAliasing_Light
-        || antiAliasingComboBoxx->currentIndex() == AntiAliasing_Slight)
+    if (antiAliasingComboBoxx->currentIndex() == AntiAliasing_Light)
       antiAliasingComboBoxx->setCurrentIndex(AntiAliasing_Normal);
   }
 
@@ -1598,8 +1590,7 @@ MainGUI::checkAntiAliasing()
 
   if (index == AntiAliasing_None
       || index == AntiAliasing_Normal
-      || index == AntiAliasing_Light
-      || index == AntiAliasing_Slight)
+      || index == AntiAliasing_Light)
   {
     lcdFilterLabel->setEnabled(false);
     lcdFilterComboBox->setEnabled(false);
@@ -2004,8 +1995,6 @@ MainGUI::createLayout()
                                     tr("Normal"));
   antiAliasingComboBoxx->insertItem(AntiAliasing_Light,
                                     tr("Light"));
-  antiAliasingComboBoxx->insertItem(AntiAliasing_Slight,
-                                    tr("Slight"));
   antiAliasingComboBoxx->insertItem(AntiAliasing_LCD,
                                     tr("LCD (RGB)"));
   antiAliasingComboBoxx->insertItem(AntiAliasing_LCD_BGR,
diff --git a/src/ftinspect.h b/src/ftinspect.h
index 47da549..7946ac0 100644
--- a/src/ftinspect.h
+++ b/src/ftinspect.h
@@ -518,7 +518,6 @@ private:
     AntiAliasing_None,
     AntiAliasing_Normal,
     AntiAliasing_Light,
-    AntiAliasing_Slight,
     AntiAliasing_LCD,
     AntiAliasing_LCD_BGR,
     AntiAliasing_LCD_Vertical,
diff --git a/src/ftstring.c b/src/ftstring.c
index 912b1ae..6f89e05 100644
--- a/src/ftstring.c
+++ b/src/ftstring.c
@@ -257,8 +257,8 @@
     case LCD_MODE_LIGHT:
       lcd_mode = " light AA";
       break;
-    case LCD_MODE_SLIGHT:
-      lcd_mode = " slight AA";
+    case LCD_MODE_LIGHT_SUBPIXEL:
+      lcd_mode = " light AA (subpixel positioning)";
       break;
     case LCD_MODE_RGB:
       lcd_mode = " LCD (horiz. RGB)";
diff --git a/src/ftview.c b/src/ftview.c
index bd08f5e..730855c 100644
--- a/src/ftview.c
+++ b/src/ftview.c
@@ -71,6 +71,21 @@
 #define N_CFF_HINTING_ENGINES  2
 
 
+  /* omit LCD_MODE_LIGHT_SUBPIXEL; we don't need it in this application */
+  static int  lcd_modes[] =
+  {
+    LCD_MODE_MONO,
+    LCD_MODE_AA,
+    LCD_MODE_LIGHT,
+    LCD_MODE_RGB,
+    LCD_MODE_BGR,
+    LCD_MODE_VRGB,
+    LCD_MODE_VBGR
+  };
+
+#define N_LCD_IDXS  ( sizeof ( lcd_modes ) / sizeof ( int ) )
+
+
   enum
   {
     RENDER_MODE_ALL = 0,
@@ -92,7 +107,7 @@
 
     int            res;
     int            ptsize;            /* current point size, 26.6 format */
-    int            lcd_mode;
+    int            lcd_idx;
     double         gamma;
     double         xbold_factor;
     double         ybold_factor;
@@ -117,7 +132,7 @@
 
   } status = { 1,
                DIM_X, DIM_Y, RENDER_MODE_ALL, FT_ENCODING_NONE,
-               72, 48, -1, GAMMA, 0.04, 0.04, 0.02, 0.22,
+               72, 48, 1, GAMMA, 0.04, 0.04, 0.02, 0.22,
                0, { 0 }, 0, 0, 0, /* default values are set at runtime */
                0, 0, 0, 0, 0,
                FT_LCD_FILTER_DEFAULT, { 0x08, 0x4D, 0x56, 0x4D, 0x08 }, 2 };
@@ -735,33 +750,33 @@
     grWriteln( "  1         all glyphs                    A         monochrome 
             " );
     grWriteln( "  2         all glyphs fancy              B         normal     
             " );
     grWriteln( "             (emboldened / slanted)       C         light      
             " );
-    grWriteln( "  3         all glyphs stroked            D         slight     
             " );
-    grWriteln( "  4         text string                   E         horizontal 
RGB (LCD)    " );
-    grWriteln( "  5         waterfall                     F         horizontal 
BGR (LCD)    " );
-    grWriteln( "  space     cycle forwards                G         vertical 
RGB (LCD)      " );
-    grWriteln( "  backspace cycle backwards               H         vertical 
BGR (LCD)      " );
-    grWriteln( "                                        k, l        cycle back 
and forth    " );
-    grWriteln( "b           toggle embedded bitmaps                            
             " );
-    grWriteln( "c           toggle color glyphs         x, X        adjust 
horizontal       " );
-    grWriteln( "K           toggle cache modes                       
emboldening (in mode 2)" );
-    grWriteln( "                                        y, Y        adjust 
vertical         " );
-    grWriteln( "p, n        previous/next font                       
emboldening (in mode 2)" );
-    grWriteln( "                                        s, S        adjust 
slanting         " );
-    grWriteln( "Up, Down    adjust size by 1 unit                    (in mode 
2)            " );
-    grWriteln( "PgUp, PgDn  adjust size by 10 units     r, R        adjust 
stroking radius  " );
-    grWriteln( "                                                     (in mode 
3)            " );
-    grWriteln( "Left, Right adjust index by 1                                  
             " );
-    grWriteln( "F7, F8      adjust index by 16          L           cycle 
through           " );
-    grWriteln( "F9, F10     adjust index by 256                      LCD 
filtering          " );
-    grWriteln( "F11, F12    adjust index by 4096        [, ]        select 
custom LCD       " );
-    grWriteln( "                                                      filter 
weight         " );
-    grWriteln( "h           toggle hinting                            (if 
custom filtering) " );
-    grWriteln( "H           cycle through hinting       -, +(=)     adjust 
selected custom  " );
-    grWriteln( "             engines (if available)                  LCD 
filter weight      " );
-    grWriteln( "f           toggle forced auto-                                
             " );
-    grWriteln( "             hinting (if hinting)       g, v        adjust 
gamma value      " );
-    grWriteln( "w           toggle warping (in light                           
             " );
-    grWriteln( "             AA mode, if available)     Tab         cycle 
through charmaps  " );
+    grWriteln( "  3         all glyphs stroked            D         horizontal 
RGB (LCD)    " );
+    grWriteln( "  4         text string                   E         horizontal 
BGR (LCD)    " );
+    grWriteln( "  5         waterfall                     F         vertical 
RGB (LCD)      " );
+    grWriteln( "  space     cycle forwards                G         vertical 
BGR (LCD)      " );
+    grWriteln( "  backspace cycle backwards             k, l        cycle back 
and forth    " );
+    grWriteln( "                                                               
             " );
+    grWriteln( "b           toggle embedded bitmaps     x, X        adjust 
horizontal       " );
+    grWriteln( "c           toggle color glyphs                      
emboldening (in mode 2)" );
+    grWriteln( "K           toggle cache modes          y, Y        adjust 
vertical         " );
+    grWriteln( "                                                     
emboldening (in mode 2)" );
+    grWriteln( "p, n        previous/next font          s, S        adjust 
slanting         " );
+    grWriteln( "                                                     (in mode 
2)            " );
+    grWriteln( "Up, Down    adjust size by 1 unit       r, R        adjust 
stroking radius  " );
+    grWriteln( "PgUp, PgDn  adjust size by 10 units                  (in mode 
3)            " );
+    grWriteln( "                                                               
             " );
+    grWriteln( "Left, Right adjust index by 1           L           cycle 
through           " );
+    grWriteln( "F7, F8      adjust index by 16                       LCD 
filtering          " );
+    grWriteln( "F9, F10     adjust index by 256         [, ]        select 
custom LCD       " );
+    grWriteln( "F11, F12    adjust index by 4096                      filter 
weight         " );
+    grWriteln( "                                                      (if 
custom filtering) " );
+    grWriteln( "h           toggle hinting              -, +(=)     adjust 
selected custom  " );
+    grWriteln( "H           cycle through hinting                    LCD 
filter weight      " );
+    grWriteln( "             engines (if available)                            
             " );
+    grWriteln( "f           toggle forced auto-         g, v        adjust 
gamma value      " );
+    grWriteln( "             hinting (if hinting)                              
             " );
+    grWriteln( "w           toggle warping (in light    Tab         cycle 
through charmaps  " );
+    grWriteln( "             AA mode, if available)                            
             " );
     grWriteln( "                                                               
             " );
     grWriteln( "                                        q, ESC      quit 
ftview             " );
     /*          |----------------------------------|    
|----------------------------------| */
@@ -1079,13 +1094,19 @@
       return ret;
     }
 
-    if ( handle->lcd_mode == (int)( event->key - 'A' ) )
-      return ret;
-    if ( event->key >= 'A' && event->key < 'A' + N_LCD_MODES )
+    if ( event->key >= 'A'             &&
+         event->key < 'A' + N_LCD_IDXS )
     {
-      handle->lcd_mode = event->key - 'A';
+      int  lcd_idx = (int)( event->key - 'A' );
+
+
+      if ( status.lcd_idx == lcd_idx )
+        return ret;
+
+      handle->lcd_mode = lcd_modes[lcd_idx];
       FTDemo_Update_Current_Flags( handle );
-      status.update = 1;
+      status.update  = 1;
+      status.lcd_idx = lcd_idx;
       return ret;
     }
 
@@ -1135,9 +1156,8 @@
       break;
 
     case grKEY( 'H' ):
-      if ( !handle->autohint                   &&
-           handle->lcd_mode != LCD_MODE_LIGHT  &&
-           handle->lcd_mode != LCD_MODE_SLIGHT )
+      if ( !handle->autohint                  &&
+           handle->lcd_mode != LCD_MODE_LIGHT )
       {
         FT_Face    face;
         FT_Module  module;
@@ -1159,13 +1179,12 @@
 
     case grKEY( 'l' ):
     case grKEY( 'k' ):
-      handle->lcd_mode = ( event->key == grKEY( 'l' ) )
-                         ? ( ( handle->lcd_mode == ( N_LCD_MODES - 1 ) )
-                             ? 0
-                             : handle->lcd_mode + 1 )
-                         : ( ( handle->lcd_mode == 0 )
-                             ? ( N_LCD_MODES - 1 )
-                             : handle->lcd_mode - 1 );
+      status.lcd_idx =
+        ( status.lcd_idx                          +
+          ( event->key == grKEY( 'l' ) ? 1 : -1 ) +
+          N_LCD_IDXS                              ) % N_LCD_IDXS;
+
+      handle->lcd_mode = lcd_modes[status.lcd_idx];
       FTDemo_Update_Current_Flags( handle );
       status.update = 1;
       break;
@@ -1627,9 +1646,6 @@
       case LCD_MODE_LIGHT:
         lcd_mode = "light AA";
         break;
-      case LCD_MODE_SLIGHT:
-        lcd_mode = "slight AA";
-        break;
       case LCD_MODE_RGB:
         lcd_mode = "LCD (horiz. RGB)";
         break;
@@ -1660,16 +1676,14 @@
     {
       /* auto-hinting */
       sprintf( buf, " forced auto: %s",
-                    ( handle->autohint                    ||
-                      handle->lcd_mode == LCD_MODE_LIGHT  ||
-                      handle->lcd_mode == LCD_MODE_SLIGHT ) ? "on" : "off" );
+                    ( handle->autohint                   ||
+                      handle->lcd_mode == LCD_MODE_LIGHT ) ? "on" : "off" );
       grWriteCellString( display->bitmap, 0, (line++) * HEADER_HEIGHT,
                          buf, display->fore_color );
     }
 
-    if ( !handle->autohint                   &&
-         handle->lcd_mode != LCD_MODE_LIGHT  &&
-         handle->lcd_mode != LCD_MODE_SLIGHT )
+    if ( !handle->autohint                  &&
+         handle->lcd_mode != LCD_MODE_LIGHT )
     {
       /* hinting engine */
 
@@ -1825,8 +1839,8 @@
       "            `ADOB' (Adobe standard), `ADBC' (Adobe custom).\n"
       "  -m text   Use `text' for rendering.\n" );
     fprintf( stderr,
-      "  -l mode   Set start-up rendering mode (0 <= mode <= %d).\n",
-             N_LCD_MODES );
+      "  -l mode   Set start-up rendering mode (0 <= mode <= %ld).\n",
+             N_LCD_IDXS );
     fprintf( stderr,
       "  -p        Preload file in memory to simulate memory-mapping.\n"
       "\n"
@@ -1871,11 +1885,11 @@
         break;
 
       case 'l':
-        status.lcd_mode = atoi( optarg );
-        if ( status.lcd_mode < 0 || status.lcd_mode > N_LCD_MODES )
+        status.lcd_idx = atoi( optarg );
+        if ( status.lcd_idx < 0 || status.lcd_idx > (int)N_LCD_IDXS )
         {
-          fprintf( stderr, "argument to `l' must be between 0 and %d\n",
-                   N_LCD_MODES );
+          fprintf( stderr, "argument to `l' must be between 0 and %ld\n",
+                   N_LCD_IDXS );
           exit( 3 );
         }
         break;
@@ -2007,8 +2021,7 @@
 
     event_font_change( 0 );
 
-    if ( status.lcd_mode >= 0 )
-      handle->lcd_mode = status.lcd_mode;
+    handle->lcd_mode = lcd_modes[status.lcd_idx];
 
     FTDemo_Update_Current_Flags( handle );
 



reply via email to

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