freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] master 945967d 12/22: * graph/grblit.c (blit_mono_to_*


From: Werner Lemberg
Subject: [freetype2-demos] master 945967d 12/22: * graph/grblit.c (blit_mono_to_*): Slightly faster variants.
Date: Fri, 5 Mar 2021 11:18:39 -0500 (EST)

branch: master
commit 945967d03ca0ce7eb2266a34db2c59f11a7c3bcf
Author: Alexei Podtelezhnikov <apodtele@gmail.com>
Commit: Alexei Podtelezhnikov <apodtele@gmail.com>

    * graph/grblit.c (blit_mono_to_*): Slightly faster variants.
---
 ChangeLog      |   4 ++
 graph/grblit.c | 154 +++++++++++++++++++++++++++------------------------------
 2 files changed, 76 insertions(+), 82 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 808c655..2c82a3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2021-01-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
+       * graph/grblit.c (blit_mono_to_*): Slightly faster variants.
+
+2021-01-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
        [graph] Decouple the legacy and alpha blenders.
 
        * graph/grblit.c (grBlitGlyphToBitmap): Do not call
diff --git a/graph/grblit.c b/graph/grblit.c
index 3589736..aff340e 100644
--- a/graph/grblit.c
+++ b/graph/grblit.c
@@ -237,31 +237,31 @@
                            grColor     color )
   {
     int             x, y;
-    unsigned int    shift;
-    unsigned char*  read;
-    unsigned char*  write;
-
-    read  = blit->read  + (blit->xread >> 3);
-    write = blit->write +  blit->xwrite;
-    shift = blit->xread & 7;
+    unsigned char*  write = blit->write + blit->xwrite;
+    unsigned char*  read  = blit->read  + ( blit->xread >> 3 );
+    unsigned int    mask  = 0x80 >> ( blit->xread & 7 );
 
     y = blit->height;
     do
     {
-      unsigned char*  _read  = read;
       unsigned char*  _write = write;
-      unsigned long    val   = ((unsigned long)*_read++ | 0x100) << shift;
+      unsigned char*  _read  = read;
+      unsigned int    _mask  = mask;
+      unsigned int     val   = *_read;
 
       x = blit->width;
       do
       {
-        if (val & 0x10000)
-          val = *_read++ | 0x100;
+        if ( !_mask )
+        {
+          val   = *++_read;
+          _mask = 0x80;
+        }
 
-        if ( val & 0x80 )
+        if ( val & _mask )
           *_write = (unsigned char)color.value;
 
-        val <<= 1;
+        _mask >>= 1;
         _write++;
 
       } while ( --x > 0 );
@@ -283,47 +283,37 @@
   void  blit_mono_to_pal4( grBlitter*  blit,
                            grColor     color )
   {
-    int             x, y, phase;
-    unsigned int    shift;
-    unsigned char*  read;
-    unsigned char*  write;
-    unsigned int    col;
-
-
-    col   = color.value & 15;
-    read  = blit->read  + (blit->xread >> 3);
-    write = blit->write + (blit->xwrite >> 1);
-
-    /* now begin blit */
-    shift = blit->xread & 7;
-    phase = blit->xwrite & 1;
+    int             x, y;
+    unsigned char*  write = blit->write + ( blit->xwrite >> 1 );
+    unsigned int    phase = blit->xwrite & 1 ? 0x0F : 0xF0;
+    unsigned char*  read  = blit->read  + ( blit->xread >> 3 );
+    unsigned int    mask  = 0x80 >> ( blit->xread & 7 );
+    unsigned int    col = color.value | ( color.value << 4 );
 
     y = blit->height;
     do
     {
-      unsigned char*  _read  = read;
       unsigned char*  _write = write;
-      int             _phase = phase;
-      unsigned long    val   = ((unsigned long)*_read++ | 0x100) << shift;
+      unsigned int    _phase = phase;
+      unsigned char*  _read  = read;
+      unsigned int    _mask  = mask;
+      unsigned int     val   = *_read;
 
       x = blit->width;
       do
       {
-        if (val & 0x10000)
-          val = *_read++ | 0x100;
-
-        if ( val & 0x80 )
+        if ( !_mask )
         {
-          if ( _phase )
-            *_write = (unsigned char)((*_write & 0xF0) | col);
-          else
-            *_write = (unsigned char)((*_write & 0x0F) | (col << 4));
+          val   = *++_read;
+          _mask = 0x80;
         }
 
-        val <<= 1;
+        if ( val & _mask )
+          *_write = (unsigned char)( (col & _phase) | (*_write & ~_phase) );
 
-        _write += _phase;
-        _phase ^= 1;
+        _mask >>= 1;
+        _write += _phase & 1;
+        _phase  = ~_phase;
         x--;
       } while ( x > 0 );
 
@@ -345,32 +335,32 @@
                             grColor     color )
   {
     int              x, y;
-    unsigned int     shift;
-    unsigned char*   read;
-    unsigned char*   write;
-
-    read  = blit->read + (blit->xread >> 3);
-    write = blit->write + blit->xwrite*2;
-    shift = blit->xread & 7;
+    unsigned char*   write = blit->write + blit->xwrite * 2;
+    unsigned char*   read  = blit->read  + ( blit->xread >> 3 );
+    unsigned int     mask  = 0x80 >> ( blit->xread & 7 );
 
     y = blit->height;
     do
     {
+      unsigned short* _write = (unsigned short*)write;
       unsigned char*  _read  = read;
-      unsigned char*  _write = write;
-      unsigned long    val   = ((unsigned long)*_read++ | 0x100) << shift;
+      unsigned int    _mask  = mask;
+      unsigned int     val   = *_read;
 
       x = blit->width;
       do
       {
-        if (val & 0x10000)
-          val = *_read++ | 0x100;
+        if ( !_mask )
+        {
+          val   = *++_read;
+          _mask = 0x80;
+        }
 
-        if ( val & 0x80 )
-          *(short*)_write = (short)color.value;
+        if ( val & _mask )
+          *_write = (unsigned short)color.value;
 
-        val   <<= 1;
-        _write +=2;
+        _mask >>= 1;
+        _write++;
         x--;
       } while ( x > 0 );
 
@@ -392,35 +382,35 @@
                             grColor     color )
   {
     int             x, y;
-    unsigned int    shift;
-    unsigned char*  read;
-    unsigned char*  write;
-
-    read  = blit->read  + (blit->xread >> 3);
-    write = blit->write + blit->xwrite*3;
-    shift = blit->xread & 7;
+    unsigned char*  write = blit->write + blit->xwrite * 3;
+    unsigned char*  read  = blit->read  + ( blit->xread >> 3 );
+    unsigned int    mask  = 0x80 >> ( blit->xread & 7 );
 
     y = blit->height;
     do
     {
-      unsigned char*  _read  = read;
       unsigned char*  _write = write;
-      unsigned long    val   = ((unsigned long)*_read++ | 0x100) << shift;
+      unsigned char*  _read  = read;
+      unsigned int    _mask  = mask;
+      unsigned int     val   = *_read;
 
       x = blit->width;
       do
       {
-        if (val & 0x10000)
-          val = *_read++ | 0x100;
+        if ( !_mask )
+        {
+          val   = *++_read;
+          _mask = 0x80;
+        }
 
-        if ( val & 0x80 )
+        if ( val & _mask )
         {
           _write[0] = color.chroma[0];
           _write[1] = color.chroma[1];
           _write[2] = color.chroma[2];
         }
 
-        val   <<= 1;
+        _mask >>= 1;
         _write += 3;
         x--;
       } while ( x > 0 );
@@ -443,31 +433,31 @@
                             grColor     color )
   {
     int             x, y;
-    unsigned int    shift;
-    unsigned char*  read;
-    unsigned char*  write;
-
-    read  = blit->read  + ( blit->xread >> 3 );
-    write = blit->write + blit->xwrite*4;
-    shift = blit->xread & 7;
+    unsigned char*  write = blit->write + blit->xwrite * 4;
+    unsigned char*  read  = blit->read  + ( blit->xread >> 3 );
+    unsigned int    mask  = 0x80 >> ( blit->xread & 7 );
 
     y = blit->height;
     do
     {
-      unsigned char*  _read  = read;
       uint32_t*       _write = (uint32_t*)write;
-      unsigned long   val    = ((unsigned long)*_read++ | 0x100L ) << shift;
+      unsigned char*  _read  = read;
+      unsigned int    _mask  = mask;
+      unsigned int     val   = *_read;
 
       x = blit->width;
       do
       {
-        if ( val & 0x10000 )
-          val = *_read++ | 0x100L;
+        if ( !_mask )
+        {
+          val   = *++_read;
+          _mask = 0x80;
+        }
 
-        if ( val & 0x80 )
+        if ( val & _mask )
           *_write = color.value;
 
-        val   <<= 1;
+        _mask >>= 1;
         _write++;
         x--;
 



reply via email to

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