1 |
/* GdkFontMetrics.java |
/* GdkFontMetrics.java |
2 |
Copyright (C) 1999, 2002 Free Software Foundation, Inc. |
Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. |
3 |
|
|
4 |
This file is part of GNU Classpath. |
This file is part of GNU Classpath. |
5 |
|
|
38 |
|
|
39 |
package gnu.java.awt.peer.gtk; |
package gnu.java.awt.peer.gtk; |
40 |
|
|
41 |
|
import gnu.java.awt.ClasspathToolkit; |
42 |
|
|
43 |
import java.awt.Font; |
import java.awt.Font; |
44 |
import java.awt.FontMetrics; |
import java.awt.FontMetrics; |
45 |
|
import java.awt.Toolkit; |
46 |
|
|
47 |
public class GdkFontMetrics extends FontMetrics |
public class GdkFontMetrics extends FontMetrics |
48 |
{ |
{ |
49 |
private final int native_state = GtkGenericPeer.getUniqueInteger(); |
|
50 |
|
private int[] font_metrics; |
51 |
private static final int ASCENT = 0, MAX_ASCENT = 1, |
GdkFontPeer peer; |
52 |
DESCENT = 2, MAX_DESCENT = 3, |
|
53 |
MAX_ADVANCE = 4; |
static final int FONT_METRICS_ASCENT = 0; |
54 |
|
static final int FONT_METRICS_MAX_ASCENT = 1; |
55 |
|
static final int FONT_METRICS_DESCENT = 2; |
56 |
|
static final int FONT_METRICS_MAX_DESCENT = 3; |
57 |
|
static final int FONT_METRICS_MAX_ADVANCE = 4; |
58 |
|
|
59 |
|
static final int TEXT_METRICS_X_BEARING = 0; |
60 |
|
static final int TEXT_METRICS_Y_BEARING = 1; |
61 |
|
static final int TEXT_METRICS_WIDTH = 2; |
62 |
|
static final int TEXT_METRICS_HEIGHT = 3; |
63 |
|
static final int TEXT_METRICS_X_ADVANCE = 4; |
64 |
|
static final int TEXT_METRICS_Y_ADVANCE = 5; |
65 |
|
|
66 |
private int[] metrics; |
static native void getPeerFontMetrics(GdkFontPeer peer, double [] metrics); |
67 |
private native int[] initState (String fname, int style, int size); |
static native void getPeerTextMetrics(GdkFontPeer peer, String str, double [] metrics); |
68 |
|
|
69 |
public GdkFontMetrics (Font font) |
public GdkFontMetrics (Font font) |
70 |
{ |
{ |
71 |
super (font); |
super (font.getPeer() instanceof GdkFontPeer |
72 |
metrics = initState (font.getName (), font.getStyle (), font.getSize ()); |
? font |
73 |
} |
: ((ClasspathToolkit)(Toolkit.getDefaultToolkit ())) |
74 |
|
.getFont (font.getName(), font.getAttributes ())); |
75 |
native public int stringWidth (String fname, int style, int size, |
|
76 |
String str); |
peer = (GdkFontPeer) this.font.getPeer(); |
77 |
|
|
78 |
|
font_metrics = new int[5]; |
79 |
|
double [] hires = new double[5]; |
80 |
|
|
81 |
|
if (GtkToolkit.useGraphics2D ()) |
82 |
|
GdkGraphics2D.getPeerFontMetrics(peer, hires); |
83 |
|
else |
84 |
|
getPeerFontMetrics (peer, hires); |
85 |
|
|
86 |
|
for (int i = 0; i < 5; ++i) |
87 |
|
font_metrics[i] = (int) hires[i]; |
88 |
|
} |
89 |
|
|
90 |
public int stringWidth (String str) |
public int stringWidth (String str) |
91 |
{ |
{ |
92 |
return stringWidth (font.getName (), font.getStyle (), font.getSize (), |
double [] hires = new double[6]; |
93 |
str); |
if (GtkToolkit.useGraphics2D()) |
94 |
|
GdkGraphics2D.getPeerTextMetrics(peer, str, hires); |
95 |
|
else |
96 |
|
getPeerTextMetrics(peer, str, hires); |
97 |
|
return (int) hires [TEXT_METRICS_WIDTH]; |
98 |
} |
} |
99 |
|
|
100 |
public int charWidth (char ch) |
public int charWidth (char ch) |
107 |
return stringWidth (new String (data, off, len)); |
return stringWidth (new String (data, off, len)); |
108 |
} |
} |
109 |
|
|
110 |
// Sun's Motif implementation always returns 0 or 1 here (???). |
/* |
111 |
|
Sun's Motif implementation always returns 0 or 1 here (???), but |
112 |
|
going by the X11 man pages, it seems as though we should return |
113 |
|
font.ascent + font.descent. |
114 |
|
*/ |
115 |
public int getLeading () |
public int getLeading () |
116 |
{ |
{ |
117 |
return 0; |
return 1; |
118 |
|
// return metrics[ASCENT] + metrics[DESCENT]; |
119 |
} |
} |
120 |
|
|
121 |
public int getAscent () |
public int getAscent () |
122 |
{ |
{ |
123 |
return metrics[ASCENT]; |
return font_metrics[FONT_METRICS_ASCENT]; |
124 |
} |
} |
125 |
|
|
126 |
public int getMaxAscent () |
public int getMaxAscent () |
127 |
{ |
{ |
128 |
return metrics[MAX_ASCENT]; |
return font_metrics[FONT_METRICS_MAX_ASCENT]; |
129 |
} |
} |
130 |
|
|
131 |
public int getDescent () |
public int getDescent () |
132 |
{ |
{ |
133 |
return metrics[DESCENT]; |
return font_metrics[FONT_METRICS_DESCENT]; |
134 |
} |
} |
135 |
|
|
136 |
public int getMaxDescent () |
public int getMaxDescent () |
137 |
{ |
{ |
138 |
return metrics[MAX_DESCENT]; |
return font_metrics[FONT_METRICS_MAX_DESCENT]; |
139 |
} |
} |
140 |
|
|
141 |
public int getMaxAdvance () |
public int getMaxAdvance () |
142 |
{ |
{ |
143 |
return metrics[MAX_ADVANCE]; |
return font_metrics[FONT_METRICS_MAX_ADVANCE]; |
144 |
} |
} |
145 |
} |
} |