/* * Copyright (c) 1998, 2003, 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 IBM Corp. 1998-2003 All Rights Reserved */ package sun.font; import java.awt.Font; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.text.Bidi; /** * A factory for text labels. Basically this just holds onto the stuff that * doesn't change-- the render context, context, and bidi info for the context-- and gets * called for each subrange you want to create. * * @see Font * @see FontRenderContext * @see GlyphVector * @see TextLabel * @see ExtendedTextLabel * @see Bidi * @see TextLayout */ public class TextLabelFactory { private FontRenderContext frc; private char[] text; private Bidi bidi; private Bidi lineBidi; private int flags; private int lineStart; private int lineLimit; /** * Initialize a factory to produce glyph arrays. * @param frc the FontRenderContext to use for the arrays to be produced. * @param text the text of the paragraph. * @param bidi the bidi information for the paragraph text, or null if the * entire text is left-to-right text. */ public TextLabelFactory(FontRenderContext frc, char[] text, Bidi bidi, int flags) { this.frc = frc; this.text = text; this.bidi = bidi; this.flags = flags; this.lineBidi = bidi; this.lineStart = 0; this.lineLimit = text.length; } public FontRenderContext getFontRenderContext() { return frc; } public char[] getText() { return text; } public Bidi getParagraphBidi() { return bidi; } public Bidi getLineBidi() { return lineBidi; } public int getLayoutFlags() { return flags; } public int getLineStart() { return lineStart; } public int getLineLimit() { return lineLimit; } /** * Set a line context for the factory. Shaping only occurs on this line. * Characters are ordered as they would appear on this line. * @param lineStart the index within the text of the start of the line. * @param lineLimit the index within the text of the limit of the line. */ public void setLineContext(int lineStart, int lineLimit) { this.lineStart = lineStart; this.lineLimit = lineLimit; if (bidi != null) { lineBidi = bidi.createLineBidi(lineStart, lineLimit); } } /** * Create an extended glyph array for the text between start and limit. * * @param font the font to use to generate glyphs and character positions. * @param start the start of the subrange for which to create the glyph array * @param limit the limit of the subrange for which to create glyph array * * Start and limit must be within the bounds of the current line. If no * line context has been set, the entire text is used as the current line. * The text between start and limit will be treated as though it all has * the same bidi level (and thus the same directionality) as the character * at start. Clients should ensure that all text between start and limit * has the same bidi level for the current line. */ public ExtendedTextLabel createExtended(Font font, CoreMetrics lm, Decoration decorator, int start, int limit) { if (start >= limit || start < lineStart || limit > lineLimit) { throw new IllegalArgumentException("bad start: " + start + " or limit: " + limit); } int level = lineBidi == null ? 0 : lineBidi.getLevelAt(start - lineStart); int linedir = (lineBidi == null || lineBidi.baseIsLeftToRight()) ? 0 : 1; int layoutFlags = flags & ~0x9; // remove bidi, line direction flags if ((level & 0x1) != 0) layoutFlags |= 1; // rtl if ((linedir & 0x1) != 0) layoutFlags |= 8; // line rtl TextSource source = new StandardTextSource(text, start, limit - start, lineStart, lineLimit - lineStart, level, layoutFlags, font, frc, lm); return new ExtendedTextSourceLabel(source, decorator); } /** * Create a simple glyph array for the text between start and limit. * * @param font the font to use to generate glyphs and character positions. * @param start the start of the subrange for which to create the glyph array * @param limit the limit of the subrange for which to create glyph array */ public TextLabel createSimple(Font font, CoreMetrics lm, int start, int limit) { if (start >= limit || start < lineStart || limit > lineLimit) { throw new IllegalArgumentException("bad start: " + start + " or limit: " + limit); } int level = lineBidi == null ? 0 : lineBidi.getLevelAt(start - lineStart); int linedir = (lineBidi == null || lineBidi.baseIsLeftToRight()) ? 0 : 1; int layoutFlags = flags & ~0x9; // remove bidi, line direction flags if ((level & 0x1) != 0) layoutFlags |= 1; // rtl if ((linedir & 0x1) != 0) layoutFlags |= 8; // line rtl TextSource source = new StandardTextSource(text, start, limit - start, lineStart, lineLimit - lineStart, level, layoutFlags, font, frc, lm); return new TextSourceLabel(source); } }