Module: wine Branch: master Commit: 19b71b035ed81bb65f00ae84a263a9ff404a9c46 URL: http://source.winehq.org/git/wine.git/?a=commit;h=19b71b035ed81bb65f00ae84a2...
Author: Vincent Povirk vincent@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);