/////////////////////////////////////////////////////////////////////////////
-// 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.
vBmpHdr.cx = nWidth;
vBmpHdr.cy = nHeight;
vBmpHdr.cPlanes = 1;
- vBmpHdr.cBitCount = nDepth;
+ vBmpHdr.cBitCount = (USHORT)nDepth;
pEntry->m_hBitmap = (WXHBITMAP) ::GpiCreateBitmap( hPS
,&vBmpHdr
vBmpHdr.cx = nWidth;
vBmpHdr.cy = nHeight;
vBmpHdr.cPlanes = 1;
- vBmpHdr.cBitCount = nDepth;
+ vBmpHdr.cBitCount = (USHORT)nDepth;
WXHBITMAP hBitmap = (WXHBITMAP) ::GpiCreateBitmap( hPS
,&vBmpHdr
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
}
else
{
- if (m_vSelectedBitmap != wxNullBitmap)
+ if (m_vSelectedBitmap.Ok())
{
m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
);
} // 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 flModel = 0L; // Drawing model.
+ ULONG ulCount = 1; // Number of polygons.
+ POLYGON vPlgn; // polygon.
+ ULONG flOptions = 0L; // Drawing options.
-//////////////////////////////////////////////////////////////////////////////
-// 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();
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
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();
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();
//
// 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())
{
, 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());
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)
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;
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)
{
// 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
}
} // 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:
::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;
, wxCoord* pvY
, wxCoord* pvDescent
, wxCoord* pvExternalLeading
-, wxFont* pTheFont
+, const wxFont* pTheFont
) const
{
POINTL avPoint[TXTBOX_COUNT];
//
bRc = ::GpiQueryTextBox( m_hPS
,l
- ,(PCH)rsString.c_str()
+ ,rsString.char_str()
,TXTBOX_COUNT // return maximum information
,avPoint // array of coordinates points
);
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;
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;
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
);
}; // 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;
vBmpHdr.cBitCount = 24;
#if wxUSE_DC_CACHEING
- if (true)
{
//
// create a temp buffer bitmap and DCs to access it and the mask
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);
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}
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
}
}; // 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];
,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
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
-
-
-