- // New code from Chris Breeze, 15/7/98
- // Blit bitmap with mask
-
- if (IsKindOf(CLASSINFO(wxPrinterDC)))
- {
- // If we are printing source colours are screen colours
- // not printer colours and so we need copy the bitmap
- // pixel by pixel.
- RECT rect;
- HDC dc_mask = ::CreateCompatibleDC((HDC) source->m_hDC);
- HDC dc_src = (HDC) source->m_hDC;
-
- ::SelectObject(dc_mask, (HBITMAP) source->m_selectedBitmap.GetMask()->GetMaskBitmap());
- for (int x = 0; x < width; x++)
- {
- for (int y = 0; y < height; y++)
- {
- COLORREF cref = ::GetPixel(dc_mask, x, y);
- if (cref)
- {
- HBRUSH brush = ::CreateSolidBrush(::GetPixel(dc_src, x, y));
- rect.left = xdest1 + x; rect.right = rect.left + 1;
- rect.top = ydest1 + y; rect.bottom = rect.top + 1;
- ::FillRect((HDC) m_hDC, &rect, brush);
- ::DeleteObject(brush);
- }
- }
- }
- ::SelectObject(dc_mask, 0);
- ::DeleteDC(dc_mask);
- }
- else
- {
- // create a temp buffer bitmap and DCs to access it and the mask
- HDC dc_mask = ::CreateCompatibleDC((HDC) source->m_hDC);
- HDC dc_buffer = ::CreateCompatibleDC((HDC) m_hDC);
- HBITMAP buffer_bmap = ::CreateCompatibleBitmap((HDC) m_hDC, width, height);
- ::SelectObject(dc_mask, (HBITMAP) source->m_selectedBitmap.GetMask()->GetMaskBitmap());
- ::SelectObject(dc_buffer, buffer_bmap);
-
- // copy dest to buffer
- ::BitBlt(dc_buffer, 0, 0, (int)width, (int)height,
- (HDC) m_hDC, xdest1, ydest1, SRCCOPY);
-
- // copy src to buffer using selected raster op
- ::BitBlt(dc_buffer, 0, 0, (int)width, (int)height,
- (HDC) source->m_hDC, xsrc1, ysrc1, dwRop);
-
- // set masked area in buffer to BLACK (pixel value 0)
- COLORREF prevBkCol = ::SetBkColor((HDC) m_hDC, RGB(255, 255, 255));
- COLORREF prevCol = ::SetTextColor((HDC) m_hDC, RGB(0, 0, 0));
- ::BitBlt(dc_buffer, 0, 0, (int)width, (int)height,
- dc_mask, xsrc1, ysrc1, SRCAND);
-
- // set unmasked area in dest to BLACK
- ::SetBkColor((HDC) m_hDC, RGB(0, 0, 0));
- ::SetTextColor((HDC) m_hDC, RGB(255, 255, 255));
- ::BitBlt((HDC) m_hDC, xdest1, ydest1, (int)width, (int)height,
- dc_mask, xsrc1, ysrc1, SRCAND);
- ::SetBkColor((HDC) m_hDC, prevBkCol); // restore colours to original values
- ::SetTextColor((HDC) m_hDC, prevCol);
-
- // OR buffer to dest
- success = (::BitBlt((HDC) m_hDC, xdest1, ydest1, (int)width, (int)height,
- dc_buffer, 0, 0, SRCPAINT) != 0);
-
- // tidy up temporary DCs and bitmap
- ::SelectObject(dc_mask, 0);
- ::DeleteDC(dc_mask);
- ::SelectObject(dc_buffer, 0);
- ::DeleteDC(dc_buffer);
- ::DeleteObject(buffer_bmap);
- }
- }
- }
- else
- {
- if (IsKindOf(CLASSINFO(wxPrinterDC)))
- {
- // If we are printing source colours are screen colours
- // not printer colours and so we need copy the bitmap
- // pixel by pixel.
- HDC dc_src = (HDC) source->m_hDC;
- RECT rect;
- for (int x = 0; x < width; x++)
- {
- for (int y = 0; y < height; y++)
- {
- HBRUSH brush = ::CreateSolidBrush(::GetPixel(dc_src, x, y));
- rect.left = xdest1 + x; rect.right = rect.left + 1;
- rect.top = ydest1 + y; rect.bottom = rect.top + 1;
- ::FillRect((HDC) m_hDC, &rect, brush);
- ::DeleteObject(brush);
- }
- }
- }
- else
- {
- success = (BitBlt((HDC) m_hDC, xdest1, ydest1, (int)width, (int)height, (HDC) source->m_hDC,
- xsrc1, ysrc1, dwRop) != 0);
- }
- }
- ::SetTextColor((HDC)m_hDC, old_textground);
- ::SetBkColor((HDC)m_hDC, old_background);
-
- return success;
-}
-
-void wxDC::GetSize(int* width, int* height) const
-{
- long w=::GetDeviceCaps((HDC) m_hDC,HORZRES);
- long h=::GetDeviceCaps((HDC) m_hDC,VERTRES);
- *width = w;
- *height = h;
-}
-
-void wxDC::GetSizeMM(long *width, long *height) const
-{
- long w=::GetDeviceCaps((HDC) m_hDC,HORZSIZE);
- long h=::GetDeviceCaps((HDC) m_hDC,VERTSIZE);
- *width = w;
- *height = h;
-}
-
-void wxDC::DrawPolygon(wxList *list, long xoffset, long yoffset,int fillStyle)
-{
- int n = list->Number();
- wxPoint *points = new wxPoint[n];
-
- int i = 0;
- for(wxNode *node = list->First(); node; node = node->Next()) {
- wxPoint *point = (wxPoint *)node->Data();
- points[i].x = point->x;
- points[i++].y = point->y;
- }
- DrawPolygon(n, points, xoffset, yoffset,fillStyle);
- delete[] points;
-}
-
-void wxDC::DrawLines(wxList *list, long xoffset, long yoffset)
-{
- int n = list->Number();
- wxPoint *points = new wxPoint[n];
-
- int i = 0;
- for(wxNode *node = list->First(); node; node = node->Next()) {
- wxPoint *point = (wxPoint *)node->Data();
- points[i].x = point->x;
- points[i++].y = point->y;
- }
- DrawLines(n, points, xoffset, yoffset);
- delete []points;
-}
+ {
+ // create a temp buffer bitmap and DCs to access it and the mask
+ dc_mask = ::CreateCompatibleDC(GetHdcOf(*source));
+ dc_buffer = ::CreateCompatibleDC(GetHdc());
+ buffer_bmap = ::CreateCompatibleBitmap(GetHdc(), width, height);
+ ::SelectObject(dc_mask, (HBITMAP) mask->GetMaskBitmap());
+ ::SelectObject(dc_buffer, buffer_bmap);
+ }
+
+ // copy dest to buffer
+ if ( !::BitBlt(dc_buffer, 0, 0, (int)width, (int)height,
+ GetHdc(), xdest, ydest, SRCCOPY) )
+ {
+ wxLogLastError(wxT("BitBlt"));
+ }
+
+ // copy src to buffer using selected raster op
+ if ( !::BitBlt(dc_buffer, 0, 0, (int)width, (int)height,
+ GetHdcOf(*source), xsrc, ysrc, dwRop) )
+ {
+ wxLogLastError(wxT("BitBlt"));
+ }
+
+ // set masked area in buffer to BLACK (pixel value 0)
+ COLORREF prevBkCol = ::SetBkColor(GetHdc(), RGB(255, 255, 255));
+ COLORREF prevCol = ::SetTextColor(GetHdc(), RGB(0, 0, 0));
+ if ( !::BitBlt(dc_buffer, 0, 0, (int)width, (int)height,
+ dc_mask, xsrcMask, ysrcMask, SRCAND) )
+ {
+ wxLogLastError(wxT("BitBlt"));
+ }
+
+ // set unmasked area in dest to BLACK
+ ::SetBkColor(GetHdc(), RGB(0, 0, 0));
+ ::SetTextColor(GetHdc(), RGB(255, 255, 255));
+ if ( !::BitBlt(GetHdc(), xdest, ydest, (int)width, (int)height,
+ dc_mask, xsrcMask, ysrcMask, SRCAND) )
+ {
+ wxLogLastError(wxT("BitBlt"));
+ }
+ ::SetBkColor(GetHdc(), prevBkCol); // restore colours to original values
+ ::SetTextColor(GetHdc(), prevCol);
+
+ // OR buffer to dest
+ success = ::BitBlt(GetHdc(), xdest, ydest,
+ (int)width, (int)height,
+ dc_buffer, 0, 0, SRCPAINT) != 0;
+ if ( !success )
+ {
+ wxLogLastError(wxT("BitBlt"));
+ }
+
+ // tidy up temporary DCs and bitmap
+ ::SelectObject(dc_mask, 0);
+ ::SelectObject(dc_buffer, 0);
+
+#if !wxUSE_DC_CACHEING
+ {
+ ::DeleteDC(dc_mask);
+ ::DeleteDC(dc_buffer);
+ ::DeleteObject(buffer_bmap);
+ }
+#endif
+ }
+ }
+ else // no mask, just BitBlt() it
+ {
+ success = ::BitBlt(GetHdc(), xdest, ydest,
+ (int)width, (int)height,
+ GetHdcOf(*source), xsrc, ysrc, dwRop) != 0;
+ if ( !success )
+ {
+ wxLogLastError(wxT("BitBlt"));
+ }
+ }
+ ::SetTextColor(GetHdc(), old_textground);
+ ::SetBkColor(GetHdc(), old_background);