UWUVCI-AIO-WPF/UWUVCI AIO WPF/Classes/BootImage.cs
2022-09-28 20:55:05 -07:00

224 lines
7.6 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Linq;
using System.Text.RegularExpressions;
namespace UWUVCI_AIO_WPF.Classes
{
public class BootImage : IDisposable
{
private bool disposed = false;
private Bitmap _frame;
private Bitmap _titleScreen;
private Font font;
public string _imageVar;
public Rectangle _rectangleGBA = new Rectangle(132, 260, 399, 266);
public Rectangle _rectangleGBC = new Rectangle(183, 260, 296, 266);
public Rectangle _rectangleH4V3 = new Rectangle(131, 249, 400, 300);
// Rectangle rectanglewii = new Rectangle(224, 201, 832, 332);
public Rectangle _rectangleWII = new Rectangle(224, 200, 832, 333);
public Bitmap Frame
{
set
{
if (_frame != null)
_frame.Dispose();
_frame = value;
}
get { return _frame; }
}
public Bitmap TitleScreen
{
set
{
if (_titleScreen != null)
_titleScreen.Dispose();
_titleScreen = value;
}
get { return _titleScreen; }
}
public string NameLine1;
public string NameLine2;
public int Released;
public int Players;
public bool Longname;
public BootImage()
{
_frame = null;
_titleScreen = null;
NameLine1 = null;
NameLine2 = null;
Released = 0;
Players = 0;
Longname = false;
}
~BootImage()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
if (Frame != null)
{
Frame.Dispose();
Frame = null;
}
if (TitleScreen != null)
{
TitleScreen.Dispose();
TitleScreen = null;
}
}
disposed = true;
}
}
public Bitmap Create(string console)
{
Bitmap img = new Bitmap(1280, 720);
Graphics g = Graphics.FromImage(img);
g.PixelOffsetMode = PixelOffsetMode.Half;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.CompositingMode = CompositingMode.SourceOver;
g.CompositingQuality = CompositingQuality.HighQuality;
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
g.Clear(Color.White);
try
{
PrivateFontCollection privateFonts = new PrivateFontCollection();
privateFonts.AddFontFile(@"bin\Tools\font.otf");
font = new Font(privateFonts.Families[0], 10.0F, FontStyle.Regular, GraphicsUnit.Point);
}
catch (Exception)
{
font = new Font("Trebuchet MS", 10.0F, FontStyle.Bold, GraphicsUnit.Point);
}
SolidBrush brush = new SolidBrush(Color.FromArgb(32, 32, 32));
Pen outline = new Pen(Color.FromArgb(222, 222, 222), 4.0F);
Pen shadow = new Pen(Color.FromArgb(190, 190, 190), 6.0F);
StringFormat format = new StringFormat();
_imageVar = "_rectangle" + console;
Rectangle rectangle;
try
{
rectangle = (Rectangle)GetType().GetField(_imageVar).GetValue(this);
}
catch
{
//if rectangle isn't able to get set then H4V3 should be used.
rectangle = _rectangleH4V3;
}
if (TitleScreen != null)
g.DrawImage(TitleScreen, rectangle);
else
g.FillRectangle(new SolidBrush(Color.Black), rectangle);
if (Frame != null)
g.DrawImage(Frame, new Rectangle(0, 0, 1280, 720));
var isNotEnglish = false;
if (!string.IsNullOrEmpty(NameLine1) || !string.IsNullOrEmpty(NameLine2))
{
var regex = "^[a-zA-Z0-9\\d\\s\\.\\'\\&\\\\(\\)\\-\\:\\;\\.\\,\\?\\^\\¿]*$";
var match = Regex.Match(NameLine1, regex);
var match2 = Regex.Match(NameLine2, regex);
if (!match.Success || !match2.Success)
if (!NameLine1.Contains("é") || !NameLine2.Contains("é"))
isNotEnglish = true;
Pen outlineBold = new Pen(Color.FromArgb(222, 222, 222), 5.0F);
Pen shadowBold = new Pen(Color.FromArgb(190, 190, 190), 7.0F);
Rectangle rectangleNL1 = Longname ? new Rectangle(578, 313, 640, 50) : new Rectangle(578, 340, 640, 50);
Rectangle rectangleNL2 = new Rectangle(578, 368, 640, 50);
GraphicsPath nl1 = new GraphicsPath();
GraphicsPath nl2 = new GraphicsPath();
if (Longname)
{
nl1.AddString(NameLine1, font.FontFamily,
(int)(FontStyle.Bold),
g.DpiY * 37.0F / 72.0F, rectangleNL1, format);
g.DrawPath(shadowBold, nl1);
g.DrawPath(outlineBold, nl1);
g.FillPath(brush, nl1);
nl2.AddString(NameLine2, font.FontFamily,
(int)(FontStyle.Bold),
g.DpiY * 37.0F / 72.0F, rectangleNL2, format);
g.DrawPath(shadowBold, nl2);
g.DrawPath(outlineBold, nl2);
g.FillPath(brush, nl2);
}
else
{
nl1.AddString(NameLine1, font.FontFamily,
(int)(FontStyle.Bold),
g.DpiY * 37.0F / 72.0F, rectangleNL1, format);
g.DrawPath(shadowBold, nl1);
g.DrawPath(outlineBold, nl1);
g.FillPath(brush, nl1);
}
}
if (Released > 0)
{
GraphicsPath r = new GraphicsPath();
var releasedString = "Released: " + Released.ToString();
if (isNotEnglish)
releasedString = Released.ToString() + "年発売";
r.AddString(releasedString, font.FontFamily,
(int)(FontStyle.Regular),
g.DpiY * 25.0F / 72.0F, new Rectangle(586, 450, 600, 40), format);
g.DrawPath(shadow, r);
g.DrawPath(outline, r);
g.FillPath(brush, r);
}
if (Players > 0)
{
string pStr = Players >= 4 ? "1-4" : (Players == 1 ? "1" : "1-" + Players.ToString());
if (isNotEnglish)
pStr = "プレイ人数 " + pStr + "人";
else
pStr = "Players: " + pStr;
GraphicsPath p = new GraphicsPath();
p.AddString(pStr, font.FontFamily,
(int)(FontStyle.Regular),
g.DpiY * 25.0F / 72.0F, new Rectangle(586, 496, 600, 40), format);
g.DrawPath(shadow, p);
g.DrawPath(outline, p);
g.FillPath(brush, p);
}
return img;
}
}
}