[kaffe] CVS kaffe (dalibor): Resynced with GNU Classpath

Kaffe CVS cvs-commits at kaffe.org
Wed Dec 3 13:12:03 PST 2003


PatchSet 4188 
Date: 2003/12/03 21:10:00
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Resynced with GNU Classpath

2003-12-03  Dalibor Topic <robilad at kaffe.org>

        * libraries/javalib/java/awt/Font.java:
        (createGlyphVector) Added new methods from GNU Classpath.

        * libraries/javalib/java/awt/font/TextLayout.java:
        Resynced with GNU Classpath.

        2003-11-18  Graydon Hoare  <graydon at redhat.com>

        * java/awt/font/TextLayout.java: Implement simple layouts
        using attributed strings and glyph vectors.

Members: 
	ChangeLog:1.1779->1.1780 
	libraries/javalib/java/awt/Font.java:1.13->1.14 
	libraries/javalib/java/awt/font/TextLayout.java:1.1->1.2 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1779 kaffe/ChangeLog:1.1780
--- kaffe/ChangeLog:1.1779	Wed Dec  3 20:48:07 2003
+++ kaffe/ChangeLog	Wed Dec  3 21:10:00 2003
@@ -1,5 +1,18 @@
 2003-12-03  Dalibor Topic <robilad at kaffe.org>
 
+	* libraries/javalib/java/awt/Font.java:
+	(createGlyphVector) Added new methods from GNU Classpath.
+
+	* libraries/javalib/java/awt/font/TextLayout.java:
+	Resynced with GNU Classpath.
+
+	2003-11-18  Graydon Hoare  <graydon at redhat.com>
+
+	* java/awt/font/TextLayout.java: Implement simple layouts
+	using attributed strings and glyph vectors.
+
+2003-12-03  Dalibor Topic <robilad at kaffe.org>
+
 	* libraries/javalib/gnu/java/net/protocol/jar/Handler.java:
 	Resynced with GNU Classpath.
 
Index: kaffe/libraries/javalib/java/awt/Font.java
diff -u kaffe/libraries/javalib/java/awt/Font.java:1.13 kaffe/libraries/javalib/java/awt/Font.java:1.14
--- kaffe/libraries/javalib/java/awt/Font.java:1.13	Sun Jul 14 23:24:58 2002
+++ kaffe/libraries/javalib/java/awt/Font.java	Wed Dec  3 21:10:01 2003
@@ -1,7 +1,10 @@
 package java.awt;
 
+import java.awt.font.GlyphVector;
+import java.awt.font.FontRenderContext;
 import java.awt.peer.FontPeer;
 import java.io.Serializable;
+import java.text.CharacterIterator;
 import kaffe.util.Ptr;
 
 /**
@@ -221,5 +224,30 @@
 
 	return getClass().getName() + "[family=" +getFamily() + ",name=" + name
 	    + ",style=" + s + ",size=" + size + ']';
+}
+
+/* taken from GNU Classpath */
+public GlyphVector
+createGlyphVector(FontRenderContext ctx, String str)
+{
+  throw new UnsupportedOperationException ();
+}
+
+public GlyphVector
+createGlyphVector(FontRenderContext ctx, CharacterIterator i)
+{
+  throw new UnsupportedOperationException ();
+}
+
+public GlyphVector
+createGlyphVector(FontRenderContext ctx, char[] chars)
+{
+  throw new UnsupportedOperationException ();
+}
+
+public GlyphVector
+createGlyphVector(FontRenderContext ctx, int[] glyphCodes)
+{
+  throw new UnsupportedOperationException ();
 }
 }
Index: kaffe/libraries/javalib/java/awt/font/TextLayout.java
diff -u kaffe/libraries/javalib/java/awt/font/TextLayout.java:1.1 kaffe/libraries/javalib/java/awt/font/TextLayout.java:1.2
--- kaffe/libraries/javalib/java/awt/font/TextLayout.java:1.1	Fri Aug 15 16:59:01 2003
+++ kaffe/libraries/javalib/java/awt/font/TextLayout.java	Wed Dec  3 21:10:03 2003
@@ -43,8 +43,12 @@
 import java.awt.Shape;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+import java.text.CharacterIterator;
 import java.text.AttributedCharacterIterator;
+import java.text.AttributedString;
 import java.util.Map;
