[GDI32_APITEST] Improve DPtoLP testcase (#1459)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Wed, 3 Apr 2019 13:48:42 +0000 (22:48 +0900)
committerGitHub <noreply@github.com>
Wed, 3 Apr 2019 13:48:42 +0000 (22:48 +0900)
 ROSTESTS-319

modules/rostests/apitests/gdi32/DPtoLP.c

index d06b375..d8c2cd5 100644 (file)
@@ -3,6 +3,7 @@
  * LICENSE:         GPL - See COPYING in the top level directory
  * PURPOSE:         Test for ...
  * PROGRAMMERS:     Timo Kreuzer
+ *                  Katayama Hirofumi MZ
  */
 
 #include "precomp.h"
@@ -38,7 +39,7 @@ void Test_DPtoLP_Params()
 
     SetLastError(ERROR_SUCCESS);
     ok_int(DPtoLP(NULL, apt, 0), 1);
-    ok(GetLastError() == ERROR_SUCCESS, "Exected ERROR_SUCCESS, got %ld\n", GetLastError());
+    ok_err(ERROR_SUCCESS);
 
     SetLastError(ERROR_SUCCESS);
     ok_int(DPtoLP(NULL, apt, -2), 1);
@@ -62,36 +63,106 @@ void Test_DPtoLP_Params()
     ReleaseDC(0, hdc);
 }
 
+static void GetExtent(HDC hdc, SIZE *psizWnd, SIZE *psizView)
+{
+    GetWindowExtEx(hdc, psizWnd);
+    //trace("*psizWnd: (%ld, %ld)\n", psizWnd->cx, psizWnd->cy);
+
+    GetViewportExtEx(hdc, psizView);
+    //trace("*psizView: (%ld, %ld)\n", psizView->cx, psizView->cy);
+}
+
 void Test_DPtoLP()
 {
     HDC hdc;
     POINT apt[2];
     XFORM xform;
     LONG lLogPixelsX, lLogPixelsY;
+    SIZE sizWnd, sizView;
+    LONG xLow, yLow, xHigh, yHigh;
 
-    apt[0].x = 1;
-    apt[0].y = 1;
-    apt[1].x = -1000;
-    apt[1].y = 1000;
-
-    hdc = GetDC(0);
+    hdc = CreateCompatibleDC(NULL);
     lLogPixelsX = GetDeviceCaps(hdc, LOGPIXELSX);
     lLogPixelsY = GetDeviceCaps(hdc, LOGPIXELSY);
+    trace("lLogPixelsX: %ld\n", lLogPixelsX);
+    trace("lLogPixelsY: %ld\n", lLogPixelsY);
 
+    // MM_TEXT
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
     SetMapMode(hdc, MM_TEXT);
+    GetExtent(hdc, &sizWnd, &sizView);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x, 1);
-    ok_int(apt[0].y, 1);
-    ok_int(apt[1].x, -1000);
-    ok_int(apt[1].y, 1000);
+    ok_long(sizWnd.cx, 1);
+    ok_long(sizWnd.cy, 1);
+    ok_long(sizView.cx, 1);
+    ok_long(sizView.cy, 1);
+    ok_long(apt[0].x, 100);
+    ok_long(apt[0].y, 256);
+    ok_long(apt[1].x, -1000);
+    ok_long(apt[1].y, 1000);
 
