classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] merge from java-gui-20051028-branch


From: graydon hoare
Subject: [cp-patches] merge from java-gui-20051028-branch
Date: Sat, 12 Feb 2005 04:47:20 -0500
User-agent: Mozilla Thunderbird 1.0 (X11/20041206)

hi,

this patch, which I've just committed to classpath, merges in changes made recently on gcj's java-gui-20050128-branch. it should get jedit-on-jamvm-on-classpath to a working state. apologies that it's a big of a jumble; I mistakenly did a bit of work on the glyph rendering machinery while merging, and have had some confusion while untangling those changes.

let this be a lesson to myself: no editing while merging!

-graydon


2005-02-12  Graydon Hoare  <address@hidden>

        * gnu/java/awt/peer/gtk/GdkFontPeer.java
        (getGlyphVector):
        (getFontMetrics):
        (getTextMetrics): New native methods.
        * gnu/java/awt/peer/gtk/GdkFontMetrics.java: Remove native parts.
        * gnu/java/awt/peer/gtk/GdkGlyphVector.java: Likewise.
        * gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java:
        Hold reference to GtkToolkit.
        * gnu/java/awt/peer/gtk/GdkGraphics2D.java
        (cairoSetFont):
        (cairoDrawGdkTextLayout):
        (cairoDrawString):
        (getPeerTextMetrics):
        (getPeerFontMetrics): Remove.
        (setFont): Don't call cairoSetFont.
        (cairoDrawGlyphVector): Accept font peer argument.
        (drawGlyphVector): Pass font peer to cairoDrawGlyphVector.
        * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java:
        (finalize): Call finish from here.
        (produce): Not from here.
        * gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java:
        Hold reference to GdkGraphicsEnvironment.
        * gnu/java/awt/peer/gtk/GtkToolkit.java:
        (getFontMetrics): Change locking.
        (getBounds): New method.
        (getLocalGraphicsEnvironment): Pass reference to this.

        * include/Makefile.am: Remove entries for GdkFontMetrics, 
GdkGlyphVector.
        * include/gnu_java_awt_peer_gtk_GdkFontMetrics.h: Remove.
        * include/gnu_java_awt_peer_gtk_GdkFontPeer.h: Regenerate.
        * include/gnu_java_awt_peer_gtk_GdkGlyphVector.h: Remove.
        * include/gnu_java_awt_peer_gtk_GdkGraphics2D.h: Regenerate.

        * native/jni/gtk-peer/Makefile.am
        Remove entries for GdkFontMetrics, GdkGlyphVector.
        * native/jni/gtk-peer/gdkfont.h: Add #defines, remove struct glyphvec.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
        (ensure_metrics_cairo):
        (Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFont):
        (Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString):
        (Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics):
        (Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics):
        (metrics_cairo):
        (metrics_surface): Remove.
        (Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector):
        Pass and install font peer.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c:
        Release GDK lock while performing upcalls.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c: Remove.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c
        (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector):
        (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics):
        (Java_gnu_java_awt_peer_gtk_GdkFontPeer_getTextMetrics): New methods.
        * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c: Remove.

--- gnu/java/awt/peer/gtk/GdkFontMetrics.java   8 Oct 2004 22:49:27 -0000       
1.11
+++ gnu/java/awt/peer/gtk/GdkFontMetrics.java   12 Feb 2005 09:35:46 -0000
@@ -63,8 +63,6 @@
   static final int TEXT_METRICS_X_ADVANCE = 4;
   static final int TEXT_METRICS_Y_ADVANCE = 5;
 
-  static native void getPeerFontMetrics(GdkFontPeer peer, double [] metrics);
-  static native void getPeerTextMetrics(GdkFontPeer peer, String str, double 
[] metrics);
 
   public GdkFontMetrics (Font font)
   {    
@@ -77,12 +75,7 @@
 
     font_metrics = new int[5];
     double [] hires = new double[5];
-
-    if (GtkToolkit.useGraphics2D ())
-      GdkGraphics2D.getPeerFontMetrics(peer, hires);
-    else
-      getPeerFontMetrics (peer, hires);
-
+    peer.getFontMetrics (hires);
     for (int i = 0; i < 5; ++i)
       font_metrics[i] = (int) hires[i];
   }
@@ -90,10 +83,7 @@
   public int stringWidth (String str)
   {
     double [] hires = new double[6];
-    if (GtkToolkit.useGraphics2D())
-      GdkGraphics2D.getPeerTextMetrics(peer, str, hires);
-    else
-      getPeerTextMetrics(peer, str, hires);
+    peer.getTextMetrics(str, hires);
     return (int) hires [TEXT_METRICS_WIDTH];
   }
 
@@ -115,7 +105,6 @@
   public int getLeading ()
   {
     return 1;
-//      return metrics[ASCENT] + metrics[DESCENT];
   }
 
   public int getAscent ()
--- gnu/java/awt/peer/gtk/GdkFontPeer.java      16 Nov 2004 07:44:44 -0000      
1.3
+++ gnu/java/awt/peer/gtk/GdkFontPeer.java      12 Feb 2005 09:35:46 -0000
@@ -81,6 +81,9 @@
   private native void dispose ();
   private native void setFont (String family, int style, int size, boolean 
useGraphics2D);
 
