Vincent Povirk : gdiplus: Implement gamma adjustment.

Alexandre Julliard julliard at winehq.org
Mon Mar 28 14:21:59 CDT 2011


Module: wine
Branch: master
Commit: 19b71b035ed81bb65f00ae84a263a9ff404a9c46
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=19b71b035ed81bb65f00ae84a263a9ff404a9c46

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Mar 24 17:31:57 2011 -0500

gdiplus: Implement gamma adjustment.

---

 dlls/gdiplus/graphics.c    |   28 +++++++++++++++++++++++++---
 dlls/gdiplus/tests/image.c |    2 +-
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 840825a..eb74021 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -467,9 +467,31 @@ static void apply_image_attributes(const GpImageAttributes *attributes, LPBYTE d
     if (attributes->gamma_enabled[type] ||
         attributes->gamma_enabled[ColorAdjustTypeDefault])
     {
-        static int fixme;
-        if (!fixme++)
-            FIXME("Gamma adjustment not implemented\n");
+        REAL gamma;
+
+        if (attributes->gamma_enabled[type])
+            gamma = attributes->gamma[type];
+        else
+            gamma = attributes->gamma[ColorAdjustTypeDefault];
+
+        for (x=0; x<width; x++)
+            for (y=0; y<height; y++)
+            {
+                ARGB *src_color;
+                BYTE blue, green, red;
+                src_color = (ARGB*)(data + stride * y + sizeof(ARGB) * x);
+
+                blue = *src_color&0xff;
+                green = (*src_color>>8)&0xff;
+                red = (*src_color>>16)&0xff;
+
+                /* FIXME: We should probably use a table for this. */
+                blue = floorf(powf(blue / 255.0, gamma) * 255.0);
+                green = floorf(powf(green / 255.0, gamma) * 255.0);
+                red = floorf(powf(red / 255.0, gamma) * 255.0);
+
+                *src_color = (*src_color & 0xff000000) | (red << 16) | (green << 8) | blue;
+            }
     }
 }
 
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index cbae047..1e6a9e9 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -2085,7 +2085,7 @@ static void test_gamma(void)
 
     stat = GdipBitmapGetPixel(bitmap2, 0, 0, &color);
     expect(Ok, stat);
-    todo_wine ok(color_match(0xff20ffff, color, 1), "Expected ff20ffff, got %.8x\n", color);
+    ok(color_match(0xff20ffff, color, 1), "Expected ff20ffff, got %.8x\n", color);
 
     GdipDeleteGraphics(graphics);
     GdipDisposeImage((GpImage*)bitmap1);




More information about the wine-cvs mailing list