本文整理匯總了Java中java.text.Bidi.getRunLevel方法的典型用法代碼示例。如果您正苦於以下問題:Java Bidi.getRunLevel方法的具體用法?Java Bidi.getRunLevel怎麽用?Java Bidi.getRunLevel使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類java.text.Bidi
的用法示例。
在下文中一共展示了Bidi.getRunLevel方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。
示例1: getLevels
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Return the level of each character into the levels array starting at start.
* This is a convenience method for clients who prefer to use an explicit levels
* array instead of iterating over the runs.
*
* @param levels the array to receive the character levels
* @param start the starting offset into the the array
* @throws IndexOutOfBoundsException if <code>start</code> is less than 0 or
* <code>start + getLength()</code> is greater than <code>levels.length</code>.
*/
public static void getLevels(Bidi bidi, byte[] levels, int start) {
int limit = start + bidi.getLength();
if (start < 0 || limit > levels.length) {
throw new IndexOutOfBoundsException("levels.length = " + levels.length +
" start: " + start + " limit: " + limit);
}
int runCount = bidi.getRunCount();
int p = start;
for (int i = 0; i < runCount; ++i) {
int rlimit = start + bidi.getRunLimit(i);
byte rlevel = (byte)bidi.getRunLevel(i);
while (p < rlimit) {
levels[p++] = rlevel;
}
}
}
示例2: getLevels
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Return the level of each character into the levels array starting at start.
* This is a convenience method for clients who prefer to use an explicit levels
* array instead of iterating over the runs.
*
* @param levels the array to receive the character levels
* @param start the starting offset into the array
* @throws IndexOutOfBoundsException if {@code start} is less than 0 or
* {@code start + getLength()} is greater than {@code levels.length}.
*/
public static void getLevels(Bidi bidi, byte[] levels, int start) {
int limit = start + bidi.getLength();
if (start < 0 || limit > levels.length) {
throw new IndexOutOfBoundsException("levels.length = " + levels.length +
" start: " + start + " limit: " + limit);
}
int runCount = bidi.getRunCount();
int p = start;
for (int i = 0; i < runCount; ++i) {
int rlimit = start + bidi.getRunLimit(i);
byte rlevel = (byte)bidi.getRunLevel(i);
while (p < rlimit) {
levels[p++] = rlevel;
}
}
}
示例3: assertRunArrayEquals
import java.text.Bidi; //導入方法依賴的package包/類
public static void assertRunArrayEquals(int[][] expected, Bidi bidi) {
assertEquals("different length", expected.length, bidi.getRunCount());
FORRUN: for (int i = 0; i < bidi.getRunCount(); i++) {
int[] butWas = new int[] { bidi.getRunStart(i),
bidi.getRunLimit(i), bidi.getRunLevel(i) };
for (int j = 0; j < expected.length; j++) {
if (expected[j][0] == butWas[0] && expected[j][1] == butWas[1]
&& expected[j][2] == butWas[2]) {
continue FORRUN;
}
}
fail("expected [" + i + "] " + " start: " + butWas[0] + " limit: "
+ butWas[1] + " level: " + butWas[2]);
}
}
示例4: layoutBidi
import java.text.Bidi; //導入方法依賴的package包/類
private int layoutBidi(String str) {
final char[] text = str.toCharArray();
/* Avoid performing full bidirectional analysis if text has no "strong" right-to-left characters */
if (!Bidi.requiresBidi(text, 0, text.length))
return layoutFont(text, 0, text.length, Font.LAYOUT_LEFT_TO_RIGHT);
final Bidi bidi = new Bidi(text, 0, null, 0, text.length, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
/* If text is entirely right-to-left, then just lay it out */
if (bidi.isRightToLeft())
return layoutFont(text, 0, text.length, Font.LAYOUT_RIGHT_TO_LEFT);
/* Otherwise text has a mixture of LTR and RLT, and it requires full bidirectional analysis */
final int runCount = bidi.getRunCount();
final byte[] levels = new byte[runCount];
final Integer[] ranges = new Integer[runCount];
for (int i = 0; i < runCount; i++) {
levels[i] = (byte) bidi.getRunLevel(i);
ranges[i] = i;
}
Bidi.reorderVisually(levels, 0, ranges, 0, runCount);
int width = 0;
for (int i = 0; i < runCount; i++) {
final int index = ranges[i];
width += layoutFont(text, bidi.getRunStart(index), bidi.getRunLimit(index), (bidi.getRunLevel(index) & 1));
}
return width;
}
示例5: main
import java.text.Bidi; //導入方法依賴的package包/類
public static void main(String[] args) {
boolean err = false;
String string = "\u05D0\u05D1\u05D2";
Bidi bidi = new Bidi(string, Bidi.DIRECTION_LEFT_TO_RIGHT);
int result = bidi.getRunCount();
if (result != 1) {
System.err.println("Incorrect run count: " + result);
err = true;
}
result = bidi.getRunStart(0);
if (result != 0) {
System.err.println("Incorrect run start: " + result);
err = true;
}
result = bidi.getRunLimit(0);
if (result != 3) {
System.err.println("Incorrect run limit: " + result);
err = true;
}
result = bidi.getRunLevel(0);
if (result != 1) {
System.err.println("Incorrect run level: " + result);
err = true;
}
if (err) {
throw new RuntimeException("Failed.");
}
}
示例6: testBidi
import java.text.Bidi; //導入方法依賴的package包/類
void testBidi(String string, int rtlstart, int rtllength) {
Bidi bidi = new Bidi(string, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
for (int i = 0; i < bidi.getRunCount(); ++i) {
if ((bidi.getRunLevel(i) & 1) != 0) {
if (bidi.getRunStart(i) != rtlstart ||
bidi.getRunLimit(i) != rtlstart + rtllength) {
throw new RuntimeException("first rtl run didn't match " + rtlstart + ", " + rtllength);
}
break;
}
}
}
示例7: bidiParseParagraph
import java.text.Bidi; //導入方法依賴的package包/類
private void bidiParseParagraph(final List<Element> added, final Element par,
final Segment text) {
final int parStart = par.getStartOffset();
final int parEnd = par.getEndOffset();
final int parLen = parEnd - parStart;
try {
content.getChars(parStart, parLen, text);
} catch (final BadLocationException e) { }
Bidi bidi = new Bidi(text.array, text.offset, null, 0, text.count,
getDefaultDirection(par));
final int runCount = bidi.getRunCount();
for (int i = 0; i < runCount; i++) {
int level = bidi.getRunLevel(i);
if (i == 0 && added.size() > 0) {
Element prevBidi = added.get(added.size() - 1);
if (getBidiLevel(prevBidi) == level) {
added.remove(added.size() - 1);
added.add(new BidiElement(prevBidi.getAttributes(),
prevBidi.getStartOffset(),
parStart + bidi.getRunLimit(i)));
continue;
}
}
added.add(
new BidiElement(context.addAttribute(context.getEmptySet(),
StyleConstants.BidiLevel,
new Integer(level)),
parStart + bidi.getRunStart(i),
parStart + bidi.getRunLimit(i)));
}
}
示例8: testEachMethod
import java.text.Bidi; //導入方法依賴的package包/類
private void testEachMethod(Bidi bidi,
String text,
String expectedLevels,
boolean expectedBaseIsLTR,
boolean expectedIsLTR,
boolean expectedIsRTL
) {
/* Test baseIsLeftToRight() */
boolean actualBoolean = bidi.baseIsLeftToRight();
checkResult("baseIsLeftToRight()", expectedBaseIsLTR, actualBoolean);
/* Test getBaseLevel() */
int expectedInt = (expectedBaseIsLTR) ? 0 : 1;
int actualInt = bidi.getBaseLevel();
checkResult("getBaseLevel()", expectedInt, actualInt);
/* Test getLength() */
expectedInt = text.length();
actualInt = bidi.getLength();
checkResult("getLength()", expectedInt, actualInt);
/* Test getLevelAt() */
sb.setLength(0);
for (int i = 0; i < text.length(); i++) {
sb.append(bidi.getLevelAt(i));
}
checkResult("getLevelAt()", expectedLevels, sb.toString());
/* Test getRunCount() */
expectedInt = getRunCount(expectedLevels);
actualInt = bidi.getRunCount();
checkResult("getRunCount()", expectedInt, actualInt);
/* Test getRunLevel(), getRunLimit() and getRunStart() */
if (expectedInt == actualInt) {
int runCount = expectedInt;
int[] expectedRunLevels = getRunLevels_int(runCount, expectedLevels);
int[] expectedRunLimits = getRunLimits(runCount, expectedLevels);
int[] expectedRunStarts = getRunStarts(runCount, expectedLevels);
int[] actualRunLevels = new int[runCount];
int[] actualRunLimits = new int[runCount];
int[] actualRunStarts = new int[runCount];
for (int k = 0; k < runCount; k++) {
actualRunLevels[k] = bidi.getRunLevel(k);
actualRunLimits[k] = bidi.getRunLimit(k);
actualRunStarts[k] = bidi.getRunStart(k);
}
checkResult("getRunLevel()", expectedRunLevels, actualRunLevels);
checkResult("getRunStart()", expectedRunStarts, actualRunStarts);
checkResult("getRunLimit()", expectedRunLimits, actualRunLimits);
}
/* Test isLeftToRight() */
boolean expectedBoolean = expectedIsLTR;
actualBoolean = bidi.isLeftToRight();
checkResult("isLeftToRight()", expectedBoolean, actualBoolean);
/* Test isMixed() */
expectedBoolean = !(expectedIsLTR || expectedIsRTL);
actualBoolean = bidi.isMixed();
checkResult("isMixed()", expectedBoolean, actualBoolean);
/* Test isRightToLeft() */
expectedBoolean = expectedIsRTL;
actualBoolean = bidi.isRightToLeft();
checkResult("isRightToLeft()", expectedBoolean, actualBoolean);
}
示例9: bidiReorder
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Apply Unicode Bidirectional Algorithm to string and return a new possibly
* reordered string for visual rendering.
*/
private String bidiReorder(String par1Str)
{
if (par1Str != null && Bidi.requiresBidi(par1Str.toCharArray(), 0, par1Str.length()))
{
Bidi bidi = new Bidi(par1Str, -2);
byte[] abyte = new byte[bidi.getRunCount()];
String[] astring = new String[abyte.length];
int i;
for (int j = 0; j < abyte.length; ++j)
{
int k = bidi.getRunStart(j);
i = bidi.getRunLimit(j);
int l = bidi.getRunLevel(j);
String s1 = par1Str.substring(k, i);
abyte[j] = (byte) l;
astring[j] = s1;
}
String[] astring1 = astring.clone();
Bidi.reorderVisually(abyte, 0, astring, 0, abyte.length);
StringBuilder stringbuilder = new StringBuilder();
i = 0;
while (i < astring.length)
{
byte b0 = abyte[i];
int i1 = 0;
while (true)
{
if (i1 < astring1.length)
{
if (!astring1[i1].equals(astring[i]))
{
++i1;
continue;
}
b0 = abyte[i1];
}
if ((b0 & 1) == 0)
{
stringbuilder.append(astring[i]);
}
else
{
for (i1 = astring[i].length() - 1; i1 >= 0; --i1)
{
char c0 = astring[i].charAt(i1);
if (c0 == 40)
{
c0 = 41;
}
else if (c0 == 41)
{
c0 = 40;
}
stringbuilder.append(c0);
}
}
++i;
break;
}
}
return stringbuilder.toString();
}
else
{
return par1Str;
}
}
示例10: layoutBidiString
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Split a string into contiguous LTR or RTL sections by applying the Unicode Bidirectional Algorithm. Calls layoutString()
* for each contiguous run to perform further analysis.
*
* @param glyphList will hold all new Glyph objects allocated by layoutFont()
* @param text the string to lay out
* @param start the offset into text at which to start the layout
* @param limit the (offset + length) at which to stop performing the layout
* @return the total advance (horizontal distance) of this string
*/
private int layoutBidiString(List<Glyph> glyphList, char text[], int start, int limit, ColorCode colors[])
{
int advance = 0;
/* Avoid performing full bidirectional analysis if text has no "strong" right-to-left characters */
if (Bidi.requiresBidi(text, start, limit))
{
/* Note that while requiresBidi() uses start/limit the Bidi constructor uses start/length */
Bidi bidi = new Bidi(text, start, null, 0, limit - start, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
/* If text is entirely right-to-left, then insert an EntryText node for the entire string */
if (bidi.isRightToLeft())
{
return layoutStyle(glyphList, text, start, limit, Font.LAYOUT_RIGHT_TO_LEFT, advance, colors);
}
/* Otherwise text has a mixture of LTR and RLT, and it requires full bidirectional analysis */
else
{
int runCount = bidi.getRunCount();
byte levels[] = new byte[runCount];
Integer ranges[] = new Integer[runCount];
/* Reorder contiguous runs of text into their display order from left to right */
for (int index = 0; index < runCount; index++)
{
levels[index] = (byte) bidi.getRunLevel(index);
ranges[index] = new Integer(index);
}
Bidi.reorderVisually(levels, 0, ranges, 0, runCount);
/*
* Every GlyphVector must be created on a contiguous run of left-to-right or right-to-left text. Keep track of
* the horizontal advance between each run of text, so that the glyphs in each run can be assigned a position relative
* to the start of the entire string and not just relative to that run.
*/
for (int visualIndex = 0; visualIndex < runCount; visualIndex++)
{
int logicalIndex = ranges[visualIndex];
/* An odd numbered level indicates right-to-left ordering */
int layoutFlag = (bidi.getRunLevel(logicalIndex) & 1) == 1 ? Font.LAYOUT_RIGHT_TO_LEFT : Font.LAYOUT_LEFT_TO_RIGHT;
advance = layoutStyle(glyphList, text, start + bidi.getRunStart(logicalIndex), start + bidi.getRunLimit(logicalIndex),
layoutFlag, advance, colors);
}
}
return advance;
}
/* If text is entirely left-to-right, then insert an EntryText node for the entire string */
else
{
return layoutStyle(glyphList, text, start, limit, Font.LAYOUT_LEFT_TO_RIGHT, advance, colors);
}
}
示例11: bidiReorder
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Apply Unicode Bidirectional Algorithm to string and return a new possibly
* reordered string for visual rendering.
*/
private String bidiReorder(String par1Str)
{
if (par1Str != null && Bidi.requiresBidi(par1Str.toCharArray(), 0, par1Str.length())) {
Bidi bidi = new Bidi(par1Str, -2);
byte[] abyte = new byte[bidi.getRunCount()];
String[] astring = new String[abyte.length];
int i;
for (int j = 0; j < abyte.length; ++j) {
int k = bidi.getRunStart(j);
i = bidi.getRunLimit(j);
int l = bidi.getRunLevel(j);
String s1 = par1Str.substring(k, i);
abyte[j] = (byte) l;
astring[j] = s1;
}
String[] astring1 = astring.clone();
Bidi.reorderVisually(abyte, 0, astring, 0, abyte.length);
StringBuilder stringbuilder = new StringBuilder();
i = 0;
while (i < astring.length) {
byte b0 = abyte[i];
int i1 = 0;
while (true) {
if (i1 < astring1.length) {
if (!astring1[i1].equals(astring[i])) {
++i1;
continue;
}
b0 = abyte[i1];
}
if ((b0 & 1) == 0) {
stringbuilder.append(astring[i]);
}
else {
for (i1 = astring[i].length() - 1; i1 >= 0; --i1) {
char c0 = astring[i].charAt(i1);
if (c0 == 40) {
c0 = 41;
}
else if (c0 == 41) {
c0 = 40;
}
stringbuilder.append(c0);
}
}
++i;
break;
}
}
return stringbuilder.toString();
}
else {
return par1Str;
}
}
示例12: visualToLogical
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Handles the LTR and RTL direction of the given words. The whole implementation stands and falls with the given
* word. If the word is a full line, the results will be the best. If the word contains of single words or
* characters, the order of the characters in a word or words in a line may wrong, due to RTL and LTR marks and
* characters!
*
* Based on http://www.nesterovsky-bros.com/weblog/2013/07/28/VisualToLogicalConversionInJava.aspx
*
* @param text The word that shall be processed
* @return new word with the correct direction of the containing characters
*/
public static String visualToLogical(String text)
{
if (!CharUtils.isBlank(text))
{
Bidi bidi = new Bidi(text, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
if (!bidi.isLeftToRight())
{
// collect individual bidi information
int runCount = bidi.getRunCount();
byte[] levels = new byte[runCount];
Integer[] runs = new Integer[runCount];
for (int i = 0; i < runCount; i++)
{
levels[i] = (byte) bidi.getRunLevel(i);
runs[i] = i;
}
// reorder individual parts based on their levels
Bidi.reorderVisually(levels, 0, runs, 0, runCount);
// collect the parts based on the direction within the run
StringBuilder result = new StringBuilder();
for (int i = 0; i < runCount; i++)
{
int index = runs[i];
int start = bidi.getRunStart(index);
int end = bidi.getRunLimit(index);
int level = levels[index];
if ((level & 1) != 0)
{
while (--end >= start)
{
char character = text.charAt(end);
if (Character.isMirrored(text.codePointAt(end))
&& MIRRORING_CHAR_MAP.containsKey(character))
{
result.append(MIRRORING_CHAR_MAP.get(character));
}
else
{
result.append(character);
}
}
}
else
{
result.append(text, start, end);
}
}
return result.toString();
}
}
return text;
}
示例13: bidiReorder
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Apply Unicode Bidirectional Algorithm to string and return a new possibly reordered string for visual rendering.
*/
private String bidiReorder(String par1Str)
{
if (par1Str != null && Bidi.requiresBidi(par1Str.toCharArray(), 0, par1Str.length()))
{
Bidi bidi = new Bidi(par1Str, -2);
byte[] abyte = new byte[bidi.getRunCount()];
String[] astring = new String[abyte.length];
int i;
for (int j = 0; j < abyte.length; ++j)
{
int k = bidi.getRunStart(j);
i = bidi.getRunLimit(j);
int l = bidi.getRunLevel(j);
String s1 = par1Str.substring(k, i);
abyte[j] = (byte) l;
astring[j] = s1;
}
String[] astring1 = astring.clone();
Bidi.reorderVisually(abyte, 0, astring, 0, abyte.length);
StringBuilder stringbuilder = new StringBuilder();
i = 0;
while (i < astring.length)
{
byte b0 = abyte[i];
int i1 = 0;
while (true)
{
if (i1 < astring1.length)
{
if (!astring1[i1].equals(astring[i]))
{
++i1;
continue;
}
b0 = abyte[i1];
}
if ((b0 & 1) == 0)
{
stringbuilder.append(astring[i]);
}
else
{
for (i1 = astring[i].length() - 1; i1 >= 0; --i1)
{
char c0 = astring[i].charAt(i1);
if (c0 == 40)
{
c0 = 41;
}
else if (c0 == 41)
{
c0 = 40;
}
stringbuilder.append(c0);
}
}
++i;
break;
}
}
return stringbuilder.toString();
}
else
{
return par1Str;
}
}
示例14: layoutBidiString
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Split a string into contiguous LTR or RTL sections by applying the Unicode Bidirectional Algorithm. Calls layoutString()
* for each contiguous run to perform further analysis.
*
* @param glyphList will hold all new Glyph objects allocated by layoutFont()
* @param text the string to lay out
* @param start the offset into text at which to start the layout
* @param limit the (offset + length) at which to stop performing the layout
* @return the total advance (horizontal distance) of this string
*/
private int layoutBidiString(List<Glyph> glyphList, char text[], int start, int limit, ColorCode colors[]) {
int advance = 0;
/* Avoid performing full bidirectional analysis if text has no "strong" right-to-left characters */
if (Bidi.requiresBidi(text, start, limit)) {
/* Note that while requiresBidi() uses start/limit the Bidi constructor uses start/length */
Bidi bidi = new Bidi(text, start, null, 0, limit - start, Bidi.DIRECTION_DEFAULT_LEFT_TO_RIGHT);
/* If text is entirely right-to-left, then insert an EntryText node for the entire string */
if (bidi.isRightToLeft()) {
return layoutStyle(glyphList, text, start, limit, Font.LAYOUT_RIGHT_TO_LEFT, advance, colors);
}
/* Otherwise text has a mixture of LTR and RLT, and it requires full bidirectional analysis */
else {
int runCount = bidi.getRunCount();
byte levels[] = new byte[runCount];
Integer ranges[] = new Integer[runCount];
/* Reorder contiguous runs of text into their display order from left to right */
for (int index = 0; index < runCount; index++) {
levels[index] = (byte) bidi.getRunLevel(index);
ranges[index] = new Integer(index);
}
Bidi.reorderVisually(levels, 0, ranges, 0, runCount);
/*
* Every GlyphVector must be created on a contiguous run of left-to-right or right-to-left text. Keep track of
* the horizontal advance between each run of text, so that the glyphs in each run can be assigned a position relative
* to the start of the entire string and not just relative to that run.
*/
for (int visualIndex = 0; visualIndex < runCount; visualIndex++) {
int logicalIndex = ranges[visualIndex];
/* An odd numbered level indicates right-to-left ordering */
int layoutFlag = (bidi.getRunLevel(logicalIndex) & 1) == 1 ? Font.LAYOUT_RIGHT_TO_LEFT : Font.LAYOUT_LEFT_TO_RIGHT;
advance = layoutStyle(glyphList, text, start + bidi.getRunStart(logicalIndex), start + bidi.getRunLimit(logicalIndex),
layoutFlag, advance, colors);
}
}
return advance;
}
/* If text is entirely left-to-right, then insert an EntryText node for the entire string */
else {
return layoutStyle(glyphList, text, start, limit, Font.LAYOUT_LEFT_TO_RIGHT, advance, colors);
}
}
示例15: bidiReorder
import java.text.Bidi; //導入方法依賴的package包/類
/**
* Apply Unicode Bidirectional Algorithm to string and return a new possibly reordered string for visual rendering.
*/
private String bidiReorder(String par1Str)
{
if (par1Str != null && Bidi.requiresBidi(par1Str.toCharArray(), 0, par1Str.length()))
{
Bidi bidi = new Bidi(par1Str, -2);
byte[] abyte = new byte[bidi.getRunCount()];
String[] astring = new String[abyte.length];
int i;
for (int j = 0; j < abyte.length; ++j)
{
int k = bidi.getRunStart(j);
i = bidi.getRunLimit(j);
int l = bidi.getRunLevel(j);
String s1 = par1Str.substring(k, i);
abyte[j] = (byte)l;
astring[j] = s1;
}
String[] astring1 = (String[])astring.clone();
Bidi.reorderVisually(abyte, 0, astring, 0, abyte.length);
StringBuilder stringbuilder = new StringBuilder();
i = 0;
while (i < astring.length)
{
byte b0 = abyte[i];
int i1 = 0;
while (true)
{
if (i1 < astring1.length)
{
if (!astring1[i1].equals(astring[i]))
{
++i1;
continue;
}
b0 = abyte[i1];
}
if ((b0 & 1) == 0)
{
stringbuilder.append(astring[i]);
}
else
{
for (i1 = astring[i].length() - 1; i1 >= 0; --i1)
{
char c0 = astring[i].charAt(i1);
if (c0 == 40)
{
c0 = 41;
}
else if (c0 == 41)
{
c0 = 40;
}
stringbuilder.append(c0);
}
}
++i;
break;
}
}
return stringbuilder.toString();
}
else
{
return par1Str;
}
}