Search in sources :

Example 1 with BidiRun

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");
    }
}
Also used : SparseIntArray(android.util.SparseIntArray) BidiRun(com.mta.tehreer.unicode.BidiRun)

Example 2 with BidiRun

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();
        }
    }
}
Also used : ShapingEngine(com.mta.tehreer.sfnt.ShapingEngine) BidiRun(com.mta.tehreer.unicode.BidiRun) ScriptClassifier(com.mta.tehreer.unicode.ScriptClassifier) Paint(android.graphics.Paint) ShapingOrder(com.mta.tehreer.sfnt.ShapingOrder) BaseDirection(com.mta.tehreer.unicode.BaseDirection) ScriptRun(com.mta.tehreer.unicode.ScriptRun) BidiParagraph(com.mta.tehreer.unicode.BidiParagraph) WritingDirection(com.mta.tehreer.sfnt.WritingDirection) BidiAlgorithm(com.mta.tehreer.unicode.BidiAlgorithm)

Example 3 with BidiRun

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);
}
Also used : BidiRun(com.mta.tehreer.unicode.BidiRun) BidiParagraph(com.mta.tehreer.unicode.BidiParagraph) BidiLine(com.mta.tehreer.unicode.BidiLine)

Example 4 with BidiRun

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);
}
Also used : BidiRun(com.mta.tehreer.unicode.BidiRun) BidiParagraph(com.mta.tehreer.unicode.BidiParagraph) BidiLine(com.mta.tehreer.unicode.BidiLine)

Example 5 with BidiRun

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();
        }
    }
}
Also used : ShapingEngine(com.mta.tehreer.sfnt.ShapingEngine) BaseDirection(com.mta.tehreer.unicode.BaseDirection) BidiRun(com.mta.tehreer.unicode.BidiRun) BidiParagraph(com.mta.tehreer.unicode.BidiParagraph) WritingDirection(com.mta.tehreer.sfnt.WritingDirection) BidiAlgorithm(com.mta.tehreer.unicode.BidiAlgorithm)

Aggregations

BidiRun (com.mta.tehreer.unicode.BidiRun)6 BidiParagraph (com.mta.tehreer.unicode.BidiParagraph)4 BidiLine (com.mta.tehreer.unicode.BidiLine)3 ShapingEngine (com.mta.tehreer.sfnt.ShapingEngine)2 WritingDirection (com.mta.tehreer.sfnt.WritingDirection)2 BaseDirection (com.mta.tehreer.unicode.BaseDirection)2 BidiAlgorithm (com.mta.tehreer.unicode.BidiAlgorithm)2 Paint (android.graphics.Paint)1 SparseIntArray (android.util.SparseIntArray)1 ShapingOrder (com.mta.tehreer.sfnt.ShapingOrder)1 ScriptClassifier (com.mta.tehreer.unicode.ScriptClassifier)1 ScriptRun (com.mta.tehreer.unicode.ScriptRun)1