public static unsafe CustomTextSource4 InnerUpdateAsync(MainUpdateParameters mainUpdateParameters, Func <CustomTextSource4> makeSource) { LinkedListNode <CharInfo> charInfoNode = null; const int batchLines = 100; var lineInfos0 = new LineInfo2[batchLines]; var lineInfos1 = new LineInfo2[batchLines]; var lineInfos = lineInfos0; int @switch = 0; mainUpdateParameters.DebugFn?.Invoke($"{nameof(InnerUpdateAsync)}", 5); var tf = CreateTypeface(new FontFamily(mainUpdateParameters.FaceName), FontStyles.Normal, FontStretches.Normal, mainUpdateParameters.FontWeight); var currentRendering = FontRendering.CreateInstance(mainUpdateParameters.FontSize, TextAlignment.Left, null, Brushes.Black, tf); var customTextSource4 = makeSource(); var myGroup = new DrawingGroup(); var myDc = myGroup.Open(); var genericTextParagraphProperties = new GenericTextParagraphProperties(currentRendering, mainUpdateParameters.PixelsPerDip); var runsInfos = new List <TextRunInfo>(); var allCharInfos = new LinkedList <CharInfo>(); var textStorePosition = mainUpdateParameters.TextStorePosition; var lineNo = mainUpdateParameters.LineNo; // var tasks = new List<Task>(); var linePosition = mainUpdateParameters.LinePosition; var liIndex = 0; while (textStorePosition < customTextSource4.Length) { var runCount = customTextSource4.Runs.Count; #if DEBUGTEXTSOURCE Debug.WriteLine("Runcount = " + runCount); #endif var numPages = 0; var pageBegin = new Point(0, 0); var pageEnd = new Point(0, 0); if (mainUpdateParameters.Paginate) { // ReSharper disable once PossibleInvalidOperationException pageEnd.Offset(mainUpdateParameters.PageSize.Value.Width, mainUpdateParameters.PageSize.Value.Height); } LineInfo2 lineInfo; var linePositionX = mainUpdateParameters.ParagraphWidth - linePosition.X; if (linePositionX < 0) { linePositionX = 0; } using (var myTextLine = mainUpdateParameters.TextFormatter.FormatLine(customTextSource4, textStorePosition, linePositionX, genericTextParagraphProperties, null)) { var nRuns = customTextSource4.Runs.Count - runCount; if (nRuns < 0) { throw new InvalidOperationException("NRuns is negative" + nRuns); } #if DEBUGTEXTSOURCE Debug.WriteLine("num runs for line is " + nRuns); #endif var curCharInfoNode = charInfoNode; HandleLine(allCharInfos, linePosition, myTextLine, customTextSource4, runCount, nRuns, lineNo, textStorePosition, runsInfos, curCharInfoNode, out charInfoNode, mainUpdateParameters.DebugFn); myTextLine.Draw(myDc, linePosition, InvertAxes.None); lineInfos[liIndex++] = new LineInfo2(lineNo, curCharInfoNode != null? curCharInfoNode.Next : allCharInfos.First, textStorePosition, linePosition, myTextLine.Height, myTextLine.Length); linePosition.Y += myTextLine.Height; lineNo++; // Update the index position in the text store. textStorePosition += myTextLine.Length; if (mainUpdateParameters.Paginate && linePosition.Y >= pageEnd.Y) { Debug.WriteLine($"numPages: {numPages}"); numPages++; } } #if GROUPEDDG if (lineNo > 0 && lineNo % batchLines == 0) { myDc.Close(); myGroup.Freeze(); var curUi = new UpdateInfo() { DrawingGroup = myGroup, CharInfos = allCharInfos.ToList <CharInfo>() }; await mainUpdateParameters.ChannelWriter.WriteAsync(curUi); // tasks.Add(writeAsync.AsTask()); myGroup = new DrawingGroup(); myDc = myGroup.Open(); } #else if (lineNo <= 0 || lineNo % batchLines != 0) { continue; } myDc.Close(); myGroup.Freeze(); var curUi = new UpdateInfo( myGroup, liIndex, lineInfos ); liIndex = 0; if (@switch == 0) { lineInfos = lineInfos1; @switch = 1; } else { lineInfos = lineInfos0; @switch = 0; } mainUpdateParameters.ChannelWriter.WriteAsync(curUi); myGroup = new DrawingGroup(); myDc = myGroup.Open(); #endif } customTextSource4.RunInfos = runsInfos; #if GROUPEDDG if (lineNo % 100 != 0) { myDc.Close(); myGroup.Freeze(); var curUi = new UpdateInfo() { DrawingGroup = myGroup, CharInfos = Enumerable.ToList <CharInfo>(allCharInfos), FinalBlock = true }; await mainUpdateParameters.ChannelWriter.WriteAsync(curUi); // tasks.Add(writeAsync.AsTask()); } else { myDc.Close(); } #else if (lineNo % batchLines == 0) { return(customTextSource4); } { myDc.Close(); myGroup.Freeze(); var curUi = new UpdateInfo( myGroup, liIndex, lineInfos ); mainUpdateParameters.ChannelWriter.WriteAsync(curUi); } #endif // await Task.WhenAll(tasks); return(customTextSource4); }
public RedrawLineResult(LineInfo2 lineInfo, DrawingGroup drawingGroup, in double lineMaxX, in double lineMaxY,