]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
centralized the handling of border styles; added borders support for wxListBox and...
[wxWidgets.git] / src / generic / dcpsg.cpp
index f59a161f7ade9ce1765a2dec8729d1ee61528a7d..ff50f091200aae35f2bd34c6da71bbf97072b747 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        dcpsg.cpp
+// Name:        src/generic/dcpsg.cpp
 // Purpose:     Generic wxPostScriptDC implementation
 // Author:      Julian Smart, Robert Roebling, Markus Holzhem
 // Modified by:
 // Purpose:     Generic wxPostScriptDC implementation
 // Author:      Julian Smart, Robert Roebling, Markus Holzhem
 // Modified by:
@@ -9,10 +9,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "dcpsg.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
@@ -26,8 +22,6 @@
 
 #if wxUSE_POSTSCRIPT
 
 
 #if wxUSE_POSTSCRIPT
 
-#include "wx/setup.h"
-
 #include "wx/dcmemory.h"
 #include "wx/utils.h"
 #include "wx/intl.h"
 #include "wx/dcmemory.h"
 #include "wx/utils.h"
 #include "wx/intl.h"
@@ -39,8 +33,8 @@
 #include "wx/generic/prntdlgg.h"
 #include "wx/paper.h"
 #include "wx/filefn.h"
 #include "wx/generic/prntdlgg.h"
 #include "wx/paper.h"
 #include "wx/filefn.h"
-
-#include <math.h>
+#include "wx/math.h"
+#include "wx/stdpaths.h"
 
 #ifdef __WXMSW__
 
 
 #ifdef __WXMSW__
 
@@ -409,9 +403,10 @@ void wxPostScriptDC::DoDrawArc (wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
         alpha1 = 0.0;
         alpha2 = 360.0;
     }
         alpha1 = 0.0;
         alpha2 = 360.0;
     }
-    else if (radius == 0.0)
+    else if ( wxIsNullDouble(radius) )
     {
     {
-        alpha1 = alpha2 = 0.0;
+        alpha1 =
+        alpha2 = 0.0;
     }
     else
     {
     }
     else
     {
@@ -464,12 +459,16 @@ void wxPostScriptDC::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,d
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 
-    if (sa>=360 || sa<=-360) sa=sa-int(sa/360)*360;
-    if (ea>=360 || ea<=-360) ea=ea-int(ea/360)*360;
-    if (sa<0) sa+=360;
-    if (ea<0) ea+=360;
+    if ( sa >= 360 || sa <= -360 )
+        sa -= int(sa/360)*360;
+    if ( ea >= 360 || ea <=- 360 )
+        ea -= int(ea/360)*360;
+    if ( sa < 0 )
+        sa += 360;
+    if ( ea < 0 )
+        ea += 360;
 
 
-    if (sa==ea)
+    if ( wxIsSameDouble(sa, ea) )
     {
         DrawEllipse(x,y,w,h);
         return;
     {
         DrawEllipse(x,y,w,h);
         return;
@@ -745,7 +744,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width
         /* Draw rectangle anticlockwise */
         PsPrintf( wxT("newpath\n")
                   wxT("%d %d %d 90 180 arc\n")
         /* Draw rectangle anticlockwise */
         PsPrintf( wxT("newpath\n")
                   wxT("%d %d %d 90 180 arc\n")
-                  wxT("%d %d moveto\n")
+                  wxT("%d %d lineto\n")
                   wxT("%d %d %d 180 270 arc\n")
                   wxT("%d %d lineto\n")
                   wxT("%d %d %d 270 0 arc\n")
                   wxT("%d %d %d 180 270 arc\n")
                   wxT("%d %d lineto\n")
                   wxT("%d %d %d 270 0 arc\n")
@@ -755,7 +754,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width
                   wxT("closepath\n")
                   wxT("fill\n"),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad),
                   wxT("closepath\n")
                   wxT("fill\n"),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad),
-                LogicalToDeviceX(x), LogicalToDeviceY(y + rad),
+                LogicalToDeviceX(x), LogicalToDeviceY(y + height - rad),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
@@ -774,7 +773,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width
         /* Draw rectangle anticlockwise */
         PsPrintf( wxT("newpath\n")
                   wxT("%d %d %d 90 180 arc\n")
         /* Draw rectangle anticlockwise */
         PsPrintf( wxT("newpath\n")
                   wxT("%d %d %d 90 180 arc\n")
-                  wxT("%d %d moveto\n")
+                  wxT("%d %d lineto\n")
                   wxT("%d %d %d 180 270 arc\n")
                   wxT("%d %d lineto\n")
                   wxT("%d %d %d 270 0 arc\n")
                   wxT("%d %d %d 180 270 arc\n")
                   wxT("%d %d lineto\n")
                   wxT("%d %d %d 270 0 arc\n")
@@ -784,7 +783,7 @@ void wxPostScriptDC::DoDrawRoundedRectangle (wxCoord x, wxCoord y, wxCoord width
                   wxT("closepath\n")
                   wxT("stroke\n"),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad),
                   wxT("closepath\n")
                   wxT("stroke\n"),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + rad), LogicalToDeviceXRel(rad),
-                LogicalToDeviceX(x), LogicalToDeviceY(y + rad),
+                LogicalToDeviceX(x), LogicalToDeviceY(y + height - rad),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
                 LogicalToDeviceX(x + rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height),
                 LogicalToDeviceX(x + width - rad), LogicalToDeviceY(y + height - rad), LogicalToDeviceXRel(rad),
@@ -873,14 +872,14 @@ void wxPostScriptDC::DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y,
 
     unsigned char* data = image.GetData();
 
 
     unsigned char* data = image.GetData();
 
-    /* buffer = line = width*rgb(3)*hexa(2)+'\n'(1)+null(1) */
-    char* buffer = new char[ w*6+2 ];
+    // size of the buffer = width*rgb(3)*hexa(2)+'\n'
+    wxCharBuffer buffer(w*6 + 1);
     int firstDigit, secondDigit;
 
     //rows
     for (int j = 0; j < h; j++)
     {
     int firstDigit, secondDigit;
 
     //rows
     for (int j = 0; j < h; j++)
     {
-        char* bufferindex = buffer;
+        char* bufferindex = buffer.data();
 
         //cols
         for (int i = 0; i < w*3; i++)
 
         //cols
         for (int i = 0; i < w*3; i++)
@@ -1038,12 +1037,26 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         case wxSHORT_DASH:    psdash = short_dashed;   break;
         case wxLONG_DASH:     psdash = wxCoord_dashed; break;
         case wxDOT_DASH:      psdash = dotted_dashed;  break;
         case wxSHORT_DASH:    psdash = short_dashed;   break;
         case wxLONG_DASH:     psdash = wxCoord_dashed; break;
         case wxDOT_DASH:      psdash = dotted_dashed;  break;
+        case wxUSER_DASH:
+        {
+            wxDash *dashes;
+            int nDashes = m_pen.GetDashes (&dashes);
+            PsPrint ("[");
+            for (int i = 0; i < nDashes; ++i)
+            {
+                sprintf( buffer, "%d ", dashes [i] );
+                PsPrint( buffer );
+            }
+            PsPrint ("] 0 setdash\n");
+            psdash = 0; 
+        } 
+        break;
         case wxSOLID:
         case wxTRANSPARENT:
         default:              psdash = "[] 0";         break;
     }
 
         case wxSOLID:
         case wxTRANSPARENT:
         default:              psdash = "[] 0";         break;
     }
 
-    if ( (oldStyle != m_pen.GetStyle()) )
+    if ( psdash && (oldStyle != m_pen.GetStyle()) )
     {
         PsPrint( psdash );
         PsPrint( " setdash\n" );
     {
         PsPrint( psdash );
         PsPrint( " setdash\n" );
@@ -1074,7 +1087,6 @@ void wxPostScriptDC::SetPen( const wxPen& pen )
         double bluePS = (double)(blue) / 255.0;
         double greenPS = (double)(green) / 255.0;
 
         double bluePS = (double)(blue) / 255.0;
         double greenPS = (double)(green) / 255.0;
 
-        char buffer[100];
         sprintf( buffer,
             "%.8f %.8f %.8f setrgbcolor\n",
             redPS, greenPS, bluePS );
         sprintf( buffer,
             "%.8f %.8f %.8f setrgbcolor\n",
             redPS, greenPS, bluePS );
@@ -1251,7 +1263,7 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
 
 void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle )
 {
 
 void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle )
 {
-    if (angle == 0.0)
+    if ( wxIsNullDouble(angle) )
     {
         DoDrawText(text, x, y);
         return;
     {
         DoDrawText(text, x, y);
         return;
@@ -1351,7 +1363,6 @@ void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord
     {
         wxCoord uy = (wxCoord)(y + size - m_underlinePosition);
         wxCoord w, h;
     {
         wxCoord uy = (wxCoord)(y + size - m_underlinePosition);
         wxCoord w, h;
-        char buffer[100];
         GetTextExtent(text, &w, &h);
 
         sprintf( buffer,
         GetTextExtent(text, &w, &h);
 
         sprintf( buffer,
@@ -1385,6 +1396,7 @@ void wxPostScriptDC::SetLogicalFunction (int WXUNUSED(function))
     wxFAIL_MSG( wxT("wxPostScriptDC::SetLogicalFunction not implemented.") );
 }
 
     wxFAIL_MSG( wxT("wxPostScriptDC::SetLogicalFunction not implemented.") );
 }
 
+#if wxUSE_SPLINES
 void wxPostScriptDC::DoDrawSpline( wxList *points )
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 void wxPostScriptDC::DoDrawSpline( wxList *points )
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
@@ -1459,6 +1471,7 @@ void wxPostScriptDC::DoDrawSpline( wxList *points )
               wxT("stroke\n"),
             LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) );
 }
               wxT("stroke\n"),
             LogicalToDeviceX((wxCoord)c), LogicalToDeviceY((wxCoord)d) );
 }
+#endif // wxUSE_SPLINES
 
 wxCoord wxPostScriptDC::GetCharWidth() const
 {
 
 wxCoord wxPostScriptDC::GetCharWidth() const
 {
@@ -1474,10 +1487,7 @@ void wxPostScriptDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
     m_signX = (xLeftRight ? 1 : -1);
     m_signY = (yBottomUp  ? 1 : -1);
 
     m_signX = (xLeftRight ? 1 : -1);
     m_signY = (yBottomUp  ? 1 : -1);
 
-    // FIXME there is no such function in MSW nor in OS2/PM
-#if !defined(__WXMSW__) && !defined(__WXPM__)
     ComputeScaleAndOrigin();
     ComputeScaleAndOrigin();
-#endif
 }
 
 void wxPostScriptDC::SetDeviceOrigin( wxCoord x, wxCoord y )
 }
 
 void wxPostScriptDC::SetDeviceOrigin( wxCoord x, wxCoord y )
@@ -1556,7 +1566,7 @@ wxSize wxPostScriptDC::GetPPI(void) const
 bool wxPostScriptDC::StartDoc( const wxString& message )
 {
     wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") );
 bool wxPostScriptDC::StartDoc( const wxString& message )
 {
     wxCHECK_MSG( m_ok, false, wxT("invalid postscript dc") );
-    
+
     if (m_printData.GetPrintMode() != wxPRINT_MODE_STREAM )
     {
         if (m_printData.GetFilename() == wxEmptyString)
     if (m_printData.GetPrintMode() != wxPRINT_MODE_STREAM )
     {
         if (m_printData.GetFilename() == wxEmptyString)
@@ -1565,8 +1575,7 @@ bool wxPostScriptDC::StartDoc( const wxString& message )
             m_printData.SetFilename(filename);
         }
 
             m_printData.SetFilename(filename);
         }
 
-        // FIXME: use fn_str() here under Unicode?
-        m_pstream = wxFopen( m_printData.GetFilename().c_str(), wxT("w+") );
+        m_pstream = wxFopen( m_printData.GetFilename(), wxT("w+") );
 
         if (!m_pstream)
         {
 
         if (!m_pstream)
         {
@@ -1718,7 +1727,7 @@ void wxPostScriptDC::EndDoc ()
 #endif
 
 #ifndef __WXMSW__
 #endif
 
 #ifndef __WXMSW__
-    wxPostScriptPrintNativeData *data = 
+    wxPostScriptPrintNativeData *data =
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
 
     if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER))
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
 
     if (m_ok && (m_printData.GetPrintMode() == wxPRINT_MODE_PRINTER))
@@ -1755,7 +1764,7 @@ void wxPostScriptDC::StartPage()
     wxCoord translate_x, translate_y;
     double scale_x, scale_y;
 
     wxCoord translate_x, translate_y;
     double scale_x, scale_y;
 
-    wxPostScriptPrintNativeData *data = 
+    wxPostScriptPrintNativeData *data =
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
 
     translate_x = (wxCoord)data->GetPrinterTranslateX();
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
 
     translate_x = (wxCoord)data->GetPrinterTranslateX();
@@ -1833,7 +1842,7 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
 
     wxCHECK_RET( fontToUse, wxT("GetTextExtent: no font defined") );
 
 
     wxCHECK_RET( fontToUse, wxT("GetTextExtent: no font defined") );
 
-    if (string.IsEmpty())
+    if (string.empty())
     {
         if (x) (*x) = 0;
         if (y) (*y) = 0;
     {
         if (x) (*x) = 0;
         if (y) (*y) = 0;
@@ -1967,22 +1976,35 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
 
         FILE *afmFile = NULL;
 
 
         FILE *afmFile = NULL;
 
-        wxPostScriptPrintNativeData *data = 
-            (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
-            
         // Get the directory of the AFM files
         wxString afmName;
         // Get the directory of the AFM files
         wxString afmName;
-        if (!data->GetFontMetricPath().IsEmpty())
+
+        // VZ: I don't know if the cast always works under Unix but it clearly
+        //     never does under Windows where the pointer is
+        //     wxWindowsPrintNativeData and so calling GetFontMetricPath() on
+        //     it just crashes
+#ifndef __WIN32__
+        wxPostScriptPrintNativeData *data =
+            wxDynamicCast(m_printData.GetNativeData(), wxPostScriptPrintNativeData);
+
+        if (data && !data->GetFontMetricPath().empty())
         {
             afmName = data->GetFontMetricPath();
             afmName << wxFILE_SEP_PATH << name;
         {
             afmName = data->GetFontMetricPath();
             afmName << wxFILE_SEP_PATH << name;
-            afmFile = wxFopen(afmName,wxT("r"));
         }
         }
+#endif // __WIN32__
 
 
-#if defined(__UNIX__) && !defined(__VMS__)
-        if (afmFile==NULL)
+        if ( !afmName.empty() )
+            afmFile = wxFopen(afmName, wxT("r"));
+
+        if ( !afmFile )
         {
         {
+#if defined(__UNIX__) && !defined(__VMS__)
            afmName = wxGetDataDir();
            afmName = wxGetDataDir();
+#else // !__UNIX__
+           afmName = wxStandardPaths::Get().GetDataDir();
+#endif // __UNIX__/!__UNIX__
+
            afmName <<  wxFILE_SEP_PATH
 #if defined(__LINUX__) || defined(__FREEBSD__)
                    << wxT("gs_afm") << wxFILE_SEP_PATH
            afmName <<  wxFILE_SEP_PATH
 #if defined(__LINUX__) || defined(__FREEBSD__)
                    << wxT("gs_afm") << wxFILE_SEP_PATH
@@ -1992,7 +2014,6 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
                    << name;
            afmFile = wxFopen(afmName,wxT("r"));
         }
                    << name;
            afmFile = wxFopen(afmName,wxT("r"));
         }
-#endif
 
         /* 2. open and process the file
            /  a short explanation of the AFM format:
 
         /* 2. open and process the file
            /  a short explanation of the AFM format:
@@ -2019,8 +2040,10 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
             /* init the widths array */
             for(int i=0; i<256; i++) lastWidths[i] = INT_MIN;
             /* some variables for holding parts of a line */
             /* init the widths array */
             for(int i=0; i<256; i++) lastWidths[i] = INT_MIN;
             /* some variables for holding parts of a line */
-            char cString[10],semiString[10],WXString[10],descString[20];
-            char upString[30], utString[30], encString[50];
+            char cString[10], semiString[10], WXString[10];
+            char descString[20];
+            char upString[30], utString[30];
+            char encString[50];
             char line[256];
             int ascii,cWidth;
             /* read in the file and parse it */
             char line[256];
             int ascii,cWidth;
             /* read in the file and parse it */
@@ -2187,9 +2210,9 @@ void wxPostScriptDC::PsPrintf( const wxChar* fmt, ... )
 
 void wxPostScriptDC::PsPrint( const char* psdata )
 {
 
 void wxPostScriptDC::PsPrint( const char* psdata )
 {
-    wxPostScriptPrintNativeData *data = 
+    wxPostScriptPrintNativeData *data =
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
-        
+
     switch (m_printData.GetPrintMode())
     {
 #if wxUSE_STREAMS
     switch (m_printData.GetPrintMode())
     {
 #if wxUSE_STREAMS
@@ -2212,9 +2235,9 @@ void wxPostScriptDC::PsPrint( const char* psdata )
 
 void wxPostScriptDC::PsPrint( int ch )
 {
 
 void wxPostScriptDC::PsPrint( int ch )
 {
-    wxPostScriptPrintNativeData *data = 
+    wxPostScriptPrintNativeData *data =
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
         (wxPostScriptPrintNativeData *) m_printData.GetNativeData();
-        
+
     switch (m_printData.GetPrintMode())
     {
 #if wxUSE_STREAMS
     switch (m_printData.GetPrintMode())
     {
 #if wxUSE_STREAMS
@@ -2223,7 +2246,7 @@ void wxPostScriptDC::PsPrint( int ch )
             {
                 wxOutputStream* outputstream = data->GetOutputStream();
                 wxCHECK_RET( outputstream, wxT("invalid outputstream") );
             {
                 wxOutputStream* outputstream = data->GetOutputStream();
                 wxCHECK_RET( outputstream, wxT("invalid outputstream") );
-                outputstream->PutC( ch );
+                outputstream->PutC( (char)ch );
             }
             break;
 #endif // wxUSE_STREAMS
             }
             break;
 #endif // wxUSE_STREAMS