Skip to content

Commit a3b6912

Browse files
committed
8360136: introducing TextAttribute#PROPORTIONAL_FIGURES and TextAttribute#TABULAR_FIGURES for controlling Font figure styles
1 parent 5e40fb6 commit a3b6912

File tree

7 files changed

+88
-4
lines changed

7 files changed

+88
-4
lines changed

src/java.desktop/share/classes/java/awt/Font.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,7 +767,8 @@ protected Font(Font font) {
767767
EBIDI_EMBEDDING, EJUSTIFICATION,
768768
EINPUT_METHOD_HIGHLIGHT, EINPUT_METHOD_UNDERLINE,
769769
ESWAP_COLORS, ENUMERIC_SHAPING, EKERNING,
770-
ELIGATURES, ETRACKING, ESUPERSCRIPT);
770+
ELIGATURES, ETRACKING, ESUPERSCRIPT,
771+
EPROPORTIONAL_FIGURES, ETABULAR_FIGURES);
771772

772773
private static final int EXTRA_MASK =
773774
AttributeValues.getMask(ETRANSFORM, ESUPERSCRIPT, EWIDTH);

src/java.desktop/share/classes/java/awt/font/TextAttribute.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,4 +1111,50 @@ protected Object readResolve() throws InvalidObjectException {
11111111
*/
11121112
public static final Float TRACKING_LOOSE =
11131113
Float.valueOf(.04f);
1114+
1115+
/**
1116+
* Attribute key for enabling optional proportional figures. Values are
1117+
* instances of <b>{@code Integer}</b>. The default value is
1118+
* {@code 0}, which means do not use optional proportional figures.
1119+
*
1120+
* <p>The constant value {@link #PROPORTIONAL_FIGURES_ON} is defined.
1121+
*
1122+
* <p>Conflicts with {@link #TABULAR_FIGURES}
1123+
*
1124+
* @since 26
1125+
*/
1126+
public static final TextAttribute PROPORTIONAL_FIGURES =
1127+
new TextAttribute("proportional-figures");
1128+
1129+
/**
1130+
* Request to enable proprotional figures.
1131+
*
1132+
* @see #PROPORTIONAL_FIGURES
1133+
* @since 26
1134+
*/
1135+
public static final Integer PROPORTIONAL_FIGURES_ON =
1136+
Integer.valueOf(1);
1137+
1138+
/**
1139+
* Attribute key for enabling optional tabular figures. Values are
1140+
* instances of <b>{@code Integer}</b>. The default value is
1141+
* {@code 0}, which means do not use optional tabular figures.
1142+
*
1143+
* <p>The constant value {@link #TABULAR_FIGURES_ON} is defined.
1144+
*
1145+
* <p>Conflicts with {@link #PROPORTIONAL_FIGURES}
1146+
*
1147+
* @since 26
1148+
*/
1149+
public static final TextAttribute TABULAR_FIGURES =
1150+
new TextAttribute("tabular-figures");
1151+
1152+
/**
1153+
* Request to enable tabular figures.
1154+
*
1155+
* @see #TABULAR_FIGURES
1156+
* @since 26
1157+
*/
1158+
public static final Integer TABULAR_FIGURES_ON =
1159+
Integer.valueOf(1);
11141160
}

