/// <summary> /// /// </summary> /// <param name="pixelsPerDip"></param> /// <param name="tf"></param> /// <param name="st"></param> /// <param name="node"></param> /// <param name="compilation"></param> /// <param name="fontSize"></param> /// <param name="pDebugFn"></param> /// <returns></returns> public static CustomTextSource4 CreateAndInitTextSource(double pixelsPerDip, Typeface tf, SyntaxTree st, SyntaxNode node, Compilation compilation, double fontSize, RoslynCodeBase.DebugDelegate pDebugFn) { if (st == null) { st = SyntaxFactory.ParseSyntaxTree(""); node = st.GetRoot(); compilation = null; } var textDecorationCollection = new TextDecorationCollection(); var typeface = tf; var fontRendering = FontRendering.CreateInstance(fontSize, TextAlignment.Left, textDecorationCollection, Brushes.Black, typeface); var genericTextRunProperties = new GenericTextRunProperties( fontRendering, pixelsPerDip); var source = new CustomTextSource4(pixelsPerDip, fontRendering, genericTextRunProperties, pDebugFn) { EmSize = fontSize, Compilation = compilation, Tree = st, Node = node }; //source.PropertyChanged += x; source.Init(); return(source); }
private static CustomTextSource4 CreateCustomTextSource4( TextSourceInitializationParameters p) { var customTextSource4 = CommonText.CreateAndInitTextSource(p.PixelsPerDip, p.Tf, p.Tree, p.Node0, p.Compilation, p.EmSize0, p.DebugFn); customTextSource4.CurrentRendering = FontRendering.CreateInstance(p.EmSize0, TextAlignment.Left, new TextDecorationCollection(), Brushes.Black, p.Tf); return(customTextSource4); }
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); }