はじめに
コーディング向けフォントにMyricaとSource Han Code JPがあります。
これらのフォントは視認性が高く気に入っていたのでWindows版のIntelliJで使おうとしたのですが使えなかった話です。
ちなみにMac版だと問題なく表示できます。ぐぬぬ…
原因を探る
IntelliJはOSSなのでフォント選択部分のソースを探します。
大体、この辺りなのでチェックコードを抜き出して検証してみます。
以下の条件をすべて満たすとフォント一覧に表示されます。
- フォント名が
.bold
で終わらない - フォント名が
.italic
で終わらない - 標準フォントと太字フォントでアセントとディセントが0以上
- 標準フォントと太字フォントで小文字の
l
、大文字のW
、スペースの幅が1以上
検証環境
- OS: Windows8.1
- Java: 1.8.0_60
検証用のコード
Main.java
import java.awt.*;
import java.util.Arrays;
import javax.swing.*;
public class Main extends JPanel {
private static final long serialVersionUID = -1L;
public static void main(String[] args) {
Main m = new Main();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
Arrays.stream(ge.getAvailableFontFamilyNames()).forEach(m::checkFont);
}
void checkFont(String fontName) {
Font plainFont = new Font(fontName, Font.PLAIN, 12);
System.out.print("| " + fontName + " |");
if (plainFont.canDisplay('W')) {
Font boldFont = plainFont.deriveFont(Font.BOLD);
FontMetrics plainMetrics = getFontMetrics(plainFont);
FontMetrics boldMetrics = getFontMetrics(boldFont);
int plainDescent = plainMetrics.getDescent();
int plainAscent = plainMetrics.getAscent();
int boldDescent = boldMetrics.getDescent();
int boldAscent = boldMetrics.getAscent();
System.out.printf(" %d | %d | %d | %d |", plainDescent, plainAscent, boldDescent, boldAscent);
int plainL = plainMetrics.charWidth('l');
int boldL = boldMetrics.charWidth('l');
int plainW = plainMetrics.charWidth('W');
int boldW = boldMetrics.charWidth('W');
int plainSpace = plainMetrics.charWidth(' ');
int boldSpace = boldMetrics.charWidth(' ');
System.out.printf(" %d | %d | %d | %d", plainL, boldL, plainW, boldW, plainSpace, boldSpace);
}
System.out.println(" |");
}
}
検証結果
Myrica
plainDescentとboldDescentが負数なのでNG
フォント名 | plainDescent | plainAscent | boldDescent | boldAscent | plainL | boldL | plainW | boldW |
---|---|---|---|---|---|---|---|---|
Myrica M | -1 | 10 | -1 | 10 | 6 | 7 | 6 | 7 |
Myrica N | -1 | 10 | -1 | 10 | 4 | 5 | 4 | 5 |
Myrica P | -1 | 10 | -1 | 10 | 6 | 7 | 6 | 7 |
Source Han Code JP
plainAscentとboldAscentが負数および文字幅が0なのでNG
フォント名 | plainDescent | plainAscent | boldDescent | boldAscent | plainL | boldL | plainW | boldW |
---|---|---|---|---|---|---|---|---|
Source Han Code JP B | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
Source Han Code JP EL | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
Source Han Code JP H | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
Source Han Code JP L | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
Source Han Code JP M | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
Source Han Code JP N | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
Source Han Code JP R | 240 | -239 | 240 | -239 | 0 | 0 | 0 | 0 |
MS ゴシックとMS 明朝
参考までにMS ゴシックとMS 明朝の値です。
フォント名 | plainDescent | plainAscent | boldDescent | boldAscent | plainL | boldL | plainW | boldW |
---|---|---|---|---|---|---|---|---|
MS ゴシック | 2 | 11 | 2 | 11 | 6 | 7 | 6 | 7 |
MS 明朝 | 2 | 11 | 2 | 11 | 6 | 7 | 6 | 7 |
MS Pゴシック | 2 | 11 | 2 | 11 | 3 | 4 | 9 | 10 |
MS P明朝 | 2 | 11 | 2 | 11 | 3 | 4 | 11 | 12 |
結論
フォント周りは分からないので原因も分からないのですが見事にチェックに引っかかっています。
どうすればいいんだ…