+  native void getFontMetrics(double [] metrics);
+  native void getTextMetrics(String str, double [] metrics);
+
   protected void finalize ()
   {
     if (GtkToolkit.useGraphics2D ())
@@ -158,26 +161,33 @@
 
   public boolean canDisplay (Font font, char c)
   {
-    throw new UnsupportedOperationException ();
+    // FIXME: inquire with pango
+    return true;
   }
 
   public int canDisplayUpTo (Font font, CharacterIterator i, int start, int 
limit)
   {
-    throw new UnsupportedOperationException ();
+    // FIXME: inquire with pango
+    return -1;
   }
+  
+  private native GdkGlyphVector getGlyphVector(String txt, 
+                                               Font f, 
+                                               FontRenderContext ctx);
 
   public GlyphVector createGlyphVector (Font font, 
                                         FontRenderContext ctx, 
                                         CharacterIterator i)
   {
-    return new GdkGlyphVector(font, this, ctx, buildString (i));
+    return getGlyphVector(buildString (i), font, ctx);
   }
 
   public GlyphVector createGlyphVector (Font font, 
                                         FontRenderContext ctx, 
                                         int[] glyphCodes)
   {
-    return new GdkGlyphVector (font, this, ctx, glyphCodes);
+    return null;
+    //    return new GdkGlyphVector (font, this, ctx, glyphCodes);
   }
 
   public byte getBaselineFor (Font font, char c)
@@ -259,7 +269,8 @@
   public Rectangle2D getStringBounds (Font font, CharacterIterator ci, 
                                       int begin, int limit, FontRenderContext 
frc)
   {
-    throw new UnsupportedOperationException ();
+    GdkGlyphVector gv = getGlyphVector(buildString (ci, begin, limit), font, 
frc);
+    return gv.getVisualBounds();
   }
 
   public boolean hasUniformLineMetrics (Font font)
--- gnu/java/awt/peer/gtk/GdkGlyphVector.java   13 Oct 2004 14:32:33 -0000      
1.5
+++ gnu/java/awt/peer/gtk/GdkGlyphVector.java   12 Feb 2005 09:35:46 -0000
@@ -54,36 +54,57 @@
 public class GdkGlyphVector extends GlyphVector
 {
 
-  static 
+  /* We use a simple representation for glyph vectors here. Glyph i
+   * consumes 8 doubles:
+   *
+   *      logical x: extents[ 10*i     ]
+   *      logical y: extents[ 10*i + 1 ]
+   *  logical width: extents[ 10*i + 2 ]
+   * logical height: extents[ 10*i + 3 ]
+   *
+   *       visual x: extents[ 10*i + 4 ]
+   *       visual y: extents[ 10*i + 5 ]
+   *   visual width: extents[ 10*i + 6 ]
+   *  visual height: extents[ 10*i + 7 ]
+   *
+   *   origin pos x: extents[ 10*i + 8 ]
+   *   origin pos y: extents[ 10*i + 9 ]
+   * 
+   * as well as one int, code[i], representing the glyph code in the font.
+   */
+
+  double [] extents;
+  int [] codes;
+
+  Font font;
+  FontRenderContext fontRenderContext;
+
+  Rectangle2D allLogical;
+  Rectangle2D allVisual;
+
+  public GdkGlyphVector(double[] extents, int[] codes, Font font, 
FontRenderContext frc)
   {
-    if (Configuration.INIT_LOAD_LIBRARY)
+    this.extents = extents;
+    this.codes = codes;
+    this.font = font;
+    this.fontRenderContext = frc;
+
+    allLogical = new Rectangle2D.Double();
+    allVisual = new Rectangle2D.Double();
+    
+    for (int i = 0; i < codes.length; ++i)
       {
-        System.loadLibrary("gtkpeer");
+        allLogical.add (new Rectangle2D.Double(extents[10*i    ] + 
extents[10*i + 8],
+                                               extents[10*i + 1] + 
extents[10*i + 9],
+                                               extents[10*i + 2],
+                                               extents[10*i + 3]));
+
+        allVisual.add (new Rectangle2D.Double(extents[10*i + 4] + extents[10*i 
+ 8],
+                                              extents[10*i + 5] + extents[10*i 
+ 9],
+                                              extents[10*i + 6],
+                                              extents[10*i + 7]));
       }
-
-    if (GtkToolkit.useGraphics2D ())
-      initStaticState ();
   }
-  native static void initStaticState ();
-  private final int native_state = GtkGenericPeer.getUniqueInteger ();
-
-  private Font font;
-  private FontRenderContext ctx;
-    
-  private native void initState (GdkFontPeer peer, FontRenderContext ctx);
-  private native void setChars (String s);
-  private native void setGlyphCodes (int codes[]);
-  private native void dispose ();
-  private native int glyphCode (int idx);
-  private native int numGlyphs ();
-  private native int glyphCharIndex (int idx);
-  private native double[] allLogicalExtents ();
-  private native double[] allInkExtents ();
-  private native double[] glyphLogicalExtents (int idx);
-  private native double[] glyphInkExtents (int idx);
-  private native boolean glyphIsHorizontal (int idx);
-  private native boolean isEqual (GdkGlyphVector ggv);
-
 
   /* 
      geometric notes:
@@ -108,26 +129,14 @@
      
    */
 
-
-  public GdkGlyphVector (Font f, GdkFontPeer peer, FontRenderContext c, String 
s)
+  public double[] getExtents() 
   {
-    font = f;
-    ctx = c;
-    initState (peer, ctx);
-    setChars (s);
+    return extents;
   }
 
-  public GdkGlyphVector (Font f, GdkFontPeer peer, FontRenderContext c, int 
codes[])
+  public int[] getCodes()
   {
-    font = f;
-    ctx = c;
-    initState (peer, ctx);
-    setGlyphCodes (codes);
-  }
-
-  protected void finalize ()
-  {
-    dispose ();
+    return codes;
   }
 
   public Font getFont () 
@@ -137,12 +146,15 @@
 
   public FontRenderContext getFontRenderContext () 
   { 
-    return ctx; 
+    return fontRenderContext; 
   }
 
   public int getGlyphCharIndex (int glyphIndex) 
   { 
-    return glyphCharIndex (glyphIndex); 
+    // FIXME: currently pango does not provide glyph-by-glyph
+    // reverse mapping information, so we assume a broken 1:1
+    // glyph model here. This is plainly wrong.
+    return glyphIndex;
   }
 
   public int[] getGlyphCharIndices (int beginGlyphIndex, 
@@ -154,50 +166,44 @@
       ix = new int[numEntries];
 
     for (int i = 0; i < numEntries; i++)
-      ix[i] = glyphCharIndex (beginGlyphIndex + i);
+      ix[i] = getGlyphCharIndex (beginGlyphIndex + i);
     return ix;
   }
 
   public int getGlyphCode (int glyphIndex) 
   { 
-    return glyphCode (glyphIndex); 
+    return codes[glyphIndex];
   }
 
   public int[] getGlyphCodes (int beginGlyphIndex, int numEntries,
                               int[] codeReturn)
   {
-    int ix[] = codeReturn;
-    if (ix == null)
-      ix = new int[numEntries];
+    if (codeReturn == null)
+      codeReturn = new int[numEntries];
 
-    for (int i = 0; i < numEntries; i++)
-      ix[i] = glyphCode (beginGlyphIndex + i);
-    return ix;
+    System.arraycopy(codes, beginGlyphIndex, codeReturn, 0, numEntries);
+    return codeReturn;
   }
 
-  public Shape getGlyphLogicalBounds (int glyphIndex)
+  public Shape getGlyphLogicalBounds (int i)
   {
-    double extents[] = glyphLogicalExtents (glyphIndex);
-    return new Rectangle2D.Double (extents[0], extents[1],
-                                   extents[2], extents[3]);
+    return new Rectangle2D.Double (extents[8*i], extents[8*i + 1],
+                                   extents[8*i + 2], extents[8*i + 3]);
   }
     
-  public GlyphMetrics getGlyphMetrics (int glyphIndex)
+  public GlyphMetrics getGlyphMetrics (int i)
   {
-    double extents[] = glyphLogicalExtents (glyphIndex);
-    Rectangle2D log_bounds = new Rectangle2D.Double (extents[0], extents[1],
-                                                     extents[2], extents[3]);
-
-    extents = glyphInkExtents (glyphIndex);
-    Rectangle2D ink_bounds = new Rectangle2D.Double (extents[0], extents[1],
-                                                     extents[2], extents[3]);
-      
-    boolean is_horizontal = glyphIsHorizontal (glyphIndex);
-
-    return new GlyphMetrics (is_horizontal,
-                             (float)(log_bounds.getWidth() + 
log_bounds.getX()), 
-                             (float)(log_bounds.getHeight() + 
log_bounds.getY()),
-                             ink_bounds, GlyphMetrics.STANDARD);
+    // FIXME: pango does not yield vertical layout information at the
+    // moment.
+
+    boolean is_horizontal = true;
+    double advanceX = extents[8*i + 2]; // "logical width" == advanceX 
+    double advanceY = 0; 
+   
+    return new GlyphMetrics (is_horizontal, 
+                             (float) advanceX, (float) advanceY, 
+                             (Rectangle2D) getGlyphVisualBounds(i), 
+                             GlyphMetrics.STANDARD);
   }
 
   public Shape getGlyphOutline (int glyphIndex)
@@ -210,20 +216,18 @@
     throw new UnsupportedOperationException ();
   }
 
-  public Rectangle getGlyphPixelBounds (int glyphIndex, 
+  public Rectangle getGlyphPixelBounds (int i, 
                                         FontRenderContext renderFRC,
                                         float x, float y)
   {
-    double extents[] = glyphInkExtents(glyphIndex);
-    return new Rectangle ((int)x, (int)y, (int)extents[2], (int)extents[3]);
+    return new Rectangle((int) x, (int) y,
+                         (int) extents[8*i + 6], (int) extents[8*i + 7]);
   }
     
-  public Point2D getGlyphPosition (int glyphIndex)
+  public Point2D getGlyphPosition (int i)
   {
-    float[] ret = new float[2 * (glyphIndex + 1)];
-    getGlyphPositions (0, glyphIndex + 1, ret);
-    return new Point2D.Float (ret[2 * glyphIndex], 
-                              ret[2 * glyphIndex + 1]);
+    return new Point2D.Double (extents[10*i + 8], 
+                               extents[10*i + 9]);
   }
 
   public float[] getGlyphPositions (int beginGlyphIndex,
@@ -234,35 +238,25 @@
     if (fx == null)
       fx = new float[numEntries * 2];
 
-
-    float x = 0.0f;
-    float y = 0.0f;
     for (int i = 0; i < numEntries; ++i)
       {
-        boolean is_horizontal = glyphIsHorizontal (beginGlyphIndex + i);
-        double log_extents[] = glyphLogicalExtents (beginGlyphIndex + i);
-        fx[2*i]     = x + (float)log_extents[0]; // x offset
-        fx[2*i + 1] = y + (float)log_extents[1]; // y offset
-        if (is_horizontal)
-          x += (float)log_extents[2]; // x advance ("logical width") in 
pango-ese
-        else
-          y += (float)log_extents[3]; // y advance ("logical height") in 
pango-ese
+        fx[2*i    ] = (float) extents[10*i + 8];
+        fx[2*i + 1] = (float) extents[10*i + 9];
       }
     return fx;
   }
 
   public AffineTransform getGlyphTransform (int glyphIndex)
   {
-    // glyphs don't have independent transforms in these simple glyph
+    // Glyphs don't have independent transforms in these simple glyph
     // vectors; docs specify null is an ok return here.
     return null;  
   }
     
-  public Shape getGlyphVisualBounds (int glyphIndex)
+  public Shape getGlyphVisualBounds (int i)
   {
-    double extents[] = glyphInkExtents (glyphIndex);
-    return new Rectangle2D.Double (extents[0], extents[1], 
-                                   extents[2], extents[3]);
+    return new Rectangle2D.Double(extents[8*i + 4], extents[8*i + 5],
+                                  extents[8*i + 6], extents[8*i + 7]);
   }
     
   public int getLayoutFlags ()
@@ -272,14 +266,12 @@
 
   public Rectangle2D getLogicalBounds ()
   {
-    double extents[] = allLogicalExtents ();
-    return new Rectangle2D.Double (extents[0], extents[1], 
-                                   extents[2], extents[3]);
+    return allLogical;
   }
 
   public int getNumGlyphs ()
   {
-    return numGlyphs ();
+    return codes.length;
   }
 
   public Shape getOutline ()
@@ -290,26 +282,28 @@
   public Rectangle getPixelBounds (FontRenderContext renderFRC,
                                    float x, float y)
   {
-    double extents[] = allInkExtents();
-    return new Rectangle ((int)x, (int)y, 
-                          (int)extents[2], (int)extents[3]);
+    return new Rectangle((int)x, 
+                         (int)y, 
+                         (int) allVisual.getWidth(),
+                         (int) allVisual.getHeight());
   }
     
   public Rectangle2D getVisualBounds ()
   {
-    double extents[] = allInkExtents();
-    return new Rectangle2D.Double (extents[0], extents[1], 
-                                   extents[2], extents[3]);
+    return allVisual;
   }
 
   public void performDefaultLayout ()
   {
   }
     
-  public void setGlyphPosition (int glyphIndex, Point2D newPos)
+  public void setGlyphPosition (int i, Point2D newPos)
   {
-    // should we be ok twiddling pango's structure here?
-    throw new UnsupportedOperationException ();      
+    extents[8*i    ] = newPos.getX();
+    extents[8*i + 1] = newPos.getY();
+
+    extents[8*i + 4] = newPos.getX();
+    extents[8*i + 5] = newPos.getY();
   }
 
   public void setGlyphTransform (int glyphIndex,
@@ -327,8 +321,31 @@
     if (! (gv instanceof GdkGlyphVector))
       return false;
 
-    GdkGlyphVector ggv = (GdkGlyphVector)gv;
-    return isEqual(ggv);
+    GdkGlyphVector ggv = (GdkGlyphVector) gv;
+
+    if ((ggv.codes.length != this.codes.length)
+        || (ggv.extents.length != this.extents.length))
+      return false;
+    
+    if ((ggv.font == null && this.font != null)
+        || (ggv.font != null && this.font == null)
+        || (!ggv.font.equals(this.font)))
+      return false;
+
+    if ((ggv.fontRenderContext == null && this.fontRenderContext != null)
+        || (ggv.fontRenderContext != null && this.fontRenderContext == null)
+        || (!ggv.fontRenderContext.equals(this.fontRenderContext)))
+      return false;
+
+    for (int i = 0; i < ggv.codes.length; ++i)
+      if (ggv.codes[i] != this.codes[i])
+        return false;
+
+    for (int i = 0; i < ggv.extents.length; ++i)
+      if (ggv.extents[i] != this.extents[i])
+        return false;
+
+    return true;
   }
 
   public GlyphJustificationInfo getGlyphJustificationInfo(int idx)
--- gnu/java/awt/peer/gtk/GdkGraphics2D.java    8 Feb 2005 18:59:07 -0000       
1.30
+++ gnu/java/awt/peer/gtk/GdkGraphics2D.java    12 Feb 2005 09:35:46 -0000
@@ -215,9 +215,7 @@
   GdkGraphics2D(GtkComponentPeer component)
   {
     this.component = component;
-
-    setFont(new Font("SansSerif", Font.PLAIN, 12));
-
+    
     if (component.isRealized())
       initComponentGraphics2D();
     else
@@ -234,6 +232,7 @@
     setTransform(new AffineTransform());
     setStroke(new BasicStroke());
     setRenderingHints(getDefaultHints());
+    setFont(new Font("SansSerif", Font.PLAIN, 12));
 
     stateStack = new Stack();
   }
@@ -1326,58 +1325,54 @@
   }
 
   // these are the most accelerated painting paths
-  native void cairoDrawGdkGlyphVector(GdkFontPeer f, GdkGlyphVector gv,
-                                      float x, float y);
-
-  native void cairoDrawGdkTextLayout(GdkFontPeer f, GdkTextLayout gl, float x,
-                                     float y);
+  native void cairoDrawGlyphVector(GdkFontPeer font, 
+                                   float x, float y, int n, 
+                                   int[] codes, float[] positions);
 
-  native void cairoDrawString(GdkFontPeer f, String str, float x, float y);
+  native void cairoDrawGdkTextLayout(GdkTextLayout gl, 
+                                     float x, float y);
 
   GdkFontPeer getFontPeer()
   {
     return (GdkFontPeer) getFont().getPeer();
   }
 
-  public void drawGdkGlyphVector(GdkGlyphVector gv, float x, float y)
-  {
-    cairoDrawGdkGlyphVector(getFontPeer(), gv, x, y);
-    updateBufferedImage();
-  }
-
   public void drawGdkTextLayout(GdkTextLayout gl, float x, float y)
   {
-    cairoDrawGdkTextLayout(getFontPeer(), gl, x, y);
-    updateBufferedImage();
+    cairoDrawGdkTextLayout (gl, x, y);
+    updateBufferedImage ();
   }
 
   public void drawString(String str, float x, float y)
   {
-    cairoDrawString(getFontPeer(), str, x, y);
-    updateBufferedImage();
+    drawGlyphVector(getFont().createGlyphVector(null, str), x, y);
+    updateBufferedImage ();
   }
 
   public void drawString(String str, int x, int y)
   {
-    drawString(str, (float) x, (float) y);
+    drawString (str, (float) x, (float) y);
   }
 
   public void drawString(AttributedCharacterIterator ci, int x, int y)
   {
-    drawString(ci, (float) x, (float) y);
+    drawString (ci, (float) x, (float) y);
   }
 
   public void drawGlyphVector(GlyphVector gv, float x, float y)
   {
-    if (gv instanceof GdkGlyphVector)
-      drawGdkGlyphVector((GdkGlyphVector) gv, x, y);
-    else
-      throw new java.lang.UnsupportedOperationException();
+    int n = gv.getNumGlyphs ();
+    int[] codes = gv.getGlyphCodes (0, n, null);
+    float[] positions = gv.getGlyphPositions (0, n, null);
+    
+    setFont (gv.getFont ());
+    cairoDrawGlyphVector (getFontPeer(), x, y, n, codes, positions);
+    updateBufferedImage ();
   }
 
   public void drawString(AttributedCharacterIterator ci, float x, float y)
   {
-    GlyphVector gv = font.createGlyphVector(getFontRenderContext(), ci);
+    GlyphVector gv = getFont().createGlyphVector(getFontRenderContext(), ci);
     drawGlyphVector(gv, x, y);
   }
 
@@ -1416,6 +1411,8 @@
 
   public Font getFont()
   {
+    if (font == null)
+      return new Font("SansSerif", Font.PLAIN, 12);
     return font;
   }
 
@@ -1425,16 +1422,9 @@
 
   static native void releasePeerGraphicsResource(GdkFontPeer f);
 
-  static native void getPeerTextMetrics(GdkFontPeer f, String str,
-                                        double[] metrics);
-
-  static native void getPeerFontMetrics(GdkFontPeer f, double[] metrics);
-
   public FontMetrics getFontMetrics()
   {
-    // the reason we go via the toolkit here is to try to get
-    // a cached object. the toolkit keeps such a cache.
-    return Toolkit.getDefaultToolkit().getFontMetrics(font);
+    return getFontMetrics(getFont());
   }
 
   public FontMetrics getFontMetrics(Font f)
@@ -1457,7 +1447,7 @@
   public String toString()
   {
     return  (getClass().getName()
-             + "[font=" + font.toString()
+             + "[font=" + getFont().toString()
              + ",color=" + fg.toString()
             + "]");
   }
--- gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java   3 Jan 2005 12:20:54 
-0000       1.5
+++ gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java   12 Feb 2005 09:35:46 
-0000
@@ -50,14 +50,23 @@
 
 public class GdkGraphicsEnvironment extends GraphicsEnvironment
 {
-  public GdkGraphicsEnvironment ()
+  GtkToolkit gtkToolkit;
+
+  public GtkToolkit getToolkit()
+  {
+    return gtkToolkit;
+  }
+
+  public GdkGraphicsEnvironment (GtkToolkit tk)
   {
     super();
+    gtkToolkit = tk;
   }
 
   public GraphicsDevice[] getScreenDevices ()
   {
-    throw new java.lang.UnsupportedOperationException ();
+    // FIXME: Support multiple screens, since GDK can.
+    return new GraphicsDevice[] { new GdkScreenGraphicsDevice (this) };
   }
 
   public GraphicsDevice getDefaultScreenDevice ()
@@ -65,7 +74,7 @@
     if (GraphicsEnvironment.isHeadless ())
       throw new HeadlessException ();
 
-    return new GdkScreenGraphicsDevice ();
+    return new GdkScreenGraphicsDevice (this);
   }
 
   public Graphics2D createGraphics (BufferedImage image)
--- gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 11 Jan 2005 22:07:32 -0000      
1.9
+++ gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 12 Feb 2005 09:35:47 -0000
@@ -176,7 +176,11 @@
       }
 
     curr = null;
