]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/graphicc.cpp
testing header replace
[wxWidgets.git] / src / generic / graphicc.cpp
index 1540753a93c5433ae0a68b5ceaccf7f03bb52b54..6b29c3a90284998bbd034aba7181f8c505378f03 100644 (file)
@@ -165,7 +165,7 @@ public :
     // gets the bounding box enclosing all points (possibly including control points)
     virtual void GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h) const;
 
-    virtual bool Contains( wxDouble x, wxDouble y, int fillStyle = wxWINDING_RULE) const;
+    virtual bool Contains( wxDouble x, wxDouble y, wxPolygonFillMode fillStyle = wxWINDING_RULE) const;
 
 private :
     cairo_t* m_pathContext;
@@ -291,9 +291,11 @@ public:
     virtual void Apply( wxGraphicsContext* context );
 #ifdef __WXGTK__
     const PangoFontDescription* GetFont() const { return m_font; }
+    bool GetUnderlined() const { return m_underlined; }
 #endif
 private :
     double m_size;
+    bool m_underlined;
     double m_red;
     double m_green;
     double m_blue;
@@ -311,8 +313,6 @@ private :
 
 class WXDLLIMPEXP_CORE wxCairoContext : public wxGraphicsContext
 {
-    DECLARE_NO_COPY_CLASS(wxCairoContext)
-
 public:
     wxCairoContext( wxGraphicsRenderer* renderer, const wxWindowDC& dc );
     wxCairoContext( wxGraphicsRenderer* renderer, const wxMemoryDC& dc );
@@ -347,10 +347,10 @@ public:
 
     virtual void * GetNativeContext();
 
-    virtual bool SetLogicalFunction( int function );
+    virtual bool SetLogicalFunction( wxRasterOperationMode function );
 
     virtual void StrokePath( const wxGraphicsPath& p );
-    virtual void FillPath( const wxGraphicsPath& p , int fillStyle = wxWINDING_RULE );
+    virtual void FillPath( const wxGraphicsPath& p , wxPolygonFillMode fillStyle = wxWINDING_RULE );
 
     virtual void Translate( wxDouble dx , wxDouble dy );
     virtual void Scale( wxDouble xScale , wxDouble yScale );
@@ -370,7 +370,6 @@ public:
     virtual void PushState();
     virtual void PopState();
 
-    virtual void DrawText( const wxString &str, wxDouble x, wxDouble y);
     virtual void GetTextExtent( const wxString &str, wxDouble *width, wxDouble *height,
                                 wxDouble *descent, wxDouble *externalLeading ) const;
     virtual void GetPartialTextExtents(const wxString& text, wxArrayDouble& widths) const;
@@ -378,7 +377,11 @@ public:
 private:
     void Init(cairo_t *context);
 
+    virtual void DoDrawText( const wxString &str, wxDouble x, wxDouble y );
+
     cairo_t* m_context;
+
+    DECLARE_NO_COPY_CLASS(wxCairoContext)
 };
 
 //-----------------------------------------------------------------------------
@@ -531,7 +534,7 @@ wxCairoPenData::wxCairoPenData( wxGraphicsRenderer* renderer, const wxPen &pen )
         }
         break;
     default :
