use of com.mta.tehreer.unicode.BidiRun in project Tehreer-Android by mta452.
the class BidiInfoActivity method writeLineText.
private void writeLineText(SpannableStringBuilder builder, BidiLine line) {
SparseIntArray visualMap = new SparseIntArray();
int counter = 1;
for (BidiRun bidiRun : line.getVisualRuns()) {
visualMap.put(bidiRun.charStart, counter);
counter++;
}
int runCount = visualMap.size();
if (runCount > 0) {
appendText(builder, "Visual Order\n", spansSecondHeading());
for (int i = 0; i < runCount; i++) {
int runIndex = visualMap.valueAt(i);
appendText(builder, "<Run " + runIndex + ">", spansInlineHeading());
appendText(builder, " ");
}
appendText(builder, "\n\n");
}
}
use of com.mta.tehreer.unicode.BidiRun in project Tehreer-Android by mta452.
the class ShapeResolver method fillRuns.
public static void fillRuns(@NonNull String text, @NonNull Spanned spanned, @NonNull List<Object> defaultSpans, @NonNull byte[] breaks, @NonNull List<BidiParagraph> paragraphs, @NonNull List<TextRun> runs) {
BidiAlgorithm bidiAlgorithm = null;
ShapingEngine shapingEngine = null;
try {
bidiAlgorithm = new BidiAlgorithm(text);
shapingEngine = new ShapingEngine();
ScriptClassifier scriptClassifier = new ScriptClassifier(text);
ShapingRunLocator locator = new ShapingRunLocator(spanned, defaultSpans);
BaseDirection baseDirection = BaseDirection.DEFAULT_LEFT_TO_RIGHT;
byte forwardType = BreakResolver.typeMode(BreakResolver.PARAGRAPH, true);
byte backwardType = BreakResolver.typeMode(BreakResolver.PARAGRAPH, false);
int paragraphStart = 0;
int suggestedEnd = text.length();
while (paragraphStart != suggestedEnd) {
BidiParagraph paragraph = bidiAlgorithm.createParagraph(paragraphStart, suggestedEnd, baseDirection);
for (BidiRun bidiRun : paragraph.getLogicalRuns()) {
for (ScriptRun scriptRun : scriptClassifier.getScriptRuns(bidiRun.charStart, bidiRun.charEnd)) {
int scriptTag = Script.getOpenTypeTag(scriptRun.script);
WritingDirection writingDirection = ShapingEngine.getScriptDirection(scriptTag);
boolean isOddLevel = ((bidiRun.embeddingLevel & 1) == 1);
boolean isBackward = (isOddLevel && writingDirection == WritingDirection.LEFT_TO_RIGHT) | (!isOddLevel && writingDirection == WritingDirection.RIGHT_TO_LEFT);
ShapingOrder shapingOrder = (isBackward ? ShapingOrder.BACKWARD : ShapingOrder.FORWARD);
locator.reset(scriptRun.charStart, scriptRun.charEnd);
shapingEngine.setScriptTag(scriptTag);
shapingEngine.setWritingDirection(writingDirection);
shapingEngine.setShapingOrder(shapingOrder);
resolveTypefaces(text, spanned, runs, locator, shapingEngine, bidiRun.embeddingLevel);
}
}
paragraphs.add(paragraph);
breaks[paragraph.getCharStart()] |= backwardType;
breaks[paragraph.getCharEnd() - 1] |= forwardType;
paragraphStart = paragraph.getCharEnd();
}
} finally {
if (shapingEngine != null) {
shapingEngine.dispose();
}
if (bidiAlgorithm != null) {
bidiAlgorithm.dispose();
}
}
}
use of com.mta.tehreer.unicode.BidiRun in project Tehreer-Android by mta452.
the class ParagraphCollection method forEachLineRun.
public void forEachLineRun(int lineStart, int lineEnd, @NonNull RunConsumer runConsumer) {
int paragraphIndex = binarySearch(lineStart);
BidiParagraph directionalParagraph = get(paragraphIndex);
boolean isRTL = (directionalParagraph.getBaseLevel() & 1) == 1;
if (isRTL) {
int paragraphEnd = directionalParagraph.getCharEnd();
if (paragraphEnd < lineEnd) {
paragraphIndex = binarySearch(lineEnd - 1);
}
}
int next = (isRTL ? -1 : 1);
int feasibleStart;
int feasibleEnd;
do {
BidiParagraph bidiParagraph = get(paragraphIndex);
feasibleStart = Math.max(bidiParagraph.getCharStart(), lineStart);
feasibleEnd = Math.min(bidiParagraph.getCharEnd(), lineEnd);
BidiLine bidiLine = bidiParagraph.createLine(feasibleStart, feasibleEnd);
List<BidiRun> bidiRuns = bidiLine.getVisualRuns();
int runCount = bidiRuns.size();
for (int i = 0; i < runCount; i++) {
runConsumer.accept(bidiRuns.get(i));
}
bidiLine.dispose();
paragraphIndex += next;
} while (isRTL ? feasibleStart != lineStart : feasibleEnd != lineEnd);
}
use of com.mta.tehreer.unicode.BidiRun in project Tehreer-Android by mta452.
the class Typesetter method addContinuousLineRuns.
private void addContinuousLineRuns(int charStart, int charEnd, BidiRunConsumer runConsumer) {
int paragraphIndex = indexOfBidiParagraph(charStart);
int feasibleStart;
int feasibleEnd;
do {
BidiParagraph bidiParagraph = mBidiParagraphs.get(paragraphIndex);
feasibleStart = Math.max(bidiParagraph.getCharStart(), charStart);
feasibleEnd = Math.min(bidiParagraph.getCharEnd(), charEnd);
BidiLine bidiLine = bidiParagraph.createLine(feasibleStart, feasibleEnd);
for (BidiRun bidiRun : bidiLine.getVisualRuns()) {
runConsumer.accept(bidiRun);
}
bidiLine.dispose();
paragraphIndex++;
} while (feasibleEnd != charEnd);
}
use of com.mta.tehreer.unicode.BidiRun in project Tehreer-Android by mta452.
the class Typesetter method resolveBidi.
private void resolveBidi() {
// TODO: Analyze script runs.
BidiAlgorithm bidiAlgorithm = null;
ShapingEngine shapingEngine = null;
try {
bidiAlgorithm = new BidiAlgorithm(mText);
shapingEngine = new ShapingEngine();
BaseDirection baseDirection = BaseDirection.DEFAULT_LEFT_TO_RIGHT;
byte forwardType = specializeBreakType(BREAK_TYPE_PARAGRAPH, true);
byte backwardType = specializeBreakType(BREAK_TYPE_PARAGRAPH, false);
int paragraphStart = 0;
int suggestedEnd = mText.length();
while (paragraphStart != suggestedEnd) {
BidiParagraph paragraph = bidiAlgorithm.createParagraph(paragraphStart, suggestedEnd, baseDirection);
for (BidiRun bidiRun : paragraph.getLogicalRuns()) {
int scriptTag = SfntTag.make(bidiRun.isRightToLeft() ? "arab" : "latn");
WritingDirection writingDirection = ShapingEngine.getScriptDirection(scriptTag);
shapingEngine.setScriptTag(scriptTag);
shapingEngine.setWritingDirection(writingDirection);
resolveTypefaces(bidiRun.charStart, bidiRun.charEnd, bidiRun.embeddingLevel, shapingEngine);
}
mBidiParagraphs.add(paragraph);
mBreakRecord[paragraph.getCharStart()] |= backwardType;
mBreakRecord[paragraph.getCharEnd() - 1] |= forwardType;
paragraphStart = paragraph.getCharEnd();
}
} finally {
if (shapingEngine != null) {
shapingEngine.dispose();
}
if (bidiAlgorithm != null) {
bidiAlgorithm.dispose();
}
}
}
Aggregations