コード例 #1
0
        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);
        }
コード例 #2
0
 public RedrawLineResult(LineInfo2 lineInfo, DrawingGroup drawingGroup, in double lineMaxX, in double lineMaxY,