Skip to content
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

水平スクロール時に文字が欠ける問題を修正 #1975

Merged

Conversation

suconbu
Copy link
Member

@suconbu suconbu commented Jan 4, 2025

PR対象

  • アプリ(サクラエディタ本体)

カテゴリ

  • 不具合修正

PR の背景

#1974 で報告されている問題を修正します。

仕様・動作説明

CTextDrawer::DispText() では引数として入力された描画対象のテキスト (pData) のうち、描画領域 (`hdc') の左側にはみ出す分の描画をスキップするようになっていますが、本来描画しなければいけない文字までスキップされてしまう場合があることが分かったため処理を修正します。

修正対象となる処理は以下の所で、

if ( x < 0 ){
int nLeftLayout = ( 0 - x ) / nDx - 1;
CLayoutMgr& layoutMgr = m_pEditView->m_pcEditDoc->m_cLayoutMgr;
while (nBeforeLayout < nLeftLayout){
nBeforeLayout += layoutMgr.GetLayoutXOfChar(pData, nLength, nBeforeLogic);
nBeforeLogic += CNativeW::GetSizeOfChar( pData, nLength, nBeforeLogic );
}
}

変数の意味は以下のようになっています。

変数 意味
x テキスト左端の描画座標 (ピクセル単位)
nDx 半角1文字の幅 (ピクセル単位)
nLeftLayout 左側にはみ出すレイアウト単位 - 1
nBeforeLayout スキップするレイアウト単位
nBeforeLogic スキップする論理単位

プロポーショナルフォント対応以前の「1レイアウト単位=半角1文字分(桁)」となっていた時は現状の処理で問題ないように見えますが、「1レイアウト単位=1ピクセル」となったことで、はみ出していない文字までスキップされるようになっています。

対策内容:

  • while ループの脱出条件を修正します。

要素の位置関係:

問題が発生しないギリギリの状態 (x == -1, nLeftLayout == 0):

問題が発生する状態 (x が -2 以下, nLeftLayout > 0) (この状態から左へスクロールすると文字欠けが起きる):

PR の影響範囲

テスト内容

本項に添付の ini ファイル、テキストファイルを使って以下を確認します。

添付ファイル:
sakura.zip
issues_1974_test.txt

関連 issue, PR

#1974

参考資料

@AppVeyorBot
Copy link

Build sakura 1.0.4370 completed (commit cbaea9cdfa by @suconbu)

Copy link

sonarqubecloud bot commented Jan 4, 2025

@AppVeyorBot
Copy link

Build sakura 1.0.4371 completed (commit 46fd332e0c by @suconbu)

@suconbu
Copy link
Member Author

suconbu commented Jan 5, 2025

Approveありがとうございます。
MinGWビルドでエラーが出てしまってますが、本PRの変更とは無関係に見えるのでこのままマージしたいと思います。

@suconbu suconbu merged commit 1fcac94 into sakura-editor:master Jan 5, 2025
22 of 25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants