Fonts: support lazy font file loading (extends PRs #545 and #614)

This commit is contained in:
Karl Tauber
2022-11-21 11:51:27 +01:00
parent 6afc747790
commit d491847754
25 changed files with 525 additions and 126 deletions

View File

@@ -15,18 +15,29 @@ License:
How to install?
---------------
Invoke the `install()` method once (e.g. in your `main()` method; on AWT
thread):
Invoke following once (e.g. in your `main()` method; on AWT thread).
For lazy loading use:
~~~java
FlatRobotoFont.installLazy();
~~~
Or load immediately with:
~~~java
FlatRobotoFont.install();
// or
FlatRobotoFont.installBasic();
FlatRobotoFont.installLight();
FlatRobotoFont.installSemiBold();
~~~
How to use?
-----------
Use as default font:
Use as application font (invoke before setting up FlatLaf):
~~~java
FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY );
@@ -34,7 +45,7 @@ FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT );
FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
~~~
Create fonts:
Create single fonts:
~~~java
// basic styles
@@ -52,6 +63,27 @@ new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 );
new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 );
~~~
If using lazy loading, invoke one of following before creating the font:
~~~java
FontUtils.loadFontFamily( FlatRobotoFont.FAMILY );
FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_LIGHT );
FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
~~~
E.g.:
~~~java
FontUtils.loadFontFamily( FlatRobotoFont.FAMILY );
Font font = new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
~~~
Or use following:
~~~java
Font font = FontUtils.getCompositeFont( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
~~~
Download
--------

View File

@@ -31,6 +31,8 @@ plugins {
}
dependencies {
implementation( project( ":flatlaf-core" ) )
testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" )
testImplementation( "org.junit.jupiter:junit-jupiter-params" )
testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" )

View File

@@ -16,11 +16,7 @@
package com.formdev.flatlaf.fonts.roboto;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
import java.io.InputStream;
import com.formdev.flatlaf.util.FontUtils;
/**
* The Roboto font family.
@@ -28,19 +24,30 @@ import java.io.InputStream;
* Font home page: <a href="https://fonts.google.com/specimen/Roboto">https://fonts.google.com/specimen/Roboto</a><br>
* GitHub project: <a href="https://github.com/googlefonts/roboto">https://github.com/googlefonts/roboto</a>
* <p>
* To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread):
* To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread).
* <p>
* For lazy loading use:
* <pre>{@code
* FlatRobotoFont.install();
* FlatRobotoFont.installLazy();
* }</pre>
* <p>
* Use as default font:
* Or load immediately with:
* <pre>{@code
* FlatRobotoFont.install();
* // or
* FlatRobotoFont.installBasic();
* FlatRobotoFont.installLight();
* FlatRobotoFont.installSemiBold();
* }</pre>
* <p>
* Use as application font (invoke before setting up FlatLaf):
* <pre>{@code
* FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY );
* FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT );
* FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
* }</pre>
* <p>
* Create fonts:
* Create single fonts:
* <pre>{@code
* new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
* new Font( FlatRobotoFont.FAMILY, Font.ITALIC, 12 );
@@ -51,6 +58,24 @@ import java.io.InputStream;
* new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 );
* new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 );
* }</pre>
* <p>
* If using lazy loading, invoke one of following before creating the font:
* <pre>{@code
* FontUtils.loadFontFamily( FlatRobotoFont.FAMILY );
* FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_LIGHT );
* FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
* }</pre>
* <p>
* E.g.:
* <pre>{@code
* FontUtils.loadFontFamily( FlatRobotoFont.FAMILY );
* Font font = new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
* }</pre>
* <p>
* Or use following:
* <pre>{@code
* Font font = FontUtils.getCompositeFont( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
* }</pre>
*
* @author Karl Tauber
*/
@@ -81,7 +106,7 @@ public class FlatRobotoFont
public static final String FAMILY_LIGHT = "Roboto Light";
/**
* Family name for semibold styles.
* Family name for semibold (medium) styles.
* <p>
* Usage:
* <pre>{@code
@@ -112,21 +137,61 @@ public class FlatRobotoFont
private FlatRobotoFont() {}
/**
* Registers the fonts for lazy loading via {@link FontUtils#registerFontFamilyLoader(String, Runnable)}.
* <p>
* This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts.
* <p>
* <strong>Note</strong>: When using '{@code new Font(...)}', you need to first invoke
* {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded.
* When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)},
* this is done automatically.
*/
public static void installLazy() {
FontUtils.registerFontFamilyLoader( FAMILY, FlatRobotoFont::installBasic );
FontUtils.registerFontFamilyLoader( FAMILY_LIGHT, FlatRobotoFont::installLight );
FontUtils.registerFontFamilyLoader( FAMILY_SEMIBOLD, FlatRobotoFont::installSemiBold );
}
/**
* Creates and registers the fonts for all styles.
* <p>
* When using FlatLaf, consider using {@link #installLazy()}.
*/
public static void install() {
// basic styles
installBasic();
installLight();
installSemiBold();
}
/**
* Creates and registers the fonts for basic styles (regular, italic and bold).
* <p>
* When using FlatLaf, consider using {@link #installLazy()}.
*/
public static void installBasic() {
installStyle( STYLE_REGULAR );
installStyle( STYLE_ITALIC );
installStyle( STYLE_BOLD );
installStyle( STYLE_BOLD_ITALIC );
}
// light
/**
* Creates and registers the fonts for light styles.
* <p>
* When using FlatLaf, consider using {@link #installLazy()}.
*/
public static void installLight() {
installStyle( STYLE_LIGHT );
installStyle( STYLE_LIGHT_ITALIC );
}
// semibold
/**
* Creates and registers the fonts for semibold (medium) styles.
* <p>
* When using FlatLaf, consider using {@link #installLazy()}.
*/
public static void installSemiBold() {
installStyle( STYLE_SEMIBOLD );
installStyle( STYLE_SEMIBOLD_ITALIC );
}
@@ -136,15 +201,6 @@ public class FlatRobotoFont
* See {@code STYLE_} constants.
*/
public static boolean installStyle( String name ) {
try( InputStream in = FlatRobotoFont.class.getResourceAsStream( name ) ) {
Font font = Font.createFont( Font.TRUETYPE_FONT, in );
return GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont( font );
} catch( FontFormatException ex ) {
ex.printStackTrace();
return false;
} catch( IOException ex ) {
ex.printStackTrace();
return false;
}
return FontUtils.installFont( FlatRobotoFont.class.getResource( name ) );
}
}

View File

@@ -19,6 +19,7 @@
*/
module com.formdev.flatlaf.fonts.roboto {
requires java.desktop;
requires com.formdev.flatlaf;
exports com.formdev.flatlaf.fonts.roboto;