private void BuildParagraph(BuildingContext context, int paragraphIndex) { var para = context.Text.Paragraphs[paragraphIndex]; ApplyMarginUp(context, para); var subspans = BuildParagraphSubspans(context, paragraphIndex); var flushedSubspanCount = 0; while (flushedSubspanCount < subspans.Count) { var minimalSubspans = new SubList <Subspan>(subspans, flushedSubspanCount, 0); for (var i = flushedSubspanCount; i < subspans.Count; i++) { minimalSubspans = minimalSubspans.WithNext(); if (subspans[i].CanBreakAfter) { break; } } if (!TryAllocateNewStrip(context, minimalSubspans)) { return; } var subspansToFlush = minimalSubspans; var subspansToTry = subspansToFlush.WithNext(); var tabOffset = context.Text.Paragraphs[paragraphIndex].Style.TabCount * 80f; while (flushedSubspanCount + subspansToFlush.Count < subspans.Count && CanFitSubspans(context, subspansToTry, tabOffset)) { subspansToFlush = subspansToTry; subspansToTry = subspansToFlush.WithNext(); } var isFirstStrip = flushedSubspanCount == 0; var isLastStrip = flushedSubspanCount + subspansToFlush.Count == subspans.Count; FlushStrip(context, paragraphIndex, tabOffset, subspansToFlush, isFirstStrip, isLastStrip); flushedSubspanCount += subspansToFlush.Count; } }