+import java.awt.font.TextAttribute;
+
 
 /**
  * @author Michael Koch
@@ -67,24 +71,26 @@
     }
   }
 
+  private AttributedString attributedString;
   private FontRenderContext fontRenderContext;
   
   public TextLayout (AttributedCharacterIterator text, FontRenderContext frc)
-  {
-    // FIXME
-    this.fontRenderContext = frc;
+  {    
+    attributedString = new AttributedString (text);
+    fontRenderContext = frc;
   }
 
   public TextLayout (String string, Font font, FontRenderContext frc) 
   {
-    // FIXME
-    this.fontRenderContext = frc;
+    attributedString = new AttributedString (string);
+    attributedString.addAttribute (TextAttribute.FONT, font);
+    fontRenderContext = frc;
   }
 
   public TextLayout (String string, Map attributes, FontRenderContext frc) 
   {
-    // FIXME
-    this.fontRenderContext = frc;
+    attributedString = new AttributedString (string, attributes);
+    fontRenderContext = frc;
   }
 
   protected Object clone ()
@@ -100,9 +106,147 @@
       }
   }
 
+
+  protected class CharacterIteratorProxy 
+    implements CharacterIterator
+  {
+    public CharacterIterator target;
+    public int begin;
+    public int limit;
+    public int index;
+
+    public CharacterIteratorProxy (CharacterIterator ci)
+    {
+      target = ci;
+    }
+
+    public int getBeginIndex ()
+    {
+      return begin;
+    }
+
+    public int getEndIndex ()
+    {
+      return limit;
+    }
+
+    public int getIndex ()
+    {
+      return index;
+    }
+
+    public char setIndex (int idx) 
+      throws IllegalArgumentException
+    {
+      if (idx < begin || idx >= limit)
+        throw new IllegalArgumentException ();
+      char ch = target.setIndex (idx);
+      index = idx;
+      return ch;
+    }
+
+    public char first ()
+    {
+      int save = target.getIndex ();
+      char ch = target.setIndex (begin);
+      target.setIndex (save);
+      return ch;
+    }
+
+    public char last ()
+    {
+      if (begin == limit)
+        return this.first ();
+
+      int save = target.getIndex ();
+      char ch = target.setIndex (limit - 1);
+      target.setIndex (save);
+      return ch;
+    }
+
+    public char current ()
+    {
+      return target.current();
+    }
+
+    public char next ()
+    {
+      if (index >= limit - 1)
+        return CharacterIterator.DONE;
+      else
+        {
+          index++;
+          return target.next();
+        }
+    }
+
+    public char previous ()
+    {
+      if (index <= begin)
+        return CharacterIterator.DONE;
+      else
+        {
+          index--;
+          return target.previous ();
+        }
+    }
+
+    public Object clone ()
+    {
+      CharacterIteratorProxy cip = new CharacterIteratorProxy (this.target);
+      cip.begin = this.begin;
+      cip.limit = this.limit;
+      cip.index = this.index;
+      return cip;
+    }
+    
+  }
+
+
   public void draw (Graphics2D g2, float x, float y) 
   {
-    throw new Error ("not implemented");
+    AttributedCharacterIterator ci = attributedString.getIterator ();
+    CharacterIteratorProxy proxy = new CharacterIteratorProxy (ci);
+    Font defFont = g2.getFont ();
+
+    /* Note: this implementation currently only interprets FONT text
+     * attributes. There is a reasonable argument to be made for some
+     * attributes being interpreted out here, where we have control of the
+     * Graphics2D and can construct or derive new fonts, and some
+     * attributes being interpreted by the GlyphVector itself. So far, for
+     * all attributes except FONT we do neither.
+     */
+
+    for (char c = ci.first ();
+         c != CharacterIterator.DONE;
+         c = ci.next ())
+      {                
+        proxy.begin = ci.getIndex ();
+        proxy.limit = ci.getRunLimit(TextAttribute.FONT);
+        if (proxy.limit <= proxy.begin)
+          continue;
+
+        proxy.index = proxy.begin;
+
+        Object fnt = ci.getAttribute(TextAttribute.FONT);
+        GlyphVector gv;
+        if (fnt instanceof Font)
+          gv = ((Font)fnt).createGlyphVector (fontRenderContext, proxy);
+        else
+          gv = defFont.createGlyphVector (fontRenderContext, proxy);
+
+        g2.drawGlyphVector (gv, x, y);
+
+        int n = gv.getNumGlyphs ();
+        for (int i = 0; i < n; ++i)
+          {
+            GlyphMetrics gm = gv.getGlyphMetrics (i);
+            if (gm.getAdvanceX() == gm.getAdvance ())
+              x += gm.getAdvanceX ();
+            else
+              y += gm.getAdvanceY ();
+          }
+      }
   }
 
   public boolean equals (Object obj)




More information about the kaffe mailing list