More image processing updates

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@15413 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2002-05-07 22:27:10 +00:00
parent d84afea9d1
commit 1c9a789ed9
3 changed files with 129 additions and 27 deletions

View File

@@ -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

View File

@@ -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
,DRO_OUTLINE // draw the box outline ? or ?
,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;
::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();
@@ -1699,8 +1787,17 @@ void wxDC::DrawAnyText(
m_vRclPaint.xRight == 0 &&
m_vRclPaint.xLeft == 0))
vPtlStart.y = OS2Y(vY,vTextY);
else
{
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();

View File

@@ -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)
{