/*
 * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * (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.awt.Graphics2D;
import java.awt.Font;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

This class is used with the CHAR_REPLACEMENT attribute.

The GraphicAttribute class represents a graphic embedded in text. Clients subclass this class to implement their own char replacement graphics. Clients wishing to embed shapes and images in text need not subclass this class. Instead, clients can use the ShapeGraphicAttribute and ImageGraphicAttribute classes.

Subclasses must ensure that their objects are immutable once they are constructed. Mutating a GraphicAttribute that is used in a TextLayout results in undefined behavior from the TextLayout.

/** * This class is used with the CHAR_REPLACEMENT attribute. * <p> * The {@code GraphicAttribute} class represents a graphic embedded * in text. Clients subclass this class to implement their own char * replacement graphics. Clients wishing to embed shapes and images in * text need not subclass this class. Instead, clients can use the * {@link ShapeGraphicAttribute} and {@link ImageGraphicAttribute} * classes. * <p> * Subclasses must ensure that their objects are immutable once they * are constructed. Mutating a {@code GraphicAttribute} that * is used in a {@link TextLayout} results in undefined behavior from the * {@code TextLayout}. */
public abstract class GraphicAttribute { private int fAlignment;
Aligns top of graphic to top of line.
/** * Aligns top of graphic to top of line. */
public static final int TOP_ALIGNMENT = -1;
Aligns bottom of graphic to bottom of line.
/** * Aligns bottom of graphic to bottom of line. */
public static final int BOTTOM_ALIGNMENT = -2;
Aligns origin of graphic to roman baseline of line.
/** * Aligns origin of graphic to roman baseline of line. */
public static final int ROMAN_BASELINE = Font.ROMAN_BASELINE;
Aligns origin of graphic to center baseline of line.
/** * Aligns origin of graphic to center baseline of line. */
public static final int CENTER_BASELINE = Font.CENTER_BASELINE;
Aligns origin of graphic to hanging baseline of line.
/** * Aligns origin of graphic to hanging baseline of line. */
public static final int HANGING_BASELINE = Font.HANGING_BASELINE;
Constructs a GraphicAttribute. Subclasses use this to define the alignment of the graphic.
Params:
  • alignment – an int representing one of the GraphicAttribute alignment fields
Throws:
/** * Constructs a {@code GraphicAttribute}. * Subclasses use this to define the alignment of the graphic. * @param alignment an int representing one of the * {@code GraphicAttribute} alignment fields * @throws IllegalArgumentException if alignment is not one of the * five defined values. */
protected GraphicAttribute(int alignment) { if (alignment < BOTTOM_ALIGNMENT || alignment > HANGING_BASELINE) { throw new IllegalArgumentException("bad alignment"); } fAlignment = alignment; }
Returns the ascent of this GraphicAttribute. A graphic can be rendered above its ascent.
See Also:
Returns:the ascent of this GraphicAttribute.
/** * Returns the ascent of this {@code GraphicAttribute}. A * graphic can be rendered above its ascent. * @return the ascent of this {@code GraphicAttribute}. * @see #getBounds() */
public abstract float getAscent();
Returns the descent of this GraphicAttribute. A graphic can be rendered below its descent.
See Also:
Returns:the descent of this GraphicAttribute.
/** * Returns the descent of this {@code GraphicAttribute}. A * graphic can be rendered below its descent. * @return the descent of this {@code GraphicAttribute}. * @see #getBounds() */
public abstract float getDescent();
Returns the advance of this GraphicAttribute. The GraphicAttribute object's advance is the distance from the point at which the graphic is rendered and the point where the next character or graphic is rendered. A graphic can be rendered beyond its advance
See Also:
Returns:the advance of this GraphicAttribute.
/** * Returns the advance of this {@code GraphicAttribute}. The * {@code GraphicAttribute} object's advance is the distance * from the point at which the graphic is rendered and the point where * the next character or graphic is rendered. A graphic can be * rendered beyond its advance * @return the advance of this {@code GraphicAttribute}. * @see #getBounds() */
public abstract float getAdvance();
Returns a Rectangle2D that encloses all of the bits drawn by this GraphicAttribute relative to the rendering position. A graphic may be rendered beyond its origin, ascent, descent, or advance; but if it is, this method's implementation must indicate where the graphic is rendered. Default bounds is the rectangle (0, -ascent, advance, ascent+descent).
Returns:a Rectangle2D that encloses all of the bits rendered by this GraphicAttribute.
/** * Returns a {@link Rectangle2D} that encloses all of the * bits drawn by this {@code GraphicAttribute} relative to the * rendering position. * A graphic may be rendered beyond its origin, ascent, descent, * or advance; but if it is, this method's implementation must * indicate where the graphic is rendered. * Default bounds is the rectangle (0, -ascent, advance, ascent+descent). * @return a {@code Rectangle2D} that encloses all of the bits * rendered by this {@code GraphicAttribute}. */
public Rectangle2D getBounds() { float ascent = getAscent(); return new Rectangle2D.Float(0, -ascent, getAdvance(), ascent+getDescent()); }
Return a Shape that represents the region that this GraphicAttribute renders. This is used when a TextLayout is requested to return the outline of the text. The (untransformed) shape must not extend outside the rectangular bounds returned by getBounds. The default implementation returns the rectangle returned by getBounds, transformed by the provided AffineTransform if present.
Params:
  • tx – an optional AffineTransform to apply to the outline of this GraphicAttribute. This can be null.
Returns:a Shape representing this graphic attribute, suitable for stroking or filling.
Since:1.6
/** * Return a {@link java.awt.Shape} that represents the region that * this {@code GraphicAttribute} renders. This is used when a * {@link TextLayout} is requested to return the outline of the text. * The (untransformed) shape must not extend outside the rectangular * bounds returned by {@code getBounds}. * The default implementation returns the rectangle returned by * {@link #getBounds}, transformed by the provided {@link AffineTransform} * if present. * @param tx an optional {@link AffineTransform} to apply to the * outline of this {@code GraphicAttribute}. This can be null. * @return a {@code Shape} representing this graphic attribute, * suitable for stroking or filling. * @since 1.6 */
public Shape getOutline(AffineTransform tx) { Shape b = getBounds(); if (tx != null) { b = tx.createTransformedShape(b); } return b; }
Renders this GraphicAttribute at the specified location.
Params:
  • graphics – the Graphics2D into which to render the graphic
  • x – the user-space X coordinate where the graphic is rendered
  • y – the user-space Y coordinate where the graphic is rendered
/** * Renders this {@code GraphicAttribute} at the specified * location. * @param graphics the {@link Graphics2D} into which to render the * graphic * @param x the user-space X coordinate where the graphic is rendered * @param y the user-space Y coordinate where the graphic is rendered */
public abstract void draw(Graphics2D graphics, float x, float y);
Returns the alignment of this GraphicAttribute. Alignment can be to a particular baseline, or to the absolute top or bottom of a line.
Returns:the alignment of this GraphicAttribute.
/** * Returns the alignment of this {@code GraphicAttribute}. * Alignment can be to a particular baseline, or to the absolute top * or bottom of a line. * @return the alignment of this {@code GraphicAttribute}. */
public final int getAlignment() { return fAlignment; }
Returns the justification information for this GraphicAttribute. Subclasses can override this method to provide different justification information.
Returns:a GlyphJustificationInfo object that contains the justification information for this GraphicAttribute.
/** * Returns the justification information for this * {@code GraphicAttribute}. Subclasses * can override this method to provide different justification * information. * @return a {@link GlyphJustificationInfo} object that contains the * justification information for this {@code GraphicAttribute}. */
public GlyphJustificationInfo getJustificationInfo() { // should we cache this? float advance = getAdvance(); return new GlyphJustificationInfo( advance, // weight false, // growAbsorb 2, // growPriority advance/3, // growLeftLimit advance/3, // growRightLimit false, // shrinkAbsorb 1, // shrinkPriority 0, // shrinkLeftLimit 0); // shrinkRightLimit } }