DEV Community

KOGA Mitsuhiro
KOGA Mitsuhiro

Posted on • Originally published at qiita.com

Windows版IntelliJでSource Han Code JPとMyricaがフォント一覧に表示されない

はじめに

コーディング向けフォントにMyricaSource Han Code JPがあります。
これらのフォントは視認性が高く気に入っていたのでWindows版のIntelliJで使おうとしたのですが使えなかった話です。
ちなみにMac版だと問題なく表示できます。ぐぬぬ…

原因を探る

IntelliJはOSSなのでフォント選択部分のソースを探します。

https://github.com/JetBrains/intellij-community/blob/143/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java#L360-L387

大体、この辺りなのでチェックコードを抜き出して検証してみます。
以下の条件をすべて満たすとフォント一覧に表示されます。

  • フォント名が.boldで終わらない
  • フォント名が.italicで終わらない
  • 標準フォントと太字フォントでアセントとディセントが0以上
  • 標準フォントと太字フォントで小文字のl、大文字のW、スペースの幅が1以上

検証環境

  • OS: Windows8.1
  • Java: 1.8.0_60

検証用のコード

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

結論

フォント周りは分からないので原因も分からないのですが見事にチェックに引っかかっています。
どうすればいいんだ…

Top comments (0)