下面列出了怎么用sun.font.TextLineComponent的API类实例代码及写法,或者点击链接到github查看源代码。
private TextLine makeTextLineOnRange(int startPos, int limitPos) {
int[] charsLtoV = null;
byte[] charLevels = null;
if (fBidi != null) {
Bidi lineBidi = fBidi.createLineBidi(startPos, limitPos);
charLevels = BidiUtils.getLevels(lineBidi);
int[] charsVtoL = BidiUtils.createVisualToLogicalMap(charLevels);
charsLtoV = BidiUtils.createInverseMap(charsVtoL);
}
TextLineComponent[] components = makeComponentsOnRange(startPos, limitPos);
return new TextLine(fFrc,
components,
fBaselineOffsets,
fChars,
startPos,
limitPos,
charsLtoV,
charLevels,
fIsDirectionLTR);
}
private TextLine makeTextLineOnRange(int startPos, int limitPos) {
int[] charsLtoV = null;
byte[] charLevels = null;
if (fBidi != null) {
Bidi lineBidi = fBidi.createLineBidi(startPos, limitPos);
charLevels = BidiUtils.getLevels(lineBidi);
int[] charsVtoL = BidiUtils.createVisualToLogicalMap(charLevels);
charsLtoV = BidiUtils.createInverseMap(charsVtoL);
}
TextLineComponent[] components = makeComponentsOnRange(startPos, limitPos);
return new TextLine(fFrc,
components,
fBaselineOffsets,
fChars,
startPos,
limitPos,
charsLtoV,
charLevels,
fIsDirectionLTR);
}
/**
* Create a TextLine from the Font and character data over the
* range. The range is relative to both the StyledParagraph and the
* character array.
*/
public static TextLine createLineFromText(char[] chars,
StyledParagraph styledParagraph,
TextLabelFactory factory,
boolean isDirectionLTR,
float[] baselineOffsets) {
factory.setLineContext(0, chars.length);
Bidi lineBidi = factory.getLineBidi();
int[] charsLtoV = null;
byte[] levels = null;
if (lineBidi != null) {
levels = BidiUtils.getLevels(lineBidi);
int[] charsVtoL = BidiUtils.createVisualToLogicalMap(levels);
charsLtoV = BidiUtils.createInverseMap(charsVtoL);
}
TextLineComponent[] components =
getComponents(styledParagraph, chars, 0, chars.length, charsLtoV, levels, factory);
return new TextLine(factory.getFontRenderContext(), components, baselineOffsets,
chars, 0, chars.length, charsLtoV, levels, isDirectionLTR);
}
private TextLine makeTextLineOnRange(int startPos, int limitPos) {
int[] charsLtoV = null;
byte[] charLevels = null;
if (fBidi != null) {
Bidi lineBidi = fBidi.createLineBidi(startPos, limitPos);
charLevels = BidiUtils.getLevels(lineBidi);
int[] charsVtoL = BidiUtils.createVisualToLogicalMap(charLevels);
charsLtoV = BidiUtils.createInverseMap(charsVtoL);
}
TextLineComponent[] components = makeComponentsOnRange(startPos, limitPos);
return new TextLine(fFrc,
components,
fBaselineOffsets,
fChars,
startPos,
limitPos,
charsLtoV,
charLevels,
fIsDirectionLTR);
}
public static float getAdvanceBetween(TextLineComponent[] components, int start, int limit) {
float advance = 0;
int tlcStart = 0;
for(int i = 0; i < components.length; i++) {
TextLineComponent comp = components[i];
int tlcLength = comp.getNumCharacters();
int tlcLimit = tlcStart + tlcLength;
if (tlcLimit > start) {
int measureStart = Math.max(0, start - tlcStart);
int measureLimit = Math.min(tlcLength, limit - tlcStart);
advance += comp.getAdvanceBetween(measureStart, measureLimit);
if (tlcLimit >= limit) {
break;
}
}
tlcStart = tlcLimit;
}
return advance;
}
public static float getAdvanceBetween(TextLineComponent[] components, int start, int limit) {
float advance = 0;
int tlcStart = 0;
for(int i = 0; i < components.length; i++) {
TextLineComponent comp = components[i];
int tlcLength = comp.getNumCharacters();
int tlcLimit = tlcStart + tlcLength;
if (tlcLimit > start) {
int measureStart = Math.max(0, start - tlcStart);
int measureLimit = Math.min(tlcLength, limit - tlcStart);
advance += comp.getAdvanceBetween(measureStart, measureLimit);
if (tlcLimit >= limit) {
break;
}
}
tlcStart = tlcLimit;
}
return advance;
}
public Rectangle2D getItalicBounds() {
float left = Float.MAX_VALUE, right = -Float.MAX_VALUE;
float top = Float.MAX_VALUE, bottom = -Float.MAX_VALUE;
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D tlcBounds = tlc.getItalicBounds();
float x = locs[n];
float y = locs[n+1];
left = Math.min(left, x + (float)tlcBounds.getX());
right = Math.max(right, x + (float)tlcBounds.getMaxX());
top = Math.min(top, y + (float)tlcBounds.getY());
bottom = Math.max(bottom, y + (float)tlcBounds.getMaxY());
}
return new Rectangle2D.Float(left, top, right-left, bottom-top);
}
public static float getAdvanceBetween(TextLineComponent[] components, int start, int limit) {
float advance = 0;
int tlcStart = 0;
for(int i = 0; i < components.length; i++) {
TextLineComponent comp = components[i];
int tlcLength = comp.getNumCharacters();
int tlcLimit = tlcStart + tlcLength;
if (tlcLimit > start) {
int measureStart = Math.max(0, start - tlcStart);
int measureLimit = Math.min(tlcLength, limit - tlcStart);
advance += comp.getAdvanceBetween(measureStart, measureLimit);
if (tlcLimit >= limit) {
break;
}
}
tlcStart = tlcLimit;
}
return advance;
}
public Rectangle2D getItalicBounds() {
float left = Float.MAX_VALUE, right = -Float.MAX_VALUE;
float top = Float.MAX_VALUE, bottom = -Float.MAX_VALUE;
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D tlcBounds = tlc.getItalicBounds();
float x = locs[n];
float y = locs[n+1];
left = Math.min(left, x + (float)tlcBounds.getX());
right = Math.max(right, x + (float)tlcBounds.getMaxX());
top = Math.min(top, y + (float)tlcBounds.getY());
bottom = Math.max(bottom, y + (float)tlcBounds.getMaxY());
}
return new Rectangle2D.Float(left, top, right-left, bottom-top);
}
public Rectangle2D getItalicBounds() {
float left = Float.MAX_VALUE, right = -Float.MAX_VALUE;
float top = Float.MAX_VALUE, bottom = -Float.MAX_VALUE;
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D tlcBounds = tlc.getItalicBounds();
float x = locs[n];
float y = locs[n+1];
left = Math.min(left, x + (float)tlcBounds.getX());
right = Math.max(right, x + (float)tlcBounds.getMaxX());
top = Math.min(top, y + (float)tlcBounds.getY());
bottom = Math.max(bottom, y + (float)tlcBounds.getMaxY());
}
return new Rectangle2D.Float(left, top, right-left, bottom-top);
}
public static float getAdvanceBetween(TextLineComponent[] components, int start, int limit) {
float advance = 0;
int tlcStart = 0;
for(int i = 0; i < components.length; i++) {
TextLineComponent comp = components[i];
int tlcLength = comp.getNumCharacters();
int tlcLimit = tlcStart + tlcLength;
if (tlcLimit > start) {
int measureStart = Math.max(0, start - tlcStart);
int measureLimit = Math.min(tlcLength, limit - tlcStart);
advance += comp.getAdvanceBetween(measureStart, measureLimit);
if (tlcLimit >= limit) {
break;
}
}
tlcStart = tlcLimit;
}
return advance;
}
public Rectangle2D getItalicBounds() {
float left = Float.MAX_VALUE, right = -Float.MAX_VALUE;
float top = Float.MAX_VALUE, bottom = -Float.MAX_VALUE;
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D tlcBounds = tlc.getItalicBounds();
float x = locs[n];
float y = locs[n+1];
left = Math.min(left, x + (float)tlcBounds.getX());
right = Math.max(right, x + (float)tlcBounds.getMaxX());
top = Math.min(top, y + (float)tlcBounds.getY());
bottom = Math.max(bottom, y + (float)tlcBounds.getMaxY());
}
return new Rectangle2D.Float(left, top, right-left, bottom-top);
}
/**
* Create a TextLine from the Font and character data over the
* range. The range is relative to both the StyledParagraph and the
* character array.
*/
public static TextLine createLineFromText(char[] chars,
StyledParagraph styledParagraph,
TextLabelFactory factory,
boolean isDirectionLTR,
float[] baselineOffsets) {
factory.setLineContext(0, chars.length);
Bidi lineBidi = factory.getLineBidi();
int[] charsLtoV = null;
byte[] levels = null;
if (lineBidi != null) {
levels = BidiUtils.getLevels(lineBidi);
int[] charsVtoL = BidiUtils.createVisualToLogicalMap(levels);
charsLtoV = BidiUtils.createInverseMap(charsVtoL);
}
TextLineComponent[] components =
getComponents(styledParagraph, chars, 0, chars.length, charsLtoV, levels, factory);
return new TextLine(factory.getFontRenderContext(), components, baselineOffsets,
chars, 0, chars.length, charsLtoV, levels, isDirectionLTR);
}
public Rectangle2D getItalicBounds() {
float left = Float.MAX_VALUE, right = -Float.MAX_VALUE;
float top = Float.MAX_VALUE, bottom = -Float.MAX_VALUE;
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D tlcBounds = tlc.getItalicBounds();
float x = locs[n];
float y = locs[n+1];
left = Math.min(left, x + (float)tlcBounds.getX());
right = Math.max(right, x + (float)tlcBounds.getMaxX());
top = Math.min(top, y + (float)tlcBounds.getY());
bottom = Math.max(bottom, y + (float)tlcBounds.getMaxY());
}
return new Rectangle2D.Float(left, top, right-left, bottom-top);
}
private TextLine makeTextLineOnRange(int startPos, int limitPos) {
int[] charsLtoV = null;
byte[] charLevels = null;
if (fBidi != null) {
Bidi lineBidi = fBidi.createLineBidi(startPos, limitPos);
charLevels = BidiUtils.getLevels(lineBidi);
int[] charsVtoL = BidiUtils.createVisualToLogicalMap(charLevels);
charsLtoV = BidiUtils.createInverseMap(charsVtoL);
}
TextLineComponent[] components = makeComponentsOnRange(startPos, limitPos);
return new TextLine(fFrc,
components,
fBaselineOffsets,
fChars,
startPos,
limitPos,
charsLtoV,
charLevels,
fIsDirectionLTR);
}
public Rectangle2D getItalicBounds() {
float left = Float.MAX_VALUE, right = -Float.MAX_VALUE;
float top = Float.MAX_VALUE, bottom = -Float.MAX_VALUE;
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D tlcBounds = tlc.getItalicBounds();
float x = locs[n];
float y = locs[n+1];
left = Math.min(left, x + (float)tlcBounds.getX());
right = Math.max(right, x + (float)tlcBounds.getMaxX());
top = Math.min(top, y + (float)tlcBounds.getY());
bottom = Math.max(bottom, y + (float)tlcBounds.getMaxY());
}
return new Rectangle2D.Float(left, top, right-left, bottom-top);
}
public static float getAdvanceBetween(TextLineComponent[] components, int start, int limit) {
float advance = 0;
int tlcStart = 0;
for(int i = 0; i < components.length; i++) {
TextLineComponent comp = components[i];
int tlcLength = comp.getNumCharacters();
int tlcLimit = tlcStart + tlcLength;
if (tlcLimit > start) {
int measureStart = Math.max(0, start - tlcStart);
int measureLimit = Math.min(tlcLength, limit - tlcStart);
advance += comp.getAdvanceBetween(measureStart, measureLimit);
if (tlcLimit >= limit) {
break;
}
}
tlcStart = tlcLimit;
}
return advance;
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
TextLineComponent tlc = line.fComponents[componentIndex];
int vi = line.getComponentVisualIndex(componentIndex);
return line.locs[vi * 2] + tlc.getCharX(indexInArray) + tlc.getCharAdvance(indexInArray);
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
TextLineComponent tlc = line.fComponents[componentIndex];
float charPos = tlc.getCharY(indexInArray);
// charPos is relative to the component - adjust for
// baseline
return charPos + line.getComponentShift(componentIndex);
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
int vi = line.getComponentVisualIndex(componentIndex);
TextLineComponent tlc = line.fComponents[componentIndex];
return line.locs[vi * 2] + tlc.getCharX(indexInArray);
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
TextLineComponent tlc = line.fComponents[componentIndex];
return tlc.getCharAdvance(indexInArray);
}
/**
* Return the union of the visual bounds of all the components.
* This incorporates the path. It does not include logical
* bounds (used by carets).
*/
public Rectangle2D getVisualBounds() {
Rectangle2D result = null;
for (int i = 0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D r = tlc.getVisualBounds();
Point2D.Float pt = new Point2D.Float(locs[n], locs[n+1]);
if (lp == null) {
r.setRect(r.getMinX() + pt.x, r.getMinY() + pt.y,
r.getWidth(), r.getHeight());
} else {
lp.pathToPoint(pt, false, pt);
AffineTransform at = tlc.getBaselineTransform();
if (at != null) {
AffineTransform tx = AffineTransform.getTranslateInstance
(pt.x - at.getTranslateX(), pt.y - at.getTranslateY());
tx.concatenate(at);
r = tx.createTransformedShape(r).getBounds2D();
} else {
r.setRect(r.getMinX() + pt.x, r.getMinY() + pt.y,
r.getWidth(), r.getHeight());
}
}
if (result == null) {
result = r;
} else {
result.add(r);
}
}
if (result == null) {
result = new Rectangle2D.Float(Float.MAX_VALUE, Float.MAX_VALUE, Float.MIN_VALUE, Float.MIN_VALUE);
}
return result;
}
/**
* Return the union of the visual bounds of all the components.
* This incorporates the path. It does not include logical
* bounds (used by carets).
*/
public Rectangle2D getVisualBounds() {
Rectangle2D result = null;
for (int i = 0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
Rectangle2D r = tlc.getVisualBounds();
Point2D.Float pt = new Point2D.Float(locs[n], locs[n+1]);
if (lp == null) {
r.setRect(r.getMinX() + pt.x, r.getMinY() + pt.y,
r.getWidth(), r.getHeight());
} else {
lp.pathToPoint(pt, false, pt);
AffineTransform at = tlc.getBaselineTransform();
if (at != null) {
AffineTransform tx = AffineTransform.getTranslateInstance
(pt.x - at.getTranslateX(), pt.y - at.getTranslateY());
tx.concatenate(at);
r = tx.createTransformedShape(r).getBounds2D();
} else {
r.setRect(r.getMinX() + pt.x, r.getMinY() + pt.y,
r.getWidth(), r.getHeight());
}
}
if (result == null) {
result = r;
} else {
result.add(r);
}
}
if (result == null) {
result = new Rectangle2D.Float(Float.MAX_VALUE, Float.MAX_VALUE, Float.MIN_VALUE, Float.MIN_VALUE);
}
return result;
}
public Rectangle2D getCharBounds(int logicalIndex) {
if (logicalIndex < 0) {
throw new IllegalArgumentException("Negative logicalIndex.");
}
int tlcStart = 0;
for (int i=0; i < fComponents.length; i++) {
int tlcLimit = tlcStart + fComponents[i].getNumCharacters();
if (tlcLimit > logicalIndex) {
TextLineComponent tlc = fComponents[i];
int indexInTlc = logicalIndex - tlcStart;
Rectangle2D chBounds = tlc.getCharVisualBounds(indexInTlc);
int vi = getComponentVisualIndex(i);
chBounds.setRect(chBounds.getX() + locs[vi * 2],
chBounds.getY() + locs[vi * 2 + 1],
chBounds.getWidth(),
chBounds.getHeight());
return chBounds;
}
else {
tlcStart = tlcLimit;
}
}
throw new IllegalArgumentException("logicalIndex too large.");
}
public Shape getOutline(AffineTransform tx) {
GeneralPath dstShape = new GeneralPath(GeneralPath.WIND_NON_ZERO);
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
dstShape.append(tlc.getOutline(locs[n], locs[n+1]), false);
}
if (tx != null) {
dstShape.transform(tx);
}
return dstShape;
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
int vi = line.getComponentVisualIndex(componentIndex);
TextLineComponent tlc = line.fComponents[componentIndex];
return line.locs[vi * 2] + tlc.getCharX(indexInArray);
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
int vi = line.getComponentVisualIndex(componentIndex);
TextLineComponent tlc = line.fComponents[componentIndex];
return line.locs[vi * 2] + tlc.getCharX(indexInArray);
}
public Shape getOutline(AffineTransform tx) {
GeneralPath dstShape = new GeneralPath(GeneralPath.WIND_NON_ZERO);
for (int i=0, n = 0; i < fComponents.length; i++, n += 2) {
TextLineComponent tlc = fComponents[getComponentLogicalIndex(i)];
dstShape.append(tlc.getOutline(locs[n], locs[n+1]), false);
}
if (tx != null) {
dstShape.transform(tx);
}
return dstShape;
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
TextLineComponent tlc = line.fComponents[componentIndex];
float charPos = tlc.getCharY(indexInArray);
// charPos is relative to the component - adjust for
// baseline
return charPos + line.getComponentShift(componentIndex);
}
float computeFunction(TextLine line,
int componentIndex,
int indexInArray) {
TextLineComponent tlc = line.fComponents[componentIndex];
int vi = line.getComponentVisualIndex(componentIndex);
return line.locs[vi * 2] + tlc.getCharX(indexInArray) + tlc.getCharAdvance(indexInArray);
}