バグ #1290
未完了絵文字と普通のテキストが同じ行に現れると行の高さが異常に高くなる
説明
絵文字と普通のテキストが同じ行に現れると、その行の高さが異常に高くなります。
ブラウザ上の表示
mikutterの表示
mikutterで行を選択したところ
ファイル
Izumi Tsutsui さんが7年以上前に更新
- ファイル tsutsuii@social.mikutter.hachune.net-100613991687635368.png tsutsuii@social.mikutter.hachune.net-100613991687635368.png を追加
- ファイル 6c1ee9caf36cdd5d.png 6c1ee9caf36cdd5d.png を追加
経過メモ¶
mastodon まとめ
https://social.mikutter.hachune.net/@tsutsuii/100613991687635368
「絵文字と普通のテキストが同じ行に現れると行の高さが異常に高くなる」 #1290
関連で「絵文字と普通のテキストが同じ行に現れるトゥートを引用すると引用表示の絵文字描画位置がズレる」が発生した
https://social.mikutter.hachune.net/@osa_k/100614859106618057
絵文字スペース問題、Cで再現したのでpango側の問題で確定っぽい
https://gist.github.com/osak/d8c3cbfaad7c042125282e190061b585
Izumi Tsutsui さんが4年以上前に更新
Izumi Tsutsui さんは #note-1 で書きました:
https://social.mikutter.hachune.net/@osa_k/100614859106618057
絵文字スペース問題、Cで再現したのでpango側の問題で確定っぽい
https://gist.github.com/osak/d8c3cbfaad7c042125282e190061b585
#1504 と関係あるかなと思って探してみたらちゃんと書いてなかったので続き
https://social.mikutter.hachune.net/@osa_k/100615073467204051
subscribeする前にgtk-listに質問投げてモデレータ行きにするというクソムーブをかました
おさけーさんの gtk-list の投稿はこれ
https://www.mail-archive.com/gtk-list@gnome.org/msg35648.html
現象としてはあんまり関係ない感じですかね……
Izumi Tsutsui さんが約1ヶ月前に更新
- ファイル fontmetrics-light.png fontmetrics-light.png を追加
- ファイル mikutter-1290-firefox.png mikutter-1290-firefox.png を追加
- ファイル mikutter-1290-3.png mikutter-1290-3.png を追加
- ファイル 0001-refs-1290.patch 0001-refs-1290.patch を追加
- ステータス を 分類待ち から パッチ適用待ち に変更
新年早々最近のムーブでChatGPTにこの問題を投げたところ、
source:core/mui/cairo_markup_generator.rb
source:core/mui/cairo_sub_parts_message_base.rb
それぞれの Pango::Rectangle.new の y に 0 を渡しているのがNG、とのこと。
これはおさけーさんのCサンプルコードでも同じです。
pango の仕様には文字列の高さ方向の要素として以下がある、とのこと。
- 基準位置となる baseline
- baseline より上側の高さを示す ascent
- baseline より下側の高さを示す descent
- 行の高さ height
https://docs.gtk.org/Pango/struct.FontMetrics.html
上記のページの絵には Baseline が無いので書き足したのが以下の絵
ここで、 Pango::Rectangle.new に渡す y の値は「Baseline の位置の高さが 0 である」とのこと。
よって、 y に 0 を渡すと Baseline より下に絵文字が描かれてしまうので、
結果として絵文字の描画位置が下にズレる、行の高さもそれに引きずられて高くなる、
ということらしいです。
Firefox などブラウザの描画を見ると、絵文字の下端は descent 位置に合わせているようです。
description_attr_listに pango のcontextを渡すdescription_attr_listでcontext.get_metricsからdescentを取得するPango::Rectangle.newに渡すyを「絵文字高さ分マイナス」した値からdescent分だけ下にずらした値(加算した値)にする

なお、本文描画と subparts 描画とそれぞれに description_attr_list があるのでそれぞれ修正する必要があります。
ChatGPTが投げてきたコードはいろいろよくわからん記述があったので、
添付のパッチは上記記載の仕様で書き直してあります。
0001-refs-1290.patch

