X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/29172908bf90ddd8b70c5195b870745b5af3b7a3..727953356df2db52b0292589782175fd6de37e03:/src/os2/dc.cpp?ds=sidebyside diff --git a/src/os2/dc.cpp b/src/os2/dc.cpp index 16cffe65c0..dfdcab5f4c 100644 --- a/src/os2/dc.cpp +++ b/src/os2/dc.cpp @@ -23,9 +23,12 @@ #include "wx/log.h" #include "wx/icon.h" #include "wx/msgdlg.h" - #include "wx/module.h" +#if wxUSE_STATUSBAR + #include "wx/statusbr.h" +#endif #endif +#include "wx/module.h" #include "wx/dcprint.h" #include @@ -659,14 +662,38 @@ void wxDC::DoDrawLine( ) { POINTL vPoint[2]; + COLORREF vColor = 0x00ffffff; - vY1 = OS2Y(vY1,0); - vY2 = OS2Y(vY2,0); - + // + // Might be a memory DC with no Paint rect. + // + if (!(m_vRclPaint.yTop == 0 && + m_vRclPaint.yBottom == 0 && + m_vRclPaint.xRight == 0 && + m_vRclPaint.xLeft == 0)) + { + vY1 = OS2Y(vY1,0); + vY2 = OS2Y(vY2,0); + } + else + { + if (m_vSelectedBitmap != wxNullBitmap) + { + m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); + m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); + vY1 = OS2Y(vY1,0); + vY2 = OS2Y(vY2,0); + } + } vPoint[0].x = vX1; vPoint[0].y = vY1; vPoint[1].x = vX2; vPoint[1].y = vY2; + if (m_pen.Ok()) + { + vColor = m_pen.GetColour().GetPixel(); + } + ::GpiSetColor(m_hPS, vColor); ::GpiMove(m_hPS, &vPoint[0]); ::GpiLine(m_hPS, &vPoint[1]); CalcBoundingBox(vX1, vY1); @@ -979,13 +1006,22 @@ void wxDC::DoDrawRectangle( int nIsTRANSPARENT = 0; // - // Might be a memory DC with no Paint rect + // Might be a memory DC with no Paint rect. // if (!(m_vRclPaint.yTop == 0 && m_vRclPaint.yBottom == 0 && m_vRclPaint.xRight == 0 && m_vRclPaint.xLeft == 0)) vY = OS2Y(vY,vHeight); + else + { + if (m_vSelectedBitmap != wxNullBitmap) + { + m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); + m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); + vY = OS2Y(vY,vHeight); + } + } wxCoord vX2 = vX + vWidth; wxCoord vY2 = vY + vHeight; @@ -1005,7 +1041,7 @@ void wxDC::DoDrawRectangle( if(m_brush.GetStyle() == wxTRANSPARENT) lControl = DRO_OUTLINE; - ::GpiSetColor(m_hPS, lColor); + ::GpiSetColor(m_hPS, lBorderColor); ::GpiBox( m_hPS // handle to a presentation space ,lControl // draw the box outline ? or ? ,&vPoint[1] // address of the corner @@ -1055,27 +1091,85 @@ void wxDC::DoDrawRoundedRectangle( { POINTL vPoint[2]; LONG lControl; + LONG lColor; + LONG lBorderColor; + int nIsTRANSPARENT = 0; - vY = OS2Y(vY,vHeight); + // + // Might be a memory DC with no Paint rect. + // + if (!(m_vRclPaint.yTop == 0 && + m_vRclPaint.yBottom == 0 && + m_vRclPaint.xRight == 0 && + m_vRclPaint.xLeft == 0)) + vY = OS2Y(vY,vHeight); + else + { + if (m_vSelectedBitmap != wxNullBitmap) + { + m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); + m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); + vY = OS2Y(vY,vHeight); + } + } wxCoord vX2 = (vX + vWidth); wxCoord vY2 = (vY + vHeight); vPoint[0].x = vX; - vPoint[0].y = YLOG2DEV(vY) - vHeight; - vPoint[1].x = vX + vWidth; - vPoint[1].y = vY; + vPoint[0].y = vY; + vPoint[1].x = vX + vWidth - 1; + vPoint[1].y = vY + vHeight - 1; ::GpiMove(m_hPS, &vPoint[0]); + lColor = m_brush.GetColour().GetPixel(); + lBorderColor = m_pen.GetColour().GetPixel(); lControl = DRO_OUTLINEFILL; //DRO_FILL; if (m_brush.GetStyle() == wxTRANSPARENT) + nIsTRANSPARENT = 1; + if(lColor == lBorderColor || nIsTRANSPARENT) + { + lControl = DRO_OUTLINEFILL; //DRO_FILL; + if(m_brush.GetStyle() == wxTRANSPARENT) + lControl = DRO_OUTLINE; + + ::GpiSetColor(m_hPS, lColor); + ::GpiBox( m_hPS // handle to a presentation space + ,lControl // draw the box outline ? or ? + ,&vPoint[1] // address of the corner + ,(LONG)dRadius // horizontal corner radius + ,(LONG)dRadius // vertical corner radius + ); + } + else + { lControl = DRO_OUTLINE; - ::GpiBox( m_hPS // handle to a presentation space - ,DRO_OUTLINE // draw the box outline ? or ? - ,&vPoint[1] // address of the corner - ,(LONG)dRadius // horizontal corner radius - ,(LONG)dRadius // vertical corner radius - ); + ::GpiSetColor( m_hPS + ,lBorderColor + ); + ::GpiBox( m_hPS + ,lControl + ,&vPoint[1] + ,(LONG)dRadius + ,(LONG)dRadius + ); + lControl = DRO_FILL; + ::GpiSetColor( m_hPS + ,lColor + ); + vPoint[0].x = vX + 1; + vPoint[0].y = vY + 1; + vPoint[1].x = vX + vWidth - 2; + vPoint[1].y = vY + vHeight - 2; + ::GpiMove(m_hPS, &vPoint[0]); + ::GpiBox( m_hPS + ,lControl + ,&vPoint[1] + ,(LONG)dRadius + ,(LONG)dRadius + ); + } + CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); } // end of wxDC::DoDrawRoundedRectangle @@ -1219,17 +1313,18 @@ void wxDC::DoDrawBitmap( { HBITMAP hBitmap = (HBITMAP)rBmp.GetHBITMAP(); HBITMAP hBitmapOld; + POINTL vPoint[4]; vY = OS2Y(vY,rBmp.GetHeight()); - // - // Flip the picture as OS/2 is upside-down - // - POINTL vPoint[4] = { vX, vY + rBmp.GetHeight() - ,vX + rBmp.GetWidth(), vY - ,0, 0 - ,rBmp.GetWidth(), rBmp.GetHeight() - }; + vPoint[0].x = vX; + vPoint[0].y = vY + rBmp.GetHeight(); + vPoint[1].x = vX + rBmp.GetWidth(); + vPoint[1].y = vY; + vPoint[2].x = 0; + vPoint[2].y = 0; + vPoint[3].x = rBmp.GetWidth(); + vPoint[3].y = rBmp.GetHeight(); if (bUseMask) { wxMask* pMask = rBmp.GetMask(); @@ -1248,6 +1343,7 @@ void wxDC::DoDrawBitmap( // 5) Blit this to the screen PS // HBITMAP hMask = (HBITMAP)pMask->GetMaskBitmap(); + HBITMAP hOldMask = NULLHANDLE; HBITMAP hOldBitmap = NULLHANDLE; HBITMAP hNewBitmap = NULLHANDLE; unsigned char* pucBits; // buffer that will contain the bitmap data @@ -1274,10 +1370,6 @@ void wxDC::DoDrawBitmap( memset(&vHeader, '\0', 16); vHeader.cbFix = 16; - vHeader.cx = (ULONG)rBmp.GetWidth(); - vHeader.cy = (ULONG)rBmp.GetHeight(); - vHeader.cPlanes = 1L; - vHeader.cBitCount = 24; memset(&vInfo, '\0', 16); vInfo.cbFix = 16; @@ -1301,11 +1393,11 @@ void wxDC::DoDrawBitmap( // // Need to get a background color for mask blitting // - if (IsKindOf(CLASSINFO(wxPaintDC))) + if (IsKindOf(CLASSINFO(wxWindowDC))) { - wxPaintDC* pPaintDC = wxDynamicCast(this, wxPaintDC); + wxWindowDC* pWindowDC = wxDynamicCast(this, wxWindowDC); - lColor = pPaintDC->m_pCanvas->GetBackgroundColour().GetPixel(); + lColor = pWindowDC->m_pCanvas->GetBackgroundColour().GetPixel(); } else if (GetBrush() != wxNullBrush) lColor = GetBrush().GetColour().GetPixel(); @@ -1334,6 +1426,8 @@ void wxDC::DoDrawBitmap( vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } + ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader); + vInfo.cBitCount = 24; if ((lScans = ::GpiQueryBitmapBits( hPS ,0L ,(LONG)rBmp.GetHeight() @@ -1344,11 +1438,13 @@ void wxDC::DoDrawBitmap( vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } - if ((hOldBitmap = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR) + if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR) { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } + ::GpiQueryBitmapInfoHeader(hMask, &vHeader); + vInfo.cBitCount = 24; if ((lScans = ::GpiQueryBitmapBits( hPS ,0L ,(LONG)rBmp.GetHeight() @@ -1359,6 +1455,11 @@ void wxDC::DoDrawBitmap( vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } + if (( hMask = ::GpiSetBitmap(hPS, hOldMask)) == HBM_ERROR) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } // // Now set the bytes(bits) according to the mask values @@ -1367,12 +1468,20 @@ void wxDC::DoDrawBitmap( pucData = pucBits; pucDataMask = pucBitsMask; + // + // 16 bit kludge really only kinda works. The mask gets applied + // where needed but the original bitmap bits are dorked sometimes + // + bool bpp16 = (wxDisplayDepth() == 16); + for (i = 0; i < rBmp.GetHeight(); i++) { for (j = 0; j < rBmp.GetWidth(); j++) { // Byte 1 - if (*pucDataMask == 0xFF) // leave bitmap byte alone + if (bpp16 && *pucDataMask == 0xF8) // 16 bit display gobblygook + pucData++; + else if (*pucDataMask == 0xFF) // leave bitmap byte alone pucData++; else { @@ -1380,7 +1489,9 @@ void wxDC::DoDrawBitmap( pucData++; } // Byte 2 - if (*(pucDataMask + 1) == 0xFF) // leave bitmap byte alone + if (bpp16 && *(pucDataMask + 1) == 0xFC) // 16 bit display gobblygook + pucData++; + else if (*(pucDataMask + 1) == 0xFF) // leave bitmap byte alone pucData++; else { @@ -1389,7 +1500,9 @@ void wxDC::DoDrawBitmap( } // Byte 3 - if (*(pucDataMask + 2) == 0xFF) // leave bitmap byte alone + if (bpp16 && *(pucDataMask + 2) == 0xF8) // 16 bit display gobblygook + pucData++; + else if (*(pucDataMask + 2) == 0xFF) // leave bitmap byte alone pucData++; else { @@ -1407,6 +1520,10 @@ void wxDC::DoDrawBitmap( // // Create a new bitmap // + vHeader.cx = (ULONG)rBmp.GetWidth(); + vHeader.cy = (ULONG)rBmp.GetHeight(); + vHeader.cPlanes = 1L; + vHeader.cBitCount = 24; if ((hNewBitmap = ::GpiCreateBitmap( hPS ,&vHeader ,CBM_INIT @@ -1439,6 +1556,7 @@ void wxDC::DoDrawBitmap( free(pucBits); free(pucBitsMask); ::GpiSetBitmap(hPS, NULLHANDLE); + ::GpiDeleteBitmap(hNewBitmap); ::GpiDestroyPS(hPS); ::DevCloseDC(hDC); } @@ -1650,13 +1768,41 @@ void wxDC::DrawAnyText( ,&vTextY ); vPtlStart.x = vX; - vPtlStart.y = OS2Y(vY,vTextY); + 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 = OS2Y(vY,vTextY/1.5); // Full extent is a bit much + } + else + { + if (m_vSelectedBitmap != wxNullBitmap) + { + 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 = OS2Y(vY,vTextY/1.5); + } + else + vPtlStart.y = vY; + } - lHits = ::GpiCharStringAt( m_hPS - ,&vPtlStart - ,rsText.length() - ,(PCH)rsText.c_str() - ); + PCH pzStr = (PCH)rsText.c_str(); + + ::GpiMove(m_hPS, &vPtlStart); + lHits = ::GpiCharString( m_hPS + ,rsText.length() + ,pzStr + ); if (lHits != GPI_OK) { wxLogLastError(wxT("TextOut")); @@ -2502,25 +2648,25 @@ bool wxDC::DoBlit( hBufBitmap = ::GpiCreateBitmap(GetHPS(), &vBmpHdr, 0L, NULL, NULL); } - POINTL aPoint1[4] = { 0, 0 - ,vWidth, vHeight - ,vXdest, vYdest - ,vXdest + vWidth, vYdest + vHeight + POINTL aPoint1[4] = { {0, 0} + ,{vWidth, vHeight} + ,{vXdest, vYdest} + ,{vXdest + vWidth, vYdest + vHeight} }; - POINTL aPoint2[4] = { 0, 0 - ,vWidth, vHeight - ,vXsrc, vYsrc - ,vXsrc + vWidth, vYsrc + vHeight + POINTL aPoint2[4] = { {0, 0} + ,{vWidth, vHeight} + ,{vXsrc, vYsrc} + ,{vXsrc + vWidth, vYsrc + vHeight} }; - POINTL aPoint3[4] = { vXdest, vYdest - ,vXdest + vWidth, vYdest + vHeight - ,vXsrc, vYsrc - ,vXsrc + vWidth, vYsrc + vHeight + POINTL aPoint3[4] = { {vXdest, vYdest} + ,{vXdest + vWidth, vYdest + vHeight} + ,{vXsrc, vYsrc} + ,{vXsrc + vWidth, vYsrc + vHeight} }; - POINTL aPoint4[4] = { vXdest, vYdest - ,vXdest + vWidth, vYdest + vHeight - ,0, 0 - ,vWidth, vHeight + POINTL aPoint4[4] = { {vXdest, vYdest} + ,{vXdest + vWidth, vYdest + vHeight} + ,{0, 0} + ,{vWidth, vHeight} }; ::GpiSetBitmap(hPSMask, (HBITMAP) pMask->GetMaskBitmap()); ::GpiSetBitmap(hPSBuffer, (HBITMAP) hBufBitmap); @@ -2631,10 +2777,10 @@ bool wxDC::DoBlit( } else // no mask, just BitBlt() it { - POINTL aPoint[4] = { vXdest, vYdest - ,vXdest + vWidth, vYdest + vHeight - ,vXsrc, vYsrc - ,vXsrc + vWidth, vYsrc + vHeight + POINTL aPoint[4] = { {vXdest, vYdest} + ,{vXdest + vWidth, vYdest + vHeight} + ,{vXsrc, vYsrc} + ,{vXsrc + vWidth, vYsrc + vHeight} }; bSuccess = (::GpiBitBlt( m_hPS @@ -2741,18 +2887,5 @@ void wxDC::SetLogicalScale( m_logicalScaleY = dY; }; // end of wxDC::SetLogicalScale -#if WXWIN_COMPATIBILITY -void wxDC::DoGetTextExtent(const wxString& string, float *x, float *y, - float *descent, float *externalLeading, - wxFont *theFont, bool use16bit) const -{ - wxCoord x1, y1, descent1, externalLeading1; - GetTextExtent(string, & x1, & y1, & descent1, & externalLeading1, theFont, use16bit); - *x = x1; *y = y1; - if (descent) - *descent = descent1; - if (externalLeading) - *externalLeading = externalLeading1; -} -#endif +