-    finish();    
+  }
+
+  public void finalize()
+  {
+    finish();
   }
 
 
--- gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java  3 Jan 2005 12:20:54 
-0000       1.1
+++ gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice.java  12 Feb 2005 09:35:47 
-0000
@@ -43,9 +43,17 @@
 
 public class GdkScreenGraphicsDevice extends GraphicsDevice
 {
-  public GdkScreenGraphicsDevice ()
+  GdkGraphicsEnvironment env;
+
+  public GtkToolkit getToolkit()
   {
+    return env.getToolkit();
+  }
+
+  public GdkScreenGraphicsDevice (GdkGraphicsEnvironment e)
+  {    
     super ();
+    env = e;
   }
 
   public int getType ()
@@ -62,12 +70,13 @@
   public GraphicsConfiguration[] getConfigurations ()
   {
     // FIXME: query X for the list of possible configurations
-    return null;
+    return new GraphicsConfiguration [] { new GdkGraphicsConfiguration(this) };
   }
 
   public GraphicsConfiguration getDefaultConfiguration ()
   {
+    
     // FIXME: query X for default configuration
-    return null;
+    return new GdkGraphicsConfiguration(this);
   }
 }
--- gnu/java/awt/peer/gtk/GtkToolkit.java       18 Jan 2005 09:43:45 -0000      
1.64
+++ gnu/java/awt/peer/gtk/GtkToolkit.java       12 Feb 2005 09:35:47 -0000
@@ -348,15 +348,18 @@
 
   public FontMetrics getFontMetrics (Font font) 
   {
-    if (metricsCache.containsKey(font))
-      return (FontMetrics) metricsCache.get(font);
-    else
+    synchronized (metricsCache)
+      {
+        if (metricsCache.containsKey(font))
+          return (FontMetrics) metricsCache.get(font);
+      }
+
+    FontMetrics m = new GdkFontMetrics (font);
+    synchronized (metricsCache)
       {
-        FontMetrics m;
-        m = new GdkFontMetrics (font);
         metricsCache.put(font, m);
-        return m;
-      }    
+      }
+    return m;
   }
 
   public Image getImage (String filename) 
@@ -632,11 +635,18 @@
     throw new Error("not implemented");
   }
 
+  public Rectangle getBounds()
+  {
+    int[] dims = new int[2];
+    getScreenSizeDimensions(dims);
+    return new Rectangle(0, 0, dims[0], dims[1]);
+  }
+  
   // ClasspathToolkit methods
 
   public GraphicsEnvironment getLocalGraphicsEnvironment()
   {
-    return new GdkGraphicsEnvironment();
+    return new GdkGraphicsEnvironment(this);
   }
 
   public Font createFont(int format, InputStream stream)
--- include/Makefile.am 12 Jan 2005 10:08:13 -0000      1.38
+++ include/Makefile.am 12 Feb 2005 09:35:47 -0000
@@ -27,9 +27,7 @@
 $(top_srcdir)/include/gnu_xml_libxmlj_transform_GnomeTransformerFactory.h
 
 GTKPEER_H_FILES = \
-$(top_srcdir)/include/gnu_java_awt_peer_gtk_GdkFontMetrics.h \
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GdkFontPeer.h \
-$(top_srcdir)/include/gnu_java_awt_peer_gtk_GdkGlyphVector.h \
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GdkGraphics.h \
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GdkGraphics2D.h \
 $(top_srcdir)/include/gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h \
