Skip to content

8360136: Support setting 'Figure Styles' while creating AWT Font #26144

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/java.desktop/share/classes/java/awt/Font.java
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,8 @@ protected Font(Font font) {
EBIDI_EMBEDDING, EJUSTIFICATION,
EINPUT_METHOD_HIGHLIGHT, EINPUT_METHOD_UNDERLINE,
ESWAP_COLORS, ENUMERIC_SHAPING, EKERNING,
ELIGATURES, ETRACKING, ESUPERSCRIPT);
ELIGATURES, ETRACKING, ESUPERSCRIPT,
EPROPORTIONAL_FIGURES, ETABULAR_FIGURES);

private static final int EXTRA_MASK =
AttributeValues.getMask(ETRANSFORM, ESUPERSCRIPT, EWIDTH);
Expand Down
46 changes: 46 additions & 0 deletions src/java.desktop/share/classes/java/awt/font/TextAttribute.java
Original file line number Diff line number Diff line change
Expand Up @@ -1111,4 +1111,50 @@ protected Object readResolve() throws InvalidObjectException {
*/
public static final Float TRACKING_LOOSE =
Float.valueOf(.04f);

/**
* Attribute key for enabling optional proportional figures. Values are
* instances of <b>{@code Integer}</b>. The default value is
* {@code 0}, which means do not use optional proportional figures.
*
* <p>The constant value {@link #PROPORTIONAL_FIGURES_ON} is defined.
*
* <p>Conflicts with {@link #TABULAR_FIGURES}
*
* @since 26
*/
public static final TextAttribute PROPORTIONAL_FIGURES =
new TextAttribute("proportional-figures");

/**
* Request to enable proprotional figures.
*
* @see #PROPORTIONAL_FIGURES
* @since 26
*/
public static final Integer PROPORTIONAL_FIGURES_ON =
Integer.valueOf(1);

/**
* Attribute key for enabling optional tabular figures. Values are
* instances of <b>{@code Integer}</b>. The default value is
* {@code 0}, which means do not use optional tabular figures.
*
* <p>The constant value {@link #TABULAR_FIGURES_ON} is defined.
*
* <p>Conflicts with {@link #PROPORTIONAL_FIGURES}
*
* @since 26
*/
public static final TextAttribute TABULAR_FIGURES =
new TextAttribute("tabular-figures");

/**
* Request to enable tabular figures.
*
* @see #TABULAR_FIGURES
* @since 26
*/
public static final Integer TABULAR_FIGURES_ON =
Integer.valueOf(1);
}
21 changes: 21 additions & 0 deletions src/java.desktop/share/classes/sun/font/AttributeValues.java
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ public final class AttributeValues implements Cloneable {
private byte bidiEmbedding; // 0
private byte kerning; // 0
private byte ligatures; // 0
private byte proportionalFigures; // 0
private byte tabularFigures; // 0
private boolean strikethrough; // false
private boolean swapColors; // false

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

public int getProportionalFigures() { return proportionalFigures; }
public void setProportionalFigures(int f) {
this.proportionalFigures = (byte)f; update(EPROPORTIONAL_FIGURES); }

public int getTabularFigures() { return tabularFigures; }
public void setTabularFigures(int f) {
this.tabularFigures = (byte)f; update(ETABULAR_FIGURES); }

public AffineTransform getBaselineTransform() { return baselineTransform; }
public AffineTransform getCharTransform() { return charTransform; }
Expand Down Expand Up @@ -535,6 +544,8 @@ public String toString() {
case EKERNING: b.append(kerning); break;
case ELIGATURES: b.append(ligatures); break;
case ETRACKING: b.append(tracking); break;
case EPROPORTIONAL_FIGURES: b.append(proportionalFigures); break;
case ETABULAR_FIGURES: b.append(tabularFigures); break;
default: throw new InternalError();
}
if ((nondefault & ea.mask) == 0) {
Expand Down Expand Up @@ -593,6 +604,8 @@ private void i_set(EAttribute a, AttributeValues src) {
case EKERNING: kerning = src.kerning; break;
case ELIGATURES: ligatures = src.ligatures; break;
case ETRACKING: tracking = src.tracking; break;
case EPROPORTIONAL_FIGURES: proportionalFigures = src.proportionalFigures; break;
case ETABULAR_FIGURES: tabularFigures = src.tabularFigures; break;
default: throw new InternalError();
}
}
Expand Down Expand Up @@ -622,6 +635,8 @@ private boolean i_equals(EAttribute a, AttributeValues src) {
case EKERNING: return kerning == src.kerning;
case ELIGATURES: return ligatures == src.ligatures;
case ETRACKING: return tracking == src.tracking;
case EPROPORTIONAL_FIGURES: return proportionalFigures == src.proportionalFigures;
case ETABULAR_FIGURES: return tabularFigures == src.tabularFigures;
default: throw new InternalError();
}
}
Expand Down Expand Up @@ -677,6 +692,8 @@ private void i_set(EAttribute a, Object o) {
case EKERNING: kerning = (byte)((Integer)o).intValue(); break;
case ELIGATURES: ligatures = (byte)((Integer)o).intValue(); break;
case ETRACKING: tracking = ((Number)o).floatValue(); break;
case EPROPORTIONAL_FIGURES: proportionalFigures = (byte) ((Number)o).intValue(); break;
case ETABULAR_FIGURES: tabularFigures = (byte) ((Number)o).intValue(); break;
default: throw new InternalError();
}
}
Expand Down Expand Up @@ -717,6 +734,8 @@ private Object i_get(EAttribute a) {
case EKERNING: return Integer.valueOf(kerning);
case ELIGATURES: return Integer.valueOf(ligatures);
case ETRACKING: return Float.valueOf(tracking);
case EPROPORTIONAL_FIGURES: return Integer.valueOf(proportionalFigures);
case ETABULAR_FIGURES: return Integer.valueOf(tabularFigures);
default: throw new InternalError();
}
}
Expand Down Expand Up @@ -749,6 +768,8 @@ private boolean i_validate(EAttribute a) {
case EKERNING: return kerning >= 0 && kerning <= 1;
case ELIGATURES: return ligatures >= 0 && ligatures <= 1;
case ETRACKING: return tracking >= -1 && tracking <= 10;
case EPROPORTIONAL_FIGURES: return proportionalFigures >= 0 && proportionalFigures <= 1;
case ETABULAR_FIGURES: return tabularFigures >= 0 && tabularFigures <= 1;
default: throw new InternalError("unknown attribute: " + a);
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/java.desktop/share/classes/sun/font/EAttribute.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ public enum EAttribute {
EKERNING(KERNING),
ELIGATURES(LIGATURES),
ETRACKING(TRACKING),
EBASELINE_TRANSFORM(null);
EBASELINE_TRANSFORM(null),
EPROPORTIONAL_FIGURES(PROPORTIONAL_FIGURES),
ETABULAR_FIGURES(TABULAR_FIGURES);

/* package */ final int mask;
/* package */ final TextAttribute att;
Expand Down
2 changes: 2 additions & 0 deletions src/java.desktop/share/classes/sun/font/GlyphLayout.java
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,8 @@ public StandardGlyphVector layout(Font font, FontRenderContext frc,
AttributeValues values = ((AttributeMap)font.getAttributes()).getValues();
if (values.getKerning() != 0) _typo_flags |= 0x1;
if (values.getLigatures() != 0) _typo_flags |= 0x2;
if (values.getProportionalFigures() != 0) _typo_flags |= 0x4;
if (values.getTabularFigures() != 0) _typo_flags |= 0x8;
}

_offset = offset;
Expand Down
8 changes: 7 additions & 1 deletion src/java.desktop/share/native/libfontmanager/HBShaper.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ JDKFontInfo*

#define TYPO_KERN 0x00000001
#define TYPO_LIGA 0x00000002
#define TYPO_PNUM 0x00000004
#define TYPO_TNUM 0x00000008
#define TYPO_RTL 0x80000000

JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape
Expand Down Expand Up @@ -255,6 +257,8 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape
int featureCount = 0;
char* kern = (flags & TYPO_KERN) ? "kern" : "-kern";
char* liga = (flags & TYPO_LIGA) ? "liga" : "-liga";
char* pnum = (flags & TYPO_PNUM) ? "pnum" : "-pnum";
char* tnum = (flags & TYPO_TNUM) ? "tnum" : "-tnum";
jboolean ret;
unsigned int buflen;

Expand Down Expand Up @@ -293,10 +297,12 @@ JNIEXPORT jboolean JNICALL Java_sun_font_SunLayoutEngine_shape

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

features = calloc(2, sizeof(hb_feature_t));
features = calloc(4, sizeof(hb_feature_t));
if (features) {
hb_feature_from_string(kern, -1, &features[featureCount++]);
hb_feature_from_string(liga, -1, &features[featureCount++]);
hb_feature_from_string(pnum, -1, &features[featureCount++]);
hb_feature_from_string(tnum, -1, &features[featureCount++]);
}

hb_shape_full(hbfont, buffer, features, featureCount, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ static float euclidianDistance(float a, float b)

#define TYPO_KERN 0x00000001
#define TYPO_LIGA 0x00000002
#define TYPO_PNUM 0x00000004
#define TYPO_TNUM 0x00000008
#define TYPO_RTL 0x80000000

JDKEXPORT void jdk_hb_shape(
Expand Down Expand Up @@ -92,6 +94,8 @@ JDKEXPORT void jdk_hb_shape(
int featureCount = 0;
char* kern = (flags & TYPO_KERN) ? "kern" : "-kern";
char* liga = (flags & TYPO_LIGA) ? "liga" : "-liga";
char* pnum = (flags & TYPO_PNUM) ? "pnum" : "-pnum";
char* tnum = (flags & TYPO_TNUM) ? "tnum" : "-tnum";
unsigned int buflen;

float devScale = 1.0f;
Expand Down Expand Up @@ -120,10 +124,12 @@ JDKEXPORT void jdk_hb_shape(
int charCount = limit - offset;
hb_buffer_add_utf16(buffer, chars, len, offset, charCount);

features = calloc(2, sizeof(hb_feature_t));
features = calloc(4, sizeof(hb_feature_t));
if (features) {
hb_feature_from_string(kern, -1, &features[featureCount++]);
hb_feature_from_string(liga, -1, &features[featureCount++]);
hb_feature_from_string(pnum, -1, &features[featureCount++]);
hb_feature_from_string(tnum, -1, &features[featureCount++]);
}

hb_shape_full(hbfont, buffer, features, featureCount, 0);
Expand Down