/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * @author Oleg V. Khaschansky * @version $Revision$ */ package org.apache.harmony.awt.gl.font; import java.awt.Graphics2D; import java.awt.Shape; import java.awt.font.TextHitInfo; import java.awt.geom.Rectangle2D; /** * Abstract class which represents the segment of the text with constant attributes * running in one direction (i.e. constant level). */ public abstract class TextRunSegment implements Cloneable { float x; // Calculated x location of this segment on the screen float y; // Calculated y location of this segment on the screen BasicMetrics metrics; // Metrics of this text run segment TextDecorator.Decoration decoration; // Underline, srikethrough, etc. Rectangle2D logicalBounds = null; // Logical bounding box for the segment Rectangle2D visualBounds = null; // Visual bounding box for the segment /** * Returns start index of the segment * @return start index */ abstract int getStart(); /** * Returns end index of the segment * @return end index */ abstract int getEnd(); /** * Returns the number of characters in the segment * @return number of characters */ abstract int getLength(); /** * Renders this text run segment * @param g2d - graphics to render to * @param xOffset - X offset from the graphics origin to the * origin of the text layout * @param yOffset - Y offset from the graphics origin to the * origin of the text layout */ abstract void draw(Graphics2D g2d, float xOffset, float yOffset); /** * Creates black box bounds shape for the specified range * @param start - range sart * @param limit - range end * @return black box bounds shape */ abstract Shape getCharsBlackBoxBounds(int start, int limit); /** * Returns the outline shape * @return outline */ abstract Shape getOutline(); /** * Returns visual bounds of this segment * @return visual bounds */ abstract Rectangle2D getVisualBounds(); /** * Returns logical bounds of this segment * @return logical bounds */ abstract Rectangle2D getLogicalBounds(); /** * Calculates advance of the segment * @return advance */ abstract float getAdvance(); /** * Calculates advance delta between two characters * @param start - 1st position * @param end - 2nd position * @return advance increment between specified positions */ abstract float getAdvanceDelta(int start, int end); /** * Calculates index of the character which advance is equal to * the given. If the given advance is greater then the segment * advance it returns the position after the last character. * @param advance - given advance * @param start - character, from which to start measuring advance * @return character index */ abstract int getCharIndexFromAdvance(float advance, int start); /** * Checks if the character doesn't contribute to the text advance * @param index - character index * @return true if the character has zero advance */ abstract boolean charHasZeroAdvance(int index); /** * Calculates position of the character on the screen * @param index - character index * @return X coordinate of the character position */ abstract float getCharPosition(int index); /** * Returns the advance of the individual character * @param index - character index * @return character advance */ abstract float getCharAdvance(int index); /** * Creates text hit info from the hit position * @param x - X coordinate relative to the origin of the layout * @param y - Y coordinate relative to the origin of the layout * @return hit info */ abstract TextHitInfo hitTest(float x, float y); /** * Collects justification information into JustificationInfo object * @param jInfo - JustificationInfo object */ abstract void updateJustificationInfo(TextRunBreaker.JustificationInfo jInfo); /** * Performs justification of the segment. * Updates positions of individual characters. * @param jInfos - justification information, gathered by the previous passes * @return amount of growth or shrink of the segment */ abstract float doJustification(TextRunBreaker.JustificationInfo jInfos[]); @Override public abstract Object clone(); }