]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
Some doc updates.
[wxWidgets.git] / src / generic / dcpsg.cpp
index bf484f5b9e84406d9bd1cd91dc04010594cbb56d..cdba095cf4b166f62c3ed186843535a310f6c34a 100644 (file)
@@ -1142,6 +1142,10 @@ void wxPostScriptDC::SetBrush( const wxBrush& brush )
 void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
 {
     wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") );
+    
+    wxCoord text_w, text_h, text_descent;
+    
+    GetTextExtent(text, &text_w, &text_h, &text_descent);
 
     SetFont( m_font );
 
@@ -1183,7 +1187,10 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
 
     int size = m_font.GetPointSize();
 
-    wxCoord by = y + (wxCoord)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
+//    wxCoord by = y + (wxCoord)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
+//    commented by V. Slavik and replaced by accurate version
+//        - note that there is still rounding error in text_descent!
+    wxCoord by = y + size - text_descent; // baseline
     fprintf( m_pstream, "%d %d moveto\n", XLOG2DEV(x), YLOG2DEV(by) );
 
     /* I don't know how to write char to a stream, so I use a mini string */
@@ -1221,8 +1228,6 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
     if (m_font.GetUnderlined())
     {
         wxCoord uy = (wxCoord)(y + size - m_underlinePosition);
-        wxCoord w, h;
-        GetTextExtent(text, &w, &h);
 
         fprintf( m_pstream,
                 "gsave\n"
@@ -1233,13 +1238,123 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
                 "grestore\n",
                 XLOG2DEV(x), YLOG2DEV(uy),
                 (wxCoord)m_underlineThickness,
-                XLOG2DEV(x + w), YLOG2DEV(uy) );
+                XLOG2DEV(x + text_w), YLOG2DEV(uy) );
     }
 
     CalcBoundingBox( x, y );
     CalcBoundingBox( x + size * text.Length() * 2/3 , y );
 }
 
+void wxPostScriptDC::DoDrawRotatedText( const wxString& text, wxCoord x, wxCoord y, double angle )
+{
+    if (angle == 0.0)
+    {
+        DoDrawText(text, x, y);
+        return;
+    }
+
+    wxCHECK_RET( m_ok && m_pstream, wxT("invalid postscript dc") );
+
+    SetFont( m_font );
+
+    if (m_textForegroundColour.Ok())
+    {
+        unsigned char red = m_textForegroundColour.Red();
+        unsigned char blue = m_textForegroundColour.Blue();
+        unsigned char green = m_textForegroundColour.Green();
+
+        if (!m_colour)
+        {
+            // Anything not white is black
+            if (! (red == (unsigned char) 255 && 
+                  blue == (unsigned char) 255 &&
+                  green == (unsigned char) 255))
+            {
+                red = (unsigned char) 0;
+                green = (unsigned char) 0;
+                blue = (unsigned char) 0;
+            }
+        }
+
+        // maybe setgray here ?
+        if (!(red == m_currentRed && green == m_currentGreen && blue == m_currentBlue))
+        {
+            double redPS = (double)(red) / 255.0;
+            double bluePS = (double)(blue) / 255.0;
+            double greenPS = (double)(green) / 255.0;
+       
+           fprintf( m_pstream, 
+                   "%.8f %.8f %.8f setrgbcolor\n",
+                   redPS, greenPS, bluePS );
+               
+            m_currentRed = red;
+            m_currentBlue = blue;
+            m_currentGreen = green;
+        }
+    }
+
+    int size = m_font.GetPointSize();
+
+    long by = y + (long)floor( double(size) * 2.0 / 3.0 ); // approximate baseline
+
+    // FIXME only correct for 90 degrees
+    fprintf( m_pstream, "%d %d moveto\n", XLOG2DEV(x + size), YLOG2DEV(by) );
+    fprintf(m_pstream, "%.8f rotate\n", angle);
+
+    /* I don't know how to write char to a stream, so I use a mini string */
+    char tmpbuf[2];
+    tmpbuf[1] = 0;
+    
+    fprintf( m_pstream, "(" );
+    const wxWX2MBbuf textbuf = text.mb_str();
+    int len = strlen(textbuf);
+    int i;
+    for (i = 0; i < len; i++)
+    {
+        int c = (unsigned char) textbuf[i];
+        if (c == ')' || c == '(' || c == '\\')
+        {
+            /* Cope with special characters */
+           fprintf( m_pstream, "\\" );
+           tmpbuf[0] = (char) c;
+           fprintf( m_pstream, tmpbuf );
+        }
+        else if ( c >= 128 )
+        {
+            /* Cope with character codes > 127 */
+           fprintf(m_pstream, "\\%o", c);
+        }
+        else
+       {
+           tmpbuf[0] = (char) c;
+           fprintf( m_pstream, tmpbuf );
+       }
+    }
+    
+    fprintf( m_pstream, ") show\n" );
+    fprintf( m_pstream, "%.8f rotate\n", -angle );
+
+    if (m_font.GetUnderlined())
+    {
+        long uy = (long)(y + size - m_underlinePosition);
+        long w, h;
+        GetTextExtent(text, &w, &h);
+
+        fprintf( m_pstream, 
+                 "gsave\n"
+                 "%d %d moveto\n"              
+                 "%ld setlinewidth\n"
+                 "%d %d lineto\n"
+                 "stroke\n"
+                 "grestore\n", 
+                 XLOG2DEV(x), YLOG2DEV(uy),
+                 (long)m_underlineThickness,
+                 XLOG2DEV(x + w), YLOG2DEV(uy) );
+    }
+
+    CalcBoundingBox( x, y );
+    CalcBoundingBox( x + size * text.Length() * 2/3 , y );
+}
 
 void wxPostScriptDC::SetBackground (const wxBrush& brush)
 {
@@ -1988,10 +2103,12 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
     }
 
     /* add descender to height (it is usually a negative value) */
-    if (lastDescender != INT_MIN)
-    {
-        height += (wxCoord)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */
-    }
+    //if (lastDescender != INT_MIN)
+    //{
+    //    height += (wxCoord)(((-lastDescender)/1000.0F) * Size); /* MATTHEW: forgot scale */
+    //}
+    // - commented by V. Slavik - height already contains descender in it
+    //   (judging from few experiments)
 
     /* return size values */
     if ( x )
@@ -2039,10 +2156,8 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
 
 wxPrintSetupData *wxThePrintSetupData = (wxPrintSetupData *) NULL;
 
-#if !USE_SHARED_LIBRARY
 IMPLEMENT_DYNAMIC_CLASS(wxPostScriptDC, wxDC)
 IMPLEMENT_DYNAMIC_CLASS(wxPrintSetupData, wxObject)
-#endif
 
 // Redundant now I think
 #if 1