| /* |
| * Copyright (c) 1998, 2015, 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.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 final class TextLabelFactory { |
| private final FontRenderContext frc; |
| private final char[] text; |
| private final Bidi bidi; |
| private Bidi lineBidi; |
| private final 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.clone(); |
| this.bidi = bidi; |
| this.flags = flags; |
| this.lineBidi = bidi; |
| this.lineStart = 0; |
| this.lineLimit = text.length; |
| } |
| |
| public FontRenderContext getFontRenderContext() { |
| return frc; |
| } |
| |
| public Bidi getLineBidi() { |
| return lineBidi; |
| } |
| |
| /** |
| * 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); |
| } |
| } |