253 lines · 7.5 KB · Java
RawDownload
/* * 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; public class StandardTextSource extends TextSource {  char[] chars;  int start;  int len;  int cstart;  int clen;  int level; // assumed all uniform  int flags; // see GlyphVector.java  Font font;  FontRenderContext frc;  CoreMetrics cm;   /**   * Create a simple implementation of a TextSource.   *   * Chars is an array containing clen chars in the context, in   * logical order, contiguously starting at cstart.  Start and len   * represent that portion of the context representing the true   * source; start, like cstart, is relative to the start of the   * character array.   *   * Level is the bidi level (0-63 for the entire context. Flags is   * the layout flags. Font is the font, frc is the render context,   * and lm is the line metrics for the entire source text, but not   * necessarily the context.   */  public StandardTextSource(char[] chars,                            int start,                            int len,                            int cstart,                            int clen,                            int level,                            int flags,                            Font font,                            FontRenderContext frc,                            CoreMetrics cm) {    if (chars == null) {      throw new IllegalArgumentException("bad chars: null");    }    if (cstart < 0) {      throw new IllegalArgumentException("bad cstart: " + cstart);    }    if (start < cstart) {      throw new IllegalArgumentException("bad start: " + start + " for cstart: " + cstart);    }    if (clen < 0) {      throw new IllegalArgumentException("bad clen: " + clen);    }    if (cstart + clen > chars.length) {      throw new IllegalArgumentException("bad clen: " + clen + " cstart: " + cstart + " for array len: " + chars.length);    }    if (len < 0) {      throw new IllegalArgumentException("bad len: " + len);    }    if ((start + len) > (cstart + clen)) {      throw new IllegalArgumentException("bad len: " + len + " start: " + start + " for cstart: " + cstart + " clen: " + clen);    }    if (font == null) {      throw new IllegalArgumentException("bad font: null");    }    if (frc == null) {      throw new IllegalArgumentException("bad frc: null");    }     this.chars = chars;    this.start = start;    this.len = len;    this.cstart = cstart;    this.clen = clen;    this.level = level;    this.flags = flags;    this.font = font;    this.frc = frc;     if (cm != null) {        this.cm = cm;    } else {        LineMetrics metrics = font.getLineMetrics(chars, cstart, clen, frc);        this.cm = ((FontLineMetrics)metrics).cm;    }  }   /** Create a StandardTextSource whose context is coextensive with the source. */  public StandardTextSource(char[] chars,                            int start,                            int len,                            int level,                            int flags,                            Font font,                            FontRenderContext frc,                            CoreMetrics cm) {    this(chars, start, len, start, len, level, flags, font, frc, cm);  }   /** Create a StandardTextSource whose context and source are coextensive with the entire char array. */  public StandardTextSource(char[] chars,                            int level,                            int flags,                            Font font,                            FontRenderContext frc) {    this(chars, 0, chars.length, 0, chars.length, level, flags, font, frc, null);  }   /** Create a StandardTextSource whose context and source are all the text in the String. */  public StandardTextSource(String str,                            int level,                            int flags,                            Font font,                            FontRenderContext frc) {    this(str.toCharArray(), 0, str.length(), 0, str.length(), level, flags, font, frc, null);  }   // TextSource API   public char[] getChars() {    return chars;  }   public int getStart() {    return start;  }   public int getLength() {    return len;  }   public int getContextStart() {    return cstart;  }   public int getContextLength() {    return clen;  }   public int getLayoutFlags() {    return flags;  }   public int getBidiLevel() {    return level;  }   public Font getFont() {    return font;  }   public FontRenderContext getFRC() {    return frc;  }   public CoreMetrics getCoreMetrics() {    return cm;  }   public TextSource getSubSource(int start, int length, int dir) {    if (start < 0 || length < 0 || (start + length) > len) {      throw new IllegalArgumentException("bad start (" + start + ") or length (" + length + ")");    }     int level = this.level;    if (dir != TextLineComponent.UNCHANGED) {        boolean ltr = (flags & 0x8) == 0;        if (!(dir == TextLineComponent.LEFT_TO_RIGHT && ltr) &&                !(dir == TextLineComponent.RIGHT_TO_LEFT && !ltr)) {            throw new IllegalArgumentException("direction flag is invalid");        }        level = ltr? 0 : 1;    }     return new StandardTextSource(chars, this.start + start, length, cstart, clen, level, flags, font, frc, cm);  }   public String toString() {    return toString(WITH_CONTEXT);  }   public String toString(boolean withContext) {    StringBuffer buf = new StringBuffer(super.toString());    buf.append("[start:");    buf.append(start);    buf.append(", len:" );    buf.append(len);    buf.append(", cstart:");    buf.append(cstart);    buf.append(", clen:" );    buf.append(clen);    buf.append(", chars:\"");    int chStart, chLimit;    if (withContext == WITH_CONTEXT) {        chStart = cstart;        chLimit = cstart + clen;    }    else {        chStart = start;        chLimit = start + len;    }    for (int i = chStart; i < chLimit; ++i) {      if (i > chStart) {        buf.append(" ");      }      buf.append(Integer.toHexString(chars[i]));    }    buf.append("\"");    buf.append(", level:");    buf.append(level);    buf.append(", flags:");    buf.append(flags);    buf.append(", font:");    buf.append(font);    buf.append(", frc:");    buf.append(frc);    buf.append(", cm:");    buf.append(cm);    buf.append("]");     return buf.toString();  }}