]> git.saurik.com Git - wxWidgets.git/commitdiff
Rotated text patch from Hans-Joachim Baader (with some corrections)
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 6 Dec 1999 09:35:27 +0000 (09:35 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 6 Dec 1999 09:35:27 +0000 (09:35 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4833 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

14 files changed:
docs/changes.txt
include/wx/dc.h
include/wx/generic/dcpsg.h
include/wx/gtk/dcclient.h
include/wx/gtk1/dcclient.h
include/wx/motif/dcclient.h
include/wx/msw/dc.h
samples/drawing/drawing.cpp
src/common/prntbase.cpp
src/generic/dcpsg.cpp
src/gtk/dcclient.cpp
src/gtk1/dcclient.cpp
src/motif/dcclient.cpp
src/msw/dc.cpp

index 1b6a35d3963bfc70d2e32498f6faa5211fdff21d..665dd443862479fa14d5f649cb63f4b17e63f4cf 100644 (file)
@@ -16,12 +16,15 @@ wxBase:
 
 all (GUI):
 - wxMenu(Bar)::Insert() and Remove() functions for dynamic menu menagament
+- wxToolBar supports arbitrary controls (not only buttons) and can be
+  dynamically changed (Delete/Insert functions)
+- wxDC::DrawRotatedText() (contributed by Hans-Joachim Baader, limited to
+  +/-90 degrees for now - contributions to improve it are welcome!)
 
 wxMSW:
 
 - wxTreeCtrl::IsVisible() bug fixed (thanks to Gary Chessun)
 - tooltips work with wxRadioBox
-- arbitrary controls (and not only buttons) can be put into a toolbar
 
 wxGTK:
 
index 2388b401f844445ea53ca51a8205592d46693c1d..b49bbaacca9bc47ac14f6cca600af7529d6034b0 100644 (file)
@@ -181,6 +181,11 @@ public:
     void DrawText(const wxString& text, const wxPoint& pt)
         { DoDrawText(text, pt.x, pt.y); }
 
+    void DrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle)
+        { DoDrawRotatedText(text, x, y, angle); }
+    void DrawRotatedText(const wxString& text, const wxPoint& pt, double angle)
+        { DoDrawRotatedText(text, pt.x, pt.y, angle); }
+
     bool Blit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
               wxDC *source, wxCoord xsrc, wxCoord ysrc,
               int rop = wxCOPY, bool useMask = FALSE)
@@ -497,6 +502,8 @@ protected:
                               bool useMask = FALSE) = 0;
 
     virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) = 0;
+    virtual void DoDrawRotatedText(const wxString& text,
+                                   wxCoord x, wxCoord y, double angle) = 0;
 
     virtual bool DoBlit(wxCoord xdest, wxCoord ydest,
                         wxCoord width, wxCoord height,
index 184092f593c9f54dfb52bf189b9af41371724c5d..9ce1a6efe4cf722c979d8b435347ad21c2095db7 100644 (file)
@@ -86,6 +86,7 @@ public:
   void DoDrawBitmap( const wxBitmap& bitmap, wxCoord x, wxCoord y, bool useMask=FALSE );
 
   void DoDrawText(const wxString& text, wxCoord x, wxCoord y );
+  void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle);
 
   void Clear();
   void SetFont( const wxFont& font );
index a28585ffbd266795a114b5f8e9673953f53448d3..0142e694c7297c2b1721a93b138b6660b6eb4fa1 100644 (file)
@@ -70,6 +70,8 @@ public:
                          int logical_func = wxCOPY, bool useMask = FALSE );
 
     virtual void DoDrawText( const wxString &text, wxCoord x, wxCoord y );
+    virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y,
+                                   double angle);
     virtual void DoGetTextExtent( const wxString &string,
                                 wxCoord *width, wxCoord *height,
                                 wxCoord *descent = (wxCoord *) NULL,
index a28585ffbd266795a114b5f8e9673953f53448d3..0142e694c7297c2b1721a93b138b6660b6eb4fa1 100644 (file)
@@ -70,6 +70,8 @@ public:
                          int logical_func = wxCOPY, bool useMask = FALSE );
 
     virtual void DoDrawText( const wxString &text, wxCoord x, wxCoord y );
