--- nsFontMetricsPango.cpp.before-crashers	2006-11-08 13:45:07.000000000 -0500
+++ ps	2006-11-09 18:47:25.000000000 -0500
@@ -21,6 +21,8 @@
  * are Copyright (C) 2004 the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
+ *   Christopher Blizzard <blizzard@mozilla.org>
+ *   Behdad Esfahbod <behdad@behdad.org>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -47,20 +49,21 @@
 #define PANGO_ENABLE_ENGINE
 
 #include "nsFontMetricsPango.h"
-#include "nsRenderingContextGTK.h"
-#include "nsDeviceContextGTK.h"
+#include "nsRenderingContextPS.h"
+#include "nsDeviceContextPS.h"
 #include "nsFontConfigUtils.h"
 
+#include "nsPrintfCString.h"
 #include "nsUnicharUtils.h"
 #include "nsQuickSort.h"
 #include "nsFontConfigUtils.h"
 
 #include <fontconfig/fontconfig.h>
-#include <gdk/gdk.h>
-#include <gdk/gdkx.h>
+#include <pango/pangoft2.h>
 #include <freetype/tttables.h>
+#include "nsType1.h"
 
-#include "mozilla-decoder.h"
+#include "mozilla-ps-decoder.h"
 
 #define FORCE_PR_LOG
 #include "prlog.h"
@@ -70,6 +73,35 @@
 static PRLogModuleInfo            *gPangoFontLog;
 static int                         gNumInstances;
 
+
+static void
+default_substitute (FcPattern *pattern,
+                    gpointer   data)
+{
+  FcPatternDel (pattern, FC_HINTING);
+  FcPatternAddBool (pattern, FC_HINTING, 0);
+}
+
+static PangoFontMap *
+get_fontmap (void)
+{
+  static PangoFontMap               *fontmap = NULL;
+
+  if (!fontmap) {
+    fontmap = pango_ft2_font_map_new ();
+    pango_ft2_font_map_set_resolution ((PangoFT2FontMap *)fontmap, 72., 72.);
+    pango_ft2_font_map_set_default_substitute ((PangoFT2FontMap *)fontmap, default_substitute, NULL, NULL);
+  }
+
+  return fontmap;
+}
+
+static PangoContext *
+get_context (void)
+{
+  return pango_ft2_font_map_create_context ((PangoFT2FontMap *) get_fontmap ());
+}
+
 // Defines
 
 // This is the scaling factor that we keep fonts limited to against
@@ -129,7 +161,7 @@ nsFontMetricsPango::nsFontMetricsPango()
         return;
 
     // Initialized the custom decoders
-    if (!mozilla_decoders_init())
+    if (!mozilla_ps_decoders_init(get_fontmap ()))
         initialized = PR_TRUE;
 }
 
