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

フォントラベルのHighDPI対応 #645

Merged
merged 2 commits into from
Nov 25, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions sakura_core/prop/CPropCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include "env/CDocTypeManager.h"
#include "CEditApp.h"
#include "util/shell.h"
#include "util/window.h"
#include "sakura_rc.h"

int CPropCommon::SearchIntArr( int nKey, int* pnArr, int nArrNum )
Expand Down Expand Up @@ -495,9 +496,11 @@ HFONT CPropCommon::SetFontLabel( HWND hwndDlg, int idc_static, const LOGFONT& lf
TCHAR szFontName[80];
LOGFONT lfTemp;
lfTemp = lf;

// 大きすぎるフォントは小さく表示
if( lfTemp.lfHeight < -16 ){
lfTemp.lfHeight = -16;
int limitSize = DpiScaleY( 16 );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DpiScaleY の実装はこうなっていて、

inline int DpiScaleY(int y){return CDPI::ScaleY(y);}

CDPI::ScaleY の実装はこうなっていますが、

static int ScaleY(int y){Init(); return ::MulDiv(y, nDpiY, 96);}

LOGFONT::lfHeight の値って、

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

こういうように設定するようにドキュメントに書かれているので画面座標のDPI対応で使う 96 という数値がフォントの場合にも適用できるか心配です。

しかし 96 とか 72 とか経緯が不明です…。
https://en.wikipedia.org/wiki/Dots_per_inch#Computer_monitor_DPI_standards
に書かれてそうなのですが tl;dr: です…。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こういうように設定するようにドキュメントに書かれているので画面座標のDPI対応で使う 96 という数値がフォントの場合にも適用できるか心配です。

その辺こだわりなかったので純粋に比率で拡大するようにしました。

72とか96とかについては、前にここで書いてます。
#471 (comment)

この数式を使う場合は、引数のnpsを渡して算出してやる形になるのかな、と思います。

lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

・・・この数式ってポイントサイズ⇒ピクセルサイズの変換式じゃないですかね?
ポイントという単位は 72 が関係する単位だったと思います。
ちょっと調べてみます。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://ja.wikipedia.org/wiki/ポイント

1 pt = 1/72 in. (= 25.4/72 mm = 0.352 777 7... mm)

とありました。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://opentype.jp/pointdot.htm

1ポイントは1/72インチに相当します。(1/72は72分の1を現します。)

という事なのでフォントの場合は 96 より 72 を使ってあげた方が良いと思います。

if ( lfTemp.lfHeight < -limitSize ) {
lfTemp.lfHeight = -limitSize;
}

hFont = SetCtrlFont( hwndDlg, idc_static, lfTemp );
Expand Down
7 changes: 5 additions & 2 deletions sakura_core/typeprop/CPropTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "CEditApp.h"
#include "view/colors/EColorIndexType.h"
#include "util/shell.h"
#include "util/window.h"
#include "sakura_rc.h"


Expand Down Expand Up @@ -282,9 +283,11 @@ HFONT CPropTypes::SetFontLabel( HWND hwndDlg, int idc_static, const LOGFONT& lf,
TCHAR szFontName[80];
LOGFONT lfTemp;
lfTemp = lf;

// 大きすぎるフォントは小さく表示
if( lfTemp.lfHeight < -16 ){
lfTemp.lfHeight = -16;
int limitSize = DpiScaleY( 16 );
if ( lfTemp.lfHeight < -limitSize ) {
lfTemp.lfHeight = -limitSize;
}

if (bUse) {
Expand Down