gdiplus: Add tests for interpolation mode and make them pass.
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 @@
(*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 @@
(*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 @@
{
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 @@
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 @@
test_textcontrast();
test_fromMemoryBitmap();
test_string_functions();
+ test_get_set_interpolation();
GdiplusShutdown(gdiplusToken);
DestroyWindow( hwnd );