--- /dev/null
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: GPL - See COPYING in the top level directory
+ * PURPOSE: Test for ...
+ * PROGRAMMERS: Katayama Hirofumi MZ
+ */
+
+#include "precomp.h"
+
+#define INVALID_POINTER ((PVOID)(ULONG_PTR)0xdeadbeefdeadbeefULL)
+
+void Test_LPtoDP_Params()
+{
+ HDC hdc;
+ POINT apt[2];
+
+ apt[0].x = 0;
+ apt[0].y = 0;
+ apt[1].x = -1000;
+ apt[1].y = 1000;
+
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP(NULL, NULL, 0), 1);
+ ok_err(ERROR_SUCCESS);
+
+ ok_int(LPtoDP(NULL, NULL, -1), 1);
+ ok_err(ERROR_SUCCESS);
+
+ ok_int(LPtoDP(NULL, INVALID_POINTER, -1), 1);
+ ok_err(ERROR_SUCCESS);
+
+ ok_int(LPtoDP(NULL, NULL, 2), 0);
+ ok_err(ERROR_INVALID_PARAMETER);
+
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP(NULL, apt, 2), 0);
+ ok_err(ERROR_INVALID_PARAMETER);
+
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP(NULL, apt, 0), 1);
+ ok_err(ERROR_SUCCESS);
+
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP(NULL, apt, -2), 1);
+ ok_err(ERROR_SUCCESS);
+
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP((HDC)-4, apt, -2), 1);
+ ok_err(ERROR_SUCCESS);
+
+ hdc = GetDC(0);
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP(hdc, NULL, 2), 1);
+ ok_err(ERROR_SUCCESS);
+
+ hdc = GetDC(0);
+ SetLastError(ERROR_SUCCESS);
+ ok_int(LPtoDP(hdc, INVALID_POINTER, 2), 1);
+ ok_err(ERROR_SUCCESS);
+
+
+ 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_LPtoDP()
+{
+ HDC hdc;
+ POINT apt[2];
+ XFORM xform;
+ LONG lLogPixelsX, lLogPixelsY;
+ SIZE sizWnd, sizView;
+ LONG xLow, yLow, xHigh, yHigh;
+
+ hdc = CreateCompatibleDC(NULL);
+ lLogPixelsX = GetDeviceCaps(hdc, LOGPIXELSX);
+ lLogPixelsY = GetDeviceCaps(hdc, LOGPIXELSY);
+ trace("lLogPixelsX: %ld\n", lLogPixelsX);
+ trace("lLogPixelsY: %ld\n", lLogPixelsY);
+
+//#define MULDIV(a, b, c) (((a) * (b)) / (c))
+#define MULDIV(a, b, c) MulDiv((a), (b), (c))
+
+ // 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(LPtoDP(hdc, apt, 2), 1);
+ 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(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, MULDIV(100, sizView.cx, sizWnd.cx));
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, MULDIV(-1000, sizView.cx, sizWnd.cx));
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.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(LPtoDP(hdc, apt, 2), 1);
+ //ok_long(apt[0].x, MULDIV(100, sizView.cx, sizWnd.cx));
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ //ok_long(apt[1].x, MULDIV(-1000, sizView.cx, sizWnd.cx));
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+ xHigh = apt[0].x;
+ yHigh = apt[0].y;
+ ok(labs(xHigh) <= labs(xLow) / 9 && labs(xLow) / 11 <= labs(xHigh), "%ld, %ld\n", xLow, xHigh);
+ ok(labs(yHigh) <= labs(yLow) / 9 && labs(yLow) / 11 <= labs(yHigh), "%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(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, MULDIV(100, sizView.cx, sizWnd.cx));
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, MULDIV(-1000, sizView.cx, sizWnd.cx));
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.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(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, MULDIV(100, sizView.cx, sizWnd.cx));
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, MULDIV(-1000, sizView.cx, sizWnd.cx));
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+ xHigh = apt[0].x;
+ yHigh = apt[0].y;
+ ok(labs(xHigh) <= labs(xLow) / 9 && labs(xLow) / 11 <= labs(xHigh), "%ld, %ld\n", xLow, xHigh);
+ ok(labs(yHigh) <= labs(yLow) / 9 && labs(yLow) / 11 <= labs(yHigh), "%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(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, MULDIV(100, sizView.cx, sizWnd.cx));
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, MULDIV(-1000, sizView.cx, sizWnd.cx));
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+
+ SetGraphicsMode(hdc, GM_ADVANCED);
+ SetMapMode(hdc, MM_ANISOTROPIC);
+
+ xform.eM11 = 1.;
+ xform.eM12 = 0.;
+ xform.eM21 = 0.;
+ xform.eM22 = 1.;
+ 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(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, MULDIV(100 + (LONG)xform.eDx, sizView.cx, sizWnd.cx));
+ ok_long(apt[0].y, MULDIV(256 + (LONG)xform.eDy, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, MULDIV(-1000 - (LONG)xform.eDx, sizView.cx, sizWnd.cx));
+ ok_long(apt[1].y, MULDIV(1000 + (LONG)xform.eDy, sizView.cy, sizWnd.cy));
+
+ // eM11 == 0.0000001
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 0.0000001;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, 0);
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, 0);
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+
+ // eM11 == 0.5
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 0.5;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, MULDIV(100, sizView.cx, sizWnd.cx * 2));
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, MULDIV(-1000, sizView.cx, sizWnd.cx * 2));
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+
+ // eM11 == 1.164153218404873e-10
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 1.164153218404873e-10;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, 0);
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, 0);
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+
+ // eM11 == 2.328306437080797e-10
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 2.328306437080797e-10;
+ xform.eM22 = 1.;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, 0);
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, 0);
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+
+ // eM22 == 2.328306437080797e-10
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 1.;
+ xform.eM22 = 2.328306437080797e-10;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ //ok_long(apt[0].x, MULDIV(100, sizView.cy, sizWnd.cy));
+ ok_long(apt[0].y, 0);
+ //ok_long(apt[1].x, MULDIV(-1000, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].y, 0);
+
+ // eM22 == 1.164153218404873e-10
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 1.;
+ xform.eM22 = 1.164153218404873e-10;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ //ok_long(apt[0].x, MULDIV(100, sizView.cy, sizWnd.cy));
+ ok_long(apt[0].y, 0);
+ //ok_long(apt[1].x, MULDIV(-1000, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].y, 0);
+
+ // eM11 == 2.328306437080797e-10, eM22 == 2.328306437080797e-10
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 2.328306437080797e-10;
+ xform.eM22 = 2.328306437080797e-10;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(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 == 1.164153218404873e-10, eM22 == 1.164153218404873e-10
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 1.164153218404873e-10;
+ xform.eM22 = 1.164153218404873e-10;
+ xform.eDx = 0.;
+ xform.eDy = 0.;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(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 == 0.0000001
+ apt[0].x = 100; apt[0].y = 256; apt[1].x = -1000; apt[1].y = 1000;
+ xform.eM11 = 0.0000001;
+ xform.eM22 = 1.0;
+ ok_int(SetWorldTransform(hdc, &xform), 1);
+ GetExtent(hdc, &sizWnd, &sizView);
+ ok_int(LPtoDP(hdc, apt, 2), 1);
+ ok_long(apt[0].x, 0);
+ ok_long(apt[0].y, MULDIV(256, sizView.cy, sizWnd.cy));
+ ok_long(apt[1].x, 0);
+ ok_long(apt[1].y, MULDIV(1000, sizView.cy, sizWnd.cy));
+
+ DeleteDC(hdc);
+}
+
+START_TEST(LPtoDP)
+{
+ Test_LPtoDP_Params();
+ Test_LPtoDP();
+}