freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master c43fdf1: [ftgrid] Tweak direct rendering.


From: Alexei Podtelezhnikov
Subject: [freetype2-demos] master c43fdf1: [ftgrid] Tweak direct rendering.
Date: Thu, 20 Jun 2019 22:40:19 -0400 (EDT)

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

    [ftgrid] Tweak direct rendering.
    
    * src/ftcommon.c (FT_Demo_Sketch_Glyph_Color): Redefine surface origin
    and clipping box instead of shifting outline.
    * src/ftgrid.c (grid_status_draw_outline): Tweaked.
    * graph/gblspans.h: Simplify.
    * graph/grobjs.h (grSurface): Introduce `origin' byte.
    * graph/gblblit.c: Silence compilation warning.
---
 ChangeLog        | 11 +++++++++++
 graph/gblblit.c  |  1 +
 graph/gblspans.h |  9 ++-------
 graph/grobjs.h   |  5 +++--
 src/ftcommon.c   | 47 ++++++++++++++++++++++++++++++++++++-----------
 src/ftgrid.c     |  2 +-
 6 files changed, 54 insertions(+), 21 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e9f0b09..be8a20a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2019-06-20  Alexei Podtelezhnikov  <address@hidden>
+
+       [ftgrid] Tweak direct rendering.
+
+       * src/ftcommon.c (FT_Demo_Sketch_Glyph_Color): Redefine surface origin
+       and clipping box instead of shifting outline.
+       * src/ftgrid.c (grid_status_draw_outline): Tweaked.
+       * graph/gblspans.h: Simplify.
+       * graph/grobjs.h (grSurface): Introduce `origin' byte. 
+       * graph/gblblit.c: Silence compilation warning.
+
 2019-06-19  Alexei Podtelezhnikov  <address@hidden>
 
        [ftgrid] Direct outline drawing.
diff --git a/graph/gblblit.c b/graph/gblblit.c
index 718b811..5ff18e1 100644
--- a/graph/gblblit.c
+++ b/graph/gblblit.c
@@ -411,6 +411,7 @@ grSetTargetGamma( grBitmap*  target,
     surface->gray_spans = _gblender_spans_rgb565;
     break;
   default:
+    (void)_gblender_spans_bgr565;  /* unused */
     surface->gray_spans = (grSpanFunc)0;
   }
 }
diff --git a/graph/gblspans.h b/graph/gblspans.h
index b0c38e5..b9de313 100644
--- a/graph/gblspans.h
+++ b/graph/gblspans.h
@@ -1,7 +1,7 @@
 
   GBLENDER_VARS;
 
-  unsigned char*  dst_line = surface->bitmap.buffer;
+  unsigned char*  dst_origin = surface->origin - y * surface->bitmap.pitch;
 
   gblender_use_channels( blender, 0 );
 
@@ -12,14 +12,9 @@
   (void)(g);
   (void)(b);
 
-  if ( surface->bitmap.pitch > 0 )
-    dst_line -= surface->bitmap.pitch * ( y - surface->bitmap.rows + 1 );
-  else
-    dst_line -= surface->bitmap.pitch * y;
-
   for ( ; count--; spans++ )
   {
-    unsigned char*  dst = dst_line + spans->x * GDST_INCR;
+    unsigned char*  dst = dst_origin + spans->x * GDST_INCR;
     unsigned short  w   = spans->len;
     int             a   = GBLENDER_SHADE_INDEX( spans->coverage );
 
diff --git a/graph/grobjs.h b/graph/grobjs.h
index c5cfd7d..7d82024 100644
--- a/graph/grobjs.h
+++ b/graph/grobjs.h
@@ -129,8 +129,9 @@
 
     GBlenderRec        gblender[1];
 
-    GBlenderPixel      gcolor;
-    grSpanFunc         gray_spans;
+    unsigned char*     origin;      /* span origin   */
+    GBlenderPixel      gcolor;      /* span color    */
+    grSpanFunc         gray_spans;  /* span function */
 
     grDevice*          device;
     grBool             refresh;
diff --git a/src/ftcommon.c b/src/ftcommon.c
index 85762e6..6c1b34d 100644
--- a/src/ftcommon.c
+++ b/src/ftcommon.c
@@ -1734,16 +1734,45 @@
                              grColor            color )
   {
     grSurface*        surface = (grSurface*)display->surface;
-    FT_Raster_Params  params;
+    grBitmap*         target = display->bitmap;
+    unsigned char*    origin;
     FT_Outline*       outline;
+    FT_Raster_Params  params;
 
 
     if ( glyph->format != FT_GLYPH_FORMAT_OUTLINE )
       return FT_Err_Ok;
 
-    outline = &((FT_OutlineGlyph)glyph)->outline;
+    origin = target->buffer;
+    if ( target->pitch < 0 )
+      origin += ( y - target->rows ) * target->pitch;
+    else
+      origin += ( y - 1 ) * target->pitch;
+
+    switch ( target->mode )
+    {
+    case gr_pixel_mode_gray:
+      origin += x;
+      break;
+    case gr_pixel_mode_rgb565:
+      origin += x * 2;
+      break;
+    case gr_pixel_mode_rgb24:
+      origin += x * 3;
+      break;
+    case gr_pixel_mode_rgb32:
+      origin += x * 4;
+      break;
+    default:
+      fprintf( stderr, "Unsupported target\n" );
+      return FT_Err_Ok;
+    }
 
-    FT_Outline_Translate( outline, x, display->bitmap->rows * 64 - y );
+    surface->origin = origin;
+    surface->gcolor = ((GBlenderPixel)color.chroma[0] << 16) |
+                      ((GBlenderPixel)color.chroma[1] << 8 ) |
+                      ((GBlenderPixel)color.chroma[2]      ) ;
+    outline = &((FT_OutlineGlyph)glyph)->outline;
 
     params.source        = outline;
     params.flags         = FT_RASTER_FLAG_AA     |
@@ -1751,14 +1780,10 @@
                            FT_RASTER_FLAG_CLIP;
     params.gray_spans    = (FT_SpanFunc)surface->gray_spans;
     params.user          = surface;
-    params.clip_box.xMin = 0;
-    params.clip_box.yMin = 0;
-    params.clip_box.xMax = display->bitmap->width;
-    params.clip_box.yMax = display->bitmap->rows;
-
-    surface->gcolor = ((GBlenderPixel)color.chroma[0] << 16) |
-                      ((GBlenderPixel)color.chroma[1] << 8 ) |
-                      ((GBlenderPixel)color.chroma[2]      ) ;
+    params.clip_box.xMin = -x;
+    params.clip_box.yMin =  y - target->rows;
+    params.clip_box.xMax = -x + target->width;
+    params.clip_box.yMax =  y;
 
     return FT_Outline_Render( handle->library, outline, &params );
   }
diff --git a/src/ftgrid.c b/src/ftgrid.c
index a6b1c4b..def21f1 100644
--- a/src/ftgrid.c
+++ b/src/ftgrid.c
@@ -682,7 +682,7 @@
         FT_Glyph_Stroke( &glyph, st->stroker, 1 );
 
         error = FTDemo_Sketch_Glyph_Color( handle, display, glyph,
-                                           ox * 64, oy * 64,
+                                           ox, oy,
                                            st->outline_color );
         if ( !error )
           FT_Done_Glyph( glyph );



reply via email to

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