@@ -173,11 +205,6 @@ nsFontMetricsPango::Init(const nsFont& a
     
     mPointSize = NSTwipsToFloatPoints(mFont.size);
 
-    // Make sure to clamp the pixel size to something reasonable so we
-    // don't make the X server blow up.
-    nscoord screenPixels = gdk_screen_height();
-    mPointSize = PR_MIN(screenPixels * FONT_MAX_FONT_SCALE, mPointSize);
-
     // enumerate over the font names passed in
     mFont.EnumerateFamilies(nsFontMetricsPango::EnumFontCallback, this);
 
@@ -333,14 +360,14 @@ nsFontMetricsPango::CacheFontMetrics(voi
 
     // mSpaceWidth (width of a space)
     nscoord tmpWidth;
-    GetWidth(" ", 1, tmpWidth, NULL);
+    GetWidth(" ", 1, tmpWidth);
     mSpaceWidth = tmpWidth;
 
     // mAveCharWidth (width of an 'average' char)
     //    XftTextExtents16(GDK_DISPLAY(), xftFont, &xUnichar, 1, &extents);
     //rawWidth = extents.width;
     //mAveCharWidth = NSToCoordRound(rawWidth * f);
-    GetWidth("x", 1, tmpWidth, NULL);
+    GetWidth("x", 1, tmpWidth);
     mAveCharWidth = tmpWidth;
 
     // mXHeight (height of an 'x' character)
@@ -455,11 +482,21 @@ nsFontMetricsPango::GetFontHandle(nsFont
 }
 
 // nsIFontMetricsPango impl
+NS_IMETHODIMP
+nsFontMetricsPango::GetStringWidth(const char *String,nscoord &aWidth,nscoord aLength)
+{
+    return GetWidth (String, (PRUint32) aLength, aWidth);
+}
+
+NS_IMETHODIMP
+nsFontMetricsPango::GetStringWidth(const PRUnichar *aString,nscoord &aWidth,nscoord aLength)
+{
+    return GetWidth (aString, (PRUint32)aLength, aWidth);
+}
 
 nsresult
 nsFontMetricsPango::GetWidth(const char* aString, PRUint32 aLength,
-                             nscoord& aWidth,
-                             nsRenderingContextGTK *aContext)
+                             nscoord& aWidth)
 {
     PangoLayout *layout = pango_layout_new(mPangoContext);
 
@@ -485,8 +522,7 @@ nsFontMetricsPango::GetWidth(const char*
 
 nsresult
 nsFontMetricsPango::GetWidth(const PRUnichar* aString, PRUint32 aLength,
-                             nscoord& aWidth, PRInt32 *aFontID,
-                             nsRenderingContextGTK *aContext)
+                             nscoord& aWidth)
 {
     nsresult rv = NS_OK;
     PangoLayout *layout = pango_layout_new(mPangoContext);
@@ -525,11 +561,47 @@ nsFontMetricsPango::GetWidth(const PRUni
 
 
 nsresult
+nsFontMetricsPango :: GetTextDimensions(const char* aString, PRUint32 aLength,
+                                          nsTextDimensions& aDimensions)
+{
+    nsresult rv = NS_OK;
+
+    PangoLayout *layout = pango_layout_new(mPangoContext);
+
+    pango_layout_set_text(layout, aString, aLength);
+    FixupSpaceWidths(layout,aString);
+
+    // Get the logical extents
+    PangoLayoutLine *line;
+    if (pango_layout_get_line_count(layout) != 1) {
+        printf("Warning: more than one line!\n");
+    }
+    line = pango_layout_get_line(layout, 0);
+
+    PangoRectangle rect;
+    pango_layout_line_get_extents(line, NULL, &rect);
+
+    float P2T;
+    P2T = mDeviceContext->DevUnitsToAppUnits();
+
+    aDimensions.width = NSToCoordRound(rect.width * P2T / PANGO_SCALE);
+    aDimensions.ascent = NSToCoordRound(PANGO_ASCENT(rect) * P2T / PANGO_SCALE);
+    aDimensions.descent = NSToCoordRound(PANGO_DESCENT(rect) * P2T / PANGO_SCALE);
+
+    //    printf("GetTextDimensions %d %d %d\n", aDimensions.width,
+    //aDimensions.ascent, aDimensions.descent);
+
+ loser:
+    g_object_unref(layout);
+
+    return rv;
+}
+
+nsresult
 nsFontMetricsPango::GetTextDimensions(const PRUnichar* aString,
                                       PRUint32 aLength,
                                       nsTextDimensions& aDimensions, 
-                                      PRInt32* aFontID,
-                                      nsRenderingContextGTK *aContext)
+                                      PRInt32* aFontID)
 {
     nsresult rv = NS_OK;
 
@@ -591,13 +663,12 @@ nsFontMetricsPango::GetTextDimensions(co
                                       nsTextDimensions&   aDimensions,
                                       PRInt32&            aNumCharsFit,
                                       nsTextDimensions&   aLastWordDimensions,
-                                      PRInt32*            aFontID,
-                                      nsRenderingContextGTK *aContext)
+                                      PRInt32*            aFontID)
 {
 
     return GetTextDimensionsInternal(aString, aLength, aAvailWidth, aBreaks,
                                      aNumBreaks, aDimensions, aNumCharsFit,
-                                     aLastWordDimensions, aContext);
+                                     aLastWordDimensions);
 
 }
 
@@ -610,8 +681,7 @@ nsFontMetricsPango::GetTextDimensions(co
                                       nsTextDimensions&   aDimensions,
                                       PRInt32&            aNumCharsFit,
                                       nsTextDimensions&   aLastWordDimensions,
-                                      PRInt32*            aFontID,
-                                      nsRenderingContextGTK *aContext)
+                                      PRInt32*            aFontID)
 {
     nsresult rv = NS_OK;
     PRInt32 curBreak = 0;
@@ -664,7 +734,7 @@ nsFontMetricsPango::GetTextDimensions(co
     curBreak = 0;
     rv = GetTextDimensionsInternal(text, strlen(text), aAvailWidth, utf8Breaks,
                                    aNumBreaks, aDimensions, aNumCharsFit,
-                                   aLastWordDimensions, aContext);
+                                   aLastWordDimensions);
 
     // Figure out which of the breaks we ended up using to convert
     // back to utf16 - start from the end.
@@ -686,12 +756,252 @@ nsFontMetricsPango::GetTextDimensions(co
     return rv;
 }
 
+typedef struct _nsPangoRenderer        nsPangoRenderer;
+typedef struct _nsPangoRendererClass   nsPangoRendererClass;
+
+struct _nsPangoRenderer
+{
+  PangoRenderer parent_instance;
+  nsRenderingContextPS *psContext;
+  nsFontMetricsPango *psPangoFontMetrics;
+  float zoom;
+};
+
+struct _nsPangoRendererClass
+{
+  PangoRendererClass parent_class;
+};
+
+#define _PS_TYPE_PANGO_RENDERER            (_ps_pango_renderer_get_type())
+#define _PS_PANGO_RENDERER(object)         (G_TYPE_CHECK_INSTANCE_CAST ((object), _PS_TYPE_PANGO_RENDERER, _nsPangoRenderer))
+#define _PS_IS_PANGO_RENDERER(object)      (G_TYPE_CHECK_INSTANCE_TYPE ((object), _PS_TYPE_PANGO_RENDERER))
+#define _PS_PANGO_RENDERER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), _PS_TYPE_PANGO_RENDERER, _nsPangoRendererClass))
+#define _PS_IS_PANGO_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), _PS_TYPE_PANGO_RENDERER))
+#define _PS_PANGO_RENDERER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), _PS_TYPE_PANGO_RENDERER, _nsPangoRendererClass))
+
+G_DEFINE_TYPE (_nsPangoRenderer, _ps_pango_renderer, PANGO_TYPE_RENDERER)
+
+static PangoRenderer *
+get_renderer (void)
+{
+  static PangoRenderer               *renderer = NULL;
+
+  if (!renderer)
+    renderer = (PangoRenderer *) g_object_new (_PS_TYPE_PANGO_RENDERER, NULL);
+
+  return renderer;
+}
+
+static void
+_ps_pango_renderer_draw_glyphs (PangoRenderer    *renderer,
+				PangoFont        *font,
+				PangoGlyphString *glyphs,
+				int               x,
+				int               y);
+
+static void
+_ps_pango_renderer_class_init (nsPangoRendererClass *klass)
+{
+  PangoRendererClass *renderer_class = PANGO_RENDERER_CLASS (klass);
+  
+  renderer_class->draw_glyphs = _ps_pango_renderer_draw_glyphs;
+}
+
+static void
+_ps_pango_renderer_init (nsPangoRenderer *renderer)
+{
+}
+
+class nsPangoType1Generator : public nsPSFontGenerator {
+public:
+  nsPangoType1Generator();
+  ~nsPangoType1Generator();
+  nsresult Init(PangoFont *aFont);
+  void  GeneratePSFont(FILE* aFile);
+
+protected:
+  PangoFont *mFont;
+};
+
+nsPangoType1Generator::nsPangoType1Generator()
+{
+}
+
+nsresult
+nsPangoType1Generator::Init(PangoFont *aFont)
+{
+  NS_ENSURE_TRUE(aFont, NS_ERROR_FAILURE);
+  mFont = aFont;
+  g_object_ref (mFont);
+  return NS_OK;
+}
+
+nsPangoType1Generator::~nsPangoType1Generator()
+{
+  g_object_unref (mFont);
+  mFont = nsnull;
+}
+
+void nsPangoType1Generator::GeneratePSFont(FILE* aFile)
+{
+  FT_Face face = pango_fc_font_lock_face ((PangoFcFont *) mFont);
+
+  if (face == nsnull)
+    return;
+
+  int wmode = 0;
+  if (mGlyphSubset->Count())
+    FT2SubsetToType1FontSet(face, mGlyphSubset, wmode, aFile);
+
+  pango_fc_font_unlock_face ((PangoFcFont *) mFont);
+}
+
+typedef struct
+{
+  nsCString    *FontNameBase;
+  nsCStringKey *key;
+  int           font_size;
+} PangoFontData;
+
+static void
+ps_pango_font_data_destroy (PangoFontData *data)
+{
+  delete data->key;
+  delete data->FontNameBase;
+  g_free (data);
+}
+
+static void
+flattenName(nsCString& aString)
+{
+  nsCString::iterator start, end;
+  aString.BeginWriting(start);
+  aString.EndWriting(end);
+  while(start != end) {
+    if (*start == ' ')
+      *start= '_';
+    else if (*start == '(')
+      *start = '_';
+    else if (*start == ')')
+      *start = '_';
+    ++start;
+  }
+}
+
+static void
+_ps_pango_renderer_draw_glyphs (PangoRenderer    *renderer,
+				PangoFont        *font,
+				PangoGlyphString *glyphs,
+				int               x,
+				int               y)
+{
+  if (!glyphs->num_glyphs)
+    return;
+
+  static GQuark data_quark = 0;
+  if (!data_quark)
+    data_quark = g_quark_from_static_string ("ps-pango-font-data");
+
+  PangoFontData *data;
+  if (!(data = (PangoFontData *) g_object_get_qdata (G_OBJECT (font), data_quark)))
+    {
+      data = g_new (PangoFontData, 1);
+
+      FT_Face face = pango_fc_font_lock_face ((PangoFcFont *) font);
+      if (face == nsnull)
+        return;
+      int wmode = 0;
+      data->FontNameBase = new nsCString ();
+      if (NS_FAILED(FT2ToType1FontName(face, wmode, *data->FontNameBase))) {
+        g_free (data);
+        pango_fc_font_unlock_face ((PangoFcFont *) font);
+        return;
+      }
+      pango_fc_font_unlock_face ((PangoFcFont *) font);
+
+      PangoFontDescription *desc = pango_font_describe (font);
+      data->font_size = pango_font_description_get_size (desc);
+      pango_font_description_free (desc);
+
+      data->key = new nsCStringKey (*data->FontNameBase);
+
+      g_object_set_qdata_full (G_OBJECT (font), data_quark, data, (GDestroyNotify) ps_pango_font_data_destroy);
+    }
+
+  nsPangoRenderer *ps_renderer = (nsPangoRenderer *)renderer;
+  nsRenderingContextPS *aContext = ps_renderer->psContext;
+  nsFontMetricsPango *metrics = ps_renderer->psPangoFontMetrics;
+  nsDeviceContextPS* dc = NS_REINTERPRET_CAST (nsDeviceContextPS*, metrics->GetDeviceContext());
+  nsPostScriptObj* psObj = aContext->GetPostScriptObj();
+  nsHashtable *psFGList = dc->GetPSFontGeneratorList();
+  g_return_if_fail (psFGList);
+  nsPSFontGenerator* psFontGen = (nsPSFontGenerator*) psFGList->Get(data->key);
+  if (!psFontGen) {
+    nsresult rv;
+    psFontGen = new nsPangoType1Generator;
+    g_return_if_fail (psFontGen);
+    rv = ((nsPangoType1Generator*)psFontGen)->Init(font);
+    if (NS_FAILED(rv)) {
+      delete psFontGen;
+      return;
+    }
+    psFGList->Put(data->key, (void *) psFontGen);
+  }
+  nscoord font_size = NSToCoordRound (ps_renderer->zoom * data->font_size / PANGO_SCALE);
+
+  g_return_if_fail (aContext);
+  g_return_if_fail (psObj);
+
+  nscoord aX = NSToCoordRound(ps_renderer->zoom * x / PANGO_SCALE);
+  nscoord aY = NSToCoordRound(ps_renderer->zoom * y / PANGO_SCALE);
+  psObj->moveto(aX, aY);
+
+  PRInt32 currSubFont, prevSubFont = -1;
+  PRUint32 i;
+  PangoGlyphString gl;
+
+  gl.glyphs = glyphs->glyphs;
+  gl.num_glyphs = 0;
+  for (i = 0; i < glyphs->num_glyphs; ++i) {
+    currSubFont = psFontGen->AddToGlyphSubset(glyphs->glyphs[i].glyph >= 0x00ffffff ? 0 : glyphs->glyphs[i].glyph);
+    if (prevSubFont != currSubFont) {
+      if (prevSubFont != -1)
+        psObj->show(&gl, ps_renderer->zoom,  psFontGen, prevSubFont);
+
+
+      psObj->setfont(*data->FontNameBase, (PRUint32) font_size, currSubFont);
+      prevSubFont = currSubFont;
+      gl.glyphs = glyphs->glyphs + i;
+      gl.num_glyphs = 0;
+    }
+
+    gl.num_glyphs++;
+  }
+
+  if (prevSubFont != -1)
+    psObj->show(&gl, ps_renderer->zoom, psFontGen, prevSubFont);
+}
+
+static void
+draw_layout_line (int x, int y, PangoLayoutLine *line, nsFontMetricsPango *aPangoFontMetrics, nsRenderingContextPS *aContext)
+{
+  PangoRenderer *renderer = get_renderer ();
+  nsPangoRenderer *ps_renderer = (nsPangoRenderer *)renderer;
+  ps_renderer->psContext = aContext;
+  ps_renderer->psPangoFontMetrics = aPangoFontMetrics;
+  nsDeviceContextPS* dc = NS_REINTERPRET_CAST (nsDeviceContextPS*, aPangoFontMetrics->GetDeviceContext());
+  ps_renderer->zoom = dc->DevUnitsToAppUnits();
+
+  pango_renderer_draw_layout_line (renderer, line,
+                                   NSToCoordRound (x * PANGO_SCALE / ps_renderer->zoom),
+                                   NSToCoordRound (y * PANGO_SCALE / ps_renderer->zoom));
+}
+
 nsresult
 nsFontMetricsPango::DrawString(const char *aString, PRUint32 aLength,
                                nscoord aX, nscoord aY,
                                const nscoord* aSpacing,
-                               nsRenderingContextGTK *aContext,
-                               nsDrawingSurfaceGTK *aSurface)
+                               nsRenderingContextPS *aContext)
 {
     PangoLayout *layout = pango_layout_new(mPangoContext);
 
@@ -709,24 +1019,15 @@ nsFontMetricsPango::DrawString(const cha
     }
     line = pango_layout_get_line(layout, 0);
 
-    aContext->UpdateGC();
-    GdkGC *gc = aContext->GetGC();
-
     if (aSpacing && *aSpacing) {
-        DrawStringSlowly(aString, NULL, aLength, aSurface->GetDrawable(),
-                         gc, x, y, line, aSpacing);
+        DrawStringSlowly(aString, NULL, aLength, x, y, line, aSpacing, aContext);
     }
     else {
-        gdk_draw_layout_line(aSurface->GetDrawable(), gc,
-                             x, y,
-                             line);
+       draw_layout_line (x, y, line, this, aContext);
     }
 
-    g_object_unref(gc);
     g_object_unref(layout);
 
-    //    printf("DrawString (char *)\n");
-
     return NS_OK;
 }
 
@@ -735,21 +1036,16 @@ nsFontMetricsPango::DrawString(const PRU
                                nscoord aX, nscoord aY,
                                PRInt32 aFontID,
                                const nscoord* aSpacing,
-                               nsRenderingContextGTK *aContext,
-                               nsDrawingSurfaceGTK *aSurface)
+                               nsRenderingContextPS *aContext)
 {
     nsresult rv = NS_OK;
     int x = aX;
     int y = aY;
 
-    aContext->UpdateGC();
-    GdkGC *gc = aContext->GetGC();
-
     PangoLayout *layout = pango_layout_new(mPangoContext);
 
     gchar *text = g_utf16_to_utf8(aString, aLength,
                                   NULL, NULL, NULL);
-
     if (!text) {
 #ifdef DEBUG
         NS_WARNING("nsFontMetricsPango::DrawString invalid unicode to follow");
@@ -771,31 +1067,24 @@ nsFontMetricsPango::DrawString(const PRU
     line = pango_layout_get_line(layout, 0);
 
     if (aSpacing && *aSpacing) {
-        DrawStringSlowly(text, aString, aLength, aSurface->GetDrawable(),
-                         gc, x, y, line, aSpacing);
+        DrawStringSlowly(text, aString, aLength, x, y, line, aSpacing, aContext);
     }
     else {
-        gdk_draw_layout_line(aSurface->GetDrawable(), gc,
-                             x, y,
-                             line);
+       draw_layout_line (x, y, line, this, aContext);
     }
 
  loser:
 
     g_free(text);
-    g_object_unref(gc);
     g_object_unref(layout);
 
-    //    printf("DrawString\n");
-
     return rv;
 }
 
 #ifdef MOZ_MATHML
 nsresult
 nsFontMetricsPango::GetBoundingMetrics(const char *aString, PRUint32 aLength,
-                                       nsBoundingMetrics &aBoundingMetrics,
-                                       nsRenderingContextGTK *aContext)
+                                       nsBoundingMetrics &aBoundingMetrics)
 {
     printf("GetBoundingMetrics (char *)\n");
     return NS_ERROR_FAILURE;
@@ -805,8 +1094,7 @@ nsresult
 nsFontMetricsPango::GetBoundingMetrics(const PRUnichar *aString,
                                        PRUint32 aLength,
                                        nsBoundingMetrics &aBoundingMetrics,
-                                       PRInt32 *aFontID,
-                                       nsRenderingContextGTK *aContext)
+                                       PRInt32 *aFontID)
 {
     nsresult rv = NS_OK;
     PangoLayout *layout = pango_layout_new(mPangoContext);
@@ -860,21 +1148,14 @@ nsFontMetricsPango::GetBoundingMetrics(c
 
 #endif /* MOZ_MATHML */
 
-GdkFont*
-nsFontMetricsPango::GetCurrentGDKFont(void)
-{
-    return nsnull;
-}
-
 nsresult
 nsFontMetricsPango::SetRightToLeftText(PRBool aIsRTL)
 {
     if (aIsRTL) {
         if (!mRTLPangoContext) {
-            mRTLPangoContext = gdk_pango_context_get();
+            mRTLPangoContext = get_context();
             pango_context_set_base_dir(mRTLPangoContext, PANGO_DIRECTION_RTL);
 
-            gdk_pango_context_set_colormap(mRTLPangoContext, gdk_rgb_get_cmap());
             pango_context_set_language(mRTLPangoContext, GetPangoLanguage(mLangGroup));
             pango_context_set_font_description(mRTLPangoContext, mPangoFontDesc);
         }
@@ -1108,7 +1389,6 @@ nsFontMetricsPango::GetRangeWidth(const 
     return rv;
 }
 
-/* static */
 PRUint32
 nsFontMetricsPango::GetHints(void)
 {
@@ -1128,7 +1408,7 @@ nsFontMetricsPango::FamilyExists(nsIDevi
     NS_ConvertUTF16toUTF8 name(aName);
 
     nsresult rv = NS_ERROR_FAILURE;
-    PangoContext *context = gdk_pango_context_get();
+    PangoContext *context = get_context();
     PangoFontFamily **familyList;
     int n;
 
@@ -1227,16 +1507,13 @@ nsFontMetricsPango::RealizeFont(void)
 
     // Now that we have the font description set up, create the
     // context.
-    mLTRPangoContext = gdk_pango_context_get();
+    mLTRPangoContext = get_context();
     mPangoContext = mLTRPangoContext;
 
     // Make sure to set the base direction to LTR - if layout needs to
     // render RTL text it will use ::SetRightToLeftText()
     pango_context_set_base_dir(mPangoContext, PANGO_DIRECTION_LTR);
 
-    // Set the color map so we can draw later.
-    gdk_pango_context_set_colormap(mPangoContext, gdk_rgb_get_cmap());
-
     // Set the pango language now that we have a context
     pango_context_set_language(mPangoContext, GetPangoLanguage(mLangGroup));
 
@@ -1280,10 +1557,10 @@ void
 nsFontMetricsPango::DrawStringSlowly(const gchar *aText,
                                      const PRUnichar *aOrigString,
                                      PRUint32 aLength,
-                                     GdkDrawable *aDrawable,
-                                     GdkGC *aGC, gint aX, gint aY,
+                                     gint aX, gint aY,
                                      PangoLayoutLine *aLine,
-                                     const nscoord *aSpacing)
+                                     const nscoord *aSpacing,
+                                     nsRenderingContextPS *aContext)
 {
     float app2dev;
     app2dev = mDeviceContext->AppUnitsToDevUnits();
@@ -1344,7 +1621,7 @@ nsFontMetricsPango::DrawStringSlowly(con
         offset += tmpOffset;
     }
 
-    gdk_draw_layout_line(aDrawable, aGC, aX, aY, aLine);
+    draw_layout_line (aX, aY, aLine, this, aContext);
 
     delete[] utf8spacing;
 }
@@ -1357,8 +1634,7 @@ nsFontMetricsPango::GetTextDimensionsInt
                                               PRInt32             aNumBreaks,
                                               nsTextDimensions&   aDimensions,
                                               PRInt32&            aNumCharsFit,
-                                              nsTextDimensions&   aLastWordDimensions,
-                                              nsRenderingContextGTK *aContext)
+                                              nsTextDimensions&   aLastWordDimensions)
 {
     NS_PRECONDITION(aBreaks[aNumBreaks - 1] == aLength, "invalid break array");
 
@@ -1425,7 +1701,7 @@ nsFontMetricsPango::GetTextDimensionsInt
         if ((1 == numChars) && (aString[start] == ' '))
             GetSpaceWidth(twWidth);
         else if (numChars > 0)
-            GetWidth(&aString[start], numChars, twWidth, aContext);
+            GetWidth(&aString[start], numChars, twWidth);
 
         // See if the text fits
         PRBool  textFits = (twWidth + width) <= aAvailWidth;
@@ -1475,8 +1751,7 @@ nsFontMetricsPango::GetTextDimensionsInt
                 if ((1 == numChars) && (aString[start] == ' '))
                     GetSpaceWidth(twWidth);
                 else if (numChars > 0)
-                    GetWidth(&aString[start], numChars, twWidth,
-                             aContext);
+                    GetWidth(&aString[start], numChars, twWidth);
                 width -= twWidth;
                 aNumCharsFit = start;
                 breakIndex--;