-        if ( m_pen.GetStyle() >= wxPENSTYLE_FIRST_HATCH 
+        if ( m_pen.GetStyle() >= wxPENSTYLE_FIRST_HATCH
             && m_pen.GetStyle() <= wxPENSTYLE_LAST_HATCH )
         {
             /*
@@ -702,6 +705,7 @@ wxCairoFontData::wxCairoFontData( wxGraphicsRenderer* renderer, const wxFont &fo
     m_blue = col.Blue()/255.0;
     m_alpha = col.Alpha()/255.0;
     m_size = font.GetPointSize();
+    m_underlined = font.GetUnderlined();
 
 #ifdef __WXMAC__
     m_font = cairo_atsui_font_face_create_for_atsu_font_id( font.MacGetATSUFontID() );
@@ -878,7 +882,7 @@ void wxCairoPathData::GetBox(wxDouble *x, wxDouble *y, wxDouble *w, wxDouble *h)
     }
 }
 
-bool wxCairoPathData::Contains( wxDouble x, wxDouble y, int WXUNUSED(fillStyle) ) const
+bool wxCairoPathData::Contains( wxDouble x, wxDouble y, wxPolygonFillMode WXUNUSED(fillStyle) ) const
 {
     return cairo_in_stroke( m_pathContext, x, y) != 0;
 }
@@ -1222,7 +1226,7 @@ void wxCairoContext::StrokePath( const wxGraphicsPath& path )
     }
 }
 
-void wxCairoContext::FillPath( const wxGraphicsPath& path , int fillStyle )
+void wxCairoContext::FillPath( const wxGraphicsPath& path , wxPolygonFillMode fillStyle )
 {
     if ( !m_brush.IsNull() )
     {
@@ -1390,37 +1394,49 @@ void wxCairoContext::DrawIcon( const wxIcon &icon, wxDouble x, wxDouble y, wxDou
 }
 
 
-void wxCairoContext::DrawText( const wxString &str, wxDouble x, wxDouble y )
+void wxCairoContext::DoDrawText(const wxString& str, wxDouble x, wxDouble y)
 {
-    wxCHECK_RET( !m_font.IsNull(), wxT("wxCairoContext::DrawText - no valid font set") );
+    wxCHECK_RET( !m_font.IsNull(),
+                 wxT("wxCairoContext::DrawText - no valid font set") );
 
     if ( str.empty())
         return;
 
-#ifdef __WXGTK__
     const wxCharBuffer data = str.utf8_str();
     if ( !data )
         return;
-    size_t datalen = strlen(data);
+
     ((wxCairoFontData*)m_font.GetRefData())->Apply(this);
 
+#ifdef __WXGTK__
+    size_t datalen = strlen(data);
+
     PangoLayout *layout = pango_cairo_create_layout (m_context);
-    pango_layout_set_font_description( layout, ((wxCairoFontData*)m_font.GetRefData())->GetFont());
+    wxCairoFontData* font_data = (wxCairoFontData*) m_font.GetRefData();
+    pango_layout_set_font_description( layout, font_data->GetFont());
     pango_layout_set_text(layout, data, datalen);
+    
+    if (font_data->GetUnderlined()) 
+    {
+        PangoAttrList *attrs = pango_attr_list_new();
+        PangoAttribute *attr = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE);
+        pango_attr_list_insert(attrs, attr);
+        pango_layout_set_attributes(layout, attrs);
+        pango_attr_list_unref(attrs);
+    }
+
     cairo_move_to(m_context, x, y);
     pango_cairo_show_layout (m_context, layout);
 
     g_object_unref (layout);
 #else
-    ((wxCairoFontData*)m_font.GetRefData())->Apply(this);
     // Cairo's x,y for drawing text is at the baseline, so we need to adjust
     // the position we move to by the ascent.
     cairo_font_extents_t fe;
     cairo_font_extents(m_context, &fe);
     cairo_move_to(m_context, x, y+fe.ascent);
 
-    const wxWX2MBbuf buf(str.mb_str(wxConvUTF8));
-    cairo_show_text(m_context,buf);
+    cairo_show_text(m_context, data);
 #endif
 }
 
@@ -1523,7 +1539,7 @@ void * wxCairoContext::GetNativeContext()
 // Cairo doesn't support bitwise logical function (a.k.a. ROP, raster output
 // mode). Cairo supports Porter-Duff compositing operators, but they are quite
 // different, although in some cases have similar names.
-bool wxCairoContext::SetLogicalFunction( int function )
+bool wxCairoContext::SetLogicalFunction( wxRasterOperationMode function )
 {
     if (m_logicalFunction == function)
         return true;