src/java.desktop/share/classes/sun/font/AttributeValues.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ public final class AttributeValues implements Cloneable {
8383
private byte bidiEmbedding; // 0
8484
private byte kerning; // 0
8585
private byte ligatures; // 0
86+
private byte proportionalFigures; // 0
87+
private byte tabularFigures; // 0
8688
private boolean strikethrough; // false
8789
private boolean swapColors; // false
8890

@@ -192,6 +194,13 @@ public void setTracking(float f) {
192194
public void setLigatures(int f) {
193195
this.ligatures = (byte)f; update(ELIGATURES); }
194196

197+
public int getProportionalFigures() { return proportionalFigures; }
198+
public void setProportionalFigures(int f) {
199+
this.proportionalFigures = (byte)f; update(EPROPORTIONAL_FIGURES); }
200+
201+
public int getTabularFigures() { return tabularFigures; }
202+
public void setTabularFigures(int f) {
203+
this.tabularFigures = (byte)f; update(ETABULAR_FIGURES); }
195204

196205
public AffineTransform getBaselineTransform() { return baselineTransform; }
197206
public AffineTransform getCharTransform() { return charTransform; }
@@ -535,6 +544,8 @@ public String toString() {
535544
case EKERNING: b.append(kerning); break;
536545
case ELIGATURES: b.append(ligatures); break;
537546
case ETRACKING: b.append(tracking); break;
547+
case EPROPORTIONAL_FIGURES: b.append(proportionalFigures); break;
548+
case ETABULAR_FIGURES: b.append(tabularFigures); break;
538549
default: throw new InternalError();
539550
}
540551
if ((nondefault & ea.mask) == 0) {
@@ -593,6 +604,8 @@ private void i_set(EAttribute a, AttributeValues src) {
593604
case EKERNING: kerning = src.kerning; break;
594605
case ELIGATURES: ligatures = src.ligatures; break;
595606
case ETRACKING: tracking = src.tracking; break;
607+
case EPROPORTIONAL_FIGURES: proportionalFigures = src.proportionalFigures; break;
608+
case ETABULAR_FIGURES: tabularFigures = src.tabularFigures; break;
596609
default: throw new InternalError();
597610
}
598611
}
@@ -622,6 +635,8 @@ private boolean i_equals(EAttribute a, AttributeValues src) {
622635
case EKERNING: return kerning == src.kerning;
623636
case ELIGATURES: return ligatures == src.ligatures;
624637
case ETRACKING: return tracking == src.tracking;
638+
case EPROPORTIONAL_FIGURES: return proportionalFigures == src.proportionalFigures;
639+
case ETABULAR_FIGURES: return tabularFigures == src.tabularFigures;
625640
default: throw new InternalError();
626641
}
627642
}
@@ -677,6 +692,8 @@ private void i_set(EAttribute a, Object o) {
677692
case EKERNING: kerning = (byte)((Integer)o).intValue(); break;
678693
case ELIGATURES: ligatures = (byte)((Integer)o).intValue(); break;
679694
case ETRACKING: tracking = ((Number)o).floatValue(); break;
695+
case EPROPORTIONAL_FIGURES: proportionalFigures = (byte) ((Number)o).intValue(); break;
696+
case ETABULAR_FIGURES: tabularFigures = (byte) ((Number)o).intValue(); break;
680697
default: throw new InternalError();
681698
}
682699
}
@@ -717,6 +734,8 @@ private Object i_get(EAttribute a) {
717734
case EKERNING: return Integer.valueOf(kerning);
718735
case ELIGATURES: return Integer.valueOf(ligatures);
719736
case ETRACKING: return Float.valueOf(tracking);
737+
case EPROPORTIONAL_FIGURES: return Integer.valueOf(proportionalFigures);
738+
case ETABULAR_FIGURES: return Integer.valueOf(tabularFigures);
720739
default: throw new InternalError();
721740
}
722741
}
@@ -749,6 +768,8 @@ private boolean i_validate(EAttribute a) {
749768
case EKERNING: return kerning >= 0 && kerning <= 1;
750769
case ELIGATURES: return ligatures >= 0 && ligatures <= 1;
751770
case ETRACKING: return tracking >= -1 && tracking <= 10;
771+
case EPROPORTIONAL_FIGURES: return proportionalFigures >= 0 && proportionalFigures <= 1;
772+
case ETABULAR_FIGURES: return tabularFigures >= 0 && tabularFigures <= 1;
752773
default: throw new InternalError("unknown attribute: " + a);
753774
}
754775
}