+    virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y,
+                                   double angle);
     virtual void DoGetTextExtent( const wxString &string,
                                 wxCoord *width, wxCoord *height,
                                 wxCoord *descent = (wxCoord *) NULL,
index 4edf65a924b0064a98cd892af01b6a1e11e79721..5878677d9ee5b775155e8dd68fccfff86338e5d7 100644 (file)
@@ -113,6 +113,7 @@ protected:
     virtual void DoCrossHair(wxCoord x, wxCoord y);
 
     virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y);
+    virtual void DoDrawRotatedText(const wxString &text, long x, long y, double angle);
 
     virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
             wxDC *source, wxCoord xsrc, wxCoord ysrc,
index 07bbb0013cd313ffdbe581fe22d06ae32aa38518..8276e2a00ba217029ef4c40e4df77e8384e3228b 100644 (file)
@@ -166,6 +166,8 @@ protected:
                               bool useMask = FALSE);
 
     virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y);
+    virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y,
+                                   double angle);
 
     virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height,
                         wxDC *source, wxCoord xsrc, wxCoord ysrc,
index 15feff1a17baf54870be97d57749ae86fe696da8..5054fea5f7d2f8c5cc3d8ba158f50b026575f149 100644 (file)
@@ -278,6 +278,9 @@ void MyCanvas::OnPaint(wxPaintEvent &WXUNUSED(event))
 
     dc.DrawText( "This is text", 110, 10 );
 
+    dc.DrawRotatedText( "+90 rotated text", 30, 30, 90 );
+    dc.DrawRotatedText( "-90 rotated text", 30, 30, -90 );
+
     dc.SetFont( wxFont( 18, wxSWISS, wxNORMAL, wxNORMAL ) );
 
     dc.DrawText( "This is Swiss 18pt text.", 110, 40 );
index 5003ec570afdcab50cf57f1b7b4d1087e5dd7abe..7966f5479b11d324b6c95ab4cdde78c68d2b9762 100644 (file)
@@ -780,10 +780,10 @@ void wxPrintPreviewBase::SetZoom(int percent)
         m_previewBitmap = NULL;
     }
 
-
     if (m_previewCanvas)
     {
         RenderPage(m_currentPage);
+        ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0);
         m_previewCanvas->Clear();
         m_previewCanvas->Refresh();
     }
index bf484f5b9e84406d9bd1cd91dc04010594cbb56d..fceb1aaa03565f30f722fe29cd4703014fb1eed0 100644 (file)
@@ -1240,6 +1240,116 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord 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
+
+    // XXX only correct for 90 degrees
+    fprintf( m_pstream, "%ld %ld 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"
+               "%ld %ld moveto\n"              
+               "%ld setlinewidth\n"
+               "%ld %ld 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)
 {
index 31b0bf61bd5175b7d88dcbb5f34931e142c9cc58..01e03030ab5d8c266698b7333a0b819ba29da57c 100644 (file)
@@ -39,7 +39,7 @@ static GdkPixmap **hatch_bitmap = (GdkPixmap **) NULL;
 // constants
 //-----------------------------------------------------------------------------
 
-#define RAD2DEG 57.2957795131
+const double RAD2DEG  = 180.0 / M_PI;
 
 //-----------------------------------------------------------------------------
 // temporary implementation of the missing GDK function
@@ -85,6 +85,25 @@ void gdk_draw_bitmap     (GdkDrawable  *drawable,
                 1 );
 }
 
+/*
+ * compare two doubles and return the larger rounded
+ * to the nearest int
+ */
+static int roundmax(double a, double b)
+{
+    return (int)((a > b ? a : b) + 0.5);
+}
+
+/*
+ * compare two doubles and return the smaller rounded
+ * to the nearest int
+ */
+static int roundmin(double a, double b)
+{
+    return (int)((a < b ? a : b) - 0.5);
+}
+
+
 //-----------------------------------------------------------------------------
 // wxWindowDC
 //-----------------------------------------------------------------------------
@@ -783,18 +802,97 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
        properties (see wxXt implementation) */
     if (m_font.GetUnderlined())
     {
-        wxCoord width = gdk_string_width( font, text.mbc_str() );
-        wxCoord ul_y = y + font->ascent;
+        long width = gdk_string_width( font, text.mbc_str() );
+        long ul_y = y + font->ascent;
         if (font->descent > 0) ul_y++;
         gdk_draw_line( m_window, m_textGC, x, ul_y, x + width, ul_y);
     }
 
-    wxCoord w, h;
+    long w, h;
     GetTextExtent (text, &w, &h);
     CalcBoundingBox (x + w, y + h);
     CalcBoundingBox (x, y);
 }
 
