]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/dcpsg.cpp
Program args fix for WinCE
[wxWidgets.git] / src / generic / dcpsg.cpp
index 8f7d2b07de9c1c6aac35ca7e8a707bb9bc6c5beb..5fc793f2509921e36aaaffa1cc50052b9954bb9e 100644 (file)
@@ -1285,6 +1285,25 @@ void draw_bezier_outline(wxPostScriptDC* caller,
 
 #endif
 
 
 #endif
 
+
+#if wxUSE_PANGO
+static void InitializePangoContext(PangoContext *context)
+{
+#ifdef __WXGTK__
+    pango_context_set_base_dir(context,
+                               gtk_widget_get_default_direction() == GTK_TEXT_DIR_LTR ?
+                    PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
+    pango_context_set_language(context, gtk_get_default_language());
+#else
+    // FIXME: assuming LTR is incorrect!
+    pango_context_set_base_dir(context, PANGO_DIRECTION_LTR);
+    wxString lang = wxGetLocale()->GetCanonicalName();
+    pango_context_set_language(context,
+                               pango_language_from_string(lang.ToAscii()));
+#endif
+}
+#endif
+
 void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
 void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
 {
     wxCHECK_RET( m_ok, wxT("invalid postscript dc") );
@@ -1333,13 +1352,12 @@ void wxPostScriptDC::DoDrawText( const wxString& text, wxCoord x, wxCoord y )
     int ps_dpi = 72;
     int pango_dpi = 600;
     PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi );
     int ps_dpi = 72;
     int pango_dpi = 600;
     PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi );
+    
+    InitializePangoContext(context);
 
     double scale = (double)pango_dpi / (double)ps_dpi;
     scale /= m_userScaleY;
 
 
     double scale = (double)pango_dpi / (double)ps_dpi;
     scale /= m_userScaleY;
 
-    pango_context_set_language (context, pango_language_from_string ("en_US"));
-    pango_context_set_base_dir (context, PANGO_DIRECTION_LTR );
-
     pango_context_set_font_description (context, m_font.GetNativeFontInfo()->description );
 
     PangoLayout *layout = pango_layout_new (context);
     pango_context_set_font_description (context, m_font.GetNativeFontInfo()->description );
 
     PangoLayout *layout = pango_layout_new (context);
@@ -2069,12 +2087,11 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
     int pango_dpi = 600;
     PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi );
 
     int pango_dpi = 600;
     PangoContext *context = pango_ft2_get_context ( pango_dpi, pango_dpi );
 
+    InitializePangoContext(context);
+
     double scale = pango_dpi / wx_dpi;
     scale /= m_userScaleY;
 
     double scale = pango_dpi / wx_dpi;
     scale /= m_userScaleY;
 
-    pango_context_set_language (context, pango_language_from_string ("en_US"));
-    pango_context_set_base_dir (context, PANGO_DIRECTION_LTR );
-
     PangoLayout *layout = pango_layout_new (context);
 
     PangoFontDescription *desc = fontToUse->GetNativeFontInfo()->description;
     PangoLayout *layout = pango_layout_new (context);
 
     PangoFontDescription *desc = fontToUse->GetNativeFontInfo()->description;
@@ -2086,17 +2103,18 @@ void wxPostScriptDC::DoGetTextExtent(const wxString& string,
     const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata );
 #endif
     pango_layout_set_text(layout, (const char*) data, strlen( (const char*) data ));
     const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata );
 #endif
     pango_layout_set_text(layout, (const char*) data, strlen( (const char*) data ));
-    PangoLayoutLine *line = (PangoLayoutLine *)pango_layout_get_lines(layout)->data;
 
     PangoRectangle rect;
 
     PangoRectangle rect;
-    pango_layout_line_get_extents(line, NULL, &rect);
+    pango_layout_get_extents(layout, NULL, &rect);
 
 
-    if (x) (*x) = (wxCoord) ( rect.width / PANGO_SCALE / scale );
-    if (y) (*y) = (wxCoord) ( rect.height / PANGO_SCALE / scale );
+    if (x) (*x) = (wxCoord) ( PANGO_PIXELS(rect.width) / scale );
+    if (y) (*y) = (wxCoord) ( PANGO_PIXELS(rect.height) / scale );
     if (descent)
     {
     if (descent)
     {
-        // Do something about metrics here
-        (*descent) = 0;
+        PangoLayoutIter *iter = pango_layout_get_iter(layout);
+        int baseline = pango_layout_iter_get_baseline(iter);
+        pango_layout_iter_free(iter);
+        *descent = wxCoord(*y - PANGO_PIXELS(baseline) / scale);
     }
     if (externalLeading) (*externalLeading) = 0;  // ??
 
     }
     if (externalLeading) (*externalLeading) = 0;  // ??