freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master f6f0006b: * src/ftgrid.c (bitmap_scale): Scale


From: Werner Lemberg
Subject: [freetype2-demos] master f6f0006b: * src/ftgrid.c (bitmap_scale): Scale based on width instead of pitch.
Date: Wed, 18 Dec 2024 13:30:56 -0500 (EST)

branch: master
commit f6f0006b11236cc26e1309ebe32e6df8cb332364
Author: Alexei Podtelezhnikov (Алексей Подтележников) <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov (Алексей Подтележников) <apodtele@gmail.com>

    * src/ftgrid.c (bitmap_scale): Scale based on width instead of pitch.
---
 src/ftgrid.c | 105 ++++++++++++++++++++++++++---------------------------------
 1 file changed, 47 insertions(+), 58 deletions(-)

diff --git a/src/ftgrid.c b/src/ftgrid.c
index 93e3d63d..065b298c 100644
--- a/src/ftgrid.c
+++ b/src/ftgrid.c
@@ -398,60 +398,55 @@
                 grBitmap*   bit,
                 int         scale )
   {
+    int             r = bit->rows;
+    int             w = bit->width;
+    int             p = bit->pitch;
     unsigned char*  s = bit->buffer;
     unsigned char*  line;
-    int             pitch;
-    int             width;
     int             i, j, k;
 
-    pitch = bit->pitch > 0 ?  bit->pitch
-                           : -bit->pitch;
-    width = bit->width;
 
-    /* limit bitmap size */
-    if ( pitch * scale <= 0xFFFF && bit->rows * scale <= 0xFFFF )
-      line = (unsigned char*)malloc( (size_t)( pitch * bit->rows *
-                                               scale * scale ) );
-    else
-      line = NULL;
-
-    bit->buffer = line;  /* the bitmap now owns this buffer */
+    if ( p < 0 )
+      s -= p * ( r - 1 );
 
-    if ( !line )
+    bit->buffer = NULL;  /* to replace */
+    if ( grNewBitmap( bit->mode, bit->grays, w * scale, r * scale, bit ) )
       return;
 
+    line = bit->buffer;
+
     switch( bit->mode )
     {
       case gr_pixel_mode_mono:
-        for ( i = 0; i < bit->rows; i++ )
+        for ( i = 0; i < r; i++ )
         {
-          for ( j = 0; j < pitch * scale * 8; j++ )
-            if ( s[i * pitch + j / scale / 8] & ( 0x80 >> ( j / scale & 7 ) ) )
+          for ( j = 0; j < bit->width; j++ )
+            if ( s[i * p + j / scale / 8] & ( 0x80 >> ( j / scale & 7 ) ) )
               line[j / 8] |= 0x80 >> ( j & 7 );
             else
               line[j / 8] &= ~( 0x80 >> ( j & 7 ) );
 
-          for ( k = 1; k < scale; k++, line += pitch * scale )
-            memcpy( line + pitch * scale, line, (size_t)( pitch * scale ) );
-          line += pitch * scale;
+          for ( k = 1; k < scale; k++, line += bit->pitch )
+            memcpy( line + bit->pitch, line, (size_t)( bit->pitch ) );
+          line += bit->pitch;
 
           /* center specks */
           if ( scale > 8 )
-            for ( j = scale / 2; j < width * scale; j += scale )
-              line[j / 8 - scale / 2 * pitch * scale] ^= 0x80 >> ( j & 7 );
+            for ( j = scale / 2; j < bit->width; j += scale )
+              line[j / 8 - scale / 2 * bit->pitch] ^= 0x80 >> ( j & 7 );
         }
         break;
 
       case gr_pixel_mode_gray:
       Gray:
-        for ( i = 0; i < bit->rows; i++ )
+        for ( i = 0; i < r; i++ )
         {
-          for ( j = 0; j < pitch; j++ )
-            memset( line + j * scale, s[i * pitch + j], (size_t)scale );
+          for ( j = 0; j < w; j++ )
+            memset( line + j * scale, s[i * p + j], (size_t)scale );
 
-          for ( k = 1; k < scale; k++, line += pitch * scale )
-            memcpy( line + pitch * scale, line, (size_t)( pitch * scale ) );
-          line += pitch * scale;
+          for ( k = 1; k < scale; k++, line += bit->pitch )
+            memcpy( line + bit->pitch, line, (size_t)( bit->pitch ) );
+          line += bit->pitch;
         }
         break;
 
@@ -459,19 +454,19 @@
       case gr_pixel_mode_lcd2:
         if ( st->work & DO_GRAY_BITMAP )
           goto Gray;
-        for ( i = 0; i < bit->rows; i++ )
+        for ( i = 0; i < r; i++ )
         {
-          for ( j = 0; j < width; j += 3 )
+          for ( j = 0; j < w; j += 3 )
             for ( k = 0; k < scale; k++ )
             {
-              line[j * scale + 3 * k    ] = s[i * pitch + j    ];
-              line[j * scale + 3 * k + 1] = s[i * pitch + j + 1];
-              line[j * scale + 3 * k + 2] = s[i * pitch + j + 2];
+              line[j * scale + 3 * k    ] = s[i * p + j    ];
+              line[j * scale + 3 * k + 1] = s[i * p + j + 1];
+              line[j * scale + 3 * k + 2] = s[i * p + j + 2];
             }
 
-          for ( k = 1; k < scale; k++, line += pitch * scale )
-            memcpy( line + pitch * scale, line, (size_t)( pitch * scale ) );
-          line += pitch * scale;
+          for ( k = 1; k < scale; k++, line += bit->pitch )
+            memcpy( line + bit->pitch, line, (size_t)( bit->pitch ) );
+          line += bit->pitch;
         }
         break;
 
@@ -479,49 +474,43 @@
       case gr_pixel_mode_lcdv2:
         if ( st->work & DO_GRAY_BITMAP )
           goto Gray;
-        for ( i = 0; i < bit->rows; i += 3 )
+        for ( i = 0; i < r; i += 3 )
         {
-          for ( j = 0; j < pitch; j++ )
+          for ( j = 0; j < w; j++ )
           {
             memset( line + j * scale,
-                    s[i * pitch +             j], (size_t)scale );
-            memset( line + j * scale +     pitch * scale,
-                    s[i * pitch +     pitch + j], (size_t)scale );
-            memset( line + j * scale + 2 * pitch * scale,
-                    s[i * pitch + 2 * pitch + j], (size_t)scale );
+                    s[i * p +         j], (size_t)scale );
+            memset( line + j * scale +     bit->pitch,
+                    s[i * p +     p + j], (size_t)scale );
+            memset( line + j * scale + 2 * bit->pitch,
+                    s[i * p + 2 * p + j], (size_t)scale );
           }
 
-          for ( k = 1; k < scale; k++, line += 3 * pitch * scale )
-            memcpy( line + 3 * pitch * scale,
-                    line,
-                    (size_t)( 3 * pitch * scale ) );
-          line += 3 * pitch * scale;
+          for ( k = 1; k < scale; k++, line += 3 * bit->pitch )
+            memcpy( line + 3 * bit->pitch, line, (size_t)( 3 * bit->pitch ) );
+          line += 3 * bit->pitch;
         }
         break;
 
       case gr_pixel_mode_bgra:
-        for ( i = 0; i < bit->rows; i++ )
+        for ( i = 0; i < r; i++ )
         {
           FT_UInt32*  l4 = (FT_UInt32*)line;
-          FT_UInt32*  s4 = (FT_UInt32*)( s + i * pitch );
+          FT_UInt32*  s4 = (FT_UInt32*)( s + i * p );
 
-          for ( j = 0; j < width; j++, s4++ )
+          for ( j = 0; j < w; j++, s4++ )
             for ( k = 0; k < scale; k++, l4++ )
               *l4 = *s4;
 
-          for ( k = 1; k < scale; k++, line += pitch * scale )
-            memcpy( line + pitch * scale, line, (size_t)( pitch * scale ) );
-          line += pitch * scale;
+          for ( k = 1; k < scale; k++, line += bit->pitch )
+            memcpy( line + bit->pitch, line, (size_t)( bit->pitch ) );
+          line += bit->pitch;
         }
         break;
 
       default:
         return;
     }
-
-    bit->rows  *= scale;
-    bit->width *= scale;
-    bit->pitch *= scale;
   }
 
 



reply via email to

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