]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/dc.cpp
guard code for mac / quickdraw
[wxWidgets.git] / src / os2 / dc.cpp
index 7c82a9c6c1820b5a4a7361092338c8ec14cddec1..3e6e349b6a5be78fd749103511c2ca87a40b8c20 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        dc.cpp
+// Name:        src/os2/dc.cpp
 // Purpose:     wxDC class
 // Author:      David Webster
 // Modified by:
     #include "wx/log.h"
     #include "wx/icon.h"
     #include "wx/msgdlg.h"
-#if wxUSE_STATUSBAR
+    #include "wx/dcprint.h"
     #include "wx/statusbr.h"
+    #include "wx/module.h"
 #endif
-#endif
-
-#include "wx/module.h"
-#include "wx/dcprint.h"
 
 #include <string.h>
 
 #include "wx/os2/private.h"
 
-    IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
+IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 
 //
 // wxWidgets uses the Microsoft convention that the origin is the UPPER left.
@@ -221,7 +218,7 @@ wxDCCacheEntry* wxDC::FindBitmapInCache(
                 vBmpHdr.cx        = nWidth;
                 vBmpHdr.cy        = nHeight;
                 vBmpHdr.cPlanes   = 1;
-                vBmpHdr.cBitCount = nDepth;
+                vBmpHdr.cBitCount = (USHORT)nDepth;
 
                 pEntry->m_hBitmap = (WXHBITMAP) ::GpiCreateBitmap( hPS
                                                                   ,&vBmpHdr
@@ -244,7 +241,7 @@ wxDCCacheEntry* wxDC::FindBitmapInCache(
     vBmpHdr.cx        = nWidth;
     vBmpHdr.cy        = nHeight;
     vBmpHdr.cPlanes   = 1;
-    vBmpHdr.cBitCount = nDepth;
+    vBmpHdr.cBitCount = (USHORT)nDepth;
 
     WXHBITMAP                       hBitmap = (WXHBITMAP) ::GpiCreateBitmap( hPS
                                                                             ,&vBmpHdr
@@ -353,11 +350,8 @@ wxDC::wxDC(void)
     m_hPS          = NULL;
     m_bIsPaintTime = false; // True at Paint Time
 
-    wxColour vColor( wxT("BLACK") );
-    m_pen.SetColour(vColor);
-
-    vColor.Set( wxT("WHITE") );
-    m_brush.SetColour(vColor);
+    m_pen.SetColour(*wxBLACK);
+    m_brush.SetColour(*wxWHITE);
 
 } // end of wxDC::wxDC
 
@@ -578,7 +572,7 @@ bool wxDC::DoFloodFill(
     if ((lHits = ::GpiFloodFill(m_hPS, lOptions, lColor)) != GPI_ERROR)
         bSuccess = true;
 
-    return true;
+    return bSuccess;
 } // end of wxDC::DoFloodFill
 
 bool wxDC::DoGetPixel(
@@ -592,17 +586,7 @@ bool wxDC::DoGetPixel(
 
     vPoint.x = vX;
     vPoint.y = OS2Y(vY,0);
-    lColor = ::GpiSetPel(m_hPS, &vPoint);
-
-    //
-    // Get the color of the pen
-    //
-    LONG                            lPencolor = 0x00ffffff;
-
-    if (m_pen.Ok())
-    {
-        lPencolor = m_pen.GetColour().GetPixel();
-    }
+    lColor = ::GpiQueryPel(m_hPS, &vPoint);
 
     //
     // return the color of the pixel
@@ -612,7 +596,7 @@ bool wxDC::DoGetPixel(
                   ,GetGValue(lColor)
                   ,GetBValue(lColor)
                  );
-    return(lColor == lPencolor);
+    return true;
 } // end of wxDC::DoGetPixel
 
 void wxDC::DoCrossHair(
@@ -672,7 +656,7 @@ void wxDC::DoDrawLine(
     }
     else
     {
-        if (m_vSelectedBitmap != wxNullBitmap)
+        if (m_vSelectedBitmap.Ok())
         {
             m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
             m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
@@ -863,47 +847,44 @@ void wxDC::DoDrawPoint(
                    );
 } // end of wxDC::DoDrawPoint
 
-void wxDC::DoDrawPolygon(
-  int                               n
-, wxPoint                           vPoints[]
-, wxCoord                           vXoffset
-, wxCoord                           vYoffset
-, int                               nFillStyle
-)
+void wxDC::DoDrawPolygon( int n,
+                          wxPoint vPoints[],
+                          wxCoord vXoffset,
+                          wxCoord vYoffset,
+                          int nFillStyle )
 {
-    ULONG                           ulCount = 1;    // Number of polygons.
-    POLYGON                         vPlgn;          // polygon.
-    ULONG                           flOptions = 0L; // Drawing options.
-
-//////////////////////////////////////////////////////////////////////////////
-// This contains fields of option bits... to draw boundary lines as well as
-// the area interior.
-//
-// Drawing boundary lines:
-//   POLYGON_NOBOUNDARY              Does not draw boundary lines.
-//   POLYGON_BOUNDARY                Draws boundary lines (the default).
-//
-// Construction of the area interior:
-//   POLYGON_ALTERNATE               Constructs interior in alternate mode
-//                                   (the default).
-//   POLYGON_WINDING                 Constructs interior in winding mode.
-//////////////////////////////////////////////////////////////////////////////
+    ULONG     ulCount = 1;    // Number of polygons.
+    POLYGON   vPlgn;          // polygon.
+    ULONG     flOptions = 0L; // Drawing options.
 
-    ULONG                           flModel = 0L; // Drawing model.
-
-//////////////////////////////////////////////////////////////////////////////
-// Drawing model.
-//   POLYGON_INCL  Fill is inclusive of bottom right (the default).
-//   POLYGON_EXCL  Fill is exclusive of bottom right.
-//       This is provided to aid migration from other graphics models.
-//////////////////////////////////////////////////////////////////////////////
-
-    LONG                            lHits = 0L; // Correlation/error indicator.
-    POINTL                          vPoint;
-    int                             i;
-    int                             nIsTRANSPARENT = 0;
-    LONG                            lBorderColor = 0L;
-    LONG                            lColor = 0L;
+    //////////////////////////////////////////////////////////////////////////////
+    // This contains fields of option bits... to draw boundary lines as well as
+    // the area interior.
+    //
+    // Drawing boundary lines:
+    //   POLYGON_NOBOUNDARY              Does not draw boundary lines.
+    //   POLYGON_BOUNDARY                Draws boundary lines (the default).
+    //
+    // Construction of the area interior:
+    //   POLYGON_ALTERNATE               Constructs interior in alternate mode
+    //                                   (the default).
+    //   POLYGON_WINDING                 Constructs interior in winding mode.
+    //////////////////////////////////////////////////////////////////////////////
+
+    ULONG     flModel = POLYGON_INCL; // Drawing model.
+
+    //////////////////////////////////////////////////////////////////////////////
+    // Drawing model.
+    //   POLYGON_INCL  Fill is inclusive of bottom right (the default).
+    //   POLYGON_EXCL  Fill is exclusive of bottom right.
+    //       This is provided to aid migration from other graphics models.
+    //////////////////////////////////////////////////////////////////////////////
+
+    LONG      lHits = 0L; // Correlation/error indicator.
+    int       i;
+    int       nIsTRANSPARENT = 0;
+    LONG      lBorderColor = 0L;
+    LONG      lColor = 0L;
 
     lBorderColor = m_pen.GetColour().GetPixel();
     lColor       = m_brush.GetColour().GetPixel();
@@ -917,20 +898,17 @@ void wxDC::DoDrawPolygon(
 
     for(i = 0; i < n; i++)
     {
-        vPlgn.aPointl[i].x = vPoints[i].x;         // +xoffset;
-        vPlgn.aPointl[i].y = OS2Y(vPoints[i].y,0); // +yoffset;
+        vPlgn.aPointl[i].x = vPoints[i].x+vXoffset;
+        vPlgn.aPointl[i].y = OS2Y(vPoints[i].y+vYoffset,0);
     }
-    flModel = POLYGON_BOUNDARY;
+    flOptions = POLYGON_BOUNDARY;
     if(nFillStyle == wxWINDING_RULE)
-        flModel |= POLYGON_WINDING;
+        flOptions |= POLYGON_WINDING;
     else
-        flModel |= POLYGON_ALTERNATE;
-
-    vPoint.x = vXoffset;
-    vPoint.y = OS2Y(vYoffset,0);
+        flOptions |= POLYGON_ALTERNATE;
 
     ::GpiSetColor(m_hPS, lBorderColor);
-    ::GpiMove(m_hPS, &vPoint);
+    ::GpiMove(m_hPS, &vPlgn.aPointl[0]);
     lHits = ::GpiPolygons(m_hPS, ulCount, &vPlgn, flOptions, flModel);
     free(vPlgn.aPointl);
 } // end of wxDC::DoDrawPolygon
@@ -1008,7 +986,7 @@ void wxDC::DoDrawRectangle(
         vY = OS2Y(vY,vHeight);
     else
     {
-        if (m_vSelectedBitmap != wxNullBitmap)
+        if (m_vSelectedBitmap.Ok())
         {
             m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
             m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
@@ -1098,7 +1076,7 @@ void wxDC::DoDrawRoundedRectangle(
         vY = OS2Y(vY,vHeight);
     else
     {
-        if (m_vSelectedBitmap != wxNullBitmap)
+        if (m_vSelectedBitmap.Ok())
         {
             m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
             m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
@@ -1278,7 +1256,7 @@ void wxDC::DoDrawIcon(
     //
     // Need to copy back into a bitmap.  ::WinDrawPointer uses device coords
     // and I don't feel like figuring those out for scrollable windows so
-    // just convert to a bitmap then let the DoDrawBitmap routing display it
+    // just convert to a bitmap then let the DoDrawBitmap routine display it
     //
     if (rIcon.IsXpm())
     {
@@ -1301,10 +1279,12 @@ void wxDC::DoDrawBitmap(
 , bool                              bUseMask
 )
 {
+#if wxUSE_PRINTING_ARCHITECTURE
     if (!IsKindOf(CLASSINFO(wxPrinterDC)))
+#endif
     {
         HBITMAP                         hBitmap =  (HBITMAP)rBmp.GetHBITMAP();
-        HBITMAP                         hBitmapOld = NULLHANDLE;;
+        HBITMAP                         hBitmapOld = NULLHANDLE;
         POINTL                          vPoint[4];
 
         vY = OS2Y(vY,rBmp.GetHeight());
@@ -1397,7 +1377,7 @@ void wxDC::DoDrawBitmap(
                     lColor = m_textBackgroundColour.GetPixel();
 
                 //
-                // Bitmap must be ina double-word alligned address so we may
+                // Bitmap must be in a double-word aligned address so we may
                 // have some padding to worry about
                 //
                 if (nLineBoundary > 0)
@@ -1716,11 +1696,9 @@ void wxDC::DoDrawText(
     CalcBoundingBox((vX + vWidth), (vY + vHeight));
 } // end of wxDC::DoDrawText
 
-void wxDC::DrawAnyText(
-  const wxString&                   rsText
-, wxCoord                           vX
-, wxCoord                           vY
-)
+void wxDC::DrawAnyText( const wxString& rsText,
+                        wxCoord vX,
+                        wxCoord vY )
 {
     int                             nOldBackground = 0;
     POINTL                          vPtlStart;
@@ -1761,35 +1739,24 @@ void wxDC::DrawAnyText(
           m_vRclPaint.xRight == 0 &&
           m_vRclPaint.xLeft == 0))
     {
-        //
-        // Position Text a little differently in the Statusbar from other panels
-        //
-        if (m_pCanvas && m_pCanvas->IsKindOf(CLASSINFO(wxStatusBar)))
-            vPtlStart.y = OS2Y(vY,vTextY);
-        else
-            vPtlStart.y = (wxCoord)(OS2Y(vY,vTextY/1.5)); // Full extent is a bit much
+        vPtlStart.y = OS2Y(vY,vTextY);
     }
     else
     {
-        if (m_vSelectedBitmap != wxNullBitmap)
+        if (m_vSelectedBitmap.Ok())
         {
             m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
             m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
-            if (m_pCanvas && m_pCanvas->IsKindOf(CLASSINFO(wxStatusBar)))
-                vPtlStart.y = OS2Y(vY,vTextY);
-            else
-                vPtlStart.y = (LONG)(OS2Y(vY,vTextY/1.5));
+            vPtlStart.y = OS2Y(vY,vTextY);
         }
         else
             vPtlStart.y = vY;
     }
 
-    PCH                             pzStr = (PCH)rsText.c_str();
-
     ::GpiMove(m_hPS, &vPtlStart);
     lHits = ::GpiCharString( m_hPS
                             ,rsText.length()
-                            ,pzStr
+                            ,rsText.char_str()
                            );
     if (lHits != GPI_OK)
     {
@@ -1881,9 +1848,7 @@ void wxDC::DoDrawRotatedText(
 // set GDI objects
 // ---------------------------------------------------------------------------
 
-void wxDC::DoSelectPalette(
-  bool                              bRealize
-)
+void wxDC::DoSelectPalette( bool WXUNUSED(bRealize) )
 {
     //
     // Set the old object temporarily, in case the assignment deletes an object
@@ -2053,73 +2018,33 @@ void wxDC::SetBrush(
     }
 } // end of wxDC::SetBrush
 
-void wxDC::SetBackground(
-  const wxBrush&                    rBrush
-)
+void wxDC::SetBackground(const wxBrush& rBrush)
 {
     m_backgroundBrush = rBrush;
-    if (!m_backgroundBrush.Ok())
-        return;
-    if (m_pCanvas)
-    {
-        bool                        bCustomColours = true;
 
-        //
-        // If we haven't specified wxUSER_COLOURS, don't allow the panel/dialog box to
-        // change background colours from the control-panel specified colours.
-        //
-        if (m_pCanvas->IsKindOf(CLASSINFO(wxWindow)) &&
-            ((m_pCanvas->GetWindowStyleFlag() & wxUSER_COLOURS) != wxUSER_COLOURS))
-            bCustomColours = false;
-        if (bCustomColours)
-        {
-            if (m_backgroundBrush.GetStyle()==wxTRANSPARENT)
-            {
-                m_pCanvas->SetTransparent(true);
-            }
-            else
-            {
-                //
-                // Setting the background brush of a DC
-                // doesn't affect the window background colour. However,
-                // I'm leaving in the transparency setting because it's needed by
-                // various controls (e.g. wxStaticText) to determine whether to draw
-                // transparently or not. TODO: maybe this should be a new function
-                // wxWindow::SetTransparency(). Should that apply to the child itself, or the
-                // parent?
-                // m_canvas->SetBackgroundColour(m_backgroundBrush.GetColour());
-                //
-                m_pCanvas->SetTransparent(false);
-            }
-        }
+    if (m_backgroundBrush.Ok())
+    {
+        (void)::GpiSetBackColor((HPS)m_hPS, m_backgroundBrush.GetColour().GetPixel());
     }
-    COLORREF                        vNewColor = m_backgroundBrush.GetColour().GetPixel();
-    (void)::GpiSetBackColor((HPS)m_hPS, (LONG)vNewColor);
 } // end of wxDC::SetBackground
 
-void wxDC::SetBackgroundMode(
-  int                               nMode
-)
+void wxDC::SetBackgroundMode(int nMode)
 {
     m_backgroundMode = nMode;
 } // end of wxDC::SetBackgroundMode
 
-void wxDC::SetLogicalFunction(
-  int                               nFunction
-)
+void wxDC::SetLogicalFunction(int nFunction)
 {
     m_logicalFunction = nFunction;
     SetRop((WXHDC)m_hDC);
 } // wxDC::SetLogicalFunction
 
-void wxDC::SetRop(
-  WXHDC                             hDC
-)
+void wxDC::SetRop(WXHDC hDC)
 {
     if (!hDC || m_logicalFunction < 0)
         return;
 
-    LONG                            lCRop;
+    LONG lCRop;
     switch (m_logicalFunction)
     {
         case wxXOR:
@@ -2176,9 +2101,7 @@ void wxDC::SetRop(
     ::GpiSetMix((HPS)hDC, lCRop);
 } // end of wxDC::SetRop
 
-bool wxDC::StartDoc(
-  const wxString&                   rsMessage
-)
+bool wxDC::StartDoc( const wxString& WXUNUSED(rsMessage) )
 {
     // We might be previewing, so return true to let it continue.
     return true;
@@ -2228,7 +2151,7 @@ void wxDC::DoGetTextExtent(
 , wxCoord*                          pvY
 , wxCoord*                          pvDescent
 , wxCoord*                          pvExternalLeading
-, wxFont*                           pTheFont
+, const wxFont*                     pTheFont
 ) const
 {
     POINTL                          avPoint[TXTBOX_COUNT];
@@ -2253,7 +2176,7 @@ void wxDC::DoGetTextExtent(
     //
     bRc = ::GpiQueryTextBox( m_hPS
                             ,l
-                            ,(PCH)rsString.c_str()
+                            ,rsString.char_str()
                             ,TXTBOX_COUNT // return maximum information
                             ,avPoint      // array of coordinates points
                            );
@@ -2371,12 +2294,13 @@ void wxDC::SetMapMode(
     m_nWindowExtX = (int)MS_XDEV2LOG(VIEWPORT_EXTENT);
     m_nWindowExtY = (int)MS_YDEV2LOG(VIEWPORT_EXTENT);
     // ????
+    
+    ComputeScaleAndOrigin();
+    
 }; // end of wxDC::SetMapMode
 
-void wxDC::SetUserScale(
-  double                            dX
-, double                            dY
-)
+void wxDC::SetUserScale( double dX,
+                         double dY )
 {
     m_userScaleX = dX;
     m_userScaleY = dY;
@@ -2384,10 +2308,8 @@ void wxDC::SetUserScale(
     SetMapMode(m_mappingMode);
 } // end of wxDC::SetUserScale
 
-void wxDC::SetAxisOrientation(
-  bool                              bXLeftRight
-, bool                              bYBottomUp
-)
+void wxDC::SetAxisOrientation( bool bXLeftRight,
+                               bool bYBottomUp )
 {
     m_signX = bXLeftRight ? 1 : -1;
     m_signY = bYBottomUp ? -1 : 1;
@@ -2395,17 +2317,6 @@ void wxDC::SetAxisOrientation(
     SetMapMode(m_mappingMode);
 } // end of wxDC::SetAxisOrientation
 
-void wxDC::SetSystemScale(
-  double                            dX
-, double                            dY
-)
-{
-    m_scaleX = dX;
-    m_scaleY = dY;
-
-    SetMapMode(m_mappingMode);
-} // end of wxDC::SetSystemScale
-
 void wxDC::SetLogicalOrigin(
   wxCoord                           vX
 , wxCoord                           vY
@@ -2446,71 +2357,21 @@ void wxDC::SetDeviceOrigin(
                         );
 }; // end of wxDC::SetDeviceOrigin
 
-// ---------------------------------------------------------------------------
-// coordinates transformations
-// ---------------------------------------------------------------------------
-
-wxCoord wxDCBase::DeviceToLogicalX(wxCoord x) const
-{
-    return (wxCoord) (((x) - m_deviceOriginX)/(m_logicalScaleX*m_userScaleX*m_signX*m_scaleX) - m_logicalOriginX);
-}
-
-wxCoord wxDCBase::DeviceToLogicalXRel(wxCoord x) const
-{
-    // axis orientation is not taken into account for conversion of a distance
-    return (wxCoord) ((x)/(m_logicalScaleX*m_userScaleX*m_scaleX));
-}
-
-wxCoord wxDCBase::DeviceToLogicalY(wxCoord y) const
-{
-    return (wxCoord) (((y) - m_deviceOriginY)/(m_logicalScaleY*m_userScaleY*m_signY*m_scaleY) - m_logicalOriginY);
-}
-
-wxCoord wxDCBase::DeviceToLogicalYRel(wxCoord y) const
-{
-    // axis orientation is not taken into account for conversion of a distance
-    return (wxCoord) ((y)/(m_logicalScaleY*m_userScaleY*m_scaleY));
-}
-
-wxCoord wxDCBase::LogicalToDeviceX(wxCoord x) const
-{
-    return (wxCoord) ((x - m_logicalOriginX)*m_logicalScaleX*m_userScaleX*m_signX*m_scaleX + m_deviceOriginX);
-}
-
-wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const
-{
-    // axis orientation is not taken into account for conversion of a distance
-    return (wxCoord) (x*m_logicalScaleX*m_userScaleX*m_scaleX);
-}
-
-wxCoord wxDCBase::LogicalToDeviceY(wxCoord y) const
-{
-    return (wxCoord) ((y - m_logicalOriginY)*m_logicalScaleY*m_userScaleY*m_signY*m_scaleY + m_deviceOriginY);
-}
-
-wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const
-{
-    // axis orientation is not taken into account for conversion of a distance
-    return (wxCoord) (y*m_logicalScaleY*m_userScaleY*m_scaleY);
-}
-
 // ---------------------------------------------------------------------------
 // bit blit
 // ---------------------------------------------------------------------------
 
-bool wxDC::DoBlit(
-  wxCoord                           vXdest
-, wxCoord                           vYdest
-, wxCoord                           vWidth
-, wxCoord                           vHeight
-, wxDC*                             pSource
-, wxCoord                           vXsrc
-, wxCoord                           vYsrc
-, int                               nRop
-, bool                              bUseMask
-, wxCoord                           vXsrcMask
-, wxCoord                           vYsrcMask
-)
+bool wxDC::DoBlit( wxCoord vXdest,
+                   wxCoord vYdest,
+                   wxCoord vWidth,
+                   wxCoord vHeight,
+                   wxDC*   pSource,
+                   wxCoord vXsrc,
+                   wxCoord vYsrc,
+                   int     nRop,
+                   bool    bUseMask,
+                   wxCoord WXUNUSED(vXsrcMask),
+                   wxCoord WXUNUSED(vYsrcMask) )
 {
     wxMask*                         pMask = NULL;
     CHARBUNDLE                      vCbnd;
@@ -2604,7 +2465,6 @@ bool wxDC::DoBlit(
         vBmpHdr.cBitCount = 24;
 
 #if wxUSE_DC_CACHEING
-        if (true)
         {
             //
             // create a temp buffer bitmap and DCs to access it and the mask
@@ -2623,9 +2483,9 @@ bool wxDC::DoBlit(
             hPSMask = pDCCacheEntry1->m_hPS;
             hDCBuffer = (HDC)pDCCacheEntry2->m_hPS;
             hBufBitmap = (HBITMAP)pBitmapCacheEntry->m_hBitmap;
+            wxUnusedVar(hDCMask);
         }
-        else
-#endif
+#else
         {
             hDCMask = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
             hDCBuffer = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
@@ -2633,6 +2493,7 @@ bool wxDC::DoBlit(
             hPSBuffer = ::GpiCreatePS(vHabmain, hDCBuffer, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
             hBufBitmap = ::GpiCreateBitmap(GetHPS(), &vBmpHdr, 0L, NULL, NULL);
         }
+#endif
 
         POINTL                          aPoint1[4] = { {0, 0}
                               ,{vWidth, vHeight}
@@ -2792,12 +2653,10 @@ bool wxDC::DoBlit(
     return bSuccess;
 }
 
-void wxDC::DoGetSize(
-  int*                              pnWidth
-, int*                              pnHeight
-) const
+void wxDC::DoGetSize( int* pnWidth,
+                      int* pnHeight ) const
 {
-    LONG                            lArray[CAPS_HEIGHT];
+    LONG lArray[CAPS_HEIGHT];
 
     if(::DevQueryCaps( m_hDC
                       ,CAPS_FAMILY
@@ -2810,10 +2669,8 @@ void wxDC::DoGetSize(
     }
 }; // end of wxDC::DoGetSize(
 
-void wxDC::DoGetSizeMM(
-  int*                              pnWidth
-, int*                              pnHeight
-) const
+void wxDC::DoGetSizeMM( int* pnWidth,
+                        int* pnHeight ) const
 {
     LONG                            lArray[CAPS_VERTICAL_RESOLUTION];
 
@@ -2823,17 +2680,19 @@ void wxDC::DoGetSizeMM(
                       ,lArray
                      ))
     {
-        int                         nWidth;
-        int                         nHeight;
-        int                         nHorzRes;
-        int                         nVertRes;
+        if(pnWidth)
+        {
+            int nWidth = lArray[CAPS_WIDTH];
+            int nHorzRes  = lArray[CAPS_HORIZONTAL_RESOLUTION]; // returns pel/meter
+            *pnWidth  = (nHorzRes/1000) * nWidth;
+        }
 
-        nWidth    = lArray[CAPS_WIDTH];
-        nHeight   = lArray[CAPS_HEIGHT];
-        nHorzRes  = lArray[CAPS_HORIZONTAL_RESOLUTION]; // returns pel/meter
-        nVertRes  = lArray[CAPS_VERTICAL_RESOLUTION];   // returns pel/meter
-        nWidth  = (nHorzRes/1000) * nWidth;
-        nHeight = (nVertRes/1000) * nHeight;
+        if(pnHeight)
+        {
+            int nHeight   = lArray[CAPS_HEIGHT];
+            int nVertRes = lArray[CAPS_VERTICAL_RESOLUTION];   // returns pel/meter
+            *pnHeight = (nVertRes/1000) * nHeight;
+        }
     }
 }; // end of wxDC::DoGetSizeMM
 
@@ -2861,17 +2720,12 @@ wxSize wxDC::GetPPI() const
         nWidth   = (int)((nHorzRes/39.3) * nPelWidth);
         nHeight  = (int)((nVertRes/39.3) * nPelHeight);
     }
-    return (wxSize(nWidth,nHeight));
+    wxSize ppisize(nWidth, nHeight);
+    return ppisize;
 } // end of wxDC::GetPPI
 
-void wxDC::SetLogicalScale(
-  double                            dX
-, double                            dY
-)
+void wxDC::SetLogicalScale( double dX, double dY )
 {
     m_logicalScaleX = dX;
     m_logicalScaleY = dY;
 }; // end of wxDC::SetLogicalScale
-
-
-