diff --git a/.github/workflows/fonts.yml b/.github/workflows/fonts.yml index 0302f0a30..153e98ad9 100644 --- a/.github/workflows/fonts.yml +++ b/.github/workflows/fonts.yml @@ -21,6 +21,7 @@ jobs: font: - inter - jetbrains-mono + - roboto runs-on: ubuntu-latest if: | diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/HiDPIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/HiDPIUtils.java index 16fec05af..735a11207 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/HiDPIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/HiDPIUtils.java @@ -190,6 +190,8 @@ public static float computeTextYCorrection( Graphics2D g ) { case "Inter Light": case "Inter Semi Bold": case "Roboto": + case "Roboto Light": + case "Roboto Medium": return correctionForScaleY( g, CORRECTION_INTER ); case "Noto Sans": diff --git a/flatlaf-demo/build.gradle.kts b/flatlaf-demo/build.gradle.kts index b24732266..925f2f523 100644 --- a/flatlaf-demo/build.gradle.kts +++ b/flatlaf-demo/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation( project( ":flatlaf-core" ) ) implementation( project( ":flatlaf-extras" ) ) implementation( project( ":flatlaf-fonts-inter" ) ) + implementation( project( ":flatlaf-fonts-roboto" ) ) implementation( project( ":flatlaf-intellij-themes" ) ) implementation( "com.miglayout:miglayout-swing:5.3" ) implementation( "com.jgoodies:jgoodies-forms:1.9.0" ) @@ -34,6 +35,7 @@ tasks { dependsOn( ":flatlaf-core:jar" ) dependsOn( ":flatlaf-extras:jar" ) dependsOn( ":flatlaf-fonts-inter:jar" ) + dependsOn( ":flatlaf-fonts-roboto:jar" ) dependsOn( ":flatlaf-intellij-themes:jar" ) // dependsOn( ":flatlaf-natives-jna:jar" ) diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java index a8f5851fa..fccdb1f13 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java @@ -44,6 +44,7 @@ import com.formdev.flatlaf.extras.components.FlatButton; import com.formdev.flatlaf.extras.components.FlatButton.ButtonType; import com.formdev.flatlaf.fonts.inter.FlatInterFont; +import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.icons.FlatAbstractIcon; import com.formdev.flatlaf.themes.FlatMacDarkLaf; import com.formdev.flatlaf.themes.FlatMacLightLaf; @@ -66,6 +67,7 @@ class DemoFrame { private final String[] availableFontFamilyNames; private boolean interFontInstalled; + private boolean robotoFontInstalled; private int initialFontMenuItemCount = -1; DemoFrame() { @@ -288,6 +290,12 @@ private void fontFamilyChanged( ActionEvent e ) { interFontInstalled = true; } + // install Roboto font on demand + if( fontFamily.equals( FlatRobotoFont.FAMILY ) && !robotoFontInstalled ) { + FlatRobotoFont.install(); + robotoFontInstalled = true; + } + FlatAnimatedLafChange.showSnapshot(); Font font = UIManager.getFont( "defaultFont" ); @@ -361,7 +369,8 @@ void updateFontMenuItems() { ButtonGroup familiesGroup = new ButtonGroup(); for( String family : families ) { if( Arrays.binarySearch( availableFontFamilyNames, family ) < 0 && - !family.equals( FlatInterFont.FAMILY ) ) + !family.equals( FlatInterFont.FAMILY ) && + !family.equals( FlatRobotoFont.FAMILY ) ) continue; // not available JCheckBoxMenuItem item = new JCheckBoxMenuItem( family ); diff --git a/flatlaf-fonts/README.md b/flatlaf-fonts/README.md index fb4d94ebb..df83b8b7b 100644 --- a/flatlaf-fonts/README.md +++ b/flatlaf-fonts/README.md @@ -6,3 +6,4 @@ easy-to-use and redistributable JARs. - [Inter](flatlaf-fonts-inter) font - [JetBrains Mono](flatlaf-fonts-jetbrains-mono) font +- [Roboto](flatlaf-fonts-roboto) font diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/README.md b/flatlaf-fonts/flatlaf-fonts-roboto/README.md new file mode 100644 index 000000000..43bed2651 --- /dev/null +++ b/flatlaf-fonts/flatlaf-fonts-roboto/README.md @@ -0,0 +1,76 @@ +Roboto font +=========== + +This sub-project contains fonts from the Roboto font family and bundles them +into an easy-to-use and redistributable JAR. + +Font home page: https://fonts.google.com/specimen/Roboto + +GitHub project: https://github.com/googlefonts/roboto + +License: +[Apache License, Version 2.0](src/main/resources/com/formdev/flatlaf/fonts/roboto/LICENSE.txt) + + +How to install? +--------------- + +Invoke the `install()` method once (e.g. in your `main()` method; on AWT +thread): + +~~~java +FlatRobotoFont.install(); +~~~ + + +How to use? +----------- + +Use as default font: + +~~~java +FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY ); +FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT ); +FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD ); +~~~ + +Create fonts: + +~~~java +// basic styles +new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 ); +new Font( FlatRobotoFont.FAMILY, Font.ITALIC, 12 ); +new Font( FlatRobotoFont.FAMILY, Font.BOLD, 12 ); +new Font( FlatRobotoFont.FAMILY, Font.BOLD | Font.ITALIC, 12 ); + +// light +new Font( FlatRobotoFont.FAMILY_LIGHT, Font.PLAIN, 12 ); +new Font( FlatRobotoFont.FAMILY_LIGHT, Font.ITALIC, 12 ); + +// semibold +new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 ); +new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 ); +~~~ + + +Download +-------- + +Not yet available. + + diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts new file mode 100644 index 000000000..238493ada --- /dev/null +++ b/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts @@ -0,0 +1,62 @@ +/* + * Copyright 2022 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Version format: [-] +// For maven compatibility, should be in format .[.]. +// is optional and should be incremented only if a new release is +// necessary, but the has not changed. +version = "2.137" + +if( !rootProject.hasProperty( "release" ) ) + version = version.toString() + "-SNAPSHOT" + + +plugins { + `java-library` + `flatlaf-module-info` + `flatlaf-publish` +} + +dependencies { + testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" ) + testImplementation( "org.junit.jupiter:junit-jupiter-params" ) + testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) +} + +java { + withSourcesJar() + withJavadocJar() +} + +tasks { + named( "sourcesJar" ) { + exclude( "**/*.ttf", "**/*.otf" ) + } + + test { + useJUnitPlatform() + testLogging.exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL + } + + withType().configureEach { + onlyIf { !rootProject.hasProperty( "skipFonts" ) } + } +} + +flatlafPublish { + artifactId = "flatlaf-fonts-roboto" + name = "FlatLaf Roboto Fonts Pack" +} diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java new file mode 100644 index 000000000..fbdbfaf72 --- /dev/null +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java @@ -0,0 +1,150 @@ +/* + * Copyright 2022 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +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; + +/** + * The Roboto font family. + *

+ * Font home page: https://fonts.google.com/specimen/Roboto
+ * GitHub project: https://github.com/googlefonts/roboto + *

+ * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread): + *

{@code
+ * FlatRobotoFont.install();
+ * }
+ *

+ * Use as default font: + *

{@code
+ * FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY );
+ * FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT );
+ * FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
+ * }
+ *

