From: Paul Cornett <paulcor@bullseye.com>
Date: Sat, 19 Aug 2006 21:30:06 +0000 (+0000)
Subject: simplify coordinate transformation code
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/772b37678504535c9e557cdaa8f98e27df109417

simplify coordinate transformation code


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40682 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---

diff --git a/include/wx/gtk/dc.h b/include/wx/gtk/dc.h
index daf2bdc1ec..a2b62b262e 100644
--- a/include/wx/gtk/dc.h
+++ b/include/wx/gtk/dc.h
@@ -10,12 +10,6 @@
 #ifndef __GTKDCH__
 #define __GTKDCH__
 
-//-----------------------------------------------------------------------------
-// classes
-//-----------------------------------------------------------------------------
-
-class WXDLLIMPEXP_CORE wxDC;
-
 //-----------------------------------------------------------------------------
 // constants
 //-----------------------------------------------------------------------------
@@ -31,6 +25,43 @@ class WXDLLIMPEXP_CORE wxDC;
 #define MM_METRIC       7
 #endif
 
+//-----------------------------------------------------------------------------
+// coordinates transformations
+//-----------------------------------------------------------------------------
+
+inline wxCoord wxDCBase::DeviceToLogicalX(wxCoord x) const
+{
+    return wxRound((x - m_deviceOriginX) / m_scaleX) * m_signX + m_logicalOriginX;
+}
+inline wxCoord wxDCBase::DeviceToLogicalY(wxCoord y) const
+{
+    return wxRound((y - m_deviceOriginY) / m_scaleY) * m_signY + m_logicalOriginY;
+}
+inline wxCoord wxDCBase::DeviceToLogicalXRel(wxCoord x) const
+{
+    return wxRound(x / m_scaleX);
+}
+inline wxCoord wxDCBase::DeviceToLogicalYRel(wxCoord y) const
+{
+    return wxRound(y / m_scaleY);
+}
+inline wxCoord wxDCBase::LogicalToDeviceX(wxCoord x) const
+{
+    return wxRound((x - m_logicalOriginX) * m_scaleX) * m_signX + m_deviceOriginX;
+}
+inline wxCoord wxDCBase::LogicalToDeviceY(wxCoord y) const
+{
+    return wxRound((y - m_logicalOriginY) * m_scaleY) * m_signY + m_deviceOriginY;
+}
+inline wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const
+{
+    return wxRound(x * m_scaleX);
+}
+inline wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
+{
+    return wxRound(y * m_scaleY);
+}
+
 //-----------------------------------------------------------------------------
 // wxDC
 //-----------------------------------------------------------------------------
@@ -61,6 +92,7 @@ public:
 
     virtual void SetAxisOrientation( bool xLeftRight, bool yBottomUp );
 
+protected:
     // implementation
     // --------------
 
@@ -68,66 +100,37 @@ public:
 
     wxCoord XDEV2LOG(wxCoord x) const
     {
-        wxCoord new_x = x - m_deviceOriginX;
-        if (new_x > 0)
-            return (wxCoord)((double)(new_x) / m_scaleX + 0.5) * m_signX + m_logicalOriginX;
-        else
-            return (wxCoord)((double)(new_x) / m_scaleX - 0.5) * m_signX + m_logicalOriginX;
+        return DeviceToLogicalX(x);
     }
     wxCoord XDEV2LOGREL(wxCoord x) const
     {
-        if (x > 0)
-            return (wxCoord)((double)(x) / m_scaleX + 0.5);
-        else
-            return (wxCoord)((double)(x) / m_scaleX - 0.5);
+        return DeviceToLogicalXRel(x);
     }
     wxCoord YDEV2LOG(wxCoord y) const
     {
-        wxCoord new_y = y - m_deviceOriginY;
-        if (new_y > 0)
-            return (wxCoord)((double)(new_y) / m_scaleY + 0.5) * m_signY + m_logicalOriginY;
-        else
-            return (wxCoord)((double)(new_y) / m_scaleY - 0.5) * m_signY + m_logicalOriginY;
+        return DeviceToLogicalY(y);
     }
     wxCoord YDEV2LOGREL(wxCoord y) const
     {
-        if (y > 0)
-            return (wxCoord)((double)(y) / m_scaleY + 0.5);
-        else
-            return (wxCoord)((double)(y) / m_scaleY - 0.5);
+        return DeviceToLogicalYRel(y);
     }
     wxCoord XLOG2DEV(wxCoord x) const
     {
-        wxCoord new_x = x - m_logicalOriginX;
-        if (new_x > 0)
-            return (wxCoord)((double)(new_x) * m_scaleX + 0.5) * m_signX + m_deviceOriginX;
-        else
-            return (wxCoord)((double)(new_x) * m_scaleX - 0.5) * m_signX + m_deviceOriginX;
+        return LogicalToDeviceX(x);
     }
     wxCoord XLOG2DEVREL(wxCoord x) const
     {
-        if (x > 0)
-            return (wxCoord)((double)(x) * m_scaleX + 0.5);
-        else
-            return (wxCoord)((double)(x) * m_scaleX - 0.5);
+        return LogicalToDeviceXRel(x);
     }
     wxCoord YLOG2DEV(wxCoord y) const
     {
-        wxCoord new_y = y - m_logicalOriginY;
-        if (new_y > 0)
-            return (wxCoord)((double)(new_y) * m_scaleY + 0.5) * m_signY + m_deviceOriginY;
-        else
-            return (wxCoord)((double)(new_y) * m_scaleY - 0.5) * m_signY + m_deviceOriginY;
+        return LogicalToDeviceY(y);
     }
     wxCoord YLOG2DEVREL(wxCoord y) const
     {
-        if (y > 0)
-            return (wxCoord)((double)(y) * m_scaleY + 0.5);
-        else
-            return (wxCoord)((double)(y) * m_scaleY - 0.5);
+        return LogicalToDeviceYRel(y);
     }
 
