Beispiel #1
0
        public Coordinate GetFromOperated(List <CommentInformation> operatedComments, CommentInformation currentComment,
                                          double videoDuration, double commentDuration, double time, ICanvas canvas, RelativeValue fontHeight)
        {
            var canvasWidth    = canvas.CanvasWidth;
            var vpos1          = GetActualVpos(currentComment.Content.Vpos, videoDuration, commentDuration);
            var y              = Math.Max(0, currentComment.LastY.GetActual(canvas));
            var firstCollision = true;
            var currentWidth   = currentComment.Size.Width.GetActual(canvas);

            for (int i = 0; i < operatedComments.Count; i++)
            {
                var operatedComment = operatedComments[i];
                var vpos2           = GetActualVpos(operatedComment.Content.Vpos, videoDuration, commentDuration);
                var operatedWidth   = operatedComment.Size.Width.GetActual(canvas);

                var a = GetPositionX(vpos1, vpos2 / 100.0 + commentDuration, currentWidth, canvasWidth, commentDuration);
                var b = GetPositionX(vpos2, vpos1 / 100.0, operatedWidth, canvasWidth, commentDuration) + operatedWidth;
                var c = GetPositionX(vpos2, vpos1 / 100.0 + commentDuration, operatedWidth, canvasWidth, commentDuration);
                var d = GetPositionX(vpos1, vpos2 / 100.0, currentWidth, canvasWidth, commentDuration) + currentWidth;

                if (
                    CheckY(y, operatedComment.LastY.GetActual(canvas), fontHeight.GetActual(canvas)) &&
                    (!(((b < canvasWidth) && (0 < a) && (vpos2 <= vpos1)) || ((c < canvasWidth) && (0 < d) && (vpos1 < vpos2))))
                    )
                {
                    i = -1;
                    if (firstCollision)
                    {
                        firstCollision = false;
                        y = 0;
                    }
                    else
                    {
                        y += fontHeight.GetActual(canvas);
                    }
                }
            }
            var x = GetPositionX(vpos1, time, currentWidth, canvasWidth, commentDuration);

            return(new Coordinate(x, y));
        }
Beispiel #2
0
        public void Draw(ICanvas canvas, IVideo video)
        {
            canvas.Init();
            var time = video.CurrentSecond;

            var RangesTop    = new List <Range>();
            var RangesBottom = new List <Range>();

            double commentDuration  = this.CommentDuration;
            var    operatedComments = new List <CommentInformation>();

            foreach (var comment in Comments)
            {
                canvas.FontKind = FontKind.Default;

                var vpos = GetActualVpos(comment.Content.Vpos, video.Duration, commentDuration);
                if (time - commentDuration >= vpos / 100.0 || vpos / 100.0 >= time)
                {
                    continue;
                }
                var mails = comment.Content.Mail.Split(' ');
                if (ContainsCommand(mails, "invisible"))
                {
                    continue;
                }

                if (!comment.FontSize.Unset)
                {
                }
                else if (ContainsCommand(mails, "small"))
                {
                    comment.FontSize = FontSizeSmall;
                }
                else if (ContainsCommand(mails, "big"))
                {
                    comment.FontSize = FontSizeBig;
                }
                else
                {
                    comment.FontSize = FontSizeDefault;
                }

                canvas.FontSize = comment.FontSize.GetActual(canvas);
                var fontSizeActual = comment.FontSize.GetActual(canvas);

                if (ContainsCommand(mails, "mincho"))
                {
                    canvas.FontKind = FontKind.Mincho;
                }
                else if (ContainsCommand(mails, "gothic"))
                {
                    canvas.FontKind = FontKind.Gothic;
                }
                else
                {
                    canvas.FontKind = FontKind.Default;
                }

                var r = new Coordinate();

                var commentSize = new Size();
                if (!comment.Size.Width.Unset)
                {
                    commentSize = new Size(comment.Size.Width.GetActual(canvas), comment.Size.Height.GetActual(canvas));
                }
                else
                {
                    commentSize  = canvas.MeasureText(comment.Content);
                    comment.Size = new RelativeSquare(commentSize.Width, commentSize.Height, canvas);
                }

                if (ContainsCommand(mails, "ue") || ContainsCommand(mails, "shita"))
                {
                    if (commentSize.Width > canvas.CanvasWidth + 1)
                    {
                        comment.FontSize         *= canvas.CanvasWidth / commentSize.Width;
                        comment.FontSize.Relative = Math.Max(comment.FontSize.Relative, GetRelativeSize(1, canvas));
                        canvas.FontSize           = comment.FontSize.GetActual(canvas);
                        fontSizeActual            = comment.FontSize.GetActual(canvas);

                        commentSize  = canvas.MeasureText(comment.Content);
                        comment.Size = new RelativeSquare(commentSize.Width, commentSize.Height, canvas);
                    }
                }

                bool overFlow = false;
                if (ContainsCommand(mails, "ue"))
                {
                    r = new Coordinate(canvas.CanvasWidth / 2.0 - commentSize.Width / 2.0, Math.Max(0, comment.LastY.GetActual(canvas)));
                    var changed = false;
                    while (!CheckRanges(RangesTop, new Range(r.Y, r.Y + fontSizeActual)))
                    {
                        r.Y    += fontSizeActual;
                        changed = true;
                    }
                    if (changed)
                    {
                        foreach (var range in RangesTop)
                        {
                            if (range.B < r.Y && CheckRanges(RangesTop, new Range(range.B, range.B + fontSizeActual)))
                            {
                                r.Y = range.B;
                            }
                        }
                    }
                    canvas.Baseline = Baseline.Top;
                    comment.LastY   = new RelativeValue(r.Y, canvas);
                    RangesTop.Add(new Range(r.Y, r.Y + fontSizeActual));

                    overFlow = FixOverflow(ref r.Y, canvas.CanvasHeight, canvas);
                }
                else if (ContainsCommand(mails, "shita"))
                {
                    r = new Coordinate(canvas.CanvasWidth / 2.0 - commentSize.Width / 2.0, Math.Max(0, comment.LastY.GetActual(canvas)));
                    var changed = false;
                    while (!CheckRanges(RangesBottom, new Range(r.Y, r.Y + fontSizeActual)))
                    {
                        r.Y    += fontSizeActual;
                        changed = true;
                    }
                    if (changed)
                    {
                        foreach (var range in RangesBottom)
                        {
                            if (range.B < r.Y && CheckRanges(RangesBottom, new Range(range.B, range.B + fontSizeActual)))
                            {
                                r.Y = range.B;
                            }
                        }
                    }
                    canvas.Baseline = Baseline.Bottom;
                    comment.LastY   = new RelativeValue(r.Y, canvas);
                    RangesBottom.Add(new Range(r.Y, r.Y + fontSizeActual));

                    overFlow = FixOverflow(ref r.Y, canvas.CanvasHeight, canvas);

                    r.Y = canvas.CanvasHeight - r.Y;
                }
                else
                {
                    r               = GetFromOperated(operatedComments, comment, video.Duration, commentDuration, time, canvas, FontSizeDefault);
                    comment.LastY   = new RelativeValue(r.Y, canvas);
                    canvas.Baseline = Baseline.Middle;

                    overFlow = FixOverflow(ref r.Y, canvas.CanvasHeight, canvas);

                    r.Y += FontSizeDefault.GetActual(canvas) / 2.0;
                    operatedComments.Add(comment);
                }
                var color = GetColorFromMail(comment.Content.Mail);
                canvas.FillText(comment.Content, r, color, overFlow);
            }
            canvas.Done();
        }