X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bdc18790e34d17edfc02f3e25edcb3425b38a8a..d284c07534af75014345a80363a7036897b5e388:/src/mgl/dc.cpp diff --git a/src/mgl/dc.cpp b/src/mgl/dc.cpp index a2d932bd5a..ba6ff76f3c 100644 --- a/src/mgl/dc.cpp +++ b/src/mgl/dc.cpp @@ -4,7 +4,7 @@ // Author: Vaclav Slavik // Created: 2001/03/09 // RCS-ID: $Id$ -// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com) +// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -16,7 +16,7 @@ // headers // --------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dc.h" #endif @@ -33,6 +33,7 @@ #endif #include "wx/fontutil.h" +#include "wx/encinfo.h" #include "wx/fontmap.h" #include "wx/mgl/private.h" #include "wx/log.h" @@ -47,6 +48,10 @@ // constants //----------------------------------------------------------------------------- +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + const double mm2inches = 0.0393700787402; const double inches2mm = 25.4; const double mm2twips = 56.6929133859; @@ -152,16 +157,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; @@ -172,7 +171,6 @@ wxDC::wxDC() m_downloadedPatterns[0] = m_downloadedPatterns[1] = FALSE; m_mglFont = NULL; - m_globalClippingRegion = NULL; } @@ -180,7 +178,6 @@ wxDC::~wxDC() { if (m_OwnsMGLDC) delete m_MGLDC; - delete m_globalClippingRegion; } void wxDC::SetMGLDC(MGLDevCtx *mgldc, bool OwnsMGLDC) @@ -190,14 +187,9 @@ void wxDC::SetMGLDC(MGLDevCtx *mgldc, bool OwnsMGLDC) m_MGLDC = mgldc; m_OwnsMGLDC = OwnsMGLDC; m_ok = TRUE; - - if ( mgldc->getDC()->a.clipRegion ) - { - m_globalClippingRegion = new MGLRegion; - mgldc->getClipRegion(*m_globalClippingRegion); - } - else - m_globalClippingRegion = NULL; + + if ( !m_globalClippingRegion.IsNull() ) + SetClippingRegion(m_globalClippingRegion); InitializeMGLDC(); } @@ -237,13 +229,7 @@ void wxDC::DoSetClippingRegion(wxCoord cx, wxCoord cy, wxCoord cw, wxCoord ch) else m_currentClippingRegion.Union(rect); - if ( m_globalClippingRegion ) - { - m_MGLDC->setClipRegion(m_currentClippingRegion.GetMGLRegion() - & *m_globalClippingRegion); - } - else - m_MGLDC->setClipRegion(m_currentClippingRegion.GetMGLRegion()); + m_MGLDC->setClipRegion(m_currentClippingRegion.GetMGLRegion()); m_clipping = TRUE; DO_SET_CLIPPING_BOX(m_currentClippingRegion) @@ -253,7 +239,7 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region) { wxCHECK_RET( Ok(), wxT("invalid dc") ); - if ( region.Empty() ) + if ( region.IsEmpty() ) { DestroyClippingRegion(); return; @@ -264,6 +250,7 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region) // check if the DC is scaled or moved, and if yes, then // convert rg to device coordinates: if ( m_deviceOriginX != 0 || m_deviceOriginY != 0 || + m_logicalOriginX != 0 || m_logicalOriginY != 0 || XLOG2DEVREL(500) != 500 || YLOG2DEVREL(500) != 500 ) { region_t *mrg = rg.GetMGLRegion().rgnPointer(); @@ -282,13 +269,7 @@ void wxDC::DoSetClippingRegionAsRegion(const wxRegion& region) else m_currentClippingRegion.Union(rg); - if ( m_globalClippingRegion ) - { - m_MGLDC->setClipRegion(m_currentClippingRegion.GetMGLRegion() - & *m_globalClippingRegion); - } - else - m_MGLDC->setClipRegion(m_currentClippingRegion.GetMGLRegion()); + m_MGLDC->setClipRegion(m_currentClippingRegion.GetMGLRegion()); m_clipping = TRUE; DO_SET_CLIPPING_BOX(m_currentClippingRegion) @@ -298,12 +279,18 @@ void wxDC::DestroyClippingRegion() { wxCHECK_RET( Ok(), wxT("invalid dc") ); - if ( m_globalClippingRegion ) - m_MGLDC->setClipRegion(*m_globalClippingRegion); + 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(); + { + m_MGLDC->setClipRect(MGLRect(0, 0, m_MGLDC->sizex()+1, m_MGLDC->sizey()+1)); + m_clipping = FALSE; + m_currentClippingRegion.Clear(); + } } // --------------------------------------------------------------------------- @@ -334,23 +321,25 @@ 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; SetBrush(m_backgroundBrush); SelectBrush(); GetSize(&w, &h); - m_MGLDC->fillRect(0, 0, w-1, h-1); + m_MGLDC->fillRect(0, 0, w, h); SetBrush(oldb); } } -void wxDC::DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style) +extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y, + const wxColour & col, int style); + +bool wxDC::DoFloodFill(wxCoord x, wxCoord y, + const wxColour& col, int style) { - wxFAIL_MSG( wxT("wxDC::DoFloodFill not implemented") ); + return wxDoFloodFill(this, x, y, col, style); } bool wxDC::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const @@ -358,7 +347,7 @@ bool wxDC::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const wxCHECK_MSG( col, FALSE, _T("NULL colour parameter in wxDC::GetPixel")); uchar r, g, b; - m_MGLDC->unpackColorFast(m_MGLDC->getPixel(XLOG2DEV(x), XLOG2DEV(y)), + m_MGLDC->unpackColorFast(m_MGLDC->getPixel(XLOG2DEV(x), YLOG2DEV(y)), r, g, b); col->Set(r, g, b); return TRUE; @@ -394,8 +383,8 @@ void wxDC::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) m_MGLDC->makeCurrent(); // will go away with MGL6.0 if ( !m_penSelected ) SelectPen(); - m_MGLDC->line(XLOG2DEV(x1) + m_penOfsX, XLOG2DEV(y1) + m_penOfsY, - XLOG2DEV(x2) + m_penOfsX, XLOG2DEV(y2) + m_penOfsY); + m_MGLDC->lineExt(XLOG2DEV(x1) + m_penOfsX, YLOG2DEV(y1) + m_penOfsY, + XLOG2DEV(x2) + m_penOfsX, YLOG2DEV(y2) + m_penOfsY,FALSE); CalcBoundingBox(x1, y1); CalcBoundingBox(x2, y2); } @@ -574,6 +563,7 @@ void wxDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { if ( !m_penSelected ) SelectPen(); + m_MGLDC->rect(xx + m_penOfsX, yy + m_penOfsY, xx + ww + m_penOfsX, yy + hh + m_penOfsY); } @@ -717,7 +707,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); @@ -748,7 +737,7 @@ bool wxDC::SelectMGLFont() !wxTestFontEncoding(nativeEnc) ) { #if wxUSE_FONTMAP - if ( !wxTheFontMapper->GetAltForEncoding(encoding, &nativeEnc) ) + if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &nativeEnc) ) #endif { nativeEnc.mglEncoding = MGL_ENCODING_ASCII; @@ -766,25 +755,42 @@ void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y) SelectMGLFont(); - m_MGLDC->setColor(m_MGLDC->packColorFast(m_textForegroundColour.Red(), - m_textForegroundColour.Green(), m_textForegroundColour.Blue())); - m_MGLDC->setBackColor(m_MGLDC->packColorFast(m_textBackgroundColour.Red(), - m_textBackgroundColour.Green(), m_textBackgroundColour.Blue())); - // Render the text: wxCoord xx = XLOG2DEV(x); wxCoord yy = YLOG2DEV(y); - + m_MGLDC->setLineStyle(MGL_LINE_STIPPLE); m_MGLDC->setLineStipple(0xFFFF); m_MGLDC->setPenSize(1, 1); m_MGLDC->setPenStyle(MGL_BITMAP_SOLID); - + #if wxUSE_UNICODE const wchar_t *c_text = text.c_str(); #else const char *c_text = text.c_str(); #endif + +#if 1 + // FIXME_MGL - this is a temporary hack in absence of proper + // implementation of solid text background in MGL. Once + // the bug in MGL is fixed, this code should be nuked + // immediately. Note that the code is not 100% correct; + // it only works with wxCOPY logical function + if ( m_backgroundMode == wxSOLID ) + { + int w = m_MGLDC->textWidth(c_text); + int h = m_MGLDC->textHeight(); + m_MGLDC->setColor(m_MGLDC->packColorFast(m_textBackgroundColour.Red(), + m_textBackgroundColour.Green(), m_textBackgroundColour.Blue())); + m_MGLDC->fillRect(xx, yy, xx+w, yy+h); + } +#endif + + m_MGLDC->setColor(m_MGLDC->packColorFast(m_textForegroundColour.Red(), + m_textForegroundColour.Green(), m_textForegroundColour.Blue())); + m_MGLDC->setBackColor(m_MGLDC->packColorFast(m_textBackgroundColour.Red(), + m_textBackgroundColour.Green(), m_textBackgroundColour.Blue())); + m_MGLDC->drawStr(xx, yy, c_text); // Render underline: @@ -811,7 +817,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 ) @@ -1103,7 +1108,8 @@ void wxDC::SetPalette(const wxPalette& palette) if ( palette == wxNullPalette ) { - SetPalette(m_oldPalette); + if ( m_oldPalette.Ok() ) + SetPalette(m_oldPalette); return; } @@ -1120,9 +1126,11 @@ void wxDC::SetPalette(const wxPalette& palette) void wxDC::SetFont(const wxFont& font) { - wxCHECK_RET( font.Ok(), wxT("invalid font") ); - m_font = font; - m_mglFont = NULL; + if ( font.Ok() ) + { + m_font = font; + m_mglFont = NULL; + } } void wxDC::SetBackground(const wxBrush& brush) @@ -1250,7 +1258,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); } @@ -1386,8 +1394,8 @@ wxCoord wxDCBase::LogicalToDeviceYRel(wxCoord y) const void wxDC::DoGetSize(int *w, int *h) const { - if (w) *w = m_MGLDC->sizex(); - if (h) *h = m_MGLDC->sizey(); + if (w) *w = m_MGLDC->sizex()+1; + if (h) *h = m_MGLDC->sizey()+1; } void wxDC::DoGetSizeMM(int *width, int *height) const