X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/19193a2c85987b595932957e73013e7ea100f0e8..9fd9e47a93dfcdd99c2722e288a0f28a51ce6f5f:/src/os2/dc.cpp diff --git a/src/os2/dc.cpp b/src/os2/dc.cpp index d2fe58841f..9a58657da1 100644 --- a/src/os2/dc.cpp +++ b/src/os2/dc.cpp @@ -542,10 +542,22 @@ int wxDC::GetDepth() const void wxDC::Clear() { + // + // If this is a canvas DC then just fill with the background color + // Otherwise purge the whole thing + // + if (m_pCanvas) + { + RECTL vRect; + + ::GpiQueryClipBox(m_hPS, &vRect); + ::WinFillRect(m_hPS, &vRect, ::GpiQueryBackColor(m_hPS)); + } + else ::GpiErase(m_hPS); } // end of wxDC::Clear -void wxDC::DoFloodFill( +bool wxDC::DoFloodFill( wxCoord vX , wxCoord vY , const wxColour& rCol @@ -555,6 +567,8 @@ void wxDC::DoFloodFill( POINTL vPtlPos; LONG lColor; LONG lOptions; + LONG lHits; + bool bSuccess = FALSE; vPtlPos.x = vX; // Loads x-coordinate vPtlPos.y = OS2Y(vY,0); // Loads y-coordinate @@ -564,7 +578,9 @@ void wxDC::DoFloodFill( if(wxFLOOD_SURFACE == nStyle) lOptions = FF_SURFACE; - ::GpiFloodFill(m_hPS, lOptions, lColor); + if ((lHits = ::GpiFloodFill(m_hPS, lOptions, lColor)) != GPI_ERROR) + bSuccess = TRUE; + return TRUE; } // end of wxDC::DoFloodFill bool wxDC::DoGetPixel( @@ -962,7 +978,14 @@ void wxDC::DoDrawRectangle( 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); wxCoord vX2 = vX + vWidth; wxCoord vY2 = vY + vHeight; @@ -1017,6 +1040,54 @@ void wxDC::DoDrawRectangle( ,0L ,0L ); + // + // Debug testing: + // + if (m_vSelectedBitmap != wxNullBitmap) + { + BITMAPINFOHEADER2 vHeader; + BITMAPINFO2 vInfo; + + vHeader.cbFix = 16L; + if (::GpiQueryBitmapInfoHeader(m_hPS, &vHeader)) + { + int nBytesPerLine = vHeader.cBitCount/8; + unsigned char* pucData = NULL; + unsigned char* pucBits; + LONG lScans = 0L; + + vInfo.cbFix = 16; + vInfo.cx = vHeader.cx; + vInfo.cy = vHeader.cy; + vInfo.cPlanes = vHeader.cPlanes; + vInfo.cBitCount = vHeader.cBitCount; + pucData = (unsigned char*)malloc(nBytesPerLine * vHeight); + pucBits = pucData; + for (int i = 0; i < vHeight; i++) + { + if (i <= m_vSelectedBitmap.GetHeight()) + { + for (int j = 0; j < vWidth; j++) + { + if (j <= m_vSelectedBitmap.GetWidth()) + { + vPoint[0].x = j; vPoint[0].y = i; + lColor = ::GpiQueryPel(m_hPS, &vPoint[0]); + *(pucBits++) = lColor >> 24; + *(pucBits++) = lColor >> 16; + *(pucBits++) = lColor >> 8; + } + } + } + } + lScans = ::GpiSetBitmapBits( m_hPS + ,0 // Start at the bottom + ,(LONG)vHeight // One line per scan + ,(PBYTE)pucData + ,&vInfo + ); + } + } } CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); @@ -1186,16 +1257,51 @@ void wxDC::DoDrawBitmap( , bool bUseMask ) { - POINTL vPoint = {vX, vY}; + if (!bUseMask && !IsKindOf(CLASSINFO(wxPrinterDC))) + { + HBITMAP hBitmap = (HBITMAP)rBmp.GetHBITMAP(); + wxBitmap vNewBitmap( rBmp.GetWidth() + ,rBmp.GetHeight() + ,rBmp.GetDepth() + ); + HBITMAP hBitmapOld = ::GpiSetBitmap((HPS)GetHPS(), vNewBitmap.GetHBITMAP()); + LONG lOldTextground = ::GpiQueryColor((HPS)GetHPS()); + LONG lOldBackground = ::GpiQueryBackColor((HPS)GetHPS()); + + if (m_textForegroundColour.Ok()) + { + ::GpiSetColor( (HPS)GetHPS() + ,m_textForegroundColour.GetPixel() + ); + } + if (m_textBackgroundColour.Ok()) + { + ::GpiSetBackColor( (HPS)GetHPS() + ,m_textBackgroundColour.GetPixel() + ); + } - ::WinDrawBitmap( GetHPS() - ,(HBITMAP)GetHbitmapOf(rBmp) - ,NULL - ,&vPoint - ,0L - ,0L - ,DBM_NORMAL - ); + 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() + }; + ::GpiWCBitBlt( (HPS)GetHPS() + ,hBitmap + ,4 + ,vPoint + ,ROP_SRCCOPY + ,BBO_IGNORE + ); + ::GpiSetBitmap((HPS)GetHPS(), hBitmapOld); + ::GpiSetColor((HPS)GetHPS(), lOldTextground); + ::GpiSetBackColor((HPS)GetHPS(), lOldBackground); + } } // end of wxDC::DoDrawBitmap void wxDC::DoDrawText( @@ -1354,6 +1460,52 @@ void wxDC::DoDrawRotatedText( // set GDI objects // --------------------------------------------------------------------------- +void wxDC::DoSelectPalette( + bool bRealize +) +{ + // + // Set the old object temporarily, in case the assignment deletes an object + // that's not yet selected out. + // + if (m_hOldPalette) + { + m_hOldPalette = 0; + } + + if (m_palette.Ok()) + { + HPALETTE hOldPal; + + hOldPal = ::GpiSelectPalette((HDC) m_hPS, (HPALETTE) m_palette.GetHPALETTE()); + if (!m_hOldPalette) + m_hOldPalette = (WXHPALETTE)hOldPal; + } +} // end of wxDC::DoSelectPalette + +void wxDC::InitializePalette() +{ + if (wxDisplayDepth() <= 8 ) + { + // + // Look for any window or parent that has a custom palette. If any has + // one then we need to use it in drawing operations + // + wxWindow* pWin = m_pCanvas->GetAncestorWithCustomPalette(); + + m_hasCustomPalette = pWin && pWin->HasCustomPalette(); + if (m_hasCustomPalette) + { + m_palette = pWin->GetPalette(); + + // + // turn on PM translation for this palette + // + DoSelectPalette(); + } + } +} // end of wxDC::InitializePalette + void wxDC::SetPalette( const wxPalette& rPalette ) @@ -1796,8 +1948,8 @@ void wxDC::SetMapMode( ulOptions = PU_ARBITRARY | GPIF_DEFAULT; ::GpiSetPS(m_hPS, &vSize, ulOptions); } - m_nWindowExtX = (int)MS_XDEV2LOGREL(VIEWPORT_EXTENT); - m_nWindowExtY = (int)MS_YDEV2LOGREL(VIEWPORT_EXTENT); + m_nWindowExtX = (int)MS_XDEV2LOG(VIEWPORT_EXTENT); + m_nWindowExtY = (int)MS_YDEV2LOG(VIEWPORT_EXTENT); // ???? }; // end of wxDC::SetMapMode @@ -1885,7 +2037,8 @@ wxCoord wxDCBase::DeviceToLogicalX(wxCoord x) const wxCoord wxDCBase::DeviceToLogicalXRel(wxCoord x) const { - return (wxCoord) ((x)/(m_logicalScaleX*m_userScaleX*m_signX*m_scaleX)); + // 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 @@ -1895,7 +2048,8 @@ wxCoord wxDCBase::DeviceToLogicalY(wxCoord y) const wxCoord wxDCBase::DeviceToLogicalYRel(wxCoord y) const { - return (wxCoord) ((y)/(m_logicalScaleY*m_userScaleY*m_signY*m_scaleY)); + // 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 @@ -1905,7 +2059,8 @@ wxCoord wxDCBase::LogicalToDeviceX(wxCoord x) const wxCoord wxDCBase::LogicalToDeviceXRel(wxCoord x) const { - return (wxCoord) (x*m_logicalScaleX*m_userScaleX*m_signX*m_scaleX); + // 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 @@ -1915,7 +2070,8 @@ wxCoord wxDCBase::LogicalToDeviceY(wxCoord y) const wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const { - return (wxCoord) (y*m_logicalScaleY*m_userScaleY*m_signY*m_scaleY); + // axis orientation is not taken into account for conversion of a distance + return (wxCoord) (y*m_logicalScaleY*m_userScaleY*m_scaleY); } // ---------------------------------------------------------------------------