--- include/gnu_java_awt_peer_gtk_GdkFontMetrics.h      11 Nov 2004 17:31:31 
-0000      1.8
+++ include/gnu_java_awt_peer_gtk_GdkFontMetrics.h      1 Jan 1970 00:00:00 
-0000
@@ -1,42 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#ifndef __gnu_java_awt_peer_gtk_GdkFontMetrics__
-#define __gnu_java_awt_peer_gtk_GdkFontMetrics__
-
-#include <jni.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkFontMetrics_getPeerFontMetrics (JNIEnv *env, 
jclass, jobject, jdoubleArray);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkFontMetrics_getPeerTextMetrics (JNIEnv *env, 
jclass, jobject, jstring, jdoubleArray);
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_ASCENT
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_ASCENT 0L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_MAX_ASCENT
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_MAX_ASCENT 1L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_DESCENT
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_DESCENT 2L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_MAX_DESCENT
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_MAX_DESCENT 3L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_MAX_ADVANCE
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_FONT_METRICS_MAX_ADVANCE 4L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_X_BEARING
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_X_BEARING 0L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_Y_BEARING
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_Y_BEARING 1L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_WIDTH
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_WIDTH 2L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_HEIGHT
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_HEIGHT 3L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_X_ADVANCE
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_X_ADVANCE 4L
-#undef gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_Y_ADVANCE
-#define gnu_java_awt_peer_gtk_GdkFontMetrics_TEXT_METRICS_Y_ADVANCE 5L
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __gnu_java_awt_peer_gtk_GdkFontMetrics__ */
--- include/gnu_java_awt_peer_gtk_GdkFontPeer.h 8 Oct 2004 21:41:41 -0000       
1.1
+++ include/gnu_java_awt_peer_gtk_GdkFontPeer.h 12 Feb 2005 09:35:47 -0000
@@ -10,10 +10,13 @@
 {
 #endif
 
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_initStaticState 
(JNIEnv *env, jclass);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_initState 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_dispose (JNIEnv 
*env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont (JNIEnv 
*env, jobject, jstring, jint, jint, jboolean);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkFontPeer_initStaticState (JNIEnv *env, jclass);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_initState 
(JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_dispose 
(JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont 
(JNIEnv *env, jobject, jstring, jint, jint, jboolean);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics___3D (JNIEnv *env, 
jobject, jdoubleArray);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getTextMetrics (JNIEnv *env, jobject, 
jstring, jdoubleArray);
+extern JNIEXPORT jobject JNICALL 
Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector (JNIEnv *env, jobject, 
jstring, jobject, jobject);
 
 #ifdef __cplusplus
 }
--- include/gnu_java_awt_peer_gtk_GdkGlyphVector.h      14 Aug 2004 17:19:50 
-0000      1.1
+++ include/gnu_java_awt_peer_gtk_GdkGlyphVector.h      1 Jan 1970 00:00:00 
-0000
@@ -1,32 +0,0 @@
-/* DO NOT EDIT THIS FILE - it is machine generated */
-
-#ifndef __gnu_java_awt_peer_gtk_GdkGlyphVector__
-#define __gnu_java_awt_peer_gtk_GdkGlyphVector__
-
-#include <jni.h>
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initStaticState (JNIEnv *env, jclass);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initState 
(JNIEnv *env, jobject, jobject, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setChars 
(JNIEnv *env, jobject, jstring);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setGlyphCodes 
(JNIEnv *env, jobject, jintArray);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_dispose 
(JNIEnv *env, jobject);
-JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCode 
(JNIEnv *env, jobject, jint);
-JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_numGlyphs 
(JNIEnv *env, jobject);
-JNIEXPORT jint JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCharIndex (JNIEnv *env, jobject, 
jint);
-JNIEXPORT jdoubleArray JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogicalExtents (JNIEnv *env, 
jobject);
-JNIEXPORT jdoubleArray JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents (JNIEnv *env, jobject);
-JNIEXPORT jdoubleArray JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphLogicalExtents (JNIEnv *env, 
jobject, jint);
-JNIEXPORT jdoubleArray JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphInkExtents (JNIEnv *env, 
jobject, jint);
-JNIEXPORT jboolean JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHorizontal (JNIEnv *env, 
jobject, jint);
-JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GdkGlyphVector_isEqual 
(JNIEnv *env, jobject, jobject);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __gnu_java_awt_peer_gtk_GdkGlyphVector__ */
--- include/gnu_java_awt_peer_gtk_GdkGraphics2D.h       26 Dec 2004 13:39:40 
-0000      1.5
+++ include/gnu_java_awt_peer_gtk_GdkGraphics2D.h       12 Feb 2005 09:35:47 
-0000
@@ -10,48 +10,45 @@
 {
 #endif
 
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState (JNIEnv *env, jclass);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
 (JNIEnv *env, jobject, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II 
(JNIEnv *env, jobject, jint, jint);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState___3III (JNIEnv *env, 
jobject, jintArray, jint, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState 
(JNIEnv *env, jobject, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter (JNIEnv *env, 
jobject, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals 
(JNIEnv *env, jobject, jobject);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable (JNIEnv *env, jobject, 
jobject, jint, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels 
(JNIEnv *env, jobject, jintArray, jint, jint, jint, jdoubleArray);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels (JNIEnv *env, 
jobject, jintArray, jint, jint, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient 
(JNIEnv *env, jobject, jdouble, jdouble, jdouble, jdouble, jint, jint, jint, 
jint, jint, jint, jint, jint, jboolean);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix 
(JNIEnv *env, jobject, jdoubleArray);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator (JNIEnv *env, 
jobject, jint);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor (JNIEnv *env, 
jobject, jdouble, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha 
(JNIEnv *env, jobject, jdouble);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule (JNIEnv *env, 
jobject, jint);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth (JNIEnv *env, 
jobject, jdouble);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap (JNIEnv *env, jobject, 
jint);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin (JNIEnv *env, 
jobject, jint);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash 
(JNIEnv *env, jobject, jdoubleArray, jint, jdouble);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit (JNIEnv *env, 
jobject, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo 
(JNIEnv *env, jobject, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo 
(JNIEnv *env, jobject, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo 
(JNIEnv *env, jobject, jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo 
(JNIEnv *env, jobject, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo 
(JNIEnv *env, jobject, jdouble, jdouble);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo (JNIEnv *env, jobject, 
jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle 
(JNIEnv *env, jobject, jdouble, jdouble, jdouble, jdouble);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip 
(JNIEnv *env, jobject);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector (JNIEnv *env, 
jobject, jobject, jobject, jfloat, jfloat);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout (JNIEnv *env, 
jobject, jobject, jobject, jfloat, jfloat);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString (JNIEnv *env, jobject, 
jobject, jstring, jfloat, jfloat);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource (JNIEnv 
*env, jclass, jobject);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics (JNIEnv *env, 
jclass, jobject, jstring, jdoubleArray);
-JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics (JNIEnv *env, 
jclass, jobject, jdoubleArray);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initStaticState (JNIEnv *env, jclass);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__Lgnu_java_awt_peer_gtk_GtkComponentPeer_2
 (JNIEnv *env, jobject, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState__II (JNIEnv *env, jobject, 
jint, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_initState___3III (JNIEnv *env, 
jobject, jintArray, jint, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState (JNIEnv *env, jobject, 
jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose 
(JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSurfaceSetFilter (JNIEnv *env, 
jobject, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals (JNIEnv *env, jobject, 
jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_gdkDrawDrawable (JNIEnv *env, jobject, 
jobject, jint, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_drawPixels (JNIEnv *env, jobject, 
jintArray, jint, jint, jint, jdoubleArray);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setTexturePixels (JNIEnv *env, 
jobject, jintArray, jint, jint, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_setGradient (JNIEnv *env, jobject, 
jdouble, jdouble, jdouble, jdouble, jint, jint, jint, jint, jint, jint, jint, 
jint, jboolean);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSave (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRestore (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMatrix (JNIEnv *env, jobject, 
jdoubleArray);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetOperator (JNIEnv *env, 
jobject, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetRGBColor (JNIEnv *env, 
jobject, jdouble, jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetAlpha (JNIEnv *env, jobject, 
jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetFillRule (JNIEnv *env, 
jobject, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineWidth (JNIEnv *env, 
jobject, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineCap (JNIEnv *env, jobject, 
jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetLineJoin (JNIEnv *env, 
jobject, jint);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetDash (JNIEnv *env, jobject, 
jdoubleArray, jint, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoSetMiterLimit (JNIEnv *env, 
jobject, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoNewPath (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoMoveTo (JNIEnv *env, jobject, 
jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoLineTo (JNIEnv *env, jobject, 
jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoCurveTo (JNIEnv *env, jobject, 
jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelMoveTo (JNIEnv *env, jobject, 
jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo (JNIEnv *env, jobject, 
jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelCurveTo (JNIEnv *env, jobject, 
jdouble, jdouble, jdouble, jdouble, jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRectangle (JNIEnv *env, jobject, 
jdouble, jdouble, jdouble, jdouble);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClosePath (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoStroke (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoFill (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoClip (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector (JNIEnv *env, 
jobject, jobject, jfloat, jfloat, jint, jintArray, jfloatArray);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout (JNIEnv *env, 
jobject, jobject, jfloat, jfloat);
+extern JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource (JNIEnv 
*env, jclass, jobject);
 
 #ifdef __cplusplus
 }
--- native/jni/gtk-peer/Makefile.am     11 Jan 2005 15:06:04 -0000      1.21
+++ native/jni/gtk-peer/Makefile.am     12 Feb 2005 09:35:47 -0000
@@ -3,7 +3,6 @@
 # Gtk/Cairo JNI sources.
 if GTK_CAIRO
   gtk_cairo_c_source_files = \
-    gnu_java_awt_peer_gtk_GdkGlyphVector.c \
     gnu_java_awt_peer_gtk_GdkGraphics2D.c
 else
   gtk_cairo_c_source_files =
@@ -11,7 +10,6 @@
 
 libgtkpeer_la_SOURCES = $(gtk_cairo_c_source_files) \
                        gnu_java_awt_peer_gtk_GThreadNativeMethodRunner.c \
-                       gnu_java_awt_peer_gtk_GdkFontMetrics.c \
                        gnu_java_awt_peer_gtk_GdkFontPeer.c \
                        gnu_java_awt_peer_gtk_GdkGraphics.c \
                        gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c \
--- native/jni/gtk-peer/gdkfont.h       10 Oct 2004 14:20:49 -0000      1.6
+++ native/jni/gtk-peer/gdkfont.h       12 Feb 2005 09:35:47 -0000
@@ -102,6 +102,21 @@
 #define TEXT_METRICS_Y_ADVANCE 5
 #define NUM_TEXT_METRICS 6
 
+#define NUM_GLYPH_METRICS 10
+
+#define GLYPH_LOG_X(i)      (NUM_GLYPH_METRICS * (i)    )
+#define GLYPH_LOG_Y(i)      (NUM_GLYPH_METRICS * (i) + 1)
+#define GLYPH_LOG_WIDTH(i)  (NUM_GLYPH_METRICS * (i) + 2)
+#define GLYPH_LOG_HEIGHT(i) (NUM_GLYPH_METRICS * (i) + 3)
+
+#define GLYPH_INK_X(i)      (NUM_GLYPH_METRICS * (i) + 4)
+#define GLYPH_INK_Y(i)      (NUM_GLYPH_METRICS * (i) + 5)
+#define GLYPH_INK_WIDTH(i)  (NUM_GLYPH_METRICS * (i) + 6)
+#define GLYPH_INK_HEIGHT(i) (NUM_GLYPH_METRICS * (i) + 7)
+
+#define GLYPH_POS_X(i)      (NUM_GLYPH_METRICS * (i) + 8)
+#define GLYPH_POS_Y(i)      (NUM_GLYPH_METRICS * (i) + 9)
+
 struct peerfont
 {
   PangoFont *font;
@@ -119,16 +134,6 @@
   void *graphics_resource;
 };
 
-struct glyphvec 
-{
-  /* the GList is list of PangoGlyphItems, each of which is a pair of 1
-     PangoItem and 1 PangoGlyphString. */
-  GList *glyphitems;
-  PangoFontDescription *desc;
-  PangoFont *font;
-  PangoContext *ctx;
-};
-
 struct textlayout
 {
   PangoLayout *pango_layout;
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c   3 Feb 2005 
12:30:30 -0000       1.21
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c   12 Feb 2005 
09:35:47 -0000
@@ -942,13 +942,13 @@
       if (debug) printf ("install_font_peer made new cairo font for '%s' at 
%f\n", 
                         face->family_name,
                         (pango_font_description_get_size (pfont->desc) / 
-                         (double)PANGO_SCALE) * (96.0 / 72.0));
+                         (double)PANGO_SCALE));
     
       cairo_set_font (cr, ft); 
       cairo_font_destroy (ft);
       cairo_scale_font (cr, 
                        (pango_font_description_get_size (pfont->desc) / 
-                        (double)PANGO_SCALE) * (96.0 / 72.0));
+                        (double)PANGO_SCALE));
       ft = cairo_current_font (cr);
       pfont->graphics_resource = ft;
     }
@@ -960,20 +960,6 @@
     }
 }
 
-static cairo_t *metrics_cairo = NULL;
-static cairo_surface_t *metrics_surface = NULL;
-
-static void
-ensure_metrics_cairo()
-{
-  if (metrics_cairo == NULL)
-    {
-      metrics_cairo = cairo_create ();
-      metrics_surface = cairo_image_surface_create (CAIRO_FORMAT_A8, 1, 1);
-      cairo_set_target_surface (metrics_cairo, metrics_surface);
-    }
-}
-
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_releasePeerGraphicsResource
@@ -994,78 +980,6 @@
   gdk_threads_leave();
 }
 
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerTextMetrics
-   (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, 
jstring str, jdoubleArray java_metrics)
-{
-  struct peerfont *pfont = NULL;
-  const char *cstr = NULL;
-  jdouble *native_metrics = NULL;
-  cairo_text_extents_t extents;
-
-  g_assert(java_font != NULL);
-  gdk_threads_enter();
-
-  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font);
-  g_assert (pfont != NULL);
-
-  ensure_metrics_cairo();
-  install_font_peer (metrics_cairo, pfont, 0);
-
-  cstr = (*env)->GetStringUTFChars (env, str, NULL);
-  g_assert(cstr != NULL);
-  cairo_text_extents (metrics_cairo, (unsigned char *) cstr, &extents);
-
-  native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
-  g_assert (native_metrics != NULL);
-
-  native_metrics[TEXT_METRICS_X_BEARING] = extents.x_bearing;
-  native_metrics[TEXT_METRICS_Y_BEARING] = extents.y_bearing;
-  native_metrics[TEXT_METRICS_WIDTH] = extents.width;
-  native_metrics[TEXT_METRICS_HEIGHT] = extents.height;
-  native_metrics[TEXT_METRICS_X_ADVANCE] = extents.x_advance;
-  native_metrics[TEXT_METRICS_Y_ADVANCE] = extents.y_advance;
-        
-  (*env)->ReleaseStringUTFChars (env, str, cstr);  
-  (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);
-  gdk_threads_leave();
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getPeerFontMetrics
-   (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, 
jdoubleArray java_metrics)
-{
-  struct peerfont *pfont = NULL;
-  jdouble *native_metrics = NULL;
-  cairo_font_extents_t extents;
-
-  g_assert(java_font != NULL);
-
-  gdk_threads_enter();
-
-  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font);
-  g_assert (pfont != NULL);
-
-  ensure_metrics_cairo();
-  install_font_peer (metrics_cairo, pfont, 0);
-
-  cairo_current_font_extents (metrics_cairo, &extents); 
-
-  native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
-  g_assert (native_metrics != NULL);
-
-  native_metrics[FONT_METRICS_ASCENT] = extents.ascent;
-  native_metrics[FONT_METRICS_MAX_ASCENT] = extents.ascent;
-  native_metrics[FONT_METRICS_DESCENT] = extents.descent;
-  if (native_metrics[FONT_METRICS_DESCENT] < 0)
-    native_metrics[FONT_METRICS_DESCENT] = - 
native_metrics[FONT_METRICS_DESCENT];
-  native_metrics[FONT_METRICS_MAX_DESCENT] = 
native_metrics[FONT_METRICS_DESCENT];
-  native_metrics[FONT_METRICS_MAX_ADVANCE] = extents.max_x_advance;
-
-  (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);
-  gdk_threads_leave();
-}
-
 static void
 paint_glyph_run(JNIEnv *env,
                struct graphics2d *gr,
@@ -1122,128 +1036,65 @@
     }
 }
 
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawString
-  (JNIEnv *env, jobject obj, jobject font, jstring str, float x, float y)
-{
-  struct graphics2d *gr = NULL;
-  const char *cstr = NULL;
-  struct peerfont *pfont = NULL;
-
-  /*
-  cairo_glyph_t *glyphs = NULL;
-  gint n_glyphs = 0;
-  PangoLayoutRun *run = NULL;
-  PangoLayoutIter *iter = NULL;
-  */
-
-  g_assert(obj != NULL);
-  g_assert(font != NULL);
-  g_assert(str != NULL);
-
-  gdk_threads_enter ();
-  if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
-
-  gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
-  g_assert(gr != NULL);
-
-  pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);
-  g_assert (pfont != NULL);
-
-  cstr = (*env)->GetStringUTFChars (env, str, NULL);
-  g_assert(cstr != NULL);
-
-  if (gr->debug) printf ("painting string '%s' at (%f,%f)\n", cstr, x, y);
-
-  /* For now we let cairo do the glyph conversion; eventually this
-   * ought to be unified with pango, but it is impossible to get
-   * pango and cairo to agree on metrics at the moment, so we either
-   * have to use "all cairo" metrics (the string-based APIs) or 
-   * "all pango" metrics (the glyph-vector based APIs). 
-   */
-
-  install_font_peer (gr->cr, pfont, gr->debug);
-  cairo_move_to (gr->cr, x, y);
-  cairo_show_text (gr->cr, (unsigned char *) cstr);
-  
-  /*
-    
-  pango_layout_set_text (gr->pango_layout, cstr, -1);
-
-  iter = pango_layout_get_iter (gr->pango_layout);
-  g_assert(iter != NULL);
-
-  cairo_translate (gr->cr, x, y);
-
-  do 
-    {
-      run = pango_layout_iter_get_run (iter);
-      if (run != NULL)
-       paint_glyph_run (gr, &glyphs, &n_glyphs, run);
-    } 
-  while (pango_layout_iter_next_run (iter));
-  
-  if (glyphs != NULL)
-    g_free (glyphs);
-
-  cairo_translate (gr->cr, -x, -y);
-  
-  pango_layout_iter_free (iter);
-
-  */
-
-  gdk_threads_leave ();
-
-  (*env)->ReleaseStringUTFChars (env, str, cstr);
-}
-
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkGlyphVector
-   (JNIEnv *env, jobject self, jobject font, jobject java_vec, jfloat x, 
jfloat y)
+Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGlyphVector
+   (JNIEnv *env, jobject self, 
+    jobject font,
+    jfloat x, jfloat y, jint n,
+    jintArray java_codes,
+    jfloatArray java_positions)
 {
   
   struct graphics2d *gr = NULL;
   struct peerfont *pfont = NULL;
-  struct glyphvec *gv = NULL;
-  PangoLayoutRun *run = NULL;
   cairo_glyph_t *glyphs = NULL;
-  gint n_glyphs = 0;
+  int *native_codes;
+  float *native_positions;
+  jint i = 0;
 
   g_assert (self != NULL);
-  g_assert (java_vec != NULL);
+  g_assert (java_codes != NULL);
+  g_assert (java_positions != NULL);
 
   gdk_threads_enter ();
   if (peer_is_disposed(env, self)) { gdk_threads_leave(); return; }
 
   gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);
-  gv = (struct glyphvec *)NSA_GET_GV_PTR (env, java_vec);
-  pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);
-
   g_assert (gr != NULL);
-  g_assert (gv != NULL);
+
+  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
   g_assert (pfont != NULL);
 
-  if (gr->debug) printf ("painting pango glyph vector\n");
+  install_font_peer(gr->cr, pfont, gr->debug);
 
-  install_font_peer (gr->cr, pfont, gr->debug);
-  cairo_translate (gr->cr, x, y);
+  glyphs = malloc( sizeof(cairo_glyph_t) * n);
+  g_assert (glyphs != NULL);
 
-  /* nb. PangoLayoutRun is a typedef for PangoGlyphItem. */
-  run = (PangoLayoutRun *) gv->glyphitems;
-  if (run != NULL)
-    paint_glyph_run (env, gr, &glyphs, &n_glyphs, run);
+  native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
+  native_positions = (*env)->GetFloatArrayElements (env, java_positions, NULL);
+  
+  for (i = 0; i < n; ++i)
+    {
+      glyphs[i].index = native_codes[i];
+      glyphs[i].x = x + native_positions[ 2*i ];
+      glyphs[i].y = y + native_positions[ 2*i + 1];
+    }
 
-  if (glyphs != NULL)
-    g_free (glyphs);
+  (*env)->ReleaseFloatArrayElements (env, java_positions, native_positions, 0);
+  (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
+
+  begin_drawing_operation (env, gr);  
+  cairo_show_glyphs (gr->cr, glyphs, n);
+  end_drawing_operation (env, gr);
 
-  cairo_translate (gr->cr, -x, -y);
   gdk_threads_leave ();  
+  free(glyphs);
 }
 
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoDrawGdkTextLayout
-   (JNIEnv *env, jobject self, jobject font, jobject java_layout, jfloat x, 
jfloat y)
+   (JNIEnv *env, jobject self, jobject java_layout, jfloat x, jfloat y)
 {
   /* 
    * FIXME: Some day we expect either cairo or pango will know how to make
@@ -1251,7 +1102,6 @@
    */
 
   struct graphics2d *gr = NULL;
-  struct peerfont *pfont = NULL;
   struct textlayout *tl = NULL;
   PangoLayoutIter *i = NULL;
   PangoLayoutRun *run = NULL;
@@ -1263,12 +1113,10 @@
 
   gr = (struct graphics2d *)NSA_GET_G2D_PTR (env, self);
   tl = (struct textlayout *)NSA_GET_TEXT_LAYOUT_PTR (env, java_layout);
-  pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, font);
 
   g_assert (gr != NULL);
   g_assert (tl != NULL);
   g_assert (tl->pango_layout != NULL);
-  g_assert (pfont != NULL);
 
   if (gr->debug) printf ("painting pango layout\n");
 
@@ -1278,7 +1126,6 @@
   i = pango_layout_get_iter (tl->pango_layout);
   g_assert (i != NULL);
 
-  install_font_peer (gr->cr, pfont, gr->debug);
   cairo_translate (gr->cr, x, y);
 
   do 
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   19 Jan 2005 
08:10:27 -0000      1.22
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c   12 Feb 2005 
09:35:47 -0000
@@ -315,10 +315,12 @@
              GdkEventFocus *event __attribute((unused)),
              jobject peer)
 {
+  gdk_threads_leave ();
   (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postFocusEventID,
                               AWT_FOCUS_GAINED,
                               JNI_FALSE);
+  gdk_threads_enter ();
   return FALSE;
 }
 
@@ -327,21 +329,27 @@
               GdkEventFocus *event __attribute((unused)),
               jobject peer)
 {
+  gdk_threads_leave ();
   (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               postFocusEventID,
                               AWT_FOCUS_LOST,
                               JNI_FALSE);
+  gdk_threads_enter ();
   return FALSE;
 }
 
 static void
 block_expose_events_cb (GtkWidget *widget, jobject peer)
 {
+  gdk_threads_leave ();
   (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               beginNativeRepaintID);
+  gdk_threads_enter ();
 
   gdk_window_process_updates (widget->window, TRUE);
 
+  gdk_threads_leave ();
   (*gdk_env())->CallVoidMethod (gdk_env(), peer,
                               endNativeRepaintID);
+  gdk_threads_enter ();
 }
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c  28 Oct 2004 
20:58:25 -0000      1.13
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c  1 Jan 1970 
00:00:00 -0000
@@ -1,115 +0,0 @@
-/* gdkfontmetrics.c
-   Copyright (C) 1999, 2003, 2004 Free Software Foundation, Inc.
-
-This file is part of GNU Classpath.
-
-GNU Classpath is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GNU Classpath is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GNU Classpath; see the file COPYING.  If not, write to the
-Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-02111-1307 USA.
-
-Linking this library statically or dynamically with other modules is
-making a combined work based on this library.  Thus, the terms and
-conditions of the GNU General Public License cover the whole
-combination.
-
-As a special exception, the copyright holders of this library give you
-permission to link this library with independent modules to produce an
-executable, regardless of the license terms of these independent
-modules, and to copy and distribute the resulting executable under
-terms of your choice, provided that you also meet, for each linked
-independent module, the terms and conditions of the license of that
-module.  An independent module is a module which is not derived from
-or based on this library.  If you modify this library, you may extend
-this exception to your version of the library, but you are not
-obligated to do so.  If you do not wish to do so, delete this
-exception statement from your version. */
-
-#include "gtkpeer.h"
-#include "gdkfont.h"
-
-#include "gnu_java_awt_peer_gtk_GdkFontMetrics.h"
-#include <gdk/gdkx.h>
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkFontMetrics_getPeerFontMetrics
-   (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, 
jdoubleArray java_metrics)
-{
-  struct peerfont *pfont = NULL;
-  jdouble *native_metrics = NULL;
-  PangoFontMetrics *pango_metrics;
-
-  gdk_threads_enter();
-
-  pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font);
-  g_assert (pfont != NULL);
-
-  pango_metrics = pango_context_get_metrics (pfont->ctx, pfont->desc,
-                                             gtk_get_default_language ());
-
-  native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
-  g_assert (native_metrics != NULL);
-
-  native_metrics[FONT_METRICS_ASCENT] = PANGO_PIXELS 
(pango_font_metrics_get_ascent (pango_metrics));
-  native_metrics[FONT_METRICS_MAX_ASCENT] = 
native_metrics[FONT_METRICS_ASCENT];
-  native_metrics[FONT_METRICS_DESCENT] = PANGO_PIXELS 
(pango_font_metrics_get_descent (pango_metrics));
-  if (native_metrics[FONT_METRICS_DESCENT] < 0)
-    native_metrics[FONT_METRICS_DESCENT] = - 
native_metrics[FONT_METRICS_DESCENT];
-  native_metrics[FONT_METRICS_MAX_DESCENT] = 
native_metrics[FONT_METRICS_DESCENT];
-  native_metrics[FONT_METRICS_MAX_ADVANCE] = PANGO_PIXELS 
(pango_font_metrics_get_approximate_char_width (pango_metrics));
-        
-  (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);
-
-  pango_font_metrics_unref (pango_metrics);
-
-  gdk_threads_leave();
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkFontMetrics_getPeerTextMetrics
-   (JNIEnv *env, jclass clazz __attribute__ ((unused)), jobject java_font, 
jstring str, jdoubleArray java_metrics)
-{
-  struct peerfont *pfont = NULL;
-  const char *cstr = NULL;
-  jdouble *native_metrics = NULL;  
-  PangoRectangle log;
-
-  gdk_threads_enter();
-
-  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font);
-  g_assert (pfont != NULL);
-
-  cstr = (*env)->GetStringUTFChars (env, str, NULL);
-  g_assert(cstr != NULL);
-
-  pango_layout_set_text (pfont->layout, cstr, -1);
-  pango_layout_get_extents (pfont->layout, NULL, &log);
-
-  (*env)->ReleaseStringUTFChars (env, str, cstr);  
-  pango_layout_set_text (pfont->layout, "", -1);
-
-  native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
-  g_assert (native_metrics != NULL);
-
-  native_metrics[TEXT_METRICS_X_BEARING] = PANGO_PIXELS(log.x);
-  native_metrics[TEXT_METRICS_Y_BEARING] = PANGO_PIXELS(log.y);
-  native_metrics[TEXT_METRICS_WIDTH] = PANGO_PIXELS(log.width);
-  native_metrics[TEXT_METRICS_HEIGHT] = PANGO_PIXELS(log.height);
-  native_metrics[TEXT_METRICS_X_ADVANCE] = PANGO_PIXELS(log.x + log.width);
-  native_metrics[TEXT_METRICS_Y_ADVANCE] = PANGO_PIXELS(log.y + log.height);
-        
-  (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);
-
-  gdk_threads_leave();
-}
-
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c     11 Nov 2004 
22:13:11 -0000      1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c     12 Feb 2005 
09:35:47 -0000
@@ -40,23 +40,6 @@
 
 struct state_table *native_font_state_table;
 
-/*
-rough sketch of the mapping between java and 
-pango text objects:
-  
-  Font              <->    - PangoFont
-                           - PangoFontDescription
-                           - PangoContext
-                           - PangoLayout (for rendering and measuring)
-
-  GlyphVector       <->    - GList of PangoGlyphItem
-                           - PangoFontDescription
-                           - PangoContext
-
-  FontRenderContext <->    stays in plain java
-
-*/
-
 enum java_awt_font_style {
   java_awt_font_PLAIN = 0,
   java_awt_font_BOLD = 1,
@@ -69,11 +52,22 @@
   java_awt_font_HANGING_BASELINE = 2
 };
 
+static jmethodID glyphVector_ctor;
+static jclass glyphVector_class;
+static PangoAttrList *attrs = NULL;
+
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GdkFontPeer_initStaticState 
   (JNIEnv *env, jclass clazz)
 {
   NSA_FONT_INIT (env, clazz);
+
+  glyphVector_class = (*env)->FindClass 
+    (env, "gnu/java/awt/peer/gtk/GdkGlyphVector");
+
+  glyphVector_ctor = (*env)->GetMethodID 
+    (env, glyphVector_class, "<init>", 
+     "([D[ILjava/awt/Font;Ljava/awt/font/FontRenderContext;)V");
 }
 
 JNIEXPORT void JNICALL
@@ -111,6 +105,223 @@
   gdk_threads_leave ();
 }
 
+
+JNIEXPORT jobject JNICALL
+Java_gnu_java_awt_peer_gtk_GdkFontPeer_getGlyphVector
+  (JNIEnv *env, jobject self, 
+   jstring chars,
+   jobject font, 
+   jobject fontRenderContext)
+{
+  struct peerfont *pfont = NULL;
+  GList *items = NULL, *i = NULL;
+  gchar *str = NULL;
+  int len, j;
+  double *native_extents;
+  int *native_codes;
+  jintArray java_codes = NULL;
+  jdoubleArray java_extents = NULL;
+
+  gdk_threads_enter ();
+
+  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, self);
+  g_assert (pfont != NULL);
+
+  len = (*gdk_env())->GetStringUTFLength (env, chars);  
+  str = (gchar *)(*env)->GetStringUTFChars (env, chars, NULL);
+  g_assert (str != NULL);
+
+  if (attrs == NULL)
+    attrs = pango_attr_list_new ();
+
+  if (len > 0 && str[len-1] == '\0')
+    len--;
+  
+  items = pango_itemize (pfont->ctx, str, 0, len, attrs, NULL);
+
+  i = g_list_first (items);
+
+  if (i == NULL)       
+    {
+      java_extents = (*env)->NewDoubleArray (env, 0);
+      java_codes = (*env)->NewIntArray (env, 0);
+    }
+  else
+    { 
+      PangoGlyphString *glyphs;
+      PangoItem *item = (PangoItem *)i->data;
+
+      pango_context_set_font_description (pfont->ctx, pfont->desc);
+      pango_context_set_language (pfont->ctx, gtk_get_default_language());
+      pango_context_load_font (pfont->ctx, pfont->desc);
+
+      glyphs = pango_glyph_string_new ();
+      g_assert (glyphs != NULL);
+
+      pango_shape (str + item->offset, item->length, 
+                  &(item->analysis), glyphs);
+
+      if (glyphs->num_glyphs > 0)
+       {
+         int x = 0;
+         double scale = ((double) PANGO_SCALE);
+
+         java_extents = (*env)->NewDoubleArray (env, glyphs->num_glyphs * 
NUM_GLYPH_METRICS);
+         java_codes = (*env)->NewIntArray (env, glyphs->num_glyphs);
+         native_extents = (*env)->GetDoubleArrayElements (env, java_extents, 
NULL);
+         native_codes = (*env)->GetIntArrayElements (env, java_codes, NULL);
+
+         for (j = 0; j < glyphs->num_glyphs; ++j)
+           {
+             PangoRectangle ink;
+             PangoRectangle logical;
+             PangoGlyphGeometry *geom = &glyphs->glyphs[j].geometry;
+
+             pango_font_get_glyph_extents (pfont->font, 
+                                           glyphs->glyphs[j].glyph,
+                                           &ink, &logical);
+
+             native_codes[j] = glyphs->glyphs[j].glyph;
+
+             native_extents[ GLYPH_LOG_X(j)      ] = (logical.x)      / scale;
+             native_extents[ GLYPH_LOG_Y(j)      ] = (- logical.y)    / scale;
+             native_extents[ GLYPH_LOG_WIDTH(j)  ] = (logical.width)  / scale;
+             native_extents[ GLYPH_LOG_HEIGHT(j) ] = (logical.height) / scale;
+
+             native_extents[ GLYPH_INK_X(j)      ] = (ink.x)       / scale;
+             native_extents[ GLYPH_INK_Y(j)      ] = (- ink.y)     / scale;
+             native_extents[ GLYPH_INK_WIDTH(j)  ] = (ink.width)   / scale;
+             native_extents[ GLYPH_INK_HEIGHT(j) ] = (ink.height)  / scale;
+
+             native_extents[ GLYPH_POS_X(j)      ] = (x + geom->x_offset)  / 
scale;
+             native_extents[ GLYPH_POS_Y(j)      ] = (  - geom->y_offset)  / 
scale;
+
+             x += geom->width;
+           }
+         (*env)->ReleaseDoubleArrayElements (env, java_extents, 
native_extents, 0);
+         (*env)->ReleaseIntArrayElements (env, java_codes, native_codes, 0);
+       }
+
+      pango_glyph_string_free (glyphs);
+    }
+
+  (*env)->ReleaseStringUTFChars (env, chars, str);
+  
+  for (i = g_list_first (items); i != NULL; i = g_list_next (i))
+    g_free (i->data);
+  
+  g_list_free (items);
+
+  gdk_threads_leave ();
+
+  return (*env)->NewObject (env, 
+                           glyphVector_class, 
+                           glyphVector_ctor, 
+                           java_extents, java_codes,
+                           font, fontRenderContext);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkFontPeer_getFontMetrics
+   (JNIEnv *env, jobject java_font, jdoubleArray java_metrics)
+{
+  struct peerfont *pfont = NULL;
+  jdouble *native_metrics = NULL;
+  PangoFontMetrics *pango_metrics;
+
+  gdk_threads_enter();
+
+  pfont = (struct peerfont *) NSA_GET_FONT_PTR (env, java_font);
+  g_assert (pfont != NULL);
+
+  pango_metrics 
+    = pango_context_get_metrics (pfont->ctx, pfont->desc,
+                                gtk_get_default_language ());
+
+  native_metrics 
+    = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
+
+  g_assert (native_metrics != NULL);
+
+  native_metrics[FONT_METRICS_ASCENT] 
+    = PANGO_PIXELS (pango_font_metrics_get_ascent (pango_metrics));
+
+  native_metrics[FONT_METRICS_MAX_ASCENT] 
+    = native_metrics[FONT_METRICS_ASCENT];
+
+  native_metrics[FONT_METRICS_DESCENT] 
+    = PANGO_PIXELS (pango_font_metrics_get_descent (pango_metrics));
+
+  if (native_metrics[FONT_METRICS_DESCENT] < 0)
+    native_metrics[FONT_METRICS_DESCENT] 
+      = - native_metrics[FONT_METRICS_DESCENT];
+
+  native_metrics[FONT_METRICS_MAX_DESCENT] 
+    = native_metrics[FONT_METRICS_DESCENT];
+
+  native_metrics[FONT_METRICS_MAX_ADVANCE] 
+    = PANGO_PIXELS (pango_font_metrics_get_approximate_char_width 
+                   (pango_metrics));
+        
+  (*env)->ReleaseDoubleArrayElements (env, 
+                                     java_metrics, 
+                                     native_metrics, 0);
+
+  pango_font_metrics_unref (pango_metrics);
+
+  gdk_threads_leave();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkFontPeer_getTextMetrics
+   (JNIEnv *env, jobject java_font, jstring str, jdoubleArray java_metrics)
+{
+  struct peerfont *pfont = NULL;
+  const char *cstr = NULL;
+  jdouble *native_metrics = NULL;  
+  PangoRectangle log;
+
+  gdk_threads_enter();
+
+  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, java_font);
+  g_assert (pfont != NULL);
+
+  cstr = (*env)->GetStringUTFChars (env, str, NULL);
+  g_assert(cstr != NULL);
+
+  pango_layout_set_text (pfont->layout, cstr, -1);
+  pango_layout_get_extents (pfont->layout, NULL, &log);
+
+  (*env)->ReleaseStringUTFChars (env, str, cstr);  
+  pango_layout_set_text (pfont->layout, "", -1);
+
+  native_metrics = (*env)->GetDoubleArrayElements (env, java_metrics, NULL);
+  g_assert (native_metrics != NULL);
+
+  native_metrics[TEXT_METRICS_X_BEARING] 
+    = PANGO_PIXELS( ((double)log.x) );
+
+  native_metrics[TEXT_METRICS_Y_BEARING] 
+    = PANGO_PIXELS( ((double)log.y) );
+
+  native_metrics[TEXT_METRICS_WIDTH] 
+    = PANGO_PIXELS( ((double)log.width) );
+
+  native_metrics[TEXT_METRICS_HEIGHT] 
+    = PANGO_PIXELS( ((double)log.height) );
+
+  native_metrics[TEXT_METRICS_X_ADVANCE] 
+    = PANGO_PIXELS( ((double) (log.x + log.width)) );
+
+  native_metrics[TEXT_METRICS_Y_ADVANCE] 
+    = PANGO_PIXELS( ((double) (log.y + log.height)) );
+        
+  (*env)->ReleaseDoubleArrayElements (env, java_metrics, native_metrics, 0);
+
+  gdk_threads_leave();
+}
+
+
 JNIEXPORT void JNICALL
 Java_gnu_java_awt_peer_gtk_GdkFontPeer_setFont
   (JNIEnv *env, jobject self, jstring family_name_str, jint style_int, jint 
size, jboolean useGraphics2D)
@@ -142,7 +353,6 @@
   pango_font_description_set_family (pfont->desc, family_name);
   (*env)->ReleaseStringUTFChars(env, family_name_str, family_name);
 
-  pango_font_description_set_size (pfont->desc, size * dpi_conversion_factor);
 
   if (style & java_awt_font_BOLD)
     pango_font_description_set_weight (pfont->desc, PANGO_WEIGHT_BOLD);
@@ -152,6 +362,7 @@
 
   if (useGraphics2D)
     {
+      pango_font_description_set_size (pfont->desc, size * PANGO_SCALE);
       if (pfont->ctx == NULL)
        {
          ft2_map = PANGO_FT2_FONT_MAP(pango_ft2_font_map_for_display ());
@@ -160,6 +371,9 @@
     }
   else
     {
+      /* GDK uses a slightly different DPI setting. */
+      pango_font_description_set_size (pfont->desc, 
+                                      size * dpi_conversion_factor);
       if (pfont->ctx == NULL)
        pfont->ctx = gdk_pango_context_get();
     }
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c  19 Jan 2005 
08:10:27 -0000      1.10
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGlyphVector.c  1 Jan 1970 
00:00:00 -0000
@@ -1,696 +0,0 @@
-/* gdkglyphvector.c
-   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
-   
-   This file is part of GNU Classpath.
-   
-   GNU Classpath is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-   
-   GNU Classpath is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-   
-   You should have received a copy of the GNU General Public License
-   along with GNU Classpath; see the file COPYING.  If not, write to the
-   Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.
-   
-   Linking this library statically or dynamically with other modules is
-   making a combined work based on this library.  Thus, the terms and
-   conditions of the GNU General Public License cover the whole
-   combination.
-   
-   As a special exception, the copyright holders of this library give you
-   permission to link this library with independent modules to produce an
-   executable, regardless of the license terms of these independent
-   modules, and to copy and distribute the resulting executable under
-   terms of your choice, provided that you also meet, for each linked
-   independent module, the terms and conditions of the license of that
-   module.  An independent module is a module which is not derived from
-   or based on this library.  If you modify this library, you may extend
-   this exception to your version of the library, but you are not
-   obligated to do so.  If you do not wish to do so, delete this
-   exception statement from your version. */
-
-#include "gdkfont.h"
-#include "gnu_java_awt_peer_gtk_GdkGlyphVector.h"
-
-struct state_table *native_glyphvector_state_table;
-
-typedef struct { 
-  double x;
-  double y;
-  double width;
-  double height;
-} rect_t;
-
-#define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0))
-#define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0)
-#define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0))
-#define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0)
- 
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initStaticState 
-  (JNIEnv *env, jclass clazz)
-{
-  NSA_GV_INIT (env, clazz);
-}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_initState
-  (JNIEnv *env, jobject self, jobject font, jobject ctx __attribute__ 
((unused)))
-{
-  struct glyphvec *vec = NULL;
-  struct peerfont *pfont = NULL;
-
-  gdk_threads_enter ();
-  g_assert (font != NULL);
-  pfont = (struct peerfont *)NSA_GET_FONT_PTR (env, font);
-  g_assert (pfont != NULL);
-  g_assert (pfont->ctx != NULL);
-  g_assert (pfont->desc != NULL);
-
-  g_assert (self != NULL);
-  vec = (struct glyphvec *) g_malloc0 (sizeof (struct glyphvec));
-  g_assert (vec != NULL);
-
-  vec->desc = pango_font_describe (pfont->font); 
-  g_assert (vec->desc != NULL);
-
-  vec->font = pfont->font;
-  g_object_ref (vec->font);
-    
-  vec->ctx = pfont->ctx;
-  g_object_ref (vec->ctx);
-
-  NSA_SET_GV_PTR (env, self, vec);
-  gdk_threads_leave ();
-}
-
-static void free_glyphitems (GList *list)
-{
-  GList *i = NULL;
-  PangoGlyphItem *gi = NULL;
-
-  for (i = g_list_first (list); i != NULL; i = g_list_next (i))
-    {
-      g_assert (i->data != NULL);
-      gi = (PangoGlyphItem *)i->data;
-
-      if (gi->glyphs != NULL)
-       pango_glyph_string_free (gi->glyphs);
-
-      if (gi->item != NULL)
-       g_free (gi->item);
-    }      
-  g_list_free (list);
-}
-
-static void seek_glyphstring_idx (GList *list, int idx, 
-                                 int *nidx, 
-                                 PangoGlyphString **gs,
-                                 PangoFont **fnt)
-{
-  GList *i = NULL;
-  PangoGlyphItem *gi = NULL;
-  int begin = 0;
-
-  g_assert (list != NULL);
-  g_assert (gs != NULL);
-  g_assert (nidx != NULL);
-
- 
-  for (i = g_list_first (list); i != NULL; i = g_list_next (i))
-    {
-      g_assert (i->data != NULL);
-      gi = (PangoGlyphItem *)i->data;
-
-      g_assert (gi->glyphs != NULL);
-      
-      if (begin <= idx && idx < begin + gi->glyphs->num_glyphs)
-       {         
-         *gs = gi->glyphs;
-         *nidx = idx - begin;
-         if (fnt && gi->item)
-           *fnt = gi->item->analysis.font;
-         return;
-       }
-      else
-       {
-         begin += gi->glyphs->num_glyphs;
-       }
-    }
-  *gs = NULL;
-  *nidx = -1;
-}
-
-static void seek_glyph_idx (GList *list, int idx, 
-                           PangoGlyphInfo **g,
-                           PangoFont **fnt)
-{
-  PangoGlyphString *gs = NULL;
-  int nidx = -1;
-
-  g_assert (list != NULL);
-  g_assert (g != NULL);
-
-  seek_glyphstring_idx (list, idx, &nidx, &gs, fnt);
-
-  g_assert (gs != NULL);
-  g_assert (nidx != -1);
-  g_assert (nidx < gs->num_glyphs);
-  g_assert (gs->glyphs != NULL);
-
-  *g = gs->glyphs + nidx;
-}
-
-static void union_rects (rect_t *r1, 
-                        const rect_t *r2)
-{
-  rect_t r;
-
-  g_assert (r1 != NULL);
-  g_assert (r2 != NULL);
-
-  /* 
-     x is the left edge of the rect,
-     y is the top edge of the rect
-  */
-
-#ifndef min
-#define min(x,y) ((x) < (y) ? (x) : (y))
-#endif
-
-#ifndef max
-#define max(x,y) ((x) < (y) ? (y) : (x))
-#endif
-
-  r.x = min(r1->x, r2->x);
-
-  r.y = min(r1->y, r2->y);
-
-  r.width = max(r1->x + r1->width,
-               r2->x + r2->width) - r.x;
-
-  r.height = max(r1->y + r1->height,
-                r2->y + r2->height) - r.y;
-
-  *r1 = r;  
-}
-
-static jdoubleArray rect_to_array (JNIEnv *env, const rect_t *r)
-{
-  /* We often return rectangles as arrays : { x, y, w, h } */
-  jdoubleArray ret;
-  double *rp = NULL;
-  g_assert (r != NULL);
-  ret = (*env)->NewDoubleArray (env, 4);
-  rp = (*env)->GetDoubleArrayElements (env, ret, NULL);
-  g_assert (rp != NULL);
-  rp[0] = r->x;
-  /* freetype and pango's view of space is upside down from java2d's */
-  rp[1] = r->y * -1;
-  rp[2] = r->width;
-  rp[3] = r->height;
-  (*env)->ReleaseDoubleArrayElements (env, ret, rp, 0);
-  return ret;
-}
-
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_dispose
-  (JNIEnv *env, jobject self)
-{
-  struct glyphvec *vec = NULL;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_DEL_GV_PTR (env, self);
-  g_assert (vec != NULL);
-
-  if (vec->glyphitems != NULL)
-    {
-      free_glyphitems (vec->glyphitems);
-      vec->glyphitems = NULL;
-    }
-      
-  if (vec->desc != NULL)
-    pango_font_description_free (vec->desc);
-
-  if (vec->ctx != NULL)
-    g_object_unref (vec->ctx);
-
-  g_free (vec);
-  gdk_threads_leave ();
-}
-
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setChars 
-  (JNIEnv *env, jobject self, jstring chars)
-{
-  struct glyphvec *vec = NULL;
-  gchar *str = NULL;
-  GList *items = NULL, *item = NULL;
-  PangoGlyphItem *gi;
-  PangoAttrList *attrs = NULL; 
-  gint len = 0;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  g_assert (vec->desc != NULL);
-  g_assert (vec->ctx != NULL);
-  
-  len = (*gdk_env())->GetStringUTFLength (env, chars);
-  str = (gchar *)(*env)->GetStringUTFChars (env, chars, NULL);
-  g_assert (str != NULL);
-
-  /* step 1: set our FontFescription in the context, then "itemize" the
-     text */
-
-  attrs = pango_attr_list_new ();
-  g_assert (attrs != NULL);
-  
-  pango_context_set_font_description (vec->ctx, vec->desc);
-
-  if (vec->glyphitems != NULL)
-    items = pango_itemize (vec->ctx, str, 0, len, attrs, NULL);
-  if (items != NULL)
-    {
-      
-      /*
-       step 2: for each item:
-       - shape the item into a glyphstring
-       - store the (item, glyphstring) pair in the vec->glyphitems list
-      */
-      
-      if (vec->glyphitems != NULL)
-       {
-         free_glyphitems (vec->glyphitems);
-         vec->glyphitems = NULL;
-       }
-      
-      for (item = g_list_first (items);
-          item != NULL;
-          item = g_list_next (item))
-       {
-         g_assert (item->data != NULL);
-         
-         gi = NULL;
-         gi = g_malloc0 (sizeof(PangoGlyphItem));
-         g_assert (gi != NULL);
-         
-         gi->item = (PangoItem *)item->data;
-         gi->glyphs = pango_glyph_string_new ();
-         g_assert (gi->glyphs != NULL);
-         
-         if (gi->glyphs->num_glyphs > 0)
-           {
-             pango_shape (str + gi->item->offset, 
-                          gi->item->length, 
-                          &(gi->item->analysis), 
-                          gi->glyphs);
-             
-             vec->glyphitems = g_list_append (vec->glyphitems, gi);
-           }
-       }
-      
-      /* 
-        ownership of each item has been transferred to glyphitems, 
-        but the list should be freed.
-      */
-      
-      g_list_free (items);
-    }
-
-  pango_attr_list_unref (attrs);
-      
-  (*env)->ReleaseStringUTFChars (env, chars, str);
-  gdk_threads_leave ();
-}
-
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_setGlyphCodes
-  (JNIEnv *env, jobject self, jintArray codes __attribute__ ((unused)))
-{
-  struct glyphvec *vec = NULL;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-
-  /*
-    FIXME: setting glyph codes doesn't seem particularly plausible at the
-    moment. 
-   */
-
-  gdk_threads_leave ();
-
-}
-
-
-JNIEXPORT jint JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCode 
-  (JNIEnv *env, jobject self, jint idx)
-{
-  struct glyphvec *vec = NULL;
-  PangoGlyphInfo *gi = NULL;
-  jint ret = 0;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  g_assert (vec->glyphitems != NULL);
-
-  seek_glyph_idx (vec->glyphitems, idx, &gi, NULL);
-  g_assert (gi != NULL);
-  ret = gi->glyph;
-  gdk_threads_leave ();
-
-  return (jint)(ret);  
-}
-
-
-JNIEXPORT jint JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_numGlyphs 
-  (JNIEnv *env, jobject self)
-{
-  GList *i = NULL;
-  PangoGlyphItem *gi = NULL;
-  struct glyphvec *vec = NULL;
-  jint count = 0;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-
-  for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i))
-    {
-      g_assert (i->data != NULL);
-      gi = (PangoGlyphItem *)i->data;
-      g_assert (gi->glyphs != NULL);
-      count += gi->glyphs->num_glyphs;
-    }      
-  gdk_threads_leave ();
-
-  return count;
-}
-
-
-JNIEXPORT jint JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphCharIndex
-(JNIEnv *env __attribute__ ((unused)), jobject self  __attribute__ ((unused)), 
jint idx)
-{
-  /* 
-     FIXME: this is not correct, rather it assumes a (broken) 1:1
-     glyph:char model. it can be implemented in terms of bytes (also
-     broken) using pango's current interface, or perhaps in terms of
-     characters if some better byte->character conversion operator is
-     found. for the time being we leave it broken.
-  */
-  return idx;
-}
-
-static void 
-assume_pointsize_and_identity_transform(double pointsize,
-                                       FT_Face face)
-{
-  FT_Matrix mat;
-  mat.xx = DOUBLE_TO_16_16(1);
-  mat.xy = DOUBLE_TO_16_16(0);
-  mat.yx = DOUBLE_TO_16_16(0);
-  mat.yy = DOUBLE_TO_16_16(1);    
-  FT_Set_Transform(face, &mat, NULL);
-  FT_Set_Char_Size( face, 
-                   DOUBLE_TO_26_6 (pointsize),
-                   DOUBLE_TO_26_6 (pointsize),
-                   0, 0);  
-}                                  
-
-JNIEXPORT jdoubleArray JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allInkExtents 
-  (JNIEnv *env, jobject self)
-{
-  struct glyphvec *vec = NULL;
-  int j;
-  GList *i;
-  PangoGlyphItem *gi = NULL;
-  rect_t rect = {0,0,0,0};
-  rect_t tmp;  
-  jdoubleArray ret;
-  double x = 0, y = 0;
-  double pointsize;
-  FT_Face face;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  if (vec->glyphitems != NULL)
-    {
-      pointsize = pango_font_description_get_size (vec->desc);
-      pointsize /= (double) PANGO_SCALE;
-      
-      for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i))
-       {
-         g_assert (i->data != NULL);
-         gi = (PangoGlyphItem *)i->data;
-         g_assert (gi->glyphs != NULL);
-         
-         face = pango_ft2_font_get_face (gi->item->analysis.font);
-         assume_pointsize_and_identity_transform (pointsize, face);
-         
-         for (j = 0; j < gi->glyphs->num_glyphs; ++j)
-           {
-             FT_Load_Glyph (face,
-                            gi->glyphs->glyphs[j].glyph,
-                            FT_LOAD_DEFAULT);
-             /* FIXME: this needs to change for vertical layouts */
-             tmp.x = x + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingX);
-             tmp.y = y + DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingY);
-             tmp.width = DOUBLE_FROM_26_6 (face->glyph->metrics.width);
-             tmp.height = DOUBLE_FROM_26_6 (face->glyph->metrics.height);
-             union_rects (&rect, &tmp);
-             x += DOUBLE_FROM_26_6 (face->glyph->advance.x);
-             y += DOUBLE_FROM_26_6 (face->glyph->advance.y);
-           }
-       }      
-    }
-
-  ret = rect_to_array (env, &rect);
-  gdk_threads_leave ();
-  return ret;
-}
-
-
-JNIEXPORT jdoubleArray JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_allLogicalExtents 
-  (JNIEnv *env, jobject self)
-{
-  struct glyphvec *vec = NULL;
-  int j;
-  GList *i;
-  PangoGlyphItem *gi = NULL;
-  rect_t rect = {0,0,0,0};
-  rect_t tmp;  
-  jdoubleArray ret;
-  double x = 0, y = 0;
-  double pointsize;
-  FT_Face face;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  g_assert (vec->glyphitems != NULL);
-
-  pointsize = pango_font_description_get_size (vec->desc);
-  pointsize /= (double) PANGO_SCALE;
-
-  for (i = g_list_first (vec->glyphitems); i != NULL; i = g_list_next (i))
-    {
-      g_assert (i->data != NULL);
-      gi = (PangoGlyphItem *)i->data;
-      g_assert (gi->glyphs != NULL);
-
-      face = pango_ft2_font_get_face (gi->item->analysis.font);
-      assume_pointsize_and_identity_transform (pointsize, face);
-      
-      for (j = 0; j < gi->glyphs->num_glyphs; ++j)
-       {
-         FT_Load_Glyph (face, gi->glyphs->glyphs[j].glyph, FT_LOAD_DEFAULT);
-
-         /* FIXME: also, this is probably not the correct set of metrics;
-            the "logical bounds" are some fancy combination of hori
-            advance and height such that it's good for inverting as a
-            highlight. revisit. */
-
-         tmp.x = x;
-         tmp.y = y;
-         tmp.width = DOUBLE_FROM_26_6 (face->glyph->advance.x);
-         tmp.height = DOUBLE_FROM_26_6 (face->glyph->advance.y);
-         union_rects (&rect, &tmp);
-         x += DOUBLE_FROM_26_6 (face->glyph->advance.x);
-         y += DOUBLE_FROM_26_6 (face->glyph->advance.y);
-       }
-    }      
-
-  ret = rect_to_array (env, &rect);
-  gdk_threads_leave ();
-  return ret;
-}
-
-
-JNIEXPORT jdoubleArray JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphLogicalExtents 
-  (JNIEnv *env, jobject self, jint idx)
-{
-  struct glyphvec *vec = NULL;
-  rect_t rect = {0,0,0,0};
-  PangoGlyphInfo *gi = NULL;
-  PangoFont *font = NULL;
-  jdoubleArray ret;
-  double pointsize;
-  FT_Face face;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  g_assert (vec->glyphitems != NULL);
- 
-  seek_glyph_idx (vec->glyphitems, idx, &gi, &font);
-  g_assert (gi != NULL);
-  g_assert (font != NULL);
-
-  pointsize = pango_font_description_get_size (vec->desc);
-  pointsize /= (double) PANGO_SCALE;
-  face = pango_ft2_font_get_face (font);
-
-  assume_pointsize_and_identity_transform (pointsize, face);  
-
-  FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT);
-
-  /* FIXME: this is probably not the correct set of metrics;
-     the "logical bounds" are some fancy combination of hori
-     advance and height such that it's good for inverting as a
-     highlight. revisit. */
-  
-  rect.x = 0; 
-  rect.y = 0; 
-  rect.width = DOUBLE_FROM_26_6 (face->glyph->advance.x);
-  rect.height = DOUBLE_FROM_26_6 (face->glyph->advance.y);
-
-  ret = rect_to_array (env, &rect);
-  gdk_threads_leave ();
-  return ret;
-}
-
-
-JNIEXPORT jdoubleArray JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphInkExtents 
-  (JNIEnv *env, jobject self, jint idx)
-{
-  struct glyphvec *vec = NULL;
-  rect_t rect = {0,0,0,0};
-  PangoGlyphInfo *gi = NULL;
-  PangoFont *font = NULL;
-  jdoubleArray ret;
-  double pointsize;
-  FT_Face face;
-  
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  g_assert (vec->glyphitems != NULL);
- 
-  seek_glyph_idx (vec->glyphitems, idx, &gi, &font);
-  g_assert (gi != NULL);
-  g_assert (font != NULL);
-
-  pointsize = pango_font_description_get_size (vec->desc);
-  pointsize /= (double) PANGO_SCALE;
-  face = pango_ft2_font_get_face (font);
-
-  assume_pointsize_and_identity_transform (pointsize, face);  
-  
-  FT_Load_Glyph (face, gi->glyph, FT_LOAD_DEFAULT);
-  /* FIXME: this needs to change for vertical layouts */
-  rect.x = DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingX);
-  rect.y = DOUBLE_FROM_26_6 (face->glyph->metrics.horiBearingY);
-  rect.width = DOUBLE_FROM_26_6 (face->glyph->metrics.width);
-  rect.height = DOUBLE_FROM_26_6 (face->glyph->metrics.height);
-
-  ret = rect_to_array (env, &rect);
-  gdk_threads_leave ();
-  return ret;
-}
-
-
-JNIEXPORT jboolean JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_glyphIsHorizontal 
-(JNIEnv *env, jobject self, jint idx  __attribute__ ((unused)))
-{
-  struct glyphvec *vec = NULL;
-  PangoDirection dir;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  g_assert (vec != NULL);
-  g_assert (vec->desc != NULL);
-  g_assert (vec->ctx != NULL);
-
-  /* 
-     FIXME: this is an approximation; it's not clear to me whether
-     glyphs themselves are horizontal or vertical so much as the
-     writing system or writing context. pango thinks it's a context
-     issue, so we use that for now.
-   */
-
-  dir = pango_context_get_base_dir (vec->ctx);
-
-  gdk_threads_leave ();
-
-  return 1;
-  /* FIXME: Pango doesn't seem to have decided how it will deal
-     with vertical text. for the time being we inherit this limitation.
-    ((dir == PANGO_DIRECTION_LTR) ||
-     (dir == PANGO_DIRECTION_RTL));    
-  */
-}
-
-
-JNIEXPORT jboolean JNICALL
-Java_gnu_java_awt_peer_gtk_GdkGlyphVector_isEqual 
-  (JNIEnv *env, jobject self, jobject other)
-{
-  struct glyphvec *vec1 = NULL, *vec2 = NULL;
-  jboolean eq = 0;
-
-  gdk_threads_enter ();
-  g_assert (self != NULL);
-  vec1 = (struct glyphvec *)NSA_GET_GV_PTR (env, self);
-  vec2 = (struct glyphvec *)NSA_GET_GV_PTR (env, other);
-  g_assert (vec1 != NULL);
-  g_assert (vec2 != NULL);
-  
-  /* FIXME: is there some more advantageous definition of equality for
-     glyph vectors? */
-  eq = (vec1 == vec2);
-  
-  gdk_threads_leave ();
-  return eq;
-}
-
-

reply via email to

[Prev in Thread] Current Thread [Next in Thread]