public void Initialize(Run* run, SCRIPT_ANALYSIS* scriptAnalysis, int charIndexInParagraph, int charCount) { this.run = *run; if (this.run.RunKind == RunKind.Text) this.run.CharCount = charCount; CharIndexInParagraph = charIndexInParagraph; ScriptAnalysis = *scriptAnalysis; }
private static void SplitScriptRuns(ScriptParagraph* scriptParagraph, Run* runs, int runCount, SCRIPT_ITEM* scriptItems, int scriptItemCount) { // Reserve space for the largest possible number of script runs. int maxScriptRuns = runCount + scriptItemCount; scriptParagraph->EnsureScriptRunCapacity(maxScriptRuns); // Merge Runs and SCRIPT_ITEMs to create ScriptRuns. Run* run = runs; int runStartCharIndex = 0; Run* endRun = runs + runCount; SCRIPT_ITEM* item = scriptItems; SCRIPT_ITEM* endItem = scriptItems + scriptItemCount; ScriptRun* startScriptRun = scriptParagraph->ScriptRuns; ScriptRun* scriptRun = startScriptRun; int currentCharIndex = 0; for (; ; scriptRun++) { int runEndCharIndex = runStartCharIndex + run->CharCount; int itemEndCharIndex = (item + 1)->iCharPos; if (itemEndCharIndex < runEndCharIndex) { scriptRun->Initialize(run, &item->a, currentCharIndex, itemEndCharIndex - currentCharIndex); currentCharIndex = itemEndCharIndex; item++; } else if (runEndCharIndex < itemEndCharIndex) { scriptRun->Initialize(run, &item->a, currentCharIndex, runEndCharIndex - currentCharIndex); runStartCharIndex = currentCharIndex = runEndCharIndex; run++; } else { scriptRun->Initialize(run, &item->a, currentCharIndex, runEndCharIndex - currentCharIndex); runStartCharIndex = currentCharIndex = runEndCharIndex; run++; item++; // All sequences of Runs and Items should always end on the same char so we only // need to check for termination here. if (run == endRun) { Debug.Assert(item == endItem, "Inconsistent Run and SCRIPT_ITEM sequences."); break; } } } scriptParagraph->ScriptRunCount = (int)(scriptRun - startScriptRun) + 1; }
public void InitializeTruncatedCopy(ScriptRun* scriptRun, int truncatedLeadingCharsCount, int truncatedTrailingCharsCount) { this.run = scriptRun->run; if (this.run.RunKind == RunKind.Text) this.run.CharCount = scriptRun->CharCount - truncatedLeadingCharsCount - truncatedTrailingCharsCount; ScriptAnalysis = scriptRun->ScriptAnalysis; CharIndexInParagraph = scriptRun->CharIndexInParagraph + truncatedLeadingCharsCount; }