19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  this work for additional information regarding copyright ownership.
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  the License.  You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *  limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Ilya S. Okomin
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.font;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.Graphics2D;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.Rectangle2D;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The GraphicAttribute abstract class provides an opportunity to insert
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * graphical elements in printed text.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class GraphicAttribute {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant TOP_ALIGNMENT indicates using the top line to calculate
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * placement of graphics.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int TOP_ALIGNMENT = -1;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant BOTTOM_ALIGNMENT indicates using the bottom line to
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calculate placement of graphics.
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int BOTTOM_ALIGNMENT = -2;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant ROMAN_BASELINE indicates the placement of the roman baseline
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with respect to the graphics origin.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ROMAN_BASELINE = 0;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant CENTER_BASELINE indicates the placement of the center
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * baseline with respect to the graphics origin.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int CENTER_BASELINE = 1;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The Constant HANGING_BASELINE indicates the placement of the hanging
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * baseline with respect to the graphics origin.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HANGING_BASELINE = 2;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the alignment of this GraphicAttribute
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The alignment.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int alignment;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Instantiates a new graphic attribute with the specified alignment.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param align
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the specified alignment.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected GraphicAttribute(int align) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((align < BOTTOM_ALIGNMENT) || (align > HANGING_BASELINE)) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // awt.198=Illegal alignment argument
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException(Messages.getString("awt.198")); //$NON-NLS-1$
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.alignment = align;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Draws the GraphicAttribute at the specified location.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param graphics
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the Graphics.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the X coordinate of GraphicAttribute location.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            the Y coordinate of GraphicAttribute location.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract void draw(Graphics2D graphics, float x, float y);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the GraphicAttribute's advance. It's the distance from the point at
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * which the graphic is rendered and the point where the next character or
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * graphic is rendered.
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the GraphicAttribute's advance.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract float getAdvance();
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the alignment of this GraphicAttribute.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the alignment of this GraphicAttribute.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAlignment() {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this.alignment;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the ascent of this GraphicAttribute.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the ascent of this GraphicAttribute.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract float getAscent();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the bounds of this GraphicAttribute.
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the bounds of this GraphicAttribute.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Rectangle2D getBounds() {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float ascent = getAscent();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float advance = getAdvance();
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float descent = getDescent();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Default implementation - see API documentation.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new Rectangle2D.Float(0, -ascent, advance, ascent + descent);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the descent of this GraphicAttribute.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the descent of this GraphicAttribute.
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public abstract float getDescent();
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the GlyphJustificationInfo of this GraphicAttribute.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the GlyphJustificationInfo of this GraphicAttribute.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public GlyphJustificationInfo getJustificationInfo() {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Default implementation. Since documentation doesn't describe default
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * values, they were calculated based on 1.5 release behavior and can be
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * obtained using next test sample: // Create GraphicAttribute class
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * implementation public class MyGraphicAttribute extends
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * GraphicAttribute { protected MyGraphicAttribute(int align) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * super(align); } public float getDescent() { return 0; } public float
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * getAdvance() { return 1; } public void draw(Graphics2D g2, float x,
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * float y) { } public float getAscent() { return 0; } }
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * MyGraphicAttribute myGA = gat.new MyGraphicAttribute(0); // print
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * justification parameters
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().growAbsorb);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().shrinkAbsorb);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().growLeftLimit);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().growPriority);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().growRightLimit);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().shrinkLeftLimit);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().shrinkPriority);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().shrinkRightLimit);
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * System.out.println(myGA.getJustificationInfo().weight);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float advance = getAdvance();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new GlyphJustificationInfo(advance, false,
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GlyphJustificationInfo.PRIORITY_INTERCHAR, advance / 3, advance / 3, false,
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                GlyphJustificationInfo.PRIORITY_WHITESPACE, 0, 0);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
180