ご対応いただきありがとうございます。
修正版を試したところ、描画の不具合が解消されたことを確認いたしました。
迅速なご対応に感謝申し上げます。
その一方で、修正版の使用中に気づいた新たな不具合らしきものについてご報告させていただきます。
* DXライブラリのバージョン: ご提供いただいた修正版
* 開発環境: MSVC 2022 / C++23 / Windows 11 24H2
「CreateDXFontData.exe」で作成した .dftファイル を使用して描画を行うと、特定の条件下で不具合が発生します。
再現手順:
* CreateDXFontData.exe に /B4 オプションを渡して .dft ファイルを作成します。
* 作成した .dft ファイルからフォントハンドルを作成し、アルファ値が255、RGBがすべて255の完全な白色で文字を描画します。
期待される挙動:
完全な白色で文字が描画される。
実際の挙動:
描画された文字がわずかに半透明になってしまう。
備考:
* CreateDXFontData.exe に /B4 以外のオプションを渡した場合や、CreateFontToHandle で DX_FONTTYPE_ANTIALIASING_4X4 を使用した場合は、期待通りの色で描画されます。
* MS ゴシック以外のフォントをいくつか試しましたが、結果は同様です。
繰り返しになってしまい恐縮ですが、ご確認いただければ幸いです。
* .dftファイル作成に使用したコマンド
CreateDXFontData.exe /F"MS ゴシック" /B4 /S32 /CUTF8 /O"font_b4.dft"
CreateDXFontData.exe /F"MS ゴシック" /B8 /S32 /CUTF8 /O"font_b8.dft"
* 再現コード
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
int FontHandle;
int ScreenHandle;
ChangeWindowMode(true);
SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8);
// DXライブラリ初期化処理
if (DxLib_Init() == -1) return -1;
// 描画対象にできるαチャンネル付きのグラフィックハンドルを作成する
ScreenHandle = MakeScreen(256, 256, TRUE);
// 乗算済みα用のフォントハンドルを作成する
SetFontCacheUsePremulAlphaFlag(TRUE);
FontHandle = CreateFontToHandle(
reinterpret_cast<const char*>(u8"MS ゴシック"), 32, -1,
DX_FONTTYPE_ANTIALIASING_4X4, DX_CHARSET_UTF8);
// 描画先を作成したグラフィックハンドルにする
SetDrawScreen(ScreenHandle);
const auto Text = reinterpret_cast<const char*>(u8"テスト文章");
const auto Color = GetColor(255, 255, 255);
// グラフィックハンドルに乗算済みα用のαブレンドモードで透明度0%で文字を描画する
SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255);
// CreateFontToHandle DX_FONTTYPE_ANTIALIASING_EDGE_4X4 * 問題なし *
DrawStringFToHandle(0, 0, Text, Color, FontHandle);
// CreateDXFontData.exe に /B4 を指定した.dftファイルで描画 * ここで描画に不具合 *
const auto FontHandleDftB4 = LoadFontDataToHandle("font_b4.dft");
DrawStringFToHandle(0, 64, Text, Color, FontHandleDftB4);
// CreateDXFontData.exe に /B8 を指定した.dftファイルで描画 * 問題なし *
const auto FontHandleDftB8 = LoadFontDataToHandle("font_b8.dft");
DrawStringFToHandle(0, 128, Text, Color, FontHandleDftB8);
// 描画先を裏画面に変更する
SetDrawScreen(DX_SCREEN_BACK);
// 結果が分かりやすいように裏画面を緑で塗りつぶす
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 255);
DrawBox(0, 0, 640, 480, GetColor(0, 200, 0), TRUE);
// 裏画面に文字列を描画したグラフィックハンドルを乗算済みα用のαブレンドモードで描画する
SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255);
DrawGraphF(100.f, 100.f, ScreenHandle, TRUE);
// 裏画面の内容を表画面に反映させる
ScreenFlip();
// 作成したフォントハンドルを削除する
DeleteFontToHandle(FontHandle);
// MakeScreen で作成したグラフィックハンドルの削除
DeleteGraph(ScreenHandle);
// キー入力待ち
WaitKey();
// DXライブラリ使用の終了処理
DxLib_End();
// ソフトの終了
return 0;
}