1414import java .io .File ;
1515import java .io .InputStream ;
1616import java .nio .file .Files ;
17+
18+ import org .lwjgl .opengl .GL11 ;
19+
1720import static top .fpsmaster .utils .render .state .Alpha .apply ;
1821
1922public class UFontRenderer extends FontRenderer {
@@ -140,24 +143,44 @@ public static boolean isEmojiCharacter(int codePoint) {
140143 */
141144 @ Override
142145 public int drawString (String text , float x , float y , int color , boolean dropShadow ) {
143- if (UiScale .isActive ()) {
144- float scale = UiScale .getScale ();
145- int scaledSize = Math .max (1 , Math .round (size * scale ));
146- UFontRenderer renderer = scaledSize == size ? this : FPSMaster .fontManager .getFont (scaledSize );
147- return renderer .drawStringInternal (text , x * scale , y * scale , color , dropShadow );
146+ float densityScale = getDensityScale ();
147+ if (densityScale > 1.0f ) {
148+ return drawHighDensityString (text , x , y , color , dropShadow , densityScale );
148149 }
149150 return drawStringInternal (text , x , y , color , dropShadow );
150151 }
151152
153+ private int drawHighDensityString (String text , float x , float y , int color , boolean dropShadow , float densityScale ) {
154+ UFontRenderer renderer = getDensityRenderer (densityScale );
155+ if (renderer == this ) {
156+ return drawStringInternal (text , x , y , color , dropShadow );
157+ }
158+
159+ float actualDensityScale = renderer .size / (float ) size ;
160+ float inverseScale = 1.0f / actualDensityScale ;
161+ GL11 .glPushMatrix ();
162+ GL11 .glScalef (inverseScale , inverseScale , 1.0f );
163+ try {
164+ int result = renderer .drawStringInternal (text , x * actualDensityScale , y * actualDensityScale , color , dropShadow , actualDensityScale * 0.5f );
165+ return Math .round (result * inverseScale );
166+ } finally {
167+ GL11 .glPopMatrix ();
168+ }
169+ }
170+
152171 private int drawStringInternal (String text , float x , float y , int color , boolean dropShadow ) {
172+ return drawStringInternal (text , x , y , color , dropShadow , 0.5f );
173+ }
174+
175+ private int drawStringInternal (String text , float x , float y , int color , boolean dropShadow , float shadowOffset ) {
153176 color = apply (color );
154177 int i ;
155178 if (dropShadow ) {
156179 if (Colors .toColor (color ).getAlpha () > 50 ) {
157180 stringCache .renderString (
158181 text ,
159- x + 0.5f ,
160- y + 0.5f ,
182+ x + shadowOffset ,
183+ y + shadowOffset ,
161184 new Color (20 , 20 , 20 , Colors .toColor (color ).getAlpha ()).getRGB (),
162185 true
163186 );
@@ -170,11 +193,13 @@ private int drawStringInternal(String text, float x, float y, int color, boolean
170193 @ Override
171194 public int getStringWidth (String text ) {
172195 text = GlobalTextFilter .filter (text );
173- if (UiScale .isActive ()) {
174- float scale = UiScale .getScale ();
175- int scaledSize = Math .max (1 , Math .round (size * scale ));
176- UFontRenderer renderer = scaledSize == size ? this : FPSMaster .fontManager .getFont (scaledSize );
177- return Math .round (renderer .stringCache .getStringWidth (text ) / scale );
196+ float densityScale = getDensityScale ();
197+ if (densityScale > 1.0f ) {
198+ UFontRenderer renderer = getDensityRenderer (densityScale );
199+ if (renderer != this ) {
200+ float actualDensityScale = renderer .size / (float ) size ;
201+ return Math .round (renderer .stringCache .getStringWidth (text ) / actualDensityScale );
202+ }
178203 }
179204 return stringCache .getStringWidth (text );
180205 }
@@ -184,15 +209,32 @@ public void drawCenteredString(String text, float x, float y, int color) {
184209 }
185210
186211 public int getHeight () {
187- if (UiScale .isActive ()) {
188- float scale = UiScale .getScale ();
189- int scaledSize = Math .max (1 , Math .round (size * scale ));
190- UFontRenderer renderer = scaledSize == size ? this : FPSMaster .fontManager .getFont (scaledSize );
191- return Math .round (renderer .stringCache .height / 2f / scale );
212+ float densityScale = getDensityScale ();
213+ if (densityScale > 1.0f ) {
214+ UFontRenderer renderer = getDensityRenderer (densityScale );
215+ if (renderer != this ) {
216+ float actualDensityScale = renderer .size / (float ) size ;
217+ return Math .round (renderer .stringCache .height / 2f / actualDensityScale );
218+ }
192219 }
193220 return stringCache .height / 2 ;
194221 }
195222
223+ private float getDensityScale () {
224+ if (!UiScale .isActive ()) {
225+ return 1.0f ;
226+ }
227+ return Math .max (1.0f , UiScale .getPixelScale ());
228+ }
229+
230+ private UFontRenderer getDensityRenderer (float densityScale ) {
231+ int scaledSize = Math .max (size , Math .round (size * densityScale ));
232+ if (scaledSize == size ) {
233+ return this ;
234+ }
235+ return FPSMaster .fontManager .getFont (scaledSize );
236+ }
237+
196238 public float drawStringCapableWithEmojiWithShadow (String text , float x , float y , int color ) {
197239 String [] sbs = new String []{"\uD83C \uDF89 " , "\uD83C \uDF81 " , "\uD83D \uDC79 " , "\uD83C \uDFC0 " , "⚽" , "\uD83C \uDF6D " , "\uD83C \uDF20 " , "\uD83D \uDC7E " , "\uD83D \uDC0D "
198240 , "\uD83D \uDD2E " , "\uD83D \uDC7D " , "\uD83D \uDCA3 " , "\uD83C \uDF6B " , "\uD83C \uDF82 " };
0 commit comments