-
Notifications
You must be signed in to change notification settings - Fork 163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
等幅フォント使用時に全角文字の文字幅が半角文字のちょうど2倍になるように強制的に設定 #1912
Conversation
✅ Build sakura 1.0.4277 completed (commit 3ad61b747e by @beru) |
sakura/sakura_core/charset/charcode.cpp Lines 65 to 67 in b88e001
「なんとなく」が理由とはいえ現状こういうことらしく、ここの範囲内の制御コードを表示するときに描画やキャレットの動作が破綻しないかどうかが気になります。 |
✅ Build sakura 1.0.4278 completed (commit 41e18682b3 by @beru) |
✅ Build sakura 1.0.4279 completed (commit 740d63e2c1 by @beru) |
✅ Build sakura 1.0.4280 completed (commit 7266a95ee1 by @beru) |
✅ Build sakura 1.0.4281 completed (commit 0955236b2a by @beru) |
✅ Build sakura 1.0.4282 completed (commit cc57442fb1 by @beru) |
// 等幅フォントでも GetTextExtentPoint32 で取得したピクセル幅が半角と全角でぴったし2倍の違いにならない事がある | ||
// 対策として半角より少しでも幅が広い場合は半角幅の2倍に揃える | ||
if ((m_lf.lfPitchAndFamily & FIXED_PITCH) && size.cx > m_han_size.cx) | ||
size.cx = 2 * m_han_size.cx; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 処理が論理的に誤っている(実害もある)
- 処理が論理的に誤っている(実害はない)
どっちかな、が気になりました。
「特定の等幅フォントの特定の全角文字が見切れる」と言ってますよね?
どのフォントのどの文字でしょう。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
主に確認に使用したのは、 https://ja.osdn.net/projects/sakura-editor/forums/34071/48041/ に記載されている
- フォント :
UD デジタル 教科書体 N-R
- フォントサイズ : 14
の組み合わせです。
CCharWidthCache::QueryPixelWidth
メソッドにおいて GetTextExtentPoint32
の呼び出しで取得できる値が
- ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz の文字の場合 : 19
- あいうえおかきくけこさしすせそたちつてとなにぬねのは の文字の場合 : 37
となっていて、全角文字の場合に半角文字のぴったり2倍の値が取れていない事を確認しました。なおディスプレイ設定の表示スケールは 200% の環境で確認をしています。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- 処理が論理的に誤っている(実害もある)
- 処理が論理的に誤っている(実害はない)
どっちかな、が気になりました。
実害はあるので不具合です。
フォントとサイズによって意図した通りの幅が取れないのは、ベクトルフォントをラスタライズしてビットマップを作った際にどの整数値になるかというのが丸めの関係で変わるのかもしれないですね。
例えば、18.6 を四捨五入した整数値は 19 ですが、18.6 * 2 = 37.2 なので四捨五入した整数値は 37 になります。整数値にするとちょうど2倍にならないのはこういう事が原因なのかなと推測しています。
私は自分でFreeTypeのようにベクトルフォントをラスタライズする実装をしているわけじゃないので、間違った事を言っているかもしれません。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
様々な環境で検証しなければ修正の妥当性が判断しづらい問題かもしれません。少なくともコードについては妥当だと思いますので一度マージしてみませんか?
c33fbf0
to
467f870
Compare
❌ Build sakura 1.0.4283 failed (commit 5da5ca45a3 by @berryzplus) |
/azp run |
Azure Pipelines successfully started running 1 pipeline(s). |
This reverts commit 467f870.
CIでのテストが失敗するので諦めます。 |
SonarCloud Quality Gate failed. |
❌ Build sakura 1.0.4284 failed (commit d5dea1253b by @berryzplus) |
✅ Build sakura 1.0.4285 completed (commit 5b11b7b9f0 by @berryzplus) |
レビューありがとうございます。Mergeします。 |
PR対象
カテゴリ
PR の背景
仕様・動作説明
等幅フォント使用時に全角文字の文字幅が半角文字のちょうど2倍になるように強制的に設定を行うように変更しています。
CCharWidthCache::QueryPixelWidth
メソッドでGetTextExtentPoint32
関数で求める方法だとぴったしちょうど2倍にならない事への対策です。PR の影響範囲
文字描画に影響
テスト内容
という文字列を使った場合に、等幅フォント使用時に1行目と2行目の幅が一致するかどうかを確認。
プロポーショナルフォントでは1行目と2行目の幅が一致しない事も確認
という半角カタカナ文字列が半角幅で表示される事を確認
関連 issue, PR
#1250
参考資料
https://ja.osdn.net/projects/sakura-editor/forums/34071/48041/