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

結論

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

AWS Q Developer image

Your AI Code Assistant

Generate and update README files, create data-flow diagrams, and keep your project fully documented. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay