X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c067fe3c1e752658c63b4d556eb6a5468213860..07aec89fe1e7bad8010911aa8863efecfa909946:/src/os2/dc.cpp diff --git a/src/os2/dc.cpp b/src/os2/dc.cpp index ee3e233a89..823467f540 100644 --- a/src/os2/dc.cpp +++ b/src/os2/dc.cpp @@ -4,7 +4,6 @@ // Author: David Webster // Modified by: // Created: 10/14/99 -// RCS-ID: $Id$ // Copyright: (c) David Webster // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -23,19 +22,18 @@ #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 +#include "wx/os2/dc.h" +#include "wx/os2/dcclient.h" #include "wx/os2/private.h" - IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxPMDCImpl, wxDCImpl) // // wxWidgets uses the Microsoft convention that the origin is the UPPER left. @@ -159,8 +157,8 @@ int SetBkMode( // wxDCCacheEntry // --------------------------------------------------------------------------- -wxList wxDC::m_svBitmapCache; -wxList wxDC::m_svDCCache; +wxList wxPMDCImpl::m_svBitmapCache; +wxList wxPMDCImpl::m_svDCCache; wxDCCacheEntry::wxDCCacheEntry( WXHBITMAP hBitmap @@ -196,7 +194,7 @@ wxDCCacheEntry::~wxDCCacheEntry() ::GpiDestroyPS(m_hPS); } // end of wxDCCacheEntry::~wxDCCacheEntry -wxDCCacheEntry* wxDC::FindBitmapInCache( +wxDCCacheEntry* wxPMDCImpl::FindBitmapInCache( HPS hPS , int nWidth , int nHeight @@ -263,7 +261,7 @@ wxDCCacheEntry* wxDC::FindBitmapInCache( return pEntry; } // end of FindBitmapInCache -wxDCCacheEntry* wxDC::FindDCInCache( +wxDCCacheEntry* wxPMDCImpl::FindDCInCache( wxDCCacheEntry* pNotThis , HPS hPS ) @@ -292,23 +290,23 @@ wxDCCacheEntry* wxDC::FindDCInCache( ); AddToDCCache(pEntry); return pEntry; -} // end of wxDC::FindDCInCache +} // end of wxPMDCImpl::FindDCInCache -void wxDC::AddToBitmapCache( +void wxPMDCImpl::AddToBitmapCache( wxDCCacheEntry* pEntry ) { m_svBitmapCache.Append(pEntry); -} // end of wxDC::AddToBitmapCache +} // end of wxPMDCImpl::AddToBitmapCache -void wxDC::AddToDCCache( +void wxPMDCImpl::AddToDCCache( wxDCCacheEntry* pEntry ) { m_svDCCache.Append(pEntry); -} // end of wxDC::AddToDCCache +} // end of wxPMDCImpl::AddToDCCache -void wxDC::ClearCache() +void wxPMDCImpl::ClearCache() { m_svBitmapCache.DeleteContents(true); m_svBitmapCache.Clear(); @@ -316,14 +314,14 @@ void wxDC::ClearCache() m_svDCCache.DeleteContents(true); m_svDCCache.Clear(); m_svDCCache.DeleteContents(false); -} // end of wxDC::ClearCache +} // end of wxPMDCImpl::ClearCache // Clean up cache at app exit class wxDCModule : public wxModule { public: virtual bool OnInit() { return true; } - virtual void OnExit() { wxDC::ClearCache(); } + virtual void OnExit() { wxPMDCImpl::ClearCache(); } private: DECLARE_DYNAMIC_CLASS(wxDCModule) @@ -337,31 +335,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxDCModule, wxModule) // wxDC // --------------------------------------------------------------------------- -wxDC::wxDC(void) +wxPMDCImpl::wxPMDCImpl( wxDC *owner, WXHDC hDC ) : + wxDCImpl( owner ) { - m_pCanvas = NULL; - - m_hOldBitmap = 0; - m_hOldPen = 0; - m_hOldBrush = 0; - m_hOldFont = 0; - m_hOldPalette = 0; - - m_bOwnsDC = false; - m_hDC = 0; - m_hOldPS = NULL; - 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); + Init(); + m_hDC = hDC; +} // end of wxPMDCImpl::wxPMDCImpl -} // end of wxDC::wxDC - -wxDC::~wxDC(void) +wxPMDCImpl::~wxPMDCImpl() { if ( m_hDC != 0 ) { @@ -390,12 +371,12 @@ wxDC::~wxDC(void) } } } -} // end of wxDC::~wxDC +} // end of wxPMDCImpl::~wxDC // This will select current objects out of the DC, // which is what you have to do before deleting the // DC. -void wxDC::SelectOldObjects( +void wxPMDCImpl::SelectOldObjects( WXHDC hPS ) { @@ -404,7 +385,7 @@ void wxDC::SelectOldObjects( if (m_hOldBitmap) { ::GpiSetBitmap(hPS, (HBITMAP) m_hOldBitmap); - if (m_vSelectedBitmap.Ok()) + if (m_vSelectedBitmap.IsOk()) { m_vSelectedBitmap.SetSelectedInto(NULL); } @@ -425,7 +406,7 @@ void wxDC::SelectOldObjects( m_font = wxNullFont; m_backgroundBrush = wxNullBrush; m_vSelectedBitmap = wxNullBitmap; -} // end of wxDC::SelectOldObjects +} // end of wxPMDCImpl::SelectOldObjects // --------------------------------------------------------------------------- // clipping @@ -443,7 +424,7 @@ void wxDC::SelectOldObjects( m_clipY2 = (wxCoord) YDEV2LOG(rect.yBottom); \ } -void wxDC::DoSetClippingRegion( +void wxPMDCImpl::DoSetClippingRegion( wxCoord vX , wxCoord vY , wxCoord vWidth @@ -460,9 +441,9 @@ void wxDC::DoSetClippingRegion( vRect.yBottom = vY; ::GpiIntersectClipRectangle(m_hPS, &vRect); DO_SET_CLIPPING_BOX() -} // end of wxDC::DoSetClippingRegion +} // end of wxPMDCImpl::DoSetClippingRegion -void wxDC::DoSetClippingRegionAsRegion( +void wxPMDCImpl::DoSetDeviceClippingRegion( const wxRegion& rRegion ) { @@ -475,9 +456,9 @@ void wxDC::DoSetClippingRegionAsRegion( ,&hRgnOld ); DO_SET_CLIPPING_BOX() -} // end of wxDC::DoSetClippingRegionAsRegion +} // end of wxPMDCImpl::DoSetDeviceClippingRegion -void wxDC::DestroyClippingRegion(void) +void wxPMDCImpl::DestroyClippingRegion() { if (m_clipping && m_hPS) { @@ -498,46 +479,46 @@ void wxDC::DestroyClippingRegion(void) ::GpiSetClipRegion(m_hPS, hRgn, &hRgnOld); } ResetClipping(); -} // end of wxDC::DestroyClippingRegion +} // end of wxPMDCImpl::DestroyClippingRegion // --------------------------------------------------------------------------- // query capabilities // --------------------------------------------------------------------------- -bool wxDC::CanDrawBitmap() const +bool wxPMDCImpl::CanDrawBitmap() const { return true; } -bool wxDC::CanGetTextExtent() const +bool wxPMDCImpl::CanGetTextExtent() const { LONG lTechnology = 0L; ::DevQueryCaps(GetHDC(), CAPS_TECHNOLOGY, 1L, &lTechnology); return (lTechnology == CAPS_TECH_RASTER_DISPLAY) || (lTechnology == CAPS_TECH_RASTER_PRINTER); -} // end of wxDC::CanGetTextExtent +} // end of wxPMDCImpl::CanGetTextExtent -int wxDC::GetDepth() const +int wxPMDCImpl::GetDepth() const { - LONG lArray[CAPS_COLOR_BITCOUNT]; + LONG lCapsColorBitcount; int nBitsPerPixel = 0; if(::DevQueryCaps( GetHDC() - ,CAPS_FAMILY ,CAPS_COLOR_BITCOUNT - ,lArray + ,1L + ,&lCapsColorBitcount )) { - nBitsPerPixel = (int)lArray[CAPS_COLOR_BITCOUNT]; + nBitsPerPixel = (int)lCapsColorBitcount; } return nBitsPerPixel; -} // end of wxDC::GetDepth +} // end of wxPMDCImpl::GetDepth // --------------------------------------------------------------------------- // drawing // --------------------------------------------------------------------------- -void wxDC::Clear() +void wxPMDCImpl::Clear() { // // If this is a canvas DC then just fill with the background color @@ -552,13 +533,13 @@ void wxDC::Clear() } else ::GpiErase(m_hPS); -} // end of wxDC::Clear +} // end of wxPMDCImpl::Clear -bool wxDC::DoFloodFill( +bool wxPMDCImpl::DoFloodFill( wxCoord vX , wxCoord vY , const wxColour& rCol -, int nStyle +, wxFloodFillStyle nStyle ) { POINTL vPtlPos; @@ -579,9 +560,9 @@ bool wxDC::DoFloodFill( bSuccess = true; return bSuccess; -} // end of wxDC::DoFloodFill +} // end of wxPMDCImpl::DoFloodFill -bool wxDC::DoGetPixel( +bool wxPMDCImpl::DoGetPixel( wxCoord vX , wxCoord vY , wxColour* pCol @@ -603,9 +584,9 @@ bool wxDC::DoGetPixel( ,GetBValue(lColor) ); return true; -} // end of wxDC::DoGetPixel +} // end of wxPMDCImpl::DoGetPixel -void wxDC::DoCrossHair( +void wxPMDCImpl::DoCrossHair( wxCoord vX , wxCoord vY ) @@ -637,9 +618,9 @@ void wxDC::DoCrossHair( ::GpiLine(m_hPS, &vPoint[3]); CalcBoundingBox(vX1, vY1); CalcBoundingBox(vX2, vY2); -} // end of wxDC::DoCrossHair +} // end of wxPMDCImpl::DoCrossHair -void wxDC::DoDrawLine( +void wxPMDCImpl::DoDrawLine( wxCoord vX1 , wxCoord vY1 , wxCoord vX2 @@ -662,7 +643,7 @@ void wxDC::DoDrawLine( } else { - if (m_vSelectedBitmap != wxNullBitmap) + if (m_vSelectedBitmap.IsOk()) { m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); @@ -674,7 +655,7 @@ void wxDC::DoDrawLine( vPoint[0].y = vY1; vPoint[1].x = vX2; vPoint[1].y = vY2; - if (m_pen.Ok()) + if (m_pen.IsOk()) { vColor = m_pen.GetColour().GetPixel(); } @@ -683,7 +664,7 @@ void wxDC::DoDrawLine( ::GpiLine(m_hPS, &vPoint[1]); CalcBoundingBox(vX1, vY1); CalcBoundingBox(vX2, vY2); -} // end of wxDC::DoDrawLine +} // end of wxPMDCImpl::DoDrawLine ////////////////////////////////////////////////////////////////////////////// // Draws an arc of a circle, centred on (xc, yc), with starting point (x1, y1) @@ -691,7 +672,7 @@ void wxDC::DoDrawLine( // current brush for filling the shape. The arc is drawn in an anticlockwise // direction from the start point to the end point. ////////////////////////////////////////////////////////////////////////////// -void wxDC::DoDrawArc( +void wxPMDCImpl::DoDrawArc( wxCoord vX1 , wxCoord vY1 , wxCoord vX2 @@ -781,9 +762,9 @@ void wxDC::DoDrawArc( CalcBoundingBox( (wxCoord)(vXc + dRadius) ,(wxCoord)(vYc + dRadius) ); -} // end of wxDC::DoDrawArc +} // end of wxPMDCImpl::DoDrawArc -void wxDC::DoDrawCheckMark( +void wxPMDCImpl::DoDrawCheckMark( wxCoord vX1 , wxCoord vY1 , wxCoord vWidth @@ -830,9 +811,9 @@ void wxDC::DoDrawCheckMark( CalcBoundingBox( vX2 ,vY2 ); -} // end of wxDC::DoDrawCheckMark +} // end of wxPMDCImpl::DoDrawCheckMark -void wxDC::DoDrawPoint( +void wxPMDCImpl::DoDrawPoint( wxCoord vX , wxCoord vY ) @@ -840,7 +821,7 @@ void wxDC::DoDrawPoint( POINTL vPoint; COLORREF vColor = 0x00ffffff; - if (m_pen.Ok()) + if (m_pen.IsOk()) { vColor = m_pen.GetColour().GetPixel(); } @@ -851,49 +832,46 @@ void wxDC::DoDrawPoint( CalcBoundingBox( vX ,vY ); -} // end of wxDC::DoDrawPoint +} // end of wxPMDCImpl::DoDrawPoint -void wxDC::DoDrawPolygon( - int n -, wxPoint vPoints[] -, wxCoord vXoffset -, wxCoord vYoffset -, int nFillStyle -) +void wxPMDCImpl::DoDrawPolygon( int n, + const wxPoint vPoints[], + wxCoord vXoffset, + wxCoord vYoffset, + wxPolygonFillMode 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. - -////////////////////////////////////////////////////////////////////////////// -// 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. -////////////////////////////////////////////////////////////////////////////// + ULONG ulCount = 1; // Number of polygons. + POLYGON vPlgn; // polygon. + ULONG flOptions = 0L; // Drawing options. - 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(); @@ -907,34 +885,31 @@ 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 +} // end of wxPMDCImpl::DoDrawPolygon -void wxDC::DoDrawLines( +void wxPMDCImpl::DoDrawLines( int n -, wxPoint vPoints[] +, const wxPoint vPoints[] , wxCoord vXoffset , wxCoord vYoffset ) { POINTL vPoint; - if (vXoffset != 0L || vXoffset != 0L) + if (vXoffset != 0L || vYoffset != 0L) { int i; @@ -973,9 +948,9 @@ void wxDC::DoDrawLines( ::GpiLine(m_hPS, &vPoint); } } -} // end of wxDC::DoDrawLines +} // end of wxPMDCImpl::DoDrawLines -void wxDC::DoDrawRectangle( +void wxPMDCImpl::DoDrawRectangle( wxCoord vX , wxCoord vY , wxCoord vWidth @@ -998,7 +973,7 @@ void wxDC::DoDrawRectangle( vY = OS2Y(vY,vHeight); else { - if (m_vSelectedBitmap != wxNullBitmap) + if (m_vSelectedBitmap.IsOk()) { m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); @@ -1062,9 +1037,9 @@ void wxDC::DoDrawRectangle( } CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); -} // end of wxDC::DoDrawRectangle +} // end of wxPMDCImpl::DoDrawRectangle -void wxDC::DoDrawRoundedRectangle( +void wxPMDCImpl::DoDrawRoundedRectangle( wxCoord vX , wxCoord vY , wxCoord vWidth @@ -1088,7 +1063,7 @@ void wxDC::DoDrawRoundedRectangle( vY = OS2Y(vY,vHeight); else { - if (m_vSelectedBitmap != wxNullBitmap) + if (m_vSelectedBitmap.IsOk()) { m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); @@ -1155,10 +1130,10 @@ void wxDC::DoDrawRoundedRectangle( CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); -} // end of wxDC::DoDrawRoundedRectangle +} // end of wxPMDCImpl::DoDrawRoundedRectangle // Draw Ellipse within box (x,y) - (x+width, y+height) -void wxDC::DoDrawEllipse( +void wxPMDCImpl::DoDrawEllipse( wxCoord vX , wxCoord vY , wxCoord vWidth @@ -1198,9 +1173,9 @@ void wxDC::DoDrawEllipse( CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); -} // end of wxDC::DoDrawEllipse +} // end of wxPMDCImpl::DoDrawEllipse -void wxDC::DoDrawEllipticArc( +void wxPMDCImpl::DoDrawEllipticArc( wxCoord vX , wxCoord vY , wxCoord vWidth @@ -1257,9 +1232,9 @@ void wxDC::DoDrawEllipticArc( CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); -} // end of wxDC::DoDrawEllipticArc +} // end of wxPMDCImpl::DoDrawEllipticArc -void wxDC::DoDrawIcon( +void wxPMDCImpl::DoDrawIcon( const wxIcon& rIcon , wxCoord vX , wxCoord vY @@ -1282,9 +1257,9 @@ void wxDC::DoDrawIcon( } CalcBoundingBox(vX, vY); CalcBoundingBox(vX + rIcon.GetWidth(), vY + rIcon.GetHeight()); -} // end of wxDC::DoDrawIcon +} // end of wxPMDCImpl::DoDrawIcon -void wxDC::DoDrawBitmap( +void wxPMDCImpl::DoDrawBitmap( const wxBitmap& rBmp , wxCoord vX , wxCoord vY @@ -1377,13 +1352,13 @@ void wxDC::DoDrawBitmap( // // Need to get a background color for mask blitting // - if (IsKindOf(CLASSINFO(wxWindowDC))) + if (IsKindOf(CLASSINFO(wxWindowDCImpl))) { - wxWindowDC* pWindowDC = wxDynamicCast(this, wxWindowDC); + wxWindowDCImpl* pWindowDC = wxDynamicCast(this, wxWindowDCImpl); lColor = pWindowDC->m_pCanvas->GetBackgroundColour().GetPixel(); } - else if (GetBrush().Ok()) + else if (GetBrush().IsOk()) lColor = GetBrush().GetColour().GetPixel(); else lColor = m_textBackgroundColour.GetPixel(); @@ -1550,13 +1525,13 @@ void wxDC::DoDrawBitmap( ULONG lOldForeGround = ::GpiQueryColor((HPS)GetHPS()); ULONG lOldBackGround = ::GpiQueryBackColor((HPS)GetHPS()); - if (m_textForegroundColour.Ok()) + if (m_textForegroundColour.IsOk()) { ::GpiSetColor( (HPS)GetHPS() ,m_textForegroundColour.GetPixel() ); } - if (m_textBackgroundColour.Ok()) + if (m_textBackgroundColour.IsOk()) { ::GpiSetBackColor( (HPS)GetHPS() ,m_textBackgroundColour.GetPixel() @@ -1603,6 +1578,7 @@ void wxDC::DoDrawBitmap( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); + delete [] pucBits; return; } if ((lScans = ::GpiQueryBitmapBits( hPS @@ -1614,6 +1590,7 @@ void wxDC::DoDrawBitmap( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); + delete [] pucBits; return; } unsigned char cOldRedFore = (unsigned char)(lOldForeGround >> 16); @@ -1687,9 +1664,9 @@ void wxDC::DoDrawBitmap( ::GpiSetBackColor((HPS)GetHPS(), lOldBackGround); } } -} // end of wxDC::DoDrawBitmap +} // end of wxPMDCImpl::DoDrawBitmap -void wxDC::DoDrawText( +void wxPMDCImpl::DoDrawText( const wxString& rsText , wxCoord vX , wxCoord vY @@ -1704,15 +1681,13 @@ void wxDC::DoDrawText( ); CalcBoundingBox(vX, vY); - GetTextExtent(rsText, &vWidth, &vHeight); + GetOwner()->GetTextExtent(rsText, &vWidth, &vHeight); CalcBoundingBox((vX + vWidth), (vY + vHeight)); -} // end of wxDC::DoDrawText +} // end of wxPMDCImpl::DoDrawText -void wxDC::DrawAnyText( - const wxString& rsText -, wxCoord vX -, wxCoord vY -) +void wxPMDCImpl::DrawAnyText( const wxString& rsText, + wxCoord vX, + wxCoord vY ) { int nOldBackground = 0; POINTL vPtlStart; @@ -1727,14 +1702,14 @@ void wxDC::DrawAnyText( // // Set text color attributes // - if (m_textForegroundColour.Ok()) + if (m_textForegroundColour.IsOk()) { SetTextColor( m_hPS ,(int)m_textForegroundColour.GetPixel() ); } - if (m_textBackgroundColour.Ok()) + if (m_textBackgroundColour.IsOk()) { nOldBackground = SetTextBkColor( m_hPS ,(int)m_textBackgroundColour.GetPixel() @@ -1743,45 +1718,34 @@ void wxDC::DrawAnyText( SetBkMode( m_hPS ,m_backgroundMode ); - GetTextExtent( rsText - ,&vTextX - ,&vTextY - ); + GetOwner()->GetTextExtent( rsText + ,&vTextX + ,&vTextY + ); vPtlStart.x = vX; if (!(m_vRclPaint.yTop == 0 && m_vRclPaint.yBottom == 0 && 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.IsOk()) { 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) { @@ -1793,7 +1757,7 @@ void wxDC::DrawAnyText( // it never is set to anything else, but background should remain // transparent even if we just drew an opaque string) // - if (m_textBackgroundColour.Ok()) + if (m_textBackgroundColour.IsOk()) SetTextBkColor( m_hPS ,nOldBackground ); @@ -1802,7 +1766,7 @@ void wxDC::DrawAnyText( ); } -void wxDC::DoDrawRotatedText( +void wxPMDCImpl::DoDrawRotatedText( const wxString& rsText , wxCoord vX , wxCoord vY @@ -1873,7 +1837,7 @@ void wxDC::DoDrawRotatedText( // set GDI objects // --------------------------------------------------------------------------- -void wxDC::DoSelectPalette( bool WXUNUSED(bRealize) ) +void wxPMDCImpl::DoSelectPalette( bool WXUNUSED(bRealize) ) { // // Set the old object temporarily, in case the assignment deletes an object @@ -1884,7 +1848,7 @@ void wxDC::DoSelectPalette( bool WXUNUSED(bRealize) ) m_hOldPalette = 0; } - if (m_palette.Ok()) + if (m_palette.IsOk()) { HPALETTE hOldPal; @@ -1892,9 +1856,9 @@ void wxDC::DoSelectPalette( bool WXUNUSED(bRealize) ) if (!m_hOldPalette) m_hOldPalette = (WXHPALETTE)hOldPal; } -} // end of wxDC::DoSelectPalette +} // end of wxPMDCImpl::DoSelectPalette -void wxDC::InitializePalette() +void wxPMDCImpl::InitializePalette() { if (wxDisplayDepth() <= 8 ) { @@ -1915,9 +1879,9 @@ void wxDC::InitializePalette() DoSelectPalette(); } } -} // end of wxDC::InitializePalette +} // end of wxPMDCImpl::InitializePalette -void wxDC::SetPalette( +void wxPMDCImpl::SetPalette( const wxPalette& rPalette ) { @@ -1926,7 +1890,7 @@ void wxDC::SetPalette( m_hOldFont = 0; } m_palette = rPalette; - if (!rPalette.Ok()) + if (!rPalette.IsOk()) { if (m_hOldFont) { @@ -1936,9 +1900,9 @@ void wxDC::SetPalette( HPALETTE hOldPal = ::GpiSelectPalette((HDC) m_hPS, (HPALETTE) m_palette.GetHPALETTE()); if (!m_hOldPalette) m_hOldPalette = (WXHPALETTE)hOldPal; -} // end of wxDC::SetPalette +} // end of wxPMDCImpl::SetPalette -void wxDC::SetFont( +void wxPMDCImpl::SetFont( const wxFont& rFont ) { @@ -1951,42 +1915,40 @@ void wxDC::SetFont( m_hOldFont = 0; } m_font = rFont; - if (!rFont.Ok()) + if (!rFont.IsOk()) { m_hOldFont = 0; } m_font.SetPS(m_hPS); // this will realize the font - if (m_font.Ok()) + if (m_font.IsOk()) { HFONT hFont = m_font.GetResourceHandle(); if (hFont == (HFONT) NULL) { - wxLogDebug(wxT("::SelectObject failed in wxDC::SetFont.")); + wxLogDebug(wxT("::SelectObject failed in wxPMDCImpl::SetFont.")); } if (!m_hOldFont) m_hOldFont = (WXHFONT) hFont; } -} // end of wxDC::SetFont +} // end of wxPMDCImpl::SetFont -void wxDC::SetPen( +void wxPMDCImpl::SetPen( const wxPen& rPen ) { - wxCHECK_RET( Ok(), wxT("invalid window dc") ); - if (m_pen == rPen) return; m_pen = rPen; - if (!m_pen.Ok()) + if (!m_pen.IsOk()) return; if (m_hOldPen) m_hOldPen = 0L; m_pen = rPen; - if (!m_pen.Ok()) + if (!m_pen.IsOk()) { if (m_hOldPen) { @@ -1995,7 +1957,7 @@ void wxDC::SetPen( m_hOldPen = 0L; } - if (m_pen.Ok()) + if (m_pen.IsOk()) { if (m_pen.GetResourceHandle()) { @@ -2007,23 +1969,21 @@ void wxDC::SetPen( } } -void wxDC::SetBrush( +void wxPMDCImpl::SetBrush( const wxBrush& rBrush ) { - wxCHECK_RET( Ok(), wxT("invalid window dc") ); - if (m_hOldBrush) m_hOldBrush = 0L; m_brush = rBrush; - if (!m_brush.Ok()) + if (!m_brush.IsOk()) if (m_brush == rBrush) return; - if (!m_brush.Ok()) + if (!m_brush.IsOk()) if (m_hOldBrush) m_hOldBrush = 0L; - if (!m_brush.Ok()) + if (!m_brush.IsOk()) { if (m_hOldBrush) { @@ -2032,7 +1992,7 @@ void wxDC::SetBrush( m_hOldBrush = 0L; } - if (m_brush.Ok()) + if (m_brush.IsOk()) { if (m_brush.GetResourceHandle()) { @@ -2041,30 +2001,30 @@ void wxDC::SetBrush( m_hOldBrush = (WXHWND)m_brush.GetPS(); } } -} // end of wxDC::SetBrush +} // end of wxPMDCImpl::SetBrush -void wxDC::SetBackground(const wxBrush& rBrush) +void wxPMDCImpl::SetBackground(const wxBrush& rBrush) { m_backgroundBrush = rBrush; - if (m_backgroundBrush.Ok()) + if (m_backgroundBrush.IsOk()) { (void)::GpiSetBackColor((HPS)m_hPS, m_backgroundBrush.GetColour().GetPixel()); } -} // end of wxDC::SetBackground +} // end of wxPMDCImpl::SetBackground -void wxDC::SetBackgroundMode(int nMode) +void wxPMDCImpl::SetBackgroundMode(int nMode) { m_backgroundMode = nMode; -} // end of wxDC::SetBackgroundMode +} // end of wxPMDCImpl::SetBackgroundMode -void wxDC::SetLogicalFunction(int nFunction) +void wxPMDCImpl::SetLogicalFunction(wxRasterOperationMode nFunction) { m_logicalFunction = nFunction; SetRop((WXHDC)m_hDC); -} // wxDC::SetLogicalFunction +} // wxPMDCImpl::SetLogicalFunction -void wxDC::SetRop(WXHDC hDC) +void wxPMDCImpl::SetRop(WXHDC hDC) { if (!hDC || m_logicalFunction < 0) return; @@ -2124,31 +2084,31 @@ void wxDC::SetRop(WXHDC hDC) break; } ::GpiSetMix((HPS)hDC, lCRop); -} // end of wxDC::SetRop +} // end of wxPMDCImpl::SetRop -bool wxDC::StartDoc( const wxString& WXUNUSED(rsMessage) ) +bool wxPMDCImpl::StartDoc( const wxString& WXUNUSED(rsMessage) ) { // We might be previewing, so return true to let it continue. return true; -} // end of wxDC::StartDoc +} // end of wxPMDCImpl::StartDoc -void wxDC::EndDoc() +void wxPMDCImpl::EndDoc() { -} // end of wxDC::EndDoc +} // end of wxPMDCImpl::EndDoc -void wxDC::StartPage() +void wxPMDCImpl::StartPage() { -} // end of wxDC::StartPage +} // end of wxPMDCImpl::StartPage -void wxDC::EndPage() +void wxPMDCImpl::EndPage() { -} // end of wxDC::EndPage +} // end of wxPMDCImpl::EndPage // --------------------------------------------------------------------------- // text metrics // --------------------------------------------------------------------------- -wxCoord wxDC::GetCharHeight() const +wxCoord wxPMDCImpl::GetCharHeight() const { FONTMETRICS vFM; // metrics structure @@ -2159,7 +2119,7 @@ wxCoord wxDC::GetCharHeight() const return YDEV2LOGREL(vFM.lXHeight); } -wxCoord wxDC::GetCharWidth() const +wxCoord wxPMDCImpl::GetCharWidth() const { FONTMETRICS vFM; // metrics structure @@ -2170,13 +2130,13 @@ wxCoord wxDC::GetCharWidth() const return XDEV2LOGREL(vFM.lAveCharWidth); } -void wxDC::DoGetTextExtent( +void wxPMDCImpl::DoGetTextExtent( const wxString& rsString , wxCoord* pvX , wxCoord* pvY , wxCoord* pvDescent , wxCoord* pvExternalLeading -, wxFont* pTheFont +, const wxFont* pTheFont ) const { POINTL avPoint[TXTBOX_COUNT]; @@ -2199,9 +2159,17 @@ void wxDC::DoGetTextExtent( // // In world coordinates. // + if (!m_hPS) + { + (void)wxMessageBox( wxT("wxWidgets core library") + ,"Using uninitialized DC for measuring text!\n" + ,wxICON_INFORMATION + ); + } + bRc = ::GpiQueryTextBox( m_hPS ,l - ,(PCH)rsString.c_str() + ,rsString.char_str() ,TXTBOX_COUNT // return maximum information ,avPoint // array of coordinates points ); @@ -2210,8 +2178,8 @@ void wxDC::DoGetTextExtent( vErrorCode = ::WinGetLastError(wxGetInstance()); sError = wxPMErrorToStr(vErrorCode); // DEBUG - wxSprintf(zMsg, _T("GpiQueryTextBox for %s: failed with Error: %lx - %s"), rsString.c_str(), vErrorCode, sError.c_str()); - (void)wxMessageBox( _T("wxWidgets Menu sample") + wxSprintf(zMsg, wxT("GpiQueryTextBox for %s: failed with Error: %lx - %s"), rsString.c_str(), vErrorCode, sError.c_str()); + (void)wxMessageBox( wxT("wxWidgets core library") ,zMsg ,wxICON_INFORMATION ); @@ -2243,21 +2211,21 @@ void wxDC::DoGetTextExtent( *pvExternalLeading = vFM.lExternalLeading; } -void wxDC::SetMapMode( - int nMode +void wxPMDCImpl::SetMapMode( + wxMappingMode nMode ) { int nPixelWidth = 0; int nPixelHeight = 0; int nMmWidth = 1; int nMmHeight = 1; - LONG lArray[CAPS_VERTICAL_RESOLUTION]; + LONG lArray[CAPS_VERTICAL_RESOLUTION+1]; m_mappingMode = nMode; if(::DevQueryCaps( m_hDC - ,CAPS_FAMILY - ,CAPS_VERTICAL_RESOLUTION + ,CAPS_FAMILY // id of first item + ,CAPS_VERTICAL_RESOLUTION+1 // number of items wanted ,lArray )) { @@ -2269,15 +2237,15 @@ void wxDC::SetMapMode( lHorzRes = lArray[CAPS_HORIZONTAL_RESOLUTION]; // returns pel/meter lVertRes = lArray[CAPS_VERTICAL_RESOLUTION]; // returns pel/meter nMmWidth = (lHorzRes/1000) * nPixelWidth; - nMmWidth = (lVertRes/1000) * nPixelHeight; + nMmHeight = (lVertRes/1000) * nPixelHeight; } if ((nPixelWidth == 0) || (nPixelHeight == 0) || (nMmWidth == 0) || (nMmHeight == 0)) { return; } - double dMm2pixelsX = nPixelWidth/nMmWidth; - double dMm2pixelsY = nPixelHeight/nMmHeight; + double dMm2pixelsX = nPixelWidth/(double)nMmWidth; + double dMm2pixelsY = nPixelHeight/(double)nMmHeight; switch (nMode) { @@ -2307,6 +2275,7 @@ void wxDC::SetMapMode( m_logicalScaleY = 1.0; break; } + SIZEL vSize; ULONG ulOptions; @@ -2316,41 +2285,29 @@ void wxDC::SetMapMode( ulOptions = PU_ARBITRARY | GPIF_DEFAULT; ::GpiSetPS(m_hPS, &vSize, ulOptions); } - m_nWindowExtX = (int)MS_XDEV2LOG(VIEWPORT_EXTENT); - m_nWindowExtY = (int)MS_YDEV2LOG(VIEWPORT_EXTENT); - // ???? -}; // end of wxDC::SetMapMode + ComputeScaleAndOrigin(); + +}; // end of wxPMDCImpl::SetMapMode -void wxDC::SetUserScale( double dX, +void wxPMDCImpl::SetUserScale( double dX, double dY ) { m_userScaleX = dX; m_userScaleY = dY; SetMapMode(m_mappingMode); -} // end of wxDC::SetUserScale +} // end of wxPMDCImpl::SetUserScale -void wxDC::SetAxisOrientation( bool bXLeftRight, +void wxPMDCImpl::SetAxisOrientation( bool bXLeftRight, bool bYBottomUp ) { m_signX = bXLeftRight ? 1 : -1; m_signY = bYBottomUp ? -1 : 1; SetMapMode(m_mappingMode); -} // end of wxDC::SetAxisOrientation +} // end of wxPMDCImpl::SetAxisOrientation -void wxDC::SetSystemScale( - double dX -, double dY -) -{ - m_scaleX = dX; - m_scaleY = dY; - - SetMapMode(m_mappingMode); -} // end of wxDC::SetSystemScale - -void wxDC::SetLogicalOrigin( +void wxPMDCImpl::SetLogicalOrigin( wxCoord vX , wxCoord vY ) @@ -2367,9 +2324,9 @@ void wxDC::SetLogicalOrigin( ::GpiSetPageViewport( m_hPS ,&vRect ); -}; // end of wxDC::SetLogicalOrigin +}; // end of wxPMDCImpl::SetLogicalOrigin -void wxDC::SetDeviceOrigin( +void wxPMDCImpl::SetDeviceOrigin( wxCoord vX , wxCoord vY ) @@ -2388,68 +2345,20 @@ void wxDC::SetDeviceOrigin( ::GpiSetPageViewport( m_hPS ,&vRect ); -}; // 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); -} +}; // end of wxPMDCImpl::SetDeviceOrigin // --------------------------------------------------------------------------- // bit blit // --------------------------------------------------------------------------- -bool wxDC::DoBlit( wxCoord vXdest, +bool wxPMDCImpl::DoBlit( wxCoord vXdest, wxCoord vYdest, wxCoord vWidth, wxCoord vHeight, wxDC* pSource, wxCoord vXsrc, wxCoord vYsrc, - int nRop, + wxRasterOperationMode nRop, bool bUseMask, wxCoord WXUNUSED(vXsrcMask), wxCoord WXUNUSED(vYsrcMask) ) @@ -2459,12 +2368,21 @@ bool wxDC::DoBlit( wxCoord vXdest, COLORREF vOldTextColor; COLORREF vOldBackground = ::GpiQueryBackColor(m_hPS); + wxDCImpl *impl = pSource->GetImpl(); + wxPMDCImpl *pm_impl = wxDynamicCast( impl, wxPMDCImpl ); + if (!pm_impl) + { + // TODO: Do we want to be able to blit + // from other DCs too? + return false; + } + if (bUseMask) { - const wxBitmap& rBmp = pSource->m_vSelectedBitmap; + const wxBitmap& rBmp = pm_impl->GetSelectedBitmap(); pMask = rBmp.GetMask(); - if (!(rBmp.Ok() && pMask && pMask->GetMaskBitmap())) + if (!(rBmp.IsOk() && pMask && pMask->GetMaskBitmap())) { bUseMask = false; } @@ -2477,7 +2395,7 @@ bool wxDC::DoBlit( wxCoord vXdest, ); vOldTextColor = (COLORREF)vCbnd.lColor; - if (m_textForegroundColour.Ok()) + if (m_textForegroundColour.IsOk()) { vCbnd.lColor = (LONG)m_textForegroundColour.GetPixel(); ::GpiSetAttrs( m_hPS // presentation-space handle @@ -2487,7 +2405,7 @@ bool wxDC::DoBlit( wxCoord vXdest, ,&vCbnd // buffer for attributes. ); } - if (m_textBackgroundColour.Ok()) + if (m_textBackgroundColour.IsOk()) { ::GpiSetBackColor(m_hPS, (LONG)m_textBackgroundColour.GetPixel()); } @@ -2551,7 +2469,7 @@ bool wxDC::DoBlit( wxCoord vXdest, // create a temp buffer bitmap and DCs to access it and the mask // wxDCCacheEntry* pDCCacheEntry1 = FindDCInCache( NULL - ,pSource->GetHPS() + ,pm_impl->GetHPS() ); wxDCCacheEntry* pDCCacheEntry2 = FindDCInCache( pDCCacheEntry1 ,GetHPS() @@ -2712,7 +2630,7 @@ bool wxDC::DoBlit( wxCoord vXdest, }; bSuccess = (::GpiBitBlt( m_hPS - ,pSource->GetHPS() + ,pm_impl->GetHPS() ,4L ,aPoint ,lRop @@ -2734,60 +2652,62 @@ bool wxDC::DoBlit( wxCoord vXdest, return bSuccess; } -void wxDC::DoGetSize( - int* pnWidth -, int* pnHeight -) const +void wxPMDCImpl::DoGetSize( int* pnWidth, + int* pnHeight ) const { - LONG lArray[CAPS_HEIGHT]; + LONG lArray[CAPS_HEIGHT+1]; if(::DevQueryCaps( m_hDC ,CAPS_FAMILY - ,CAPS_HEIGHT + ,CAPS_HEIGHT+1 ,lArray )) { - *pnWidth = lArray[CAPS_WIDTH]; - *pnHeight = lArray[CAPS_HEIGHT]; + if (pnWidth) + *pnWidth = lArray[CAPS_WIDTH]; + if (pnHeight) + *pnHeight = lArray[CAPS_HEIGHT]; } -}; // end of wxDC::DoGetSize( +}; // end of wxPMDCImpl::DoGetSize( -void wxDC::DoGetSizeMM( int* pnWidth, +void wxPMDCImpl::DoGetSizeMM( int* pnWidth, int* pnHeight ) const { - LONG lArray[CAPS_VERTICAL_RESOLUTION]; + LONG lArray[CAPS_VERTICAL_RESOLUTION+1]; if(::DevQueryCaps( m_hDC ,CAPS_FAMILY - ,CAPS_VERTICAL_RESOLUTION + ,CAPS_VERTICAL_RESOLUTION+1 ,lArray )) { if(pnWidth) { - int nWidth = lArray[CAPS_WIDTH]; - int nHorzRes = lArray[CAPS_HORIZONTAL_RESOLUTION]; // returns pel/meter - *pnWidth = (nHorzRes/1000) * nWidth; + int nWidth = lArray[CAPS_WIDTH]; + int nHorzRes = lArray[CAPS_HORIZONTAL_RESOLUTION]; // returns pel/meter + // use fp to avoid returning 0 if nHorzRes < 1000 + *pnWidth = (int)((nHorzRes/1000.0) * nWidth); } if(pnHeight) { - int nHeight = lArray[CAPS_HEIGHT]; + int nHeight = lArray[CAPS_HEIGHT]; int nVertRes = lArray[CAPS_VERTICAL_RESOLUTION]; // returns pel/meter - *pnHeight = (nVertRes/1000) * nHeight; + // use fp to avoid returning 0 if nVertRes < 1000 + *pnHeight = (int)((nVertRes/1000.0) * nHeight); } } -}; // end of wxDC::DoGetSizeMM +}; // end of wxPMDCImpl::DoGetSizeMM -wxSize wxDC::GetPPI() const +wxSize wxPMDCImpl::GetPPI() const { - LONG lArray[CAPS_VERTICAL_RESOLUTION]; + LONG lArray[CAPS_VERTICAL_RESOLUTION+1]; int nWidth = 0; int nHeight = 0; if(::DevQueryCaps( m_hDC ,CAPS_FAMILY - ,CAPS_VERTICAL_RESOLUTION + ,CAPS_VERTICAL_RESOLUTION+1 ,lArray )) { @@ -2805,13 +2725,10 @@ wxSize wxDC::GetPPI() const } wxSize ppisize(nWidth, nHeight); return ppisize; -} // end of wxDC::GetPPI +} // end of wxPMDCImpl::GetPPI -void wxDC::SetLogicalScale( - double dX -, double dY -) +void wxPMDCImpl::SetLogicalScale( double dX, double dY ) { m_logicalScaleX = dX; m_logicalScaleY = dY; -}; // end of wxDC::SetLogicalScale +}; // end of wxPMDCImpl::SetLogicalScale