自从换了高分屏,PR和AE就用得都特别难受,因为UI界面字体几乎全都是宋体。
高分屏的宋体会以矢量字形渲染,而不是清晰的点阵字形,再加上暗色系主题的加持,几乎每时每刻都在强碱我的眼睛 ![]()
于是用codex逆了一下,发现A÷(Adobe也可以是A÷)是直接把字体硬编码的,不给任何外部配置项,可以说是故意给用户喂屎了
PR/AME
入口在UIFramework.dll,硬编码了CJK字体。最÷的地方在于日文和韩文指定的都是非衬线体,唯独中文是衬线体,这是何意味呢?
qword_1805322D8 = "Meiryo" // Japanese
qword_1805322F8 = "Gulim Regular" // Korean
qword_180532318 = "SimSun" // Chinese
qword_1805323F8 = "Adobe Clean UX" // generic / other UIF font entry
if ( ASL::GetPrimaryLanguageID(a1) == ASL::kLanguage_Japanese )
{
copy(&v143, &qword_1805322D8);
}
else if ( ASL::GetPrimaryLanguageID(...) == ASL::kLanguage_Korean )
{
copy(&v143, &qword_1805322F8);
}
else if ( ASL::GetPrimaryLanguageID(...) == ASL::kLanguage_Chinese )
{
copy(&v143, &qword_180532318);
}
AE
AE在Dictionaries/zh_CN下面有字典文件,而且是纯文本的。里面也直接指定了宋体:
Dictionaries\zh_CN\after_effects_zh_CN.dat:
"$$$/AE/FontStyle/Large=12 plain STSong{{*MSWindows*}}10 plain SimSun"
"$$$/AE/FontStyle/LargeBold=12 bold STSong{{*MSWindows*}}10 bold SimSun"
"$$$/AE/FontStyle/LargeItalic=12 italic STSong{{*MSWindows*}}10 italic SimSun"
"$$$/AE/FontStyle/Medium=11 plain STSong{{*MSWindows*}}09 plain SimSun"
"$$$/AE/FontStyle/MediumBold=11 bold STSong{{*MSWindows*}}09 bold SimSun"
"$$$/AE/FontStyle/MediumItalic=11 italic STSong{{*MSWindows*}}09 italic SimSun"
"$$$/AE/FontStyle/Small=09 plain STSong{{*MSWindows*}}09 plain SimSun"
"$$$/AE/FontStyle/SmallBold=09 bold STSong{{*MSWindows*}}09 bold SimSun"
可以在这里直接改,但要注意还需要把改完的dat算出sha-256之后转base64填到signatures.xml里面去
<Reference URI="#PackageContents">
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>57QGM6XZ7GNq4iQ+UY1p7BwO9OKpUlKf16vx9cyTJlw=</DigestValue>
</Reference>
但是更难绷的是,AE对中文字体其实是有特殊判定逻辑的。如果在中文环境下读取字体的时候检测到SimSun,会调用dvaui::ui::Theme::GetDefaultFontName()去替换成默认值,而GetDefaultFontName()在中文环境下又会调用dvaui::config::GetSpecialChinaFont(),这个SpecialChinaFont也是硬编码的,返回的是什么呢?还是SimSun!
A÷的帽子戏法你就学去吧
AI
AI和AE一样也有字典文件,但并不是纯文本而是二进制,所以暂时没在这个方向上继续分析。
不过同样也存在硬编码,入口在dvaai.dll
if ( WinUtils::UseGB18030Font(v15) )
{
v17 = dvacore::string::AsciiToUTF16(v39, "SimSun-18030", 12);
}
else
{
v17 = dvacore::string::AsciiToUTF16(v35, "SimSun", 6);
}
综上所述因为都是硬编码,所以直接让codex写了个patcher,有需要的佬可以直接用,保护视力远离宋体 ![]()
https://github.com/scrpr/adobe-no-simsun
使用效果:
5 个帖子 - 3 位参与者