2009-05-29 44 views
9

特定のフォントを使用して、JavaのFontLayoutを使用して、そのascent、descent、およびleadingを決定します。Javaのフォントメトリックが正しくない/見つからない?

Ascent: 8.550781 
    Descent: 2.1679688 
    Leading: 0.0 

Font font = new Font("Arial Unicode MS", 0, 8); 
    TextLayout layout = new TextLayout("Pp", font, 
           new FontRenderContext(null, true, true)); 
    System.out.println("Ascent: "+layout.getAscent()); 
    System.out.println("Descent: "+layout.getDescent()); 
    System.out.println("Leading: "+layout.getLeading()); 

Javaは私に次の値を与える:私は、次のコードを使用してのArial UnicodeのMS、フォントサイズ8を使用しています私の特定のケースで

(JavaのFontLayoutチュートリアルhereを参照してください)

これまでのところとても良いです。しかし、これらの値の合計をさまざまなテキスト行の行間隔として使用すると、これはOpenOffice、Microsoft Wordなどで使用される行間隔とはかなり異なります。既定の単一行間隔を使用する場合、Wordとオブジェクト指向は、13.7 pt(上記のJavaのフォントメトリックを使用して計算したように10.7ptの代わりに)の行間隔を持つようです。

任意のアイデア

  1. これはなぜですか?
  2. どういうわけかフォント情報にアクセスできるかWordとOpenOfficeはこの異なる行間隔につながるアクセスしているようですか?

私がこれまで試したもの:

  • font.getNumGlyphs()でグリフベクトルにすべてのグリフを追加することなど - まだ取得同じフォントメトリックは、複数行を使用して
  • hereに記載されているように、私が得た各行は、上に概説したのと同じフォントメトリクスを持っています。 Javaはないが、このようなgetLeading()

答えて

10

Zarkonnenは彼が正しい行にいるように彼のdownvotesに値するしません。多くのJavaフォントは、そうでなければならないときに、その先頭にゼロを返すように見えます。たぶんそれはthis bugに至りました。わかりません。この空白を戻すことはあなた次第です。

通常、行の高さは、ascent + descent + leadingとして定義されます。上昇と下降は、キャラクターが座っているベースラインから上下に測定され、先頭は1行の下降とその下の行の上下の間のスペースです。

alt text

しかし、大手は固定されていません。ほとんどのワードプロセッサーやタイポグラフィーのソフトウェアでは、先を設定することができます。 Wordはこれを行間と呼びます。元の質問は、おそらく、Microsoft Wordが1行の間隔を計算する方法を尋ねています。マイクロソフトのrecommendations for OpenType fontsは、さまざまなプラットフォームのソフトウェアがそれを別々に計算することを示唆しているようです。 (これがJavaが現在ゼロを返す理由でしょうか?)

周りをグーグルで回っていることは、先導の経験則が120% of ascent+descent for single-line spacing、または固定小数点間隔であることを示しているようです。すべての行の間に2ptsを導く私が見つけることができるどんなハードまたは高速のルールもなければ、私はそれがあなたが提示しているテキストの判読性に沸騰すると言うでしょう、そして、あなたはあなたが一番よく見えるものと一緒に行かなければなりません。

3

としてFontMetrics 'メソッドを使用して

  • は、Wordや線の間の空白を含むOOはありますか?

    Word/OOでは、あなたの数字はAscent + Descent + Whitespaceですが、JavaではAscent + Descentしかありませんか?

  • +0

    +1これは表示される間違いではありません。 – banjollity

    関連する問題