gdiplus: Implement gamma adjustment.
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 @@
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 @@
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);