This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]