+ * Create fonts: + *

{@code
+ * new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
+ * new Font( FlatRobotoFont.FAMILY, Font.ITALIC, 12 );
+ * new Font( FlatRobotoFont.FAMILY, Font.BOLD, 12 );
+ * new Font( FlatRobotoFont.FAMILY, Font.BOLD | Font.ITALIC, 12 );
+ * new Font( FlatRobotoFont.FAMILY_LIGHT, Font.PLAIN, 12 );
+ * new Font( FlatRobotoFont.FAMILY_LIGHT, Font.ITALIC, 12 );
+ * new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 );
+ * new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 );
+ * }
+ * + * @author Karl Tauber + */ +public class FlatRobotoFont +{ + /** + * Family name for basic styles (regular, italic and bold). + *

+ * Usage: + *

{@code
+	 * new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
+	 * new Font( FlatRobotoFont.FAMILY, Font.ITALIC, 12 );
+	 * new Font( FlatRobotoFont.FAMILY, Font.BOLD, 12 );
+	 * new Font( FlatRobotoFont.FAMILY, Font.BOLD | Font.ITALIC, 12 );
+	 * }
+ */ + public static final String FAMILY = "Roboto"; + + /** + * Family name for light styles. + *

+ * Usage: + *

{@code
+	 * new Font( FlatRobotoFont.FAMILY_LIGHT, Font.PLAIN, 12 );
+	 * new Font( FlatRobotoFont.FAMILY_LIGHT, Font.ITALIC, 12 );
+	 * }
+ */ + public static final String FAMILY_LIGHT = "Roboto Light"; + + /** + * Family name for semibold styles. + *

+ * Usage: + *

{@code
+	 * new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 );
+	 * new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 );
+	 * }
+ */ + public static final String FAMILY_SEMIBOLD = "Roboto Medium"; + + /** + * Use for {@link #installStyle(String)} to install single font style. + */ + public static final String + // basic styles + STYLE_REGULAR = "Roboto-Regular.ttf", + STYLE_ITALIC = "Roboto-Italic.ttf", + STYLE_BOLD = "Roboto-Bold.ttf", + STYLE_BOLD_ITALIC = "Roboto-BoldItalic.ttf", + + // light + STYLE_LIGHT = "Roboto-Light.ttf", + STYLE_LIGHT_ITALIC = "Roboto-LightItalic.ttf", + + // semibold + STYLE_SEMIBOLD = "Roboto-Medium.ttf", + STYLE_SEMIBOLD_ITALIC = "Roboto-MediumItalic.ttf"; + + + private FlatRobotoFont() {} + + /** + * Creates and registers the fonts for all styles. + */ + public static void install() { + // basic styles + installStyle( STYLE_REGULAR ); + installStyle( STYLE_ITALIC ); + installStyle( STYLE_BOLD ); + installStyle( STYLE_BOLD_ITALIC ); + + // light + installStyle( STYLE_LIGHT ); + installStyle( STYLE_LIGHT_ITALIC ); + + // semibold + installStyle( STYLE_SEMIBOLD ); + installStyle( STYLE_SEMIBOLD_ITALIC ); + } + + /** + * Creates and registers the font for the given style. + * 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; + } + } +} diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java new file mode 100644 index 000000000..595c27508 --- /dev/null +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java @@ -0,0 +1,26 @@ +/* + * Copyright 2022 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @author Karl Tauber + */ +module com.formdev.flatlaf.fonts.roboto { + requires java.desktop; + + exports com.formdev.flatlaf.fonts.roboto; + + opens com.formdev.flatlaf.fonts.roboto; +} diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/LICENSE.txt b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/LICENSE.txt new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Bold.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Bold.ttf new file mode 100644 index 000000000..43da14d84 Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Bold.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-BoldItalic.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-BoldItalic.ttf new file mode 100644 index 000000000..bcfdab431 Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-BoldItalic.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Italic.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Italic.ttf new file mode 100644 index 000000000..1b5eaa361 Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Italic.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Light.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Light.ttf new file mode 100644 index 000000000..e7307e72c Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Light.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-LightItalic.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-LightItalic.ttf new file mode 100644 index 000000000..2d277afb2 Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-LightItalic.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Medium.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Medium.ttf new file mode 100644 index 000000000..ac0f908b9 Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Medium.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-MediumItalic.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-MediumItalic.ttf new file mode 100644 index 000000000..fc36a4785 Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-MediumItalic.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Regular.ttf b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Regular.ttf new file mode 100644 index 000000000..ddf4bfacb Binary files /dev/null and b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/resources/com/formdev/flatlaf/fonts/roboto/Roboto-Regular.ttf differ diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/test/java/com/formdev/flatlaf/fonts/roboto/TestFlatRobotoFont.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/test/java/com/formdev/flatlaf/fonts/roboto/TestFlatRobotoFont.java new file mode 100644 index 000000000..8afac6d31 --- /dev/null +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/test/java/com/formdev/flatlaf/fonts/roboto/TestFlatRobotoFont.java @@ -0,0 +1,50 @@ +/* + * Copyright 2022 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.fonts.roboto; + +import java.awt.Font; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Karl Tauber + */ +class TestFlatRobotoFont +{ + @Test + void testFont() { + FlatRobotoFont.install(); + + testFont( FlatRobotoFont.FAMILY, Font.PLAIN, 13 ); + testFont( FlatRobotoFont.FAMILY, Font.ITALIC, 13 ); + testFont( FlatRobotoFont.FAMILY, Font.BOLD, 13 ); + testFont( FlatRobotoFont.FAMILY, Font.BOLD | Font.ITALIC, 13 ); + + testFont( FlatRobotoFont.FAMILY_LIGHT, Font.PLAIN, 13 ); + testFont( FlatRobotoFont.FAMILY_LIGHT, Font.ITALIC, 13 ); + + testFont( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 13 ); + testFont( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 13 ); + } + + private void testFont( String family, int style, int size ) { + Font actual = new Font( family, style, size ); + assertEquals( family, actual.getFamily() ); + assertEquals( style, actual.getStyle() ); + assertEquals( size, actual.getSize() ); + } +} diff --git a/flatlaf-testing/build.gradle.kts b/flatlaf-testing/build.gradle.kts index 93f420abe..f1e823604 100644 --- a/flatlaf-testing/build.gradle.kts +++ b/flatlaf-testing/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation( project( ":flatlaf-extras" ) ) implementation( project( ":flatlaf-fonts-inter" ) ) implementation( project( ":flatlaf-fonts-jetbrains-mono" ) ) + implementation( project( ":flatlaf-fonts-roboto" ) ) implementation( project( ":flatlaf-swingx" ) ) implementation( project( ":flatlaf-jide-oss" ) ) implementation( project( ":flatlaf-intellij-themes" ) ) diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java index 479136453..1891bdd74 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java @@ -25,6 +25,7 @@ import javax.swing.*; import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; +import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.util.UIScale; import net.miginfocom.swing.*; @@ -38,6 +39,7 @@ public static void main( String[] args ) { SwingUtilities.invokeLater( () -> { FlatInterFont.install(); FlatJetBrainsMonoFont.install(); + FlatRobotoFont.install(); FlatTestFrame frame = FlatTestFrame.create( args, "FlatFontsTest" ); frame.showFrame( FlatFontsTest::new ); diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java index 187ef6ed8..d8702c410 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java @@ -32,6 +32,7 @@ import com.formdev.flatlaf.FlatSystemProperties; import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; +import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; @@ -52,6 +53,7 @@ public static void main( String[] args ) { SwingUtilities.invokeLater( () -> { FlatInterFont.install(); FlatJetBrainsMonoFont.install(); + FlatRobotoFont.install(); FlatTestFrame frame = FlatTestFrame.create( args, "FlatPaintingStringTest" ); @@ -76,9 +78,10 @@ public static void main( String[] args ) { String[] families = { // regular "Arial", "Cantarell", "DejaVu Sans", - "Dialog", "Helvetica Neue", "Liberation Sans", "Noto Sans", "Open Sans", "Roboto", + "Dialog", "Helvetica Neue", "Liberation Sans", "Noto Sans", "Open Sans", "SansSerif", "Segoe UI", "Tahoma", "Ubuntu", "Verdana", ".SF NS Text", FlatInterFont.FAMILY, + FlatRobotoFont.FAMILY, // light, semibold "Segoe UI Light", "Segoe UI Semibold", @@ -86,6 +89,7 @@ public static void main( String[] args ) { "Lato Light", "Ubuntu Light", "Cantarell Light", "Lato Semibold", "Ubuntu Medium", "Montserrat SemiBold", FlatInterFont.FAMILY_LIGHT, FlatInterFont.FAMILY_SEMIBOLD, + FlatRobotoFont.FAMILY_LIGHT, FlatRobotoFont.FAMILY_SEMIBOLD, // monospaced "Monospaced", "Consolas", "Courier New", "Menlo", "Liberation Mono", "Ubuntu Mono", diff --git a/flatlaf-theme-editor/build.gradle.kts b/flatlaf-theme-editor/build.gradle.kts index 676db2a37..2da93a597 100644 --- a/flatlaf-theme-editor/build.gradle.kts +++ b/flatlaf-theme-editor/build.gradle.kts @@ -24,6 +24,7 @@ dependencies { implementation( project( ":flatlaf-extras" ) ) implementation( project( ":flatlaf-fonts-inter" ) ) implementation( project( ":flatlaf-fonts-jetbrains-mono" ) ) + implementation( project( ":flatlaf-fonts-roboto" ) ) implementation( "com.miglayout:miglayout-swing:5.3" ) implementation( "com.fifesoft:rsyntaxtextarea:3.1.4" ) @@ -36,6 +37,7 @@ tasks { dependsOn( ":flatlaf-extras:jar" ) dependsOn( ":flatlaf-fonts-inter:jar" ) dependsOn( ":flatlaf-fonts-jetbrains-mono:jar" ) + dependsOn( ":flatlaf-fonts-roboto:jar" ) manifest { attributes( "Main-Class" to "com.formdev.flatlaf.themeeditor.FlatLafThemeEditor" ) diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java index a0bcb100e..8910769c0 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java @@ -65,6 +65,7 @@ import com.formdev.flatlaf.extras.components.*; import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; +import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.icons.FlatClearIcon; import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.StringUtils; @@ -110,6 +111,7 @@ static void main( String[] args ) { if( SystemInfo.isJava_11_orLater ) FlatInterFont.install(); FlatJetBrainsMonoFont.install(); + FlatRobotoFont.install(); FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.themeeditor" ); diff --git a/settings.gradle.kts b/settings.gradle.kts index 0e29a1651..bb809141d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -27,6 +27,7 @@ include( "flatlaf-theme-editor" ) includeProject( "flatlaf-fonts-inter", "flatlaf-fonts/flatlaf-fonts-inter" ) includeProject( "flatlaf-fonts-jetbrains-mono", "flatlaf-fonts/flatlaf-fonts-jetbrains-mono" ) +includeProject( "flatlaf-fonts-roboto", "flatlaf-fonts/flatlaf-fonts-roboto" ) includeProject( "flatlaf-natives-windows", "flatlaf-natives/flatlaf-natives-windows" ) includeProject( "flatlaf-natives-linux", "flatlaf-natives/flatlaf-natives-linux" )