[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
*/
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master 50de6cec: [graph] Clean up the cache clearance.,
Werner Lemberg <=