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 <[EMAIL PROTECTED]> * 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 <[EMAIL PROTECTED]> * 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 <[EMAIL PROTECTED]> + * 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 <[EMAIL PROTECTED]> + + * java/awt/font/TextLayout.java: Implement simple layouts + using attributed strings and glyph vectors. + +2003-12-03 Dalibor Topic <[EMAIL PROTECTED]> + * 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) _______________________________________________ kaffe mailing list [EMAIL PROTECTED] http://kaffe.org/cgi-bin/mailman/listinfo/kaffe