From ef3b92dab4d3f11351159266606fbf99f2871102 Mon Sep 17 00:00:00 2001 From: Moritz Bender <35152647+Morilli@users.noreply.github.com> Date: Sun, 9 Feb 2025 07:03:43 +0100 Subject: [PATCH] Add more courier font sizes instead of upscaling the 16px one (#4210) * add more courier font sizes instead of upscaling the 16px one * use 25px font instead of 26px * remove now-unused property --- .../Renderers/StringRenderer.cs | 24 ++++++------ .../DisplayManager/DisplayManagerBase.cs | 35 ++++++++++++++---- .../DisplayManager/FilterManager.cs | 4 -- .../DisplayManager/Filters/Gui.cs | 13 ++++--- .../DisplayManager/IBlitter.cs | 2 +- .../DisplayManager/OSDManager.cs | 6 +-- .../Resources/courier16px.fnt | Bin 13669 -> 2339 bytes .../Resources/courier16px_0.png | Bin 2457 -> 2419 bytes .../Resources/courier20px.fnt | Bin 0 -> 2339 bytes .../Resources/courier20px_0.png | Bin 0 -> 2995 bytes .../Resources/courier25px.fnt | Bin 0 -> 2339 bytes .../Resources/courier25px_0.png | Bin 0 -> 3946 bytes .../Resources/courier32px.fnt | Bin 0 -> 2339 bytes .../Resources/courier32px_0.png | Bin 0 -> 3882 bytes 14 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 src/BizHawk.Client.Common/Resources/courier20px.fnt create mode 100644 src/BizHawk.Client.Common/Resources/courier20px_0.png create mode 100644 src/BizHawk.Client.Common/Resources/courier25px.fnt create mode 100644 src/BizHawk.Client.Common/Resources/courier25px_0.png create mode 100644 src/BizHawk.Client.Common/Resources/courier32px.fnt create mode 100644 src/BizHawk.Client.Common/Resources/courier32px_0.png diff --git a/src/BizHawk.Bizware.Graphics/Renderers/StringRenderer.cs b/src/BizHawk.Bizware.Graphics/Renderers/StringRenderer.cs index eb9701c632..aa1cf29428 100644 --- a/src/BizHawk.Bizware.Graphics/Renderers/StringRenderer.cs +++ b/src/BizHawk.Bizware.Graphics/Renderers/StringRenderer.cs @@ -11,11 +11,11 @@ namespace BizHawk.Bizware.Graphics { public class StringRenderer : IDisposable { - public StringRenderer(IGL owner, Stream xml, params Stream[] textures) + public StringRenderer(IGL owner, Stream fontInfo, params Stream[] textures) { Owner = owner; FontInfo = new(); - FontInfo.LoadXml(xml); + FontInfo.LoadBinary(fontInfo); // load textures for (var i = 0; i < FontInfo.Pages.Length; i++) @@ -48,10 +48,10 @@ namespace BizHawk.Bizware.Graphics TexturePages = null; } - public SizeF Measure(string str, float scale) + public SizeF Measure(string str) { float x = 0; - float y = FontInfo.LineHeight * scale; + float y = FontInfo.LineHeight; var ox = x; var len = str.Length; @@ -80,18 +80,18 @@ namespace BizHawk.Bizware.Graphics } x = 0; - y += FontInfo.LineHeight * scale; + y += FontInfo.LineHeight; continue; } var bfc = FontInfo[c]; - x += bfc.XAdvance * scale; + x += bfc.XAdvance; } return new(Math.Max(x, ox), y); } - public void RenderString(IGuiRenderer renderer, float x, float y, string str, float scale) + public void RenderString(IGuiRenderer renderer, float x, float y, string str) { if (Owner != renderer.Owner) { @@ -121,19 +121,19 @@ namespace BizHawk.Bizware.Graphics if (c == '\n') { x = ox; - y += FontInfo.LineHeight * scale; + y += FontInfo.LineHeight; continue; } var bfc = FontInfo[c]; var tex = TexturePages[bfc.TexturePage]; - var gx = x + bfc.XOffset * scale; - var gy = y + bfc.YOffset * scale; + var gx = x + bfc.XOffset; + var gy = y + bfc.YOffset; var charTexCoords = CharTexCoords[bfc.Char]; - renderer.DrawSubrect(tex, gx, gy, bfc.Width * scale, bfc.Height * scale, + renderer.DrawSubrect(tex, gx, gy, bfc.Width, bfc.Height, charTexCoords.U0, charTexCoords.V0, charTexCoords.U1, charTexCoords.V1); - x += bfc.XAdvance * scale; + x += bfc.XAdvance; } } diff --git a/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs b/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs index 01927e2522..1f24ba3e82 100644 --- a/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs +++ b/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs @@ -73,9 +73,6 @@ namespace BizHawk.Client.Common } { - using var xml = ReflectionCache.EmbeddedResourceStream("Resources.courier16px.fnt"); - using var tex = ReflectionCache.EmbeddedResourceStream("Resources.courier16px_0.png"); - _theOneFont = new(_gl, xml, tex); using var gens = ReflectionCache.EmbeddedResourceStream("Resources.gens.ttf"); LoadCustomFont(gens); using var fceux = ReflectionCache.EmbeddedResourceStream("Resources.fceux.ttf"); @@ -152,14 +149,38 @@ namespace BizHawk.Client.Common s?.Dispose(); } - _theOneFont.Dispose(); + _theOneFont?.Dispose(); _renderer.Dispose(); } // rendering resources: protected readonly IGL _gl; - private readonly StringRenderer _theOneFont; + private float _scale = 1; + private StringRenderer _theOneFont; + private StringRenderer Font + { + get + { + if (_theOneFont is not null) return _theOneFont; + + float scale = GetGraphicsControlDpi() / 96f; + int fontSize = scale switch + { + < 1.25f => 16, + < 1.5f => 20, + < 2 => 25, + _ => 32, + }; + _scale = fontSize / 16f; + + using var fontInfo = ReflectionCache.EmbeddedResourceStream($"Resources.courier{fontSize}px.fnt"); + using var tex = ReflectionCache.EmbeddedResourceStream($"Resources.courier{fontSize}px_0.png"); + _theOneFont = new(_gl, fontInfo, tex); + + return _theOneFont; + } + } private readonly IGuiRenderer _renderer; @@ -276,7 +297,7 @@ namespace BizHawk.Client.Common var fPresent = new FinalPresentation(chainOutSize); var fInput = new SourceImage(chainInSize); - var fOSD = new OSD(includeOSD, OSD, _theOneFont); + var fOSD = new OSD(includeOSD, OSD, Font, _scale); var chain = new FilterProgram(); @@ -815,8 +836,6 @@ namespace BizHawk.Client.Common filterProgram.GuiRenderer = _renderer; filterProgram.GL = _gl; - filterProgram.ControlDpi = GetGraphicsControlDpi(); - //setup the source image filter var fInput = (SourceImage)filterProgram["input"]; fInput.Texture = videoTexture; diff --git a/src/BizHawk.Client.Common/DisplayManager/FilterManager.cs b/src/BizHawk.Client.Common/DisplayManager/FilterManager.cs index f1e533f095..a358175e18 100644 --- a/src/BizHawk.Client.Common/DisplayManager/FilterManager.cs +++ b/src/BizHawk.Client.Common/DisplayManager/FilterManager.cs @@ -70,10 +70,6 @@ namespace BizHawk.Client.Common.FilterManager public IRenderTarget CurrRenderTarget; - // DPI / 96.0 indicates the display scaling - // this is mainly relevant for OSD - public int ControlDpi; - public IRenderTarget GetTempTarget(int width, int height) { return RenderTargetProvider.Get(new(width, height)); diff --git a/src/BizHawk.Client.Common/DisplayManager/Filters/Gui.cs b/src/BizHawk.Client.Common/DisplayManager/Filters/Gui.cs index 1d7d080218..a9b7cca904 100644 --- a/src/BizHawk.Client.Common/DisplayManager/Filters/Gui.cs +++ b/src/BizHawk.Client.Common/DisplayManager/Filters/Gui.cs @@ -586,12 +586,14 @@ namespace BizHawk.Client.Common.Filters private readonly bool _drawOsd; private readonly OSDManager _manager; private readonly StringRenderer _font; + private readonly float _scale; - public OSD(bool drawOsd, OSDManager manager, StringRenderer font) + public OSD(bool drawOsd, OSDManager manager, StringRenderer font, float scale) { _drawOsd = drawOsd; _manager = manager; _font = font; + _scale = scale; } public override void Initialize() @@ -614,8 +616,7 @@ namespace BizHawk.Client.Common.Filters var size = FindInput().SurfaceFormat.Size; FilterProgram.GuiRenderer.Begin(size.Width, size.Height); - var scale = FilterProgram.ControlDpi / 96.0F; - var blitter = new OSDBlitter(_font, FilterProgram.GuiRenderer, new(0, 0, size.Width, size.Height), scale); + var blitter = new OSDBlitter(_font, FilterProgram.GuiRenderer, new(0, 0, size.Width, size.Height), _scale); FilterProgram.GuiRenderer.EnableBlending(); _manager.DrawScreenInfo(blitter); _manager.DrawMessages(blitter); @@ -635,15 +636,15 @@ namespace BizHawk.Client.Common.Filters Scale = scale; } - public void DrawString(string s, Color color, float x, float y) + public void DrawString(string s, Color color, int x, int y) { _renderer.SetModulateColor(color); - _font.RenderString(_renderer, x, y, s, Scale); + _font.RenderString(_renderer, x, y, s); _renderer.SetModulateColorWhite(); } public SizeF MeasureString(string s) - => _font.Measure(s, Scale); + => _font.Measure(s); public Rectangle ClipBounds { get; } diff --git a/src/BizHawk.Client.Common/DisplayManager/IBlitter.cs b/src/BizHawk.Client.Common/DisplayManager/IBlitter.cs index 5f23f8ce0f..8ae5c6e8ce 100644 --- a/src/BizHawk.Client.Common/DisplayManager/IBlitter.cs +++ b/src/BizHawk.Client.Common/DisplayManager/IBlitter.cs @@ -9,7 +9,7 @@ namespace BizHawk.Client.Common /// public interface IBlitter { - void DrawString(string s, Color color, float x, float y); + void DrawString(string s, Color color, int x, int y); SizeF MeasureString(string s); diff --git a/src/BizHawk.Client.Common/DisplayManager/OSDManager.cs b/src/BizHawk.Client.Common/DisplayManager/OSDManager.cs index 8ba0bba9c1..580edf6acf 100644 --- a/src/BizHawk.Client.Common/DisplayManager/OSDManager.cs +++ b/src/BizHawk.Client.Common/DisplayManager/OSDManager.cs @@ -38,7 +38,7 @@ namespace BizHawk.Client.Common - private static PointF GetCoordinates(IBlitter g, MessagePosition position, string message) + private static Point GetCoordinates(IBlitter g, MessagePosition position, string message) { var size = g.MeasureString(message); var x = position.Anchor.IsLeft() @@ -49,7 +49,7 @@ namespace BizHawk.Client.Common ? position.Y * g.Scale : g.ClipBounds.Height - position.Y * g.Scale - size.Height; - return new PointF(x, y); + return new Point((int)Math.Round(x), (int)Math.Round(y)); } private string MakeFrameCounter() @@ -211,7 +211,7 @@ namespace BizHawk.Client.Common : ""; } - private static void DrawOsdMessage(IBlitter g, string message, Color color, float x, float y) + private static void DrawOsdMessage(IBlitter g, string message, Color color, int x, int y) => g.DrawString(message, color, x, y); /// diff --git a/src/BizHawk.Client.Common/Resources/courier16px.fnt b/src/BizHawk.Client.Common/Resources/courier16px.fnt index baa19f91e1736c6cef38138fb2c10545e08de4ea..ae3321a1956b0d92b4c6963cee7c8449cc1b40d8 100644 GIT binary patch literal 2339 zcmZ9O$x{#e=0~ zxs)E%ga3v{{|wLK*E5;1r$bGu`^&GV-+TSuYqoWDlq9A}nyP&|rvxJ<63O<_LjJ;F zUdf#Qlcxs;^Dr%`=Id-AXj(fqKG3*g?8=a){7Olad}{Sl3skBveC!n~!(LR%V`x9KtaRvY~6;XBeo1SL(fr_<3)w9TMp~c z3sj|y%6zthQ7yW1=EUZW9y_ZS5+*v!ZyR%up?7@8QgGOBZQTVUrMTeiYRcs%8zd};G_RYWhVzs0=T z25Vz&1{UU3yT5L0jBSV2t0%^G!1}Z$#yVg%j&3LHn3K<)Fi{=0ExRBE&GpYWJoDYK zUQW}lg*~u6WUtNk!fF(^xeL~y>ewFLu$d0)fweh)?1ObXY(MNEk6nWYn9p+R&1ie`*M8qISf}&8tI?B~?wqfS=jkA<-qD?h9d~MB2&O0o!M?+gQLT)f(FIt6{%ZP5n12@;nNKA# z2erwIeVOKZ5>JfL(HQH(-N~%{O6U58ID%pT*DU7AzOlbYSxY%yZ7@ zHq6|(wh_RVM2#MSin;7xkYL+?PLKtBW<5EZ!eKVa?Hb1Z#gM JO}~oA?;nBM8%zKI literal 13669 zcmcgzU2oe)5PUDt|3L6LiFLBR49LwxUh)t6STGW85tSuDmQ%OCzBAliY7b?Q>O>t1 zR8%B#Zf0lajz@X<`Tb>Ee6NqM&3^Y-hEJpN^KZZYvV7X_PIxVfWwU$Q7f;oyek{N2 z-;PavEQ{CXAG{5-viP>&u5nZr&8gZptH*Lw7OPEle63H9Wm&xKn$>>I@8YD>u|BOf zU-4#yZ@s?k_oq#JLRGb2I8^I(vwOxreQ5u~cMjF6{g?0o7udg@w#^O~8<%%7w$=XS zWxp%~OLP}M6T?{R@uwXJ{0@pz$c06(5$;D_qDepT4jpEXEeOx5 z+xCNFy_REq@_el8UH9(W_N}%zI+XT$?Wmv`-xQ5p^QqZlFe{NR%nt8=j6NN9&t;(} z-kr}}w#pUw?v6}Az%IxS+6#V!4)2fUJ%;o*UO@4$W=$Exq%1b30gm7IPfu+TK92EK zd&9G<_4jJWat2(4;99hn_0+}%79Hq4E&))%4AXfBdhbAS<{2|YpcrKeDo^WBM-Lq; zs@Kaj!c2pta8w=;kT;OH>I--Sg_Sy{5cFDcDV))qoLSPohREV}khH+HnBWJ@1t35Z zbu|-#Z->e6m~V!_gl(uTr~oq;QPv6_kC%*~C?c6^zf1tG`a0)&6J2lI39takJctSk zl&+rC-|9I4q6E=QNS-b9BgE@XJHepAaSk5f7??dhwx#yQGIA}`0`*-HjyS(dn`$hG~KKc$HtR-iu3fC16q@ zfGH+?Y{td4P2336nS8z@Du-qz9pHX@CTSFOPV+v(IQmh2%OrA@JYvX$ z>dfWQEkPxa6x2^Jw*-|ynxVM)n9ku?^o)XLVmhZ4(4mq@ZaX7d?MC*!-bkE90jij| zxHakxTV^ha6xgAxDTZLE7)Ni*aD3LZX&p1CaM(t{3ozY%{!P`DNP3Vq_1WNakRvm4 z1LWXb5=qx&nX-XvT*zy8!60lUy`_;PkjCPpkO@=*iMD}}=6GjJZq%X^pP*uqz7zpZSn%5pAj%I*nNyngVUPB$KLF7|mo65j~P&lbN+rQ6-n8UGaa@*F*a0Z4d`bFbQThc_o)@3xL1j=;P|W z!~tF_uOt(T$z<|#Igq-dvUr9R?GPq9m_IIngYDjU40t2!qbY*Ln~rTNEH8L|e3~nV zxmqABULf+t+YhN^Wx=G=>%}%sMdf*L62hXL>Re@U*l(yIDl6f%;H5aj;x&t*B%LG? zqo)_%#wvZRzHTu>6(96@-y5|P+KNIq7Ny-Qg5y*@}psL21mg0fAPp;Cn&c-ndeeMg8Y?hyD27T7a zKb-(*wz^6PvjM@>p`y^%s$O1iB^)QID{W)Hkn+C}bv5NpL4Q$ciG-qZ;f=mgrmk6i z+t4sJdq+-6^shb{<4+S(ikhgfJ{hykJeT~C-m1#N8&yc!Em{(LMxWf+PmM3$Q~Un{ SFYnsF;=y0;EbsKMsQv}?j(>^( diff --git a/src/BizHawk.Client.Common/Resources/courier16px_0.png b/src/BizHawk.Client.Common/Resources/courier16px_0.png index 9abf51f69cb384f80171ea844db4910cc3d3b05b..a60612705edac7610985d7fcc1a973533005ed3c 100644 GIT binary patch delta 2370 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 dforgP_N~p>_vpi{ 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 literal 0 HcmV?d00001 diff --git a/src/BizHawk.Client.Common/Resources/courier32px.fnt b/src/BizHawk.Client.Common/Resources/courier32px.fnt new file mode 100644 index 0000000000000000000000000000000000000000..dc1305925f1970d3ba2b1de8655b86767dd920c6 GIT binary patch literal 2339 zcmZ9OOH7nk6vzLJ7Ohf8nBh@c72jy7rQm}qzOX)8Me$i}YoUmO*1|}k;uDR=l?!4_ zV~h(H#wYklTHBxtV~lZOTo@NDSh#LCq;W0&?sw;#eD_XrC+Gg=obTLo?m6e1n%Xs^ zvI-=Xs7_7FLQ+;%Y*kxl`~JP{ip7JUih*GBEse_KYmZf^tVng$m(NSJHf!|jvC;^i zUOmuKeW3qFCMhAsOHgmrfWxN3%5_F#RHST;4)mr4dj0xHIS|XH!^%{peDsuNGmy@* z68bd5W+K&idb40VJvJM5QvLYN$@ndWm9xfca)!-ezb(zev&>~bOLy@*0cmV-=FgCd zbOqTY#j-M_KHVmcahy0A=zR{$(-Y<5A%?xl%RJbCZt6qqveSBB!2TdF`RoNXdgg3- zuv|RF(mD7NHmnN8Vd42IVDj`TA#b?XsO@~%OYL*m0@x#uEri`ti=(#)cFAK^usR)Z z^uB_f^Vnk8TlElc9+8a;Vp{_1(`j;*Bo51}VGYC)R{`k~)sJJ=16 z?S!rKYcdz$X^(Dr9o3l(kWhOPTXSd(|YJ+K$L=;$@UO1-+;3wxsrj@~|4BYM%^ zZ-yl^KCIssm@>@9u^%$bGV>*@zXL{%Pn;Zt@&1A|#2kwD%t6?&);qSp!UpK`LVEw* zi1phFTjAxP4Yti=rp}&cYRK9if(_xr`n9Yb_ODKGZ)O%-_8Zc1?|B`t4cu>nP7G&k zCsGenB6=Uc!(OS|IrCwdnD@~*x*%6Q+as`^Oi$ah9EJVEbdUNt1}kBioQ8Qm&feU~ zn8^F+1pA3;y|9K(vOmYWEJ3W{eRL!JPZf>l-a@@z*bF);`cA$IOH#YJJT>%t4c5Sl z`n}HnDJv0~oj2K^)xz`~it(G`w_#=8d$13-F*u*;4?DB_k>tGx??5hl&$|apVH^D~ ya35CX-P>Oeg8gSf6tqff5TqVm-bz2&+-tapnpxhSlgkP$<-MrfA0bBUERX~ literal 0 HcmV?d00001 diff --git a/src/BizHawk.Client.Common/Resources/courier32px_0.png b/src/BizHawk.Client.Common/Resources/courier32px_0.png new file mode 100644 index 0000000000000000000000000000000000000000..44e49adbfd39953e2727f18397f72269ac7b71a7 GIT binary patch literal 3882 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 oMV$}JPA6Xp5+W-In literal 0 HcmV?d00001