< prev index next >
src/java.desktop/share/classes/java/awt/font/NumericShaper.java
Print this page
*** 32,53 ****
import java.util.EnumSet;
import java.util.Set;
import jdk.internal.misc.SharedSecrets;
/**
! * The <code>NumericShaper</code> class is used to convert Latin-1 (European)
* digits to other Unicode decimal digits. Users of this class will
* primarily be people who wish to present data using
* national digit shapes, but find it more convenient to represent the
* data internally using Latin-1 (European) digits. This does not
* interpret the deprecated numeric shape selector character (U+206E).
* <p>
! * Instances of <code>NumericShaper</code> are typically applied
* as attributes to text with the
* {@link TextAttribute#NUMERIC_SHAPING NUMERIC_SHAPING} attribute
! * of the <code>TextAttribute</code> class.
! * For example, this code snippet causes a <code>TextLayout</code> to
* shape European digits to Arabic in an Arabic context:<br>
* <blockquote><pre>
* Map map = new HashMap();
* map.put(TextAttribute.NUMERIC_SHAPING,
* NumericShaper.getContextualShaper(NumericShaper.ARABIC));
--- 32,53 ----
import java.util.EnumSet;
import java.util.Set;
import jdk.internal.misc.SharedSecrets;
/**
! * The {@code NumericShaper} class is used to convert Latin-1 (European)
* digits to other Unicode decimal digits. Users of this class will
* primarily be people who wish to present data using
* national digit shapes, but find it more convenient to represent the
* data internally using Latin-1 (European) digits. This does not
* interpret the deprecated numeric shape selector character (U+206E).
* <p>
! * Instances of {@code NumericShaper} are typically applied
* as attributes to text with the
* {@link TextAttribute#NUMERIC_SHAPING NUMERIC_SHAPING} attribute
! * of the {@code TextAttribute} class.
! * For example, this code snippet causes a {@code TextLayout} to
* shape European digits to Arabic in an Arabic context:<br>
* <blockquote><pre>
* Map map = new HashMap();
* map.put(TextAttribute.NUMERIC_SHAPING,
* NumericShaper.getContextualShaper(NumericShaper.ARABIC));
*** 55,65 ****
* TextLayout layout = new TextLayout(text, map, frc);
* layout.draw(g2d, x, y);
* </pre></blockquote>
* <br>
* It is also possible to perform numeric shaping explicitly using instances
! * of <code>NumericShaper</code>, as this code snippet demonstrates:<br>
* <blockquote><pre>
* char[] text = ...;
* // shape all EUROPEAN digits (except zero) to ARABIC digits
* NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC);
* shaper.shape(text, start, count);
--- 55,65 ----
* TextLayout layout = new TextLayout(text, map, frc);
* layout.draw(g2d, x, y);
* </pre></blockquote>
* <br>
* It is also possible to perform numeric shaping explicitly using instances
! * of {@code NumericShaper}, as this code snippet demonstrates:<br>
* <blockquote><pre>
* char[] text = ...;
* // shape all EUROPEAN digits (except zero) to ARABIC digits
* NumericShaper shaper = NumericShaper.getShaper(NumericShaper.ARABIC);
* shaper.shape(text, start, count);
*** 107,117 ****
* range, one of the sets will take precedence as follows.
*
* <table border=1 cellspacing=3 cellpadding=0 summary="NumericShaper constants precedence.">
* <tr>
* <th class="TableHeadingColor">Unicode Range</th>
! * <th class="TableHeadingColor"><code>NumericShaper</code> Constants</th>
* <th class="TableHeadingColor">Precedence</th>
* </tr>
* <tr>
* <td rowspan="2">Arabic</td>
* <td>{@link NumericShaper#ARABIC NumericShaper.ARABIC}<br>
--- 107,117 ----
* range, one of the sets will take precedence as follows.
*
* <table border=1 cellspacing=3 cellpadding=0 summary="NumericShaper constants precedence.">
* <tr>
* <th class="TableHeadingColor">Unicode Range</th>
! * <th class="TableHeadingColor">{@code NumericShaper} Constants</th>
* <th class="TableHeadingColor">Precedence</th>
* </tr>
* <tr>
* <td rowspan="2">Arabic</td>
* <td>{@link NumericShaper#ARABIC NumericShaper.ARABIC}<br>
*** 147,157 ****
* A {@code NumericShaper.Range} represents a Unicode range of a
* script having its own decimal digits. For example, the {@link
* NumericShaper.Range#THAI} range has the Thai digits, THAI DIGIT
* ZERO (U+0E50) to THAI DIGIT NINE (U+0E59).
*
! * <p>The <code>Range</code> enum replaces the traditional bit
* mask-based values (e.g., {@link NumericShaper#ARABIC}), and
* supports more Unicode ranges than the bit mask-based ones. For
* example, the following code using the bit mask:
* <blockquote><pre>
* NumericShaper.getContextualShaper(NumericShaper.ARABIC |
--- 147,157 ----
* A {@code NumericShaper.Range} represents a Unicode range of a
* script having its own decimal digits. For example, the {@link
* NumericShaper.Range#THAI} range has the Thai digits, THAI DIGIT
* ZERO (U+0E50) to THAI DIGIT NINE (U+0E59).
*
! * <p>The {@code Range} enum replaces the traditional bit
* mask-based values (e.g., {@link NumericShaper#ARABIC}), and
* supports more Unicode ranges than the bit mask-based ones. For
* example, the following code using the bit mask:
* <blockquote><pre>
* NumericShaper.getContextualShaper(NumericShaper.ARABIC |
*** 1338,1348 ****
* Returns a contextual shaper for the provided unicode range(s).
* Latin-1 (EUROPEAN) digits are converted to the decimal digits
* corresponding to the range of the preceding text, if the
* range is one of the provided ranges. Multiple ranges are
* represented by or-ing the values together, such as,
! * <code>NumericShaper.ARABIC | NumericShaper.THAI</code>. The
* shaper assumes EUROPEAN as the starting context, that is, if
* EUROPEAN digits are encountered before any strong directional
* text in the string, the context is presumed to be EUROPEAN, and
* so the digits will not shape.
* @param ranges the specified Unicode ranges
--- 1338,1348 ----
* Returns a contextual shaper for the provided unicode range(s).
* Latin-1 (EUROPEAN) digits are converted to the decimal digits
* corresponding to the range of the preceding text, if the
* range is one of the provided ranges. Multiple ranges are
* represented by or-ing the values together, such as,
! * {@code NumericShaper.ARABIC | NumericShaper.THAI}. The
* shaper assumes EUROPEAN as the starting context, that is, if
* EUROPEAN digits are encountered before any strong directional
* text in the string, the context is presumed to be EUROPEAN, and
* so the digits will not shape.
* @param ranges the specified Unicode ranges
*** 1379,1396 ****
* Returns a contextual shaper for the provided unicode range(s).
* Latin-1 (EUROPEAN) digits will be converted to the decimal digits
* corresponding to the range of the preceding text, if the
* range is one of the provided ranges. Multiple ranges are
* represented by or-ing the values together, for example,
! * <code>NumericShaper.ARABIC | NumericShaper.THAI</code>. The
* shaper uses defaultContext as the starting context.
* @param ranges the specified Unicode ranges
* @param defaultContext the starting context, such as
! * <code>NumericShaper.EUROPEAN</code>
* @return a shaper for the specified Unicode ranges.
* @throws IllegalArgumentException if the specified
! * <code>defaultContext</code> is not a single valid range.
*/
public static NumericShaper getContextualShaper(int ranges, int defaultContext) {
int key = getKeyFromMask(defaultContext);
ranges |= CONTEXTUAL_MASK;
return new NumericShaper(key, ranges);
--- 1379,1396 ----
* Returns a contextual shaper for the provided unicode range(s).
* Latin-1 (EUROPEAN) digits will be converted to the decimal digits
* corresponding to the range of the preceding text, if the
* range is one of the provided ranges. Multiple ranges are
* represented by or-ing the values together, for example,
! * {@code NumericShaper.ARABIC | NumericShaper.THAI}. The
* shaper uses defaultContext as the starting context.
* @param ranges the specified Unicode ranges
* @param defaultContext the starting context, such as
! * {@code NumericShaper.EUROPEAN}
* @return a shaper for the specified Unicode ranges.
* @throws IllegalArgumentException if the specified
! * {@code defaultContext} is not a single valid range.
*/
public static NumericShaper getContextualShaper(int ranges, int defaultContext) {
int key = getKeyFromMask(defaultContext);
ranges |= CONTEXTUAL_MASK;
return new NumericShaper(key, ranges);
*** 1461,1473 ****
/**
* Converts the digits in the text that occur between start and
* start + count.
* @param text an array of characters to convert
! * @param start the index into <code>text</code> to start
* converting
! * @param count the number of characters in <code>text</code>
* to convert
* @throws IndexOutOfBoundsException if start or start + count is
* out of bounds
* @throws NullPointerException if text is null
*/
--- 1461,1473 ----
/**
* Converts the digits in the text that occur between start and
* start + count.
* @param text an array of characters to convert
! * @param start the index into {@code text} to start
* converting
! * @param count the number of characters in {@code text}
* to convert
* @throws IndexOutOfBoundsException if start or start + count is
* out of bounds
* @throws NullPointerException if text is null
*/
*** 1487,1507 ****
/**
* Converts the digits in the text that occur between start and
* start + count, using the provided context.
* Context is ignored if the shaper is not a contextual shaper.
* @param text an array of characters
! * @param start the index into <code>text</code> to start
* converting
! * @param count the number of characters in <code>text</code>
* to convert
* @param context the context to which to convert the
! * characters, such as <code>NumericShaper.EUROPEAN</code>
* @throws IndexOutOfBoundsException if start or start + count is
* out of bounds
* @throws NullPointerException if text is null
* @throws IllegalArgumentException if this is a contextual shaper
! * and the specified <code>context</code> is not a single valid
* range.
*/
public void shape(char[] text, int start, int count, int context) {
checkParams(text, start, count);
if (isContextual()) {
--- 1487,1507 ----
/**
* Converts the digits in the text that occur between start and
* start + count, using the provided context.
* Context is ignored if the shaper is not a contextual shaper.
* @param text an array of characters
! * @param start the index into {@code text} to start
* converting
! * @param count the number of characters in {@code text}
* to convert
* @param context the context to which to convert the
! * characters, such as {@code NumericShaper.EUROPEAN}
* @throws IndexOutOfBoundsException if start or start + count is
* out of bounds
* @throws NullPointerException if text is null
* @throws IllegalArgumentException if this is a contextual shaper
! * and the specified {@code context} is not a single valid
* range.
*/
public void shape(char[] text, int start, int count, int context) {
checkParams(text, start, count);
if (isContextual()) {
*** 1568,1588 ****
"bad start or count for text of length " + text.length);
}
}
/**
! * Returns a <code>boolean</code> indicating whether or not
* this shaper shapes contextually.
! * @return <code>true</code> if this shaper is contextual;
! * <code>false</code> otherwise.
*/
public boolean isContextual() {
return (mask & CONTEXTUAL_MASK) != 0;
}
/**
! * Returns an <code>int</code> that ORs together the values for
* all the ranges that will be shaped.
* <p>
* For example, to check if a shaper shapes to Arabic, you would use the
* following:
* <blockquote>
--- 1568,1588 ----
"bad start or count for text of length " + text.length);
}
}
/**
! * Returns a {@code boolean} indicating whether or not
* this shaper shapes contextually.
! * @return {@code true} if this shaper is contextual;
! * {@code false} otherwise.
*/
public boolean isContextual() {
return (mask & CONTEXTUAL_MASK) != 0;
}
/**
! * Returns an {@code int} that ORs together the values for
* all the ranges that will be shaped.
* <p>
* For example, to check if a shaper shapes to Arabic, you would use the
* following:
* <blockquote>
*** 1728,1751 ****
return hash;
}
/**
* Returns {@code true} if the specified object is an instance of
! * <code>NumericShaper</code> and shapes identically to this one,
* regardless of the range representations, the bit mask or the
* enum. For example, the following code produces {@code "true"}.
* <blockquote><pre>
* NumericShaper ns1 = NumericShaper.getShaper(NumericShaper.ARABIC);
* NumericShaper ns2 = NumericShaper.getShaper(NumericShaper.Range.ARABIC);
* System.out.println(ns1.equals(ns2));
* </pre></blockquote>
*
* @param o the specified object to compare to this
! * <code>NumericShaper</code>
! * @return <code>true</code> if <code>o</code> is an instance
! * of <code>NumericShaper</code> and shapes in the same way;
! * <code>false</code> otherwise.
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object o) {
if (o != null) {
try {
--- 1728,1751 ----
return hash;
}
/**
* Returns {@code true} if the specified object is an instance of
! * {@code NumericShaper} and shapes identically to this one,
* regardless of the range representations, the bit mask or the
* enum. For example, the following code produces {@code "true"}.
* <blockquote><pre>
* NumericShaper ns1 = NumericShaper.getShaper(NumericShaper.ARABIC);
* NumericShaper ns2 = NumericShaper.getShaper(NumericShaper.Range.ARABIC);
* System.out.println(ns1.equals(ns2));
* </pre></blockquote>
*
* @param o the specified object to compare to this
! * {@code NumericShaper}
! * @return {@code true} if {@code o} is an instance
! * of {@code NumericShaper} and shapes in the same way;
! * {@code false} otherwise.
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object o) {
if (o != null) {
try {
*** 1773,1785 ****
}
return false;
}
/**
! * Returns a <code>String</code> that describes this shaper. This method
* is used for debugging purposes only.
! * @return a <code>String</code> describing this shaper.
*/
public String toString() {
StringBuilder buf = new StringBuilder(super.toString());
buf.append("[contextual:").append(isContextual());
--- 1773,1785 ----
}
return false;
}
/**
! * Returns a {@code String} that describes this shaper. This method
* is used for debugging purposes only.
! * @return a {@code String} describing this shaper.
*/
public String toString() {
StringBuilder buf = new StringBuilder(super.toString());
buf.append("[contextual:").append(isContextual());
< prev index next >