|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
/* |
|
* |
|
* (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; |
|
|
|
final class StandardTextSource extends TextSource { |
|
|
|
private final char[] chars; |
|
private final int start; |
|
private final int len; |
|
private final int cstart; |
|
private final int clen; |
|
private final int level; |
|
private final int flags; |
|
private final Font font; |
|
private final FontRenderContext frc; |
|
private final CoreMetrics cm; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
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; |
|
} |
|
} |
|
|
|
// 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(); |
|
} |
|
} |