freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master 50de6cec: [graph] Clean up the cache clearance.


From: Werner Lemberg
Subject: [freetype2-demos] master 50de6cec: [graph] Clean up the cache clearance.
Date: Thu, 15 Sep 2022 13:36:18 -0400 (EDT)

branch: master
commit 50de6cec2a4abd99389505899f4c5edfc7994259
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    [graph] Clean up the cache clearance.
    
    Use separate functions to clear the color and channel gradient
    caches and call them conditionally instead of passing the switch
    around.
    
    * graph/gblender.c (gblender_clear): Separate out...
    (gblender_clear_channels): ... this function.
    (gblender_use_channels): Removed.
    * graph/gblender.h: Update their declarations.
    * graph/gblgblit.c (gblender_blit_init, grSetTargetPenBrush):
    Updated to call the above functions and formatted.
---
 graph/gblblit.c  | 76 +++++++++++++++++++++++++++++++++-----------------------
 graph/gblender.c | 76 ++++++++++++++++++++++++--------------------------------
 graph/gblender.h |  7 +++---
 3 files changed, 81 insertions(+), 78 deletions(-)

diff --git a/graph/gblblit.c b/graph/gblblit.c
index bf02918b..bc4ba91a 100644
--- a/graph/gblblit.c
+++ b/graph/gblblit.c
@@ -244,55 +244,69 @@ gblender_blit_init( GBlenderBlit           blit,
                     grSurface*             surface,
                     grBitmap*              glyph )
 {
-  int               src_x = 0;
-  int               src_y = 0;
-  int               delta;
-
-  grBitmap*  target = (grBitmap*)surface;
-
-  GBlenderSourceFormat   src_format;
-  const unsigned char*   src_buffer = glyph->buffer;
-  int                    src_pitch  = glyph->pitch;
-  int                    src_width  = glyph->width;
-  int                    src_height = glyph->rows;
-  unsigned char*         dst_buffer = target->buffer;
-  const int              dst_pitch  = target->pitch;
-  const int              dst_width  = target->width;
-  const int              dst_height = target->rows;
+  grBitmap*  target = &surface->bitmap;
+  GBlender   blender = surface->gblender;
+
+  GBlenderSourceFormat  src_format;
+  int                   src_x = 0;
+  int                   src_y = 0;
+  int                   delta;
+  const unsigned char*  src_buffer = glyph->buffer;
+  int                   src_pitch  = glyph->pitch;
+  int                   src_width  = glyph->width;
+  int                   src_height = glyph->rows;
+  unsigned char*        dst_buffer = target->buffer;
+  const int             dst_pitch  = target->pitch;
+  const int             dst_width  = target->width;
+  const int             dst_height = target->rows;
 
 
   switch ( glyph->mode )
   {
-  case gr_pixel_mode_gray:  src_format = GBLENDER_SOURCE_GRAY8;
-    gblender_use_channels( surface->gblender, 0 );
+  case gr_pixel_mode_gray:
+    src_format = GBLENDER_SOURCE_GRAY8;
+    if ( blender->channels )
+      gblender_clear( blender );
     break;
-  case gr_pixel_mode_lcd:   src_format = GBLENDER_SOURCE_HRGB;
+  case gr_pixel_mode_lcd:
+    src_format = GBLENDER_SOURCE_HRGB;
     src_width /= 3;
-    gblender_use_channels( surface->gblender, 1 );
+    if ( !blender->channels )
+      gblender_clear_channels( blender );
     break;
-  case gr_pixel_mode_lcd2:  src_format = GBLENDER_SOURCE_HBGR;
+  case gr_pixel_mode_lcd2:
+    src_format = GBLENDER_SOURCE_HBGR;
     src_width /= 3;
-    gblender_use_channels( surface->gblender, 1 );
+    if ( !blender->channels )
+      gblender_clear_channels( blender );
     break;
-  case gr_pixel_mode_lcdv:  src_format = GBLENDER_SOURCE_VRGB;
+  case gr_pixel_mode_lcdv:
+    src_format  = GBLENDER_SOURCE_VRGB;
     src_height /= 3;
     src_pitch  *= 3;
-    gblender_use_channels( surface->gblender, 1 );
+    if ( !blender->channels )
+      gblender_clear_channels( blender );
     break;
-  case gr_pixel_mode_lcdv2: src_format = GBLENDER_SOURCE_VBGR;
+  case gr_pixel_mode_lcdv2:
+    src_format  = GBLENDER_SOURCE_VBGR;
     src_height /= 3;
     src_pitch  *= 3;
-    gblender_use_channels( surface->gblender, 1 );
+    if ( !blender->channels )
+      gblender_clear_channels( blender );
     break;
-  case gr_pixel_mode_bgra:  src_format = GBLENDER_SOURCE_BGRA;
+  case gr_pixel_mode_bgra:
+    src_format = GBLENDER_SOURCE_BGRA;
     break;
-  case gr_pixel_mode_mono:  src_format = GBLENDER_SOURCE_MONO;
+  case gr_pixel_mode_mono:
+    src_format = GBLENDER_SOURCE_MONO;
     break;
   default:
     grError = gr_err_bad_source_depth;
     return -2;
   }
 
+  blit->blender = blender;
+
   switch ( target->mode )
   {
   case gr_pixel_mode_gray:
@@ -315,8 +329,6 @@ gblender_blit_init( GBlenderBlit           blit,
     return -2;
   }
 
-  blit->blender   = surface->gblender;
-
   if ( dst_x < 0 )
   {
     src_width += dst_x;
@@ -378,6 +390,7 @@ grSetTargetPenBrush( grSurface*  surface,
                      grColor     color )
 {
   grBitmap*  target = &surface->bitmap;
+  GBlender   blender = surface->gblender;
 
 
   surface->origin = target->buffer;
@@ -415,7 +428,8 @@ grSetTargetPenBrush( grSurface*  surface,
 
   surface->color = color;
 
-  gblender_use_channels( surface->gblender, 0 );
+  if ( blender->channels )
+    gblender_clear( blender );
 }
 
 
@@ -426,7 +440,7 @@ grBlitGlyphToSurface( grSurface*  surface,
                       grPos       y,
                       grColor     color )
 {
-  GBlenderBlitRec       gblit[1];
+  GBlenderBlitRec  gblit[1];
 
 
   /* check arguments */
diff --git a/graph/gblender.c b/graph/gblender.c
index 984d3ecc..309240f7 100644
--- a/graph/gblender.c
+++ b/graph/gblender.c
@@ -116,49 +116,54 @@ gblender_set_gamma_table( double           gamma_value,
 
 /* clear the cache
  */
-static void
-gblender_clear( GBlender  blender )
+GBLENDER_APIDEF( void )
+gblender_clear_channels( GBlender  blender )
 {
+  GBlenderChanKey  chan_keys = (GBlenderChanKey)blender->keys;
   int  nn;
 
-  if ( blender->channels )
-  {
-    GBlenderChanKey  chan_keys = (GBlenderChanKey) blender->keys;
 
-    for ( nn = 0; nn < GBLENDER_KEY_COUNT * 3; nn++ )
-      chan_keys[nn].index = 0xFFFF;
+  for ( nn = 0; nn < GBLENDER_KEY_COUNT * 3; nn++ )
+    chan_keys[nn].index = 0xFFFF;
 
-    blender->cache_r_back  = 0;
-    blender->cache_r_fore  = ~0U;
-    blender->cache_r_cells = NULL;
+  blender->cache_r_back  = 0;
+  blender->cache_r_fore  = ~0U;
+  blender->cache_r_cells = NULL;
 
-    blender->cache_g_back  = 0;
-    blender->cache_g_fore  = ~0U;
-    blender->cache_g_cells = NULL;
+  blender->cache_g_back  = 0;
+  blender->cache_g_fore  = ~0U;
+  blender->cache_g_cells = NULL;
 
-    blender->cache_b_back  = 0;
-    blender->cache_b_fore  = ~0U;
-    blender->cache_b_cells = NULL;
-  }
-  else
-  {
-    GBlenderKey  keys = blender->keys;
+  blender->cache_b_back  = 0;
+  blender->cache_b_fore  = ~0U;
+  blender->cache_b_cells = NULL;
 
-    for ( nn = 0; nn < GBLENDER_KEY_COUNT; nn++ )
-      keys[nn].cells = NULL;
+  blender->channels      = 1;
+}
 
-    blender->cache_back  = 0;
-    blender->cache_fore  = ~0U;
-    blender->cache_cells = NULL;
-  }
+
+GBLENDER_APIDEF( void )
+gblender_clear( GBlender  blender )
+{
+  GBlenderKey  keys = blender->keys;
+  int  nn;
+
+
+  for ( nn = 0; nn < GBLENDER_KEY_COUNT; nn++ )
+    keys[nn].cells = NULL;
+
+  blender->cache_back  = 0;
+  blender->cache_fore  = ~0U;
+  blender->cache_cells = NULL;
+
+  blender->channels    = 0;
 }
 
+
 GBLENDER_APIDEF( void )
 gblender_init( GBlender   blender,
                double     gamma_value )
 {
-  blender->channels = 0;
-
   gblender_set_gamma_table( gamma_value,
                             blender->gamma_ramp,
                             blender->gamma_ramp_inv );
@@ -174,21 +179,6 @@ gblender_init( GBlender   blender,
 }
 
 
-GBLENDER_APIDEF( void )
-gblender_use_channels( GBlender  blender,
-                       int       channels )
-{
-  channels = (channels != 0);
-
-  if ( blender->channels != channels )
-  {
-    blender->channels = channels;
-    gblender_clear( blender );
-  }
-}
-
-
-
 /* recompute the grade levels of a given key
  */
 static void
diff --git a/graph/gblender.h b/graph/gblender.h
index b5970202..31f33c30 100644
--- a/graph/gblender.h
+++ b/graph/gblender.h
@@ -122,12 +122,11 @@
 
  /* clear blender, and reset stats */
   GBLENDER_API( void )
-  gblender_reset( GBlender  blender );
-
+  gblender_clear( GBlender  blender );
 
   GBLENDER_API( void )
-  gblender_use_channels( GBlender  blender,
-                         int       channels );
+  gblender_clear_channels( GBlender  blender );
+
 
  /* lookup a cell range for a given (background,foreground) pair
   */



reply via email to

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