+void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, double angle )
+{
+    if (angle == 0.0)
+    {
+        DrawText(text, x, y);
+        return;
+    }
+
+    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+
+    if (!m_window) return;
+
+    GdkFont *font = m_font.GetInternalFont( m_scaleY );
+
+    wxCHECK_RET( font, wxT("invalid font") );
+
+    x = XLOG2DEV(x);
+    y = YLOG2DEV(y);
+
+    int cx = gdk_string_width( font, text.mbc_str() );
+    int cy = font->ascent + font->descent;
+
+    wxBitmap src(cx, cy);
+    wxMemoryDC dc;
+    dc.SelectObject(src);
+    dc.SetFont(GetFont());
+    dc.SetBackground(*wxWHITE_BRUSH);
+    dc.SetBrush(*wxBLACK_BRUSH);
+    dc.Clear();
+    dc.DrawText(text, 0, 0);
+    dc.SetFont(wxNullFont);
+
+    // Calculate the size of the rotated bounding box.
+    double dx = cos(angle / 180.0 * M_PI);
+    double dy = sin(angle / 180.0 * M_PI);
+    double x4 = -cy * dy;
+    double y4 = cy * dx;
+    double x3 = cx * dx;
+    double y3 = cx * dy;
+    double x2 = x3 + x4;
+    double y2 = y3 + y4;
+    double x1 = x;
+    double y1 = y;
+
+    // Create image from the source bitmap after writing the text into it.
+    wxImage  image(src);
+
+    int minx = roundmin(0, roundmin(x4, roundmin(x2, x3)));
+    int miny = roundmin(0, roundmin(y4, roundmin(y2, y3)));
+    int maxx = roundmax(0, roundmax(x4, roundmax(x2, x3)));
+    int maxy = roundmax(0, roundmax(y4, roundmax(y2, y3)));
+
+    // This rotates counterclockwise around the top left corner.
+    for (int rx = minx; rx < maxx; rx++)
+    {
+        for (int ry = miny; ry < maxy; ry++)
+        {
+            // transform dest coords to source coords
+            int sx = (int) (rx * dx + ry * dy + 0.5);
+            int sy = (int) (ry * dx - rx * dy + 0.5);
+            if (sx >= 0 && sx < cx && sy >= 0 && sy < cy)
+            {
+                // draw black pixels, ignore white ones (i.e. transparent b/g)
+                if (image.GetRed(sx, sy) == 0)
+                {
+                    DrawPoint(x1 + maxx - rx, cy + y1 - ry);
+                }
+                else
+                {
+                    // Background
+                    //DrawPoint(x1 + maxx - rx, cy + y1 + maxy - ry);
+                }
+            }
+        }
+    }
+
+    // TODO call CalcBoundingBox()
+}
+
 void wxWindowDC::DoGetTextExtent(const wxString &string,
                                  wxCoord *width, wxCoord *height,
                                  wxCoord *descent, wxCoord *externalLeading,
index 31b0bf61bd5175b7d88dcbb5f34931e142c9cc58..01e03030ab5d8c266698b7333a0b819ba29da57c 100644 (file)
@@ -39,7 +39,7 @@ static GdkPixmap **hatch_bitmap = (GdkPixmap **) NULL;
 // constants
 //-----------------------------------------------------------------------------
 
-#define RAD2DEG 57.2957795131
+const double RAD2DEG  = 180.0 / M_PI;
 
 //-----------------------------------------------------------------------------
 // temporary implementation of the missing GDK function
@@ -85,6 +85,25 @@ void gdk_draw_bitmap     (GdkDrawable  *drawable,
                 1 );
 }
 
