[babl] extensions/gggl{, -lies}.c: round toward nearest in integer unpremultiplication



commit e78677f1a8676f5ce6cef9ccab9a0f2ebe3c54bd
Author: Massimo Valentini <mvalentini src gnome org>
Date:   Sat Jul 14 17:07:38 2012 +0200

    extensions/gggl{,-lies}.c: round toward nearest in integer unpremultiplication
    
    from (docs/BablFishPath.html):
    ../extensions/.libs/gggl-lies.so 0: RaGaBaA u8 to RGBA u8
        error: 0.001425 cost: 81 processings: 1 pixels: 128
    ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B'A u8
        error: 0.001971 cost: 71 processings: 1 pixels: 128
    ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B' u8
        error: 0.001971 cost: 71 processings: 1 pixels: 128
    
    to:
    ../extensions/.libs/gggl-lies.so 0: RaGaBaA u8 to RGBA u8
        error: 0.000031 cost: 81 processings: 1 pixels: 128
    ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B'A u8
        error: 0.000042 cost: 61 processings: 1 pixels: 128
    ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B' u8
        error: 0.000042 cost: 61 processings: 1 pixels: 128

 extensions/gggl-lies.c |    8 ++++----
 extensions/gggl.c      |   16 ++++++++--------
 2 files changed, 12 insertions(+), 12 deletions(-)
---
diff --git a/extensions/gggl-lies.c b/extensions/gggl-lies.c
index d56a50e..40e3fe0 100644
--- a/extensions/gggl-lies.c
+++ b/extensions/gggl-lies.c
@@ -1095,10 +1095,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / src[3];
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
           *dst++ = src[3];
         }
       src += 4;
diff --git a/extensions/gggl.c b/extensions/gggl.c
index f1fb8c0..458de8d 100644
--- a/extensions/gggl.c
+++ b/extensions/gggl.c
@@ -1066,10 +1066,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / src[3];
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
           *dst++ = src[3];
         }
       src += 4;
@@ -1333,10 +1333,10 @@ conv_rgbA8_rgb8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          unsigned int aa = (255 << 16) / alpha;
-          *dst++ = (src[0] * aa) >> 16;
-          *dst++ = (src[1] * aa) >> 16;
-          *dst++ = (src[2] * aa) >> 16;
+          unsigned int aa = ((255 << 16) + (alpha >> 1)) / alpha;
+          *dst++ = (src[0] * aa + 0x8000) >> 16;
+          *dst++ = (src[1] * aa + 0x8000) >> 16;
+          *dst++ = (src[2] * aa + 0x8000) >> 16;
         }
       src += 4;
     }



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