This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui][patch] major font rendering overhaul
- From: graydon hoare <graydon at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Mon, 04 Oct 2004 12:58:34 -0400
- Subject: [gui][patch] major font rendering overhaul
hi,
this patch, which I've just committed to the java-gui-branch,
reimplements a significant portion of the font rendering system in
libjava / classpath. it also includes a couple rendering fixes to swing
and GdkGraphics / GdkGraphics2D. the patch is meant to accompany some
changes entering cairo CVS in the next few days, which reimplements the
font rendering system there as well.
the patch is split into a native and non-native part, as requested. it
is sufficiently large that I've posted it separately on a webpage:
http://people.redhat.com/graydon/java-font-overhaul-oct-4-2004-java-part.patch
http://people.redhat.com/graydon/java-font-overhaul-oct-4-2004-native-part.patch
the goals of the patch are as follows:
- cairo and GDK should produce as close to pixel-identical results
(save anti-aliasing difference) as possible.
- text layouts should delegate work to pango when possible.
- differences between code supporting the GDK and cairo-backed font
objects should be reduced; we've been growing two complete font
systems, which makes bug fixing too complex.
- the font's metrics should always agree with those of the final
rendered output.
- fonts and metrics should be aggressively cached, but with
bounded memory use on caches.
- font rendering performance should approach Xft speed.
with the additional cairo patch, these goals have broadly been met.
cairo still has compositing speed limits, but the text portion of the
rendering path is greatly accelerated. when I run the GDK and cairo
demos on my terminal, they are visually indistinguishable without the
use of xzoom to pick out smoothed diagonal lines.
please let me know if you have difficulties with the patch. I apologize
for affecting so many parts at once, but -- with the possible exception
of the rendering hints and synchronous paint changes -- it was difficult
to do any portion of the work without bringing the others along.
-graydon
2004-09-30 Graydon Hoare <graydon@redhat.com>
* Makefile.am
(jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c)
(jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c)
(gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java)
(gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java): Remove.
(jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c)
(jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c)
(gnu/java/awt/peer/gtk/GdkTextLayout.java)
(gnu/java/awt/peer/gtk/GdkFontPeer.java)
(gnu/java/awt/peer/ClasspathTextLayoutPeer.java): Add
* Makefile.in: Regenerate.
* gnu/awt/xlib/XToolkit.java
(getClasspathTextLayoutPeer): Add stub.
* gnu/java/awt/ClasspathToolkit.java
(getClasspathTextLayoutPeer) Add.
* gnu/java/awt/peer/ClasspathFontPeer.java
(copyStyleToAttrs)
(copySizeToAttrs): Make public.
* gnu/java/awt/peer/ClasspathTextLayoutPeer.java: New file.
* gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java: Remove.
* gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java: Remove.
* gnu/java/awt/peer/gtk/GdkFontMetrics.java: Rewrite.
* gnu/java/awt/peer/gtk/GdkFontPeer.java: New file.
* gnu/java/awt/peer/gtk/GdkGlyphVector.java: Adjust type names.
* gnu/java/awt/peer/gtk/GdkGraphics.java
(getFontPeer): New function.
(drawString): Pass font peer to native side.
* gnu/java/awt/peer/gtk/GdkGraphics2D.java
(cairoSetFont)
(cairoShowGlyphs)
(PainterThread): Remove.
(GdkGraphics2D): Set hints during construction.
(shifted)
(walkPath)
(draw)
(setRenderingHint)
(setRenderingHints): Reimplement normalization logic.
(getDefaultHints)
(updateBufferedImage)
(isBufferedImageGraphics)
(updateImagePixels)
(drawImage): Make final.
(drawImage): Always paint synchronously.
(drawString)
(drawGlyphVector): Rewrite.
(releasePeerGraphicResource)
(getPeerTextMetrics)
(getPeerFontMetrics)
(drawGdkGlyphVector)
(drawGdkTextLayout)
(cairoDrawGdkGlyphVector)
(cairoDrawGdkTextLayout)
(cairoDrawString)
(getFontPeer): New functions.
* gnu/java/awt/peer/gtk/GdkTextLayout.java: New file.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java
(getFontMetrics): Get metrics via toolkit, to hit cache.
* gnu/java/awt/peer/gtk/GtkTextAreaPeer.java: Use getFontMetrics.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java: Likewise.
* gnu/java/awt/peer/gtk/GtkToolkit.java (LRUCache): New class.
(fontCache)
(metricsCache)
(imageCache): New members.
(getFontMetrics)
(getImage)
(getClasspathFontPeer): Use caches.
(getFontPeer): Route through getClasspathFontPeer.
* java/awt/Font.java (attrsToMap): Remove, adjust ctors.
* java/awt/font/TextLayout.java: Implement in terms of peer.
* javax/swing/plaf/basic/BasicSliderUI.java
(paintThumb): Use polyline rather than polygon.
* javax/swing/plaf/basic/BasicGraphicsUtils.java:
Update comment but, alas, still do not switch to using TextLayouts.
* javax/swing/text/Utilities.java (drawTabbedText):
Draw text run-at-a-time, not char-at-a-time.
* jni/gtk-peer/gdkfont.h: Publicize some of the font interface, add
layout table.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c:
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c:
Remove files.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c: Rewrite to
incorporate brains of old GdkClasspathFontPeerMetrics.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontPeer.c: Rewrite to
incorporate brains of old GdkClasspathFontPeer.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkTextLayout.c: New file.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
(drawString): Rewrite to use persistent layout in peer font.
Comment out extraneous gdk_flush calls.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
(metrics_cairo)
(metrics_surface): New static variables.
(paint_glyph_run)
(install_font_peer): New helper functions.
(releasePeerGraphicResource)
(getPeerTextMetrics)
(getPeerFontMetrics)
(cairoDrawGdkTextLayout)
(cairoDrawGdkGlyphVector): New native methods.
(cairoDrawString): Rewrite, leaving layout-based version
commented out for the time being.
* jni/gtk-peer/gtkpeer.h (graphics): Add fields for pango stuff.