+ pango_context_set_font_description (context, m_font.GetNativeFontInfo()->description );
+
+ PangoLayout *layout = pango_layout_new (context);
+#if wxUSE_UNICODE
+ wxCharBuffer buffer = wxConvUTF8.cWC2MB( text );
+#else
+ wxCharBuffer buffer = wxConvUTF8.cWC2MB( wxConvLocal.cWX2WC( text ) );
+#endif
+ pango_layout_set_text( layout, (const char*) buffer, strlen(buffer) );
+
+ PsPrintf( wxT("%%%% %s\n"), text.c_str() );
+
+ PangoRectangle rect;
+ pango_layout_get_extents(layout, NULL, &rect);
+
+ int xx = LogicalToDeviceX( x );
+ int yy = LogicalToDeviceY( y );
+
+ int xxx = xx * PANGO_SCALE;
+ int yyy = yy * PANGO_SCALE - (int)(rect.height * 0.66 / scale); // Move down by estimated baseline. HACK.
+
+#define ps_kludge_factor 2.8
+
+ // Loop over lines in layout
+ int num_lines = pango_layout_get_line_count( layout );
+ for (int i = 0; i < num_lines; i++)
+ {
+ PangoLayoutLine *line = pango_layout_get_line( layout, i );
+
+ // width of glyphs already printed
+ int all_width = 0;
+
+ // Loop over runs in line
+ GSList *runs_list = line->runs;
+ while (runs_list)
+ {
+ PangoLayoutRun *run = (PangoLayoutRun*) runs_list->data;
+ PangoItem *item = run->item;
+ PangoGlyphString *glyphs = run->glyphs;
+ PangoAnalysis *analysis = &item->analysis;
+ PangoFont *font = analysis->font;
+ FT_Face ft_face = pango_ft2_font_get_face(font);
+
+ int num_glyphs = glyphs->num_glyphs;
+ for (int glyph_idx = 0; glyph_idx < num_glyphs; glyph_idx++)
+ {
+ PangoGlyphGeometry geometry = glyphs->glyphs[glyph_idx].geometry;
+ int pos_x = xxx + (int)((double)(all_width+geometry.x_offset) / scale);
+ int pos_y = yyy + (int)((double)geometry.y_offset / scale );
+ all_width += geometry.width;
+
+ draw_bezier_outline( this, ft_face,
+ (FT_UInt)(glyphs->glyphs[glyph_idx].glyph),
+ pos_x / PANGO_SCALE,
+ pos_y / PANGO_SCALE,
+ 1.0/(ps_kludge_factor * scale * 26.6),
+ 1.0/(ps_kludge_factor * scale * 26.6) );
+ }
+ runs_list = runs_list->next;
+ }
+ }
+
+ g_object_unref( G_OBJECT( layout ) );
+ g_object_unref( G_OBJECT( context ) );
+#else // !wxUSE_PANGO
+ wxCoord text_w, text_h, text_descent;
+
+ GetTextExtent(text, &text_w, &text_h, &text_descent);
+
+ // VZ: this seems to be unnecessary, so taking it out for now, if it
+ // doesn't create any problems, remove this comment entirely
+ //SetFont( m_font );
+
+
+ int size = m_font.GetPointSize();
+
+// 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
+
+ PsPrintf( wxT("%d %d moveto\n"), LogicalToDeviceX(x), LogicalToDeviceY(by) );
+ PsPrint( "(" );
+
+ const wxWX2MBbuf textbuf = text.mb_str();
+ size_t len = strlen(textbuf);
+ size_t i;
+ for (i = 0; i < len; i++)
+ {
+ int c = (unsigned char) textbuf[i];
+ if (c == ')' || c == '(' || c == '\\')
+ {