Evan Stade : gdiplus: Added GpGraphics save/restore tests.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 16 08:23:43 CDT 2007
Module: wine
Branch: master
Commit: d13e1ba0e826a3acd59497978c98c150b24b8532
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d13e1ba0e826a3acd59497978c98c150b24b8532
Author: Evan Stade <estade at gmail.com>
Date: Fri Jul 13 17:51:45 2007 -0700
gdiplus: Added GpGraphics save/restore tests.
---
dlls/gdiplus/tests/graphics.c | 170 +++++++++++++++++++++++++++++++++++++++++
1 files changed, 170 insertions(+), 0 deletions(-)
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index 93d419c..17f0f85 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -24,6 +24,7 @@
#include "wine/test.h"
#define expect(expected, got) ok(got == expected, "Expected %.8x, got %.8x\n", expected, got)
+#define TABLE_LEN (23)
static void test_constructor_destructor()
{
@@ -51,6 +52,174 @@ static void test_constructor_destructor()
ReleaseDC(0, hdc);
}
+typedef struct node{
+ GraphicsState data;
+ struct node * next;
+} node;
+
+/* Linked list prepend function. */
+static void log_state(GraphicsState data, node ** log)
+{
+ node * new_entry = HeapAlloc(GetProcessHeap(), 0, sizeof(node));
+
+ new_entry->data = data;
+ new_entry->next = *log;
+ *log = new_entry;
+}
+
+/* Checks if there are duplicates in the list, and frees it. */
+static void check_no_duplicates(node * log)
+{
+ INT dups = 0;
+ node * temp = NULL;
+
+ if(!log)
+ goto end;
+
+ do{
+ HeapFree(GetProcessHeap(), 0, temp);
+ temp = log;
+ while((temp = temp->next))
+ if(log->data == temp->data)
+ dups++;
+
+ }while((log = log->next));
+
+ HeapFree(GetProcessHeap(), 0, temp);
+
+end:
+ expect(0, dups);
+}
+
+static void test_save_restore()
+{
+ GpStatus stat;
+ GraphicsState state_a, state_b, state_c;
+ InterpolationMode mode;
+ GpGraphics *graphics1, *graphics2;
+ node * state_log = NULL;
+ HDC hdc = GetDC(0);
+
+ /* Invalid saving. */
+ GdipCreateFromHDC(hdc, &graphics1);
+ stat = GdipSaveGraphics(graphics1, NULL);
+ expect(InvalidParameter, stat);
+ stat = GdipSaveGraphics(NULL, &state_a);
+ expect(InvalidParameter, stat);
+ GdipDeleteGraphics(graphics1);
+
+ log_state(state_a, &state_log);
+
+ /* Basic save/restore. */
+ GdipCreateFromHDC(hdc, &graphics1);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBilinear);
+ stat = GdipSaveGraphics(graphics1, &state_a);
+ todo_wine
+ expect(Ok, stat);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBicubic);
+ stat = GdipRestoreGraphics(graphics1, state_a);
+ todo_wine
+ expect(Ok, stat);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBilinear, mode);
+ GdipDeleteGraphics(graphics1);
+
+ log_state(state_a, &state_log);
+
+ /* Restoring garbage doesn't affect saves. */
+ GdipCreateFromHDC(hdc, &graphics1);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBilinear);
+ GdipSaveGraphics(graphics1, &state_a);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBicubic);
+ GdipSaveGraphics(graphics1, &state_b);
+ GdipSetInterpolationMode(graphics1, InterpolationModeNearestNeighbor);
+ stat = GdipRestoreGraphics(graphics1, 0xdeadbeef);
+ todo_wine
+ expect(Ok, stat);
+ GdipRestoreGraphics(graphics1, state_b);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBicubic, mode);
+ GdipRestoreGraphics(graphics1, state_a);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBilinear, mode);
+ GdipDeleteGraphics(graphics1);
+
+ log_state(state_a, &state_log);
+ log_state(state_b, &state_log);
+
+ /* Restoring older state invalidates newer saves (but not older saves). */
+ GdipCreateFromHDC(hdc, &graphics1);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBilinear);
+ GdipSaveGraphics(graphics1, &state_a);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBicubic);
+ GdipSaveGraphics(graphics1, &state_b);
+ GdipSetInterpolationMode(graphics1, InterpolationModeNearestNeighbor);
+ GdipSaveGraphics(graphics1, &state_c);
+ GdipSetInterpolationMode(graphics1, InterpolationModeHighQualityBilinear);
+ GdipRestoreGraphics(graphics1, state_b);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBicubic, mode);
+ GdipRestoreGraphics(graphics1, state_c);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBicubic, mode);
+ GdipRestoreGraphics(graphics1, state_a);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBilinear, mode);
+ GdipDeleteGraphics(graphics1);
+
+ log_state(state_a, &state_log);
+ log_state(state_b, &state_log);
+ log_state(state_c, &state_log);
+
+ /* Restoring older save from one graphics object does not invalidate
+ * newer save from other graphics object. */
+ GdipCreateFromHDC(hdc, &graphics1);
+ GdipCreateFromHDC(hdc, &graphics2);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBilinear);
+ GdipSaveGraphics(graphics1, &state_a);
+ GdipSetInterpolationMode(graphics2, InterpolationModeBicubic);
+ GdipSaveGraphics(graphics2, &state_b);
+ GdipSetInterpolationMode(graphics1, InterpolationModeNearestNeighbor);
+ GdipSetInterpolationMode(graphics2, InterpolationModeNearestNeighbor);
+ GdipRestoreGraphics(graphics1, state_a);
+ GdipGetInterpolationMode(graphics1, &mode);
+ todo_wine
+ expect(InterpolationModeBilinear, mode);
+ GdipRestoreGraphics(graphics2, state_b);
+ GdipGetInterpolationMode(graphics2, &mode);
+ todo_wine
+ expect(InterpolationModeBicubic, mode);
+ GdipDeleteGraphics(graphics1);
+ GdipDeleteGraphics(graphics2);
+
+ /* You can't restore a state to a graphics object that didn't save it. */
+ GdipCreateFromHDC(hdc, &graphics1);
+ GdipCreateFromHDC(hdc, &graphics2);
+ GdipSetInterpolationMode(graphics1, InterpolationModeBilinear);
+ GdipSaveGraphics(graphics1, &state_a);
+ GdipSetInterpolationMode(graphics1, InterpolationModeNearestNeighbor);
+ GdipSetInterpolationMode(graphics2, InterpolationModeNearestNeighbor);
+ GdipRestoreGraphics(graphics2, state_a);
+ GdipGetInterpolationMode(graphics2, &mode);
+ expect(InterpolationModeNearestNeighbor, mode);
+ GdipDeleteGraphics(graphics1);
+ GdipDeleteGraphics(graphics2);
+
+ log_state(state_a, &state_log);
+
+ /* The same state value should never be returned twice. */
+ todo_wine
+ check_no_duplicates(state_log);
+
+ ReleaseDC(0, hdc);
+}
+
START_TEST(graphics)
{
struct GdiplusStartupInput gdiplusStartupInput;
@@ -64,6 +233,7 @@ START_TEST(graphics)
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
test_constructor_destructor();
+ test_save_restore();
GdiplusShutdown(gdiplusToken);
}
More information about the wine-cvs
mailing list