+    // MM_LOMETRIC
     apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
     SetMapMode(hdc, MM_LOMETRIC);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, MulDiv(100, sizWnd.cx, sizView.cx));
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, MulDiv(-1000, sizWnd.cx, sizView.cx));
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+    xLow = apt[0].x;
+    yLow = apt[0].y;
+
+    // MM_HIMETRIC
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    SetMapMode(hdc, MM_HIMETRIC);
+    GetExtent(hdc, &sizWnd, &sizView);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x * lLogPixelsX, 33888 );
-    ok_int(apt[0].y * lLogPixelsY, -86688 );
-    ok_int(apt[1].x * lLogPixelsX, -338688 );
-    ok_int(apt[1].y * lLogPixelsY, -338688 );
+    ok_long(apt[0].x, MulDiv(100, sizWnd.cx, sizView.cx));
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, MulDiv(-1000, sizWnd.cx, sizView.cx));
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+    xHigh = apt[0].x;
+    yHigh = apt[0].y;
+    ok(labs(xLow) * 9 < labs(xHigh) && labs(xHigh) < 11 * labs(xLow), "%ld, %ld\n", xLow, xHigh);
+    ok(labs(yLow) * 9 < labs(yHigh) && labs(yHigh) < 11 * labs(yLow), "%ld, %ld\n", yLow, yHigh);
+
+    // MM_LOENGLISH
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    SetMapMode(hdc, MM_LOENGLISH);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, MulDiv(100, sizWnd.cx, sizView.cx));
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, MulDiv(-1000, sizWnd.cx, sizView.cx));
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+    xLow = apt[0].x;
+    yLow = apt[0].y;
+
+    // MM_HIENGLISH
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    SetMapMode(hdc, MM_HIENGLISH);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, MulDiv(100, sizWnd.cx, sizView.cx));
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, MulDiv(-1000, sizWnd.cx, sizView.cx));
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+    xHigh = apt[0].x;
+    yHigh = apt[0].y;
+    ok(labs(xLow) * 9 < labs(xHigh) && labs(xHigh) < 11 * labs(xLow), "%ld, %ld\n", xLow, xHigh);
+    ok(labs(yLow) * 9 < labs(yHigh) && labs(yHigh) < 11 * labs(yLow), "%ld, %ld\n", yLow, yHigh);
+
+    // MM_TWIPS
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    SetMapMode(hdc, MM_TWIPS);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, MulDiv(100, sizWnd.cx, sizView.cx));
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, MulDiv(-1000, sizWnd.cx, sizView.cx));
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+
     SetGraphicsMode(hdc, GM_ADVANCED);
     SetMapMode(hdc, MM_ANISOTROPIC);
 
@@ -99,63 +170,148 @@ void Test_DPtoLP()
     xform.eM12 = 0.;
     xform.eM21 = 0.;
     xform.eM22 = 1.;
-    xform.eDx = (FLOAT)4294967167.999999761;
+    xform.eDx = 2.;
     xform.eDy = 1.;
     ok_int(SetWorldTransform(hdc, &xform), 1);
 
+    // eDx == 2, eDy == 1
     apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    GetExtent(hdc, &sizWnd, &sizView);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x * lLogPixelsX, 58464 );
-    ok_int(apt[0].y * lLogPixelsY, -86784 );
-    ok_int(apt[1].x * lLogPixelsX, -314112 );
-    ok_int(apt[1].y * lLogPixelsY, -338784 );
+    ok_long(apt[0].x, MulDiv(100, sizWnd.cx, sizView.cx) - (LONG)xform.eDx);
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy) - (LONG)xform.eDy);
+    ok_long(apt[1].x, MulDiv(-1000, sizWnd.cx, sizView.cx) - (LONG)xform.eDx);
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy) - (LONG)xform.eDy);
 
+    // eM11 == 10000000
     apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
     xform.eM11 = 10000000.;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
+    ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, 0);
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, 0);
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+
+    // eM11 == 2
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    xform.eM11 = 2.;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
+    ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, MulDiv(100 / 2, sizWnd.cx, sizView.cx));
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, MulDiv(-1000 / 2, sizWnd.cx, sizView.cx));
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+
+    // eM11 == (FLOAT)0x1FFFFFFFF
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    xform.eM11 = (FLOAT)0x1FFFFFFFF;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
     ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x * lLogPixelsX, -41184 );
-    ok_int(apt[0].y * lLogPixelsY, -86784 );
-    ok_int(apt[1].x * lLogPixelsX, -41184 );
-    ok_int(apt[1].y * lLogPixelsY, -338784 );
+    ok_long(apt[0].x, 0);
+    //ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, 0);
+    //ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
 
+    // eM11 == (FLOAT)0xFFFFFFFFU
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    xform.eM11 = (FLOAT)0xFFFFFFFFU;
+    xform.eM22 = 1.;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
+    ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, 0);
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, 0);
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
+
+    // eM22 == (FLOAT)0xFFFFFFFFU
     apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
     xform.eM11 = 1.;
