#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 <string.h>
)
{
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);
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;
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
{
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
{
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();
// 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
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;
//
// 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();
vError = ::WinGetLastError(vHabmain);
sError = wxPMErrorToStr(vError);
}
+ ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader);
+ vInfo.cBitCount = 24;
if ((lScans = ::GpiQueryBitmapBits( hPS
,0L
,(LONG)rBmp.GetHeight()
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()
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
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
{
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
{
}
// 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
{
//
// 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
free(pucBits);
free(pucBitsMask);
::GpiSetBitmap(hPS, NULLHANDLE);
+ ::GpiDeleteBitmap(hNewBitmap);
::GpiDestroyPS(hPS);
::DevCloseDC(hDC);
}
,&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"));
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);
}
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
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
+