Vincent Povirk : gdiplus: Add tests for interpolation mode and make them pass.

Alexandre Julliard julliard at winehq.org
Thu Mar 10 11:30:25 CST 2011


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Mar  3 14:57:19 2011 -0600

gdiplus: Add tests for interpolation mode and make them pass.

---

 dlls/gdiplus/graphics.c       |   12 +++++--
 dlls/gdiplus/tests/graphics.c |   70 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index e9412c8..4827bb0 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1364,7 +1364,7 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
     (*graphics)->owndc = FALSE;
     (*graphics)->smoothing = SmoothingModeDefault;
     (*graphics)->compqual = CompositingQualityDefault;
-    (*graphics)->interpolation = InterpolationModeDefault;
+    (*graphics)->interpolation = InterpolationModeBilinear;
     (*graphics)->pixeloffset = PixelOffsetModeDefault;
     (*graphics)->compmode = CompositingModeSourceOver;
     (*graphics)->unit = UnitDisplay;
@@ -1403,7 +1403,7 @@ GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics)
     (*graphics)->image = image;
     (*graphics)->smoothing = SmoothingModeDefault;
     (*graphics)->compqual = CompositingQualityDefault;
-    (*graphics)->interpolation = InterpolationModeDefault;
+    (*graphics)->interpolation = InterpolationModeBilinear;
     (*graphics)->pixeloffset = PixelOffsetModeDefault;
     (*graphics)->compmode = CompositingModeSourceOver;
     (*graphics)->unit = UnitDisplay;
@@ -4638,12 +4638,18 @@ GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics,
 {
     TRACE("(%p, %d)\n", graphics, mode);
 
-    if(!graphics)
+    if(!graphics || mode == InterpolationModeInvalid || mode > InterpolationModeHighQualityBicubic)
         return InvalidParameter;
 
     if(graphics->busy)
         return ObjectBusy;
 
+    if (mode == InterpolationModeDefault || mode == InterpolationModeLowQuality)
+        mode = InterpolationModeBilinear;
+
+    if (mode == InterpolationModeHighQuality)
+        mode = InterpolationModeHighQualityBicubic;
+
     graphics->interpolation = mode;
 
     return Ok;
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index 275c237..ecdbe93 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -3012,6 +3012,75 @@ static void test_string_functions(void)
     ReleaseDC(hwnd, hdc);
 }
 
+static void test_get_set_interpolation(void)
+{
+    GpGraphics *graphics;
+    HDC hdc = GetDC( hwnd );
+    GpStatus status;
+    InterpolationMode mode;
+
+    ok(hdc != NULL, "Expected HDC to be initialized\n");
+    status = GdipCreateFromHDC(hdc, &graphics);
+    expect(Ok, status);
+    ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+    status = GdipGetInterpolationMode(NULL, &mode);
+    expect(InvalidParameter, status);
+
+    if (0)
+    {
+        /* Crashes on Windows XP */
+        status = GdipGetInterpolationMode(graphics, NULL);
+        expect(InvalidParameter, status);
+    }
+
+    status = GdipSetInterpolationMode(NULL, InterpolationModeNearestNeighbor);
+    expect(InvalidParameter, status);
+
+    /* out of range */
+    status = GdipSetInterpolationMode(graphics, InterpolationModeHighQualityBicubic+1);
+    expect(InvalidParameter, status);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeInvalid);
+    expect(InvalidParameter, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeBilinear, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeNearestNeighbor);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeNearestNeighbor, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeDefault);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeBilinear, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeLowQuality);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeBilinear, mode);
+
+    status = GdipSetInterpolationMode(graphics, InterpolationModeHighQuality);
+    expect(Ok, status);
+
+    status = GdipGetInterpolationMode(graphics, &mode);
+    expect(Ok, status);
+    expect(InterpolationModeHighQualityBicubic, mode);
+
+    GdipDeleteGraphics(graphics);
+
+    ReleaseDC(hwnd, hdc);
+}
+
 START_TEST(graphics)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -3070,6 +3139,7 @@ START_TEST(graphics)
     test_textcontrast();
     test_fromMemoryBitmap();
     test_string_functions();
+    test_get_set_interpolation();
 
     GdiplusShutdown(gdiplusToken);
     DestroyWindow( hwnd );




More information about the wine-cvs mailing list