/* |
|
* 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. |
|
* <p> |
|
* The <code>GraphicAttribute</code> 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</code> that |
|
* is used in a {@link TextLayout} results in undefined behavior from the |
|
* <code>TextLayout</code>. |
|
*/ |
|
public abstract class GraphicAttribute { |
|
private int fAlignment; |
|
/** |
|
* Aligns top of graphic to top of line. |
|
*/ |
|
public static final int TOP_ALIGNMENT = -1; |
|
/** |
|
* Aligns bottom of graphic to bottom of line. |
|
*/ |
|
public static final int BOTTOM_ALIGNMENT = -2; |
|
/** |
|
* 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. |
|
*/ |
|
public static final int CENTER_BASELINE = Font.CENTER_BASELINE; |
|
/** |
|
* Aligns origin of graphic to hanging baseline of line. |
|
*/ |
|
public static final int HANGING_BASELINE = Font.HANGING_BASELINE; |
|
/** |
|
* Constructs a <code>GraphicAttribute</code>. |
|
* Subclasses use this to define the alignment of the graphic. |
|
* @param alignment an int representing one of the |
|
* <code>GraphicAttribute</code> 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 <code>GraphicAttribute</code>. A |
|
* graphic can be rendered above its ascent. |
|
* @return the ascent of this <code>GraphicAttribute</code>. |
|
* @see #getBounds() |
|
*/ |
|
public abstract float getAscent(); |
|
/** |
|
* Returns the descent of this <code>GraphicAttribute</code>. A |
|
* graphic can be rendered below its descent. |
|
* @return the descent of this <code>GraphicAttribute</code>. |
|
* @see #getBounds() |
|
*/ |
|
public abstract float getDescent(); |
|
/** |
|
* Returns the advance of this <code>GraphicAttribute</code>. The |
|
* <code>GraphicAttribute</code> 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</code>. |
|
* @see #getBounds() |
|
*/ |
|
public abstract float getAdvance(); |
|
/** |
|
* Returns a {@link Rectangle2D} that encloses all of the |
|
* bits drawn by this <code>GraphicAttribute</code> 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</code> that encloses all of the bits |
|
* rendered by this <code>GraphicAttribute</code>. |
|
*/ |
|
public Rectangle2D getBounds() { |
|
float ascent = getAscent(); |
|
return new Rectangle2D.Float(0, -ascent, |
|
getAdvance(), ascent+getDescent()); |
|
} |
|
/** |
|
* Return a {@link java.awt.Shape} that represents the region that |
|
* this <code>GraphicAttribute</code> 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</code>. |
|
* 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</code>. This can be null. |
|
* @return a <code>Shape</code> 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 <code>GraphicAttribute</code> 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 <code>GraphicAttribute</code>. |
|
* Alignment can be to a particular baseline, or to the absolute top |
|
* or bottom of a line. |
|
* @return the alignment of this <code>GraphicAttribute</code>. |
|
*/ |
|
public final int getAlignment() { |
|
return fAlignment; |
|
} |
|
/** |
|
* Returns the justification information for this |
|
* <code>GraphicAttribute</code>. Subclasses |
|
* can override this method to provide different justification |
|
* information. |
|
* @return a {@link GlyphJustificationInfo} object that contains the |
|
* justification information for this <code>GraphicAttribute</code>. |
|
*/ |
|
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 |
|
} |
|
} |