From 1c9a789ed98cc1db72451cb2f812954ec173b6d9 Mon Sep 17 00:00:00 2001 From: David Webster Date: Tue, 7 May 2002 22:27:10 +0000 Subject: [PATCH] More image processing updates git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15413 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/os2/bitmap.cpp | 22 ++++---- src/os2/dc.cpp | 127 ++++++++++++++++++++++++++++++++++++++----- src/os2/dcmemory.cpp | 7 ++- 3 files changed, 129 insertions(+), 27 deletions(-) diff --git a/src/os2/bitmap.cpp b/src/os2/bitmap.cpp index 944dc33188..bd7ba156d6 100644 --- a/src/os2/bitmap.cpp +++ b/src/os2/bitmap.cpp @@ -87,6 +87,10 @@ void wxBitmapRefData::Free() void wxBitmap::Init() { m_bIsMono = FALSE; + // + // True for all bitmaps created from bits, wxImages, Xpms + // + m_bFlip = TRUE; } // end of wxBitmap::Init bool wxBitmap::CopyFromIconOrCursor( @@ -265,7 +269,7 @@ wxBitmap::wxBitmap( ) { Init(); - + m_bFlip = FALSE; (void)Create( nW ,nH ,nD @@ -296,7 +300,7 @@ wxBitmap::wxBitmap( ) { Init(); - + m_bFlip = FALSE; LoadFile( rFilename ,(int)lType ); @@ -697,10 +701,6 @@ bool wxBitmap::CreateFromImage ( vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); } - // - // Debug stuff - // - hPSScreen = ::GpiCreatePS( vHabmain ,hDCScreen ,&vSize @@ -1127,7 +1127,7 @@ wxBitmap wxBitmap::GetSubBitmap( vBmih.cx = rRect.width; vBmih.cy = rRect.height; vBmih.cPlanes = 1; - vBmih.cBitCount = 1; + vBmih.cBitCount = 24; HBITMAP hBmpMask = ::GpiCreateBitmap( hPSDst ,&vBmih @@ -1292,7 +1292,7 @@ bool wxMask::Create( vBmih.cx = rBitmap.GetWidth(); vBmih.cy = rBitmap.GetHeight(); vBmih.cPlanes = 1; - vBmih.cBitCount = 1; + vBmih.cBitCount = 24; m_hMaskBitmap = ::GpiCreateBitmap( hPSDst ,&vBmih @@ -1586,12 +1586,12 @@ HBITMAP wxInvertMask( 0, 0, nWidth, nHeight }; - memset(&vBmih, '\0', sizeof(BITMAPINFOHEADER2)); - vBmih.cbFix = sizeof(BITMAPINFOHEADER2); + memset(&vBmih, '\0', 16); + vBmih.cbFix = 16; vBmih.cx = nWidth; vBmih.cy = nHeight; vBmih.cPlanes = 1; - vBmih.cBitCount = 1; + vBmih.cBitCount = 24; hBmpInvMask = ::GpiCreateBitmap( hPSDst ,&vBmih diff --git a/src/os2/dc.cpp b/src/os2/dc.cpp index 0bebb4a064..e8b4b76ba3 100644 --- a/src/os2/dc.cpp +++ b/src/os2/dc.cpp @@ -672,6 +672,16 @@ void wxDC::DoDrawLine( 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; @@ -1000,6 +1010,15 @@ void wxDC::DoDrawRectangle( 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; @@ -1069,6 +1088,9 @@ void wxDC::DoDrawRoundedRectangle( { POINTL vPoint[2]; LONG lControl; + LONG lColor; + LONG lBorderColor; + int nIsTRANSPARENT = 0; // // Might be a memory DC with no Paint rect. @@ -1078,25 +1100,73 @@ void wxDC::DoDrawRoundedRectangle( 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] + ,0L + ,0L + ); + 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] + ,0L + ,0L + ); + } + CalcBoundingBox(vX, vY); CalcBoundingBox(vX2, vY2); } // end of wxDC::DoDrawRoundedRectangle @@ -1240,17 +1310,35 @@ 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() - }; + if (rBmp.Flip()) + { + 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(); + } + else + { + vPoint[0].x = vX; + vPoint[0].y = vY; + vPoint[1].x = vX + rBmp.GetWidth(); + vPoint[1].y = vY + rBmp.GetHeight(); + vPoint[2].x = 0; + vPoint[2].y = 0; + vPoint[3].x = rBmp.GetWidth(); + vPoint[3].y = rBmp.GetHeight(); + } if (bUseMask) { wxMask* pMask = rBmp.GetMask(); @@ -1700,7 +1788,16 @@ void wxDC::DrawAnyText( m_vRclPaint.xLeft == 0)) vPtlStart.y = OS2Y(vY,vTextY); else - vPtlStart.y = vY; + { + if (m_vSelectedBitmap != wxNullBitmap) + { + m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight(); + m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth(); + vPtlStart.y = OS2Y(vY,vTextY); + } + else + vPtlStart.y = vY; + } PCH pzStr = (PCH)rsText.c_str(); diff --git a/src/os2/dcmemory.cpp b/src/os2/dcmemory.cpp index 7977733bb7..8dc8321f77 100644 --- a/src/os2/dcmemory.cpp +++ b/src/os2/dcmemory.cpp @@ -146,9 +146,14 @@ void wxMemoryDC::SelectObject( (rBitmap.GetSelectedInto() == this), wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") ); + WXHBITMAP hBmp = rBitmap.GetHBITMAP(); + + if (!hBmp) + { + m_vSelectedBitmap.SetSelectedInto(NULL); + } m_vSelectedBitmap = rBitmap; - WXHBITMAP hBmp = rBitmap.GetHBITMAP(); if (!hBmp) { -- 2.45.2