Use Tree Navigation
public class

StandardTextSource

extends TextSource
/*
 * 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();
 
}
}