10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-10-07

はじめに

コーディング向けフォントにMyricaSource 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

結論

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

10
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?