-    xform.eDx = (FLOAT)4294967167.999999762; // this is too big
+    xform.eM22 = (FLOAT)0xFFFFFFFFU;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
     ok_int(SetWorldTransform(hdc, &xform), 1);
-    ok_int(DPtoLP(hdc, apt, 2), 0);
-    ok_int(apt[0].x, 100 );
-    ok_int(apt[0].y, 256 );
-    ok_int(apt[1].x, -1000 );
-    ok_int(apt[1].y, 1000 );
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    //ok_long(apt[0].x, MulDiv(100, sizWnd.cy, sizView.cy));
+    ok_long(apt[0].y, 0);
+    //ok_long(apt[1].x, MulDiv(-1000, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].y, 0);
 
-    xform.eM11 = 2.;
-    xform.eDx = (FLOAT)4294967167.999999762;
+    // eM22 == (FLOAT)0x1FFFFFFFFU
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    xform.eM11 = 1.;
+    xform.eM22 = (FLOAT)0x1FFFFFFFFU;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
+    ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    //ok_long(apt[0].x, MulDiv(100, sizWnd.cy, sizView.cy));
+    ok_long(apt[0].y, 0);
+    //ok_long(apt[1].x, MulDiv(-1000, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].y, 0);
+
+    // eM11 == (FLOAT)0xFFFFFFFFU, eM22 == (FLOAT)0xFFFFFFFFU
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    xform.eM11 = (FLOAT)0xFFFFFFFFU;
+    xform.eM22 = (FLOAT)0xFFFFFFFFU;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
+    ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
+    ok_int(DPtoLP(hdc, apt, 2), 1);
+    ok_long(apt[0].x, 0);
+    ok_long(apt[0].y, 0);
+    ok_long(apt[1].x, 0);
+    ok_long(apt[1].y, 0);
+
+    // eM11 == (FLOAT)0x1FFFFFFFFU, eM22 == (FLOAT)0x1FFFFFFFFU
+    apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+    xform.eM11 = (FLOAT)0x1FFFFFFFFU;
+    xform.eM22 = (FLOAT)0x1FFFFFFFFU;
+    xform.eDx = 0.;
+    xform.eDy = 0.;
     ok_int(SetWorldTransform(hdc, &xform), 1);
+    GetExtent(hdc, &sizWnd, &sizView);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x * lLogPixelsX, 16896 );
-    ok_int(apt[0].y * lLogPixelsY, -86784 );
-    ok_int(apt[1].x * lLogPixelsX, -169344 );
-    ok_int(apt[1].y * lLogPixelsY, -338784 );
+    ok_long(apt[0].x, 0);
+    ok_long(apt[0].y, 0);
+    ok_long(apt[1].x, 0);
+    ok_long(apt[1].y, 0);
 
+    // eM11 == 10000000
     apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
     xform.eM11 = 10000000.;
+    xform.eM22 = 1.0;
     ok_int(SetWorldTransform(hdc, &xform), 1);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x * lLogPixelsX, -41184 );
-    ok_int(apt[0].y * lLogPixelsY, -86784 );
-    ok_int(apt[1].x * lLogPixelsX, -41184 );
-    ok_int(apt[1].y * lLogPixelsY, -338784 );
+    ok_long(apt[0].x, 0);
+    ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, 0);
+    ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
 
     xform.eM11 = 1000000.;
     ok_int(SetWorldTransform(hdc, &xform), 1);
     ok_int(DPtoLP(hdc, apt, 2), 1);
-    ok_int(apt[0].x * lLogPixelsX, -412320 );
-    ok_int(apt[0].y * lLogPixelsY, 306048 );
-    ok_int(apt[1].x * lLogPixelsX, -412320 );
-    ok_int(apt[1].y * lLogPixelsY, 1195104 );
+    ok_long(apt[0].x, 0);
+    //ok_long(apt[0].y, MulDiv(256, sizWnd.cy, sizView.cy));
+    ok_long(apt[1].x, 0);
+    //ok_long(apt[1].y, MulDiv(1000, sizWnd.cy, sizView.cy));
 
-    ReleaseDC(0, hdc);
+    DeleteDC(hdc);
 }
 
 START_TEST(DPtoLP)