Example #1
0
        public async Task RenderRow(TablatureRenderingContext renderingContext, List <BarRenderer> barRenderers, Point location, Size availableSize, bool isFirstRow)
        {
            var rowRenderingContext = new RowRenderingContext(renderingContext, location, availableSize);

            barRenderers.AssignRenderingContexts(rowRenderingContext);

            var availableWidth = availableSize.Width;
            var count          = barRenderers.Count;
            var averageWidth   = availableWidth / count;

            foreach (var bar in barRenderers)
            {
                await bar.MeasureMinSize(renderingContext.PrimitiveRenderer);
            }

            foreach (var bar in barRenderers.OrderByDescending(b => b.GetMinSize()))
            {
                var minSize = bar.GetMinSize();
                if (minSize < averageWidth)
                {
                    break;
                }

                --count;
                availableWidth -= minSize;
                averageWidth    = availableWidth / count;
            }


            for (int i = 0; i < barRenderers.Count; i++)
            {
                var bar     = barRenderers[i];
                var minSize = bar.GetMinSize();
                var width   = Math.Min(availableSize.Width, Math.Max(minSize, averageWidth));
                var size    = new Size(width, availableSize.Height);

                var inRowPosition = i == 0
                    ? BarInRowPosition.First
                    : i == barRenderers.Count - 1
                        ? BarInRowPosition.Last
                        : BarInRowPosition.Middle;

                await bar.Render(location, size, inRowPosition);


                location.X += size.Width;
            }


            rowRenderingContext.FinishHorizontalBarLines(availableSize.Width);
            //rowRenderingContext.DebugDrawHeightMaps();
            rowRenderingContext.BeginPostRender();

            foreach (var bar in barRenderers)
            {
                await bar.PostRender();
            }

            renderingContext.PreviousDocumentState = rowRenderingContext.PreviousDocumentState;
        }
Example #2
0
        public async Task Render(RenderingContext rootRc, Point location, Size size)
        {
            this.RenderingContext = rootRc;

            this.PrimitiveRenderer.Clear();
            var tablatureRc = new TablatureRenderingContext(rootRc, this.PrimitiveRenderer, this.Style);

            await this.RenderBars(tablatureRc, location, size);
        }
Example #3
0
        private async Task RenderBars(TablatureRenderingContext renderingContext, Point location, Size availableSize)
        {
            var startY = location.Y;

            var isFirstRow = true;

            var caret      = this.Style.FirstRowIndention;
            var barIndex   = 0;
            var barRenders = new List <BarRenderer>();

            // ReSharper disable once AccessToModifiedClosure
            while (barIndex < this.Tablature.Bars.Length)
            {
                if (barRenders.Count < this.Style.RegularBarsPerRow)
                {
                    var barRenderer = _barRenderers[barIndex];
                    var minWidth    = await barRenderer.MeasureMinSize(renderingContext.PrimitiveRenderer);

                    if (caret + minWidth <= availableSize.Width || barRenders.Count == 0)
                    {
                        barRenders.Add(barRenderer);
                        caret += minWidth;
                        ++barIndex;
                        continue;
                    }
                }

                var height = availableSize.Height - location.Y + startY;
                if (height <= 0)
                {
                    return;
                }

                await this.RenderRow(renderingContext, barRenders, location,
                                     new Size(availableSize.Width,
                                              availableSize.Height - location.Y + startY),
                                     isFirstRow);

                location.Y += this.Style.BarTopMargin + this.Style.BarLineHeight * this.Style.StringCount + this.Style.BarBottomMargin;
                // todo: handle new page

                isFirstRow = false;
                barRenders.Clear();
                caret = 0;
            }

            if (barRenders.Count > 0)
            {
                await this.RenderRow(renderingContext, barRenders, location,
                                     new Size(availableSize.Width,
                                              availableSize.Height - location.Y + startY),
                                     isFirstRow);
            }
        }