/*
* @(#)TextAttribute.java 1.46 03/12/19
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*
* (C) Copyright Taligent, Inc. 1996 - 1997, All Rights Reserved
* (C) Copyright IBM Corp. 1996 - 1998, All Rights Reserved
*
* The original version of this source code and documentation is
* copyrighted and owned by Taligent, Inc., a wholly-owned subsidiary
* of IBM. These materials are provided under terms of a License
* Agreement between Taligent and Sun. This technology is protected
* by multiple US and International patents.
*
* This notice and attribution to Taligent may not be removed.
* Taligent is a registered trademark of Taligent, Inc.
*
*/
package java.awt.font;
import java.io.InvalidObjectException;
import java.text.AttributedCharacterIterator.Attribute;
import java.util.Map;
import java.util.HashMap;
/**
* The TextAttribute
class defines attribute keys and
* attribute values used for text rendering.
*
* TextAttribute
instances are used as attribute keys to
* identify attributes in
* {@link java.text.AttributedCharacterIterator AttributedCharacterIterator},
* {@link java.awt.Font Font}, and other classes handling text
* attributes. Other constants defined in this class are used
* as attribute values.
*
* For each text attribute, the documentation describes: *
null
value).
* *
null
or not of the proper type
* then it has the default effect. The effect of a particular value
* can be interpolated, especially in the case of multiple master
* fonts. This interpolation is done based on the nearest defined
* constants above and below the request:* interpolation = (request - below)/(above - below); **
*
TextAttribute
with the specified name.
* @param name the attribute name to assign to this
* TextAttribute
*/
protected TextAttribute(String name) {
super(name);
if (this.getClass() == TextAttribute.class) {
instanceMap.put(name, this);
}
}
/**
* Resolves instances being deserialized to the predefined constants.
*/
protected Object readResolve() throws InvalidObjectException {
if (this.getClass() != TextAttribute.class) {
throw new InvalidObjectException("subclass didn't correctly implement readResolve");
}
TextAttribute instance = (TextAttribute) instanceMap.get(getName());
if (instance != null) {
return instance;
} else {
throw new InvalidObjectException("unknown attribute name");
}
}
// Serialization compatibility with Java 2 platform v1.2.
// 1.2 will throw an InvalidObjectException if ever asked to deserialize INPUT_METHOD_UNDERLINE.
// This shouldn't happen in real life.
static final long serialVersionUID = 7744112784117861702L;
//
// For use with Font.
//
/**
* Attribute key for the unlocalized font family name.
*
* Key |
* FAMILY |
---|---|
Value |
* String |
Constants |
* "Serif", "SansSerif" |
Default |
* Host default; |
Description |
* The name of the font family. If the family name is not * found, the default font is used. The name should not be the full * font name or specify other attributes (such as the name * "Helvetica Bold"). Such names might result in the default * font if the name does not match a known * family name. |
Key |
* WEIGHT |
---|---|
Value |
* Float |
Constants |
*
* WEIGHT_EXTRA_LIGHT = 0.5, * WEIGHT_LIGHT = 0.75, * WEIGHT_DEMILIGHT = 0.875, * WEIGHT_REGULAR = 1.0, * WEIGHT_SEMIBOLD = 1.25, * WEIGHT_MEDIUM = 1.5, * WEIGHT_DEMIBOLD = 1.75, * WEIGHT_BOLD = 2.0, * WEIGHT_HEAVY = 2.25, * WEIGHT_EXTRABOLD = 2.5, * WEIGHT_ULTRABOLD = 2.75 |
Default |
* WEIGHT_REGULAR |
Description |
* The value is roughly the ratio of the stem width to * that of the regular weight. If the font has a different value for * specific constants, then the value is interpolated as described in * the class description. |
Fallback |
* Currently none. However, in the future, shape
* manipulations might be available to simulate weight variations * for fonts that don't have them. |
Key |
* WIDTH |
---|---|
Value |
* Float |
Constants |
* WIDTH_CONDENSED = 0.75, * WIDTH_SEMI_CONDENSED = 0.875, * WIDTH_REGULAR = 1.0, * WIDTH_SEMI_EXTENDED = 1.25, * WIDTH_EXTENDED = 1.5 |
Default |
* WIDTH_REGULAR |
Description |
* The value is roughly the ratio of the advance width * to that of the regular width. If the font has a different value for * specific constants, then the value is interpolated as described in * the class description. |
Fallback |
* If a Narrow font is available and matches, use that. * Otherwise scale with a transform based on the value. |
Key |
* POSTURE |
---|---|
Value |
* Float |
Constants |
* POSTURE_REGULAR = 0, * POSTURE_OBLIQUE = 0.20 |
Default |
* POSTURE_REGULAR |
Description |
* The value is interpreted generally as a skew slope,
* positive leans to the right. If the font has a different value for
* specific constants, then the value is interpolated as described in
* the class description. With fonts that have italic faces, not only
* the skew of the character changes, but also the letter shapes
* might change. * Notes: * To set the value by angle, use: * value = new Float(Math.tan(Math.PI*degrees/180.0) * To determine the angle from the value, use: * angle = Math.atan(value.floatValue())*180/Math.PI |
Fallback |
* If an Oblique font is available and matches, use that. * Otherwise skew with a transform using the posture value interpreted as * run/rise. |
Key |
* SIZE |
---|---|
Value |
* Float |
Default |
* from System Properties |
Description |
* Represents point size. Note that the appearance and * metrics of a 12pt font with a 2X transform might be different than * that of a 24 point font with no transform. |
Fallback |
* Scale to provided size. |
Key |
* TRANSFORM |
---|---|
Value |
* TransformAttribute |
Default |
* Identity transform |
Description |
* Used to transform glyphs rendered by this font. The * primary intent is to support scaling, skewing, and translation. In * general, large rotations do not produce very useful results. The * transform modifies both the glyph and the advance. The translations * in the transform are interpreted as a ratio of the point size. That * is, with a point size of 12, a translation of 0.5 results in a * movement of 6 points. * * The advance point of the transformed glyph is the transform of the * advance point projected onto the baseline. If the advance ends up * to the left (top) of the glyph origin, the two points are swapped. * * Example one: The point * size is 20, the original advance is 10.0, and the transform is a 60 * degree counterclockwise rotation plus an offset up and to the right * of 0.1, -0.1. The translation results in an offset of <2.0, -2.0>. * The original advance point is <10.0, 0.0>; after the rotation it * is <6.0, -8.0>; when adding the offset this becomes * <8.0,-10.0>, when projecting on the (horizontal) baseline this * becomes the new advance point: <8.0, 0.0>. The advance width is * the distance from the origin to the advance point: 8.0. The rotated * glyph is rendered two points up and to the right of its origin and * rotated. This does not affect the baseline for subsequent * glyphs. |
Key |
* SUPERSCRIPT |
---|---|
Value |
* Integer |
Constants |
* SUPERSCRIPT_NONE = 0, * SUPERSCRIPT_SUPER = 1, * SUPERSCRIPT_SUB = -1 |
Default |
* SUPERSCRIPT_NONE |
Description |
* Requests that the font display the characters with * glyphs at a particular superscript level: 0 = none, 1 = * superscript, 2 = superscript of superscript,...-1 * = subscript, -2 = subscript of subscript,... Requests that the font * display text using default superscript (or subscript) glyphs and/or * scaling. |
Fallback |
* Use transform with translation of +/-1/2 and scale
* of 2/3, progressively for each level. That is, for the transform at
* level N (with N != 0): * offset = sign(N)*1/2*(2/3)^(abs(N)-1) * scale = (2/3)^abs(N) |
Key |
* FONT |
---|---|
Value |
* Font |
Default |
* None, perform default resolution |
Description |
* A way for users to override the resolution of font
* attributes into a Font , or force use of a particular
* Font instance.
* This also allows users to specify subclasses of Font in
* cases where a Font can be subclassed. |
Key |
* CHAR_REPLACEMENT |
---|---|
Value |
* GraphicAttribute |
Description |
* Allows the user to specify an empty position plus
* metric information. This method is used to reserve space for a graphic
* or other embedded component. Required for
* correct BIDI position of 'inline' components within a line. An optional
* convenience method allows drawing for simple cases. Follows the
* Microsoft model: the character that this is applied to should be
* \uFFFC . |
Key |
* FOREGROUND |
---|---|
Value |
* Paint |
Default |
* Color.black |
Description |
* Specify the foreground Paint (or Color) of the text. |
Key |
* BACKGROUND |
---|---|
Value |
* Paint |
Default |
* null |
Description |
* Specify the background Paint (or Color) of the text. |
Key |
* UNDERLINE |
---|---|
Value |
* Integer |
Constants |
* UNDERLINE_ON = 0 |
Default |
* none |
Description |
* An embellishment added to the glyphs rendered by a * font. |
Fallback |
*
Key |
* STRIKETHROUGH |
---|---|
Value |
* Boolean |
Constants |
* true = on, false = off |
Default |
* off |
Description |
* An embellishment added to the glyphs rendered by a * font. |
Key |
* RUN_DIRECTION |
---|---|
Value |
* Boolean |
Constants |
* RUN_DIRECTION_LTR = true, RUN_DIRECTION_RTL = false * |
Default |
* Use the default Unicode base direction from the BIDI * algorithm. |
Description |
* Specifies which base run direction to use when
* positioning mixed directional runs within a paragraph. If this value is
* RUN_DIRECTION_DEFAULT, This attribute should have the same value over the whole * paragraph. |
Key |
* BIDI_EMBEDDING |
---|---|
Value |
* Integer |
Limits |
* Positive values 1 through 61 are embedding
* levels, negative values through -61 are override levels * |
Default |
* Use standard BIDI to compute levels from formatting * characters in the text. |
Description |
* Specifies the bidi embedding level of the character. * When this attribute is present anywhere in a paragraph, then the * Unicode characters RLO, LRO, RLE, LRE, PDF are disregarded in the BIDI * analysis of that paragraph. * See the Unicode Standard v. 2.0, section 3-11. * |
Key |
* JUSTIFICATION |
---|---|
Value |
* Float |
Limits |
* 0.0 through1.0 |
Default |
* 1.0 |
Description |
* Specifies which fraction of the extra space to use * when justification is requested. For example, if the line is 50 points * wide and the margins are 70 points apart, a value of 0.5 means that the * line is padded to reach a width of 60 points. *This attribute should have the same value over the whole * paragraph. |
Values are instances of * {@link java.awt.im.InputMethodHighlight InputMethodHighlight}. * These instances should be wrapped in * {@link java.text.Annotation Annotation} instances * if segments need to be highlighted separately. *
* Input method highlights are used while text is being composed * using an input method. Text editing components should retain them * even if they generally only deal with unstyled text, and make them * available to the drawing routines. * @see java.awt.im.InputMethodHighlight */ public static final TextAttribute INPUT_METHOD_HIGHLIGHT = new TextAttribute("input method highlight"); /** * Attribute key for input method underline adornments. * *
Key |
* INPUT_METHOD_UNDERLINE |
---|---|
Value |
* Integer |
Constants |
* UNDERLINE_LOW_ONE_PIXEL, UNDERLINE_LOW_TWO_PIXEL, * UNDERLINE_LOW_DOTTED, UNDERLINE_LOW_GRAY, UNDERLINE_LOW_DASHED |
Default |
* no underline |
Values are instances of Boolean
.
* The default is not to swap the foreground and background.
* If the foreground and background attributes are both defined,
* this causes them to be swapped when rendering text. If either is
* defaulted, the exact effect is undefined--generally it will produce
* an 'inverted' appearance.
*/
public static final TextAttribute SWAP_COLORS = new TextAttribute("swap_colors");
/** Swap foreground and background. */
public static final Boolean SWAP_COLORS_ON = new Boolean(true);
/**
* Attribute key for converting ASCII decimal digits to other decimal ranges.
*
*
Values are instances of NumericShaping
.
* The default is not to perform numeric shaping.
*/
public static final TextAttribute NUMERIC_SHAPING = new TextAttribute("numeric_shaping");
}