X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8f7b34a878bbcb2f71a0c7694e2a3bec51460218..758bce950ba9236d0a9edc4c880c3ec73b5173f3:/src/mgl/dc.cpp diff --git a/src/mgl/dc.cpp b/src/mgl/dc.cpp index ecaa40dc6a..551f542019 100644 --- a/src/mgl/dc.cpp +++ b/src/mgl/dc.cpp @@ -152,16 +152,10 @@ wxDC::wxDC() m_OwnsMGLDC = FALSE; m_ok = FALSE; // must call SetMGLDevCtx() before using it -#if 0 m_mm_to_pix_x = (double)wxGetDisplaySize().GetWidth() / (double)wxGetDisplaySizeMM().GetWidth(); m_mm_to_pix_y = (double)wxGetDisplaySize().GetHeight() / (double)wxGetDisplaySizeMM().GetHeight(); -#endif - // FIXME_MGL -- not in wxUniversal branch (and not implementend anyway, - // hardcode it for 75dpi for now) - m_mm_to_pix_x = ((double)wxGetDisplaySize().GetWidth() / 75) * inches2mm; - m_mm_to_pix_y = ((double)wxGetDisplaySize().GetHeight() / 75) * inches2mm; m_pen = *wxBLACK_PEN; m_font = *wxNORMAL_FONT; @@ -188,6 +182,17 @@ void wxDC::SetMGLDC(MGLDevCtx *mgldc, bool OwnsMGLDC) m_MGLDC = mgldc; m_OwnsMGLDC = OwnsMGLDC; m_ok = TRUE; + + if ( mgldc->getDC()->a.clipRegion ) + { + MGLRegion clip; + mgldc->getClipRegion(clip); + m_globalClippingRegion = wxRegion(clip); + // FIXME_MGL -- reuse wxWindows::m_updateRegion ? + m_currentClippingRegion = m_globalClippingRegion; + m_clipping = TRUE; + } + InitializeMGLDC(); } @@ -236,7 +241,7 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region) { wxCHECK_RET( Ok(), wxT("invalid dc") ); - if ( region.Empty() ) + if ( region.IsEmpty() ) { DestroyClippingRegion(); return; @@ -275,9 +280,18 @@ void wxDC::DestroyClippingRegion() { wxCHECK_RET( Ok(), wxT("invalid dc") ); - m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex(), m_MGLDC->sizey())); - m_clipping = FALSE; - m_currentClippingRegion.Clear(); + if ( !m_globalClippingRegion.IsNull() ) + { + m_MGLDC->setClipRegion(m_globalClippingRegion.GetMGLRegion()); + m_currentClippingRegion = m_globalClippingRegion; + m_clipping = TRUE; + } + else + { + m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex(), m_MGLDC->sizey())); + m_clipping = FALSE; + m_currentClippingRegion.Clear(); + } } // --------------------------------------------------------------------------- @@ -308,9 +322,7 @@ void wxDC::Clear() wxCHECK_RET( Ok(), wxT("invalid dc") ); m_MGLDC->makeCurrent(); // will go away with MGL6.0 - m_MGLDC->clearDevice(); - if ( m_backgroundBrush.GetStyle() != wxSOLID && - m_backgroundBrush.GetStyle() != wxTRANSPARENT ) + if ( m_backgroundBrush.GetStyle() != wxTRANSPARENT ) { int w, h; wxBrush oldb = m_brush; @@ -691,7 +703,6 @@ void wxDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,d void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y) { - if ( m_pen.GetStyle() == wxTRANSPARENT ) return; m_MGLDC->makeCurrent(); // will go away with MGL6.0 DrawAnyText(text, x, y); @@ -765,7 +776,7 @@ void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y) if ( m_font.GetUnderlined() ) { int x1 = xx, y1 = yy; - int x2, y2; + int x2 = 0 , y2 = 0; int w = m_MGLDC->textWidth(c_text); m_MGLDC->underScoreLocation(x1, y1, c_text); switch (m_MGLDC->getTextDirection()) @@ -785,7 +796,6 @@ void wxDC::DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle) { - if ( m_pen.GetStyle() == wxTRANSPARENT ) return; m_MGLDC->makeCurrent(); // will go away with MGL6.0 if ( angle == 0 ) @@ -1224,7 +1234,7 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, *descent = YDEV2LOGREL(m_mglFont->descent); if ( externalLeading ) *externalLeading = YDEV2LOGREL(m_mglFont->leading); - + if ( theFont != NULL ) wxConstCast(this, wxDC)->SetFont(oldFont); } @@ -1387,7 +1397,8 @@ wxSize wxDC::GetPPI() const bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, - int rop, bool useMask) + int rop, bool useMask, + wxCoord xsrcMask, wxCoord ysrcMask) { wxCHECK_MSG( Ok(), FALSE, wxT("invalid dc") ); wxCHECK_MSG( source, FALSE, wxT("invalid source dc") ); @@ -1396,6 +1407,17 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, xsrc = source->LogicalToDeviceX(xsrc); ysrc = source->LogicalToDeviceY(ysrc); + /* FIXME_MGL: use the mask origin when drawing transparently */ + if (xsrcMask == -1 && ysrcMask == -1) + { + xsrcMask = xsrc; ysrcMask = ysrc; + } + else + { + xsrcMask = source->LogicalToDeviceX(xsrcMask); + ysrcMask = source->LogicalToDeviceY(ysrcMask); + } + CalcBoundingBox(xdest, ydest); CalcBoundingBox(xdest + width, ydest + height);