Windows版IntelliJでSource Han Code JPとMyricaがフォント一覧に表示されない
Tags: font, intellij
Published: 2020-01-28 18:10:00

---
title: Windows版IntelliJでSource Han Code JPとMyricaがフォント一覧に表示されない
published: true
tags: font, IntelliJ
date: 20200128T18:10Z
canonical_url: https://qiita.com/shiena/items/70ba503fd2db4936f240
---
# はじめに

コーディング向けフォントに[Myrica](http://myrica.estable.jp/)と[Source Han Code JP](https://github.com/adobe-fonts/source-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

## 検証用のコード

```java: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 |

### ＭＳ ゴシックとＭＳ 明朝

参考までにＭＳ ゴシックとＭＳ 明朝の値です。

| フォント名 | plainDescent | plainAscent | boldDescent | boldAscent | plainL | boldL | plainW | boldW |
|---|---|---|---|---|---|---|---|---|
| ＭＳ ゴシック | 2 | 11 | 2 | 11 | 6 | 7 | 6 | 7 |
| ＭＳ 明朝 | 2 | 11 | 2 | 11 | 6 | 7 | 6 | 7 |
| ＭＳ Ｐゴシック | 2 | 11 | 2 | 11 | 3 | 4 | 9 | 10 |
| ＭＳ Ｐ明朝 | 2 | 11 | 2 | 11 | 3 | 4 | 11 | 12 |

# 結論

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