FontOptionsでアンチエイリアス
Cairo::FontOptionsでアンチエイリアスをかけてみた。
文字列がきれいに表示された。
入手先
開発環境
- Windows XP Pro SP3 32bit
- VC++ 2010 Express
ライブラリ
アンチエイリアシング
要点コード
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)でアンチエイリアスをかける。引数のAntialiasはenum。
WindowsのTextRenderingHintと対応しているのかどうなのか実装は知らない。定義名から消去法で根拠なく推測した対応表。
Cairo Antialias | Win32 TextRenderingHint |
---|---|
ANTIALIAS_DEFAULT | SystemDefault |
ANTIALIAS_NONE | SingleBitPerPixel |
ANTIALIAS_GRAY | AntiAlias |
ANTIALIAS_SUBPIXEL | ClearType |
他、こちらの
も参考にさせていただきました。
比較
画像キャプチャを撮って比較してみる。
Cairo::FontOptions::set_antialias(Antialias antialias) | image |
---|---|
ANTIALIAS_DEFAULT | |
ANTIALIAS_NONE | |
ANTIALIAS_GRAY | |
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に設定してある。
こちらのヒンティングの説明を参考にさせていただきました。 ほかにもフォントに関して詳しく説明されており大変勉強になりました。 ありがとうございます。