protected override void SetupRender() { _textClass = new List <TextClass>(); _text = TextMode == TextMode.Normal || TextSource == TextSource.MarkCollection ? TextLines.Where(x => !String.IsNullOrEmpty(x)).ToList() : SplitTextIntoCharacters(TextLines); if (TextSource != TextSource.None) { SetupMarks(); } if (TargetPositioning == TargetPositioningType.Locations) { // Adjust the font size for Location support, default will ensure when swicthing between string and location that the Font will be the same visual size. // Font is further adjusted using the scale text slider. double newFontSize = ((StringCount - ((StringCount - Font.Size) / 100) * 100)) * ((double)BufferHt / StringCount); _font = new Font(Font.FontFamily.Name, (int)newFontSize, Font.Style); _newFontSize = _font.Size; return; } double scaleFactor = ScalingTools.GetScaleFactor(); _font = new Font(Font.FontFamily, Font.Size / (float)scaleFactor, Font.Style); _newFontSize = _font.Size; }
private void InitialRender(int frame, Bitmap bitmap) { using (Graphics graphics = Graphics.FromImage(bitmap)) { var text = TextMode == TextMode.Normal ? TextLines.Where(x => !String.IsNullOrEmpty(x)).ToList() : SplitTextIntoCharacters(TextLines); int numberLines = text.Count(); SizeF textsize = new SizeF(0, 0); foreach (string t in text) { if (!String.IsNullOrEmpty(t)) { var size = graphics.MeasureString(t, _font); if (size.Width > textsize.Width) { textsize = size; } } } _maxTextSize = Convert.ToInt32(textsize.Width * .95); var intervalPos = GetEffectTimeIntervalPosition(frame); var intervalPosFactor = intervalPos * 100; int maxht = Convert.ToInt32(textsize.Height * numberLines); int xOffset = CalculateXOffset(intervalPosFactor); int yOffset = CalculateYOffset(intervalPosFactor); switch (Direction) { case TextDirection.Left: case TextDirection.Right: xOffset = 0; break; case TextDirection.Up: case TextDirection.Down: yOffset = 0; break; } int offsetLeft = (((BufferWi - _maxTextSize) / 2) * 2 + xOffset) / 2; int offsetTop = (((BufferHt - maxht) / 2) * 2 + yOffset) / 2; double intervalPosition = (GetEffectTimeIntervalPosition(frame) * Speed) % 1; Point point; switch (Direction) { case TextDirection.Left: // left int leftX = BufferWi - (int)(intervalPosition * (textsize.Width + BufferWi)); point = new Point(Convert.ToInt32(CenterStop ? Math.Max(leftX, (BufferWi - (int)textsize.Width) / 2) : leftX), offsetTop); DrawText(text, graphics, point); break; case TextDirection.Right: // right int rightX = -_maxTextSize + (int)(intervalPosition * (_maxTextSize + BufferWi)); point = new Point(Convert.ToInt32(CenterStop ? Math.Min(rightX, (BufferWi - (int)textsize.Width) / 2) : rightX), offsetTop); DrawText(text, graphics, point); break; case TextDirection.Up: // up int upY = BufferHt - (int)(((textsize.Height * numberLines) + BufferHt) * intervalPosition); point = new Point(offsetLeft, Convert.ToInt32(CenterStop ? Math.Max(upY, (BufferHt - (int)(textsize.Height * numberLines)) / 2) : upY)); DrawText(text, graphics, point); break; case TextDirection.Down: // down int downY = -(int)(textsize.Height * numberLines) + (int)(((textsize.Height * numberLines) + BufferHt) * intervalPosition); point = new Point(offsetLeft, Convert.ToInt32(CenterStop ? Math.Min(downY, (BufferHt - (int)(textsize.Height * numberLines)) / 2) : downY)); DrawText(text, graphics, point); break; default: // no movement - centered point = new Point(((BufferWi - _maxTextSize) / 2) + xOffset, offsetTop); DrawText(text, graphics, point); break; } } }
private void InitialRender(int frame, Bitmap bitmap) { var intervalPos = GetEffectTimeIntervalPosition(frame); var intervalPosFactor = intervalPos * 100; var textAngle = CalculateAngle(intervalPosFactor); using (Graphics graphics = Graphics.FromImage(bitmap)) { var text = TextMode == TextMode.Normal ? TextLines.Where(x => !String.IsNullOrEmpty(x)).ToList() : SplitTextIntoCharacters(TextLines); int numberLines = text.Count(); SizeF textsize = new SizeF(0, 0); //Adjust Font Size based on the Font scaling factor _newFontSize = _font.SizeInPoints * (CalculateFontScale(intervalPosFactor) / 100); _newfont = new Font(Font.FontFamily.Name, _newFontSize, Font.Style); foreach (string t in text) { if (!String.IsNullOrEmpty(t)) { var size = graphics.MeasureString(t, _newfont); if (size.Width > textsize.Width) { textsize = size; } } } _maxTextSize = Convert.ToInt32(textsize.Width * .95); int maxht = Convert.ToInt32(textsize.Height * numberLines); int xOffset = CalculateXOffset(intervalPosFactor); int yOffset = CalculateYOffset(intervalPosFactor); //Rotate the text based off the angle setting if (Direction == TextDirection.Rotate) { //move rotation point to center of image graphics.TranslateTransform((float)(bitmap.Width / 2 + xOffset), (float)(bitmap.Height / 2 + (yOffset / 2))); //rotate graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.RotateTransform(textAngle); //move image back graphics.TranslateTransform(-(float)(bitmap.Width / 2 + xOffset), -(float)(bitmap.Height / 2 + (yOffset / 2))); } switch (Direction) { case TextDirection.Left: case TextDirection.Right: xOffset = 0; break; case TextDirection.Up: case TextDirection.Down: yOffset = 0; break; } int offsetLeft = (((BufferWi - _maxTextSize) / 2) * 2 + xOffset) / 2; int offsetTop = (((BufferHt - maxht) / 2) * 2 + yOffset) / 2; double intervalPosition = (GetEffectTimeIntervalPosition(frame) * Speed) % 1; Point point; switch (Direction) { case TextDirection.Left: // left int leftX = BufferWi - (int)(intervalPosition * (textsize.Width + BufferWi)); point = new Point(Convert.ToInt32(CenterStop ? Math.Max(leftX, (BufferWi - (int)textsize.Width) / 2) : leftX), offsetTop); DrawText(text, graphics, point); break; case TextDirection.Right: // right int rightX = -_maxTextSize + (int)(intervalPosition * (_maxTextSize + BufferWi)); point = new Point(Convert.ToInt32(CenterStop ? Math.Min(rightX, (BufferWi - (int)textsize.Width) / 2) : rightX), offsetTop); DrawText(text, graphics, point); break; case TextDirection.Up: // up int upY = BufferHt - (int)(((textsize.Height * numberLines) + BufferHt) * intervalPosition); point = new Point(offsetLeft, Convert.ToInt32(CenterStop ? Math.Max(upY, (BufferHt - (int)(textsize.Height * numberLines)) / 2) : upY)); DrawText(text, graphics, point); break; case TextDirection.Down: // down int downY = -(int)(textsize.Height * numberLines) + (int)(((textsize.Height * numberLines) + BufferHt) * intervalPosition); point = new Point(offsetLeft, Convert.ToInt32(CenterStop ? Math.Min(downY, (BufferHt - (int)(textsize.Height * numberLines)) / 2) : downY)); DrawText(text, graphics, point); break; default: // no movement - centered point = new Point((BufferWi - _maxTextSize) / 2 + xOffset, offsetTop); DrawText(text, graphics, point); break; } } }
protected override void RenderEffect(int frame, ref PixelFrameBuffer frameBuffer) { using (var bitmap = new Bitmap(BufferWi, BufferHt)) { using (Graphics graphics = Graphics.FromImage(bitmap)) { var text = TextMode == TextMode.Normal ? TextLines.Where(x => !String.IsNullOrEmpty(x)).ToList() : SplitTextIntoCharacters(TextLines); int numberLines = text.Count(); SizeF textsize = new SizeF(0, 0); foreach (string t in text) { if (!String.IsNullOrEmpty(t)) { var size = graphics.MeasureString(t, Font); if (size.Width > textsize.Width) { textsize = size; } } } _maxTextSize = Convert.ToInt32(textsize.Width * .95); int maxht = Convert.ToInt32(textsize.Height * numberLines); int offsetLeft = (((BufferWi - _maxTextSize) / 2) * 2 + Position) / 2; int offsetTop = (((BufferHt - maxht) / 2) * 2 + Position) / 2; double intervalPosition = (GetEffectTimeIntervalPosition(frame) * Speed) % 1; Point point; switch (Direction) { case TextDirection.Left: // left int leftX = BufferWi - (int)(intervalPosition * (textsize.Width + BufferWi)); point = new Point(Convert.ToInt32(CenterStop ? Math.Max(leftX, (BufferWi - (int)textsize.Width) / 2) : leftX), offsetTop); DrawText(text, graphics, point); break; case TextDirection.Right: // right int rightX = -_maxTextSize + (int)(intervalPosition * (_maxTextSize + BufferWi)); point = new Point(Convert.ToInt32(CenterStop ? Math.Min(rightX, (BufferWi - (int)textsize.Width) / 2) : rightX), offsetTop); DrawText(text, graphics, point); break; case TextDirection.Up: // up int upY = BufferHt - (int)(((textsize.Height * numberLines) + BufferHt) * intervalPosition); point = new Point(offsetLeft, Convert.ToInt32(CenterStop ? Math.Max(upY, (BufferHt - (int)(textsize.Height * numberLines)) / 2): upY)); DrawText(text, graphics, point); break; case TextDirection.Down: // down int downY = -(int)(textsize.Height * numberLines) + (int)(((textsize.Height * numberLines) + BufferHt) * intervalPosition); point = new Point(offsetLeft, Convert.ToInt32(CenterStop ? Math.Min(downY, (BufferHt - (int)(textsize.Height * numberLines)) / 2) : downY)); DrawText(text, graphics, point); break; default: // no movement - centered point = new Point(((BufferWi - _maxTextSize) / 2) + PositionX, offsetTop); DrawText(text, graphics, point); break; } // copy to frameBuffer for (int x = 0; x < BufferWi; x++) { for (int y = 0; y < BufferHt; y++) { Color color = bitmap.GetPixel(x, BufferHt - y - 1); if (!EmptyColor.Equals(color)) { var hsv = HSV.FromRGB(color); hsv.V = hsv.V * LevelCurve.GetValue(GetEffectTimeIntervalPosition(frame) * 100) / 100; frameBuffer.SetPixel(x, y, hsv); } } } } } }