More image updates

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15407 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2002-05-07 17:03:18 +00:00
parent b4efce5efa
commit d6d749aaeb

View File

@@ -659,14 +659,28 @@ void wxDC::DoDrawLine(
) )
{ {
POINTL vPoint[2]; POINTL vPoint[2];
COLORREF vColor = 0x00ffffff;
//
// 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); vY1 = OS2Y(vY1,0);
vY2 = OS2Y(vY2,0); vY2 = OS2Y(vY2,0);
}
vPoint[0].x = vX1; vPoint[0].x = vX1;
vPoint[0].y = vY1; vPoint[0].y = vY1;
vPoint[1].x = vX2; vPoint[1].x = vX2;
vPoint[1].y = vY2; vPoint[1].y = vY2;
if (m_pen.Ok())
{
vColor = m_pen.GetColour().GetPixel();
}
::GpiSetColor(m_hPS, vColor);
::GpiMove(m_hPS, &vPoint[0]); ::GpiMove(m_hPS, &vPoint[0]);
::GpiLine(m_hPS, &vPoint[1]); ::GpiLine(m_hPS, &vPoint[1]);
CalcBoundingBox(vX1, vY1); CalcBoundingBox(vX1, vY1);
@@ -979,7 +993,7 @@ void wxDC::DoDrawRectangle(
int nIsTRANSPARENT = 0; 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 && if (!(m_vRclPaint.yTop == 0 &&
m_vRclPaint.yBottom == 0 && m_vRclPaint.yBottom == 0 &&
@@ -1056,6 +1070,13 @@ void wxDC::DoDrawRoundedRectangle(
POINTL vPoint[2]; POINTL vPoint[2];
LONG lControl; LONG lControl;
//
// 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); vY = OS2Y(vY,vHeight);
wxCoord vX2 = (vX + vWidth); wxCoord vX2 = (vX + vWidth);
@@ -1248,6 +1269,7 @@ void wxDC::DoDrawBitmap(
// 5) Blit this to the screen PS // 5) Blit this to the screen PS
// //
HBITMAP hMask = (HBITMAP)pMask->GetMaskBitmap(); HBITMAP hMask = (HBITMAP)pMask->GetMaskBitmap();
HBITMAP hOldMask = NULLHANDLE;
HBITMAP hOldBitmap = NULLHANDLE; HBITMAP hOldBitmap = NULLHANDLE;
HBITMAP hNewBitmap = NULLHANDLE; HBITMAP hNewBitmap = NULLHANDLE;
unsigned char* pucBits; // buffer that will contain the bitmap data unsigned char* pucBits; // buffer that will contain the bitmap data
@@ -1274,10 +1296,6 @@ void wxDC::DoDrawBitmap(
memset(&vHeader, '\0', 16); memset(&vHeader, '\0', 16);
vHeader.cbFix = 16; vHeader.cbFix = 16;
vHeader.cx = (ULONG)rBmp.GetWidth();
vHeader.cy = (ULONG)rBmp.GetHeight();
vHeader.cPlanes = 1L;
vHeader.cBitCount = 24;
memset(&vInfo, '\0', 16); memset(&vInfo, '\0', 16);
vInfo.cbFix = 16; vInfo.cbFix = 16;
@@ -1334,6 +1352,8 @@ void wxDC::DoDrawBitmap(
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); sError = wxPMErrorToStr(vError);
} }
::GpiQueryBitmapInfoHeader(hBitmap, &vHeader);
vInfo.cBitCount = 24;
if ((lScans = ::GpiQueryBitmapBits( hPS if ((lScans = ::GpiQueryBitmapBits( hPS
,0L ,0L
,(LONG)rBmp.GetHeight() ,(LONG)rBmp.GetHeight()
@@ -1344,11 +1364,13 @@ void wxDC::DoDrawBitmap(
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); sError = wxPMErrorToStr(vError);
} }
if ((hOldBitmap = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR) if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR)
{ {
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); sError = wxPMErrorToStr(vError);
} }
::GpiQueryBitmapInfoHeader(hMask, &vHeader);
vInfo.cBitCount = 24;
if ((lScans = ::GpiQueryBitmapBits( hPS if ((lScans = ::GpiQueryBitmapBits( hPS
,0L ,0L
,(LONG)rBmp.GetHeight() ,(LONG)rBmp.GetHeight()
@@ -1359,6 +1381,11 @@ void wxDC::DoDrawBitmap(
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError); 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 // Now set the bytes(bits) according to the mask values
@@ -1367,12 +1394,20 @@ void wxDC::DoDrawBitmap(
pucData = pucBits; pucData = pucBits;
pucDataMask = pucBitsMask; 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 (i = 0; i < rBmp.GetHeight(); i++)
{ {
for (j = 0; j < rBmp.GetWidth(); j++) for (j = 0; j < rBmp.GetWidth(); j++)
{ {
// Byte 1 // 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++; pucData++;
else else
{ {
@@ -1380,7 +1415,9 @@ void wxDC::DoDrawBitmap(
pucData++; pucData++;
} }
// Byte 2 // 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++; pucData++;
else else
{ {
@@ -1389,7 +1426,9 @@ void wxDC::DoDrawBitmap(
} }
// Byte 3 // 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++; pucData++;
else else
{ {
@@ -1407,6 +1446,10 @@ void wxDC::DoDrawBitmap(
// //
// Create a new bitmap // Create a new bitmap
// //
vHeader.cx = (ULONG)rBmp.GetWidth();
vHeader.cy = (ULONG)rBmp.GetHeight();
vHeader.cPlanes = 1L;
vHeader.cBitCount = 24;
if ((hNewBitmap = ::GpiCreateBitmap( hPS if ((hNewBitmap = ::GpiCreateBitmap( hPS
,&vHeader ,&vHeader
,CBM_INIT ,CBM_INIT
@@ -1439,6 +1482,7 @@ void wxDC::DoDrawBitmap(
free(pucBits); free(pucBits);
free(pucBitsMask); free(pucBitsMask);
::GpiSetBitmap(hPS, NULLHANDLE); ::GpiSetBitmap(hPS, NULLHANDLE);
::GpiDeleteBitmap(hNewBitmap);
::GpiDestroyPS(hPS); ::GpiDestroyPS(hPS);
::DevCloseDC(hDC); ::DevCloseDC(hDC);
} }
@@ -1650,12 +1694,20 @@ void wxDC::DrawAnyText(
,&vTextY ,&vTextY
); );
vPtlStart.x = vX; vPtlStart.x = vX;
if (!(m_vRclPaint.yTop == 0 &&
m_vRclPaint.yBottom == 0 &&
m_vRclPaint.xRight == 0 &&
m_vRclPaint.xLeft == 0))
vPtlStart.y = OS2Y(vY,vTextY); vPtlStart.y = OS2Y(vY,vTextY);
else
vPtlStart.y = vY;
lHits = ::GpiCharStringAt( m_hPS PCH pzStr = (PCH)rsText.c_str();
,&vPtlStart
::GpiMove(m_hPS, &vPtlStart);
lHits = ::GpiCharString( m_hPS
,rsText.length() ,rsText.length()
,(PCH)rsText.c_str() ,pzStr
); );
if (lHits != GPI_OK) if (lHits != GPI_OK)
{ {