]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/textmeasure.cpp
Fix for #15520: wxRichTextCtrl: Drawing the selection doesn't respect its container...
[wxWidgets.git] / src / gtk / textmeasure.cpp
index 2cc403e04685a8703910ad9d329a35b0e2634167..407a62f36be1abefefc143e50bf695c321676878 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "wx/fontutil.h"
 #include "wx/gtk/private.h"
+#include "wx/gtk/dc.h"
 
 #ifndef __WXGTK3__
     #include "wx/gtk/dcclient.h"
 
 void wxTextMeasure::Init()
 {
-    wxASSERT_MSG( m_font, wxT("wxTextMeasure needs a valid wxFont") );
+    m_context = NULL;
+    m_layout = NULL;
 
 #ifndef __WXGTK3__
     m_wdc = NULL;
+
+    if ( m_dc )
+    {
+        wxClassInfo* const ci = m_dc->GetImpl()->GetClassInfo();
+
+        // Currently the code here only works with wxWindowDCImpl and only in
+        // wxGTK2 as wxGTK3 uses Cairo and not Pango for all its DCs.
+        if ( ci->IsKindOf(wxCLASSINFO(wxWindowDCImpl)))
+        {
+            m_useDCImpl = false;
+        }
+    }
 #endif // GTK+ < 3
-    m_context = NULL;
-    m_layout = NULL;
 }
 
 // Get Gtk needed elements, if we have not them yet.
@@ -72,7 +84,7 @@ void wxTextMeasure::BeginMeasuring()
     if ( m_layout )
     {
         pango_layout_set_font_description(m_layout,
-                                          m_font->GetNativeFontInfo()->description);
+                                          GetFont().GetNativeFontInfo()->description);
     }
 }
 
@@ -103,14 +115,17 @@ void wxTextMeasure::DoGetTextExtent(const wxString& string,
 {
     if ( !m_context )
     {
-        *width =
-        *height = 0;
+        if ( width )
+            *width = 0;
+
+        if ( height )
+            *height = 0;
         return;
     }
 
     // Set layout's text
-    const wxCharBuffer dataUTF8 = wxGTK_CONV_FONT(string, *m_font);
-    if ( !dataUTF8 )
+    const wxCharBuffer dataUTF8 = wxGTK_CONV_FONT(string, GetFont());
+    if ( !dataUTF8 && !string.empty() )
     {
         // hardly ideal, but what else can we do if conversion failed?
         wxLogLastError(wxT("GetTextExtent"));
@@ -149,10 +164,13 @@ void wxTextMeasure::DoGetTextExtent(const wxString& string,
 
 bool wxTextMeasure::DoGetPartialTextExtents(const wxString& text,
                                             wxArrayInt& widths,
-                                            double WXUNUSED(scaleX))
+                                            double scaleX)
 {
+    if ( !m_layout )
+        return wxTextMeasureBase::DoGetPartialTextExtents(text, widths, scaleX);
+
     // Set layout's text
-    const wxCharBuffer dataUTF8 = wxGTK_CONV_FONT(text, *m_font);
+    const wxCharBuffer dataUTF8 = wxGTK_CONV_FONT(text, GetFont());
     if ( !dataUTF8 )
     {
         // hardly ideal, but what else can we do if conversion failed?