コード例 #1
0
ファイル: TextBlockElement.cs プロジェクト: lmingle/library
        public TextMeasurementResult?Measure(TextMeasurementRequest request)
        {
            Element.VisitChildren(x => (x as IStateResettable)?.ResetState());
            Element.VisitChildren(x => x.Initialize(request.PageContext, request.Canvas));

            var measurement = Element.Measure(new Size(request.AvailableWidth, Size.Max.Height));

            if (measurement.Type != SpacePlanType.FullRender)
            {
                return(null);
            }

            return(new TextMeasurementResult
            {
                Width = measurement.Width,

                Ascent = -measurement.Height,
                Descent = 0,

                LineHeight = 1,

                StartIndex = 0,
                EndIndex = 0,
                TotalIndex = 0
            });
        }
コード例 #2
0
 public override TextMeasurementResult?Measure(TextMeasurementRequest request)
 {
     UpdatePageNumberText(request.PageContext);
     return(MeasureWithoutCache(request));
 }
コード例 #3
0
 public override TextMeasurementResult?Measure(TextMeasurementRequest request)
 {
     return(MeasureWithoutCache(request));
 }
コード例 #4
0
        public IEnumerable <TextLine> DivideTextItemsIntoLines(float availableWidth, float availableHeight)
        {
            var queue            = new Queue <ITextBlockItem>(RenderingQueue);
            var currentItemIndex = CurrentElementIndex;
            var currentHeight    = 0f;

            while (queue.Any())
            {
                var line = GetNextLine();

                if (!line.Elements.Any())
                {
                    yield break;
                }

                if (currentHeight + line.LineHeight > availableHeight + Size.Epsilon)
                {
                    yield break;
                }

                currentHeight += line.LineHeight;
                yield return(line);
            }

            TextLine GetNextLine()
            {
                var currentWidth = 0f;

                var currentLineElements = new List <TextLineElement>();

                while (true)
                {
                    if (!queue.Any())
                    {
                        break;
                    }

                    var currentElement = queue.Peek();

                    var measurementRequest = new TextMeasurementRequest
                    {
                        Canvas      = Canvas,
                        PageContext = PageContext,

                        StartIndex     = currentItemIndex,
                        AvailableWidth = availableWidth - currentWidth,

                        IsFirstElementInBlock = currentElement == Items.First(),
                        IsFirstElementInLine  = !currentLineElements.Any()
                    };

                    var measurementResponse = currentElement.Measure(measurementRequest);

                    if (measurementResponse == null)
                    {
                        break;
                    }

                    currentLineElements.Add(new TextLineElement
                    {
                        Item        = currentElement,
                        Measurement = measurementResponse
                    });

                    currentWidth    += measurementResponse.Width;
                    currentItemIndex = measurementResponse.NextIndex;

                    if (!measurementResponse.IsLast)
                    {
                        break;
                    }

                    currentItemIndex = 0;
                    queue.Dequeue();
                }

                return(TextLine.From(currentLineElements));
            }
        }