From 631c701e57135620bb1be40bc183954c738d8585 Mon Sep 17 00:00:00 2001 From: narzoul Date: Tue, 15 Mar 2016 11:03:58 +0100 Subject: [PATCH] Implemented copying of GDI DC transformations, mapping mode and layout --- DDrawCompat/CompatGdiDc.cpp | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/DDrawCompat/CompatGdiDc.cpp b/DDrawCompat/CompatGdiDc.cpp index 9b867e5..20f6411 100644 --- a/DDrawCompat/CompatGdiDc.cpp +++ b/DDrawCompat/CompatGdiDc.cpp @@ -36,26 +36,54 @@ namespace compatDc.origBrush = SelectObject(compatDc.dc, GetCurrentObject(origDc, OBJ_BRUSH)); compatDc.origPen = SelectObject(compatDc.dc, GetCurrentObject(origDc, OBJ_PEN)); + if (GM_ADVANCED == GetGraphicsMode(origDc)) + { + SetGraphicsMode(compatDc.dc, GM_ADVANCED); + XFORM transform = {}; + GetWorldTransform(origDc, &transform); + SetWorldTransform(compatDc.dc, &transform); + } + else if (GM_COMPATIBLE != GetGraphicsMode(compatDc.dc)) + { + ModifyWorldTransform(compatDc.dc, nullptr, MWT_IDENTITY); + SetGraphicsMode(compatDc.dc, GM_COMPATIBLE); + } + + SetMapMode(compatDc.dc, GetMapMode(origDc)); + + POINT viewportOrg = {}; + GetViewportOrgEx(origDc, &viewportOrg); + SetViewportOrgEx(compatDc.dc, viewportOrg.x + origin.x, viewportOrg.y + origin.y, nullptr); + SIZE viewportExt = {}; + GetViewportExtEx(origDc, &viewportExt); + SetViewportExtEx(compatDc.dc, viewportExt.cx, viewportExt.cy, nullptr); + + POINT windowOrg = {}; + GetWindowOrgEx(origDc, &windowOrg); + SetWindowOrgEx(compatDc.dc, windowOrg.x, windowOrg.y, nullptr); + SIZE windowExt = {}; + GetWindowExtEx(origDc, &windowExt); + SetWindowExtEx(compatDc.dc, windowExt.cx, windowExt.cy, nullptr); + SetArcDirection(compatDc.dc, GetArcDirection(origDc)); SetBkColor(compatDc.dc, GetBkColor(origDc)); SetBkMode(compatDc.dc, GetBkMode(origDc)); SetDCBrushColor(compatDc.dc, GetDCBrushColor(origDc)); SetDCPenColor(compatDc.dc, GetDCPenColor(origDc)); + SetLayout(compatDc.dc, GetLayout(origDc)); SetPolyFillMode(compatDc.dc, GetPolyFillMode(origDc)); SetROP2(compatDc.dc, GetROP2(origDc)); SetStretchBltMode(compatDc.dc, GetStretchBltMode(origDc)); SetTextAlign(compatDc.dc, GetTextAlign(origDc)); SetTextCharacterExtra(compatDc.dc, GetTextCharacterExtra(origDc)); SetTextColor(compatDc.dc, GetTextColor(origDc)); - SetWindowOrgEx(compatDc.dc, -origin.x, -origin.y, nullptr); POINT brushOrg = {}; GetBrushOrgEx(origDc, &brushOrg); SetBrushOrgEx(compatDc.dc, brushOrg.x, brushOrg.y, nullptr); POINT currentPos = {}; - MoveToEx(origDc, 0, 0, ¤tPos); - MoveToEx(origDc, currentPos.x, currentPos.y, nullptr); + GetCurrentPositionEx(origDc, ¤tPos); MoveToEx(compatDc.dc, currentPos.x, currentPos.y, nullptr); }