This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui][PATCH] Fix font size calculations in GTK peers
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Thu, 27 May 2004 15:13:35 -0400
- Subject: [gui][PATCH] Fix font size calculations in GTK peers
Hi,
I committed this patch to java-gui-branch. It adjusts font size
calculations in the GTK peers to factor in the screen's DPI. The AWT
specifies font sizes in pixels but we were interpreting them as points.
Tom
2004-05-27 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkTextAreaPeer.java (create): Set
"Dialog" as the default font.
* gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (create):
Likewise.
* java/awt/Component.java (getFont): Return "Dialog" font by
default.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c:
Multiply size argument to pango_font_description_set_size by the
DPI conversion factor rather than by PANGO_SCALE.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c: Likewise.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (drawString):
Divide baseline y coordinate by DPI conversion factor rather
than by PANGO_SCALE.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
(area_prepared): Fix typo.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
(gtkSetFont): Move gtk_bin_get_child inside GDK critical region.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(dpi_conversion_factor): New global variable.
(init_dpi_conversion_factor): New function to calculate and
track DPI conversion factor.
(dpi_changed_cb): New callback.
* jni/gtk-peer/gtkpeer.h (dpi_conversion_factor): Declare.
Index: gnu/java/awt/peer/gtk/GtkTextAreaPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java,v
retrieving revision 1.7.8.2
diff -u -r1.7.8.2 GtkTextAreaPeer.java
--- gnu/java/awt/peer/gtk/GtkTextAreaPeer.java 18 May 2004 22:06:01 -0000 1.7.8.2
+++ gnu/java/awt/peer/gtk/GtkTextAreaPeer.java 27 May 2004 18:39:06 -0000
@@ -61,7 +61,7 @@
// GtkComponent.create.
if (f == null)
{
- f = new Font ("Fixed", Font.PLAIN, 12);
+ f = new Font ("Dialog", Font.PLAIN, 12);
awtComponent.setFont (f);
}
Index: gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,v
retrieving revision 1.9.4.1
diff -u -r1.9.4.1 GtkTextFieldPeer.java
--- gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 18 May 2004 22:06:01 -0000 1.9.4.1
+++ gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 27 May 2004 18:39:06 -0000
@@ -60,7 +60,7 @@
// GtkComponent.create.
if (f == null)
{
- f = new Font ("Fixed", Font.PLAIN, 12);
+ f = new Font ("Dialog", Font.PLAIN, 12);
awtComponent.setFont (f);
}
Index: java/awt/Component.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Component.java,v
retrieving revision 1.37.2.9
diff -u -r1.37.2.9 Component.java
--- java/awt/Component.java 7 May 2004 00:18:03 -0000 1.37.2.9
+++ java/awt/Component.java 27 May 2004 18:39:07 -0000
@@ -1030,7 +1030,7 @@
if (parent != null)
return parent.getFont ();
else
- return new Font ("Fixed", Font.PLAIN, 12);
+ return new Font ("Dialog", Font.PLAIN, 12);
}
/**
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c 20 Nov 2003 22:44:01 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeer.c 27 May 2004 18:39:07 -0000
@@ -135,7 +135,7 @@
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 * PANGO_SCALE);
+ 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);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_GdkFontMetrics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c 2 Dec 2003 21:00:05 -0000 1.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c 27 May 2004 18:39:07 -0000
@@ -64,7 +64,7 @@
gdk_threads_enter ();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
context = gdk_pango_context_get();
pango_context_set_font_description (context, font_desc);
@@ -109,7 +109,7 @@
gdk_threads_enter ();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
context = gdk_pango_context_get();
pango_context_set_font_description (context, font_desc);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.5.2.1
diff -u -r1.5.2.1 gnu_java_awt_peer_gtk_GdkGraphics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 27 Feb 2004 19:43:41 -0000 1.5.2.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 27 May 2004 18:39:07 -0000
@@ -207,7 +207,8 @@
gdk_threads_enter ();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
@@ -225,8 +226,10 @@
baseline_y = pango_layout_iter_get_baseline (iter);
- gdk_draw_layout (g->drawable, g->gc,
- x + g->x_offset, y + g->y_offset - (baseline_y / PANGO_SCALE), layout);
+ gdk_draw_layout (g->drawable, g->gc,
+ x + g->x_offset,
+ y + g->y_offset - (baseline_y / dpi_conversion_factor),
+ layout);
pango_font_description_free (font_desc);
pango_layout_iter_free (iter);
@@ -259,6 +262,7 @@
g = (struct graphics *) NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+
gdk_draw_rectangle (g->drawable, g->gc, TRUE,
x + g->x_offset, y + g->y_offset, width, height);
gdk_threads_leave ();
@@ -370,6 +374,7 @@
gdk_threads_enter ();
gdk_color_alloc (g->cm, &color);
gdk_gc_set_foreground (g->gc, &color);
+
gdk_threads_leave ();
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 1 Dec 2003 18:05:32 -0000 1.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 27 May 2004 18:39:07 -0000
@@ -72,7 +72,7 @@
return;
width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf),
+ height = gdk_pixbuf_get_height (pixbuf);
gdk_threads_leave ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.8.2.2
diff -u -r1.8.2.2 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 18 May 2004 22:06:01 -0000 1.8.2.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 27 May 2004 18:39:07 -0000
@@ -130,7 +130,7 @@
return;
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v
retrieving revision 1.4.8.2
diff -u -r1.4.8.2 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 11 Mar 2004 20:50:13 -0000 1.4.8.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 27 May 2004 18:39:07 -0000
@@ -187,7 +187,7 @@
gdk_threads_enter();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.15.2.11
diff -u -r1.15.2.11 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 27 May 2004 02:47:28 -0000 1.15.2.11
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 27 May 2004 18:39:07 -0000
@@ -866,7 +866,7 @@
gdk_threads_enter();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v
retrieving revision 1.6.8.1
diff -u -r1.6.8.1 gnu_java_awt_peer_gtk_GtkLabelPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 27 Feb 2004 19:43:41 -0000 1.6.8.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 27 May 2004 18:39:07 -0000
@@ -54,7 +54,7 @@
str = (*env)->GetStringUTFChars (env, text, 0);
gdk_threads_enter ();
-
+
ebox = gtk_event_box_new ();
ebox_container = GTK_CONTAINER (ebox);
label = gtk_label_new (str);
@@ -80,17 +80,17 @@
ptr = NSA_GET_PTR (env, obj);
- label = gtk_bin_get_child (GTK_BIN(ptr));
+ font_name = (*env)->GetStringUTFChars (env, name, NULL);
- if (!label)
- return;
+ gdk_threads_enter ();
- font_name = (*env)->GetStringUTFChars (env, name, NULL);
+ label = gtk_bin_get_child (GTK_BIN (ptr));
- gdk_threads_enter();
+ if (!label)
+ return;
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
@@ -98,11 +98,11 @@
if (style & AWT_STYLE_ITALIC)
pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
- gtk_widget_modify_font (GTK_WIDGET(label), font_desc);
+ gtk_widget_modify_font (GTK_WIDGET (label), font_desc);
pango_font_description_free (font_desc);
- gdk_threads_leave();
+ gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, name, font_name);
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.7.8.3
diff -u -r1.7.8.3 gnu_java_awt_peer_gtk_GtkListPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 25 May 2004 15:21:21 -0000 1.7.8.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 27 May 2004 18:39:07 -0000
@@ -166,7 +166,7 @@
font_name = (*env)->GetStringUTFChars (env, name, NULL);
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.12
diff -u -r1.12 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 13 Jan 2004 20:54:46 -0000 1.12
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 27 May 2004 18:39:07 -0000
@@ -69,6 +69,12 @@
GtkWindowGroup *global_gtk_window_group;
+double dpi_conversion_factor;
+
+static void init_dpi_conversion_factor ();
+static void dpi_changed_cb (GtkSettings *settings,
+ GParamSpec *pspec);
+
/*
* Call gtk_init. It is very important that this happen before any other
* gtk calls.
@@ -166,7 +172,7 @@
"postMenuActionEvent",
"()V");
postMouseEventID = (*env)->GetMethodID (env, gtkcomponentpeer,
- "postMouseEvent", "(IJIIIIZ)V");
+ "postMouseEvent", "(IJIIIIZ)V");
postConfigureEventID = (*env)->GetMethodID (env, gtkwindowpeer,
"postConfigureEvent", "(IIII)V");
postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer,
@@ -194,6 +200,8 @@
"postTextEvent",
"()V");
global_gtk_window_group = gtk_window_group_new ();
+
+ init_dpi_conversion_factor ();
}
/*
@@ -207,3 +215,36 @@
gtk_main ();
gdk_threads_leave ();
}
+
+/* This is a big hack, needed until this pango bug is resolved:
+ http://bugzilla.gnome.org/show_bug.cgi?id=119081.
+ See: http://www.geocrawler.com/archives/3/522/2003/8/0/10579352/
+ for details. */
+static void
+init_dpi_conversion_factor ()
+{
+ GtkSettings *settings = gtk_settings_get_default ();
+ GObjectClass *klass;
+
+ klass = G_OBJECT_CLASS (GTK_SETTINGS_GET_CLASS (settings));
+ if (g_object_class_find_property (klass, "gtk-xft-dpi"))
+ {
+ int int_dpi;
+ g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL);
+ dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE);
+ g_signal_connect (settings, "notify::gtk-xft-dpi",
+ G_CALLBACK (dpi_changed_cb), NULL);
+ }
+ else
+ /* Approximate. */
+ dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.;
+}
+
+static void
+dpi_changed_cb (GtkSettings *settings,
+ GParamSpec *pspec)
+{
+ int int_dpi;
+ g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL);
+ dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE);
+}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v
retrieving revision 1.11.8.2
diff -u -r1.11.8.2 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 18 May 2004 22:06:01 -0000 1.11.8.2
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 27 May 2004 18:39:07 -0000
@@ -156,7 +156,7 @@
gdk_threads_enter();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.10
diff -u -r1.10 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 20 Jan 2004 21:05:39 -0000 1.10
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 27 May 2004 18:39:07 -0000
@@ -150,7 +150,7 @@
gdk_threads_enter();
font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc, size * PANGO_SCALE);
+ pango_font_description_set_size (font_desc, size * dpi_conversion_factor);
if (style & AWT_STYLE_BOLD)
pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.12.8.2
diff -u -r1.12.8.2 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h 12 May 2004 23:40:05 -0000 1.12.8.2
+++ jni/gtk-peer/gtkpeer.h 27 May 2004 18:39:07 -0000
@@ -435,6 +435,8 @@
extern jmethodID gdkColorID;
extern JNIEnv *gdk_env;
+extern double dpi_conversion_factor;
+
extern GtkWindowGroup *global_gtk_window_group;
void awt_event_handler (GdkEvent *event);