src/java.desktop/share/classes/sun/font/EAttribute.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ public enum EAttribute {
6565
EKERNING(KERNING),
6666
ELIGATURES(LIGATURES),
6767
ETRACKING(TRACKING),
68-
EBASELINE_TRANSFORM(null);
68+
EBASELINE_TRANSFORM(null),
69+
EPROPORTIONAL_FIGURES(PROPORTIONAL_FIGURES),
70+
ETABULAR_FIGURES(TABULAR_FIGURES);
6971

7072
/* package */ final int mask;
7173
/* package */ final TextAttribute att;

src/java.desktop/share/classes/sun/font/GlyphLayout.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,8 @@ public StandardGlyphVector layout(Font font, FontRenderContext frc,
366366
AttributeValues values = ((AttributeMap)font.getAttributes()).getValues();
367367
if (values.getKerning() != 0) _typo_flags |= 0x1;
368368
if (values.getLigatures() != 0) _typo_flags |= 0x2;
369+
if (values.getProportionalFigures() != 0) _typo_flags |= 0x4;
370+
if (values.getTabularFigures() != 0) _typo_flags |= 0x8;
369371
}
370372

371373
_offset = offset;

src/java.desktop/share/native/libfontmanager/HBShaper.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ JDKFontInfo*
223223

224224
#define TYPO_KERN 0x00000001
225225
#define TYPO_LIGA 0x00000002
226+
#define TYPO_PNUM 0x00000004
227+
#define TYPO_TNUM 0x00000008
226228
#define TYPO_RTL 0x80000000
227229

228230
JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape
@@ -255,6 +257,8 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape
255257
int featureCount = 0;
256258
char* kern = (flags & TYPO_KERN) ? "kern" : "-kern";
257259
char* liga = (flags & TYPO_LIGA) ? "liga" : "-liga";
260+
char* pnum = (flags & TYPO_PNUM) ? "pnum" : "-pnum";
261+
char* tnum = (flags & TYPO_TNUM) ? "tnum" : "-tnum";
258262
jboolean ret;
259263
unsigned int buflen;
260264

@@ -293,10 +297,12 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape
293297

294298
hb_buffer_add_utf16(buffer, chars, len, offset, limit-offset);
295299

296-
features = calloc(2, sizeof(hb_feature_t));
300+
features = calloc(4, sizeof(hb_feature_t));
297301
if (features) {
298302
hb_feature_from_string(kern, -1, &features[featureCount++]);
299303
hb_feature_from_string(liga, -1, &features[featureCount++]);
304+
hb_feature_from_string(pnum, -1, &features[featureCount++]);
305+
hb_feature_from_string(tnum, -1, &features[featureCount++]);
300306
}
301307

302308
hb_shape_full(hbfont, buffer, features, featureCount, 0);

src/java.desktop/share/native/libfontmanager/HBShaper_Panama.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ static float euclidianDistance(float a, float b)
6161

6262
#define TYPO_KERN 0x00000001
6363
#define TYPO_LIGA 0x00000002
64+
#define TYPO_PNUM 0x00000004
65+
#define TYPO_TNUM 0x00000008
6466
#define TYPO_RTL 0x80000000
6567

6668
JDKEXPORT void jdk_hb_shape(
@@ -92,6 +94,8 @@ JDKEXPORT void jdk_hb_shape(
9294
int featureCount = 0;
9395
char* kern = (flags & TYPO_KERN) ? "kern" : "-kern";
9496
char* liga = (flags & TYPO_LIGA) ? "liga" : "-liga";
97+
char* pnum = (flags & TYPO_PNUM) ? "pnum" : "-pnum";
98+
char* tnum = (flags & TYPO_TNUM) ? "tnum" : "-tnum";
9599
unsigned int buflen;
96100

97101
float devScale = 1.0f;
@@ -120,10 +124,12 @@ JDKEXPORT void jdk_hb_shape(
120124
int charCount = limit - offset;
121125
hb_buffer_add_utf16(buffer, chars, len, offset, charCount);
122126

123-
features = calloc(2, sizeof(hb_feature_t));
127+
features = calloc(4, sizeof(hb_feature_t));
124128
if (features) {
125129
hb_feature_from_string(kern, -1, &features[featureCount++]);
126130
hb_feature_from_string(liga, -1, &features[featureCount++]);
131+
hb_feature_from_string(pnum, -1, &features[featureCount++]);
132+
hb_feature_from_string(tnum, -1, &features[featureCount++]);
127133
}
128134

129135
hb_shape_full(hbfont, buffer, features, featureCount, 0);

0 commit comments

Comments
 (0)