java.awt.font.TextAttribute Maven / Gradle / Ivy
/*
NOTICE
(c) 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
Neither this file nor any files generated from it describe a complete
specification, and they may only be used as described below. For
example, no permission is given for you to incorporate this file, in
whole or in part, in an implementation of a Java specification.
Sun Microsystems Inc. owns the copyright in this file and it is provided
to you for informative, as opposed to normative, use. The file and any
files generated from it may be used to generate other informative
documentation, such as a unified set of documents of API signatures for
a platform that includes technologies expressed as Java APIs. The file
may also be used to produce "compilation stubs," which allow
applications to be compiled and validated for such platforms.
Any work generated from this file, such as unified javadocs or compiled
stub files, must be accompanied by this notice in its entirety.
This work corresponds to the API signatures of JSR 217: Personal Basis
Profile 1.1. In the event of a discrepency between this work and the
JSR 217 specification, which is available at
http://www.jcp.org/en/jsr/detail?id=217, the latter takes precedence.
*/
/*
* (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:
*
* - the type of their values,
*
- the valid values if there are limitations
*
- relevant constants
*
- the default effect if the attribute is absent (or has a
*
null
value).
* - a description of the effect.
*
- the fallback behavior if the exact attribute requested is not
* available.
*
*
*
Types of Values
*
* - The values of attributes must always be immutable.
*
- Where a list of limitations is given, any value outside of that
* set is reserved for future use, and ignored at present.
*
- If the value is
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);
*
*
*
*
Interpolation
*
* - Fonts should interpolate values in certain circumstances. For example,
* when the WEIGHT value is 2.13. If the nearest surrounding values
* in the font are WEIGHT_BOLD = 2.0 and WEIGHT_HEAVY = 2.25 then font would
* then interpret the WEIGHT request as being 52% of the way between what
* it considers BOLD and what it considers HEAVY. If the nearest surrounding
* values are WEIGHT_SEMIBOLD = 1.25 and WEIGHT_ULTRABOLD = 2.75 then the
* WEIGHT request is interpreted as being 58.67% of the way between SEMIBOLD
* and ULTRABOLD.
*
- Where a font does not have enough capability to handle a given
* request, such as superscript, then it should simulate it to the best of
* its ability. To determine if simulation is being performed, the client
* should query the font to see what actual attributes were used.
*
*
* @see java.text.AttributedCharacterIterator
* @see java.awt.Font
*/
public final class TextAttribute extends Attribute {
// PBP/PP 6225607
// table of all instances in this class, used by readResolve
private static final Map instanceMap = new HashMap(29);
/**
* Constructs a TextAttribute
with the specified name.
* @param name the attribute name to assign to this
* TextAttribute
*/
// protected TextAttribute(String name) {
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.
*
*/
public static final TextAttribute FAMILY = new TextAttribute("family");
/**
* Attribute key for the weight of a font.
*
*
*
* 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.
*
*
*/
public static final TextAttribute WEIGHT = new TextAttribute("weight");
/**
* The lightest predefined weight.
* @see #WEIGHT
*/
public static final Float WEIGHT_EXTRA_LIGHT = new Float(0.5f);
/**
* The standard light weight.
* @see #WEIGHT
*/
public static final Float WEIGHT_LIGHT = new Float(0.75f);
/**
* An intermediate weight between LIGHT and STANDARD.
* @see #WEIGHT
*/
public static final Float WEIGHT_DEMILIGHT = new Float(0.875f);
/**
* The standard weight. This weight is used if WEIGHT is unspecified.
* @see #WEIGHT
*/
public static final Float WEIGHT_REGULAR = new Float(1.0f);
/**
* A moderately heavier weight than REGULAR.
* @see #WEIGHT
*/
public static final Float WEIGHT_SEMIBOLD = new Float(1.25f);
/**
* An intermediate weight between the REGULAR and BOLD weights.
* @see #WEIGHT
*/
public static final Float WEIGHT_MEDIUM = new Float(1.5f);
/**
* A moderately lighter weight than BOLD.
* @see #WEIGHT
*/
public static final Float WEIGHT_DEMIBOLD = new Float(1.75f);
/**
* The standard bold weight.
* @see #WEIGHT
*/
public static final Float WEIGHT_BOLD = new Float(2.0f);
/**
* A moderately heavier weight than BOLD.
* @see #WEIGHT
*/
public static final Float WEIGHT_HEAVY = new Float(2.25f);
/**
* An extra heavy weight.
* @see #WEIGHT
*/
public static final Float WEIGHT_EXTRABOLD = new Float(2.5f);
/**
* The heaviest predefined weight.
* @see #WEIGHT
*/
public static final Float WEIGHT_ULTRABOLD = new Float(2.75f);
/**
* Attribute key for the width of a font.
*
*
*
* 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.
*
*/
// public static final TextAttribute WIDTH = new TextAttribute("width");
/**
* The most condensed predefined width.
* @see #WIDTH
*/
// public static final Float WIDTH_CONDENSED = new Float(0.75f);
/**
* A moderately condensed width.
* @see #WIDTH
*/
// public static final Float WIDTH_SEMI_CONDENSED = new Float(0.875f);
/**
* The standard width. This width is used if WIDTH is unspecified.
* @see #WIDTH
*/
// public static final Float WIDTH_REGULAR = new Float(1.0f);
/**
* A moderately extended width.
* @see #WIDTH
*/
// public static final Float WIDTH_SEMI_EXTENDED = new Float(1.25f);
/**
* The most extended predefined width.
* @see #WIDTH
*/
// public static final Float WIDTH_EXTENDED = new Float(1.5f);
// PBP/PP 6217607
/**
* Attribute key for the posture of a font.
*
*
*
* 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.
*
*
*
*
*/
public static final TextAttribute POSTURE = new TextAttribute("posture");
/**
* The standard posture, upright.
* @see #POSTURE
*/
public static final Float POSTURE_REGULAR = new Float(0.0f);
/**
* The standard italic posture.
* @see #POSTURE
*/
public static final Float POSTURE_OBLIQUE = new Float(0.20f);
/**
* Attribute key for the font size.
*
*
*
* Key
* SIZE
*
* Value
* Float
*
* Default
* from System Properties
*
* Description
* Represents point size.
*
* Fallback
* Currently None
*
*/
public static final TextAttribute SIZE = new TextAttribute("size");
/**
* Attribute key for the transform of a font.
*
*
*
* 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.
*
*/
// public static final TextAttribute TRANSFORM = new TextAttribute("transform");
/**
* Attribute key for super and subscripting.
*
*
*
* 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)
*
*/
// public static final TextAttribute SUPERSCRIPT = new TextAttribute("superscript");
/**
* Standard superscript.
* @see #SUPERSCRIPT
*/
// public static final Integer SUPERSCRIPT_SUPER = new Integer(1);
/**
* Standard subscript.
* @see #SUPERSCRIPT
*/
// public static final Integer SUPERSCRIPT_SUB = new Integer(-1);
/**
* Attribute key for the font to use to render text.
*
*
* 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.
*
*/
public static final TextAttribute FONT = new TextAttribute("font");
/**
* Attribute key for a user_defined glyph to display in the text in lieu
* of a character.
*
*
* 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.
*
*/
// public static final TextAttribute CHAR_REPLACEMENT = new TextAttribute("char_replacement");
//
// Adornments added to text.
//
// PBP/PP
// [6187236]
/**
* Attribute key for the foreground color
* adornment.
*
*
*
* Key
* FOREGROUND
*
* Value
* Color
*
* Default
* Color.black
*
* Description
* Specify the foreground Color of the text.
*
*/
public static final TextAttribute FOREGROUND = new TextAttribute("foreground");
/**
* Attribute key for the background Paint adornment.
*
*
*
* Key
* BACKGROUND
*
* Value
* Paint
*
* Default
* null
*
* Description
* Specify the background Paint (or Color) of the text.
*
*/
// public static final TextAttribute BACKGROUND = new TextAttribute("background");
/**
* Attribute key for underline adornments.
*
*
*
* Key
* UNDERLINE
*
* Value
* Integer
*
* Constants
* UNDERLINE_ON = 0
*
* Default
* none
*
* Description
* An embellishment added to the glyphs rendered by a
* font.
*
* Fallback
*
*
*/
public static final TextAttribute UNDERLINE = new TextAttribute("underline");
/**
* Standard underline at the roman baseline for roman text, and below
* the decenders for other text.
*
* @see #UNDERLINE
*/
public static final Integer UNDERLINE_ON = new Integer((byte)0);
/**
* Attribute key for the strikethrough adornment.
*
*
*
* Key
* STRIKETHROUGH
*
* Value
* Boolean
*
* Constants
* true = on, false = off
*
* Default
* off
*
* Description
* An embellishment added to the glyphs rendered by a
* font.
*
*/
public static final TextAttribute STRIKETHROUGH = new TextAttribute("strikethrough");
/**
* A single strikethrough.
*
* @see #STRIKETHROUGH
*/
public static final Boolean STRIKETHROUGH_ON = new Boolean(true);
//
// Attributes use to control layout of text on a line.
//
/**
* Attribute key for the run direction of the line.
*
*
*
* 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, TextLayout
uses the default Unicode
* base direction from the BIDI algorithm.
* This attribute should have the same value over the whole
* paragraph.
*
*/
// public static final TextAttribute RUN_DIRECTION = new TextAttribute("run_direction");
/**
* Left-to-right run direction.
* @see #RUN_DIRECTION
*/
// public static final Boolean RUN_DIRECTION_LTR = new Boolean(false);
/**
* Right-to-left run direction.
* @see #RUN_DIRECTION
*/
// public static final Boolean RUN_DIRECTION_RTL = new Boolean(true);
/**
* Attribute key for the embedding level for nested bidirectional runs.
*
*
*
* 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.
*
*
*/
// public static final TextAttribute BIDI_EMBEDDING = new TextAttribute("bidi_embedding");
/**
* Attribute key for the justification of a paragraph.
*
*
*
* 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.
*
*/
// public static final TextAttribute JUSTIFICATION = new TextAttribute("justification");
/**
* Justify the line to the full requested width.
* @see #JUSTIFICATION
*/
// public static final Float JUSTIFICATION_FULL = new Float(1.0f);
/**
* Do not allow the line to be justified.
* @see #JUSTIFICATION
*/
// public static final Float JUSTIFICATION_NONE = new Float(0.0f);
//
// For use by input method.
//
/**
* Attribute key for input method highlight styles.
* 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
*
* @since 1.3
*/
// public static final TextAttribute INPUT_METHOD_UNDERLINE
// = new TextAttribute("input method underline");
/**
* Single pixel solid low underline.
* @see #INPUT_METHOD_UNDERLINE
* @since 1.3
*/
// public static final Integer UNDERLINE_LOW_ONE_PIXEL = new Integer(1);
/**
* Double pixel solid low underline.
* @see #INPUT_METHOD_UNDERLINE
* @since 1.3
*/
// public static final Integer UNDERLINE_LOW_TWO_PIXEL = new Integer(2);
/**
* Single pixel dotted low underline.
* @see #INPUT_METHOD_UNDERLINE
* @since 1.3
*/
// public static final Integer UNDERLINE_LOW_DOTTED = new Integer(3);
/**
* Double pixel gray low underline.
* @see #INPUT_METHOD_UNDERLINE
* @since 1.3
*/
// public static final Integer UNDERLINE_LOW_GRAY = new Integer(4);
/**
* Single pixel dashed low underline.
* @see #INPUT_METHOD_UNDERLINE
* @since 1.3
*/
// public static final Integer UNDERLINE_LOW_DASHED = new Integer(5);
/**
* Attribute key for swapping foreground and background Paints (or Colors).
*
* 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");
}