]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/dc.cpp
call wxApp::OnExceptionInMainLoop() when an exception occurs (refactored the change...
[wxWidgets.git] / src / mgl / dc.cpp
index a2d932bd5a861b22cd1522db7977658f9c2493ea..ba6ff76f3cb2466c33c870b6a04cb67e31902b6c 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Vaclav Slavik
 // Created:     2001/03/09
 // RCS-ID:      $Id$
 // 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
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -16,7 +16,7 @@
 // headers
 // ---------------------------------------------------------------------------
 
 // headers
 // ---------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "dc.h"
 #endif
 
     #pragma implementation "dc.h"
 #endif
 
@@ -33,6 +33,7 @@
 #endif
 
 #include "wx/fontutil.h"
 #endif
 
 #include "wx/fontutil.h"
+#include "wx/encinfo.h"
 #include "wx/fontmap.h"
 #include "wx/mgl/private.h"
 #include "wx/log.h"
 #include "wx/fontmap.h"
 #include "wx/mgl/private.h"
 #include "wx/log.h"
 // constants
 //-----------------------------------------------------------------------------
 
 // 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;
 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
 
     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();
     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;
 
     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_downloadedPatterns[0] = m_downloadedPatterns[1] = FALSE;
     
     m_mglFont = NULL;
-    m_globalClippingRegion = NULL;
 }
 
 
 }
 
 
@@ -180,7 +178,6 @@ wxDC::~wxDC()
 {
     if (m_OwnsMGLDC) 
         delete m_MGLDC;
 {
     if (m_OwnsMGLDC) 
         delete m_MGLDC;
-    delete m_globalClippingRegion;
 }
 
 void wxDC::SetMGLDC(MGLDevCtx *mgldc, bool OwnsMGLDC)
 }
 
 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;
     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();
 }
     
     InitializeMGLDC();
 }
@@ -237,13 +229,7 @@ void wxDC::DoSetClippingRegion(wxCoord cx, wxCoord cy, wxCoord cw, wxCoord ch)
     else
         m_currentClippingRegion.Union(rect);
 
     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)
 
     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") );
 
 {
     wxCHECK_RET( Ok(), wxT("invalid dc") );
 
-    if ( region.Empty() )
+    if ( region.IsEmpty() )
     {
         DestroyClippingRegion();
         return;
     {
         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 ||
     // 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();
          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);
 
     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)
 
     m_clipping = TRUE;
     DO_SET_CLIPPING_BOX(m_currentClippingRegion)
@@ -298,12 +279,18 @@ void wxDC::DestroyClippingRegion()
 {
     wxCHECK_RET( Ok(), wxT("invalid dc") );
     
 {
     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
     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
     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);
     {
         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);
     }
 }
 
         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
 }
 
 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;
     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;
                              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->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);
     }
         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();
     {
         if ( !m_penSelected ) 
             SelectPen();
+
         m_MGLDC->rect(xx + m_penOfsX, yy + m_penOfsY, 
                       xx + ww + m_penOfsX, yy + hh + m_penOfsY);
     }    
         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)
 {
 
 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);
 
     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
              !wxTestFontEncoding(nativeEnc) )
         {
 #if wxUSE_FONTMAP
-            if ( !wxTheFontMapper->GetAltForEncoding(encoding, &nativeEnc) )
+            if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &nativeEnc) )
 #endif
             {
                 nativeEnc.mglEncoding = MGL_ENCODING_ASCII;
 #endif
             {
                 nativeEnc.mglEncoding = MGL_ENCODING_ASCII;
@@ -766,25 +755,42 @@ void wxDC::DrawAnyText(const wxString& text, wxCoord x, wxCoord y)
 
     SelectMGLFont();
 
 
     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);
     // 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);
     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 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:
     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)
 {
                              wxCoord x, wxCoord y,
                              double angle)
 {
-    if ( m_pen.GetStyle() == wxTRANSPARENT ) return;
     m_MGLDC->makeCurrent(); // will go away with MGL6.0
     
     if ( angle == 0 )
     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 )
     {
     
     if ( palette == wxNullPalette )
     {
-        SetPalette(m_oldPalette);
+        if ( m_oldPalette.Ok() )
+            SetPalette(m_oldPalette);
         return;
     }
 
         return;
     }
 
@@ -1120,9 +1126,11 @@ void wxDC::SetPalette(const wxPalette& palette)
 
 void wxDC::SetFont(const wxFont& font)
 {
 
 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)
 }
 
 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);
         *descent = YDEV2LOGREL(m_mglFont->descent);
     if ( externalLeading )
         *externalLeading = YDEV2LOGREL(m_mglFont->leading);
-    
+
     if ( theFont != NULL )
         wxConstCast(this, wxDC)->SetFont(oldFont);
 }
     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
 {
 
 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
 }
 
 void wxDC::DoGetSizeMM(int *width, int *height) const