]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
Tidy up the ie backend a little, make sure all com objects are correctly released.
[wxWidgets.git] / src / msw / dc.cpp
index 5079795653467c33fff3bb3246dde2d7e290cf1d..e0e1ec6523475415acc22f3a6de4b47c28ff85d7 100644 (file)
@@ -82,7 +82,7 @@ IMPLEMENT_ABSTRACT_CLASS(wxMSWDCImpl, wxDCImpl)
 // constants
 // ---------------------------------------------------------------------------
 
-static const int VIEWPORT_EXTENT = 1000;
+static const int VIEWPORT_EXTENT = 1024;
 
 // ROPs which don't have standard names (see "Ternary Raster Operations" in the
 // MSDN docs for how this and other numbers in wxDC::Blit() are obtained)
@@ -1967,11 +1967,39 @@ void wxMSWDCImpl::RealizeScaleAndOrigin()
 #ifndef __WXWINCE__
     ::SetMapMode(GetHdc(), MM_ANISOTROPIC);
 
-    int width = DeviceToLogicalXRel(VIEWPORT_EXTENT)*m_signX,
-        height = DeviceToLogicalYRel(VIEWPORT_EXTENT)*m_signY;
+    // wxWidgets API assumes that the coordinate space is "infinite" (i.e. only
+    // limited by 2^32 range of the integer coordinates) but in MSW API we must
+    // actually specify the extents that we use. So we more or less arbitrarily
+    // decide to use "base" VIEWPORT_EXTENT and adjust it depending on scale.
+    //
+    // To avoid rounding errors we prefer to multiply by the scale if it's > 1
+    // and to divide by it if it's < 1.
+    int devExtX, devExtY,   // Viewport, i.e. device space, extents.
+        logExtX, logExtY;   // Window, i.e. logical coordinate space, extents.
+    if ( m_scaleX >= 1 )
+    {
+        devExtX = VIEWPORT_EXTENT*m_scaleX;
+        logExtX = m_signX*VIEWPORT_EXTENT;
+    }
+    else
+    {
+        devExtX = VIEWPORT_EXTENT;
+        logExtX = m_signX*VIEWPORT_EXTENT/m_scaleX;
+    }
+
+    if ( m_scaleY >= 1 )
+    {
+        devExtY = VIEWPORT_EXTENT*m_scaleY;
+        logExtY = m_signY*VIEWPORT_EXTENT;
+    }
+    else
+    {
+        devExtY = VIEWPORT_EXTENT;
+        logExtY = m_signY*VIEWPORT_EXTENT/m_scaleY;
+    }
 
-    ::SetViewportExtEx(GetHdc(), VIEWPORT_EXTENT, VIEWPORT_EXTENT, NULL);
-    ::SetWindowExtEx(GetHdc(), width, height, NULL);
+    ::SetViewportExtEx(GetHdc(), devExtX, devExtY, NULL);
+    ::SetWindowExtEx(GetHdc(), logExtX, logExtY, NULL);
 
     ::SetViewportOrgEx(GetHdc(), m_deviceOriginX, m_deviceOriginY, NULL);
     ::SetWindowOrgEx(GetHdc(), m_logicalOriginX, m_logicalOriginY, NULL);