やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

FontOptionsでアンチエイリアス

FontOptionsでアンチエイリアス

Cairo::FontOptionsでアンチエイリアスをかけてみた。

Window

文字列がきれいに表示された。

入手先

GitHub MEGA

開発環境

ライブラリ

アンチエイリアシング

要点コード

Cairo::FontOptions m_fontOption;
m_fontOption.set_antialias(Cairo::ANTIALIAS_SUBPIXEL);
m_fontOption.set_subpixel_order(Cairo::SUBPIXEL_ORDER_DEFAULT);
m_fontOption.set_hint_style(Cairo::HINT_STYLE_SLIGHT);

Cairo::RefPtr< Cairo::Context > cr = get_window()->create_cairo_context();
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(cr);
Glib::RefPtr<Pango::Context> pangoCtx = layout->get_context();
pangoCtx->set_cairo_font_options(m_fontOption);

FontOptionsクラスでアンチエイリアスのかけ方を指定する。 set_cairo_font_options関数で指定した値をセットする。

なお、Cairo::set_font_options(), Cairo::set_antialias()に設定しても効果がないように見えた。 Pango::Context::set_cairo_font_options()に設定することで効果があるように見えた。

品質

Antialias

Cairo::FontOptions::set_antialias(Antialias antialias)アンチエイリアスをかける。引数のAntialiasenum

WindowsTextRenderingHintと対応しているのかどうなのか実装は知らない。定義名から消去法で根拠なく推測した対応表。

Cairo Antialias Win32 TextRenderingHint
ANTIALIAS_DEFAULT SystemDefault
ANTIALIAS_NONE SingleBitPerPixel
ANTIALIAS_GRAY AntiAlias
ANTIALIAS_SUBPIXEL ClearType

他、こちら

サブピクセルサンプリング MicrosoftClearType, Adobe の CoolType と同義

も参考にさせていただきました。

比較

画像キャプチャを撮って比較してみる。

Cairo::FontOptions::set_antialias(Antialias antialias) image
ANTIALIAS_DEFAULT ANTIALIAS_DEFAULT
ANTIALIAS_NONE ANTIALIAS_NONE
ANTIALIAS_GRAY WS_0108_ANTIALIAS_GRAY
ANTIALIAS_SUBPIXEL ANTIALIAS_SUBPIXEL

その他は以下の値。

  • Cairo::FontOptions::set_hint_style(Cairo::HINT_STYLE_SLIGHT);
  • Cairo::FontOptions::set_subpixel_order(Cairo::SUBPIXEL_ORDER_DEFAULT);

ANTIALIAS_SUBPIXELがもっとも綺麗。 次点がANTIALIAS_GRAY。 ANTIALIAS_NONEはアンチエイリアスをかけていないように見える。 ANTIALIAS_DEFAULTはANTIALIAS_NONEと同じか。

ANTIALIAS_SUBPIXELでも、アラがないわけじゃない。"a"の字の曲線がわかりやすい。シャギーが見える。 でも、"A"の斜め直線は綺麗。

Hinting

//m_fontOption.set_hint_style(Cairo::HINT_STYLE_DEFAULT);
//m_fontOption.set_hint_style(Cairo::HINT_STYLE_NONE);
m_fontOption.set_hint_style(Cairo::HINT_STYLE_SLIGHT);
//m_fontOption.set_hint_style(Cairo::HINT_STYLE_MEDIUM);
//m_fontOption.set_hint_style(Cairo::HINT_STYLE_FULL);

ヒンティング。これは変更しても見た目で違いが分からなかった。 とりあえずHINT_STYLE_SLIGHTに設定してある。

こちらのヒンティングの説明を参考にさせていただきました。 ほかにもフォントに関して詳しく説明されており大変勉強になりました。 ありがとうございます。