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)); }
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(); }