+/*
+ * compare two doubles and return the larger rounded
+ * to the nearest int
+ */
+static int roundmax(double a, double b)
+{
+    return (int)((a > b ? a : b) + 0.5);
+}
+
+/*
+ * compare two doubles and return the smaller rounded
+ * to the nearest int
+ */
+static int roundmin(double a, double b)
+{
+    return (int)((a < b ? a : b) - 0.5);
+}
+
+
 //-----------------------------------------------------------------------------
 // wxWindowDC
 //-----------------------------------------------------------------------------
@@ -783,18 +802,97 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
        properties (see wxXt implementation) */
     if (m_font.GetUnderlined())
     {
-        wxCoord width = gdk_string_width( font, text.mbc_str() );
-        wxCoord ul_y = y + font->ascent;
+        long width = gdk_string_width( font, text.mbc_str() );
+        long ul_y = y + font->ascent;
         if (font->descent > 0) ul_y++;
         gdk_draw_line( m_window, m_textGC, x, ul_y, x + width, ul_y);
     }
 
-    wxCoord w, h;
+    long w, h;
     GetTextExtent (text, &w, &h);
     CalcBoundingBox (x + w, y + h);
     CalcBoundingBox (x, y);
 }
 
+void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, double angle )
+{
+    if (angle == 0.0)
+    {
+        DrawText(text, x, y);
+        return;
+    }
+
+    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+
+    if (!m_window) return;
+
+    GdkFont *font = m_font.GetInternalFont( m_scaleY );
+
+    wxCHECK_RET( font, wxT("invalid font") );
+
+    x = XLOG2DEV(x);
+    y = YLOG2DEV(y);
+
+    int cx = gdk_string_width( font, text.mbc_str() );
+    int cy = font->ascent + font->descent;
+
+    wxBitmap src(cx, cy);
+    wxMemoryDC dc;
+    dc.SelectObject(src);
+    dc.SetFont(GetFont());
+    dc.SetBackground(*wxWHITE_BRUSH);
+    dc.SetBrush(*wxBLACK_BRUSH);
+    dc.Clear();
+    dc.DrawText(text, 0, 0);
+    dc.SetFont(wxNullFont);
+
+    // Calculate the size of the rotated bounding box.
+    double dx = cos(angle / 180.0 * M_PI);
+    double dy = sin(angle / 180.0 * M_PI);
+    double x4 = -cy * dy;
+    double y4 = cy * dx;
+    double x3 = cx * dx;
+    double y3 = cx * dy;
+    double x2 = x3 + x4;
+    double y2 = y3 + y4;
+    double x1 = x;
+    double y1 = y;
+
+    // Create image from the source bitmap after writing the text into it.
+    wxImage  image(src);
+
+    int minx = roundmin(0, roundmin(x4, roundmin(x2, x3)));
+    int miny = roundmin(0, roundmin(y4, roundmin(y2, y3)));
+    int maxx = roundmax(0, roundmax(x4, roundmax(x2, x3)));
+    int maxy = roundmax(0, roundmax(y4, roundmax(y2, y3)));
+
+    // This rotates counterclockwise around the top left corner.
+    for (int rx = minx; rx < maxx; rx++)
+    {
+        for (int ry = miny; ry < maxy; ry++)
+        {
+            // transform dest coords to source coords
+            int sx = (int) (rx * dx + ry * dy + 0.5);
+            int sy = (int) (ry * dx - rx * dy + 0.5);
+            if (sx >= 0 && sx < cx && sy >= 0 && sy < cy)
+            {
+                // draw black pixels, ignore white ones (i.e. transparent b/g)
+                if (image.GetRed(sx, sy) == 0)
+                {
+                    DrawPoint(x1 + maxx - rx, cy + y1 - ry);
+                }
+                else
+                {
+                    // Background
+                    //DrawPoint(x1 + maxx - rx, cy + y1 + maxy - ry);
+                }
+            }
+        }
+    }
+
+    // TODO call CalcBoundingBox()
+}
+
 void wxWindowDC::DoGetTextExtent(const wxString &string,
                                  wxCoord *width, wxCoord *height,
                                  wxCoord *descent, wxCoord *externalLeading,
index 76842a117f5fb01ee6ea631a9e3d880829e3fa63..d126382fd20fe059775a7c804434c1cd87fa25cb 100644 (file)
@@ -75,8 +75,6 @@ static Pixmap bdiag, cdiag, fdiag, cross, horiz, verti;
 // constants
 // ----------------------------------------------------------------------------
 
-#define RAD2DEG 57.2957795131
-
 // Fudge factor (VZ: what??)
 #define WX_GC_CF 1
 
@@ -106,6 +104,25 @@ static void XCopyRemote(Display *src_display, Display *dest_display,
 // implementation
 // ============================================================================
 
+/*
+ * compare two doubles and return the larger rounded
+ * to the nearest int
+ */
+static int roundmax(double a, double b)
+{
+    return (int)((a > b ? a : b) + 0.5);
+}
+
+/*
+ * compare two doubles and return the smaller rounded
+ * to the nearest int
+ */
+static int roundmin(double a, double b)
+{
+    return (int)((a < b ? a : b) - 0.5);
+}
+
+
 // ----------------------------------------------------------------------------
 // wxWindowDC
 // ----------------------------------------------------------------------------
@@ -1171,6 +1188,145 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
     CalcBoundingBox (x, y);
 }
 
+void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, double angle )
+{
+    if (angle == 0.0)
+    {
+        DrawText(text, x, y);
+        return;
+    }
+
+    wxCHECK_RET( Ok(), "invalid dc" );
+
+    // Since X draws from the baseline of the text, must add the text height
+    int cx = 0;
+    int cy = 0;
+    int ascent = 0;
+    int slen;
+
+    slen = strlen(text);
+
+    if (m_font.Ok())
+    {
+        // Calculate text extent.
+        WXFontStructPtr pFontStruct = m_font.GetFontStruct(m_userScaleY*m_logicalScaleY, m_display);
+        int direction, descent;
+        XCharStruct overall_return;
+#if 0
+        if (use16)
+            (void)XTextExtents16((XFontStruct*) pFontStruct, (XChar2b *)(const char*) text, slen, &direction,
+            &ascent, &descent, &overall_return);
+        else
+#endif // 0
+            (void)XTextExtents((XFontStruct*) pFontStruct, (char*) (const char*) text, slen, &direction,
+                               &ascent, &descent, &overall_return);
+
+        cx = overall_return.width;
+        cy = ascent + descent;
+    }
+
+    wxBitmap src(cx, cy);
+    wxMemoryDC dc;
+    dc.SelectObject(src);
+    dc.SetFont(GetFont());
+    dc.SetBackground(*wxWHITE_BRUSH);
+    dc.SetBrush(*wxBLACK_BRUSH);
+    dc.Clear();
+    dc.DrawText(text, 0, 0);
+    dc.SetFont(wxNullFont);
+
+    // Calculate the size of the rotated bounding box.
+    double dx = cos(angle / 180.0 * M_PI);
+    double dy = sin(angle / 180.0 * M_PI);
+    double x4 = -cy * dy;
+    double y4 = cy * dx;
+    double x3 = cx * dx;
+    double y3 = cx * dy;
+    double x2 = x3 + x4;
+    double y2 = y3 + y4;
+    double x1 = x;
+    double y1 = y;
+
+    // Create image from the source bitmap after writing the text into it.
+    wxImage  image(src);
+
+    int minx = roundmin(0, roundmin(x4, roundmin(x2, x3)));
+    int miny = roundmin(0, roundmin(y4, roundmin(y2, y3)));
+    int maxx = roundmax(0, roundmax(x4, roundmax(x2, x3)));
+    int maxy = roundmax(0, roundmax(y4, roundmax(y2, y3)));
+
+    // This rotates counterclockwise around the top left corner.
+    for (int rx = minx; rx < maxx; rx++)
+    {
+        for (int ry = miny; ry < maxy; ry++)
+        {
+            // transform dest coords to source coords
+            int sx = (int) (rx * dx + ry * dy + 0.5);
+            int sy = (int) (ry * dx - rx * dy + 0.5);
+            if (sx >= 0 && sx < cx && sy >= 0 && sy < cy)
+            {
+                // draw black pixels, ignore white ones (i.e. transparent b/g)
+                if (image.GetRed(sx, sy) == 0)
+                {
+                {
+                    DrawPoint(x1 + maxx - rx, cy + y1 - ry);
+                }
+                else
+                {
+                    // Background
+                    //DrawPoint(x1 + maxx - rx, cy + y1 + maxy - ry);
+                }
+            }
+        }
+    }
+
+#if 0
+    // First draw a rectangle representing the text background, if a text
+    // background is specified
+    if (m_textBackgroundColour.Ok () && (m_backgroundMode != wxTRANSPARENT))
+    {
+        wxColour oldPenColour = m_currentColour;
+        m_currentColour = m_textBackgroundColour;
+        bool sameColour = (oldPenColour.Ok () && m_textBackgroundColour.Ok () &&
+            (oldPenColour.Red () == m_textBackgroundColour.Red ()) &&
+            (oldPenColour.Blue () == m_textBackgroundColour.Blue ()) &&
+            (oldPenColour.Green () == m_textBackgroundColour.Green ()));
+
+        // This separation of the big && test required for gcc2.7/HP UX 9.02
+        // or pixel value can be corrupted!
+        sameColour = (sameColour &&
+            (oldPenColour.GetPixel() == m_textBackgroundColour.GetPixel()));
+
+        if (!sameColour || !GetOptimization())
+        {
+            int pixel = m_textBackgroundColour.AllocColour(m_display);
+            m_currentColour = m_textBackgroundColour;
+
+            // Set the GC to the required colour
+            if (pixel > -1)
+            {
+                XSetForeground ((Display*) m_display, (GC) m_gc, pixel);
+                if (m_window && m_window->GetBackingPixmap())
+                    XSetForeground ((Display*) m_display,(GC) m_gcBacking, pixel);
+            }
+        }
+        else
+            m_textBackgroundColour = oldPenColour ;
+
+        XFillRectangle ((Display*) m_display, (Pixmap) m_pixmap, (GC) m_gc, XLOG2DEV (x), YLOG2DEV (y), cx, cy);
+        if (m_window && m_window->GetBackingPixmap())
+            XFillRectangle ((Display*) m_display, (Pixmap) m_window->GetBackingPixmap(),(GC) m_gcBacking,
+            XLOG2DEV_2 (x), YLOG2DEV_2 (y), cx, cy);
+    }
+#endif
+
+    long w, h;
+    // XXX use pixmap size
+    GetTextExtent (text, &w, &h);
+    CalcBoundingBox (x + w, y + h);
+    CalcBoundingBox (x, y);
+}
+
 bool wxWindowDC::CanGetTextExtent() const
 {
     return TRUE;
@@ -2205,7 +2361,7 @@ static void wx_spline_draw_point_array(wxDC *dc)
 void wxWindowDC::DoDrawSpline( wxList *points )
 {
     wxCHECK_RET( Ok(), wxT("invalid window dc") );
-  
+
     wxPoint *p;
     double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
     double           x1, y1, x2, y2;
index 7216cb8f6956b6855c77145e6e3f1ee67fe8cb5a..cd18a5005f64c014a16f6dd9f844d94e772ac39b 100644 (file)
@@ -655,6 +655,13 @@ void wxDC::DoDrawText(const wxString& text, wxCoord x, wxCoord y)
     CalcBoundingBox((x + w), (y + h));
 }
 
+void wxDC::DoDrawRotatedText(const wxString& text,
+                             wxCoord x, wxCoord y,
+                             double angle)
+{
+    wxFAIL_MSG( _T("TODO") );
+}
+
 // ---------------------------------------------------------------------------
 // set GDI objects
 // ---------------------------------------------------------------------------