-protected:
     // base class pure virtuals implemented here
     virtual void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height);
     virtual void DoGetSizeMM(int* width, int* height) const;
diff --git a/include/wx/gtk/dcclient.h b/include/wx/gtk/dcclient.h
index 2555d5b388..38a639311a 100644
--- a/include/wx/gtk/dcclient.h
+++ b/include/wx/gtk/dcclient.h
@@ -11,15 +11,9 @@
 #define __GTKDCCLIENTH__
 
 #include "wx/dc.h"
-#include "wx/window.h"
+#include "wx/region.h"
 
-//-----------------------------------------------------------------------------
-// classes
-//-----------------------------------------------------------------------------
-
-class WXDLLIMPEXP_CORE wxWindowDC;
-class WXDLLIMPEXP_CORE wxPaintDC;
-class WXDLLIMPEXP_CORE wxClientDC;
+class WXDLLIMPEXP_CORE wxWindow;
 
 //-----------------------------------------------------------------------------
 // wxWindowDC
@@ -120,6 +114,7 @@ public:
     PangoLayout *m_layout;
     PangoFontDescription *m_fontdesc;
 
+protected:
     void SetUpDC();
     void Destroy();
     virtual void ComputeScaleAndOrigin();
diff --git a/src/gtk/dc.cpp b/src/gtk/dc.cpp
index 80d08c5b01..a89dcbabf6 100644
--- a/src/gtk/dc.cpp
+++ b/src/gtk/dc.cpp
@@ -12,9 +12,6 @@
 
 #include "wx/dc.h"
 
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-
 //-----------------------------------------------------------------------------
 // wxDC
 //-----------------------------------------------------------------------------
@@ -149,48 +146,3 @@ void wxDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
     m_signY = (yBottomUp  ? -1 :  1);
     ComputeScaleAndOrigin();
 }
-
-// ---------------------------------------------------------------------------
-// coordinates transformations
-// ---------------------------------------------------------------------------
-
-wxCoord wxDCBase::DeviceToLogicalX(wxCoord x) const
-{
-    return ((wxDC *)this)->XDEV2LOG(x);
-}
-
-wxCoord wxDCBase::DeviceToLogicalY(wxCoord y) const
-{
-    return ((wxDC *)this)->YDEV2LOG(y);
-}
-
-wxCoord wxDCBase::DeviceToLogicalXRel(wxCoord x) const
-{
-    return ((wxDC *)this)->XDEV2LOGREL(x);
-}
-
-wxCoord wxDCBase::DeviceToLogicalYRel(wxCoord y) const
-{
-    return ((wxDC *)this)->YDEV2LOGREL(y);
-}
-
-wxCoord wxDCBase::LogicalToDeviceX(wxCoord x) const
-{
-    return ((wxDC *)this)->XLOG2DEV(x);
-}
-
-wxCoord wxDCBase::LogicalToDeviceY(wxCoord y) const
-{
-    return ((wxDC *)this)->YLOG2DEV(y);
-}
-
-wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const
-{
-    return ((wxDC *)this)->XLOG2DEVREL(x);
-}
-
-wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
-{
-    return ((wxDC *)this)->YLOG2DEVREL(y);
-}
-
diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp
index 7c724b05ae..c5ce2eea44 100644
--- a/src/gtk/dcclient.cpp
+++ b/src/gtk/dcclient.cpp
@@ -17,6 +17,7 @@
 #include "wx/dcclient.h"
 
 #ifndef WX_PRECOMP
+    #include "wx/window.h"
     #include "wx/log.h"
     #include "wx/dcmemory.h"
     #include "wx/math.h" // for floating-point functions
@@ -1166,8 +1167,8 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
     if (!m_window) return false;
 
     // transform the source DC coords to the device ones
-    xsrc = source->XLOG2DEV(xsrc);
-    ysrc = source->YLOG2DEV(ysrc);
+    xsrc = source->LogicalToDeviceX(xsrc);
+    ysrc = source->LogicalToDeviceY(ysrc);
 
     wxClientDC *srcDC = (wxClientDC*)source;
     wxMemoryDC *memDC = (wxMemoryDC*)source;
diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp
index a16251eaf7..a477a1ea39 100644
--- a/src/gtk/renderer.cpp
+++ b/src/gtk/renderer.cpp
@@ -28,7 +28,6 @@
 
 #ifndef WX_PRECOMP
     #include "wx/window.h"
-    #include "wx/dc.h"
     #include "wx/dcclient.h"
     #include "wx/settings.h"
 #endif
@@ -205,7 +204,7 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
         NULL,
         button,
         "button",
-        dc.XLOG2DEV(rect.x), rect.y, rect.width, rect.height
+        dc.LogicalToDeviceX(rect.x), rect.y, rect.width, rect.height
     );
 }