From 98f62cb4b19cd12aa2815b699e4e8a62a1e6ceaf Mon Sep 17 00:00:00 2001 From: namazso <8676443+namazso@users.noreply.github.com> Date: Sun, 6 Dec 2020 08:59:02 +0100 Subject: [PATCH 1/6] uniformize line endings --- directwrite.cpp | 2 +- gdidll.rc | 216 ++--- gdipp.sln | 2 +- gdipp.vcxproj | 2 +- gdipp.vcxproj.filters | 2 +- hook.cpp | 4 +- hooklist.h | 2 +- settings.cpp | 48 +- settings.h | 1844 ++++++++++++++++++++--------------------- 9 files changed, 1061 insertions(+), 1061 deletions(-) diff --git a/directwrite.cpp b/directwrite.cpp index 68dcb72..fbea3ce 100644 --- a/directwrite.cpp +++ b/directwrite.cpp @@ -1,4 +1,4 @@ -#include "directwrite.h" +#include "directwrite.h" #include "settings.h" #include "dynCodeHelper.h" diff --git a/gdidll.rc b/gdidll.rc index dbf3cca..36c13da 100644 --- a/gdidll.rc +++ b/gdidll.rc @@ -1,108 +1,108 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource." - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Neutral (Sys. Default) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUSD) -LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT -#pragma code_page(936) - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,2019,523,1 - PRODUCTVERSION 1,2019,5,23 - FILEFLAGSMASK 0x8L -#ifdef _DEBUG - FILEFLAGS 0xbL -#else - FILEFLAGS 0xaL -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "000004b0" - BEGIN - VALUE "Comments", "Portions of this software are copyright (c) 2005-2017 The FreeType Project (www.freetype.org). All rights reserved." - VALUE "CompanyName", "2ch & THEMEX" - VALUE "FileDescription", "The Ultimate Font Rasterizer" - VALUE "FileVersion", "1.2019.523.1" - VALUE "InternalName", "MacType" - VALUE "LegalCopyright", "(C) 460, 168, Higambana, 555 and sy567. All rights reserved. FlyingSnow republished" - VALUE "OriginalFilename", "MacType.dll" - VALUE "ProductName", "The Ultimate Font Rasterizer" - VALUE "ProductVersion", "1.2019.5.23" - VALUE "URL", "http://www.mactype.net http://drwatson.nobody.jp/gdi++/" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x0, 1200 - END -END - -#endif // Neutral (Sys. Default) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// Chinese (Simplified, PRC) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) -LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#pragma code_page(936) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // Chinese (Simplified, PRC) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource." + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Neutral (Sys. Default) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUSD) +LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT +#pragma code_page(936) + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,2019,523,1 + PRODUCTVERSION 1,2019,5,23 + FILEFLAGSMASK 0x8L +#ifdef _DEBUG + FILEFLAGS 0xbL +#else + FILEFLAGS 0xaL +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "000004b0" + BEGIN + VALUE "Comments", "Portions of this software are copyright (c) 2005-2017 The FreeType Project (www.freetype.org). All rights reserved." + VALUE "CompanyName", "2ch & THEMEX" + VALUE "FileDescription", "The Ultimate Font Rasterizer" + VALUE "FileVersion", "1.2019.523.1" + VALUE "InternalName", "MacType" + VALUE "LegalCopyright", "(C) 460, 168, Higambana, 555 and sy567. All rights reserved. FlyingSnow republished" + VALUE "OriginalFilename", "MacType.dll" + VALUE "ProductName", "The Ultimate Font Rasterizer" + VALUE "ProductVersion", "1.2019.5.23" + VALUE "URL", "http://www.mactype.net http://drwatson.nobody.jp/gdi++/" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0, 1200 + END +END + +#endif // Neutral (Sys. Default) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// Chinese (Simplified, PRC) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +#pragma code_page(936) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // Chinese (Simplified, PRC) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/gdipp.sln b/gdipp.sln index 5b7a8d0..63591d7 100644 --- a/gdipp.sln +++ b/gdipp.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.21005.1 diff --git a/gdipp.vcxproj b/gdipp.vcxproj index 0fcddf1..40ee527 100644 --- a/gdipp.vcxproj +++ b/gdipp.vcxproj @@ -1,4 +1,4 @@ - + diff --git a/gdipp.vcxproj.filters b/gdipp.vcxproj.filters index ad40844..c4a546e 100644 --- a/gdipp.vcxproj.filters +++ b/gdipp.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/hook.cpp b/hook.cpp index 30e4bbd..0c9b248 100644 --- a/hook.cpp +++ b/hook.cpp @@ -493,7 +493,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) IsUnload = IsProcessUnload(); bEnableDW = pSettings->DirectWrite(); } - if (!IsUnload) hook_initinternal(); //صģͲκǁE + if (!IsUnload) hook_initinternal(); //صģͲκǁE //5 if (!IsProcessExcluded() && !IsUnload) { #ifndef _WIN64 @@ -567,7 +567,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) //delete AACacheFull; //delete AACache; // for (int i=0;i::const_iterator it = arr.find(buff); if (it==arr.end()) arr.insert(buff); @@ -769,7 +769,7 @@ bool CGdippSettings::AddIndividualFromSection(LPCTSTR lpszSection, LPCTSTR lpszF argc = token.Parse(value); } - GetFontLocalName(p, buff);//תÁE + GetFontLocalName(p, buff);//תÁE CFontIndividual fi(buff); const CFontSettings& fsCommon = m_FontSettings; @@ -988,7 +988,7 @@ bool CGdippSettings::IsProcessUnload() const return false; } -bool CGdippSettings::IsExeUnload(LPCTSTR lpApp) const //EǷںб? +bool CGdippSettings::IsExeUnload(LPCTSTR lpApp) const //EǷںб? { if (m_bRunFromGdiExe) { return false; @@ -998,14 +998,14 @@ bool CGdippSettings::IsProcessUnload() const return false; ModuleHashMap::const_iterator it = m_arrUnloadModule.begin(); for(; it != m_arrUnloadModule.end(); ++it) { - if (!lstrcmpi(lpApp, it->c_str())) { //ƥųρE + if (!lstrcmpi(lpApp, it->c_str())) { //ƥųρE return true; } } return false; } -bool CGdippSettings::IsExeInclude(LPCTSTR lpApp) const //EǷڰб? +bool CGdippSettings::IsExeInclude(LPCTSTR lpApp) const //EǷڰб? { if (m_bRunFromGdiExe) { return false; @@ -1015,7 +1015,7 @@ bool CGdippSettings::IsProcessUnload() const return false; ModuleHashMap::const_iterator it = m_arrIncludeModule.begin(); for(; it != m_arrIncludeModule.end(); ++it) { - if (!lstrcmpi(lpApp, it->c_str())) { //ƥųρE + if (!lstrcmpi(lpApp, it->c_str())) { //ƥųρE return true; } } @@ -1232,7 +1232,7 @@ void CFontLinkInfo::init() LONG rc; DWORD regtype; - for (int k = 0; ; ++k) { //е́E + for (int k = 0; ; ++k) { //е́E namesz = nBufSize; valuesz = nBufSize; rc = RegEnumValue(h2, k, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //Ѱ @@ -1248,7 +1248,7 @@ void CFontLinkInfo::init() } while (buf[wcslen(buf)-1] == L' ') buf[wcslen(buf)-1] = 0; - //õĶӦÁE + //õĶӦÁE FontNameCache.Add(value, buf); } @@ -1269,7 +1269,7 @@ void CFontLinkInfo::init() TCHAR buff[LF_FACESIZE]; GetFontLocalName(name, buff); - info[row][col] = _wcsdup(buff); //һÁE + info[row][col] = _wcsdup(buff); //һÁE ++col; for (LPCWSTR linep = value; col < FONTMAX && *linep; linep += wcslen(linep) + 1) { @@ -1293,7 +1293,7 @@ void CFontLinkInfo::init() if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) break; if (regtype != REG_SZ) continue; - if (lstrcmpi(value2, linep) != 0) continue; //ѰļӦÁE + if (lstrcmpi(value2, linep) != 0) continue; //ѰļӦÁE StringCchCopyW(buf, sizeof(buf)/sizeof(buf[0]), name); if (buf[wcslen(buf) - 1] == L')') { //ȥ @@ -1317,7 +1317,7 @@ void CFontLinkInfo::init() if (valp) { GetFontLocalName((TCHAR*)valp, buff);; //StringCchCopy(truefont.lfFaceName, LF_FACESIZE, buff); //Ƶṹ - //pSettings->CopyForceFont(truefont, truefont); //滻́E + //pSettings->CopyForceFont(truefont, truefont); //滻́E info[row][col] = _wcsdup(buff);//truefont.lfFaceName); //Ƶӱ ++col; } @@ -1328,11 +1328,11 @@ void CFontLinkInfo::init() } else { /*if (sOsVinfo.dwMajorVersion>=6 && sOsVinfo.dwMinorVersion>=1) //汾>=6.1Win7ϵ { - //ӱE + //ӱE LPWSTR swapbuff[32]; memcpy(swapbuff, info[row], 32*sizeof(LPWSTR)); //Դƹ for (int i=1; iFontSubstitutes()>=SETTING_FONTSUBSTITUTE_SAFE && pSettings->CopyForceFont(truefont, syslf)) //ʹ́E滻ģʽʱ滻ϵͳ́E + if (pSettings->FontSubstitutes()>=SETTING_FONTSUBSTITUTE_SAFE && pSettings->CopyForceFont(truefont, syslf)) //ʹ́E滻ģʽʱ滻ϵͳ́E { WCHAR envname[30] = L"MT_SYSFONT"; WCHAR envvalue[30] = { 0 }; HFONT tempfont; if (GetEnvironmentVariable(L"MT_SYSFONT", envvalue, 29) && GetObjectType(tempfont = (HFONT)wcstoull(envvalue, 0 ,10)) == OBJ_FONT)//Ѿ { - g_alterGUIFont = tempfont; //ֱʹǰ́E + g_alterGUIFont = tempfont; //ֱʹǰ́E } else { - g_alterGUIFont = CreateFontIndirectW(&truefont); //һµ滻́E + g_alterGUIFont = CreateFontIndirectW(&truefont); //һµ滻́E _ui64tow((ULONG_PTR)g_alterGUIFont, envvalue, 10); //תΪַ - SetEnvironmentVariable(envname, envvalue); //дȁE? + SetEnvironmentVariable(envname, envvalue); //дȁE? } } @@ -1585,13 +1585,13 @@ CFontSubstitutesInfo::initini(const CFontSubstitutesIniArray& iniarray) /* StringCchCopy(truefont.lfFaceName, LF_FACESIZE, buf); truefont.lfCharSet=DEFAULT_CHARSET; if (!GetFontLocalName(truefont)) - continue; //ûд́E + continue; //ûд́E buff = truefont.lfFaceName; StringCchCopy(truefont2.lfFaceName, LF_FACESIZE, vp); truefont2.lfCharSet=DEFAULT_CHARSET; if (!GetFontLocalName(truefont2)) - continue; //ûд́E + continue; //ûд́E buff2 = truefont2.lfFaceName; if (m_mfontsub.find(buff)==m_mfontsub.end()) @@ -1634,7 +1634,7 @@ CFontSubstitutesInfo::lookup(LOGFONT& lf) const k.m_bCharSet = true; k.m_lf = lf; - TCHAR * buff; //Eٻʵ? + TCHAR * buff; //Eٻʵ? LOGFONT mylf(lf); if (!(buff = FontNameCache.Find((TCHAR*)lf.lfFaceName))) { diff --git a/settings.h b/settings.h index 9f693c2..d01b547 100644 --- a/settings.h +++ b/settings.h @@ -1,923 +1,923 @@ -#pragma once - -#include "common.h" -#include "gdiPlusFlat2.h" -#include "cache.h" -#include "hash_list.h" -#include -#include - -#ifdef _WIN64 -#ifdef DEBUG -#pragma comment (lib, "iniparser64_dbg.lib") -#else -#pragma comment (lib, "iniparser64.lib") -#endif -#else -#ifdef DEBUG -#pragma comment (lib, "iniparser_dbg.lib") -#else -#pragma comment (lib, "iniparser.lib") -#endif -#endif - -#define MACTYPE_VERSION 20170628 -#define MAX_FONT_SETTINGS 16 -#define DEFINE_FS_MEMBER(name, param) \ - int Get##name() const { return GetParam(param); } \ - void Set##name(int n) { SetParam(param, n); } - -#define HOOK_MANUALLY HOOK_DEFINE -#define HOOK_DEFINE(rettype, name, argtype) \ - extern rettype (WINAPI * ORIG_##name) argtype; \ - extern rettype WINAPI IMPL_##name argtype; -#include "hooklist.h" -#undef HOOK_DEFINE //ΪȷļҲֱʹȷĺҪ -#undef HOOK_MANUALLY - -/* -struct CFontName -{ - LPWSTR content; -public: - bool operator < (const CFontName fn) const { - return wcscmp(content, fn.content)>0; - } - CFontName(LPCWSTR fontname) - { - content = _wcsdup(fontname); - wcsupr(content); - } - ~CFontName() - { - free(content); - } -}; - -struct CFontSubResult -{ -public: - LPWSTR lpRealName; - LPWSTR lpGDIName; - CFontSubResult(LPCWSTR RealName, LPCWSTR GDIName) - { - lpRealName = _wcsdup(RealName); - lpGDIName = _wcsdup(GDIName); - } - ~CFontSubResult() - { - free(lpRealName); - free(lpGDIName); - } -}; - -typedef map CFontNameCache;*/ - - -class CFontSettings -{ -private: - int m_settings[MAX_FONT_SETTINGS]; - static const char m_bound[MAX_FONT_SETTINGS][2]; - - enum _FontSettingsParams { - FSP_HINTING = 0, - FSP_AAMODE = 1, - FSP_NORMAL_WEIGHT = 2, - FSP_BOLD_WEIGHT = 3, - FSP_ITALIC_SLANT = 4, - FSP_KERNING = 5, - }; - -public: - CFontSettings() - { - Clear(); - } - - DEFINE_FS_MEMBER(HintingMode, FSP_HINTING); - DEFINE_FS_MEMBER(AntiAliasMode, FSP_AAMODE); - DEFINE_FS_MEMBER(NormalWeight, FSP_NORMAL_WEIGHT); - DEFINE_FS_MEMBER(BoldWeight, FSP_BOLD_WEIGHT); - DEFINE_FS_MEMBER(ItalicSlant, FSP_ITALIC_SLANT); - DEFINE_FS_MEMBER(Kerning, FSP_KERNING); - - int GetParam(int x) const - { - Assert(0 <= x && x < MAX_FONT_SETTINGS); - return m_settings[x]; - } - void SetParam(int x, int n) - { - Assert(0 <= x && x < MAX_FONT_SETTINGS); - m_settings[x] = Bound(n, m_bound[x][0], m_bound[x][1]); - } - void Clear() - { - ZeroMemory(m_settings, sizeof(m_settings)); - } - - void SetSettings(const int* p, int count) - { - count = Min(count, MAX_FONT_SETTINGS); - memcpy(m_settings, p, count * sizeof(int)); - } -}; - -#undef DEFINE_FS_MEMBER - - -class CFontIndividual -{ - CFontSettings m_set; - StringHashFont m_hash; - -public: - CFontIndividual() - { - } - CFontIndividual(LPCTSTR name) - : m_hash(name) - { - } - - CFontSettings& GetIndividual() { return m_set; } - LPCTSTR GetName() const { return m_hash.c_str(); } - const StringHashFont& GetHash() const { return m_hash; } - bool operator ==(const CFontIndividual& x) const { return (m_hash == x.m_hash); } -}; - -class CFontLinkInfo -{ -public: - enum { - INFOMAX = 180, //Դļ=15 - FONTMAX = 31, - }; -private: - LPWSTR info[INFOMAX + 1][FONTMAX + 1]; - bool AllowDefaultLink[256]; - WCHAR DefaultFontLink[FF_DECORATIVE + 1][LF_FACESIZE + 1]; //ŶӦ͵Ĭ -public: - CFontLinkInfo(); - ~CFontLinkInfo(); - void init(); - void clear(); - const bool IsAllowFontLink(BYTE aCharset) const { return AllowDefaultLink[aCharset]; } - const LPCWSTR sysfn(int nFontFamily) const { - return *DefaultFontLink[nFontFamily] ? DefaultFontLink[nFontFamily] : DefaultFontLink[1]; } - const LPCWSTR * lookup(LPCWSTR fontname) const; - LPCWSTR get(int row, int col) const; -}; - -class CFontSubstitutesInfo; - -class CFontSubstituteData -{ - friend CFontSubstitutesInfo; -private: - LOGFONT m_lf; - bool m_bCharSet; - //TCHAR CustomName[LF_FACESIZE]; -public: - bool operator == (const CFontSubstituteData& o) const; -private: - CFontSubstituteData(); - bool initnocheck(LPCTSTR config); //init data w/o checking the font existence. - bool init(LPCTSTR config); - static int CALLBACK EnumFontFamProc(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD FontType, LPARAM lParam); - -}; - -typedef StringHashT CFontSubstitutesHash; -typedef set CFontSubstitutesIniArray; - -class CFontSubstitutesInfo : public CSimpleMap -{ -private: - //typedef map FontSubMap; - //FontSubMap m_mfontsub; - void initini(const CFontSubstitutesIniArray& iniarray); - void initreg(); -public: - void init(int nFontSubstitutes, const CFontSubstitutesIniArray& iniarray); - const LOGFONT * lookup(LOGFONT &lf) const; - //void RemoveAll() {m_mfontsub.clear();}; - //bool TrySub(LPCTSTR lpFacename) {return m_mfontsub.find(lpFacename)!=m_mfontsub.end(); }; -}; - -#define SETTING_FONTSUBSTITUTE_DISABLE (0) +#pragma once + +#include "common.h" +#include "gdiPlusFlat2.h" +#include "cache.h" +#include "hash_list.h" +#include +#include + +#ifdef _WIN64 +#ifdef DEBUG +#pragma comment (lib, "iniparser64_dbg.lib") +#else +#pragma comment (lib, "iniparser64.lib") +#endif +#else +#ifdef DEBUG +#pragma comment (lib, "iniparser_dbg.lib") +#else +#pragma comment (lib, "iniparser.lib") +#endif +#endif + +#define MACTYPE_VERSION 20170628 +#define MAX_FONT_SETTINGS 16 +#define DEFINE_FS_MEMBER(name, param) \ + int Get##name() const { return GetParam(param); } \ + void Set##name(int n) { SetParam(param, n); } + +#define HOOK_MANUALLY HOOK_DEFINE +#define HOOK_DEFINE(rettype, name, argtype) \ + extern rettype (WINAPI * ORIG_##name) argtype; \ + extern rettype WINAPI IMPL_##name argtype; +#include "hooklist.h" +#undef HOOK_DEFINE //ΪȷļҲֱʹȷĺҪ +#undef HOOK_MANUALLY + +/* +struct CFontName +{ + LPWSTR content; +public: + bool operator < (const CFontName fn) const { + return wcscmp(content, fn.content)>0; + } + CFontName(LPCWSTR fontname) + { + content = _wcsdup(fontname); + wcsupr(content); + } + ~CFontName() + { + free(content); + } +}; + +struct CFontSubResult +{ +public: + LPWSTR lpRealName; + LPWSTR lpGDIName; + CFontSubResult(LPCWSTR RealName, LPCWSTR GDIName) + { + lpRealName = _wcsdup(RealName); + lpGDIName = _wcsdup(GDIName); + } + ~CFontSubResult() + { + free(lpRealName); + free(lpGDIName); + } +}; + +typedef map CFontNameCache;*/ + + +class CFontSettings +{ +private: + int m_settings[MAX_FONT_SETTINGS]; + static const char m_bound[MAX_FONT_SETTINGS][2]; + + enum _FontSettingsParams { + FSP_HINTING = 0, + FSP_AAMODE = 1, + FSP_NORMAL_WEIGHT = 2, + FSP_BOLD_WEIGHT = 3, + FSP_ITALIC_SLANT = 4, + FSP_KERNING = 5, + }; + +public: + CFontSettings() + { + Clear(); + } + + DEFINE_FS_MEMBER(HintingMode, FSP_HINTING); + DEFINE_FS_MEMBER(AntiAliasMode, FSP_AAMODE); + DEFINE_FS_MEMBER(NormalWeight, FSP_NORMAL_WEIGHT); + DEFINE_FS_MEMBER(BoldWeight, FSP_BOLD_WEIGHT); + DEFINE_FS_MEMBER(ItalicSlant, FSP_ITALIC_SLANT); + DEFINE_FS_MEMBER(Kerning, FSP_KERNING); + + int GetParam(int x) const + { + Assert(0 <= x && x < MAX_FONT_SETTINGS); + return m_settings[x]; + } + void SetParam(int x, int n) + { + Assert(0 <= x && x < MAX_FONT_SETTINGS); + m_settings[x] = Bound(n, m_bound[x][0], m_bound[x][1]); + } + void Clear() + { + ZeroMemory(m_settings, sizeof(m_settings)); + } + + void SetSettings(const int* p, int count) + { + count = Min(count, MAX_FONT_SETTINGS); + memcpy(m_settings, p, count * sizeof(int)); + } +}; + +#undef DEFINE_FS_MEMBER + + +class CFontIndividual +{ + CFontSettings m_set; + StringHashFont m_hash; + +public: + CFontIndividual() + { + } + CFontIndividual(LPCTSTR name) + : m_hash(name) + { + } + + CFontSettings& GetIndividual() { return m_set; } + LPCTSTR GetName() const { return m_hash.c_str(); } + const StringHashFont& GetHash() const { return m_hash; } + bool operator ==(const CFontIndividual& x) const { return (m_hash == x.m_hash); } +}; + +class CFontLinkInfo +{ +public: + enum { + INFOMAX = 180, //Դļ=15 + FONTMAX = 31, + }; +private: + LPWSTR info[INFOMAX + 1][FONTMAX + 1]; + bool AllowDefaultLink[256]; + WCHAR DefaultFontLink[FF_DECORATIVE + 1][LF_FACESIZE + 1]; //ŶӦ͵Ĭ +public: + CFontLinkInfo(); + ~CFontLinkInfo(); + void init(); + void clear(); + const bool IsAllowFontLink(BYTE aCharset) const { return AllowDefaultLink[aCharset]; } + const LPCWSTR sysfn(int nFontFamily) const { + return *DefaultFontLink[nFontFamily] ? DefaultFontLink[nFontFamily] : DefaultFontLink[1]; } + const LPCWSTR * lookup(LPCWSTR fontname) const; + LPCWSTR get(int row, int col) const; +}; + +class CFontSubstitutesInfo; + +class CFontSubstituteData +{ + friend CFontSubstitutesInfo; +private: + LOGFONT m_lf; + bool m_bCharSet; + //TCHAR CustomName[LF_FACESIZE]; +public: + bool operator == (const CFontSubstituteData& o) const; +private: + CFontSubstituteData(); + bool initnocheck(LPCTSTR config); //init data w/o checking the font existence. + bool init(LPCTSTR config); + static int CALLBACK EnumFontFamProc(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD FontType, LPARAM lParam); + +}; + +typedef StringHashT CFontSubstitutesHash; +typedef set CFontSubstitutesIniArray; + +class CFontSubstitutesInfo : public CSimpleMap +{ +private: + //typedef map FontSubMap; + //FontSubMap m_mfontsub; + void initini(const CFontSubstitutesIniArray& iniarray); + void initreg(); +public: + void init(int nFontSubstitutes, const CFontSubstitutesIniArray& iniarray); + const LOGFONT * lookup(LOGFONT &lf) const; + //void RemoveAll() {m_mfontsub.clear();}; + //bool TrySub(LPCTSTR lpFacename) {return m_mfontsub.find(lpFacename)!=m_mfontsub.end(); }; +}; + +#define SETTING_FONTSUBSTITUTE_DISABLE (0) #define SETTING_FONTSUBSTITUTE_SAFE (1) -#define SETTING_FONTSUBSTITUTE_ALL (2) - -#define SETTING_WIDTHMODE_GDI32 (0) -#define SETTING_WIDTHMODE_FREETYPE (1) - -#define SETTING_FONTLOADER_FREETYPE (0) -#define SETTING_FONTLOADER_WIN32 (1) - -class CGdippSettings; - -interface IControlCenter -{ - virtual HRESULT STDMETHODCALLTYPE QueryInterface( - /* [in] */ REFIID riid, - /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) = 0; - virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0; - virtual ULONG STDMETHODCALLTYPE Release( void) = 0; - virtual ULONG WINAPI GetVersion(void) = 0; - virtual BOOL WINAPI SetIntAttribute(int eSet, int nValue) = 0; - virtual BOOL WINAPI SetFloatAttribute(int eSet, float nValue) = 0; - virtual int WINAPI GetIntAttribute(int eSet) = 0; - virtual float WINAPI GetFloatAttribute(int eSet) = 0; - virtual BOOL WINAPI RefreshSetting(void) = 0; - virtual BOOL WINAPI EnableRender(BOOL bEnable) = 0; - virtual BOOL WINAPI EnableCache(BOOL bEnable) = 0; - virtual BOOL WINAPI ClearIndividual() = 0; - virtual BOOL WINAPI AddIndividual(WCHAR* fontSetting) = 0; - virtual BOOL WINAPI DelIndividual(WCHAR* lpFaceName) = 0; - virtual void WINAPI LoadSetting(WCHAR* lpFileName) = 0; -}; -class CControlCenter; - -class CGdippSettings -{ - friend CControlCenter; - friend CFontSubstituteData; - friend BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID); -private: - static CGdippSettings* s_pInstance; - //INIp - CFontSettings m_FontSettings; - static CParseIni m_Config; - bool m_bHookChildProcesses : 1; - bool m_bUseMapping : 1; - bool m_bLoadOnDemand : 1; - bool m_bEnableShadow : 1; - - //ȊO - bool m_bIsWinXPorLater : 1; - bool m_bRunFromGdiExe : 1; - bool m_bIsInclude : 1; - bool m_bDelayedInit : 1; -// bool m_bIsHDBench : 1; -// bool m_bHaveNewerFreeType : 1; - bool : 0; - bool m_bUseCustomLcdFilter; //ʹԶlcdfilter - - BOOL m_bHintSmallFont; - BOOL m_bDirectWrite; - int m_nBolderMode; - int m_nGammaMode; - float m_fGammaValue; - float m_fRenderWeight; - float m_fContrast; - int m_nMaxHeight; - int m_nMinHeight; - int m_nBitmapHeight; - int m_nLcdFilter; - int m_nShadow[4]; - int m_nFontSubstitutes; - int m_bFontLink; //Ϊʹöֲ - int m_nWidthMode; - int m_nFontLoader; - int m_nScreenDpi; // screen dpi - DWORD m_nShadowLightColor; - DWORD m_nShadowDarkColor; - unsigned char m_arrLcdFilterWeights[5]; - - //settings for experimental - bool m_bEnableClipBoxFix; - bool m_bColorFont; - bool m_bInvertColor; - - - //settings for directwrite - float m_fGammaValueForDW; - float m_fContrastForDW; - float m_fClearTypeLevelForDW; - int m_nRenderingModeForDW; - CFontSubstitutesInfo m_FontSubstitutesInfoForDW; - - //FTC_Manager_New˶ɤѥ` - int m_nCacheMaxFaces; - int m_nCacheMaxSizes; - int m_nCacheMaxBytes; - int m_dwOSMajorVer; - int m_dwOSMinorVer; - - // ꥢ{åƩ`֥ - int m_nTuneTable[256]; - // LCD - int m_nTuneTableR[256]; - int m_nTuneTableG[256]; - int m_nTuneTableB[256]; - static TCHAR m_szexeName[MAX_PATH+1]; - - typedef set FontHashMap; - typedef set ModuleHashMap; - typedef set FontSubSet; - typedef CArray IndividualArray; - FontHashMap m_arrExcludeFont; - FontHashMap m_arrIncludeFont; - ModuleHashMap m_arrExcludeModule; - ModuleHashMap m_arrIncludeModule; - ModuleHashMap m_arrUnloadModule; - ModuleHashMap m_arrUnFontSubModule; - IndividualArray m_arrIndividual; - - // ָե - LOGFONT m_lfForceFont; - TCHAR m_szForceChangeFont[LF_FACESIZE]; - - //INIե - TCHAR m_szFileName[MAX_PATH]; - - //INIiz߄I - bool LoadAppSettings(LPCTSTR lpszFile); - void GetOSVersion(); - float FastGetProfileFloat(LPCTSTR lpszSection, LPCTSTR lpszKey, float fDefault); - int FastGetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszKey, int nDefault); - DWORD FastGetProfileString(LPCTSTR lpszSection, LPCTSTR lpszKey, LPCTSTR lpszDefault, LPTSTR lpszRet, DWORD cch); - static bool _IsFreeTypeProfileSectionExists(LPCTSTR lpszKey, LPCTSTR lpszFile); - static LPTSTR _GetPrivateProfileSection (LPCTSTR lpszSection, LPCTSTR lpszFile); - static int _GetFreeTypeProfileInt (LPCTSTR lpszKey, int nDefault, LPCTSTR lpszFile); - static int _GetFreeTypeProfileIntFromSection(LPCTSTR lpszSection, LPCTSTR lpszKey, int nDefault, LPCTSTR lpszFile); - static bool _GetFreeTypeProfileBoolFromSection(LPCTSTR lpszSection, LPCTSTR lpszKey, bool nDefault, LPCTSTR lpszFile); - static wstring _GetFreeTypeProfileStrFromSection(LPCTSTR lpszSection, LPCTSTR lpszKey, const TCHAR* nDefault, LPCTSTR lpszFile); - static int _GetFreeTypeProfileBoundInt (LPCTSTR lpszKey, int nDefault, int nMin, int nMax, LPCTSTR lpszFile); - static float _GetFreeTypeProfileFloat (LPCTSTR lpszKey, float fDefault, LPCTSTR lpszFile); - static float _GetFreeTypeProfileBoundFloat(LPCTSTR lpszKey, float fDefault, float fMin, float fMax, LPCTSTR lpszFile); - static DWORD _GetFreeTypeProfileString (LPCTSTR lpszKey, LPCTSTR lpszDefault, LPTSTR lpszRet, DWORD cch, LPCTSTR lpszFile); - static int CALLBACK EnumFontFamProc(const LOGFONT* lplf, const TEXTMETRIC* lptm, DWORD FontType, LPARAM lParam); - //template - static bool AddListFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, set & arr); - static bool AddExcludeListFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, set & arr); - bool AddIndividualFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, IndividualArray& arr); - bool AddLcdFilterFromSection(LPCTSTR lpszKey, LPCTSTR lpszFile, unsigned char* arr); - static int _StrToInt(LPCTSTR pStr, int nDefault); - static float _StrToFloat(LPCTSTR pStr, float fDefault); - static int _httoi(const TCHAR *value); - void InitInitTuneTable(); - static void InitTuneTable(int v, int* table); - void DelayedInit(); - int _GetAlternativeProfileName(LPTSTR lpszName, LPCTSTR lpszFile); - - CFontLinkInfo m_fontlinkinfo; - CFontSubstitutesInfo m_FontSubstitutesInfo; - - CGdippSettings() - : m_bHookChildProcesses(false) - , m_bUseMapping(false) - , m_bLoadOnDemand(false) - , m_bEnableShadow(false) - , m_bFontLink(0) -// , m_bEnableKerning(false) - , m_bIsWinXPorLater(false) - , m_bRunFromGdiExe(false) - , m_bIsInclude(false) - , m_bDelayedInit(false) -// , m_bIsHDBench(false) -// , m_bHaveNewerFreeType(false) - , m_nBolderMode(0) - , m_nGammaMode(0) - , m_fGammaValue(1.0f) - , m_fGammaValueForDW(0.0f) - , m_fRenderWeight(1.0f) - , m_fContrast(1.0f) - , m_nMaxHeight(0) - , m_nMinHeight(0) - , m_nBitmapHeight(0) - , m_nLcdFilter(0) - , m_nCacheMaxFaces(0) - , m_nCacheMaxSizes(0) - , m_nCacheMaxBytes(0) - , m_bHintSmallFont(true) - , m_bDirectWrite(true) - , m_nScreenDpi(96) - { - ZeroMemory(m_nTuneTable, sizeof(m_nTuneTable)); - ZeroMemory(m_nTuneTableR, sizeof(m_nTuneTableR)); - ZeroMemory(m_nTuneTableG, sizeof(m_nTuneTableG)); - ZeroMemory(m_nTuneTableB, sizeof(m_nTuneTableB)); - ZeroMemory(&m_lfForceFont, sizeof(LOGFONT)); - ZeroMemory(m_nShadow, sizeof(m_nShadow)); - ZeroMemory(m_szFileName, sizeof(m_szFileName)); - ZeroMemory(m_szForceChangeFont, sizeof(m_szForceChangeFont)); - } - - ~CGdippSettings() - { - - } - - static CGdippSettings* CreateInstance(); - static void DestroyInstance(); - -public: - static CGdippSettings* GetInstance(); - static const CGdippSettings* GetInstanceNoInit(); //FreeTypeFontEngine - - //INIp - const CFontSettings& GetFontSettings() const { return m_FontSettings; } - bool HookChildProcesses() const { return m_bHookChildProcesses; } - bool UseMapping() const { return m_bUseMapping; } - bool LoadOnDemand() const { return m_bLoadOnDemand; } - char FontLink() const { return m_bFontLink; } - BOOL DirectWrite() const { return m_bDirectWrite; } - BOOL HintSmallFont() const { return m_bHintSmallFont; } -// bool EnableKerning() const { return m_bEnableKerning; } - - int BolderMode() const { return m_nBolderMode; } - int GammaMode() const { return m_nGammaMode; } - float GammaValue() const { return m_fGammaValue; } - - //DW options - float GammaValueForDW() const { return m_fGammaValueForDW; } - float ContrastForDW() const { return m_fContrastForDW; } - float ClearTypeLevelForDW() const { return m_fClearTypeLevelForDW; } - int RenderingModeForDW() const { return m_nRenderingModeForDW; } - /*const CFontSubstitutesInfo& GetFontSubstitutesInfoForDW() const - { _ASSERTE(m_bDelayedInit); return m_FontSubstitutesInfoForDW; }*/ - - float RenderWeight() const { return m_fRenderWeight; } - float Contrast() const { return m_fContrast; } - int MaxHeight() const { return m_nMaxHeight; } - int MinHeight() const { return m_nMinHeight; } - int BitmapHeight() const { return m_nBitmapHeight; } - int ScreenDpi() const { return m_nScreenDpi; } - int LcdFilter() const { return m_nLcdFilter; } - const unsigned char* LcdFilterWeights() const { return m_arrLcdFilterWeights; } - bool UseCustomLcdFilter() const { return m_bUseCustomLcdFilter; } - int WidthMode() const { return m_nWidthMode; } - int FontLoader() const { return m_nFontLoader; } - bool EnableClipBoxFix() const { return m_bEnableClipBoxFix; } - bool LoadColorFont() const { return m_bColorFont; } - bool InvertColor() const { return m_bInvertColor; } - DWORD ShadowLightColor() const { return m_nShadowLightColor; } - DWORD ShadowDarkColor() const { return m_nShadowDarkColor; } - int FontSubstitutes() const { return m_nFontSubstitutes; } //ж滻ģʽ - int CacheMaxFaces() const { return m_nCacheMaxFaces; } - int CacheMaxSizes() const { return m_nCacheMaxSizes; } - int CacheMaxBytes() const { return m_nCacheMaxBytes; } - - bool EnableShadow() const { return m_bEnableShadow; } - const int* GetShadowParams() const { return m_nShadow; } - bool DelayedInited() const { return m_bDelayedInit; } // return the delayedinit status - -// OS version comparsion for magic code - bool IsWindows8() const { return m_dwOSMajorVer == 6 && m_dwOSMinorVer == 2; } - bool IsWindows81() const { return m_dwOSMajorVer == 6 && m_dwOSMinorVer == 3; } - // եߤȤ - LPCTSTR GetForceFontName() const - { - _ASSERTE(m_bDelayedInit); - LPCTSTR lpszFace = m_lfForceFont.lfFaceName; - return lpszFace[0] ? lpszFace : NULL; - } - - bool CopyForceFont(LOGFONT& lf, const LOGFONT& lfOrg) const; - - // - bool IsWinXPorLater() const { return m_bIsWinXPorLater; } - bool IsInclude() const { return m_bIsInclude; } -// bool IsHDBench() const { return m_bIsHDBench; } - bool RunFromGdiExe() const { return m_bRunFromGdiExe; } -// bool HaveNewerFreeType() const { return m_bHaveNewerFreeType; } - const int* GetTuneTable() const { return m_nTuneTable; } - const int* GetTuneTableR() const { return m_nTuneTableR; } - const int* GetTuneTableG() const { return m_nTuneTableG; } - const int* GetTuneTableB() const { return m_nTuneTableB; } - - bool LoadSettings(HINSTANCE hModule); - - bool IsFontExcluded(LPCSTR lpFaceName) const; - bool IsFontExcluded(LPCWSTR lpFaceName) const; - - //Snowie!! - bool IsProcessUnload() const; - bool IsExeUnload(LPCTSTR lpApp) const; - bool IsExeInclude(LPCTSTR lpApp) const; - void AddFontExclude(LPCWSTR lpFaceName); //ֱԶӵб - bool IsProcessExcluded() const; - bool IsProcessIncluded() const; - const CFontSettings& FindIndividual(LPCTSTR lpFaceName) const; - - const CFontLinkInfo& GetFontLinkInfo() const - { _ASSERTE(m_bDelayedInit); return m_fontlinkinfo; } - const CFontSubstitutesInfo& GetFontSubstitutesInfo() const - { _ASSERTE(m_bDelayedInit); return m_FontSubstitutesInfo; } -}; - -class CFontFaceNamesEnumerator -{ -private: - enum { - MAXFACENAMES = CFontLinkInfo::FONTMAX * 2 + 1, - }; - LPCWSTR m_facenames[MAXFACENAMES]; - int m_pos; - int m_endpos; - CFontFaceNamesEnumerator(); -public: - CFontFaceNamesEnumerator(LPCWSTR facename, int nFontFamily); - operator LPCWSTR () { - return m_facenames[m_pos]; - } - LPCWSTR getname() - { - return m_facenames[m_pos]; - } - void next() { - ++m_pos; - } - void prev() { - m_pos>0?--m_pos:0; - } - bool atend() { - return !!(m_pos >= m_endpos); - } -}; -#include "fteng.h" -#include "ft.h" -#include -#include "strtoken.h" -extern FreeTypeFontEngine* g_pFTEngine; -extern BOOL g_ccbCache; -extern BOOL g_ccbRender; - -class CControlCenter: public IControlCenter -{ -private: - int m_nRefCount; - bool m_bDirty; - enum eMTSettings{ - ATTR_HINTINGMODE, - ATTR_ANTIALIASMODE, - ATTR_NormalWeight, - ATTR_BoldWeight, - ATTR_ItalicSlant, - ATTR_EnableKerning, - ATTR_GammaMode, - ATTR_LcdFilter, - ATTR_BolderMode, - ATTR_TextTuning, - ATTR_TextTuningR, - ATTR_TextTuningG, - ATTR_TextTuningB, - ATTR_GammaValue, - ATTR_Contrast, - ATTR_RenderWeight, - ATTR_ShadowAlpha, - ATTR_ShadowOffset, - ATTR_Fontlink, - ATTR_HookChildProcess, - ATTR_LoadOnDemand, - ATTR_FontLoader, - ATTR_FontSubstitute, - ATTR_LcdFilterWeight, - ATTR_ShadowBuffer, - ATTR_MaxBitmap, - ATTR_DirectWrite, - ATTR_HintSmallFont - }; - typedef CArray IndividualArray; -public: - HRESULT STDMETHODCALLTYPE QueryInterface( - /* [in] */ REFIID riid, - /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) - { - ppvObject = (void**)this; - return 0; - } - ULONG STDMETHODCALLTYPE AddRef( void) {return InterlockedIncrement((LONG*)&m_nRefCount);}; - ULONG STDMETHODCALLTYPE Release( void) { - int result = InterlockedDecrement((LONG*)&m_nRefCount); - if (!result) - delete this; - return result; - } - ULONG WINAPI GetVersion(void){ return MACTYPE_VERSION; }; - BOOL WINAPI SetIntAttribute(int eSet, int nValue) - { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - switch ((eMTSettings)eSet) - { - case ATTR_HINTINGMODE: - pSettings->m_FontSettings.SetHintingMode(nValue); - break; - case ATTR_ANTIALIASMODE: - pSettings->m_FontSettings.SetAntiAliasMode(nValue); - break; - case ATTR_NormalWeight: - pSettings->m_FontSettings.SetNormalWeight(nValue); - break; - case ATTR_BoldWeight: - pSettings->m_FontSettings.SetBoldWeight(nValue); - break; - case ATTR_ItalicSlant: - pSettings->m_FontSettings.SetItalicSlant(nValue); - break; - case ATTR_EnableKerning: - pSettings->m_FontSettings.SetKerning(nValue); - break; - case ATTR_GammaMode: - pSettings->m_nGammaMode = nValue; - RefreshAlphaTable(); - break; - case ATTR_LcdFilter: - pSettings->m_nLcdFilter = nValue; - FT_Library_SetLcdFilter(freetype_library, (FT_LcdFilter)nValue); - break; - case ATTR_BolderMode: - pSettings->m_nBolderMode = nValue; - break; - case ATTR_TextTuning: - pSettings->InitTuneTable(nValue, pSettings->m_nTuneTable); - RefreshAlphaTable(); - break; - case ATTR_TextTuningR: - pSettings->InitTuneTable(nValue, pSettings->m_nTuneTableR); - RefreshAlphaTable(); - break; - case ATTR_TextTuningG: - pSettings->InitTuneTable(nValue, pSettings->m_nTuneTableG); - RefreshAlphaTable(); - break; - case ATTR_TextTuningB: - pSettings->InitTuneTable(nValue, pSettings->m_nTuneTableB); - RefreshAlphaTable(); - break; - case ATTR_LoadOnDemand: - pSettings->m_bLoadOnDemand = !!nValue; - break; - case ATTR_ShadowAlpha: - pSettings->m_nShadow[2] = nValue; - pSettings->m_bEnableShadow = (nValue!=1); - RefreshAlphaTable(); - break; - case ATTR_ShadowOffset: - pSettings->m_nShadow[1] = nValue; - pSettings->m_nShadow[0] = nValue; - case ATTR_Fontlink: - if (!!pSettings->m_bFontLink != !!nValue) - { - pSettings->m_fontlinkinfo.clear(); - if (nValue) - pSettings->m_fontlinkinfo.init(); - } - pSettings->m_bFontLink = nValue; - break; - case ATTR_FontLoader: - pSettings->m_nFontLoader = nValue; - break; - case ATTR_LcdFilterWeight: - if (!nValue) - pSettings->m_bUseCustomLcdFilter = false; //NULLǹرԶ - else - { - pSettings->m_bUseCustomLcdFilter = true; //򿪹 - if (!IsBadReadPtr((void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights))) //ָЧ - memcpy(pSettings->m_arrLcdFilterWeights, (void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights)); // - } - UpdateLcdFilter(); //ˢ¹ - break; - case ATTR_HintSmallFont: - pSettings->m_bHintSmallFont = !!nValue; - break; - case ATTR_MaxBitmap: - pSettings->m_nBitmapHeight = nValue; - break; - case ATTR_ShadowBuffer: - if (nValue && !IsBadReadPtr((void*)nValue, sizeof(pSettings->m_nShadow))) //ָЧ - { - LPCTSTR szShadow = (LPCTSTR)nValue; - CStringTokenizer token; - - if (token.Parse(szShadow) < 3) { - break; - } - for (int i=0; i<3; i++) { - pSettings->m_nShadow[i] = pSettings->_StrToInt(token.GetArgument(i), 0); - /*if (m_nShadow[i] <= 0) { - goto SKIP; - }*/ - } - pSettings->m_bEnableShadow = true; - if (token.GetCount()>=4) //ָdzɫӰ - pSettings->m_nShadowDarkColor = pSettings->_httoi(token.GetArgument(3)); //ȡӰ - else - pSettings->m_nShadowDarkColor = 0; //Ϊɫ - if (token.GetCount()>=6) //ָɫӰ - { - pSettings->m_nShadowLightColor = pSettings->_httoi(token.GetArgument(5)); //ȡӰ - pSettings->m_nShadow[3] = pSettings->_StrToInt(token.GetArgument(4), pSettings->m_nShadow[2]); //ȡ - } - else - { - //pSettings->m_nShadowLightColor = pSettings->m_nShadowLightColor; //dzɫӰͬ - pSettings->m_nShadow[3] = pSettings->m_nShadow[2]; //Ҳͬ - } - RefreshAlphaTable(); - } - break; - default: - return FALSE; - } - m_bDirty = true; - return true; - } - BOOL WINAPI SetFloatAttribute(int eSet, float nValue) - { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - switch ((eMTSettings)eSet) - { - case ATTR_GammaValue: - pSettings->m_fGammaValue = nValue; - RefreshAlphaTable(); - break; - case ATTR_Contrast: - pSettings->m_fContrast = nValue; - RefreshAlphaTable(); - break; - case ATTR_RenderWeight: - pSettings->m_fRenderWeight = nValue; - RefreshAlphaTable(); - break; - default: - return FALSE; - } - m_bDirty = true; - return true; - }; - int WINAPI GetIntAttribute(int eSet) { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - switch ((eMTSettings)eSet) - { - case ATTR_HINTINGMODE: - return pSettings->m_FontSettings.GetHintingMode(); - case ATTR_ANTIALIASMODE: - return pSettings->m_FontSettings.GetAntiAliasMode(); - case ATTR_NormalWeight: - return pSettings->m_FontSettings.GetNormalWeight(); - case ATTR_BoldWeight: - return pSettings->m_FontSettings.GetBoldWeight(); - case ATTR_ItalicSlant: - return pSettings->m_FontSettings.GetItalicSlant(); - case ATTR_EnableKerning: - return pSettings->m_FontSettings.GetKerning(); - case ATTR_GammaMode: - return pSettings->m_nGammaMode; - case ATTR_HintSmallFont: - return pSettings->m_bHintSmallFont; - case ATTR_MaxBitmap: - return pSettings->m_nBitmapHeight; - case ATTR_LcdFilter: - return pSettings->m_nLcdFilter; - case ATTR_BolderMode: - return pSettings->m_nBolderMode; - case ATTR_TextTuning: - return 0; - case ATTR_TextTuningR: - return 0; - case ATTR_TextTuningG: - return 0; - case ATTR_TextTuningB: - return 0; - case ATTR_LoadOnDemand: - return pSettings->m_bLoadOnDemand; - case ATTR_ShadowAlpha: - return pSettings->EnableShadow()? pSettings->m_nShadow[2] : 1; - case ATTR_ShadowOffset: - return pSettings->EnableShadow()? pSettings->m_nShadow[0] : 1; - case ATTR_Fontlink: - return pSettings->m_bFontLink; - case ATTR_LcdFilterWeight: - return pSettings->m_bUseCustomLcdFilter? (int)pSettings->m_arrLcdFilterWeights:NULL; - default: - return 0; - } - return 0; - }; - float WINAPI GetFloatAttribute(int eSet) { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - switch ((eMTSettings)eSet) - { - case ATTR_GammaValue: - return pSettings->m_fGammaValue; - case ATTR_Contrast: - return pSettings->m_fContrast; - case ATTR_RenderWeight: - return pSettings->m_fRenderWeight; - default: - return 0; - } - return 0; - }; - BOOL WINAPI RefreshSetting(void) { - if (m_bDirty) - g_pFTEngine->ReloadAll(); - m_bDirty = false; - return true; - }; - BOOL WINAPI EnableRender(BOOL bEnable){g_ccbRender = bEnable; return true;}; - BOOL WINAPI EnableCache(BOOL bEnable){g_ccbCache = bEnable; return true;}; - BOOL WINAPI ClearIndividual(){ - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - pSettings->m_arrIndividual.RemoveAll(); - m_bDirty = true; - return true; - }; - BOOL WINAPI AddIndividual(WCHAR* fontSetting) - { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - IndividualArray& arr = pSettings->m_arrIndividual; - LPTSTR p = fontSetting; - LOGFONT truefont={0}; - if (*p) { - bool b = false; - - LPTSTR pnext = p; - for (; *pnext; pnext++); - - //"lr oSVbN=0,0" ݂ȕ𕪊 - LPTSTR value = _tcschr(p, _T('=')); - CStringTokenizer token; - int argc = 0; - if (value) { - *value++ = _T('\0'); - argc = token.Parse(value); - } - TCHAR buff[LF_FACESIZE+1]; - GetFontLocalName(p, buff); //ת - - CFontIndividual fi(buff); - const CFontSettings& fsCommon = pSettings->m_FontSettings; - CFontSettings& fs = fi.GetIndividual(); - //Individual΋ʐݒg - fs = fsCommon; - for (int i = 0; i < MAX_FONT_SETTINGS; i++) { - LPCTSTR arg = token.GetArgument(i); - if (!arg) - break; - const int n = pSettings->_StrToInt(arg, fsCommon.GetParam(i)); - fs.SetParam(i, n); - } - - for (int i = 0 ; i < arr.GetSize(); i++) { - if (arr[i] == fi) { - b = true; - break; - } - } - if (!b) { - arr.Add(fi); - } - } - m_bDirty = true; - return true; }; - BOOL WINAPI DelIndividual(WCHAR* lpFaceName) { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - CFontIndividual* p = pSettings->m_arrIndividual.Begin(); - CFontIndividual* end = pSettings->m_arrIndividual.End(); - StringHashFont hash(lpFaceName); - - for(; p != end; ++p) { - if (p->GetHash() == hash) { - pSettings->m_arrIndividual.Remove(*p); - } - } - m_bDirty = true; - return true;}; - void WINAPI LoadSetting(WCHAR* lpFileName) - { - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - ClearIndividual(); - pSettings->m_FontSubstitutesInfoForDW.RemoveAll(); - pSettings->m_FontSubstitutesInfo.RemoveAll(); - pSettings->m_fontlinkinfo.clear(); - pSettings->LoadAppSettings(lpFileName); - pSettings->m_bDelayedInit = false; - m_bDirty = true; - RefreshAlphaTable(); - RefreshSetting(); - } - CControlCenter():m_nRefCount(1), m_bDirty(false){}; - ~CControlCenter(){}; - static void WINAPI ReloadConfig() - { - //CCriticalSectionLock __lock(CCriticalSectionLock::CS_LIBRARY); - CGdippSettings* pSettings = CGdippSettings::GetInstance(); - extern HINSTANCE g_dllInstance; - pSettings->m_arrIndividual.RemoveAll(); - pSettings->m_FontSubstitutesInfoForDW.RemoveAll(); - pSettings->m_FontSubstitutesInfo.RemoveAll(); - pSettings->m_fontlinkinfo.clear(); - pSettings->LoadSettings(g_dllInstance); - pSettings->m_bDelayedInit = false; - RefreshAlphaTable(); - UpdateLcdFilter(); - if (g_pFTEngine) - g_pFTEngine->ReloadAll(); - } -}; +#define SETTING_FONTSUBSTITUTE_ALL (2) + +#define SETTING_WIDTHMODE_GDI32 (0) +#define SETTING_WIDTHMODE_FREETYPE (1) + +#define SETTING_FONTLOADER_FREETYPE (0) +#define SETTING_FONTLOADER_WIN32 (1) + +class CGdippSettings; + +interface IControlCenter +{ + virtual HRESULT STDMETHODCALLTYPE QueryInterface( + /* [in] */ REFIID riid, + /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) = 0; + virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0; + virtual ULONG STDMETHODCALLTYPE Release( void) = 0; + virtual ULONG WINAPI GetVersion(void) = 0; + virtual BOOL WINAPI SetIntAttribute(int eSet, int nValue) = 0; + virtual BOOL WINAPI SetFloatAttribute(int eSet, float nValue) = 0; + virtual int WINAPI GetIntAttribute(int eSet) = 0; + virtual float WINAPI GetFloatAttribute(int eSet) = 0; + virtual BOOL WINAPI RefreshSetting(void) = 0; + virtual BOOL WINAPI EnableRender(BOOL bEnable) = 0; + virtual BOOL WINAPI EnableCache(BOOL bEnable) = 0; + virtual BOOL WINAPI ClearIndividual() = 0; + virtual BOOL WINAPI AddIndividual(WCHAR* fontSetting) = 0; + virtual BOOL WINAPI DelIndividual(WCHAR* lpFaceName) = 0; + virtual void WINAPI LoadSetting(WCHAR* lpFileName) = 0; +}; +class CControlCenter; + +class CGdippSettings +{ + friend CControlCenter; + friend CFontSubstituteData; + friend BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID); +private: + static CGdippSettings* s_pInstance; + //INIp + CFontSettings m_FontSettings; + static CParseIni m_Config; + bool m_bHookChildProcesses : 1; + bool m_bUseMapping : 1; + bool m_bLoadOnDemand : 1; + bool m_bEnableShadow : 1; + + //ȊO + bool m_bIsWinXPorLater : 1; + bool m_bRunFromGdiExe : 1; + bool m_bIsInclude : 1; + bool m_bDelayedInit : 1; +// bool m_bIsHDBench : 1; +// bool m_bHaveNewerFreeType : 1; + bool : 0; + bool m_bUseCustomLcdFilter; //ʹԶlcdfilter + + BOOL m_bHintSmallFont; + BOOL m_bDirectWrite; + int m_nBolderMode; + int m_nGammaMode; + float m_fGammaValue; + float m_fRenderWeight; + float m_fContrast; + int m_nMaxHeight; + int m_nMinHeight; + int m_nBitmapHeight; + int m_nLcdFilter; + int m_nShadow[4]; + int m_nFontSubstitutes; + int m_bFontLink; //Ϊʹöֲ + int m_nWidthMode; + int m_nFontLoader; + int m_nScreenDpi; // screen dpi + DWORD m_nShadowLightColor; + DWORD m_nShadowDarkColor; + unsigned char m_arrLcdFilterWeights[5]; + + //settings for experimental + bool m_bEnableClipBoxFix; + bool m_bColorFont; + bool m_bInvertColor; + + + //settings for directwrite + float m_fGammaValueForDW; + float m_fContrastForDW; + float m_fClearTypeLevelForDW; + int m_nRenderingModeForDW; + CFontSubstitutesInfo m_FontSubstitutesInfoForDW; + + //FTC_Manager_New˶ɤѥ` + int m_nCacheMaxFaces; + int m_nCacheMaxSizes; + int m_nCacheMaxBytes; + int m_dwOSMajorVer; + int m_dwOSMinorVer; + + // ꥢ{åƩ`֥ + int m_nTuneTable[256]; + // LCD + int m_nTuneTableR[256]; + int m_nTuneTableG[256]; + int m_nTuneTableB[256]; + static TCHAR m_szexeName[MAX_PATH+1]; + + typedef set FontHashMap; + typedef set ModuleHashMap; + typedef set FontSubSet; + typedef CArray IndividualArray; + FontHashMap m_arrExcludeFont; + FontHashMap m_arrIncludeFont; + ModuleHashMap m_arrExcludeModule; + ModuleHashMap m_arrIncludeModule; + ModuleHashMap m_arrUnloadModule; + ModuleHashMap m_arrUnFontSubModule; + IndividualArray m_arrIndividual; + + // ָե + LOGFONT m_lfForceFont; + TCHAR m_szForceChangeFont[LF_FACESIZE]; + + //INIե + TCHAR m_szFileName[MAX_PATH]; + + //INIiz߄I + bool LoadAppSettings(LPCTSTR lpszFile); + void GetOSVersion(); + float FastGetProfileFloat(LPCTSTR lpszSection, LPCTSTR lpszKey, float fDefault); + int FastGetProfileInt(LPCTSTR lpszSection, LPCTSTR lpszKey, int nDefault); + DWORD FastGetProfileString(LPCTSTR lpszSection, LPCTSTR lpszKey, LPCTSTR lpszDefault, LPTSTR lpszRet, DWORD cch); + static bool _IsFreeTypeProfileSectionExists(LPCTSTR lpszKey, LPCTSTR lpszFile); + static LPTSTR _GetPrivateProfileSection (LPCTSTR lpszSection, LPCTSTR lpszFile); + static int _GetFreeTypeProfileInt (LPCTSTR lpszKey, int nDefault, LPCTSTR lpszFile); + static int _GetFreeTypeProfileIntFromSection(LPCTSTR lpszSection, LPCTSTR lpszKey, int nDefault, LPCTSTR lpszFile); + static bool _GetFreeTypeProfileBoolFromSection(LPCTSTR lpszSection, LPCTSTR lpszKey, bool nDefault, LPCTSTR lpszFile); + static wstring _GetFreeTypeProfileStrFromSection(LPCTSTR lpszSection, LPCTSTR lpszKey, const TCHAR* nDefault, LPCTSTR lpszFile); + static int _GetFreeTypeProfileBoundInt (LPCTSTR lpszKey, int nDefault, int nMin, int nMax, LPCTSTR lpszFile); + static float _GetFreeTypeProfileFloat (LPCTSTR lpszKey, float fDefault, LPCTSTR lpszFile); + static float _GetFreeTypeProfileBoundFloat(LPCTSTR lpszKey, float fDefault, float fMin, float fMax, LPCTSTR lpszFile); + static DWORD _GetFreeTypeProfileString (LPCTSTR lpszKey, LPCTSTR lpszDefault, LPTSTR lpszRet, DWORD cch, LPCTSTR lpszFile); + static int CALLBACK EnumFontFamProc(const LOGFONT* lplf, const TEXTMETRIC* lptm, DWORD FontType, LPARAM lParam); + //template + static bool AddListFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, set & arr); + static bool AddExcludeListFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, set & arr); + bool AddIndividualFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, IndividualArray& arr); + bool AddLcdFilterFromSection(LPCTSTR lpszKey, LPCTSTR lpszFile, unsigned char* arr); + static int _StrToInt(LPCTSTR pStr, int nDefault); + static float _StrToFloat(LPCTSTR pStr, float fDefault); + static int _httoi(const TCHAR *value); + void InitInitTuneTable(); + static void InitTuneTable(int v, int* table); + void DelayedInit(); + int _GetAlternativeProfileName(LPTSTR lpszName, LPCTSTR lpszFile); + + CFontLinkInfo m_fontlinkinfo; + CFontSubstitutesInfo m_FontSubstitutesInfo; + + CGdippSettings() + : m_bHookChildProcesses(false) + , m_bUseMapping(false) + , m_bLoadOnDemand(false) + , m_bEnableShadow(false) + , m_bFontLink(0) +// , m_bEnableKerning(false) + , m_bIsWinXPorLater(false) + , m_bRunFromGdiExe(false) + , m_bIsInclude(false) + , m_bDelayedInit(false) +// , m_bIsHDBench(false) +// , m_bHaveNewerFreeType(false) + , m_nBolderMode(0) + , m_nGammaMode(0) + , m_fGammaValue(1.0f) + , m_fGammaValueForDW(0.0f) + , m_fRenderWeight(1.0f) + , m_fContrast(1.0f) + , m_nMaxHeight(0) + , m_nMinHeight(0) + , m_nBitmapHeight(0) + , m_nLcdFilter(0) + , m_nCacheMaxFaces(0) + , m_nCacheMaxSizes(0) + , m_nCacheMaxBytes(0) + , m_bHintSmallFont(true) + , m_bDirectWrite(true) + , m_nScreenDpi(96) + { + ZeroMemory(m_nTuneTable, sizeof(m_nTuneTable)); + ZeroMemory(m_nTuneTableR, sizeof(m_nTuneTableR)); + ZeroMemory(m_nTuneTableG, sizeof(m_nTuneTableG)); + ZeroMemory(m_nTuneTableB, sizeof(m_nTuneTableB)); + ZeroMemory(&m_lfForceFont, sizeof(LOGFONT)); + ZeroMemory(m_nShadow, sizeof(m_nShadow)); + ZeroMemory(m_szFileName, sizeof(m_szFileName)); + ZeroMemory(m_szForceChangeFont, sizeof(m_szForceChangeFont)); + } + + ~CGdippSettings() + { + + } + + static CGdippSettings* CreateInstance(); + static void DestroyInstance(); + +public: + static CGdippSettings* GetInstance(); + static const CGdippSettings* GetInstanceNoInit(); //FreeTypeFontEngine + + //INIp + const CFontSettings& GetFontSettings() const { return m_FontSettings; } + bool HookChildProcesses() const { return m_bHookChildProcesses; } + bool UseMapping() const { return m_bUseMapping; } + bool LoadOnDemand() const { return m_bLoadOnDemand; } + char FontLink() const { return m_bFontLink; } + BOOL DirectWrite() const { return m_bDirectWrite; } + BOOL HintSmallFont() const { return m_bHintSmallFont; } +// bool EnableKerning() const { return m_bEnableKerning; } + + int BolderMode() const { return m_nBolderMode; } + int GammaMode() const { return m_nGammaMode; } + float GammaValue() const { return m_fGammaValue; } + + //DW options + float GammaValueForDW() const { return m_fGammaValueForDW; } + float ContrastForDW() const { return m_fContrastForDW; } + float ClearTypeLevelForDW() const { return m_fClearTypeLevelForDW; } + int RenderingModeForDW() const { return m_nRenderingModeForDW; } + /*const CFontSubstitutesInfo& GetFontSubstitutesInfoForDW() const + { _ASSERTE(m_bDelayedInit); return m_FontSubstitutesInfoForDW; }*/ + + float RenderWeight() const { return m_fRenderWeight; } + float Contrast() const { return m_fContrast; } + int MaxHeight() const { return m_nMaxHeight; } + int MinHeight() const { return m_nMinHeight; } + int BitmapHeight() const { return m_nBitmapHeight; } + int ScreenDpi() const { return m_nScreenDpi; } + int LcdFilter() const { return m_nLcdFilter; } + const unsigned char* LcdFilterWeights() const { return m_arrLcdFilterWeights; } + bool UseCustomLcdFilter() const { return m_bUseCustomLcdFilter; } + int WidthMode() const { return m_nWidthMode; } + int FontLoader() const { return m_nFontLoader; } + bool EnableClipBoxFix() const { return m_bEnableClipBoxFix; } + bool LoadColorFont() const { return m_bColorFont; } + bool InvertColor() const { return m_bInvertColor; } + DWORD ShadowLightColor() const { return m_nShadowLightColor; } + DWORD ShadowDarkColor() const { return m_nShadowDarkColor; } + int FontSubstitutes() const { return m_nFontSubstitutes; } //ж滻ģʽ + int CacheMaxFaces() const { return m_nCacheMaxFaces; } + int CacheMaxSizes() const { return m_nCacheMaxSizes; } + int CacheMaxBytes() const { return m_nCacheMaxBytes; } + + bool EnableShadow() const { return m_bEnableShadow; } + const int* GetShadowParams() const { return m_nShadow; } + bool DelayedInited() const { return m_bDelayedInit; } // return the delayedinit status + +// OS version comparsion for magic code + bool IsWindows8() const { return m_dwOSMajorVer == 6 && m_dwOSMinorVer == 2; } + bool IsWindows81() const { return m_dwOSMajorVer == 6 && m_dwOSMinorVer == 3; } + // եߤȤ + LPCTSTR GetForceFontName() const + { + _ASSERTE(m_bDelayedInit); + LPCTSTR lpszFace = m_lfForceFont.lfFaceName; + return lpszFace[0] ? lpszFace : NULL; + } + + bool CopyForceFont(LOGFONT& lf, const LOGFONT& lfOrg) const; + + // + bool IsWinXPorLater() const { return m_bIsWinXPorLater; } + bool IsInclude() const { return m_bIsInclude; } +// bool IsHDBench() const { return m_bIsHDBench; } + bool RunFromGdiExe() const { return m_bRunFromGdiExe; } +// bool HaveNewerFreeType() const { return m_bHaveNewerFreeType; } + const int* GetTuneTable() const { return m_nTuneTable; } + const int* GetTuneTableR() const { return m_nTuneTableR; } + const int* GetTuneTableG() const { return m_nTuneTableG; } + const int* GetTuneTableB() const { return m_nTuneTableB; } + + bool LoadSettings(HINSTANCE hModule); + + bool IsFontExcluded(LPCSTR lpFaceName) const; + bool IsFontExcluded(LPCWSTR lpFaceName) const; + + //Snowie!! + bool IsProcessUnload() const; + bool IsExeUnload(LPCTSTR lpApp) const; + bool IsExeInclude(LPCTSTR lpApp) const; + void AddFontExclude(LPCWSTR lpFaceName); //ֱԶӵб + bool IsProcessExcluded() const; + bool IsProcessIncluded() const; + const CFontSettings& FindIndividual(LPCTSTR lpFaceName) const; + + const CFontLinkInfo& GetFontLinkInfo() const + { _ASSERTE(m_bDelayedInit); return m_fontlinkinfo; } + const CFontSubstitutesInfo& GetFontSubstitutesInfo() const + { _ASSERTE(m_bDelayedInit); return m_FontSubstitutesInfo; } +}; + +class CFontFaceNamesEnumerator +{ +private: + enum { + MAXFACENAMES = CFontLinkInfo::FONTMAX * 2 + 1, + }; + LPCWSTR m_facenames[MAXFACENAMES]; + int m_pos; + int m_endpos; + CFontFaceNamesEnumerator(); +public: + CFontFaceNamesEnumerator(LPCWSTR facename, int nFontFamily); + operator LPCWSTR () { + return m_facenames[m_pos]; + } + LPCWSTR getname() + { + return m_facenames[m_pos]; + } + void next() { + ++m_pos; + } + void prev() { + m_pos>0?--m_pos:0; + } + bool atend() { + return !!(m_pos >= m_endpos); + } +}; +#include "fteng.h" +#include "ft.h" +#include +#include "strtoken.h" +extern FreeTypeFontEngine* g_pFTEngine; +extern BOOL g_ccbCache; +extern BOOL g_ccbRender; + +class CControlCenter: public IControlCenter +{ +private: + int m_nRefCount; + bool m_bDirty; + enum eMTSettings{ + ATTR_HINTINGMODE, + ATTR_ANTIALIASMODE, + ATTR_NormalWeight, + ATTR_BoldWeight, + ATTR_ItalicSlant, + ATTR_EnableKerning, + ATTR_GammaMode, + ATTR_LcdFilter, + ATTR_BolderMode, + ATTR_TextTuning, + ATTR_TextTuningR, + ATTR_TextTuningG, + ATTR_TextTuningB, + ATTR_GammaValue, + ATTR_Contrast, + ATTR_RenderWeight, + ATTR_ShadowAlpha, + ATTR_ShadowOffset, + ATTR_Fontlink, + ATTR_HookChildProcess, + ATTR_LoadOnDemand, + ATTR_FontLoader, + ATTR_FontSubstitute, + ATTR_LcdFilterWeight, + ATTR_ShadowBuffer, + ATTR_MaxBitmap, + ATTR_DirectWrite, + ATTR_HintSmallFont + }; + typedef CArray IndividualArray; +public: + HRESULT STDMETHODCALLTYPE QueryInterface( + /* [in] */ REFIID riid, + /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) + { + ppvObject = (void**)this; + return 0; + } + ULONG STDMETHODCALLTYPE AddRef( void) {return InterlockedIncrement((LONG*)&m_nRefCount);}; + ULONG STDMETHODCALLTYPE Release( void) { + int result = InterlockedDecrement((LONG*)&m_nRefCount); + if (!result) + delete this; + return result; + } + ULONG WINAPI GetVersion(void){ return MACTYPE_VERSION; }; + BOOL WINAPI SetIntAttribute(int eSet, int nValue) + { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + switch ((eMTSettings)eSet) + { + case ATTR_HINTINGMODE: + pSettings->m_FontSettings.SetHintingMode(nValue); + break; + case ATTR_ANTIALIASMODE: + pSettings->m_FontSettings.SetAntiAliasMode(nValue); + break; + case ATTR_NormalWeight: + pSettings->m_FontSettings.SetNormalWeight(nValue); + break; + case ATTR_BoldWeight: + pSettings->m_FontSettings.SetBoldWeight(nValue); + break; + case ATTR_ItalicSlant: + pSettings->m_FontSettings.SetItalicSlant(nValue); + break; + case ATTR_EnableKerning: + pSettings->m_FontSettings.SetKerning(nValue); + break; + case ATTR_GammaMode: + pSettings->m_nGammaMode = nValue; + RefreshAlphaTable(); + break; + case ATTR_LcdFilter: + pSettings->m_nLcdFilter = nValue; + FT_Library_SetLcdFilter(freetype_library, (FT_LcdFilter)nValue); + break; + case ATTR_BolderMode: + pSettings->m_nBolderMode = nValue; + break; + case ATTR_TextTuning: + pSettings->InitTuneTable(nValue, pSettings->m_nTuneTable); + RefreshAlphaTable(); + break; + case ATTR_TextTuningR: + pSettings->InitTuneTable(nValue, pSettings->m_nTuneTableR); + RefreshAlphaTable(); + break; + case ATTR_TextTuningG: + pSettings->InitTuneTable(nValue, pSettings->m_nTuneTableG); + RefreshAlphaTable(); + break; + case ATTR_TextTuningB: + pSettings->InitTuneTable(nValue, pSettings->m_nTuneTableB); + RefreshAlphaTable(); + break; + case ATTR_LoadOnDemand: + pSettings->m_bLoadOnDemand = !!nValue; + break; + case ATTR_ShadowAlpha: + pSettings->m_nShadow[2] = nValue; + pSettings->m_bEnableShadow = (nValue!=1); + RefreshAlphaTable(); + break; + case ATTR_ShadowOffset: + pSettings->m_nShadow[1] = nValue; + pSettings->m_nShadow[0] = nValue; + case ATTR_Fontlink: + if (!!pSettings->m_bFontLink != !!nValue) + { + pSettings->m_fontlinkinfo.clear(); + if (nValue) + pSettings->m_fontlinkinfo.init(); + } + pSettings->m_bFontLink = nValue; + break; + case ATTR_FontLoader: + pSettings->m_nFontLoader = nValue; + break; + case ATTR_LcdFilterWeight: + if (!nValue) + pSettings->m_bUseCustomLcdFilter = false; //NULLǹرԶ + else + { + pSettings->m_bUseCustomLcdFilter = true; //򿪹 + if (!IsBadReadPtr((void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights))) //ָЧ + memcpy(pSettings->m_arrLcdFilterWeights, (void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights)); // + } + UpdateLcdFilter(); //ˢ¹ + break; + case ATTR_HintSmallFont: + pSettings->m_bHintSmallFont = !!nValue; + break; + case ATTR_MaxBitmap: + pSettings->m_nBitmapHeight = nValue; + break; + case ATTR_ShadowBuffer: + if (nValue && !IsBadReadPtr((void*)nValue, sizeof(pSettings->m_nShadow))) //ָЧ + { + LPCTSTR szShadow = (LPCTSTR)nValue; + CStringTokenizer token; + + if (token.Parse(szShadow) < 3) { + break; + } + for (int i=0; i<3; i++) { + pSettings->m_nShadow[i] = pSettings->_StrToInt(token.GetArgument(i), 0); + /*if (m_nShadow[i] <= 0) { + goto SKIP; + }*/ + } + pSettings->m_bEnableShadow = true; + if (token.GetCount()>=4) //ָdzɫӰ + pSettings->m_nShadowDarkColor = pSettings->_httoi(token.GetArgument(3)); //ȡӰ + else + pSettings->m_nShadowDarkColor = 0; //Ϊɫ + if (token.GetCount()>=6) //ָɫӰ + { + pSettings->m_nShadowLightColor = pSettings->_httoi(token.GetArgument(5)); //ȡӰ + pSettings->m_nShadow[3] = pSettings->_StrToInt(token.GetArgument(4), pSettings->m_nShadow[2]); //ȡ + } + else + { + //pSettings->m_nShadowLightColor = pSettings->m_nShadowLightColor; //dzɫӰͬ + pSettings->m_nShadow[3] = pSettings->m_nShadow[2]; //Ҳͬ + } + RefreshAlphaTable(); + } + break; + default: + return FALSE; + } + m_bDirty = true; + return true; + } + BOOL WINAPI SetFloatAttribute(int eSet, float nValue) + { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + switch ((eMTSettings)eSet) + { + case ATTR_GammaValue: + pSettings->m_fGammaValue = nValue; + RefreshAlphaTable(); + break; + case ATTR_Contrast: + pSettings->m_fContrast = nValue; + RefreshAlphaTable(); + break; + case ATTR_RenderWeight: + pSettings->m_fRenderWeight = nValue; + RefreshAlphaTable(); + break; + default: + return FALSE; + } + m_bDirty = true; + return true; + }; + int WINAPI GetIntAttribute(int eSet) { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + switch ((eMTSettings)eSet) + { + case ATTR_HINTINGMODE: + return pSettings->m_FontSettings.GetHintingMode(); + case ATTR_ANTIALIASMODE: + return pSettings->m_FontSettings.GetAntiAliasMode(); + case ATTR_NormalWeight: + return pSettings->m_FontSettings.GetNormalWeight(); + case ATTR_BoldWeight: + return pSettings->m_FontSettings.GetBoldWeight(); + case ATTR_ItalicSlant: + return pSettings->m_FontSettings.GetItalicSlant(); + case ATTR_EnableKerning: + return pSettings->m_FontSettings.GetKerning(); + case ATTR_GammaMode: + return pSettings->m_nGammaMode; + case ATTR_HintSmallFont: + return pSettings->m_bHintSmallFont; + case ATTR_MaxBitmap: + return pSettings->m_nBitmapHeight; + case ATTR_LcdFilter: + return pSettings->m_nLcdFilter; + case ATTR_BolderMode: + return pSettings->m_nBolderMode; + case ATTR_TextTuning: + return 0; + case ATTR_TextTuningR: + return 0; + case ATTR_TextTuningG: + return 0; + case ATTR_TextTuningB: + return 0; + case ATTR_LoadOnDemand: + return pSettings->m_bLoadOnDemand; + case ATTR_ShadowAlpha: + return pSettings->EnableShadow()? pSettings->m_nShadow[2] : 1; + case ATTR_ShadowOffset: + return pSettings->EnableShadow()? pSettings->m_nShadow[0] : 1; + case ATTR_Fontlink: + return pSettings->m_bFontLink; + case ATTR_LcdFilterWeight: + return pSettings->m_bUseCustomLcdFilter? (int)pSettings->m_arrLcdFilterWeights:NULL; + default: + return 0; + } + return 0; + }; + float WINAPI GetFloatAttribute(int eSet) { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + switch ((eMTSettings)eSet) + { + case ATTR_GammaValue: + return pSettings->m_fGammaValue; + case ATTR_Contrast: + return pSettings->m_fContrast; + case ATTR_RenderWeight: + return pSettings->m_fRenderWeight; + default: + return 0; + } + return 0; + }; + BOOL WINAPI RefreshSetting(void) { + if (m_bDirty) + g_pFTEngine->ReloadAll(); + m_bDirty = false; + return true; + }; + BOOL WINAPI EnableRender(BOOL bEnable){g_ccbRender = bEnable; return true;}; + BOOL WINAPI EnableCache(BOOL bEnable){g_ccbCache = bEnable; return true;}; + BOOL WINAPI ClearIndividual(){ + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + pSettings->m_arrIndividual.RemoveAll(); + m_bDirty = true; + return true; + }; + BOOL WINAPI AddIndividual(WCHAR* fontSetting) + { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + IndividualArray& arr = pSettings->m_arrIndividual; + LPTSTR p = fontSetting; + LOGFONT truefont={0}; + if (*p) { + bool b = false; + + LPTSTR pnext = p; + for (; *pnext; pnext++); + + //"lr oSVbN=0,0" ݂ȕ𕪊 + LPTSTR value = _tcschr(p, _T('=')); + CStringTokenizer token; + int argc = 0; + if (value) { + *value++ = _T('\0'); + argc = token.Parse(value); + } + TCHAR buff[LF_FACESIZE+1]; + GetFontLocalName(p, buff); //ת + + CFontIndividual fi(buff); + const CFontSettings& fsCommon = pSettings->m_FontSettings; + CFontSettings& fs = fi.GetIndividual(); + //Individual΋ʐݒg + fs = fsCommon; + for (int i = 0; i < MAX_FONT_SETTINGS; i++) { + LPCTSTR arg = token.GetArgument(i); + if (!arg) + break; + const int n = pSettings->_StrToInt(arg, fsCommon.GetParam(i)); + fs.SetParam(i, n); + } + + for (int i = 0 ; i < arr.GetSize(); i++) { + if (arr[i] == fi) { + b = true; + break; + } + } + if (!b) { + arr.Add(fi); + } + } + m_bDirty = true; + return true; }; + BOOL WINAPI DelIndividual(WCHAR* lpFaceName) { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + CFontIndividual* p = pSettings->m_arrIndividual.Begin(); + CFontIndividual* end = pSettings->m_arrIndividual.End(); + StringHashFont hash(lpFaceName); + + for(; p != end; ++p) { + if (p->GetHash() == hash) { + pSettings->m_arrIndividual.Remove(*p); + } + } + m_bDirty = true; + return true;}; + void WINAPI LoadSetting(WCHAR* lpFileName) + { + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + ClearIndividual(); + pSettings->m_FontSubstitutesInfoForDW.RemoveAll(); + pSettings->m_FontSubstitutesInfo.RemoveAll(); + pSettings->m_fontlinkinfo.clear(); + pSettings->LoadAppSettings(lpFileName); + pSettings->m_bDelayedInit = false; + m_bDirty = true; + RefreshAlphaTable(); + RefreshSetting(); + } + CControlCenter():m_nRefCount(1), m_bDirty(false){}; + ~CControlCenter(){}; + static void WINAPI ReloadConfig() + { + //CCriticalSectionLock __lock(CCriticalSectionLock::CS_LIBRARY); + CGdippSettings* pSettings = CGdippSettings::GetInstance(); + extern HINSTANCE g_dllInstance; + pSettings->m_arrIndividual.RemoveAll(); + pSettings->m_FontSubstitutesInfoForDW.RemoveAll(); + pSettings->m_FontSubstitutesInfo.RemoveAll(); + pSettings->m_fontlinkinfo.clear(); + pSettings->LoadSettings(g_dllInstance); + pSettings->m_bDelayedInit = false; + RefreshAlphaTable(); + UpdateLcdFilter(); + if (g_pFTEngine) + g_pFTEngine->ReloadAll(); + } +}; From 412be722a444cbdcac75dbd4a8ca348abbfe2ad0 Mon Sep 17 00:00:00 2001 From: namazso <8676443+namazso@users.noreply.github.com> Date: Sun, 6 Dec 2020 10:00:05 +0100 Subject: [PATCH 2/6] fix file encoding in non-ambigous cases --- EventLogging.cpp | 2 +- cache.cpp | 4 +- colorinvert.h | 2 +- common.h | 4 +- crc32.h | 2 +- directwrite.cpp | 2 +- directwrite.h | 2 +- dll.cpp | 120 +++++++++++++++++++++--------------------- dll.h | 2 +- dynCodeHelper.cpp | 2 +- dynCodeHelper.h | 2 +- easyhook.h | 2 +- expfunc.cpp | 10 ++-- ft - non-ref.cpp | 84 ++++++++++++++--------------- ft.cpp | 102 +++++++++++++++++------------------ fteng.cpp | 88 +++++++++++++++---------------- fteng.h | 16 +++--- ftref.h | 2 +- gdiPlusFlat2.cpp | 2 +- gdiPlusFlat2.h | 8 +-- gdipp.vcxproj | 2 +- gdipp.vcxproj.filters | 2 +- hash_list.cpp | 2 +- hash_list.h | 2 +- hook.cpp | 2 +- misc.cpp | 2 +- override.cpp | 38 ++++++------- ownedcs.cpp | 8 +-- ownedcs.h | 4 +- settings.cpp | 14 ++--- settings.h | 32 +++++------ supinfo.h | 12 ++--- undocAPI.h | 2 +- wow64layer.h | 2 +- 34 files changed, 291 insertions(+), 291 deletions(-) diff --git a/EventLogging.cpp b/EventLogging.cpp index 3814a5c..d8e4eaf 100644 --- a/EventLogging.cpp +++ b/EventLogging.cpp @@ -52,4 +52,4 @@ void EventLogging::LogIt(WORD CategoryID, DWORD EventID, LPCTSTR ArrayOfStrings[ ReportEvent(m_hEventLinker,EVENTLOG_INFORMATION_TYPE,CategoryID, EventID,NULL,NumOfArrayStr,RawDataSize,ArrayOfStrings,RawData); -} \ No newline at end of file +} diff --git a/cache.cpp b/cache.cpp index 9401c6f..78ef75a 100644 --- a/cache.cpp +++ b/cache.cpp @@ -1,6 +1,6 @@ #include "override.h" -//CreateDIBڻдDIB +//CreateDIB计数,将在绘制下列次数后更新DIB区 #define BITMAP_REDUCE_COUNTER 256//Ĭ1024 @@ -157,7 +157,7 @@ void CBitmapCache::DrawHorizontalLine(int X1, int Y1, int X2, COLORREF rgb, int dec ebx jnz L1 } -#else*/ //64λϵͳʹC +#else*/ //对于64位系统,使用C语言 for (int yy=Y1; yym_bInitDllMain = bInitDllMain; @@ -30,40 +30,40 @@ BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDll { return FALSE; //Ѿһdllûͷţܼµdll } - //Чԣʼ + //检查数据有效性,并初始化 if(!CheckDataValide(lpFileData, DataLength))return FALSE; - //ļؿռ + //计算所需的加载空间 int ImageSize = CalcTotalImageSize(); if(ImageSize == 0) return FALSE; - // ڴ + // 分配虚拟内存 void *pMemoryAddress = VirtualAlloc((LPVOID)0, ImageSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE); if(pMemoryAddress == NULL) return FALSE; else { - CopyDllDatas(pMemoryAddress, lpFileData); //dllݣÿ + CopyDllDatas(pMemoryAddress, lpFileData); //复制dll数据,并对齐每个段 //ضλϢ /*if(pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress >0 && pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size>0) { DoRelocation(pMemoryAddress); } - //ַ - if(!FillRavAddress(pMemoryAddress) && bFreeOnRavFail) //ַʧ + //填充引入地址表 + if(!FillRavAddress(pMemoryAddress) && bFreeOnRavFail) //修正引入地址表失败 { VirtualFree(pMemoryAddress,0,MEM_RELEASE); return FALSE; }*/ - //޸ҳԡӦøÿҳԵӦڴҳԡһ¡ + //修改页属性。应该根据每个页的属性单独设置其对应内存页的属性。这里简化一下。 //ͳһóһPAGE_EXECUTE_READWRITE unsigned long old; VirtualProtect(pMemoryAddress, ImageSize, PAGE_EXECUTE_READWRITE,&old); } - //ַ + //修正基地址 pNTHeader->OptionalHeader.ImageBase = (DWORD)pMemoryAddress; - //Ҫһdllںʼ + //接下来要调用一下dll的入口函数,做初始化工作。 pDllMain = (ProcDllMain)(pNTHeader->OptionalHeader.AddressOfEntryPoint +(DWORD_PTR) pMemoryAddress); BOOL InitResult = !bInitDllMain || pDllMain((HINSTANCE)pMemoryAddress,DLL_PROCESS_ATTACH,0); if(!InitResult) //ʼʧ @@ -79,9 +79,9 @@ BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDll return TRUE; } -//MemGetProcAddressdllлȡָĵַ -//ֵ ɹغַ , ʧܷNULL -//lpProcName: ҪҺֻ +//MemGetProcAddress函数从dll中获取指定函数的地址 +//返回值: 成功返回函数地址 , 失败返回NULL +//lpProcName: 要查找函数的名字或者序号 FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lpProcName) { if(pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress == 0 || @@ -140,55 +140,55 @@ FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lpProcName) void CMemLoadDll::DoRelocation( void *NewBase) { /* ضλĽṹ - // DWORD sectionAddress, DWORD size (Ҫضλ) - // 1000Ҫ5ضλݵĻضλ + // DWORD sectionAddress, DWORD size (包括本节需要重定位的数据) + // 例如 1000节需要修正5个重定位数据的话,重定位表的数据是 // 00 10 00 00 14 00 00 00 xxxx xxxx xxxx xxxx xxxx 0000 // ----------- ----------- ---- - // ڵƫ ܳߴ=8+6*2 Ҫĵַ ڶ4ֽ - // ضλɸaddress size0 ʾ - // Ҫĵַ12λģ4λ̬֣intel cpu3 + // 给出节的偏移 总尺寸=8+6*2 需要修正的地址 用于对齐4字节 + // 重定位表是若干个相连,如果address 和 size都是0 表示结束 + // 需要修正的地址是12位的,高4位是形态字,intel cpu下是3 */ - //NewBase0x600000,ļõȱʡImageBase0x400000,ƫ0x200000 + //假设NewBase是0x600000,而文件中设置的缺省ImageBase是0x400000,则修正偏移量就是0x200000 DWORD Delta = (DWORD)NewBase - pNTHeader->OptionalHeader.ImageBase; - //עضλλÿܺӲļеƫƵַͬӦʹüغĵַ + //注意重定位表的位置可能和硬盘文件中的偏移地址不同,应该使用加载后的地址 PIMAGE_BASE_RELOCATION pLoc = (PIMAGE_BASE_RELOCATION)((DWORD_PTR)NewBase + pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress); - while((pLoc->VirtualAddress + pLoc->SizeOfBlock) != 0) //ʼɨضλ + while((pLoc->VirtualAddress + pLoc->SizeOfBlock) != 0) //开始扫描重定位表 { WORD *pLocData = (WORD *)((DWORD_PTR)pLoc + sizeof(IMAGE_BASE_RELOCATION)); - //㱾ҪضλַĿ + //计算本节需要修正的重定位项(地址)的数目 int NumberOfReloc = (pLoc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD); for( int i=0 ; i < NumberOfReloc; i++) { - if( (DWORD)(pLocData[i] & 0xF000) == 0x00003000) //һҪĵַ + if( (DWORD)(pLocData[i] & 0xF000) == 0x00003000) //这是一个需要修正的地址 { - // + // 举例: // pLoc->VirtualAddress = 0x1000; - // pLocData[i] = 0x313E; ʾƫƵַ0x13EҪ + // pLocData[i] = 0x313E; 表示本节偏移地址0x13E处需要修正 // pAddress = ַ + 0x113E - // A1 ( 0c d4 02 10) ǣ mov eax , [1002d40c] - // Ҫ1002d40cַ + // 里面的内容是 A1 ( 0c d4 02 10) 汇编代码是: mov eax , [1002d40c] + // 需要修正1002d40c这个地址 DWORD * pAddress = (DWORD *)((DWORD_PTR)NewBase + pLoc->VirtualAddress + (pLocData[i] & 0x0FFF)); *pAddress += Delta; } } - //תƵһڽд + //转移到下一个节进行处理 pLoc = (PIMAGE_BASE_RELOCATION)((DWORD)pLoc + pLoc->SizeOfBlock); } } -//ַ +//填充引入地址表 BOOL CMemLoadDll::FillRavAddress(void *pImageBase) { - // ʵһ IMAGE_IMPORT_DESCRIPTOR ṹ飬ȫ0ʾ - // 鶨£ + // 引入表实际上是一个 IMAGE_IMPORT_DESCRIPTOR 结构数组,全部是0表示结束 + // 数组定义如下: // - // DWORD OriginalFirstThunk; // 0ʾָδ󶨵IATṹ + // DWORD OriginalFirstThunk; // 0表示结束,否则指向未绑定的IAT结构数组 // DWORD TimeDateStamp; // DWORD ForwarderChain; // -1 if no forwarders // DWORD Name; // dll - // DWORD FirstThunk; // ָIATṹĵַ(󶨺ЩIATʵʵĺַ) + // DWORD FirstThunk; // 指向IAT结构数组的地址(绑定后,这些IAT里面就是实际的函数地址) unsigned long Offset = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress ; if(Offset == 0) return TRUE; //No Import Table PIMAGE_IMPORT_DESCRIPTOR pID = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD_PTR) pImageBase + Offset); @@ -209,25 +209,25 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) else buf[i] = 0; HMODULE hDll = GetModuleHandle(buf); if(hDll == NULL)return FALSE; //NOT FOUND DLL - //ȡDLLÿĵַIAT + //获取DLL中每个导出函数的地址,填入IAT //ÿIATṹ // union { PBYTE ForwarderString; // PDWORD Function; // DWORD Ordinal; // PIMAGE_IMPORT_BY_NAME AddressOfData; // } u1; - // һDWORD һַ + // 长度是一个DWORD ,正好容纳一个地址。 for(i=0; ;i++) { if(pOriginalIAT[i].u1.Function == 0)break; FARPROC lpFunction = NULL; - if(pOriginalIAT[i].u1.Ordinal & IMAGE_ORDINAL_FLAG) //ֵǵ + if(pOriginalIAT[i].u1.Ordinal & IMAGE_ORDINAL_FLAG) //这里的值给出的是导出序号 { lpFunction = GetProcAddress(hDll, (LPCSTR)(pOriginalIAT[i].u1.Ordinal & 0x0000FFFF)); } - else //ֵ + else //按照名字导入 { - //ȡIATĺ + //获取此IAT项所描述的函数名称 PIMAGE_IMPORT_BY_NAME pByName = (PIMAGE_IMPORT_BY_NAME) ((DWORD_PTR)pImageBase + (DWORD)(pOriginalIAT[i].u1.AddressOfData)); // if(pByName->Hint !=0) @@ -248,34 +248,34 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) return TRUE; } -//CheckDataValideڼ黺еǷЧdllļ +//CheckDataValide函数用于检查缓冲区中的数据是否有效的dll文件 //ֵ һִеdll򷵻TRUE򷵻FALSE -//lpFileData: dllݵڴ滺 -//DataLength: dllļij +//lpFileData: 存放dll数据的内存缓冲区 +//DataLength: dll文件的长度 BOOL CMemLoadDll::CheckDataValide(void* lpFileData, int DataLength) { - //鳤 + //检查长度 if(DataLength < sizeof(IMAGE_DOS_HEADER)) return FALSE; pDosHeader = (PIMAGE_DOS_HEADER)lpFileData; // DOSͷ - //dosͷı + //检查dos头的标记 if(pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) return FALSE; //0x5A4D : MZ - //鳤 + //检查长度 if((DWORD)DataLength < (pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS32)) ) return FALSE; //ȡpeͷ pNTHeader = (PIMAGE_NT_HEADERS32)( (DWORD_PTR)lpFileData + (DWORD_PTR)pDosHeader->e_lfanew); // PEͷ - //peͷĺϷ + //检查pe头的合法性 if(pNTHeader->Signature != IMAGE_NT_SIGNATURE) return FALSE; //0x00004550 : PE00 if((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_DLL) == 0) //0x2000 : File is a DLL return FALSE; - if((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) == 0) //0x0002 : ָļ + if((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) == 0) //0x0002 : 指出文件可以运行 return FALSE; if(pNTHeader->FileHeader.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER32)) return FALSE; //ȡýڱα pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)pNTHeader + sizeof(IMAGE_NT_HEADERS32)); - //֤ÿڱĿռ + //验证每个节表的空间 for(int i=0; i< pNTHeader->FileHeader.NumberOfSections; i++) { if((pSectionHeader[i].PointerToRawData + pSectionHeader[i].SizeOfRawData) > (DWORD)DataLength)return FALSE; @@ -283,19 +283,19 @@ BOOL CMemLoadDll::CheckDataValide(void* lpFileData, int DataLength) return TRUE; } -//߽ +//计算对齐边界 int CMemLoadDll::GetAlignedSize(int Origin, int Alignment) { return (Origin + Alignment - 1) / Alignment * Alignment; } -//dllӳļijߴ +//计算整个dll映像文件的尺寸 int CMemLoadDll::CalcTotalImageSize() { int Size; if(pNTHeader == NULL)return 0; - int nAlign = pNTHeader->OptionalHeader.SectionAlignment; //ζֽ + int nAlign = pNTHeader->OptionalHeader.SectionAlignment; //段对齐字节数 - // ͷijߴ硣dos, coff, peͷ αĴС + // 计算所有头的尺寸。包括dos, coff, pe头 和 段表的大小 Size = GetAlignedSize(pNTHeader->OptionalHeader.SizeOfHeaders, nAlign); // нڵĴС for(int i=0; i < pNTHeader->FileHeader.NumberOfSections; ++i) @@ -311,12 +311,12 @@ int CMemLoadDll::CalcTotalImageSize() } return Size; } -//CopyDllDatasdllݸƵָڴ򣬲н -//pSrc: dllݵԭʼ -//pDest:Ŀڴַ +//CopyDllDatas函数将dll数据复制到指定内存区域,并对齐所有节 +//pSrc: 存放dll数据的原始缓冲区 +//pDest:目标内存地址 void CMemLoadDll::CopyDllDatas(void* pDest, void* pSrc) { - // ҪƵPEͷ+αֽ + // 计算需要复制的PE头+段表字节数 int HeaderSize = pNTHeader->OptionalHeader.SizeOfHeaders; int SectionSize = pNTHeader->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); int MoveSize = HeaderSize + SectionSize; @@ -329,13 +329,13 @@ void CMemLoadDll::CopyDllDatas(void* pDest, void* pSrc) if(pSectionHeader[i].VirtualAddress == 0 || pSectionHeader[i].SizeOfRawData == 0)continue; // λýڴеλ void *pSectionAddress = (void *)((DWORD_PTR)pDest + pSectionHeader[i].VirtualAddress); - // ƶݵڴ + // 复制段数据到虚拟内存 memmove((void *)pSectionAddress, (void *)((DWORD_PTR)pSrc + pSectionHeader[i].PointerToRawData), pSectionHeader[i].SizeOfRawData); } - //ָ룬ָ·ڴ + //修正指针,指向新分配的内存 //µdosͷ pDosHeader = (PIMAGE_DOS_HEADER)pDest; //µpeͷַ @@ -343,4 +343,4 @@ void CMemLoadDll::CopyDllDatas(void* pDest, void* pSrc) //µĽڱַ pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)pNTHeader + sizeof(IMAGE_NT_HEADERS32)); return ; -} \ No newline at end of file +} diff --git a/dll.h b/dll.h index 05190d9..860c88e 100644 --- a/dll.h +++ b/dll.h @@ -28,4 +28,4 @@ class CMemLoadDll PIMAGE_DOS_HEADER pDosHeader; PIMAGE_NT_HEADERS32 pNTHeader; PIMAGE_SECTION_HEADER pSectionHeader; -}; \ No newline at end of file +}; diff --git a/dynCodeHelper.cpp b/dynCodeHelper.cpp index 1fbc65e..7e24640 100644 --- a/dynCodeHelper.cpp +++ b/dynCodeHelper.cpp @@ -108,4 +108,4 @@ AutoEnableDynamicCodeGen::~AutoEnableDynamicCodeGen() enabled = false; } -} \ No newline at end of file +} diff --git a/dynCodeHelper.h b/dynCodeHelper.h index 544d1c8..3e4ae27 100644 --- a/dynCodeHelper.h +++ b/dynCodeHelper.h @@ -31,4 +31,4 @@ class AutoEnableDynamicCodeGen static PGET_THREAD_INFORMATION_PROC GetThreadInformationProc; static PROCESS_MITIGATION_DYNAMIC_CODE_POLICY processPolicy; static volatile bool processPolicyObtained; -}; \ No newline at end of file +}; diff --git a/easyhook.h b/easyhook.h index 0661632..f4b79e7 100644 --- a/easyhook.h +++ b/easyhook.h @@ -441,4 +441,4 @@ DRIVER_SHARED_API(NTSTATUS, LhBarrierCallStackTrace( }; #endif -#endif \ No newline at end of file +#endif diff --git a/expfunc.cpp b/expfunc.cpp index 091e47a..82f3f79 100644 --- a/expfunc.cpp +++ b/expfunc.cpp @@ -142,7 +142,7 @@ EXTERN_C void SafeUnload() { static BOOL bInited = false; if (bInited) - return; // + return; //防重入 bInited = true; while (CThreadCounter::Count()) Sleep(0); @@ -252,7 +252,7 @@ FARPROC K32GetProcAddress(LPCSTR lpProcName) //kernel32̃x[XAhX擾 WCHAR sysdir[MAX_PATH]; GetWindowsDirectory(sysdir, MAX_PATH); - if (GetModuleHandle(_T("kernelbase.dll"))) //鿴ԼǷKernelbase.dllļ˵win7ϵͳ + if (GetModuleHandle(_T("kernelbase.dll"))) //查看自己是否加载了Kernelbase.dll文件,存在则说明是win7系统 wcscat(sysdir, L"\\SysWow64\\kernelbase.dll"); else wcscat(sysdir, L"\\SysWow64\\kernel32.dll"); //ھvista @@ -260,8 +260,8 @@ FARPROC K32GetProcAddress(LPCSTR lpProcName) if (hFile == INVALID_HANDLE_VALUE) return NULL; DWORD dwSize = GetFileSize(hFile, NULL); - BYTE* pMem = new BYTE[dwSize]; //ڴ - ReadFile(hFile, pMem, dwSize, &dwSize, NULL);//ȡļ + BYTE* pMem = new BYTE[dwSize]; //分配内存 + ReadFile(hFile, pMem, dwSize, &dwSize, NULL);//读取文件 CloseHandle(hFile); CMemLoadDll MemDll; @@ -680,7 +680,7 @@ VOID SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo) } } -// ȡϵͳλ +// 获取操作系统位数 int GetSystemBits() { SYSTEM_INFO si; diff --git a/ft - non-ref.cpp b/ft - non-ref.cpp index 2b107d5..18445a3 100644 --- a/ft - non-ref.cpp +++ b/ft - non-ref.cpp @@ -61,7 +61,7 @@ ControlIder CID; #endif -// +//更新 #define RGBA(r,g,b,a) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)|(((DWORD)(BYTE)(a))<<24))) //!!Snowie @@ -147,7 +147,7 @@ static CAlphaBlend s_AlphaBlendTable; void CAlphaBlend::gettunetbl(int paramalpha, BOOL lcd, BOOL dark, const int * &tblR, const int * &tblG, const int * &tblB) const { - if (paramalpha == 1) { //ȡֻϱ + if (paramalpha == 1) { //获取文字混合表 if (lcd) { tblR = tunetblR; tblG = tunetblG; @@ -155,7 +155,7 @@ void CAlphaBlend::gettunetbl(int paramalpha, BOOL lcd, BOOL dark, const int * &t } else { tblR = tblG = tblB = tunetbl; } - } else { //ȡӰϱ + } else { //获取阴影混合表 if (dark) { if (lcd) { @@ -250,12 +250,12 @@ void CAlphaBlend::init() tunetblS[i] = Bound(0, alphatbl[Bound(table[i] * paramalpha /100, 0, 255)], CAlphaBlend::BASE); tunetblRS[i] = Bound(0, alphatbl[Bound(tableR[i] * paramalpha/100, 0, 255)], CAlphaBlend::BASE); tunetblGS[i] = Bound(0, alphatbl[Bound(tableG[i] * paramalpha/100, 0, 255)], CAlphaBlend::BASE); - tunetblBS[i] =Bound(0, alphatbl[Bound(tableB[i] * paramalpha/100, 0, 255)], CAlphaBlend::BASE); //dzɫϱ + tunetblBS[i] =Bound(0, alphatbl[Bound(tableB[i] * paramalpha/100, 0, 255)], CAlphaBlend::BASE); //浅色混合表 tunetblLS[i] = Bound(0, alphatbl[Bound(table[i] * lightparamalpha/100, 0, 255)], CAlphaBlend::BASE); tunetblLRS[i] = Bound(0, alphatbl[Bound(tableR[i] * lightparamalpha/100, 0, 255)], CAlphaBlend::BASE); tunetblLGS[i] = Bound(0, alphatbl[Bound(tableG[i] * lightparamalpha/100, 0, 255)], CAlphaBlend::BASE); - tunetblLBS[i] =Bound(0, alphatbl[Bound(tableB[i] * lightparamalpha/100, 0, 255)], CAlphaBlend::BASE); //ɫϱ + tunetblLBS[i] =Bound(0, alphatbl[Bound(tableB[i] * lightparamalpha/100, 0, 255)], CAlphaBlend::BASE); //深色混合表 } } @@ -1177,7 +1177,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) return FALSE; } - FTInfo.params->lplf->lfWeight = FTInfo.params->otm->otmTextMetrics.tmWeight; //µ׼weight + FTInfo.params->lplf->lfWeight = FTInfo.params->otm->otmTextMetrics.tmWeight; //更新到标准weight pfs = &pfi->GetFontSettings(); cmap_index = -1; @@ -1313,7 +1313,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) break; } - //hintingdefaultģʽʹautohintģʽԱ֤Ч + //如果含有内置hinting则启用default模式,否则使用autohint模式,以保证效果 // A`GCAX if (FTInfo.IsMono()) { font_type.flags |= FT_LOAD_TARGET_MONO; @@ -1348,7 +1348,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) if (pSettings->HintSmallFont() && font_type.flags & FT_LOAD_TARGET_LIGHT && font_type.height!=-1 && font_type.height<12) //ͨòʹhintingǴСhinting { /* - if (!(freetype_face->face_flags & FT_FACE_FLAG_TRICKY)) //tricky + if (!(freetype_face->face_flags & FT_FACE_FLAG_TRICKY)) //如果不是tricky字体 font_type.flags = font_type.flags & (~FT_LOAD_NO_HINTING) | (pfi->FontHasHinting() ? FT_LOAD_NO_AUTOHINT : FT_LOAD_FORCE_AUTOHINT); else*/ @@ -1472,7 +1472,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, BOOL bWindowsLink = pSettings->FontLink()==2; //!!Snowie - /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //ȥԣҪ + /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //去掉常量属性,下面要改他 const FT_Int cmap_index = FTInfo.cmap_index; const FT_Bool useKerning = FTInfo.useKerning; FT_Render_Mode render_mode = FTInfo.render_mode; @@ -1520,13 +1520,13 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ʼΪ } // - hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //صһ + hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体 } //fontlink int* Dx= FTInfo.Dx; if (!bAllowDefaultLink && FTInfo.face_id_list_num > 1) - FTInfo.face_id_list_num--; //symbolҳǾͲӵ + FTInfo.face_id_list_num--; //如果是symbol页那就不链接到宋体 bool bUnicodePlane = false; for (int i=0 ; lpString < lpEnd; ++lpString, ++gi, ++GlyphArray, ++drState, ++AAList, /*ggdi32++,*/ i++){ @@ -1576,7 +1576,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, f_glyph = !!wch; glyph_index = wch; *AAList = AAMode; - GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //indexֱ + GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //index的文字必须计算宽度 if (FTInfo.font_type.height<=pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { f_glyph=false; //ʹõ󣬲ͼ @@ -1586,11 +1586,11 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, if (wch && !CID.myiswcntrl(lpString[0])) { for (int j = 0; j < FTInfo.face_id_list_num; ++j) { - if (bWindowsLink) //ʹWindowsfontlink + if (bWindowsLink) //使用Windows函数进行fontlink { if (!lpfontlink[j][i]) //ûʼfontlink { - SelectFont(FTInfo.hdc, FTInfo.ggo_font_list[j]); //ggo + SelectFont(FTInfo.hdc, FTInfo.ggo_font_list[j]); //加载ggo字体 GetGlyphIndices(FTInfo.hdc, lpString, cbString-i, &lpfontlink[j][i], GGI_MARK_NONEXISTING_GLYPHS); //fontlink SelectFont(FTInfo.hdc, hOldFont); } @@ -1607,8 +1607,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //Ч֣ f_glyph = true; FTInfo.font_type.face_id = FTInfo.face_id_list[j]; - freetype_face = FTInfo.GetFace(j); //ͬʱ¶Ӧfaceidʵface - //¶Ӧfontsetting + freetype_face = FTInfo.GetFace(j); //同时更新对应faceid的实际face + //接下来更新对应的fontsetting FTInfo.font_type.flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; // qeBO //extern CFontSetCache g_fsetcache; @@ -1617,7 +1617,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, { switch (FTInfo.font_type.height) { - case 11:{FTInfo.font_type.height=12; FTInfo.font_type.width++; break;} //⴦ + case 11:{FTInfo.font_type.height=12; FTInfo.font_type.width++; break;} //对宋体进行特殊处理 case 13:{FTInfo.font_type.height=15; FTInfo.font_type.width+=2; break;} } } @@ -1672,7 +1672,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, AAMode = *AAList/*pfs->GetAntiAliasMode()*/; bLcdMode = render_mode == FT_RENDER_MODE_LCD; bLightLcdMode = (AAMode == 4) || (AAMode == 5); - // + //更新完成 } if (FTInfo.font_type.height<=pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { @@ -1686,7 +1686,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, - if (!f_glyph) { //glyphindexѾ + if (!f_glyph) { //glyphindex的文字上面已经计算过了 #ifdef _DEBUG GdiSetBatchLimit(0); #endif @@ -1716,7 +1716,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, int dxWidth = clpdx.get(cx); if (isc == CNTRL_COMPLEX_TEXT) // { - cx = dxWidth; //windowsĿȵ + cx = dxWidth; //服从windows的宽度调度 //if (!dxWidth) // CID.setcntrlAttribute(wch, CNTRL_ZERO_WIDTH); } @@ -1731,7 +1731,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, GetCharABCWidthsI(FTInfo.hdc, wch, 1, NULL, &abc); else GetCharABCWidths(FTInfo.hdc, wch, wch, &abc);*/ - //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //Чֵ£ͼ=λ + //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //无效文字的情况下,绘图宽度=鼠标位置 FTInfo.px = FTInfo.x + cx; FTInfo.x += dxWidth;//Max(clpdx.get(cx), cx);/*(int)abc.abcB+abc.abcC*///Max(clpdx.get(cx), abc.abcB? abc.abcA:0); //} @@ -1774,7 +1774,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } }else{ if (bVertical) - swap(FTInfo.font_type.height, FTInfo.font_type.width); //޷תֿ + swap(FTInfo.font_type.height, FTInfo.font_type.width); //交换无法旋转的文字宽高 FTInfo.font_type.flags &=~FT_LOAD_VERTICAL_LAYOUT; if(bLcdMode){ if(!bLightLcdMode){ @@ -1789,8 +1789,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, bool bRequiredownsize; - bIsIndivBold = freetype_face->style_flags & FT_STYLE_FLAG_BOLD; //Ƕ - bIsBold = (IsFontBold(lf) && !bIsIndivBold); //Ƿ´ + bIsIndivBold = freetype_face->style_flags & FT_STYLE_FLAG_BOLD; //是独立粗体 + bIsBold = (IsFontBold(lf) && !bIsIndivBold); //是仿粗体 bRequiredownsize = bIsBold && /*(pSettings->BolderMode()==2 || (*/pSettings->BolderMode()!=1 /*&& FTInfo.height>FT_BOLD_LOW))*/; if (bRequiredownsize) { @@ -1877,7 +1877,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //ÿ int left = FT_BitmapGlyph((*glyph_bitmap))->left; if (FTInfo.x + left< FTInfo.xBase) - FTInfo.xBase = FTInfo.x + left; //ַǸʼλõģϳɷţ ֵʼλ + FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 if (lpString < lpEnd - 1) { FTInfo.x += dx; @@ -1885,7 +1885,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, int bx = FT_BitmapGlyph((*glyph_bitmap))->bitmap.width; if (render_mode == FT_RENDER_MODE_LCD) bx /= 3; bx += left; - FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //ֵ,ͼ=ftĿȣλ=win + FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //有文字的情况下,绘图宽度=ft计算的宽度,鼠标位置=win宽度 FTInfo.x += dx;//Max(dx, gdi32x);//Max(Max(dx, bx), cx); } @@ -1931,7 +1931,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString BOOL bWindowsLink = pSettings->FontLink()==2; //!!Snowie - /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //ȥԣҪ + /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //去掉常量属性,下面要改他 const FT_Int cmap_index = FTInfo.cmap_index; const FT_Bool useKerning = FTInfo.useKerning; FT_Render_Mode render_mode = FTInfo.render_mode; @@ -1988,7 +1988,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ʼΪ } // - hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //صһ + hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体 } //fontlink @@ -2020,7 +2020,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString } }*/ - if (!bGlyphIndex) //win32Żft + if (!bGlyphIndex) //仅对win32情况进行优化,ft情况另议 if (GetGlyphIndices(FTInfo.hdc, lpString, cbString, gi, GGI_MARK_NONEXISTING_GLYPHS)!=cbString) { nRet = false; @@ -2029,7 +2029,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString //!!Snowie int* Dx= FTInfo.Dx; if (!bAllowDefaultLink && FTInfo.face_id_list_num > 1) - FTInfo.face_id_list_num--; //symbolҳǾͲӵ + FTInfo.face_id_list_num--; //如果是symbol页那就不链接到宋体 for (int i=0 ; lpString < lpEnd; ++lpString, gi++, GlyphArray++, drState++, ++AAList,/*ggdi32++,*/ i++){ WCHAR wch = *lpString; @@ -2078,7 +2078,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString *AAList = AAMode; glyph_index = wch; ggoformat |= GGO_GLYPH_INDEX; - GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //indexֱ + GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //index的文字必须计算宽度 } else { if (*(gi) != 0xffff) { @@ -2104,7 +2104,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString } - if (!f_glyph) { //glyphindexѾ + if (!f_glyph) { //glyphindex的文字上面已经计算过了 #ifdef _DEBUG GdiSetBatchLimit(0); #endif @@ -2139,7 +2139,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString GetCharABCWidthsI(FTInfo.hdc, wch, 1, NULL, &abc); else GetCharABCWidths(FTInfo.hdc, wch, wch, &abc);*/ - //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //Чֵ£ͼ=λ + //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //无效文字的情况下,绘图宽度=鼠标位置 FTInfo.px = FTInfo.x + cx; FTInfo.x += clpdx.get(cx); } @@ -2171,7 +2171,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString } }else{ if (bVertical) - swap(FTInfo.font_type.height, FTInfo.font_type.width); //޷תֿ + swap(FTInfo.font_type.height, FTInfo.font_type.width); //交换无法旋转的文字宽高 FTInfo.font_type.flags &=~FT_LOAD_VERTICAL_LAYOUT; if(bLcdMode){ if(!bLightLcdMode){ @@ -2264,7 +2264,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //ÿ int left = FT_BitmapGlyph((*glyph_bitmap))->left; if (FTInfo.x + left< FTInfo.xBase) - FTInfo.xBase = FTInfo.x + left; //ַǸʼλõģϳɷţ ֵʼλ + FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 if (lpString < lpEnd - 1) { FTInfo.x += dx; @@ -2272,7 +2272,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString int bx = FT_BitmapGlyph((*glyph_bitmap))->bitmap.width; if (render_mode == FT_RENDER_MODE_LCD) bx /= 3; bx += left; - FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //ֵ,ͼ=ftĿȣλ=win + FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //有文字的情况下,绘图宽度=ft计算的宽度,鼠标位置=win宽度 FTInfo.x += dx;//Max(dx, gdi32x);//Max(Max(dx, bx), cx); } @@ -2340,7 +2340,7 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) if (!FTGInfo.FTGlyph->bitmap.buffer) { //if (FTInfo->params->alpha == 1) { -// if (!(FTInfo->GetETO() & ETO_GLYPH_INDEX) && wch==32) //ո +// if (!(FTInfo->GetETO() & ETO_GLYPH_INDEX) && wch==32) //空格 // ORIG_ExtTextOutW(FTInfo->hdc, FTInfo->x, FTInfo->yTop, FTInfo->GetETO() & ETO_IGNORELANGUAGE, NULL, &wch, 1, NULL); // else ORIG_ExtTextOutW(FTInfo->hdc, FTInfo->x, FTInfo->yTop, FTInfo->GetETO(), NULL, &FTGInfo.wch, 1, NULL); @@ -2381,10 +2381,10 @@ int IsColorDark(DWORD Color, double Gamma) //return (GetRValue(Color)*0.299 + GetGValue(Color)*0.587 + GetBValue(Color)*0.114); //ԭʼ㷨 //=============================================================== //Photoshop sRGBRGB->Lab㷨л㣬LΪɫӾ - //л ѧ ķ + //感谢 西安理工大学 贾婉丽 的分析 //=============================================================== - static double s_multipler = 116/pow(100,(double)1.0/3.0); //Ԥ㳣,ǿʹdouble汾 - double* RGBTable = s_AlphaBlendTable.GetRGBTable(); //ʾת + static double s_multipler = 116/pow(100,(double)1.0/3.0); //预计算常数,强制使用double版本 + double* RGBTable = s_AlphaBlendTable.GetRGBTable(); //获得显示器转换表 double ret = pow(23.9746*RGBTable[GetRValue(Color)] + 73.0653*RGBTable[GetGValue(Color)] + 6.13799*RGBTable[GetBValue(Color)] , 1.0/3.0)*s_multipler-16; return max(int(ret + 0.499),0); @@ -2475,7 +2475,7 @@ BOOL FreeTypeTextOut( const TEXTMETRIC& tm = FTInfo.params->otm->otmTextMetrics; FTInfo.yBase = tm.tmAscent; -//===============ɫ====================== +//===============计算颜色缓存====================== const CGdippSettings* pSettings = CGdippSettings::GetInstance(); int lightdiff, darkdiff, bDarkColor=0, ShadowColor=0; @@ -2523,7 +2523,7 @@ BOOL FreeTypeTextOut( break; } -//========================================= +//===============计算完成========================== FreeTypeGlyphInfo FTGInfo = {&FTInfo, 0, 0, 0, solid, shadow}; for (int i=0; ilplf->lfWeight = FTInfo.params->otm->otmTextMetrics.tmWeight; //µ׼weight + FTInfo.params->lplf->lfWeight = FTInfo.params->otm->otmTextMetrics.tmWeight; //更新到标准weight pfs = &pfi->GetFontSettings(); cmap_index = -1; @@ -1464,7 +1464,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) break; } - //hintingdefaultģʽʹautohintģʽԱ֤Ч + //如果含有内置hinting则启用default模式,否则使用autohint模式,以保证效果 // A`GCAX if (FTInfo.IsMono()) { font_type.flags |= FT_LOAD_TARGET_MONO; @@ -1500,7 +1500,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) if (pSettings->HintSmallFont() /*&& font_type.flags & FT_LOAD_TARGET_LIGHT*/ && font_type.height != -1 && font_type.height<12) //ͨòʹhintingǴСhinting { /* - if (!(freetype_face->face_flags & FT_FACE_FLAG_TRICKY)) //tricky + if (!(freetype_face->face_flags & FT_FACE_FLAG_TRICKY)) //如果不是tricky字体 font_type.flags = font_type.flags & (~FT_LOAD_NO_HINTING) | (pfi->FontHasHinting() ? FT_LOAD_NO_AUTOHINT : FT_LOAD_FORCE_AUTOHINT); else*/ @@ -1636,7 +1636,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, BOOL bWindowsLink = pSettings->FontLink() == 2; //!!Snowie - /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //ȥԣҪ + /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //去掉常量属性,下面要改他 const FT_Int cmap_index = FTInfo.cmap_index; const FT_Bool useKerning = FTInfo.useKerning; FT_Render_Mode render_mode = FTInfo.render_mode; @@ -1685,14 +1685,14 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ʼΪ } // - hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //صһ + hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体 } //fontlink int* Dx = FTInfo.Dx; int* Dy = FTInfo.Dy; if (!bAllowDefaultLink && FTInfo.face_id_list_num > 1) - FTInfo.face_id_list_num--; //symbolҳǾͲӵ + FTInfo.face_id_list_num--; //如果是symbol页那就不链接到宋体 bool bUnicodePlane = false; for (int i = 0; lpString < lpEnd; ++lpString, ++gi, ++GlyphArray, ++drState, ++AAList, /*ggdi32++,*/ i++) { @@ -1752,7 +1752,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, f_glyph = !!wch; glyph_index = wch; *AAList = AAMode; - GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //indexֱ + GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //index的文字必须计算宽度 if (FTInfo.font_type.height <= pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { f_glyph = false; //ʹõ󣬲ͼ @@ -1763,11 +1763,11 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, if (wch && !CID.myiswcntrl(lpString[0])) { // need to draw a non-control character for (int j = 0; j < FTInfo.face_id_list_num; ++j) { freetype_face = NULL; // reinitialize it in case no fontlinking is available. - if (bWindowsLink) //ʹWindowsfontlink + if (bWindowsLink) //使用Windows函数进行fontlink { if (!lpfontlink[j][i]) //ûʼfontlink { - SelectFont(FTInfo.hdc, FTInfo.ggo_font_list[j]); //ggo + SelectFont(FTInfo.hdc, FTInfo.ggo_font_list[j]); //加载ggo字体 GetGlyphIndices(FTInfo.hdc, lpString, cbString - i, &lpfontlink[j][i], GGI_MARK_NONEXISTING_GLYPHS); //fontlink SelectFont(FTInfo.hdc, hOldFont); } @@ -1785,8 +1785,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //Ч֣ f_glyph = true; FTInfo.font_type.face_id = FTInfo.face_id_list[j]; - freetype_face = FTInfo.GetFace(j); //ͬʱ¶Ӧfaceidʵface - //¶Ӧfontsetting + freetype_face = FTInfo.GetFace(j); //同时更新对应faceid的实际face + //接下来更新对应的fontsetting FTInfo.font_type.flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; // qeBO //extern CFontSetCache g_fsetcache; @@ -1795,7 +1795,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, { switch (FTInfo.font_type.height) { - case 11: {FTInfo.font_type.height = 12; FTInfo.font_type.width++; break; } //⴦ + case 11: {FTInfo.font_type.height = 12; FTInfo.font_type.width++; break; } //对宋体进行特殊处理 case 13: {FTInfo.font_type.height = 15; FTInfo.font_type.width += 2; break; } } } @@ -1851,7 +1851,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, AAMode = *AAList/*pfs->GetAntiAliasMode()*/; bLcdMode = render_mode == FT_RENDER_MODE_LCD; bLightLcdMode = (AAMode == 4) || (AAMode == 5); - // + //更新完成 } if (FTInfo.font_type.height <= pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { @@ -1906,7 +1906,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, if (isc == CNTRL_COMPLEX_TEXT) // { - cx = dxWidth; //windowsĿȵ + cx = dxWidth; //服从windows的宽度调度 //if (!dxWidth) // CID.setcntrlAttribute(wch, CNTRL_ZERO_WIDTH); } @@ -1923,7 +1923,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, GetCharABCWidthsI(FTInfo.hdc, wch, 1, NULL, &abc); else GetCharABCWidths(FTInfo.hdc, wch, wch, &abc);*/ - //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //Чֵ£ͼ=λ + //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //无效文字的情况下,绘图宽度=鼠标位置 FTInfo.px = FTInfo.x + cx; FTInfo.x += dxWidth;//Max(clpdx.get(cx), cx);/*(int)abc.abcB+abc.abcC*///Max(clpdx.get(cx), abc.abcB? abc.abcA:0); //} @@ -1954,7 +1954,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } - // k + // 縦横 if (bVertical && IsVerticalChar(wch)) { FTInfo.font_type.flags |= FT_LOAD_VERTICAL_LAYOUT; if (bLcdMode) { @@ -1967,7 +1967,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } else { if (bVertical) - swap(FTInfo.font_type.height, FTInfo.font_type.width); //޷תֿ + swap(FTInfo.font_type.height, FTInfo.font_type.width); //交换无法旋转的文字宽高 FTInfo.font_type.flags &= ~FT_LOAD_VERTICAL_LAYOUT; if (bLcdMode) { if (FTInfo.font_type.flags&FT_LOAD_TARGET_LCD_V == FT_LOAD_TARGET_LCD_V) { @@ -1982,8 +1982,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, bool bRequiredownsize; - bIsIndivBold = freetype_face->style_flags & FT_STYLE_FLAG_BOLD; //Ƕ - bIsBold = (IsFontBold(lf) && !bIsIndivBold); //Ƿ´ + bIsIndivBold = freetype_face->style_flags & FT_STYLE_FLAG_BOLD; //是独立粗体 + bIsBold = (IsFontBold(lf) && !bIsIndivBold); //是仿粗体 bRequiredownsize = bIsBold && /*(pSettings->BolderMode()==2 || (*/pSettings->BolderMode() != 1 /*&& FTInfo.height>FT_BOLD_LOW))*/; if (bRequiredownsize) { @@ -2092,7 +2092,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } else { if (FTInfo.x + left < FTInfo.xBase) - FTInfo.xBase = FTInfo.x + left; //ַǸʼλõģϳɷţ ֵʼλ + FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 } if (lpString < lpEnd - 1) { @@ -2103,7 +2103,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, int bx = FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->bitmap.width; if (render_mode == FT_RENDER_MODE_LCD && FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->bitmap.pixel_mode != FT_PIXEL_MODE_BGRA) bx /= 3; bx += left; - FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //ֵ,ͼ=ftĿȣλ=win + FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //有文字的情况下,绘图宽度=ft计算的宽度,鼠标位置=win宽度 FTInfo.x += dx;//Max(dx, gdi32x);//Max(Max(dx, bx), cx); } @@ -2124,7 +2124,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, cont: *Dx = FTInfo.x; //DxλһַʼĻ׼λãһַʼλ - *Dy = FTInfo.y; //Dyλһַy + *Dy = FTInfo.y; //Dy的位置是下一个字符的y坐标 ++Dx; ++Dy; } @@ -2152,7 +2152,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString BOOL bWindowsLink = pSettings->FontLink() == 2; //!!Snowie - /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //ȥԣҪ + /*const*/ FT_Face freetype_face = FTInfo.freetype_face; //去掉常量属性,下面要改他 const FT_Int cmap_index = FTInfo.cmap_index; const FT_Bool useKerning = FTInfo.useKerning; FT_Render_Mode render_mode = FTInfo.render_mode; @@ -2209,7 +2209,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ʼΪ } // - hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //صһ + hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体 } //fontlink @@ -2241,7 +2241,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString } }*/ - if (!bGlyphIndex) //win32Żft + if (!bGlyphIndex) //仅对win32情况进行优化,ft情况另议 if (GetGlyphIndices(FTInfo.hdc, lpString, cbString, gi, GGI_MARK_NONEXISTING_GLYPHS) != cbString) { nRet = false; @@ -2251,7 +2251,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString int* Dx = FTInfo.Dx; int* Dy = FTInfo.Dy; if (!bAllowDefaultLink && FTInfo.face_id_list_num > 1) - FTInfo.face_id_list_num--; //symbolҳǾͲӵ + FTInfo.face_id_list_num--; //如果是symbol页那就不链接到宋体 for (int i = 0; lpString < lpEnd; ++lpString, gi++, GlyphArray++, drState++, ++AAList,/*ggdi32++,*/ i++) { WCHAR wch = *lpString; @@ -2300,7 +2300,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString *AAList = AAMode; glyph_index = wch; ggoformat |= GGO_GLYPH_INDEX; - GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //indexֱ + GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //index的文字必须计算宽度 } else { @@ -2328,7 +2328,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString } - if (!f_glyph) { //glyphindexѾ + if (!f_glyph) { //glyphindex的文字上面已经计算过了 #ifdef _DEBUG GdiSetBatchLimit(0); #endif @@ -2365,7 +2365,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString GetCharABCWidthsI(FTInfo.hdc, wch, 1, NULL, &abc); else GetCharABCWidths(FTInfo.hdc, wch, wch, &abc);*/ - //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //Чֵ£ͼ=λ + //FTInfo.px = FTInfo.x+Max(clpdx.get(cx), abc.abcA+(int)abc.abcB+abc.abcC); //无效文字的情况下,绘图宽度=鼠标位置 FTInfo.px = FTInfo.x + cx; FTInfo.x += clpdx.get(cx); } @@ -2398,7 +2398,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString } else { if (bVertical) - swap(FTInfo.font_type.height, FTInfo.font_type.width); //޷תֿ + swap(FTInfo.font_type.height, FTInfo.font_type.width); //交换无法旋转的文字宽高 FTInfo.font_type.flags &= ~FT_LOAD_VERTICAL_LAYOUT; if (bLcdMode) { if (FTInfo.font_type.flags&FT_LOAD_TARGET_LCD_V == FT_LOAD_TARGET_LCD_V) { @@ -2492,7 +2492,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //ÿ int left = FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->left; if (FTInfo.x + left< FTInfo.xBase) - FTInfo.xBase = FTInfo.x + left; //ַǸʼλõģϳɷţ ֵʼλ + FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 if (lpString < lpEnd - 1) { FTInfo.x += dx; @@ -2502,7 +2502,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString int bx = FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->bitmap.width; if (render_mode == FT_RENDER_MODE_LCD) bx /= 3; bx += left; - FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //ֵ,ͼ=ftĿȣλ=win + FTInfo.px = FTInfo.x + Max(Max(dx, bx), cx); //有文字的情况下,绘图宽度=ft计算的宽度,鼠标位置=win宽度 FTInfo.x += dx;//Max(dx, gdi32x);//Max(Max(dx, bx), cx); } @@ -2573,7 +2573,7 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) if (!FTGInfo.FTGlyph->bitmap.buffer) { //if (FTInfo->params->alpha == 1) { - // if (!(FTInfo->GetETO() & ETO_GLYPH_INDEX) && wch==32) //ո + // if (!(FTInfo->GetETO() & ETO_GLYPH_INDEX) && wch==32) //空格 // ORIG_ExtTextOutW(FTInfo->hdc, FTInfo->x, FTInfo->yTop, FTInfo->GetETO() & ETO_IGNORELANGUAGE, NULL, &wch, 1, NULL); // else ORIG_ExtTextOutW(FTInfo->hdc, FTInfo->x, FTInfo->yTop, FTInfo->GetETO(), NULL, &FTGInfo.wch, 1, NULL); @@ -2624,10 +2624,10 @@ int IsColorDark(DWORD Color, double Gamma) //return (GetRValue(Color)*0.299 + GetGValue(Color)*0.587 + GetBValue(Color)*0.114); //ԭʼ㷨 //=============================================================== //Photoshop sRGBRGB->Lab㷨л㣬LΪɫӾ - //л ѧ ķ + //感谢 西安理工大学 贾婉丽 的分析 //=============================================================== - static double s_multipler = 116 / pow(100, (double)1.0 / 3.0); //Ԥ㳣,ǿʹdouble汾 - double* RGBTable = s_AlphaBlendTable.GetRGBTable(); //ʾת + static double s_multipler = 116 / pow(100, (double)1.0 / 3.0); //预计算常数,强制使用double版本 + double* RGBTable = s_AlphaBlendTable.GetRGBTable(); //获得显示器转换表 double ret = pow(23.9746*RGBTable[GetRValue(Color)] + 73.0653*RGBTable[GetGValue(Color)] + 6.13799*RGBTable[GetBValue(Color)], 1.0 / 3.0)*s_multipler - 16; return max(int(ret + 0.499), 0); @@ -2718,7 +2718,7 @@ BOOL FreeTypeTextOut( const TEXTMETRIC& tm = FTInfo.params->otm->otmTextMetrics; FTInfo.yBase = tm.tmAscent; - //===============ɫ====================== + //===============计算颜色缓存====================== const CGdippSettings* pSettings = CGdippSettings::GetInstance(); int lightdiff, darkdiff, bDarkColor = 0, ShadowColor = 0; @@ -2766,7 +2766,7 @@ BOOL FreeTypeTextOut( break; } - //»߻ɾߵϢ + //计算下划线或删除线的信息 int decorationInfo_height; int decorationInfo_thickness; OUTLINETEXTMETRIC &decorationInfo_otm = *FTInfo.params->otm; @@ -2803,7 +2803,7 @@ BOOL FreeTypeTextOut( } } - //========================================= + //===============计算完成========================== FreeTypeGlyphInfo FTGInfo = { &FTInfo, 0, 0, 0, solid, shadow, pSettings->InvertColor() }; for (int i = 0; isecond->Erase(); delete it->second; @@ -282,7 +282,7 @@ void FreeTypeFontCache::AddCharData(WCHAR wch, UINT glyphindex, int width, int g if (glyphindex & 0xffff0000 /*|| !g_ccbCache*/) { return; } - if (AddIncrement() >= FREETYPE_REQCOUNTMAX) { //ѹѹʧ + if (AddIncrement() >= FREETYPE_REQCOUNTMAX) { //先压缩,避免压缩后丢失的问题 Compact(); } @@ -295,7 +295,7 @@ void FreeTypeFontCache::AddCharData(WCHAR wch, UINT glyphindex, int width, int g } #else GlyphCache::iterator it=m_GlyphCache.find(wch); - if (it!=m_GlyphCache.end()) //ҵ˾ + if (it!=m_GlyphCache.end()) //找到了旧数据 { FreeTypeCharData* ppChar = it->second; if (ppChar) { @@ -341,7 +341,7 @@ void FreeTypeFontCache::AddGlyphData(UINT glyphindex, int width, int gdiWidth, F } #else GlyphCache::iterator it=m_GlyphCache.find(-(int)glyphindex); - if (it!=m_GlyphCache.end()) //ҵ˾ + if (it!=m_GlyphCache.end()) //找到了旧数据 { FreeTypeCharData* ppChar = it->second; if (ppChar) { @@ -392,12 +392,12 @@ void FreeTypeFontInfo::Createlink() memset(&lf, 0, sizeof(LOGFONT)); lf.lfCharSet=DEFAULT_CHARSET; const CGdippSettings* pSettings = CGdippSettings::GetInstance(); - for (fn.next() ; !fn.atend(); fn.next()) { //һ + for (fn.next() ; !fn.atend(); fn.next()) { //跳过第一个链接 //FreeTypeFontInfo* pfitemp = g_pFTEngine->FindFont(fn, m_weight, m_italic); //if (pfitemp && pfitemp->m_isSimSun) // IsSimSun = true; if (!m_SimSunID) - IsSimSun = (_wcsicmp(fn,L"")==0 || _wcsicmp(fn,L"SimSun")==0); + IsSimSun = (_wcsicmp(fn,L"宋体")==0 || _wcsicmp(fn,L"SimSun")==0); StringCchCopy(lf.lfFaceName, LF_FACESIZE, fn); if (!_wcsicmp(fn, m_familyname.c_str())) // allow font link to itself pSettings->CopyForceFont(lf,lf); @@ -419,19 +419,19 @@ bool FreeTypeFontInfo::EmbeddedBmpExist(int px) if (m_ebmps[px]!=-1) return !!m_ebmps[px]; CCriticalSectionLock __lock(CCriticalSectionLock::CS_MANAGER); - FTC_ImageTypeRec imgtype={(FTC_FaceID)m_id, px, px, FT_LOAD_DEFAULT}; //һǰСimagetype + FTC_ImageTypeRec imgtype={(FTC_FaceID)m_id, px, px, FT_LOAD_DEFAULT}; //构造一个当前大小的imagetype FT_Glyph temp_glyph=NULL; - FT_UInt gindex = FTC_CMapCache_Lookup(cmap_cache, (FTC_FaceID)m_id, -1, FT_UInt32(L'0')); //0ֵ + FT_UInt gindex = FTC_CMapCache_Lookup(cmap_cache, (FTC_FaceID)m_id, -1, FT_UInt32(L'0')); //获得0的索引值 FTC_ImageCache_Lookup(image_cache, &imgtype, gindex, &temp_glyph, NULL); - if (temp_glyph && temp_glyph->format==FT_GLYPH_FORMAT_BITMAP) //Զ0ĵ - m_ebmps[px]=1; //ֺŴڵ + if (temp_glyph && temp_glyph->format==FT_GLYPH_FORMAT_BITMAP) //如果可以读到0的点阵 + m_ebmps[px]=1; //则该字号存在点阵 else { - gindex = FTC_CMapCache_Lookup(cmap_cache, (FTC_FaceID)m_id, -1, FT_UInt32(L'')); //""ֵ + gindex = FTC_CMapCache_Lookup(cmap_cache, (FTC_FaceID)m_id, -1, FT_UInt32(L'的')); //获得"的"的索引值 if (gindex) - FTC_ImageCache_Lookup(image_cache, &imgtype, gindex, &temp_glyph, NULL); //ȡġĵ - if (temp_glyph && temp_glyph->format==FT_GLYPH_FORMAT_BITMAP) //Զ0ĵ - m_ebmps[px]=1; //ֺŴڵ + FTC_ImageCache_Lookup(image_cache, &imgtype, gindex, &temp_glyph, NULL); //读取“的”的点阵 + if (temp_glyph && temp_glyph->format==FT_GLYPH_FORMAT_BITMAP) //如果可以读到0的点阵 + m_ebmps[px]=1; //则该字号存在点阵 else m_ebmps[px]=0; } @@ -442,7 +442,7 @@ FreeTypeFontCache* FreeTypeFontInfo::GetCache(FTC_ScalerRec& scaler, const LOGFO { CCriticalSectionLock __lock(CCriticalSectionLock::CS_FONTCACHE); - if (AddIncrement() > m_nMaxSizes) { //ѹ + if (AddIncrement() > m_nMaxSizes) { //先压缩 Compact(); } int weight = lf.lfWeight; @@ -472,7 +472,7 @@ FreeTypeFontCache* FreeTypeFontInfo::GetCache(FTC_ScalerRec& scaler, const LOGFO OK: Assert(p != NULL); if (p && p->Activate()) { - DecIncrement(); //ظʹֵ + DecIncrement(); //重复使用则减计数值 } return p; } @@ -485,7 +485,7 @@ void FreeTypeFontEngine::Compact() TRACE(_T("FreeTypeFontEngine::Compact: %d > %d\n"), m_mfontMap.size(), m_nMaxFaces); ResetGCCounter(); - //memset(m_arrFace, 0, sizeof(FT_Face)*m_nFaceCount); //faceˣϵfaceᱻftͷŵҪȫ»ȡ + //memset(m_arrFace, 0, sizeof(FT_Face)*m_nFaceCount); //超过最大face数了,老的face会被ft释放掉,所以需要全部重新获取 //FontListArray& arr = m_arrFontList; //::Compact(arr.GetData(), arr.GetSize(), m_nMaxFaces); } @@ -499,7 +499,7 @@ BOOL FreeTypeFontEngine::RemoveFont(FreeTypeFontInfo* fontinfo) { FreeTypeFontInfo* p = iter->second; if (p==fontinfo) - m_mfontMap.erase(iter++); //ɾ + m_mfontMap.erase(iter++); //删除引用 else ++iter; } @@ -510,7 +510,7 @@ BOOL FreeTypeFontEngine::RemoveFont(FreeTypeFontInfo* fontinfo) { FreeTypeFontInfo* p = iter->second; if (p==fontinfo) - m_mfullMap.erase(iter++); //ɾ + m_mfullMap.erase(iter++); //删除引用 else { iter->second->UpdateFontSetting(); @@ -528,12 +528,12 @@ BOOL FreeTypeFontEngine::RemoveThisFont(FreeTypeFontInfo* fontinfo, LOGFONT* lg) { FontMap::const_iterator iter=m_mfontMap.find(myfont(lg->lfFaceName, CalcBoldWeight(lg->lfWeight), lg->lfItalic)); //fontmap if (iter!=m_mfontMap.end()) - m_mfontMap.erase(iter); //ɾ + m_mfontMap.erase(iter); //删除引用 } { FullNameMap::const_iterator iter=m_mfullMap.find(fontinfo->GetFullName()); //fullmap if (iter!=m_mfullMap.end()) - m_mfullMap.erase(iter); //ɾ + m_mfullMap.erase(iter); //删除引用 } delete fontinfo; return true; @@ -543,11 +543,11 @@ BOOL FreeTypeFontEngine::RemoveFont(LPCWSTR FontName) { if (!FontName) return false; LOGFONTW* fontarray = GetFontNameFromFile(FontName); - LOGFONTW* c_fontarray = fontarray; //¼ԭʼָ + LOGFONTW* c_fontarray = fontarray; //记录原始指针 if (!fontarray) return false; FTC_FaceID fid = NULL; BOOL bIsFontLoaded, bIsFontFileLoaded = false; - COwnedCriticalSectionLock __lock2(2, COwnedCriticalSectionLock::OCS_DC); //ȡȨҪDCֹлͼ + COwnedCriticalSectionLock __lock2(2, COwnedCriticalSectionLock::OCS_DC); //获取所有权,现在要处理DC,禁止所有绘图函数访问 CCriticalSectionLock __lock(CCriticalSectionLock::CS_MANAGER); while (*(char*)fontarray) { @@ -556,10 +556,10 @@ BOOL FreeTypeFontEngine::RemoveFont(LPCWSTR FontName) if (result) { fid = (FTC_FaceID)result->GetId(); - if (bIsFontLoaded) //Ѿʹù + if (bIsFontLoaded) //该字体已经被使用过 { - RemoveFont(result); //öϢȫɾ - bIsFontFileLoaded = true; //ļҲʹù + RemoveFont(result); //枚举字体信息全部删除 + bIsFontFileLoaded = true; //设置字体文件也被使用过 } else RemoveThisFont(result, fontarray); @@ -569,13 +569,13 @@ BOOL FreeTypeFontEngine::RemoveFont(LPCWSTR FontName) } fontarray++; } - free(c_fontarray); //ԭʼָͷ - if (bIsFontFileLoaded) //ļʹùҪDC + free(c_fontarray); //利用原始指针释放 + if (bIsFontFileLoaded) //若字体文件被使用过,则需要清楚所有DC { CTLSDCArray::iterator iter = TLSDCArray.begin(); while (iter!=TLSDCArray.end()) { - ((CBitmapCache*)*iter)->~CBitmapCache(); //ʹеDC + ((CBitmapCache*)*iter)->~CBitmapCache(); //清除掉所有使用中的DC ++iter; } } @@ -623,22 +623,22 @@ FreeTypeFontInfo* FreeTypeFontEngine::AddFont(void* lpparams) }*/ FullNameMap::const_iterator it = m_mfullMap.find(pfi->GetFullName()); - if (it!=m_mfullMap.end()) //Ѿڵ,ԭ滻ʹָһ + if (it!=m_mfullMap.end()) //是已经存在的字体了,原因是字体替换使两种名字指向一个字体 { - delete pfi; //ɾղŴ + delete pfi; //删除刚才创建的字体 ReleaseFaceID(); - pfi = it->second;//ָԭ + pfi = it->second;//指向原字体 } else { - m_mfullMap[pfi->GetFullName()]=pfi; //ڣӵmap + m_mfullMap[pfi->GetFullName()]=pfi; //不存在,添加到map表 m_mfontList.push_back(pfi); } - if (pfi->GetFullName()!=params->strFullName) //ĿʵƺҪƲһ˵滻 + if (pfi->GetFullName()!=params->strFullName) //如果目标字体的真实名称和需要的名称不一样,说明是字体替换 { - pfi->AddRef(); //ü - m_mfullMap[params->strFullName] = pfi; //˫ãָͬһ + pfi->AddRef(); //增加引用计数 + m_mfullMap[params->strFullName] = pfi; //双重引用,指向同一个字体 } //bool ret = !!arr.Add(pfi); @@ -694,16 +694,16 @@ FreeTypeFontInfo* FreeTypeFontEngine::AddFont(LPCTSTR lpFaceName, int weight, bo FullNameMap::const_iterator it = m_mfullMap.find(pfi->GetFullName()); //Ƿmapд if (it!=m_mfullMap.end()) //Ѿ { - delete pfi; //ɾ + delete pfi; //删除创建出来的字体 ReleaseFaceID(); - pfi = it->second; //ָѾڵ + pfi = it->second; //指向已经存在的字体 if (bIsFontLoaded) *bIsFontLoaded = true; //pfi->AddRef(); } else { - m_mfullMap[pfi->GetFullName()]=pfi; //ڣӵmap + m_mfullMap[pfi->GetFullName()]=pfi; //不存在,添加到map表 m_mfontList.push_back(pfi); if (bIsFontLoaded) *bIsFontLoaded = false; @@ -712,7 +712,7 @@ FreeTypeFontInfo* FreeTypeFontEngine::AddFont(LPCTSTR lpFaceName, int weight, bo //bool ret = !!arr.Add(pfi); //weight = weight < FW_BOLD ? 0: FW_BOLD; myfont font(lpFaceName, weight, italic); - m_mfontMap[font]=pfi; //ڴҪmap + m_mfontMap[font]=pfi; //添加在次要map表 /* if (!ret) { delete pfi; @@ -763,7 +763,7 @@ FreeTypeFontInfo* FreeTypeFontEngine::FindFont(void* lpparams) if (iter!=m_mfullMap.end()) { FreeTypeFontInfo* p = iter->second; - if (p->GetFullName()!=params->strFullName) //滻 + if (p->GetFullName()!=params->strFullName) //属于替换字体 return FindFont(params->lplf->lfFaceName, params->lplf->lfWeight, !!params->lplf->lfItalic); p->SetMruCounter(this); return p; diff --git a/fteng.h b/fteng.h index 0757572..c2edc1e 100644 --- a/fteng.h +++ b/fteng.h @@ -314,7 +314,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter wstring m_fullname, m_familyname; typedef map CacheArray; CacheArray m_cache; - // + //快速链接 FTC_FaceID face_id_link[CFontLinkInfo::FONTMAX * 2 + 1]; HFONT ggo_link[CFontLinkInfo::FONTMAX * 2 + 1]; bool m_linkinited; @@ -397,7 +397,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter if (nSize==0) m_fullname = L""; else - //if (m_fullname.size()==0) //캯вṩԼȡ + //if (m_fullname.size()==0) //构造函数中不提供,自己获取 { LPOUTLINETEXTMETRIC otm = (LPOUTLINETEXTMETRIC)malloc(nSize); memset(otm, 0, nSize); @@ -410,7 +410,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter TCHAR buff[LF_FACESIZE+1]; GetFontLocalName(localname, buff); - m_nFontFamily = otm->otmTextMetrics.tmPitchAndFamily & 0xF0; //ȡ壬ӦʹʲôĬ + m_nFontFamily = otm->otmTextMetrics.tmPitchAndFamily & 0xF0; //获取字体家族,家族对应使用什么默认链接字体 m_familyname = (wstring)buff; m_set = pSettings->FindIndividual(m_familyname.c_str()); m_ftWeight = CalcBoldWeight(/*weight*/700); @@ -422,7 +422,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter SelectFont(hdc, old); DeleteDC(hdc); - // + //完成 // g_EngineCreateFont = false; face_id_link[0]=(FTC_FaceID)NULL; ggo_link[0] = NULL; @@ -472,7 +472,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter void UpdateFontSetting() { m_ftWeight = CalcBoldWeight(700/*m_weight*/); - // + //清除字体链接 face_id_link[0]=NULL; ggo_link[0]=NULL; m_linknum = 0; @@ -617,7 +617,7 @@ class FreeTypeFontEngine : public FreeTypeGCCounter } void ReloadAll() { - //ȫ壬建 + //重新载入全部字体,即清空所有字体缓存 COwnedCriticalSectionLock __olock(2); CCriticalSectionLock __lock; CGdippSettings* pSettings = CGdippSettings::GetInstance(); @@ -629,9 +629,9 @@ class FreeTypeFontEngine : public FreeTypeGCCounter if (p) { /* - if (p->GetFullName()!=iter->first) //滻 + if (p->GetFullName()!=iter->first) //是替换字体 { - p->Release(); //ͷŵ + p->Release(); //释放掉多重引用 m_mfullMap.erase(iter++); continue; }*/ diff --git a/ftref.h b/ftref.h index 89d4454..675656d 100644 --- a/ftref.h +++ b/ftref.h @@ -24,4 +24,4 @@ FT_Referenced_Glyph New_FT_Ref_Glyph(); #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/gdiPlusFlat2.cpp b/gdiPlusFlat2.cpp index d0cde1c..59ea2d5 100644 --- a/gdiPlusFlat2.cpp +++ b/gdiPlusFlat2.cpp @@ -36,4 +36,4 @@ bool InitGdiplusFuncs(){ } else return true; -} \ No newline at end of file +} diff --git a/gdiPlusFlat2.h b/gdiPlusFlat2.h index 3d4bc33..cf9d85a 100644 --- a/gdiPlusFlat2.h +++ b/gdiPlusFlat2.h @@ -20,7 +20,7 @@ GdipDrawString)( GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush - );//ֵĺ + );//绘制文字的函数 typedef GpStatus (WINGDIPAPI* GdipGetLogFontW)(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);//GPFontȡLogfont @@ -39,11 +39,11 @@ typedef GpStatus (WINGDIPAPI* GdipGetStringFormatTrimming)( GDIPCONST GpStringFormat *format, StringTrimming *trimming - ); //ȡַԷʽַȳγʱʹõķʽɾмIJ֡ + ); //获取字符串的缩略方式。当字符串长度超过矩形长度时,将使用设置的方式删除中间的部分文字。 //תGDIӦʹDrawTextģ⡣ typedef GpStatus (WINGDIPAPI* GdipGetStringFormatHotkeyPrefix)(GDIPCONST GpStringFormat *format, - INT *hotkeyPrefix); //ȡ&ŵʾʽأʾ»߻߲&DrawTextģ⡣ + INT *hotkeyPrefix); //获取&符号的显示方式,隐藏,显示下划线或者不处理&。由DrawText模拟。 typedef GpStatus (WINGDIPAPI* GdipGetBrushType)(GpBrush *brush, GpBrushType *type); @@ -63,4 +63,4 @@ extern GdipReleaseDC pfnGdipReleaseDC ; bool InitGdiplusFuncs(); -#endif \ No newline at end of file +#endif diff --git a/gdipp.vcxproj b/gdipp.vcxproj index 40ee527..bf8b26e 100644 --- a/gdipp.vcxproj +++ b/gdipp.vcxproj @@ -694,4 +694,4 @@ - \ No newline at end of file + diff --git a/gdipp.vcxproj.filters b/gdipp.vcxproj.filters index c4a546e..3c81bf7 100644 --- a/gdipp.vcxproj.filters +++ b/gdipp.vcxproj.filters @@ -160,4 +160,4 @@ Resource Files - \ No newline at end of file + diff --git a/hash_list.cpp b/hash_list.cpp index 4945ca1..e4ebbe8 100644 --- a/hash_list.cpp +++ b/hash_list.cpp @@ -34,4 +34,4 @@ TCHAR * CHashedStringList::Find(TCHAR * String) return it->second; else return NULL; -} \ No newline at end of file +} diff --git a/hash_list.h b/hash_list.h index 6f6f73c..b43d0b8 100644 --- a/hash_list.h +++ b/hash_list.h @@ -26,4 +26,4 @@ class CHashedStringList private: strmap stringmap; BOOL m_bCaseSense; -}; \ No newline at end of file +}; diff --git a/hook.cpp b/hook.cpp index 0c9b248..4f44c10 100644 --- a/hook.cpp +++ b/hook.cpp @@ -567,7 +567,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) //delete AACacheFull; //delete AACache; // for (int i=0;i //޸ʹʧܵʱ򷵻falseɵ߸Windowsԭʵ̰߳ȫ +template //修改这个函数,使它在失败的时候返回false,由调用者负责调用Windows原函数,实现线程安全。 BOOL _GetTextExtentPoint32AorW(HDC hdc, _TCHAR* lpString, int cbString, LPSIZE lpSize) { const CGdippSettings* pSettings = CGdippSettings::GetInstance(); @@ -230,8 +230,8 @@ LONG WINAPI IMPL_LdrLoadDll(IN PWCHAR PathToFile OPTIONAL, IN ULONG Flags OPTION wstring filename = wstring(ModuleFileName->Buffer); int last_slash=filename.find_last_of('\\'); if (last_slash!=-1) - filename.erase(0,last_slash+1); //ɾ· - if (_wcsicmp(filename.c_str(), L"d2d1.dll")==0) //d2d1.dll + filename.erase(0,last_slash+1); //删除路径 + if (_wcsicmp(filename.c_str(), L"d2d1.dll")==0) //正在载入d2d1.dll { bD2D1Loaded = true; LONG result = ORIG_LdrLoadDll(PathToFile, Flags, ModuleFileName, ModuleHandle); @@ -411,15 +411,15 @@ LPCWSTR GetCachedFontLocale(HFONT lFont) void AddToCachedFont(HFONT lfont, LPWSTR lpFaceName, LPWSTR lpGDIName) { - if (!lfont) return; //ӿսڵ + if (!lfont) return; //不可以添加空节点 CCriticalSectionLock __lock(CCriticalSectionLock::CS_CACHEDFONT); - if (GetCachedFont(lfont)) return; //Ѿڵ + if (GetCachedFont(lfont)) return; //已经存在的字体 FontCache[lfont] = new CFontSubResult(lpFaceName, lpGDIName); } void DeleteCachedFont(HFONT lfont) { - if (!lfont) return; //ɾͷ + if (!lfont) return; //不可以删除头结点 CCriticalSectionLock __lock(CCriticalSectionLock::CS_CACHEDFONT); CFontCache::iterator it= FontCache.find(lfont); if (it!=FontCache.end()) @@ -755,7 +755,7 @@ HFONT WINAPI IMPL_CreateFontIndirectExW(CONST ENUMLOGFONTEXDV *penumlfex) BOOL WINAPI IMPL_DeleteObject(HGDIOBJ hObject) { //CThreadCounter __counter; - if (hObject == g_alterGUIFont) //ҵϵͳ壬ͷŵ + if (hObject == g_alterGUIFont) //我的系统字体,不可以释放掉 return true; BOOL bResult = ORIG_DeleteObject(hObject); if (bResult) DeleteCachedFont((HFONT)hObject); @@ -763,7 +763,7 @@ BOOL WINAPI IMPL_DeleteObject(HGDIOBJ hObject) } -HFONT WINAPI IMPL_CreateFontIndirectW(CONST LOGFONTW *lplf) //hookֻΪѹ뷨 +HFONT WINAPI IMPL_CreateFontIndirectW(CONST LOGFONTW *lplf) //重新启用这个hook,只为兼容搜狗输入法 { ENUMLOGFONTEXDVW envlf = {0}; memcpy(&envlf.elfEnumLogfontEx.elfLogFont, lplf, sizeof(LOGFONTW)); @@ -1061,14 +1061,14 @@ extern ControlIder CID; // ȡWindowsExtTextOutW BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCWSTR lpString, UINT cbString, CONST INT *SyslpDx) { - //CThreadCounter __counter; //ڰȫ˳ļ + //CThreadCounter __counter; //用于安全退出的计数器 INT* lpDx = const_cast(SyslpDx); if (!hdc || !lpString || !cbString || !g_ccbRender || cbString>8192) { //no valid param or rendering is disabled from control center. return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); } - if (!(fuOptions & ETO_GLYPH_INDEX) && cbString==1 && *lpString==32) //ո - return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions | ETO_IGNORELANGUAGE, lprc, lpString, cbString, lpDx); //ոͲôˡһ + if (!(fuOptions & ETO_GLYPH_INDEX) && cbString==1 && *lpString==32) //空格 + return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions | ETO_IGNORELANGUAGE, lprc, lpString, cbString, lpDx); //空格就不用处理了。。。反正都一样 CThreadLocalInfo* pTLInfo = g_TLInfo.GetPtr(); if(!pTLInfo) { @@ -1099,14 +1099,14 @@ BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, if (!(fuOptions & ETO_GLYPH_INDEX) && !(fuOptions & ETO_IGNORELANGUAGE) && !lpDx && CID.myiscomplexscript(lpString,cbString)) //complex script return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); - CGdippSettings* pSettings = CGdippSettings::GetInstance(); //һļʵ + CGdippSettings* pSettings = CGdippSettings::GetInstance(); //获得一个配置文件实例 /* -#ifndef _DEBUG //debugģʽ´˲ +#ifndef _DEBUG //debug模式下此参数有问题 if (pSettings->FontLoader()==SETTING_FONTLOADER_WIN32) { - if (!(fuOptions & ETO_GLYPH_INDEX) //ļȾ + if (!(fuOptions & ETO_GLYPH_INDEX) //复杂文件,不进行渲染 && !(fuOptions & ETO_IGNORELANGUAGE) && ScriptIsComplex(lpString, cbString, SIC_COMPLEX) == S_OK) { return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); } @@ -1121,7 +1121,7 @@ BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, - if (pTLInfo->InExtTextOut()) { //쳣֮Զԭִ + if (pTLInfo->InExtTextOut()) { //是异常之后的自动还原执行 return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); } @@ -1132,9 +1132,9 @@ BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, if (GetTransform) { GetTransform(hdc, GT_WORLD_TO_DEVICE, &xfm); - if (memcmp(&xfm, &stdXfm, sizeof(XFORM)-sizeof(FLOAT)*2)) //(xfm.eM11!=1.0 || xfm.eM22!=1.0) //ת + if (memcmp(&xfm, &stdXfm, sizeof(XFORM)-sizeof(FLOAT)*2)) //(xfm.eM11!=1.0 || xfm.eM22!=1.0) //如果存在坐标转换 { - bool bZoomInOut = (xfm.eM12==0 && xfm.eM21==0 && xfm.eM11>0 && xfm.eM22>0); //ֻ, + bool bZoomInOut = (xfm.eM12==0 && xfm.eM21==0 && xfm.eM11>0 && xfm.eM22>0); //只是缩放,且是正数缩放 if (!bZoomInOut) return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); //Ⱦ else @@ -1194,7 +1194,7 @@ BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, OUTLINETEXTMETRIC* otm = NULL; ETO_TRY(); - //ñ־ + //设置标志, pTLInfo->InExtTextOut(true); POINT curPos = { nXStart, nYStart }; //¼ʼλ diff --git a/ownedcs.cpp b/ownedcs.cpp index 903c0e5..beb182a 100644 --- a/ownedcs.cpp +++ b/ownedcs.cpp @@ -31,15 +31,15 @@ void WINAPI EnterOwnedCritialSection(POWNED_CRITIAL_SECTION cs, WORD Owner) } else { - if (InterlockedIncrementInt(cs->nRequests)>0) //ȴȡȨ + if (InterlockedIncrementInt(cs->nRequests)>0) //等待获取所有权 { LeaveCriticalSection(&cs->threadLock); WaitForSingleObject(cs->hEvent, INFINITE); } else LeaveCriticalSection(&cs->threadLock); - InterlockedExchangeInt(cs->nOwner, Owner);// - InterlockedExchangeInt(cs->nRecursiveCount, 1);//ռü + InterlockedExchangeInt(cs->nOwner, Owner);//更改所有者 + InterlockedExchangeInt(cs->nRecursiveCount, 1);//增加占用计数 } } @@ -58,4 +58,4 @@ void WINAPI LeaveOwnedCritialSection(POWNED_CRITIAL_SECTION cs, WORD Owner) else InterlockedDecrementInt(cs->nRecursiveCount); LeaveCriticalSection(&cs->threadLock); -} \ No newline at end of file +} diff --git a/ownedcs.h b/ownedcs.h index b91b4ca..1f3581b 100644 --- a/ownedcs.h +++ b/ownedcs.h @@ -6,9 +6,9 @@ typedef struct _OWNED_CRITIAL_SECTION HANDLE hEvent; CRITICAL_SECTION threadLock; }OWNED_CRITIAL_SECTION, *POWNED_CRITIAL_SECTION; - //Զٽ + //用于自定义临界区 void WINAPI InitializeOwnedCritialSection(POWNED_CRITIAL_SECTION cs); void WINAPI DeleteOwnedCritialSection(POWNED_CRITIAL_SECTION cs); void WINAPI EnterOwnedCritialSection(POWNED_CRITIAL_SECTION cs, WORD Owner); -void WINAPI LeaveOwnedCritialSection(POWNED_CRITIAL_SECTION cs, WORD Owner); \ No newline at end of file +void WINAPI LeaveOwnedCritialSection(POWNED_CRITIAL_SECTION cs, WORD Owner); diff --git a/settings.cpp b/settings.cpp index 0a436ca..02b8789 100644 --- a/settings.cpp +++ b/settings.cpp @@ -429,7 +429,7 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) PathRemoveFileSpec(szDir); PathCombine(szAlternative, szDir, szAlternative); } - StringCchCopy(szMainFile, MAX_PATH, lpszFile); //ԭʼļ + StringCchCopy(szMainFile, MAX_PATH, lpszFile); //把原始文件名保存下来 StringCchCopy(m_szFileName, MAX_PATH, szAlternative); lpszFile = m_szFileName; m_Config.Clear(); @@ -642,7 +642,7 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) // [ExcludeSub]滻ģE AddListFromSection(L"ExcludeSub", lpszFile, m_arrUnFontSubModule); //AddListFromSection(L"ExcludeSub", szMainFile, m_arrUnFontSubModule); - //ųģ飬ر滻 + //如果是排除的模块,则关闭字体替换 if (m_nFontSubstitutes) { ModuleHashMap::const_iterator it=m_arrUnFontSubModule.begin(); @@ -736,7 +736,7 @@ bool CGdippSettings::AddLcdFilterFromSection(LPCTSTR lpszKey, LPCTSTR lpszFile, for (int i = 0; i < 5; i++) { LPCTSTR arg = token.GetArgument(i); if (!arg) - return false; //5Ϊʹô˲ + return false; //参数少于5个则视为不使用此参数 arr[i] = _StrToInt(arg, arr[i]); } @@ -998,7 +998,7 @@ bool CGdippSettings::IsProcessUnload() const return false; ModuleHashMap::const_iterator it = m_arrUnloadModule.begin(); for(; it != m_arrUnloadModule.end(); ++it) { - if (!lstrcmpi(lpApp, it->c_str())) { //ƥųρE + if (!lstrcmpi(lpApp, it->c_str())) { //匹配排除蟻E return true; } } @@ -1015,7 +1015,7 @@ bool CGdippSettings::IsProcessUnload() const return false; ModuleHashMap::const_iterator it = m_arrIncludeModule.begin(); for(; it != m_arrIncludeModule.end(); ++it) { - if (!lstrcmpi(lpApp, it->c_str())) { //ƥųρE + if (!lstrcmpi(lpApp, it->c_str())) { //匹配排除蟻E return true; } } @@ -1293,7 +1293,7 @@ void CFontLinkInfo::init() if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) break; if (regtype != REG_SZ) continue; - if (lstrcmpi(value2, linep) != 0) continue; //ѰļӦÁE + if (lstrcmpi(value2, linep) != 0) continue; //寻找字体链接中字体文件对应的字体脕E StringCchCopyW(buf, sizeof(buf)/sizeof(buf[0]), name); if (buf[wcslen(buf) - 1] == L')') { //ȥ @@ -1330,7 +1330,7 @@ void CFontLinkInfo::init() { //ӱE LPWSTR swapbuff[32]; - memcpy(swapbuff, info[row], 32*sizeof(LPWSTR)); //Դƹ + memcpy(swapbuff, info[row], 32*sizeof(LPWSTR)); //整个柄源制过来 for (int i=1; im_bUseCustomLcdFilter = false; //NULLǹرԶ + pSettings->m_bUseCustomLcdFilter = false; //传NULL过来就是关闭自定义过滤器 else { - pSettings->m_bUseCustomLcdFilter = true; //򿪹 - if (!IsBadReadPtr((void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights))) //ָЧ - memcpy(pSettings->m_arrLcdFilterWeights, (void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights)); // + pSettings->m_bUseCustomLcdFilter = true; //否则打开过滤器 + if (!IsBadReadPtr((void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights))) //如果指针有效 + memcpy(pSettings->m_arrLcdFilterWeights, (void*)nValue, sizeof(pSettings->m_arrLcdFilterWeights)); //复制数据 } - UpdateLcdFilter(); //ˢ¹ + UpdateLcdFilter(); //刷新过滤器 break; case ATTR_HintSmallFont: pSettings->m_bHintSmallFont = !!nValue; @@ -689,7 +689,7 @@ class CControlCenter: public IControlCenter pSettings->m_nBitmapHeight = nValue; break; case ATTR_ShadowBuffer: - if (nValue && !IsBadReadPtr((void*)nValue, sizeof(pSettings->m_nShadow))) //ָЧ + if (nValue && !IsBadReadPtr((void*)nValue, sizeof(pSettings->m_nShadow))) //指针有效 { LPCTSTR szShadow = (LPCTSTR)nValue; CStringTokenizer token; @@ -849,7 +849,7 @@ class CControlCenter: public IControlCenter argc = token.Parse(value); } TCHAR buff[LF_FACESIZE+1]; - GetFontLocalName(p, buff); //ת + GetFontLocalName(p, buff); //转换字体名 CFontIndividual fi(buff); const CFontSettings& fsCommon = pSettings->m_FontSettings; diff --git a/supinfo.h b/supinfo.h index b39ca0d..c1ceb69 100644 --- a/supinfo.h +++ b/supinfo.h @@ -157,7 +157,7 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) // DWORD aa=0; // if (GetFileSize(logfile, NULL)==0) // WriteFile(logfile, "\xff\xfe", 2, &aa, NULL); - LPTSTR vlpApp = (LPTSTR)lpApp; //ɿԲIJ + LPTSTR vlpApp = (LPTSTR)lpApp; //变成可以操作的参数 if (lpApp) { do @@ -172,7 +172,7 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) // WriteFile(logfile, ret.c_str(), ret.length()*2, &aa, NULL); // WriteFile(logfile, _T("\n"), 2, &aa, NULL); DWORD fa = GetFileAttributes(ret.c_str()); - if (fa!=INVALID_FILE_ATTRIBUTES && fa!=FILE_ATTRIBUTE_DIRECTORY) //ļǷ + if (fa!=INVALID_FILE_ATTRIBUTES && fa!=FILE_ATTRIBUTE_DIRECTORY) //文件是否存在 { int p = ret.find_last_of(_T("\\")); if (p!=-1) @@ -210,13 +210,13 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) int p=0; if ((*lpCmd)==_T('\"')) { - ret.erase(0,1); //ɾһ - p=ret.find_first_of(_T("\"")); //һ + ret.erase(0,1); //删除第一个引号 + p=ret.find_first_of(_T("\"")); //查找下一个引号 } else p=ret.find_first_of(_T(" ")); if (p>0) - ret.resize(p); //Cmdļ + ret.resize(p); //获得Cmd里面的文件名 // WriteFile(logfile, ret.c_str(), ret.length()*2, &aa, NULL); // WriteFile(logfile, _T("\n"), 2, &aa, NULL); p = ret.find_last_of(_T("\\")); @@ -302,4 +302,4 @@ BOOL _CreateProcessInternalW(HANDLE hToken, LPCTSTR lpApp, LPTSTR lpCmd, LPSECUR #endif return TRUE; -} \ No newline at end of file +} diff --git a/undocAPI.h b/undocAPI.h index 1838ebc..15b8464 100644 --- a/undocAPI.h +++ b/undocAPI.h @@ -93,4 +93,4 @@ static TGetTextFA GetTextFaceAliasW= (TGetTextFA)GetProcAddress(LoadLibrary(_T(" static PFNCreateProcessInternalW CreateProcessInternalW_KernelBase = (PFNCreateProcessInternalW)GetProcAddress(GetModuleHandle(_T("kernelbase.dll")),"CreateProcessInternalW"); static PFNCreateProcessInternalW CreateProcessInternalW = CreateProcessInternalW_KernelBase ? CreateProcessInternalW_KernelBase:(PFNCreateProcessInternalW)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"CreateProcessInternalW"); //static PFNIsWow64Process IsWow64Process=(PFNIsWow64Process)GetProcAddress(LoadLibrary(L"Kernel32.dll"), "IsWow64Process"); -static PFNGetFontResourceInfo GetFontResourceInfo=(PFNGetFontResourceInfo)GetProcAddress(LoadLibrary(L"gdi32.dll"), "GetFontResourceInfoW"); \ No newline at end of file +static PFNGetFontResourceInfo GetFontResourceInfo=(PFNGetFontResourceInfo)GetProcAddress(LoadLibrary(L"gdi32.dll"), "GetFontResourceInfoW"); diff --git a/wow64layer.h b/wow64layer.h index 988b6c0..413f538 100644 --- a/wow64layer.h +++ b/wow64layer.h @@ -226,4 +226,4 @@ BOOL XP_GetThreadWow64Context( CloseHandle( Process ); return TRUE; -} \ No newline at end of file +} From cc82d3a2bb9fd2eaef933533515a19041e6b0763 Mon Sep 17 00:00:00 2001 From: namazso <8676443+namazso@users.noreply.github.com> Date: Sun, 6 Dec 2020 11:38:08 +0100 Subject: [PATCH 3/6] manually correct ambigous encoding ones --- cache.cpp | 20 ++-- cache.h | 6 +- common.h | 32 +++--- dll.cpp | 48 ++++----- expfunc.cpp | 70 ++++++------- ft - non-ref.cpp | 258 +++++++++++++++++++++++------------------------ ft.cpp | 244 ++++++++++++++++++++++---------------------- ft.h | 6 +- ft2vert.c | 20 ++-- fteng.cpp | 94 ++++++++--------- fteng.h | 98 +++++++++--------- gdiPlusFlat2.h | 8 +- gdiexe.rc | 12 +-- hook.cpp | 52 +++++----- misc.cpp | 6 +- override.cpp | 48 ++++----- ownedcs.cpp | 2 +- run.cpp | 28 ++--- settings.cpp | 156 ++++++++++++++-------------- settings.h | 38 +++---- strtoken.h | 2 +- supinfo.h | 14 +-- tlsdata.h | 2 +- 23 files changed, 632 insertions(+), 632 deletions(-) diff --git a/cache.cpp b/cache.cpp index 78ef75a..1583389 100644 --- a/cache.cpp +++ b/cache.cpp @@ -1,7 +1,7 @@ #include "override.h" //CreateDIB计数,将在绘制下列次数后更新DIB区 -#define BITMAP_REDUCE_COUNTER 256//Ĭ1024 +#define BITMAP_REDUCE_COUNTER 256//默认1024 HDC CBitmapCache::CreateDC(HDC dc) @@ -23,8 +23,8 @@ HBITMAP CBitmapCache::CreateDIB(int width, int height, BYTE** lplpPixels) *lplpPixels = m_lpPixels; return m_hbmp; } - //JE^ - //TCYSȂĐȂ + //カウンタ超過 + //ただしサイズが全く同じなら再生成しない if (dibSize.cx == width && dibSize.cy == height) { m_counter = 0; *lplpPixels = m_lpPixels; @@ -46,8 +46,8 @@ HBITMAP CBitmapCache::CreateDIB(int width, int height, BYTE** lplpPixels) } TRACE(_T("width=%d, height=%d\n"), width, height); - //shbmpNew==NULL̏ꍇz肵A - //Ƃ̂݃LbVXV + //メモリ不足等でhbmpNew==NULLの場合を想定し、 + //成功したときのみキャッシュを更新 if (m_hbmp) { DeleteBitmap(m_hbmp); } @@ -55,7 +55,7 @@ HBITMAP CBitmapCache::CreateDIB(int width, int height, BYTE** lplpPixels) m_hbmp = hbmpNew; dibSize.cx = width; dibSize.cy = height; - //CreateDIBSection͑y[WEZOgE + //CreateDIBSectionは多分ページ境界かセグメント境界 m_lpPixels = *lplpPixels; m_counter = 0; return m_hbmp; @@ -79,7 +79,7 @@ void CBitmapCache::FillSolidRect(COLORREF rgb, const RECT* lprc) const DWORD dwBmpBytes = m_dibSize.cx * m_dibSize.cy; rgb = RGB2DIB(rgb); - //TODO: MMX or SSE + //TODO: MMX or SSE化 __asm { mov edi, dword ptr [lpPixels] mov ecx, dword ptr [dwBmpBytes] @@ -94,7 +94,7 @@ void CBitmapCache::FillSolidRect(COLORREF rgb, const RECT* lprc) // } } -// +//水平線を引く //(X1,Y1) (X2,Y1) // +-----------------+ ^ // | rgb | | width @@ -111,7 +111,7 @@ void CBitmapCache::DrawHorizontalLine(int X1, int Y1, int X2, COLORREF rgb, int X2 = xx; } - //NbsO + //クリッピング const int xSize = m_dibSize.cx; const int ySize = m_dibSize.cy; X1 = Bound(X1, 0, xSize); @@ -142,7 +142,7 @@ void CBitmapCache::DrawHorizontalLine(int X1, int Y1, int X2, COLORREF rgb, int }*/ /*#ifdef _M_IX86 - //ӖɃAZu + //無意味にアセンブリ化 __asm { mov ebx, dword ptr [Yd] mov edx, dword ptr [lpPixels] diff --git a/cache.h b/cache.h index 0353d89..71b72c4 100644 --- a/cache.h +++ b/cache.h @@ -58,11 +58,11 @@ typedef StringHashT StringHashFont; typedef StringHashT StringHashModule; -//COLORREF(RR GG BB 00) DIB32(BB GG RR 00) ɕϊ +//COLORREF(RR GG BB 00) を DIB32(BB GG RR 00) に変換 #define RGB2DIB(rgb) RGB(GetBValue(rgb), GetGValue(rgb), GetRValue(rgb)) #define DIB2RGB(dib) RGB2DIB(dib) -// ExtTextOutW̃rbg}bvLbV +// ExtTextOutWのビットマップキャッシュ class CBitmapCache { private: @@ -142,7 +142,7 @@ class CBitmapCache *m_CurrentPixel = RGB2DIB(rgb); } - //{̂cache.cpp + //本体はcache.cpp HDC CreateDC(HDC dc); HBITMAP CreateDIB(int width, int height, BYTE** lplpPixels); void FillSolidRect(COLORREF rgb, const RECT* lprc); diff --git a/common.h b/common.h index 78ef190..e3a8b53 100644 --- a/common.h +++ b/common.h @@ -91,7 +91,7 @@ FORCEINLINE HINSTANCE GetDLLInstance() return g_hinstDLL; } -//r +//排他制御 class CCriticalSectionLock { #define MAX_CRITICAL_COUNT 20 @@ -148,11 +148,11 @@ static void _Trace(LPCTSTR pszFormat, ...) CCriticalSectionLock __lock; va_list argptr; va_start(argptr, pszFormat); - //w(v)sprintf1024ȏԂĂȂ + //w(v)sprintfは1024文字以上返してこない TCHAR szBuffer[10240]; wvsprintf(szBuffer, pszFormat, argptr); - //fobKA^b`Ă鎞̓fobKɃbZ[Wo + //デバッガをアタッチしてる時はデバッガにメッセージを出す //if (IsDebuggerPresent()) { OutputDebugString(szBuffer); return; @@ -188,7 +188,7 @@ static void _Trace(LPCTSTR pszFormat, ...) } #else //!_DEBUG #define TRACE NOP_FUNCTION -//PSDK 2003R2winnt.h +//↓PSDK 2003R2のwinnt.h //#ifndef NOP_FUNCTION //#if (_MSC_VER >= 1210) //#define NOP_FUNCTION __noop @@ -198,8 +198,8 @@ static void _Trace(LPCTSTR pszFormat, ...) //#endif #endif //_DEBUG -//TRACE}N -//gp: TRACE(_T("cx: %d\n"), cx); +//TRACEマクロ +//使用例: TRACE(_T("cx: %d\n"), cx); #ifdef USE_TRACE #define TRACE2 _Trace2 #define TRACE2_STR _Trace2_Str @@ -212,7 +212,7 @@ static void _Trace2(LPCTSTR pszFormat, ...) CCriticalSectionLock __lock; va_list argptr; va_start(argptr, pszFormat); - //w(v)sprintf1024ȏԂĂȂ + //w(v)sprintfは1024文字以上返してこない TCHAR szBuffer[1024]; wvsprintf(szBuffer, pszFormat, argptr); OutputDebugString(szBuffer); @@ -332,7 +332,7 @@ class CCriticalSectionLockTry } }; -// gpfreeŊJ鎖 +// 使用後はfreeで開放する事 LPWSTR _StrDupExAtoW(LPCSTR pszMB, int cchMB, LPWSTR pszStack, int cchStack, int* pcchWC, int nACP = CP_ACP); static inline LPWSTR _StrDupAtoW(LPCSTR pszMB, int cchMB = -1, int* pcchWC = NULL) { @@ -358,8 +358,8 @@ template FORCEINLINE T Bound(T x, T m, T M) { return (x < m) ? m : ( template FORCEINLINE int Sgn(T x, T y) { return (x > y) ? 1 : ((x < y) ? -1 : 0); } -//^`FbN@\‚DeleteXXX/SelectXXX -//SelectObject/DeleteObject͎gpłȂȂ +//型チェック機能つきDeleteXXX/SelectXXX +//SelectObject/DeleteObjectは使用できなくなる #ifdef _DEBUG #undef DeletePen @@ -448,8 +448,8 @@ DEFINE_SELECT_FUNCTION(HBITMAP, Bitmap) #endif //_DEBUG -//TRACE}N -//gp: TRACE(_T("cx: %d\n"), cx); +//TRACEマクロ +//使用例: TRACE(_T("cx: %d\n"), cx); #ifndef _WIN64 #ifdef _DEBUG FORCEINLINE static __int64 GetClockCount() @@ -463,12 +463,12 @@ FORCEINLINE static __int64 GetClockCount() return cycles.QuadPart; } -//gp +//使用例 //{ // CDebugElapsedCounter _cntr("hogehoge"); -// : (Kȏ) +// : (適当な処理) //} -//o͗: "hogehoge: 10000 clocks" +//出力例: "hogehoge: 10000 clocks" class CDebugElapsedCounter { private: @@ -577,7 +577,7 @@ int _httoi(const TCHAR *value) return result; } -//atofɃftHglԂ悤ɂ悤ȕ +//atofにデフォルト値を返せるようにしたような物 float _StrToFloat(LPCTSTR pStr, float fDefault) { #define isspace(ch) (ch == _T('\t') || ch == _T(' ')) diff --git a/dll.cpp b/dll.cpp index 54e0ec9..aa1e467 100644 --- a/dll.cpp +++ b/dll.cpp @@ -12,7 +12,7 @@ CMemLoadDll::~CMemLoadDll() { //ASSERT(pImageBase != NULL); //ASSERT(pDllMain != NULL); - //ѹ׼жdll + //脱钩,准备卸载dll if (m_bInitDllMain) pDllMain((HINSTANCE)pImageBase,DLL_PROCESS_DETACH,0); VirtualFree((LPVOID)pImageBase, 0, MEM_RELEASE); @@ -20,7 +20,7 @@ CMemLoadDll::~CMemLoadDll() } //MemLoadLibrary函数从内存缓冲区数据中加载一个dll到当前进程的地址空间,缺省位置0x10000000 -//ֵ ɹTRUE , ʧܷFALSE +//返回值: 成功返回TRUE , 失败返回FALSE //lpFileData: 存放dll文件数据的缓冲区 //DataLength: 缓冲区中数据的总长度 BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDllMain, bool bFreeOnRavFail) @@ -28,7 +28,7 @@ BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDll this->m_bInitDllMain = bInitDllMain; if(pImageBase != NULL) { - return FALSE; //Ѿһdllûͷţܼµdll + return FALSE; //已经加载一个dll,还没有释放,不能加载新的dll } //检查数据有效性,并初始化 if(!CheckDataValide(lpFileData, DataLength))return FALSE; @@ -43,7 +43,7 @@ BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDll else { CopyDllDatas(pMemoryAddress, lpFileData); //复制dll数据,并对齐每个段 - //ضλϢ + //重定位信息 /*if(pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress >0 && pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size>0) { @@ -56,7 +56,7 @@ BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDll return FALSE; }*/ //修改页属性。应该根据每个页的属性单独设置其对应内存页的属性。这里简化一下。 - //ͳһóһPAGE_EXECUTE_READWRITE + //统一设置成一个属性PAGE_EXECUTE_READWRITE unsigned long old; VirtualProtect(pMemoryAddress, ImageSize, PAGE_EXECUTE_READWRITE,&old); } @@ -66,7 +66,7 @@ BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData, int DataLength, bool bInitDll //接下来要调用一下dll的入口函数,做初始化工作。 pDllMain = (ProcDllMain)(pNTHeader->OptionalHeader.AddressOfEntryPoint +(DWORD_PTR) pMemoryAddress); BOOL InitResult = !bInitDllMain || pDllMain((HINSTANCE)pMemoryAddress,DLL_PROCESS_ATTACH,0); - if(!InitResult) //ʼʧ + if(!InitResult) //初始化失败 { pDllMain((HINSTANCE)pMemoryAddress,DLL_PROCESS_DETACH,0); VirtualFree(pMemoryAddress,0,MEM_RELEASE); @@ -136,10 +136,10 @@ FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lpProcName) } -// ضPEõĵַ +// 重定向PE用到的地址 void CMemLoadDll::DoRelocation( void *NewBase) { - /* ضλĽṹ + /* 重定位表的结构: // DWORD sectionAddress, DWORD size (包括本节需要重定位的数据) // 例如 1000节需要修正5个重定位数据的话,重定位表的数据是 // 00 10 00 00 14 00 00 00 xxxx xxxx xxxx xxxx xxxx 0000 @@ -166,7 +166,7 @@ void CMemLoadDll::DoRelocation( void *NewBase) // 举例: // pLoc->VirtualAddress = 0x1000; // pLocData[i] = 0x313E; 表示本节偏移地址0x13E处需要修正 - // pAddress = ַ + 0x113E + // 因此 pAddress = 基地址 + 0x113E // 里面的内容是 A1 ( 0c d4 02 10) 汇编代码是: mov eax , [1002d40c] // 需要修正1002d40c这个地址 DWORD * pAddress = (DWORD *)((DWORD_PTR)NewBase + pLoc->VirtualAddress + (pLocData[i] & 0x0FFF)); @@ -187,7 +187,7 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) // DWORD OriginalFirstThunk; // 0表示结束,否则指向未绑定的IAT结构数组 // DWORD TimeDateStamp; // DWORD ForwarderChain; // -1 if no forwarders - // DWORD Name; // dll + // DWORD Name; // 给出dll的名字 // DWORD FirstThunk; // 指向IAT结构数组的地址(绑定后,这些IAT里面就是实际的函数地址) unsigned long Offset = pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress ; if(Offset == 0) return TRUE; //No Import Table @@ -196,7 +196,7 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) { PIMAGE_THUNK_DATA32 pRealIAT = (PIMAGE_THUNK_DATA32)((DWORD_PTR)pImageBase + pID->FirstThunk); PIMAGE_THUNK_DATA32 pOriginalIAT = (PIMAGE_THUNK_DATA32)((DWORD_PTR)pImageBase + pID->OriginalFirstThunk); - //ȡdll + //获取dll的名字 WCHAR buf[256]; //dll name; BYTE* pName = (BYTE*)((DWORD_PTR)pImageBase + pID->Name); int i; @@ -210,7 +210,7 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) HMODULE hDll = GetModuleHandle(buf); if(hDll == NULL)return FALSE; //NOT FOUND DLL //获取DLL中每个导出函数的地址,填入IAT - //ÿIATṹ + //每个IAT结构是 : // union { PBYTE ForwarderString; // PDWORD Function; // DWORD Ordinal; @@ -235,7 +235,7 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) // else lpFunction = GetProcAddress(hDll, (char *)pByName->Name); } - if(lpFunction != NULL) //ҵˣ + if(lpFunction != NULL) //找到了! { pRealIAT[i].u1.Function = (DWORD) lpFunction; } @@ -249,7 +249,7 @@ BOOL CMemLoadDll::FillRavAddress(void *pImageBase) } //CheckDataValide函数用于检查缓冲区中的数据是否有效的dll文件 -//ֵ һִеdll򷵻TRUE򷵻FALSE +//返回值: 是一个可执行的dll则返回TRUE,否则返回FALSE。 //lpFileData: 存放dll数据的内存缓冲区 //DataLength: dll文件的长度 BOOL CMemLoadDll::CheckDataValide(void* lpFileData, int DataLength) @@ -262,7 +262,7 @@ BOOL CMemLoadDll::CheckDataValide(void* lpFileData, int DataLength) //检查长度 if((DWORD)DataLength < (pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS32)) ) return FALSE; - //ȡpeͷ + //取得pe头 pNTHeader = (PIMAGE_NT_HEADERS32)( (DWORD_PTR)lpFileData + (DWORD_PTR)pDosHeader->e_lfanew); // PEͷ //检查pe头的合法性 if(pNTHeader->Signature != IMAGE_NT_SIGNATURE) return FALSE; //0x00004550 : PE00 @@ -273,7 +273,7 @@ BOOL CMemLoadDll::CheckDataValide(void* lpFileData, int DataLength) if(pNTHeader->FileHeader.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER32)) return FALSE; - //ȡýڱα + //取得节表(段表) pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)pNTHeader + sizeof(IMAGE_NT_HEADERS32)); //验证每个节表的空间 for(int i=0; i< pNTHeader->FileHeader.NumberOfSections; i++) @@ -297,10 +297,10 @@ int CMemLoadDll::CalcTotalImageSize() // 计算所有头的尺寸。包括dos, coff, pe头 和 段表的大小 Size = GetAlignedSize(pNTHeader->OptionalHeader.SizeOfHeaders, nAlign); - // нڵĴС + // 计算所有节的大小 for(int i=0; i < pNTHeader->FileHeader.NumberOfSections; ++i) { - //õýڵĴС + //得到该节的大小 int CodeSize = pSectionHeader[i].Misc.VirtualSize ; int LoadSize = pSectionHeader[i].SizeOfRawData; int MaxSize = (LoadSize > CodeSize)?(LoadSize):(CodeSize); @@ -320,14 +320,14 @@ void CMemLoadDll::CopyDllDatas(void* pDest, void* pSrc) int HeaderSize = pNTHeader->OptionalHeader.SizeOfHeaders; int SectionSize = pNTHeader->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER); int MoveSize = HeaderSize + SectionSize; - //ͷͶϢ + //复制头和段信息 memmove(pDest, pSrc, MoveSize); - //ÿ + //复制每个节 for(int i=0; i < pNTHeader->FileHeader.NumberOfSections; ++i) { if(pSectionHeader[i].VirtualAddress == 0 || pSectionHeader[i].SizeOfRawData == 0)continue; - // λýڴеλ + // 定位该节在内存中的位置 void *pSectionAddress = (void *)((DWORD_PTR)pDest + pSectionHeader[i].VirtualAddress); // 复制段数据到虚拟内存 memmove((void *)pSectionAddress, @@ -336,11 +336,11 @@ void CMemLoadDll::CopyDllDatas(void* pDest, void* pSrc) } //修正指针,指向新分配的内存 - //µdosͷ + //新的dos头 pDosHeader = (PIMAGE_DOS_HEADER)pDest; - //µpeͷַ + //新的pe头地址 pNTHeader = (PIMAGE_NT_HEADERS32)((DWORD_PTR)pDest + (DWORD_PTR)(pDosHeader->e_lfanew)); - //µĽڱַ + //新的节表地址 pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)pNTHeader + sizeof(IMAGE_NT_HEADERS32)); return ; } diff --git a/expfunc.cpp b/expfunc.cpp index 82f3f79..a71598c 100644 --- a/expfunc.cpp +++ b/expfunc.cpp @@ -13,7 +13,7 @@ #include #include "crc32.h" -// win2kȍ~ +// win2k以降 //#pragma comment(linker, "/subsystem:windows,5.0") #ifndef _WIN64 #ifdef DEBUG @@ -25,7 +25,7 @@ EXTERN_C LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { - //Ȃ + //何もしない return CallNextHookEx(NULL, code, wParam, lParam); } @@ -207,17 +207,17 @@ std::wstring MakeUniqueFontName(const std::wstring strFullName, const std::wstri #include #include "dll.h" -//kernel32pGetProcAddresshL +//kernel32専用GetProcAddressモドキ FARPROC K32GetProcAddress(LPCSTR lpProcName) { #ifndef _WIN64 - //nɂ͑ΉȂ + //序数渡しには対応しない Assert(!IS_INTRESOURCE(lpProcName)); - //kernel32̃x[XAhX擾 + //kernel32のベースアドレス取得 LPBYTE pBase = (LPBYTE)GetModuleHandleA("kernel32.dll"); - //̕ӂ100%͂Ȃ̂ŃG[`FbNȂ + //この辺は100%成功するはずなのでエラーチェックしない PIMAGE_DOS_HEADER pdosh = (PIMAGE_DOS_HEADER)pBase; Assert(pdosh->e_magic == IMAGE_DOS_SIGNATURE); PIMAGE_NT_HEADERS pnth = (PIMAGE_NT_HEADERS)(pBase + pdosh->e_lfanew); @@ -249,13 +249,13 @@ FARPROC K32GetProcAddress(LPCSTR lpProcName) #else Assert(!IS_INTRESOURCE(lpProcName)); - //kernel32̃x[XAhX擾 + //kernel32のベースアドレス取得 WCHAR sysdir[MAX_PATH]; GetWindowsDirectory(sysdir, MAX_PATH); if (GetModuleHandle(_T("kernelbase.dll"))) //查看自己是否加载了Kernelbase.dll文件,存在则说明是win7系统 wcscat(sysdir, L"\\SysWow64\\kernelbase.dll"); else - wcscat(sysdir, L"\\SysWow64\\kernel32.dll"); //ھvista + wcscat(sysdir, L"\\SysWow64\\kernel32.dll"); //不存在就是vista HANDLE hFile = CreateFile(sysdir, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL); if (hFile == INVALID_HANDLE_VALUE) return NULL; @@ -267,7 +267,7 @@ FARPROC K32GetProcAddress(LPCSTR lpProcName) CMemLoadDll MemDll; MemDll.MemLoadLibrary(pMem, dwSize, false, false); delete[] pMem; - return FARPROC((DWORD_PTR)MemDll.MemGetProcAddress(lpProcName)-MemDll.GetImageBase()); //ƫֵ + return FARPROC((DWORD_PTR)MemDll.MemGetProcAddress(lpProcName)-MemDll.GetImageBase()); //返回偏移值 #endif } @@ -283,7 +283,7 @@ class opcode_data { private: BYTE code[0x100]; - //: dllpathWORDEɂȂƏꍇɂĂ͐ɓ삵Ȃ + //注: dllpathをWORD境界にしないと場合によっては正常に動作しない WCHAR dllpath[MAX_PATH]; UNICODE_STRING64 uniDllPath; DWORD64 hDumyDllHandle; @@ -291,12 +291,12 @@ class opcode_data { public: opcode_data() { - //int 03hŖ߂ + //int 03hで埋める FillMemory(this, sizeof(*this), 0xcc); } - bool initWow64(LPDWORD remoteaddr, LONG orgEIP) //Wow64ʼ + bool initWow64(LPDWORD remoteaddr, LONG orgEIP) //Wow64初始化 { - //WORDE`FbN + //WORD境界チェック C_ASSERT((offsetof(opcode_data, dllpath) & 1) == 0); register BYTE* p = code; @@ -306,8 +306,8 @@ class opcode_data { #define emit_dw(w) emit_(WORD, w) #define emit_dd(d) emit_(DWORD, d) - //ȂGetProcAddressLoadLibraryW̃AhXȂƂ̂ - //kernel32̃wb_玩OŎ擾 + //なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので + //kernel32のヘッダから自前で取得する FARPROC pfn = K32GetProcAddress("LoadLibraryExW"); if(!pfn) return false; @@ -319,8 +319,8 @@ class opcode_data { mov eax,[eax+0x0c] mov esi,[eax+0x1c] lodsd - move ax,[eax+$08]//ʱeaxбľk32Ļַ - win7õKernelBase.dllĵַ + move ax,[eax+$08]//这个时候eax中保存的就是k32的基址了 + 在win7获得的是KernelBase.dll的地址 */ emit_db(0x64); emit_db(0xA1); @@ -351,16 +351,16 @@ class opcode_data { emit_db(0xE9); //jmp original_EIP emit_dd(orgEIP - (LONG)remoteaddr - (p - code) - sizeof(LONG)); - // gdi++.dll̃pX + // gdi++.dllのパス int nSize = GetModuleFileNameW(GetDLLInstance(), dllpath, MAX_PATH); if (nSize) { ChangeFileName(dllpath, nSize, L"MTBootStrap.dll"); } return !!nSize; } - bool init32(LPDWORD remoteaddr, LONG orgEIP) //32λʼ + bool init32(LPDWORD remoteaddr, LONG orgEIP) //32位程序初始化 { - //WORDE`FbN + //WORD境界チェック C_ASSERT((offsetof(opcode_data, dllpath) & 1) == 0); register BYTE* p = code; @@ -370,8 +370,8 @@ class opcode_data { #define emit_dw(w) emit_(WORD, w) #define emit_dd(d) emit_(DWORD, d) - //ȂGetProcAddressLoadLibraryW̃AhXȂƂ̂ - //kernel32̃wb_玩OŎ擾 + //なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので + //kernel32のヘッダから自前で取得する FARPROC pfn = K32GetProcAddress("LoadLibraryW"); if(!pfn) return false; @@ -399,7 +399,7 @@ emit_dw(0xD0FF); //call eax emit_db(0xE9); //jmp original_EIP emit_dd(orgEIP - (LONG)remoteaddr - (p - code) - sizeof(LONG)); - // gdi++.dll̃pX + // gdi++.dllのパス int nSize = GetModuleFileNameW(GetDLLInstance(), dllpath, MAX_PATH); if (nSize) { ChangeFileName(dllpath, nSize, L"MTBootStrap.dll"); @@ -418,8 +418,8 @@ emit_dw(0xD0FF); //call eax #define emit_dd(d) emit_(DWORD, d) #define emit_ddp(dp) emit_(DWORD64, dp) - //ȂGetProcAddressLoadLibraryW̃AhXȂƂ̂ - //kernel32̃wb_玩OŎ擾 + //なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので + //kernel32のヘッダから自前で取得する WCHAR x64Addr[30] = { 0 }; if (!GetEnvironmentVariable(L"MACTYPE_X64ADDR", x64Addr, 29)) return false; DWORD64 pfn = wcstoull(x64Addr, NULL, 10); @@ -454,7 +454,7 @@ emit_dw(0xD0FF); //call eax emit_db(0xFF); //jmp rdi emit_db(0xE6); - // gdi++.dll̃pX + // gdi++.dllのパス int nSize = GetModuleFileNameW(GetDLLInstance(), dllpath, MAX_PATH); if (nSize) { @@ -562,14 +562,14 @@ emit_dw(0xD0FF); //call eax emit_db(0xFF); //jmp rdi emit_db(0xE6); - // gdi++.dll̃pX + // gdi++.dllのパス return !!nSize; } bool init(DWORD_PTR* remoteaddr, DWORD_PTR orgEIP) { - //WORDE`FbN + //WORD境界チェック C_ASSERT((offsetof(opcode_data, dllpath) & 1) == 0); register BYTE* p = code; @@ -581,8 +581,8 @@ emit_dw(0xD0FF); //call eax #define emit_dd(d) emit_(DWORD, d) #define emit_ddp(dp) emit_(DWORD_PTR, dp) - //ȂGetProcAddressLoadLibraryW̃AhXȂƂ̂ - //kernel32̃wb_玩OŎ擾 + //なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので + //kernel32のヘッダから自前で取得する FARPROC pfn = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW"); //if(!pfn) // return false; @@ -653,7 +653,7 @@ emit_dw(0xD0FF); //call eax emit_db(0xFF); //jmp rdi emit_db(0xE6); - // gdi++.dll̃pX + // gdi++.dllのパス int nSize = GetModuleFileNameW(GetDLLInstance(), dllpath, MAX_PATH); if (nSize) { ChangeFileName(dllpath, nSize, L"MTBootStrap64.dll"); @@ -664,7 +664,7 @@ emit_dw(0xD0FF); //call eax }; #include -// ȫȡʵϵͳϢ +// 安全的取得真实系统信息 VOID SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo) { if (NULL == lpSystemInfo) return; @@ -696,7 +696,7 @@ int GetSystemBits() static bool bIsOS64 = GetSystemBits() == 64; // check if running in a x64 system. #ifdef _M_IX86 -// ~߂ĂvZXLoadLibraryR[h𒍓 +// 止めているプロセスにLoadLibraryするコードを注入 EXTERN_C BOOL WINAPI GdippInjectDLL(const PROCESS_INFORMATION* ppi) { BOOL bIsX64Proc = false; @@ -771,7 +771,7 @@ EXTERN_C BOOL WINAPI GdippInjectDLL(const PROCESS_INFORMATION* ppi) { WOW64_CONTEXT ctx = { 0 }; ctx.ContextFlags = CONTEXT_CONTROL; - //CREATE_SUSPENDEDȂ̂Ŋ{Iɐ͂ + //CREATE_SUSPENDEDなので基本的に成功するはず if(!Wow64GetThreadContext(ppi->hThread, &ctx)) return false; @@ -796,7 +796,7 @@ EXTERN_C BOOL WINAPI GdippInjectDLL(const PROCESS_INFORMATION* ppi) { CONTEXT ctx = { 0 }; ctx.ContextFlags = CONTEXT_CONTROL; - //CREATE_SUSPENDEDȂ̂Ŋ{Iɐ͂ + //CREATE_SUSPENDEDなので基本的に成功するはず if(!GetThreadContext(ppi->hThread, &ctx)) return false; diff --git a/ft - non-ref.cpp b/ft - non-ref.cpp index 18445a3..367521d 100644 --- a/ft - non-ref.cpp +++ b/ft - non-ref.cpp @@ -1,22 +1,22 @@ /* 2006-10-23(by 555) - * http://hp.vector.co.jp/authors/VA028002/winfreetype.c (higambana(FI)) - * ێʂ + * http://hp.vector.co.jp/authors/VA028002/winfreetype.c (higambana(菅野友紀)) + * を丸写し */ /* 2006-10-27(by 555) - * http://hp.vector.co.jp/authors/VA028002/freetype.html (higambana(FI)) - * QlɂĂ蒼 + * http://hp.vector.co.jp/authors/VA028002/freetype.html (higambana(菅野友紀)) + * を参考にしてやり直し */ /* 2006-10-29(by 555) - * 693(ƌĂԂƂɂ)͓̐IȊɂďoオEnEn\[X - * LTCg̕ύX_ɂ݂݂CB(x[Xgdi0164) + * 693氏(と呼ぶことにする)の精力的な活動によって出来上がったウハウハソースと + * 上記サイトの変更点を元にみみっちい修正。(ベースgdi0164) */ /* (by 555) - * ɐEnEnɂĂgdi0168 - * C^bNƃ{[hljB + * さらに線引きもウハウハにしてもらったgdi0168を元に + * イタリックとボールドを追加。 */ /* (by sy567) - * ̃ASYύXB - * K}␳Ă݂B + * 太字のアルゴリズムを変更。 + * ガンマ補正を実装してみる。 */ #include "override.h" #include "ft.h" @@ -43,7 +43,7 @@ #include "ft2vert.h" -FT_BitmapGlyphRec empty_glyph = {};//Ż +FT_BitmapGlyphRec empty_glyph = {};//优化控制字 #define FT_BOLD_LOW 15 #define IsFontBold(lf) ((lf).lfWeight >= FW_BOLD) @@ -102,12 +102,12 @@ class CAlphaBlend int alphatbl[256]; int tbl1[257]; BYTE tbl2[256 * 16 + 1]; - // ʏ̃At@l␳ + // 通常のアルファ値補正 int tunetbl[256]; int tunetblR[256]; int tunetblG[256]; int tunetblB[256]; - // ep̃At@l␳ + // 影文字用のアルファ値補正 int tunetblS[256]; int tunetblRS[256]; int tunetblGS[256]; @@ -379,7 +379,7 @@ FORCEINLINE BYTE DoAlphaBlend(BYTE fg, BYTE bg, int alpha) return s_AlphaBlendTable.doAB(fg, bg, alpha); } -// LCD(t)p̃At@uh(TusNZ_O) +// LCD(液晶)用のアルファブレンド(サブピクセルレンダリング) static FORCEINLINE COLORREF AlphaBlendColorLCD( COLORREF baseColor, @@ -394,7 +394,7 @@ COLORREF AlphaBlendColorLCD( BYTE rd = GetRValue(newColor); BYTE gd = GetGValue(newColor); BYTE bd = GetBValue(newColor); - // At@l␳ + // アルファ値を補正 alphaR = tableR[alphaR] / ftdi.params->alpha; alphaG = tableG[alphaG] / ftdi.params->alpha; alphaB = tableB[alphaB] / ftdi.params->alpha; @@ -407,7 +407,7 @@ COLORREF AlphaBlendColorLCD( return RGB(rd, gd, bd); } -// At@uh(256K) +// アルファブレンド(256階調) static FORCEINLINE COLORREF AlphaBlendColor( COLORREF baseColor, @@ -421,7 +421,7 @@ COLORREF AlphaBlendColor( BYTE rd = GetRValue(newColor); BYTE gd = GetGValue(newColor); BYTE bd = GetBValue(newColor); - // At@l␳ + // アルファ値を補正 alpha = table[alpha] / ftdi.params->alpha; // rd = (rs * (255 - alpha) + rd * alpha) / 255; // gd = (gs * (255 - alpha) + gd * alpha) / 255; @@ -447,7 +447,7 @@ typedef struct } FreeTypeGlyphInfo, *PFreeTypeGlyphInfo; -// 2K +// 2階調 static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -493,8 +493,8 @@ static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo, } } -// LCD(t)p`(TusNZ_O) -// RGB(̂͂) +// LCD(液晶)用描画(サブピクセルレンダリング) +// RGB順(のはず) static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -516,7 +516,7 @@ static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, DWORD * const cachebufp = (DWORD *)cache.GetPixels(); DWORD * cachebufrowp; - // LCD3TusNZ + // LCDは3サブピクセル分ある int left, top, width, height; if (x < 0) { left = -x * 3; @@ -546,8 +546,8 @@ static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, backColor = cachebufrowp[dx]; COLORREF last=0xFFFFFFFF; if(AAMode == 2 || AAMode == 4){ - // RGB̏ɃTusNZfBXvCp - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0] / alphatuner; alphaG = p[i + 1] / alphatuner; alphaB = p[i + 2] / alphatuner; @@ -584,8 +584,8 @@ static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, backColor = cachebufrowp[dx]; COLORREF last=0xFFFFFFFF; if(AAMode == 2 || AAMode == 4){ - // RGB̏ɃTusNZfBXvCp - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0]; alphaG = p[i + 1]; alphaB = p[i + 2]; @@ -659,14 +659,14 @@ static void FreeTypeDrawBitmapGray(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& } } -// Otrbg}bṽ_O +// グリフビットマップのレンダリング static void FreeTypeDrawBitmap( FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { if(FTGInfo.FTGlyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY){ - // ̊֐̂FT_PIXEL_MODE_GRAYɂ̂ݑΉɈϏ + // この関数自体はFT_PIXEL_MODE_GRAYにのみ対応し他に委譲する switch(FTGInfo.FTGlyph->bitmap.pixel_mode){ case FT_PIXEL_MODE_MONO: FreeTypeDrawBitmapPixelModeMono(FTGInfo, ab, x, y); @@ -675,15 +675,15 @@ static void FreeTypeDrawBitmap( FreeTypeDrawBitmapPixelModeLCD(FTGInfo, ab, x, y); break; default: - return; // Ή + return; // 未対応 } return; } FreeTypeDrawBitmapGray(FTGInfo, ab, x, y); } -// cp̃_O(Rsy蔲) -// 2K +// 縦書き用のレンダリング(コピペ手抜き) +// 2階調 static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -708,7 +708,7 @@ static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo, &bitmap->buffer[bitmap->pitch * j]; // down-flow for(i = 0, dx = y+width; i < width; ++i, --dx){ if((p[i / 8] & (1 << (7 - (i % 8)))) != 0){ - if (cache.GetPixel(dx, dy) != CLR_INVALID) { // dx dy G[`FbN + if (cache.GetPixel(dx, dy) != CLR_INVALID) { // dx dy エラーチェック cache.SetCurrentPixel(color); } } @@ -716,8 +716,8 @@ static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo, } } -// LCD(t)p`(TusNZ_O) -// RGB(̂͂) +// LCD(液晶)用描画(サブピクセルレンダリング) +// RGB順(のはず) static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -736,7 +736,7 @@ static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, const COLORREF color = FTGInfo.FTInfo->Color(); - // LCD3TusNZ + // LCDは3サブピクセル分ある const int width = bitmap->width; const int height = bitmap->rows; const int pitch = bitmap->pitch; @@ -756,7 +756,7 @@ static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, if (backColor == color || backColor == CLR_INVALID) continue; if(AAMode == 2 || AAMode == 4){ - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0] / alphatuner; alphaG = p[i + pitch] / alphatuner; alphaB = p[i + pitch * 2] / alphatuner; @@ -786,7 +786,7 @@ static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, if (backColor == color || backColor == CLR_INVALID) continue; if(AAMode == 2 || AAMode == 4){ - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0]; alphaG = p[i + pitch]; alphaB = p[i + pitch * 2]; @@ -842,7 +842,7 @@ void FreeTypeDrawBitmapGrayV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, i static void FreeTypeDrawBitmapV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, const int x, const int y) { if(FTGInfo.FTGlyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY){ - // ̊֐̂FT_PIXEL_MODE_GRAYɂ̂ݑΉɈϏ + // この関数自体はFT_PIXEL_MODE_GRAYにのみ対応し他に委譲する switch(FTGInfo.FTGlyph->bitmap.pixel_mode){ case FT_PIXEL_MODE_MONO: FreeTypeDrawBitmapPixelModeMonoV(FTGInfo, ab, x, y); @@ -851,7 +851,7 @@ static void FreeTypeDrawBitmapV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab FreeTypeDrawBitmapPixelModeLCDV(FTGInfo, ab, x, y); break; default: - return; // Ή + return; // 未対応 } return; } @@ -908,7 +908,7 @@ int CALLBACK CGGOGlyphLoader::EnumFontFamProc(const LOGFONT* lplf, const TEXTMET if (clazz) { pThis->m_clazz = clazz; - //񋓒~ + //列挙中止 return FALSE; } return TRUE; @@ -933,8 +933,8 @@ CGGOGlyphLoader::init(FT_Library freetype_library) m_lib = freetype_library; m_clazz = NULL; - //O̕@ƁAarial.ttfƂ܂Ȃ̂ - //KɎgAEgCtHgT + //前の方法だと、arial.ttfが無いとまずそうなので + //適当に使えるアウトラインフォントを探す HDC hdc = CreateCompatibleDC(NULL); EnumFontFamilies(hdc, NULL, EnumFontFamProc, reinterpret_cast(this)); DeleteDC(hdc); @@ -1188,7 +1188,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) scaler.face_id = face_id; - height = FTInfo.params->otm->otmTextMetrics.tmHeight - FTInfo.params->otm->otmTextMetrics.tmInternalLeading; //Snowie!!հ׸߶ȣbugfix + height = FTInfo.params->otm->otmTextMetrics.tmHeight - FTInfo.params->otm->otmTextMetrics.tmInternalLeading; //Snowie!!剪掉空白高度,bugfix。 // if(lf.lfHeight > 0){ // scaler.height = height; // } @@ -1207,7 +1207,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) else scaler.width = scaler.height; if (bVertical) - swap(scaler.width, scaler.height);//壬 + swap(scaler.width, scaler.height);//如果是竖向字体,交换宽高 //!!Snowie scaler.pixel = 1; scaler.x_res = 0; @@ -1252,12 +1252,12 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) size_request.horiResolution = 0; size_request.vertResolution = 0; if(lf.lfHeight > 0){ - // Z + // セル高さ size_request.type = FT_SIZE_REQUEST_TYPE_CELL; size_request.height = lf.lfHeight * 64; } else{ - // + // 文字高さ size_request.type = FT_SIZE_REQUEST_TYPE_NOMINAL; size_request.height = (-lf.lfHeight) * 64; } @@ -1266,7 +1266,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) switch (pSettings->FontLoader()) { case SETTING_FONTLOADER_FREETYPE: - // font_typeݒ + // font_typeを設定 font_type.face_id = face_id; font_type.width = scaler.width;//freetype_face->size->metrics.x_ppem; font_type.height = scaler.height;//freetype_face->size->metrics.y_ppem; @@ -1274,16 +1274,16 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) FTInfo.height = font_type.height; FTInfo.width = font_type.width; - /* rbg}bv܂ŃLbVꍇFT_LOAD_RENDER | FT_LOAD_TARGET_* - * ƂBrTARGETύXꍇ̓LbVזB - * FT_LOAD_DEFAULTɂFTC_ImageCache_Lookup - * FT_Glyph_To_BitmapقsƎvB + /* ビットマップまでキャッシュする場合はFT_LOAD_RENDER | FT_LOAD_TARGET_* + * とする。ただし途中でTARGETを変更した場合等はキャッシュが邪魔する。 + * そういう時はFT_LOAD_DEFAULTにしてFTC_ImageCache_Lookup後に + * FT_Glyph_To_Bitmapしたほうが都合がいいと思う。 */ - // Bold͑Ƃ̂̂Ŗ{͂ꂾł͑ȂCB + // Boldは太り具合というものがあるので本当はこれだけでは足りない気がする。 /*if(IsFontBold(lf) && !(freetype_face->style_flags & FT_STYLE_FLAG_BOLD) || lf.lfItalic && !(freetype_face->style_flags & FT_STYLE_FLAG_ITALIC)){ - // {[hAC^bN͌Ń_O - // x͗򉻂邾낤ǎdȂB + // ボールド、イタリックは後でレンダリングする + // 多少速度は劣化するだろうけど仕方ない。 font_type.flags = FT_LOAD_NO_BITMAP; } else{ @@ -1300,7 +1300,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) } font_type.flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; - // qeBO + // ヒンティング switch (pfs->GetHintingMode()) { case 0: // ignore. @@ -1314,7 +1314,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) } //如果含有内置hinting则启用default模式,否则使用autohint模式,以保证效果 - // A`GCAX + // アンチエイリアス if (FTInfo.IsMono()) { font_type.flags |= FT_LOAD_TARGET_MONO; render_mode = FT_RENDER_MODE_MONO; @@ -1345,7 +1345,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) } } - if (pSettings->HintSmallFont() && font_type.flags & FT_LOAD_TARGET_LIGHT && font_type.height!=-1 && font_type.height<12) //ͨòʹhintingǴСhinting + if (pSettings->HintSmallFont() && font_type.flags & FT_LOAD_TARGET_LIGHT && font_type.height!=-1 && font_type.height<12) //通用设置不使用hinting,但是打开了小字体hinting开关 { /* if (!(freetype_face->face_flags & FT_FACE_FLAG_TRICKY)) //如果不是tricky字体 @@ -1377,13 +1377,13 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) return TRUE; } -// cɂ‚true(ASCIIƔpJifalse) +// 縦にするやつはtrue(ASCIIと半角カナはfalse) inline bool IsVerticalChar(WCHAR wch){ if(wch < 0x80) return false; if(0xFF61 <= wch && wch <= 0xFF9F) return false; - // {͂Ɛ^ʖڂɂȂƂ܂B + // 本当はもっと真面目にやらないとまずいが。 return true; } @@ -1467,7 +1467,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, const CGdippSettings* pSettings = CGdippSettings::GetInstance(); //Snowie!! BOOL bIsSymbol = GetTextCharsetInfo(FTInfo.hdc, NULL, 0) == SYMBOL_CHARSET; - BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //ǷΪ + BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //是否为符号 BOOL nRet = true; BOOL bWindowsLink = pSettings->FontLink()==2; //!!Snowie @@ -1511,13 +1511,13 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, //Fast fontlink WORD ** lpfontlink = NULL; HFONT hOldFont = NULL; - if (!bGlyphIndex && bWindowsLink) //ʹWindows fontlink + if (!bGlyphIndex && bWindowsLink) //使用Windows fontlink { lpfontlink = (WORD**)new LPVOID[FTInfo.face_id_list_num]; for (int i=0;iBitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { - f_glyph=false; //ʹõ󣬲ͼ - *drState=FT_DRAW_EMBEDDED_BITMAP; //Ϊͼʽ + f_glyph=false; //使用点阵,不绘图 + *drState=FT_DRAW_EMBEDDED_BITMAP; //设置为点阵绘图方式 } } else if (wch && !CID.myiswcntrl(lpString[0])) { @@ -1588,29 +1588,29 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, for (int j = 0; j < FTInfo.face_id_list_num; ++j) { if (bWindowsLink) //使用Windows函数进行fontlink { - if (!lpfontlink[j][i]) //ûʼfontlink + if (!lpfontlink[j][i]) //还没初始化该字体的fontlink { SelectFont(FTInfo.hdc, FTInfo.ggo_font_list[j]); //加载ggo字体 - GetGlyphIndices(FTInfo.hdc, lpString, cbString-i, &lpfontlink[j][i], GGI_MARK_NONEXISTING_GLYPHS); //fontlink + GetGlyphIndices(FTInfo.hdc, lpString, cbString-i, &lpfontlink[j][i], GGI_MARK_NONEXISTING_GLYPHS); //进行fontlink SelectFont(FTInfo.hdc, hOldFont); } glyph_index = lpfontlink[j][i]; if (glyph_index==0xffff) glyph_index = 0; } - else //ʹfreetypefontlink + else //使用freetype进行fontlink { CCriticalSectionLock __lock(CCriticalSectionLock::CS_MANAGER); glyph_index = FTC_CMapCache_Lookup(cmap_cache,FTInfo.face_id_list[j],-1,wch); } if (glyph_index) { - GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //Ч֣ + GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //有效文字,计算宽度 f_glyph = true; FTInfo.font_type.face_id = FTInfo.face_id_list[j]; freetype_face = FTInfo.GetFace(j); //同时更新对应faceid的实际face //接下来更新对应的fontsetting FTInfo.font_type.flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; - // qeBO + // ヒンティング //extern CFontSetCache g_fsetcache; //pfs = g_fsetcache.Get(FTInfo.font_type.face_id); if (FTInfo.font_type.face_id==FTInfo.face_id_simsun && j>0) @@ -1636,7 +1636,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, FTInfo.font_type.flags |= FT_LOAD_FORCE_AUTOHINT; break; } - // A`GCAX + // アンチエイリアス if (FTInfo.IsMono()) { FTInfo.font_type.flags |= FT_LOAD_TARGET_MONO; render_mode = FT_RENDER_MODE_MONO; @@ -1666,7 +1666,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, break; } } - if (pSettings->HintSmallFont() && FTInfo.font_type.flags & FT_LOAD_TARGET_LIGHT && FTInfo.font_type.height!=-1 && FTInfo.font_type.height<12) //ͨòʹhintingǴСhinting + if (pSettings->HintSmallFont() && FTInfo.font_type.flags & FT_LOAD_TARGET_LIGHT && FTInfo.font_type.height!=-1 && FTInfo.font_type.height<12) //通用设置不使用hinting,但是打开了小字体hinting开关 FTInfo.font_type.flags = FTInfo.font_type.flags & (~FT_LOAD_NO_HINTING)/* | (pfi->FontHasHinting() ? FT_LOAD_DEFAULT : FT_LOAD_FORCE_AUTOHINT)*/; AAMode = *AAList/*pfs->GetAntiAliasMode()*/; @@ -1676,8 +1676,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } if (FTInfo.font_type.height<=pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { - f_glyph=false; //ʹõ󣬲ͼ - *drState=FT_DRAW_EMBEDDED_BITMAP; //Ϊͼʽ + f_glyph=false; //使用点阵,不绘图 + *drState=FT_DRAW_EMBEDDED_BITMAP; //设置为点阵绘图方式 } break; } @@ -1691,8 +1691,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, GdiSetBatchLimit(0); #endif if (*drState==FT_DRAW_NORMAL || bGlyphIndex) - *drState = FT_DRAW_NOTFOUND; //Ҳ - if ((!FTInfo.lpDx || lpString == lpEnd - 1) && !bGlyphIndex) //Ч֣ûŰŰһַ + *drState = FT_DRAW_NOTFOUND; //找不到文字 + if ((!FTInfo.lpDx || lpString == lpEnd - 1) && !bGlyphIndex) //无效文字,而且没有事先排版或者是排版的最后一个字符了 { GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); } @@ -1704,17 +1704,17 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, { if (wch) { - *glyph_bitmap = NULL; //Ч + *glyph_bitmap = NULL; //无效文字 //ORIG_ExtTextOutW(FTInfo.hdc, FTInfo.x, FTInfo.yTop, FTInfo.GetETO(), NULL, &wch, 1, NULL); } BOOL isc = bGlyphIndex ? false : (CID.myiswcntrl(*lpString)); if (isc == CNTRL_UNICODE_PLANE) bUnicodePlane = true; // else -// if (isc == CNTRL_ZERO_WIDTH) //Ԥ޿ȿ +// if (isc == CNTRL_ZERO_WIDTH) //预计算的无宽度控制字 // cx = 0; int dxWidth = clpdx.get(cx); - if (isc == CNTRL_COMPLEX_TEXT) // + if (isc == CNTRL_COMPLEX_TEXT) //控制字 { cx = dxWidth; //服从windows的宽度调度 //if (!dxWidth) @@ -1742,14 +1742,14 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, goto cont; } - // c + // 縦書き if(bVertical){ glyph_index = ft2vert_get_gid( (struct ft2vert_st *)freetype_face->generic.data, glyph_index); } - // J[jO + // カーニング if(useKerning){ if(previous != 0 && glyph_index){ FT_Vector delta; @@ -1762,7 +1762,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } - // c + // 縦横 if(bVertical && IsVerticalChar(wch)){ FTInfo.font_type.flags |= FT_LOAD_VERTICAL_LAYOUT; if(bLcdMode){ @@ -1874,7 +1874,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, FT_FixedToInt(FT_BitmapGlyph((*glyph_bitmap))->root.advance.x); { - int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //ÿ + int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //获得宽度 int left = FT_BitmapGlyph((*glyph_bitmap))->left; if (FTInfo.x + left< FTInfo.xBase) FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 @@ -1893,7 +1893,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, FTInfo.x += FTInfo.params->charExtra; //if (bSizeOnly || bOwnCache) { - //LbV + //キャッシュ化 if (glyph_index) { if (bGlyphIndex) { @@ -1904,7 +1904,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } cont: - *Dx = FTInfo.x; //DxλһַʼĻ׼λãһַʼλ + *Dx = FTInfo.x; //Dx的位置是下一个字符开始的基准位置,并不是下一个字符开始画的位置 ++Dx; } gdiexit: @@ -1926,7 +1926,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString const CGdippSettings* pSettings = CGdippSettings::GetInstance(); //Snowie!! BOOL bIsSymbol = GetTextCharsetInfo(FTInfo.hdc, NULL, 0) == SYMBOL_CHARSET; - BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //ǷΪ + BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //是否为符号 BOOL nRet = true; BOOL bWindowsLink = pSettings->FontLink()==2; //!!Snowie @@ -1979,13 +1979,13 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString //Fast fontlink WORD ** lpfontlink = NULL; HFONT hOldFont = NULL; - if (!bGlyphIndex && bWindowsLink) //ʹWindows fontlink + if (!bGlyphIndex && bWindowsLink) //使用Windows fontlink { lpfontlink = (WORD**)new LPVOID[FTInfo.face_id_list_num]; for (int i=0;ileft; if (FTInfo.x + left< FTInfo.xBase) FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 @@ -2280,7 +2280,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString FTInfo.x += FTInfo.params->charExtra; //if (bSizeOnly || bOwnCache) { - //LbV + //キャッシュ化 if (glyph_index) { if (bGlyphIndex) { @@ -2353,22 +2353,22 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) if (FTInfo->params->alpha>1) { FreeTypeDrawBitmapV(FTGInfo, *FTGInfo.shadow, FTInfo->x + FTInfo->sx, - FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left+glyph_bitmap->bitmap.width) -1 + FTInfo->sy);//Ӱ + FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left+glyph_bitmap->bitmap.width) -1 + FTInfo->sy);//画阴影 FTInfo->params->alpha = 1; } FreeTypeDrawBitmapV(FTGInfo,*FTGInfo.solid, FTInfo->x, - FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left+glyph_bitmap->bitmap.width) -1); // + FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left+glyph_bitmap->bitmap.width) -1); //画文字 }else{ if (FTInfo->params->alpha>1) { FreeTypeDrawBitmap(FTGInfo,*FTGInfo.shadow, FTInfo->x + glyph_bitmap->left + FTInfo->sx, - FTInfo->yBase - glyph_bitmap->top + FTInfo->sy); //Ӱ + FTInfo->yBase - glyph_bitmap->top + FTInfo->sy); //画阴影 FTInfo->params->alpha = 1; } FreeTypeDrawBitmap(FTGInfo,*FTGInfo.solid, FTInfo->x + glyph_bitmap->left, - FTInfo->yBase - glyph_bitmap->top); // + FTInfo->yBase - glyph_bitmap->top); //画文字 } } @@ -2378,9 +2378,9 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) int IsColorDark(DWORD Color, double Gamma) { - //return (GetRValue(Color)*0.299 + GetGValue(Color)*0.587 + GetBValue(Color)*0.114); //ԭʼ㷨 + //return (GetRValue(Color)*0.299 + GetGValue(Color)*0.587 + GetBValue(Color)*0.114); //原始算法 //=============================================================== - //Photoshop sRGBRGB->Lab㷨л㣬LΪɫӾ + //采用Photoshop sRGB的RGB->Lab算法进行换算,L为色彩视觉亮度 //感谢 西安理工大学 贾婉丽 的分析 //=============================================================== static double s_multipler = 116/pow(100,(double)1.0/3.0); //预计算常数,强制使用double版本 @@ -2450,10 +2450,10 @@ BOOL GetColorDiff(DWORD Color) }*/ BOOL FreeTypeTextOut( - const HDC hdc, // foCXReLXg̃nh + const HDC hdc, // デバイスコンテキストのハンドル CBitmapCache& cache, - LPCWSTR lpString, // - int cbString, // + LPCWSTR lpString, // 文字列 + int cbString, // 文字数 FreeTypeDrawInfo& FTInfo, FT_Glyph * Glyphs, FT_DRAW_STATE* drState @@ -2488,7 +2488,7 @@ BOOL FreeTypeTextOut( bDarkColor = lightdiff<=darkdiff; if (/*diff<10 || abs(lightdiff-darkdiff)<20 &&*/ pSettings->ShadowDarkColor()==pSettings->ShadowLightColor()) { - //ӵɫ⣬ǿƿӰ + //无视底色问题,强制开启阴影 FTInfo.params->alphatuner = 1; } else @@ -2497,7 +2497,7 @@ BOOL FreeTypeTextOut( if (diff<10) FTInfo.params->alpha = 1; else - FTInfo.params->alphatuner = max(1, 100/diff); //ɫӰŨ + FTInfo.params->alphatuner = max(1, 100/diff); //根据色差调整阴影浓度 } } char mode = (*Glyphs)? FT_BitmapGlyph((*Glyphs))->bitmap.pixel_mode:FT_PIXEL_MODE_LCD; @@ -2559,14 +2559,14 @@ BOOL FreeTypeTextOut( int x = FTInfo.x; int y = FTInfo.yBase; - // () + // 下線を(あれば)引く if(lf.lfUnderline || lf.lfStrikeOut) { OUTLINETEXTMETRIC &otm = *FTInfo.params->otm; if(lf.lfUnderline){ - int yPos = 0; //̈ʒu + int yPos = 0; //下線の位置 int height = 0; - int thickness = 0; // Kȑ + int thickness = 0; // 適当な太さ switch (pSettings->FontLoader()) { case SETTING_FONTLOADER_FREETYPE: yPos = y - otm.otmsUnderscorePosition; @@ -2608,7 +2608,7 @@ BOOL FreeTypeTextOut( return TRUE; } -BOOL FreeTypeGetGlyph( //ͼκҪĿ +BOOL FreeTypeGetGlyph( //获得所有图形和需要的宽度 FreeTypeDrawInfo& FTInfo, LPCWSTR lpString, int cbString, @@ -2633,7 +2633,7 @@ BOOL FreeTypeTextOut( nRet = ForEachGetGlyphGGO(FTInfo,lpString,cbString,Glyphs,drState); break; } - width = FTInfo.px; //˿ + width = FTInfo.px; //获得了宽度 return nRet; } @@ -2644,9 +2644,9 @@ void VertFinalizer(void *object){ ft2vert_final(face, (struct ft2vert_st *)face->generic.data); } // -// OtIVSŎw肳ꂽ`T|[g邩ǂׁA -// T|[gĂꍇ̓OtuB -// T|[gĂȂΉȂB +// グリフをIVSで指定された字形をサポートするかどうか調べ、 +// サポートしている場合はグリフを置換する。 +// サポートしていなければ何もしない。 // /* void FreeTypeSubstGlyph(const HDC hdc, @@ -2676,14 +2676,14 @@ void FreeTypeSubstGlyph(const HDC hdc, FT_UInt glyph_index = ft2_subst_uvs(FTInfo.freetype_face, pwOutGlyphs[*pcGlyphs - 1], vsindex, baseChar); TRACE(_T("FreeTypeSubstGlyph: %04X->%04X\n"), pwOutGlyphs[*pcGlyphs - 1], glyph_index); if (glyph_index) { - pwOutGlyphs[*pcGlyphs - 1] = glyph_index; // us - // ASCII󔒂̃Ot擾 + pwOutGlyphs[*pcGlyphs - 1] = glyph_index; // 置換を実行 + // ASCII空白のグリフを取得 glyph_index = FTC_CMapCache_Lookup( cmap_cache, FTInfo.font_type.face_id, FTInfo.cmap_index, ' '); - // [Otɂ + // ゼロ幅グリフにする pwOutGlyphs[*pcGlyphs] = glyph_index; psva[*pcGlyphs].uJustification = SCRIPT_JUSTIFY_NONE; psva[*pcGlyphs].fClusterStart = 0; @@ -2692,14 +2692,14 @@ void FreeTypeSubstGlyph(const HDC hdc, psva[*pcGlyphs].fReserved = 0; psva[*pcGlyphs].fShapeReserved = 0; } else { - // tHg͎w肳ꂽ`ȂBIVS̃Ot擾 + // フォントは指定された字形を持たない。IVSのグリフを取得 glyph_index = FTC_CMapCache_Lookup( cmap_cache, FTInfo.font_type.face_id, FTInfo.cmap_index, vsindex + 0xE0100); - // IVST|[gĂȂtHgIVS̃OtÔ\قƂǂȂB - // missing glyphԂƃtH[obNĂ܂ߊmɎĂȃOtE + // IVSをサポートしていないフォントはIVSのグリフを持っている可能性もほとんどない。 + // missing glyphを返すとフォールバックされてしまうため確実に持っていそうなグリフを拾う if (!glyph_index) glyph_index = FTC_CMapCache_Lookup( cmap_cache, @@ -2732,7 +2732,7 @@ FT_Error face_requester( } LPCTSTR fontname = pfi->GetName(); - // ̂w肵ătHg擾 + // 名称を指定してフォントを取得 FreeTypeSysFontData* pData = FreeTypeSysFontData::CreateInstance(fontname, pfi->GetFontWeight(), pfi->IsItalic()); if(pData == NULL){ return FT_Err_Cannot_Open_Resource; @@ -2741,7 +2741,7 @@ FT_Error face_requester( face = pData->GetFace(); Assert(face != NULL); - // Charmapݒ肵Ă + // Charmapを設定しておく ret = FT_Select_Charmap(face, FT_ENCODING_UNICODE); if(ret != FT_Err_Ok) ret = FT_Select_Charmap(face, FT_ENCODING_MS_SYMBOL); @@ -2788,12 +2788,12 @@ DWORD FreeTypeGetVersion() { int major = 0, minor = 0, patch = 0; FT_Library_Version(freetype_library, &major, &minor, &patch); - //ʓ|Ȃ̂RGB}Ngp + //面倒なのでRGBマクロ使用 return RGB(major, minor, patch); }*/ -//VASY +//新太字アルゴリズム FT_Error New_FT_Outline_Embolden( FT_Outline* outline, FT_Pos str_h, FT_Pos str_v, FT_Int font_size ) { const CGdippSettings* pSettings = CGdippSettings::GetInstance(); @@ -2826,7 +2826,7 @@ FT_Error New_FT_Outline_Embolden( FT_Outline* outline, FT_Pos str_h, FT_Pos str } } -//点FT_Outline_Embolden +//横方向だけ太らせるFT_Outline_Embolden FT_Error Old_FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ) { FT_Vector* points; @@ -2901,7 +2901,7 @@ FT_Error Old_FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ) } outline->points[n].x = v_cur.x + strength + in.x; - //RgAEg + //↓これをコメントアウトしただけ //outline->points[n].y = v_cur.y + strength + in.y; v_prev = v_cur; @@ -2914,7 +2914,7 @@ FT_Error Old_FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ) return FT_Err_Ok; } -//͏c +//こっちは縦方向 FT_Error Vert_FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ) { FT_Vector* points; @@ -2989,7 +2989,7 @@ FT_Error Vert_FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ) } //outline->points[n].x = v_cur.x + strength + in.x; - //RgAEg + //↑これをコメントアウトしただけ outline->points[n].y = v_cur.y + strength + in.y; v_prev = v_cur; @@ -3002,7 +3002,7 @@ FT_Error Vert_FT_Outline_Embolden( FT_Outline* outline, FT_Pos strength ) return FT_Err_Ok; } -//_~[ +//ダミー FT_EXPORT( FT_Error ) FT_Library_SetLcdFilter_Dummy( FT_Library /*library*/, FT_LcdFilter /*filter*/ ) diff --git a/ft.cpp b/ft.cpp index d72c516..cdde467 100644 --- a/ft.cpp +++ b/ft.cpp @@ -1,9 +1,9 @@ /* 2006-10-23(by 555) -* http://hp.vector.co.jp/authors/VA028002/winfreetype.c (higambana(ҰѼo)) -* д +* http://hp.vector.co.jp/authors/VA028002/winfreetype.c (higambana(菅野友紀)) +* を丸写し */ /* 2006-10-27(by 555) -* http://hp.vector.co.jp/authors/VA028002/freetype.html (higambana(ҰѼo)) +* http://hp.vector.co.jp/authors/VA028002/freetype.html (higambana(菅野友紀)) * を参考にしてやり直し */ /* 2006-10-29(by 555) @@ -46,7 +46,7 @@ #include "colorinvert.h" -FT_BitmapGlyphRec empty_glyph = {};//Ż +FT_BitmapGlyphRec empty_glyph = {};//优化控制字 #define FT_BOLD_LOW 15 #define IsFontBold(lf) ((lf).lfWeight >= FW_BOLD) @@ -115,12 +115,12 @@ class CAlphaBlend std::vector alphatbl; std::vector tbl1; std::vector tbl2; - // ʏ̃At@l␳ + // 通常のアルファ値補正 std::vector tunetbl; std::vector tunetblR; std::vector tunetblG; std::vector tunetblB; - // ep̃At@l␳ + // 影文字用のアルファ値補正 std::vector tunetblS; std::vector tunetblRS; std::vector tunetblGS; @@ -420,7 +420,7 @@ FORCEINLINE BYTE DoAlphaBlend(BYTE fg, BYTE bg, int alpha) return s_AlphaBlendTable.doAB(fg, bg, alpha); } -// LCD(t)p̃At@uh(TusNZ_O) +// LCD(液晶)用のアルファブレンド(サブピクセルレンダリング) static FORCEINLINE COLORREF AlphaBlendColorLCD( COLORREF baseColor, @@ -435,7 +435,7 @@ COLORREF AlphaBlendColorLCD( BYTE rd = GetRValue(newColor); BYTE gd = GetGValue(newColor); BYTE bd = GetBValue(newColor); - // At@l␳ + // アルファ値を補正 alphaR = tableR[alphaR] / ftdi.params->alpha; alphaG = tableG[alphaG] / ftdi.params->alpha; alphaB = tableB[alphaB] / ftdi.params->alpha; @@ -448,7 +448,7 @@ COLORREF AlphaBlendColorLCD( return RGB(rd, gd, bd); } -// At@uh(256K) +// アルファブレンド(256階調) static FORCEINLINE COLORREF AlphaBlendColor( COLORREF baseColor, @@ -462,7 +462,7 @@ COLORREF AlphaBlendColor( BYTE rd = GetRValue(newColor); BYTE gd = GetGValue(newColor); BYTE bd = GetBValue(newColor); - // At@l␳ + // アルファ値を補正 alpha = table[alpha] / ftdi.params->alpha; // rd = (rs * (255 - alpha) + rd * alpha) / 255; // gd = (gs * (255 - alpha) + gd * alpha) / 255; @@ -489,7 +489,7 @@ typedef struct } FreeTypeGlyphInfo, *PFreeTypeGlyphInfo; -// 2K +// 2階調 static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -536,8 +536,8 @@ static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo, } } -// LCD(t)p`(TusNZ_O) -// RGB(̂͂) +// LCD(液晶)用描画(サブピクセルレンダリング) +// RGB順(のはず) static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -559,7 +559,7 @@ static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, DWORD * const cachebufp = (DWORD *)cache.GetPixels(); DWORD * cachebufrowp; - // LCD3TusNZ + // LCDは3サブピクセル分ある int left, top, width, height; if (x < 0) { left = -x * 3; @@ -590,8 +590,8 @@ static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, backColor = cachebufrowp[dx]; COLORREF last = 0xFFFFFFFF; if (AAMode == 2 || AAMode == 4) { - // RGB̏ɃTusNZfBXvCp - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0] / alphatuner; alphaG = p[i + 1] / alphatuner; alphaB = p[i + 2] / alphatuner; @@ -629,8 +629,8 @@ static void FreeTypeDrawBitmapPixelModeLCD(FreeTypeGlyphInfo& FTGInfo, backColor = cachebufrowp[dx]; COLORREF last = 0xFFFFFFFF; if (AAMode == 2 || AAMode == 4) { - // RGB̏ɃTusNZfBXvCp - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0]; alphaG = p[i + 1]; alphaB = p[i + 2]; @@ -795,14 +795,14 @@ static void FreeTypeDrawBitmapGray(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& } } -// Otrbg}bṽ_O +// グリフビットマップのレンダリング static bool FreeTypeDrawBitmap( FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { if (FTGInfo.FTGlyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) { - // ̊֐̂FT_PIXEL_MODE_GRAYɂ̂ݑΉɈϏ + // この関数自体はFT_PIXEL_MODE_GRAYにのみ対応し他に委譲する switch (FTGInfo.FTGlyph->bitmap.pixel_mode) { case FT_PIXEL_MODE_MONO: FreeTypeDrawBitmapPixelModeMono(FTGInfo, ab, x, y); @@ -814,7 +814,7 @@ static bool FreeTypeDrawBitmap( FreeTypeDrawBitmapPixelModeBGRA(FTGInfo, x, y); break; default: - return false; // Ή + return false; // 未対応 } return true; } @@ -822,8 +822,8 @@ static bool FreeTypeDrawBitmap( return true; } -// cp̃_O(Rsy蔲) -// 2K +// 縦書き用のレンダリング(コピペ手抜き) +// 2階調 static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -848,7 +848,7 @@ static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo, &bitmap->buffer[bitmap->pitch * j]; // down-flow for (i = 0, dx = y + width; i < width; ++i, --dx) { if ((p[i / 8] & (1 << (7 - (i % 8)))) != 0) { - if (cache.GetPixel(dx, dy) != CLR_INVALID) { // dx dy G[`FbN + if (cache.GetPixel(dx, dy) != CLR_INVALID) { // dx dy エラーチェック cache.SetCurrentPixel(color); } } @@ -856,8 +856,8 @@ static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo, } } -// LCD(t)p`(TusNZ_O) -// RGB(̂͂) +// LCD(液晶)用描画(サブピクセルレンダリング) +// RGB順(のはず) static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, int x, int y) { @@ -876,7 +876,7 @@ static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, const COLORREF color = FTGInfo.FTInfo->Color(); - // LCD3TusNZ + // LCDは3サブピクセル分ある const int width = bitmap->width; const int height = bitmap->rows; const int pitch = bitmap->pitch; @@ -896,7 +896,7 @@ static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, if (backColor == color || backColor == CLR_INVALID) continue; if (AAMode == 2 || AAMode == 4) { - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0] / alphatuner; alphaG = p[i + pitch] / alphatuner; alphaB = p[i + pitch * 2] / alphatuner; @@ -927,7 +927,7 @@ static void FreeTypeDrawBitmapPixelModeLCDV(FreeTypeGlyphInfo& FTGInfo, if (backColor == color || backColor == CLR_INVALID) continue; if (AAMode == 2 || AAMode == 4) { - // RGB̏ɃTusNZfBXvCp + // これはRGBの順にサブピクセルがあるディスプレイ用 alphaR = p[i + 0]; alphaG = p[i + pitch]; alphaB = p[i + pitch * 2]; @@ -984,7 +984,7 @@ void FreeTypeDrawBitmapGrayV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, i static bool FreeTypeDrawBitmapV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab, const int x, const int y) { if (FTGInfo.FTGlyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) { - // ̊֐̂FT_PIXEL_MODE_GRAYɂ̂ݑΉɈϏ + // この関数自体はFT_PIXEL_MODE_GRAYにのみ対応し他に委譲する switch (FTGInfo.FTGlyph->bitmap.pixel_mode) { case FT_PIXEL_MODE_MONO: FreeTypeDrawBitmapPixelModeMonoV(FTGInfo, ab, x, y); @@ -996,7 +996,7 @@ static bool FreeTypeDrawBitmapV(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor& ab FreeTypeDrawBitmapPixelModeBGRA(FTGInfo, x, y); break; default: - return false; // Ή + return false; // 未対応 } return true; } @@ -1055,7 +1055,7 @@ int CALLBACK CGGOGlyphLoader::EnumFontFamProc(const LOGFONT* lplf, const TEXTMET if (clazz) { pThis->m_clazz = clazz; - //񋓒~ + //列挙中止 return FALSE; } return TRUE; @@ -1080,8 +1080,8 @@ CGGOGlyphLoader::init(FT_Library freetype_library) m_lib = freetype_library; m_clazz = NULL; - //O̕@ƁAarial.ttfƂ܂Ȃ̂ - //KɎgAEgCtHgT + //前の方法だと、arial.ttfが無いとまずそうなので + //適当に使えるアウトラインフォントを探す HDC hdc = CreateCompatibleDC(NULL); EnumFontFamilies(hdc, NULL, EnumFontFamProc, reinterpret_cast(this)); DeleteDC(hdc); @@ -1337,7 +1337,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) scaler.face_id = face_id; - height = FTInfo.params->otm->otmTextMetrics.tmHeight - FTInfo.params->otm->otmTextMetrics.tmInternalLeading; //Snowie!!հ׸߶ȣbugfix + height = FTInfo.params->otm->otmTextMetrics.tmHeight - FTInfo.params->otm->otmTextMetrics.tmInternalLeading; //Snowie!!剪掉空白高度,bugfix。 // if(lf.lfHeight > 0){ // scaler.height = height; // } @@ -1356,7 +1356,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) else scaler.width = scaler.height; if (bVertical) - swap(scaler.width, scaler.height);//壬 + swap(scaler.width, scaler.height);//如果是竖向字体,交换宽高 //!!Snowie scaler.pixel = 1; scaler.x_res = 0; @@ -1403,12 +1403,12 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) size_request.horiResolution = 0; size_request.vertResolution = 0; if(lf.lfHeight > 0){ - // Z + // セル高さ size_request.type = FT_SIZE_REQUEST_TYPE_CELL; size_request.height = lf.lfHeight * 64; } else{ - // + // 文字高さ size_request.type = FT_SIZE_REQUEST_TYPE_NOMINAL; size_request.height = (-lf.lfHeight) * 64; } @@ -1417,7 +1417,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) switch (pSettings->FontLoader()) { case SETTING_FONTLOADER_FREETYPE: - // font_typeݒ + // font_typeを設定 font_type.face_id = face_id; font_type.width = scaler.width;//freetype_face->size->metrics.x_ppem; font_type.height = scaler.height;//freetype_face->size->metrics.y_ppem; @@ -1425,16 +1425,16 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) FTInfo.height = font_type.height; FTInfo.width = font_type.width; - /* rbg}bv܂ŃLbVꍇFT_LOAD_RENDER | FT_LOAD_TARGET_* - * ƂBrTARGETύXꍇ̓LbVזB - * FT_LOAD_DEFAULTɂFTC_ImageCache_Lookup - * FT_Glyph_To_BitmapقsƎvB + /* ビットマップまでキャッシュする場合はFT_LOAD_RENDER | FT_LOAD_TARGET_* + * とする。ただし途中でTARGETを変更した場合等はキャッシュが邪魔する。 + * そういう時はFT_LOAD_DEFAULTにしてFTC_ImageCache_Lookup後に + * FT_Glyph_To_Bitmapしたほうが都合がいいと思う。 */ - // Bold͑Ƃ̂̂Ŗ{͂ꂾł͑ȂCB + // Boldは太り具合というものがあるので本当はこれだけでは足りない気がする。 /*if(IsFontBold(lf) && !(freetype_face->style_flags & FT_STYLE_FLAG_BOLD) || lf.lfItalic && !(freetype_face->style_flags & FT_STYLE_FLAG_ITALIC)){ - // {[hAC^bN͌Ń_O - // x͗򉻂邾낤ǎdȂB + // ボールド、イタリックは後でレンダリングする + // 多少速度は劣化するだろうけど仕方ない。 font_type.flags = FT_LOAD_NO_BITMAP; } else{ @@ -1451,7 +1451,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) } font_type.flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; - // qeBO + // ヒンティング switch (pfs->GetHintingMode()) { case 0: // ignore. @@ -1465,7 +1465,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) } //如果含有内置hinting则启用default模式,否则使用autohint模式,以保证效果 - // A`GCAX + // アンチエイリアス if (FTInfo.IsMono()) { font_type.flags |= FT_LOAD_TARGET_MONO; render_mode = FT_RENDER_MODE_MONO; @@ -1497,7 +1497,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) } } - if (pSettings->HintSmallFont() /*&& font_type.flags & FT_LOAD_TARGET_LIGHT*/ && font_type.height != -1 && font_type.height<12) //ͨòʹhintingǴСhinting + if (pSettings->HintSmallFont() /*&& font_type.flags & FT_LOAD_TARGET_LIGHT*/ && font_type.height != -1 && font_type.height<12) //通用设置不使用hinting,但是打开了小字体hinting开关 { /* if (!(freetype_face->face_flags & FT_FACE_FLAG_TRICKY)) //如果不是tricky字体 @@ -1529,13 +1529,13 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo) return TRUE; } -// cɂ‚true(ASCIIƔpJifalse) +// 縦にするやつはtrue(ASCIIと半角カナはfalse) inline bool IsVerticalChar(WCHAR wch) { if (wch < 0x80) return false; if (0xFF61 <= wch && wch <= 0xFF9F) return false; - // {͂Ɛ^ʖڂɂȂƂ܂B + // 本当はもっと真面目にやらないとまずいが。 return true; } @@ -1631,7 +1631,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, const CGdippSettings* pSettings = CGdippSettings::GetInstance(); //Snowie!! BOOL bIsSymbol = GetTextCharsetInfo(FTInfo.hdc, NULL, 0) == SYMBOL_CHARSET; - BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //ǷΪ + BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //是否为符号 BOOL nRet = true; BOOL bWindowsLink = pSettings->FontLink() == 2; //!!Snowie @@ -1676,13 +1676,13 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, //Fast fontlink WORD ** lpfontlink = NULL; HFONT hOldFont = NULL; - if (!bGlyphIndex && bWindowsLink) //ʹWindows fontlink + if (!bGlyphIndex && bWindowsLink) //使用Windows fontlink { lpfontlink = (WORD**)new LPVOID[FTInfo.face_id_list_num]; for (int i = 0; iBitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { - f_glyph = false; //ʹõ󣬲ͼ - *drState = FT_DRAW_EMBEDDED_BITMAP; //Ϊͼʽ + f_glyph = false; //使用点阵,不绘图 + *drState = FT_DRAW_EMBEDDED_BITMAP; //设置为点阵绘图方式 } } else @@ -1765,30 +1765,30 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, freetype_face = NULL; // reinitialize it in case no fontlinking is available. if (bWindowsLink) //使用Windows函数进行fontlink { - if (!lpfontlink[j][i]) //ûʼfontlink + if (!lpfontlink[j][i]) //还没初始化该字体的fontlink { SelectFont(FTInfo.hdc, FTInfo.ggo_font_list[j]); //加载ggo字体 - GetGlyphIndices(FTInfo.hdc, lpString, cbString - i, &lpfontlink[j][i], GGI_MARK_NONEXISTING_GLYPHS); //fontlink + GetGlyphIndices(FTInfo.hdc, lpString, cbString - i, &lpfontlink[j][i], GGI_MARK_NONEXISTING_GLYPHS); //进行fontlink SelectFont(FTInfo.hdc, hOldFont); } glyph_index = lpfontlink[j][i]; if (glyph_index == 0xffff) glyph_index = 0; } - else //ʹfreetypefontlink + else //使用freetype进行fontlink { CCriticalSectionLock __lock(CCriticalSectionLock::CS_MANAGER); glyph_index = FTC_CMapCache_Lookup(cmap_cache, FTInfo.face_id_list[j], -1, wch); //glyph_index = FT_Get_Char_Index(FTInfo.GetFace(j), wch); } if (glyph_index) { - GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //Ч֣ + GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //有效文字,计算宽度 f_glyph = true; FTInfo.font_type.face_id = FTInfo.face_id_list[j]; freetype_face = FTInfo.GetFace(j); //同时更新对应faceid的实际face //接下来更新对应的fontsetting FTInfo.font_type.flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; - // qeBO + // ヒンティング //extern CFontSetCache g_fsetcache; //pfs = g_fsetcache.Get(FTInfo.font_type.face_id); if (FTInfo.font_type.face_id == FTInfo.face_id_simsun && j>0) @@ -1814,7 +1814,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, FTInfo.font_type.flags |= FT_LOAD_FORCE_AUTOHINT; break; } - // A`GCAX + // アンチエイリアス if (FTInfo.IsMono()) { FTInfo.font_type.flags |= FT_LOAD_TARGET_MONO; render_mode = FT_RENDER_MODE_MONO; @@ -1845,7 +1845,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, break; } } - if (pSettings->HintSmallFont() && FTInfo.font_type.flags & FT_LOAD_TARGET_LIGHT && FTInfo.font_type.height != -1 && FTInfo.font_type.height<12) //ͨòʹhintingǴСhinting + if (pSettings->HintSmallFont() && FTInfo.font_type.flags & FT_LOAD_TARGET_LIGHT && FTInfo.font_type.height != -1 && FTInfo.font_type.height<12) //通用设置不使用hinting,但是打开了小字体hinting开关 FTInfo.font_type.flags = FTInfo.font_type.flags & (~FT_LOAD_NO_HINTING)/* | (pfi->FontHasHinting() ? FT_LOAD_DEFAULT : FT_LOAD_FORCE_AUTOHINT)*/; AAMode = *AAList/*pfs->GetAntiAliasMode()*/; @@ -1855,8 +1855,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } if (FTInfo.font_type.height <= pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height)) { - f_glyph = false; //ʹõ󣬲ͼ - *drState = FT_DRAW_EMBEDDED_BITMAP; //Ϊͼʽ + f_glyph = false; //使用点阵,不绘图 + *drState = FT_DRAW_EMBEDDED_BITMAP; //设置为点阵绘图方式 } break; } @@ -1870,8 +1870,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, GdiSetBatchLimit(0); #endif if (*drState == FT_DRAW_NORMAL || bGlyphIndex) - *drState = FT_DRAW_NOTFOUND; //Ҳ - if ((!FTInfo.lpDx || lpString == lpEnd - 1) && !bGlyphIndex) //Ч֣ûŰŰһַ + *drState = FT_DRAW_NOTFOUND; //找不到文字 + if ((!FTInfo.lpDx || lpString == lpEnd - 1) && !bGlyphIndex) //无效文字,而且没有事先排版或者是排版的最后一个字符了 { GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); } @@ -1883,7 +1883,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, { if (wch) { - *glyph_bitmap = NULL; //Ч + *glyph_bitmap = NULL; //无效文字 //ORIG_ExtTextOutW(FTInfo.hdc, FTInfo.x, FTInfo.yTop, FTInfo.GetETO(), NULL, &wch, 1, NULL); } BOOL isc = bGlyphIndex ? false : (CID.myiswcntrl(*lpString)); @@ -1899,12 +1899,12 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, bUnicodePlane = true; } // else - // if (isc == CNTRL_ZERO_WIDTH) //Ԥ޿ȿ + // if (isc == CNTRL_ZERO_WIDTH) //预计算的无宽度控制字 // cx = 0; int dyHeight = clpdx.gety(0); int dxWidth = clpdx.get(cx); - if (isc == CNTRL_COMPLEX_TEXT) // + if (isc == CNTRL_COMPLEX_TEXT) //控制字 { cx = dxWidth; //服从windows的宽度调度 //if (!dxWidth) @@ -1934,14 +1934,14 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, goto cont; } - // k + // 縦書き if (bVertical) { glyph_index = ft2vert_get_gid( (struct ft2vert_st *)freetype_face->generic.data, glyph_index); } - // `˥ + // カーニング if (useKerning) { if (previous != 0 && glyph_index) { FT_Vector delta; @@ -2004,7 +2004,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, goto gdiexit; } glyph = New_FT_Ref_Glyph(); - FT_Glyph_Copy(temp_glyph, &(glyph->ft_glyph)); //תΪref_glyph + FT_Glyph_Copy(temp_glyph, &(glyph->ft_glyph)); //转换为ref_glyph } FTInfo.font_type.height = FTInfo.height; @@ -2078,8 +2078,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, FT_FixedToInt(FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->root.advance.x); { - int dy = clpdx.gety(0); //ø߶ - int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //ÿ + int dy = clpdx.gety(0); //获得高度 + int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //获得宽度 int left = FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->left; if (gdi32x == 0) { // zero width text (most likely a diacritic) if (FTInfo.x + dx + left < FTInfo.xBase) @@ -2111,7 +2111,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, FTInfo.x += FTInfo.params->charExtra; //if (bSizeOnly || bOwnCache) { - //LbV + //キャッシュ化 if (glyph_index) { if (bGlyphIndex) { @@ -2123,7 +2123,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString, } cont: - *Dx = FTInfo.x; //DxλһַʼĻ׼λãһַʼλ + *Dx = FTInfo.x; //Dx的位置是下一个字符开始的基准位置,并不是下一个字符开始画的位置 *Dy = FTInfo.y; //Dy的位置是下一个字符的y坐标 ++Dx; ++Dy; @@ -2147,7 +2147,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString const CGdippSettings* pSettings = CGdippSettings::GetInstance(); //Snowie!! BOOL bIsSymbol = GetTextCharsetInfo(FTInfo.hdc, NULL, 0) == SYMBOL_CHARSET; - BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //ǷΪ + BOOL bAllowDefaultLink = pSettings->GetFontLinkInfo().IsAllowFontLink((BYTE)GetTextCharsetInfo(FTInfo.hdc, NULL, 0)); //是否为符号 BOOL nRet = true; BOOL bWindowsLink = pSettings->FontLink() == 2; //!!Snowie @@ -2200,13 +2200,13 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString //Fast fontlink WORD ** lpfontlink = NULL; HFONT hOldFont = NULL; - if (!bGlyphIndex && bWindowsLink) //ʹWindows fontlink + if (!bGlyphIndex && bWindowsLink) //使用Windows fontlink { lpfontlink = (WORD**)new LPVOID[FTInfo.face_id_list_num]; for (int i = 0; ift_glyph)->left; if (FTInfo.x + left< FTInfo.xBase) FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置 @@ -2510,7 +2510,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString FTInfo.x += FTInfo.params->charExtra; //if (bSizeOnly || bOwnCache) { - //LbV + //キャッシュ化 if (glyph_index) { if (bGlyphIndex) { @@ -2587,11 +2587,11 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) if (FTInfo->params->alpha>1) { FreeTypeDrawBitmapV(FTGInfo, *FTGInfo.shadow, FTInfo->x + FTInfo->sx, - FTInfo->yTop + FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left + glyph_bitmap->bitmap.width) - 1 + FTInfo->sy);//Ӱ + FTInfo->yTop + FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left + glyph_bitmap->bitmap.width) - 1 + FTInfo->sy);//画阴影 FTInfo->params->alpha = 1; } if (!FreeTypeDrawBitmapV(FTGInfo, *FTGInfo.solid, FTInfo->x, - FTInfo->yTop + FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left + glyph_bitmap->bitmap.width) - 1)) // + FTInfo->yTop + FTInfo->params->otm->otmTextMetrics.tmHeight - (glyph_bitmap->left + glyph_bitmap->bitmap.width) - 1)) //画文字 { // fallback to GDI when fail to draw with FT ORIG_ExtTextOutW(FTInfo->hdc, FTInfo->x, FTInfo->yTop, FTInfo->GetETO(), NULL, &FTGInfo.wch, 1, NULL); @@ -2602,12 +2602,12 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) { FreeTypeDrawBitmap(FTGInfo, *FTGInfo.shadow, FTInfo->x + glyph_bitmap->left + FTInfo->sx, - FTInfo->yTop + FTInfo->yBase - glyph_bitmap->top + FTInfo->sy); //Ӱ + FTInfo->yTop + FTInfo->yBase - glyph_bitmap->top + FTInfo->sy); //画阴影 FTInfo->params->alpha = 1; } if (!FreeTypeDrawBitmap(FTGInfo, *FTGInfo.solid, FTInfo->x + glyph_bitmap->left, - FTInfo->yTop + FTInfo->yBase - glyph_bitmap->top)) // + FTInfo->yTop + FTInfo->yBase - glyph_bitmap->top)) //画文字 { // fallback to GDI when fail to draw with FT ORIG_ExtTextOutW(FTInfo->hdc, FTInfo->x, FTInfo->yTop, FTInfo->GetETO(), NULL, &FTGInfo.wch, 1, NULL); @@ -2621,9 +2621,9 @@ BOOL CALLBACK TextOutCallback(FreeTypeGlyphInfo& FTGInfo) int IsColorDark(DWORD Color, double Gamma) { - //return (GetRValue(Color)*0.299 + GetGValue(Color)*0.587 + GetBValue(Color)*0.114); //ԭʼ㷨 + //return (GetRValue(Color)*0.299 + GetGValue(Color)*0.587 + GetBValue(Color)*0.114); //原始算法 //=============================================================== - //Photoshop sRGBRGB->Lab㷨л㣬LΪɫӾ + //采用Photoshop sRGB的RGB->Lab算法进行换算,L为色彩视觉亮度 //感谢 西安理工大学 贾婉丽 的分析 //=============================================================== static double s_multipler = 116 / pow(100, (double)1.0 / 3.0); //预计算常数,强制使用double版本 @@ -2693,10 +2693,10 @@ return cd==cl ? IsColorDark(Color)<0.7 : cd>cl;* / }*/ BOOL FreeTypeTextOut( - const HDC hdc, // foCXReLXg̃nh + const HDC hdc, // デバイスコンテキストのハンドル CBitmapCache& cache, - LPCWSTR lpString, // - int cbString, // + LPCWSTR lpString, // 文字列 + int cbString, // 文字数 FreeTypeDrawInfo& FTInfo, FT_Referenced_Glyph * Glyphs, FT_DRAW_STATE* drState @@ -2731,7 +2731,7 @@ BOOL FreeTypeTextOut( bDarkColor = lightdiff <= darkdiff; if (/*diff<10 || abs(lightdiff-darkdiff)<20 &&*/ pSettings->ShadowDarkColor() == pSettings->ShadowLightColor()) { - //ӵɫ⣬ǿƿӰ + //无视底色问题,强制开启阴影 FTInfo.params->alphatuner = 1; } else @@ -2740,7 +2740,7 @@ BOOL FreeTypeTextOut( if (diff<10) FTInfo.params->alpha = 1; else - FTInfo.params->alphatuner = max(1, 100 / diff); //ɫӰŨ + FTInfo.params->alphatuner = max(1, 100 / diff); //根据色差调整阴影浓度 } } char mode = (*Glyphs) ? FT_BitmapGlyph((*Glyphs)->ft_glyph)->bitmap.pixel_mode : FT_PIXEL_MODE_LCD; @@ -2857,14 +2857,14 @@ BOOL FreeTypeTextOut( int x = FTInfo.x; int y = FTInfo.yBase; - // () + // 下線を(あれば)引く // if(lf.lfUnderline || lf.lfStrikeOut) { // OUTLINETEXTMETRIC &otm = *FTInfo.params->otm; // if(lf.lfUnderline){ - // int yPos = 0; //̈ʒu + // int yPos = 0; //下線の位置 // int height = 0; - // int thickness = 0; // Kȑ + // int thickness = 0; // 適当な太さ // switch (pSettings->FontLoader()) { // case SETTING_FONTLOADER_FREETYPE: // yPos = y - otm.otmsUnderscorePosition; @@ -2906,7 +2906,7 @@ BOOL FreeTypeTextOut( return TRUE; } -BOOL FreeTypeGetGlyph( //ͼκҪĿ +BOOL FreeTypeGetGlyph( //获得所有图形和需要的宽度 FreeTypeDrawInfo& FTInfo, LPCWSTR lpString, int cbString, @@ -2931,7 +2931,7 @@ BOOL FreeTypeTextOut( nRet = ForEachGetGlyphGGO(FTInfo, lpString, cbString, Glyphs, drState); break; } - width = FTInfo.px; //˿ + width = FTInfo.px; //获得了宽度 return nRet; } @@ -2942,9 +2942,9 @@ void VertFinalizer(void *object) { ft2vert_final(face, (struct ft2vert_st *)face->generic.data); } // -// OtIVSŎw肳ꂽ`T|[g邩ǂׁA -// T|[gĂꍇ̓OtuB -// T|[gĂȂΉȂB +// グリフをIVSで指定された字形をサポートするかどうか調べ、 +// サポートしている場合はグリフを置換する。 +// サポートしていなければ何もしない。 // /* void FreeTypeSubstGlyph(const HDC hdc, @@ -2974,14 +2974,14 @@ return; FT_UInt glyph_index = ft2_subst_uvs(FTInfo.freetype_face, pwOutGlyphs[*pcGlyphs - 1], vsindex, baseChar); TRACE(_T("FreeTypeSubstGlyph: %04X->%04X\n"), pwOutGlyphs[*pcGlyphs - 1], glyph_index); if (glyph_index) { -pwOutGlyphs[*pcGlyphs - 1] = glyph_index; // us -// ASCII󔒂̃Ot擾 +pwOutGlyphs[*pcGlyphs - 1] = glyph_index; // 置換を実行 +// ASCII空白のグリフを取得 glyph_index = FTC_CMapCache_Lookup( cmap_cache, FTInfo.font_type.face_id, FTInfo.cmap_index, ' '); -// [Otɂ +// ゼロ幅グリフにする pwOutGlyphs[*pcGlyphs] = glyph_index; psva[*pcGlyphs].uJustification = SCRIPT_JUSTIFY_NONE; psva[*pcGlyphs].fClusterStart = 0; @@ -2990,14 +2990,14 @@ psva[*pcGlyphs].fZeroWidth = 1; psva[*pcGlyphs].fReserved = 0; psva[*pcGlyphs].fShapeReserved = 0; } else { -// tHg͎w肳ꂽ`ȂBIVS̃Ot擾 +// フォントは指定された字形を持たない。IVSのグリフを取得 glyph_index = FTC_CMapCache_Lookup( cmap_cache, FTInfo.font_type.face_id, FTInfo.cmap_index, vsindex + 0xE0100); -// IVST|[gĂȂtHgIVS̃OtÔ\قƂǂȂB -// missing glyphԂƃtH[obNĂ܂ߊmɎĂȃOtE +// IVSをサポートしていないフォントはIVSのグリフを持っている可能性もほとんどない。 +// missing glyphを返すとフォールバックされてしまうため確実に持っていそうなグリフを拾う if (!glyph_index) glyph_index = FTC_CMapCache_Lookup( cmap_cache, @@ -3030,7 +3030,7 @@ FT_Error face_requester( } LPCTSTR fontname = pfi->GetName(); - // ̂w肵ătHg擾 + // 名称を指定してフォントを取得 FreeTypeSysFontData* pData = FreeTypeSysFontData::CreateInstance(fontname, pfi->GetFontWeight(), pfi->IsItalic()); if (pData == NULL) { return FT_Err_Cannot_Open_Resource; @@ -3041,7 +3041,7 @@ FT_Error face_requester( return 0x6; //something wrong with the freetype that we aren't clear yet. //Assert(face != NULL); - // Charmapݒ肵Ă + // Charmapを設定しておく ret = FT_Select_Charmap(face, FT_ENCODING_UNICODE); if (ret != FT_Err_Ok) ret = FT_Select_Charmap(face, FT_ENCODING_MS_SYMBOL); @@ -3088,12 +3088,12 @@ DWORD FreeTypeGetVersion() { int major = 0, minor = 0, patch = 0; FT_Library_Version(freetype_library, &major, &minor, &patch); -//ʓ|Ȃ̂RGB}Ngp +//面倒なのでRGBマクロ使用 return RGB(major, minor, patch); }*/ -//VASY +//新太字アルゴリズム FT_Error New_FT_Outline_Embolden(FT_Outline* outline, FT_Pos str_h, FT_Pos str_v, FT_Int font_size) { const CGdippSettings* pSettings = CGdippSettings::GetInstance(); @@ -3126,7 +3126,7 @@ FT_Error New_FT_Outline_Embolden(FT_Outline* outline, FT_Pos str_h, FT_Pos str_ } } -//点FT_Outline_Embolden +//横方向だけ太らせるFT_Outline_Embolden FT_Error Old_FT_Outline_Embolden(FT_Outline* outline, FT_Pos strength) { FT_Vector* points; @@ -3201,7 +3201,7 @@ FT_Error Old_FT_Outline_Embolden(FT_Outline* outline, FT_Pos strength) } outline->points[n].x = v_cur.x + strength + in.x; - //RgAEg + //↓これをコメントアウトしただけ //outline->points[n].y = v_cur.y + strength + in.y; v_prev = v_cur; @@ -3214,7 +3214,7 @@ FT_Error Old_FT_Outline_Embolden(FT_Outline* outline, FT_Pos strength) return FT_Err_Ok; } -//͏c +//こっちは縦方向 FT_Error Vert_FT_Outline_Embolden(FT_Outline* outline, FT_Pos strength) { FT_Vector* points; @@ -3289,7 +3289,7 @@ FT_Error Vert_FT_Outline_Embolden(FT_Outline* outline, FT_Pos strength) } //outline->points[n].x = v_cur.x + strength + in.x; - //RgAEg + //↑これをコメントアウトしただけ outline->points[n].y = v_cur.y + strength + in.y; v_prev = v_cur; diff --git a/ft.h b/ft.h index 27ddead..2091c04 100644 --- a/ft.h +++ b/ft.h @@ -203,7 +203,7 @@ struct FREETYPE_PARAMS ZeroMemory(this, sizeof(*this)); } - //FreeTypeTextOutp (TCYvZ{`) + //FreeTypeTextOut用 (サイズ計算+文字描画) FREETYPE_PARAMS(UINT eto, HDC hdc, LOGFONTW* p, OUTLINETEXTMETRIC* lpotm = NULL) : etoOptions(eto) , ftOptions(0) @@ -276,7 +276,7 @@ struct FreeTypeDrawInfo { FT_FaceRec_ dummy_freetype_face; - //FreeTypePrepareݒ肷 + //FreeTypePrepareが設定する int sx,sy; FT_Face freetype_face; FT_Int cmap_index; @@ -295,7 +295,7 @@ struct FreeTypeDrawInfo int* Dx; int* Dy; - //ĂяoOɎŐݒ肷 + //呼び出し前に自分で設定する HDC hdc; int xBase; int y;//coord height, calculated by ETO_PDY, 0 if not provided diff --git a/ft2vert.c b/ft2vert.c index 92e41d3..7da62dd 100644 --- a/ft2vert.c +++ b/ft2vert.c @@ -531,31 +531,31 @@ FT_UInt ft2_subst_uvs(const FT_Face face, const FT_UInt gid, const FT_UInt vsind if (!ft2vert) return 0; - // ݂ȂUVS SubtableT + // 存在するならUVS Subtableから探す if (ft2vert->variantSelectors) return FT_Face_GetCharVariantIndex(face, baseChar, 0xE0100 + vsindex); - // GSUBe[uOpenType featureɂV~[g + // GSUBテーブルのOpenType featureによりシミュレートする if (vsindex >= sizeof ivs_otft_index / sizeof ivs_otft_index[0]) return 0; found = (const struct ivs_otft_desc *)bsearch(&key, ivs_otft + ivs_otft_index[vsindex], ivs_otft_count[vsindex], sizeof(struct ivs_otft_desc), glyphs_comp); if (!found) return 0; - // V~[głfeature‚̂Œu݂B + // シミュレートできるfeatureが見つかったので置換を試みる。 newglyph = ft2gsub_get_gid(ft2vert, gid, found->otft_index); - // uɐ炻Ԃ + // 置換に成功したらそれを返す if (newglyph) return newglyph; - // tHgGSUBe[uɒu`ĂȂB - // 'jp04'Ă邪'jp90'ĂȂƂJIS90tHgƂ݂ȂA - // 'jp90'Ă邪'jp04'ĂȂƂJIS2004tHgƂ݂ȂB - // JIS90tHg'jp90'vꂽꍇJIS2004tHg'jp04'vꂽꍇ - // ftHg`vꂽ`łƂ݂ȂĂ̂܂ܕԂB + // フォントがGSUBテーブルに置換定義を持っていない。 + // 'jp04'を持っているが'jp90'を持っていないときはJIS90フォントとみなし、 + // 'jp90'を持っているが'jp04'を持っていないときはJIS2004フォントとみなす。 + // JIS90フォントに'jp90'を要求された場合とJIS2004フォント'jp04'を要求された場合は + // デフォルト字形が要求された字形であるとみなしてそのまま返す。 if (ft2vert->jp04Lookup && !ft2vert->jp90Lookup && found->otft_index == JP90_LOOKUP_INDEX || ft2vert->jp90Lookup && !ft2vert->jp04Lookup && found->otft_index == JP04_LOOKUP_INDEX) return gid; - // ǂłȂ΃tHg͗vꂽ`ĂȂƂ݂ȂB + // どちらでもなければフォントは要求された字形を持っていないとみなす。 return 0; } diff --git a/fteng.cpp b/fteng.cpp index 684e397..e82899b 100644 --- a/fteng.cpp +++ b/fteng.cpp @@ -35,7 +35,7 @@ int CALLBACK EnumFontCallBack(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD -bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut) //ıػ,ֵΪǷ +bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut) //获得字体的本地化名称,返回值为字体是否存在 { LOGFONT lf = {0}; TCHAR* ret; @@ -145,9 +145,9 @@ void Compact(T** pp, int count, int reduce) } CCriticalSectionLock __lock(CCriticalSectionLock::CS_FONTCACHE); TRACE(_T("Compact(0x%p, %d, %d)\n"), pp, count, reduce); - //GChL - //T::m_mrucounter̍~ɕԂ̂ - //reduce𒴂镔폜 + //GCモドキ + //T::m_mrucounterの降順に並ぶので + //reduceを超える部分を削除する T** ppTemp = (T**)malloc(sizeof(T*) * count); if (!ppTemp) { @@ -354,7 +354,7 @@ void FreeTypeFontCache::AddGlyphData(UINT glyphindex, int width, int gdiWidth, F } #endif - //lj(glypĥ) + //追加(glyphのみ) FreeTypeCharData* p = new FreeTypeCharData(NULL, /*ppGlyph*/NULL, 0, glyphindex, width, MruIncrement(), gdiWidth, AAMode); if (p == NULL) { return; @@ -383,10 +383,10 @@ void FreeTypeFontInfo::Compact() void FreeTypeFontInfo::Createlink() { CFontFaceNamesEnumerator fn(m_hash.c_str(), m_nFontFamily); - std::set linkset; //弯ϣֹظӣЧ + std::set linkset; //链接字体集合,防止重复链接,降低效率 linkset.insert(m_id); face_id_link[m_linknum] = (FTC_FaceID)m_id; - ggo_link[m_linknum++] = m_ggoFont; //һһԼҪȡ + ggo_link[m_linknum++] = m_ggoFont; //第一个链接一定是自己,不需要获取 LOGFONT lf; BOOL IsSimSun = false; memset(&lf, 0, sizeof(LOGFONT)); @@ -448,15 +448,15 @@ FreeTypeFontCache* FreeTypeFontInfo::GetCache(FTC_ScalerRec& scaler, const LOGFO int weight = lf.lfWeight; weight = weight < FW_BOLD ? 0: 1/*FW_BOLD*/; const bool italic = !!lf.lfItalic; - if (scaler.height>0xfff || scaler.width>0xfff/* || scaler.height<0 || scaler.width<0*/) //岻Ⱦ + if (scaler.height>0xfff || scaler.width>0xfff/* || scaler.height<0 || scaler.width<0*/) //超大字体不渲染 return NULL; FreeTypeFontCache* p = NULL; - UINT hash=getCacheHash(scaler.height, weight, italic, lf.lfWidth ? scaler.width : 0); //hash - CacheArray::iterator it=m_cache.find(hash); //Ѱcache - if (it!=m_cache.end())//cache + UINT hash=getCacheHash(scaler.height, weight, italic, lf.lfWidth ? scaler.width : 0); //计算hash + CacheArray::iterator it=m_cache.find(hash); //寻找cache + if (it!=m_cache.end())//cache存在 { p = it->second; - goto OK; //cache + goto OK; //返回cache } p = new FreeTypeFontCache(/*scaler.height, weight, italic,*/ MruIncrement()); @@ -494,7 +494,7 @@ BOOL FreeTypeFontEngine::RemoveFont(FreeTypeFontInfo* fontinfo) { CCriticalSectionLock __lock(CCriticalSectionLock::CS_FONTMAP); { - FontMap::const_iterator iter=m_mfontMap.begin(); //fontmap + FontMap::const_iterator iter=m_mfontMap.begin(); //遍历fontmap while (iter!=m_mfontMap.end()) { FreeTypeFontInfo* p = iter->second; @@ -505,7 +505,7 @@ BOOL FreeTypeFontEngine::RemoveFont(FreeTypeFontInfo* fontinfo) } } { - FullNameMap::const_iterator iter=m_mfullMap.begin(); //fullmap + FullNameMap::const_iterator iter=m_mfullMap.begin(); //遍历fullmap while (iter!=m_mfullMap.end()) { FreeTypeFontInfo* p = iter->second; @@ -526,12 +526,12 @@ BOOL FreeTypeFontEngine::RemoveThisFont(FreeTypeFontInfo* fontinfo, LOGFONT* lg) { CCriticalSectionLock __lock(CCriticalSectionLock::CS_FONTMAP); { - FontMap::const_iterator iter=m_mfontMap.find(myfont(lg->lfFaceName, CalcBoldWeight(lg->lfWeight), lg->lfItalic)); //fontmap + FontMap::const_iterator iter=m_mfontMap.find(myfont(lg->lfFaceName, CalcBoldWeight(lg->lfWeight), lg->lfItalic)); //遍历fontmap if (iter!=m_mfontMap.end()) m_mfontMap.erase(iter); //删除引用 } { - FullNameMap::const_iterator iter=m_mfullMap.find(fontinfo->GetFullName()); //fullmap + FullNameMap::const_iterator iter=m_mfullMap.find(fontinfo->GetFullName()); //遍历fullmap if (iter!=m_mfullMap.end()) m_mfullMap.erase(iter); //删除引用 } @@ -607,7 +607,7 @@ FreeTypeFontInfo* FreeTypeFontEngine::AddFont(void* lpparams) if (!pfi) return NULL; - if (pfi->GetFullName().size()==0) // + if (pfi->GetFullName().size()==0) //点阵字 { delete pfi; ReleaseFaceID(); @@ -684,15 +684,15 @@ FreeTypeFontInfo* FreeTypeFontEngine::AddFont(LPCTSTR lpFaceName, int weight, bo FreeTypeFontInfo* pfi = new FreeTypeFontInfo(/*m_mfullMap.size() + 1*/GetFaceID(), lpFaceName, weight, italic, MruIncrement(), dumy, dumy); if (!pfi) return NULL; - if (pfi->GetFullName().size()==0) // + if (pfi->GetFullName().size()==0) //点阵字 { delete pfi; ReleaseFaceID(); return NULL; } - FullNameMap::const_iterator it = m_mfullMap.find(pfi->GetFullName()); //Ƿmapд - if (it!=m_mfullMap.end()) //Ѿ + FullNameMap::const_iterator it = m_mfullMap.find(pfi->GetFullName()); //是否在主map表中存在了 + if (it!=m_mfullMap.end()) //已经存在 { delete pfi; //删除创建出来的字体 ReleaseFaceID(); @@ -811,7 +811,7 @@ FreeTypeFontInfo* FreeTypeFontEngine::FindFont(int faceid) if (faceid>m_mfontList.size()) return NULL; else - return m_mfontList[faceid-1]; //bug + return m_mfontList[faceid-1]; //存在bug!!! /* FullNameMap::const_iterator iter=m_mfullMap.begin(); for(; iter != m_mfullMap.end(); ++iter) { @@ -827,13 +827,13 @@ FreeTypeFontInfo* FreeTypeFontEngine::FindFont(int faceid) //FreeTypeSysFontData -// http://kikyou.info/diary/?200510#i10 Qlɂ +// http://kikyou.info/diary/?200510#i10 を参考にした #include // FT_TRUETYPE_TABLES_H #include //mmioFOURCC #define TVP_TT_TABLE_ttcf mmioFOURCC('t', 't', 'c', 'f') #define TVP_TT_TABLE_name mmioFOURCC('n', 'a', 'm', 'e') -// Windowsɓo^ĂtHg̃oCif[^𖼏̂擾 +// Windowsに登録されているフォントのバイナリデータを名称から取得 FreeTypeSysFontData* FreeTypeSysFontData::CreateInstance(LPCTSTR name, int weight, bool italic) { FreeTypeSysFontData* pData = new FreeTypeSysFontData; @@ -850,8 +850,8 @@ FreeTypeSysFontData* FreeTypeSysFontData::CreateInstance(LPCTSTR name, int weigh bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) { const CGdippSettings* pSettings = CGdippSettings::GetInstance(); - void* pNameFromGDI = NULL; // Windows 擾 name ^O̓e - void* pNameFromFreeType = NULL; // FreeType 擾 name ^O̓e + void* pNameFromGDI = NULL; // Windows から取得した name タグの内容 + void* pNameFromFreeType = NULL; // FreeType から取得した name タグの内容 HFONT hf = NULL; DWORD cbNameTable; DWORD cbFontData; @@ -863,7 +863,7 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) if(m_hdc == NULL) { return false; } - // OȊOK + // 名前以外適当 if (pSettings->FontSubstitutes() < SETTING_FONTSUBSTITUTE_ALL) { hf = CreateFont( @@ -892,7 +892,7 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) } m_hOldFont = SelectFont(m_hdc, hf); - // tHgf[^ꂻ`FbN + // フォントデータが得られそうかチェック cbNameTable = ORIG_GetFontData(m_hdc, TVP_TT_TABLE_name, 0, NULL, 0); if(cbNameTable == GDI_ERROR){ goto ERROR_Init; @@ -907,15 +907,15 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) goto ERROR_Init; } - //- name ^O̓eɓǂݍ + //- name タグの内容をメモリに読み込む if(ORIG_GetFontData(m_hdc, TVP_TT_TABLE_name, 0, pNameFromGDI, cbNameTable) == GDI_ERROR){ goto ERROR_Init; } - // tHgTCY擾 + // フォントサイズ取得処理 cbFontData = ORIG_GetFontData(m_hdc, TVP_TT_TABLE_ttcf, 0, &buf, 1); if(cbFontData == 1){ - // TTC t@CƎv + // TTC ファイルだと思われる cbFontData = ORIG_GetFontData(m_hdc, TVP_TT_TABLE_ttcf, 0, NULL, 0); m_isTTC = true; } @@ -923,7 +923,7 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) cbFontData = ORIG_GetFontData(m_hdc, 0, 0, NULL, 0); } if(cbFontData == GDI_ERROR){ - // G[; GetFontData ł͈Ȃ + // エラー; GetFontData では扱えなかった goto ERROR_Init; } @@ -941,7 +941,7 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) } } - // FT_StreamRec ̊etB[h𖄂߂ + // FT_StreamRec の各フィールドを埋める fsr.base = 0; fsr.size = cbFontData; fsr.pos = 0; @@ -957,37 +957,37 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic) } for(;;) { - // FreeType Aname ^ÕTCY擾 + // FreeType から、name タグのサイズを取得する FT_ULong length = 0; FT_Error err = FT_Load_Sfnt_Table(m_ftFace, TTAG_name, 0, NULL, &length); if(err){ goto ERROR_Init; } - // FreeType 瓾 name ^O̒ Windows 瓾Ɣr + // FreeType から得た name タグの長さを Windows から得た長さと比較 if(length == cbNameTable){ - // FreeType name ^O擾 + // FreeType から name タグを取得 err = FT_Load_Sfnt_Table(m_ftFace, TTAG_name, 0, (unsigned char*)pNameFromFreeType, &length); if(err){ goto ERROR_Init; } - // FreeType ǂݍ name ^O̓eƁAWindows ǂݍ - // name ^O̓erB - // vĂ΂ index ̃tHggB + // FreeType から読み込んだ name タグの内容と、Windows から読み込んだ + // name タグの内容を比較する。 + // 一致していればその index のフォントを使う。 if(!memcmp(pNameFromGDI, pNameFromFreeType, cbNameTable)){ - // v - // face ͊J܂ - break; // [v𔲂 + // 一致した + // face は開いたまま + break; // ループを抜ける } } - // vȂ - // CfbNX‘₵A face J + // 一致しなかった + // インデックスを一つ増やし、その face を開く index ++; if(!OpenFaceByIndex(index)){ - // v face Ȃ܂ CfbNX͈͂𒴂ƌ - // index 0 ɐݒ肵Ă index JA[v𔲂 + // 一致する face がないまま インデックスが範囲を超えたと見られる + // index を 0 に設定してその index を開き、ループを抜ける index = 0; if(!OpenFaceByIndex(index)){ goto ERROR_Init; @@ -1033,7 +1033,7 @@ unsigned long FreeTypeSysFontData::IoFunc( } else { result = ::GetFontData(pThis->m_hdc, pThis->m_isTTC ? TVP_TT_TABLE_ttcf : 0, offset, buffer, count); if(result == GDI_ERROR) { - // G[ + // エラー return 0; } } @@ -1060,7 +1060,7 @@ bool FreeTypeSysFontData::OpenFaceByIndex(int index) args.flags = FT_OPEN_STREAM; args.stream = &m_ftStream; - // FreeType ň邩H + // FreeType で扱えるか? FT_Error ftErrCode = FT_Open_Face(freetype_library, &args, index, &m_ftFace); #ifdef DEBUG if (ftErrCode!=0) diff --git a/fteng.h b/fteng.h index c2edc1e..6ff622f 100644 --- a/fteng.h +++ b/fteng.h @@ -21,7 +21,7 @@ typedef set CTLSDCArray; extern CTLSDCArray TLSDCArray; LOGFONTW* GetFontNameFromFile(LPCTSTR Filename); -bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut); //ıػ +bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut); //获得字体的本地化名称 struct CFontSetCache { @@ -70,41 +70,41 @@ enum FT_EngineConstants { }; /* - FreeTypeɕAAΑ̂LbV@\̂ł₤ + FreeTypeに文字幅、太字、斜体をキャッシュする機構が無いのでそれらを補う - 1. ܂DllMain(DLL_PROCESS_ATTACH)FreeTypeFontEnginẽCX^XB - (ԂCGdiPPSettingsFontLInit(FreeType)FreeTypeFontEnginetbN) - ForceChangeFontŏB + 1. まずDllMain(DLL_PROCESS_ATTACH)でFreeTypeFontEngineのインスタンスが生成される。 + (順番はCGdiPPSettings→FontLInit(FreeType)→FreeTypeFontEngine→フック) + ForceChangeFontもここで処理する。 - 2. CreateFontFreeTypeFontEngine::AddFontĂяoAFreeTypeFontInfo - tHgт‚B - ‚łFreeTypeFontInfoIndividual̐ݒRs[ρB + 2. CreateFontでFreeTypeFontEngine::AddFontが呼び出され、FreeTypeFontInfoと + フォント名を結びつける。 + ついでにFreeTypeFontInfoはIndividualの設定をコピーして持つ。 - 3. ExtTextOutGetTextExtentȂǂFreeTypePrepare֐Ăяo - ɓFreeTypeFontInfo::GetCacheĂяoAtHgTCYȂǂ - FreeTypeFontCache𓾂BΐB - FreeTypeFontCache͓FreeTypeCharDatãe[u(UCS2Ȃ̂2^16) - ĂāAFreeTypeCharDataɂ͕ɃLbVf[^ۊǂB + 3. ExtTextOutやGetTextExtentなどからFreeTypePrepare関数が呼び出されると + さらに内部でFreeTypeFontInfo::GetCacheが呼び出され、フォントサイズなどから + FreeTypeFontCacheを得る。無ければ生成する。 + FreeTypeFontCacheは内部にFreeTypeCharDataのテーブル(UCS2なので2^16個)を + 持っていて、FreeTypeCharDataには文字毎にキャッシュデータを保管する。 - 4. FreeTypeFontCacheA܂̓OtԍFreeTypeCharData𓾂B - LbV(ɎcĂ)AMRUJE^ZbgB - ꍇ͈UX[AAddCharDataŃLbVljB + 4. FreeTypeFontCacheから、文字またはグリフ番号を元にFreeTypeCharDataを得る。 + キャッシュがあれば(メモリ中に残っていれば)、MRUカウンタをセットする。 + 無い場合は一旦スルーし、後でAddCharDataでキャッシュを追加する。 - 5. lj܂ƃ炤̂ŁAlj萔(FREETYPE_REQCOUNTMAX)𒴂 - GChLōŋߎQƂꂽLbVf[^FREETYPE_GC_COUNTER‚cA - ȊÕf[^(FreeTypeCharData)͊JB - 2‚̒萔iniŐݒύXł悤ȋCB + 5. 追加しまくるとメモリを喰らうので、追加が一定数(FREETYPE_REQCOUNTMAX)を超えると + GCモドキで最近参照されたキャッシュデータをFREETYPE_GC_COUNTER個だけ残し、 + それ以外のデータ(FreeTypeCharData)は開放される。 + この2つの定数はiniで設定変更できた方がいいような気もする。 - 6. ŌɁADllMain(DLL_PROCESS_DETACH)FreeTypeFontEnginẽCX^XjA - SẴLbVJB + 6. 最後に、DllMain(DLL_PROCESS_DETACH)でFreeTypeFontEngineのインスタンスが破棄され、 + 全てのキャッシュメモリが開放される。 */ class FreeTypeGCCounter { private: - int m_addcount; //ljp - int m_mrucount; //MRUp + int m_addcount; //追加用 + int m_mrucount; //MRU用 public: FreeTypeGCCounter() @@ -125,7 +125,7 @@ class FreeTypeGCCounter class FreeTypeMruCounter { private: - int m_mrucounter; //GCp + int m_mrucounter; //GC用 public: FreeTypeMruCounter(int n) @@ -133,35 +133,35 @@ class FreeTypeMruCounter { } - //GCpMRUJE^ + //GC用MRUカウンタ int GetMruCounter() const { return m_mrucounter; } void ResetMruCounter() { m_mrucounter = 0; } void SetMruCounter(FreeTypeGCCounter* p) { m_mrucounter = p->MruIncrement(); } }; -//A(glyph index)AFT_BitmapGlyph(AΑ̂̂)LbV +//文字幅、(glyph index)、FT_BitmapGlyph(太字、斜体のみ)をキャッシュする class FreeTypeCharData : public FreeTypeMruCounter { private: typedef CValArray CharDataArray; - CharDataArray m_arrSelfChar; //g̕ۑ(Char) + CharDataArray m_arrSelfChar; //自分自身の保存元(Char) FreeTypeCharData** m_ppSelfGlyph; //(Glyph) - UINT m_glyphindex; //Otԍ - int m_width; // - int m_gdiWidth; //ʹGetCharWidthõGDI - FT_Referenced_BitmapGlyph m_glyph; //J[p - FT_Referenced_BitmapGlyph m_glyphMono; //mNp - int m_bmpSize; //rbg}bvTCY - int m_bmpMonoSize; // V + UINT m_glyphindex; //グリフ番号 + int m_width; //文字幅 + int m_gdiWidth; //使用GetCharWidth获得的GDI宽度 + FT_Referenced_BitmapGlyph m_glyph; //カラー用 + FT_Referenced_BitmapGlyph m_glyphMono; //モノクロ用 + int m_bmpSize; //ビットマップサイズ + int m_bmpMonoSize; // 〃 int m_AAMode; -// LONG m_refcounter; //QƃJE^ +// LONG m_refcounter; //参照カウンタ #ifdef _DEBUG - WCHAR m_wch; //UCS2 + WCHAR m_wch; //UCS2文字 #endif NOCOPY(FreeTypeCharData); - //FT_Bitmap::buffer̃TCYԂ + //FT_Bitmap::bufferのサイズを返す static inline int FT_Bitmap_CalcSize(FT_BitmapGlyph gl) { return gl->bitmap.pitch * gl->bitmap.rows; @@ -210,7 +210,7 @@ class FreeTypeFontCache : public FreeTypeMruCounter, public FreeTypeGCCounter bool m_active; TEXTMETRIC m_tm; - //4~65536~2512KB炢mĂ̂ŌŒzŖ薳 + //4×65536×2=512KBぐらいたかが知れてるので固定配列で問題無し #ifdef _USE_ARRAY FreeTypeCharData* m_chars[FT_MAX_CHARS]; FreeTypeCharData* m_glyphs[FT_MAX_CHARS]; @@ -291,7 +291,7 @@ class FreeTypeFontCache : public FreeTypeMruCounter, public FreeTypeGCCounter }; -// tHgFaceID(intgƂɂ) +// フォント名とFaceID(intを使うことにする) //extern CFontSetCache g_fsetcache; extern CHashedStringList FontNameCache; class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter @@ -352,15 +352,15 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter { FT_Face freetype_face; CCriticalSectionLock __lock(CCriticalSectionLock::CS_MANAGER); - if (FTC_Manager_LookupFace(cache_man, (FTC_FaceID)m_id, &freetype_face)) //ѯft face + if (FTC_Manager_LookupFace(cache_man, (FTC_FaceID)m_id, &freetype_face)) //查询ft face { m_hashinting = false; return NULL; } FT_ULong length = 0; - FT_Error err = FT_Load_Sfnt_Table(freetype_face, TTAG_fpgm, 0, NULL, &length); //ȡfpgm - if (!err && length>50) //ɹȡҳȽϳ - m_hashinting = true; //hinting + FT_Error err = FT_Load_Sfnt_Table(freetype_face, TTAG_fpgm, 0, NULL, &length); //获取fpgm表长度 + if (!err && length>50) //成功读取表,并且长度较长 + m_hashinting = true; //字体存在hinting else m_hashinting = false; } @@ -369,7 +369,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter wstring GetFullName() {return m_fullname;}; bool m_isSimSun; bool IsPixel; - UINT getCacheHash(int px, int weight, bool italic, int width) {return ((px<<20)|(width<<8)|(weight<<1)|(int)italic); }; //һhashֵλcache + UINT getCacheHash(int px, int weight, bool italic, int width) {return ((px<<20)|(width<<8)|(weight<<1)|(int)italic); }; //计算一个hash值来定位cache FreeTypeFontInfo(int n, LPCTSTR name, int weight, bool italic, int mru, wstring fullname, wstring familyname) : m_id(n), m_weight(weight), m_italic(italic), m_OS2Table(NULL), IsPixel(false) , FreeTypeMruCounter(mru), m_isSimSun(false), m_ggoFont(NULL), m_linkinited(false), m_linknum(0), m_os2Weight(0) @@ -391,7 +391,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter m_ggoFont = CreateFont(10,0,0,0,weight,italic,0,0,DEFAULT_CHARSET,0,0,0,0,name); HDC hdc = CreateCompatibleDC(NULL); HFONT old = SelectFont(hdc, m_ggoFont); - //ȫ + //获得字体的全称 int nSize=GetOutlineTextMetrics(hdc, 0, NULL); if (nSize==0) @@ -415,7 +415,7 @@ class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter m_set = pSettings->FindIndividual(m_familyname.c_str()); m_ftWeight = CalcBoldWeight(/*weight*/700); m_hash = StringHashFont(name); - if (m_familyname.size()>0 && m_familyname.c_str()[0]==L'@') //һ@ + if (m_familyname.size()>0 && m_familyname.c_str()[0]==L'@') //附加一个@ m_fullname = L'@'+m_fullname; free(otm); } @@ -594,7 +594,7 @@ class FreeTypeFontEngine : public FreeTypeGCCounter BOOL RemoveFont(LPCWSTR FontName); BOOL RemoveFont(FreeTypeFontInfo* fontinfo); BOOL RemoveThisFont(FreeTypeFontInfo* fontinfo, LOGFONT* lg); - //gpʃJE^ + //メモリ使用量カウンタ void AddMemUsed(int x) { m_nMemUsed += x; @@ -646,7 +646,7 @@ class FreeTypeFontEngine : public FreeTypeGCCounter } }; -//GetFontDatãXg[ +//GetFontDataのメモリストリーム class FreeTypeSysFontData { private: diff --git a/gdiPlusFlat2.h b/gdiPlusFlat2.h index cf9d85a..3dac161 100644 --- a/gdiPlusFlat2.h +++ b/gdiPlusFlat2.h @@ -23,10 +23,10 @@ GdipDrawString)( );//绘制文字的函数 typedef GpStatus (WINGDIPAPI* -GdipGetLogFontW)(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);//GPFontȡLogfont +GdipGetLogFontW)(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);//从GPFont获取Logfont typedef GpStatus (WINGDIPAPI* -GdipGetDC)(GpGraphics* graphics, HDC * hdc); //GPGraphicȡHDC +GdipGetDC)(GpGraphics* graphics, HDC * hdc); //从GPGraphic获取HDC typedef GpStatus (WINGDIPAPI* GdipReleaseDC)(GpGraphics* graphics, HDC hdc); @@ -40,7 +40,7 @@ GdipGetStringFormatTrimming)( GDIPCONST GpStringFormat *format, StringTrimming *trimming ); //获取字符串的缩略方式。当字符串长度超过矩形长度时,将使用设置的方式删除中间的部分文字。 - //תGDIӦʹDrawTextģ⡣ + //转换成GDI后应使用DrawText来模拟。 typedef GpStatus (WINGDIPAPI* GdipGetStringFormatHotkeyPrefix)(GDIPCONST GpStringFormat *format, INT *hotkeyPrefix); //获取&符号的显示方式,隐藏,显示下划线或者不处理&。由DrawText模拟。 @@ -49,7 +49,7 @@ typedef GpStatus (WINGDIPAPI* GdipGetBrushType)(GpBrush *brush, GpBrushType *type); typedef GpStatus (WINGDIPAPI* -GdipGetSolidFillColor)(GpSolidFill *brush, ARGB *color); //ȡɫBrushɫ +GdipGetSolidFillColor)(GpSolidFill *brush, ARGB *color); //获取单色Brush的颜色 extern GdipDrawString pfnGdipDrawString ; extern GdipGetBrushType pfnGdipGetBrushType ; diff --git a/gdiexe.rc b/gdiexe.rc index 3f5f694..a3d9e45 100644 --- a/gdiexe.rc +++ b/gdiexe.rc @@ -25,7 +25,7 @@ FILETYPE VFT_APP VALUE "FileDescription", "GDI++ Font Rasterizer Driver" VALUE "FileVersion", VER_STRING VALUE "InternalName", "gdi++" - VALUE "LegalCopyright", "(C) 0x0D/0x20I, 460. All rights reserved." + VALUE "LegalCopyright", "(C) 仧0x0D/0x20I, 460. All rights reserved." VALUE "OriginalFilename", "gdi++.exe" VALUE "ProductVersion", VER_STRING VALUE "URL", "http://drwatson.nobody.jp/gdi++/" @@ -44,15 +44,15 @@ FILETYPE VFT_APP "" } -//ςɁ[ +//じゃぱにーず STRINGTABLE DISCARDABLE { -IDS_USAGE "gdi++.exe argument ...\n\nEXE, ܂̓V[gJbgȂǂhbvĂ." -IDS_DLL "error: 0x%08x\nDLL‚܂." -IDC_EXEC "error: 0x%08x\nsł܂." +IDS_USAGE "gdi++.exe argument ...\n\nEXE, またはショートカットなどをドロップしてください." +IDS_DLL "error: 0x%08x\nDLLが見つかりません." +IDC_EXEC "error: 0x%08x\n実行できません." } -//[(K) +//えーご(適当) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) diff --git a/hook.cpp b/hook.cpp index 4f44c10..73b4f35 100644 --- a/hook.cpp +++ b/hook.cpp @@ -1,13 +1,13 @@ // API hook // -// GetProcAddressœcalli֐{́j𒼐ڏA -// ̃tbN֐jmpB +// GetProcAddressで得たcall先(関数本体)を直接書き換え、 +// 自分のフック関数にjmpさせる。 // -// ŌAPIǵAR[hx߂ĂcallB -// jmpR[hɖ߂B +// 内部で元のAPIを使う時は、コードを一度戻してからcall。 +// すぐにjmpコードに戻す。 // -// }`Xbh callƍ̂ŁA -// CriticalSectionŔr䂵ĂB +// マルチスレッドで 書き換え中にcallされると困るので、 +// CriticalSectionで排他制御しておく。 // #include "override.h" @@ -43,7 +43,7 @@ HINSTANCE g_dllInstance; #include "detours.h" #pragma comment (lib, "detours.lib") #pragma comment (lib, "detoured.lib") -// DATA_fooAORIG_foo ̂Q‚܂Ƃ߂Ē`}N +// DATA_foo、ORIG_foo の2つをまとめて定義するマクロ #define HOOK_MANUALLY HOOK_DEFINE #define HOOK_DEFINE(rettype, name, argtype) \ rettype (WINAPI * ORIG_##name) argtype; @@ -143,7 +143,7 @@ static void hook_term() #define HOOK_DEFINE(rettype, name, argtype) \ - HOOK_TRACE_INFO HOOK_##name = {0}; //hookṹ + HOOK_TRACE_INFO HOOK_##name = {0}; //建立hook结构 #include "hooklist.h" @@ -243,7 +243,7 @@ HANDLE g_hfDbgText; //#include "APITracer.hpp" -//x[XAhXς[hȂ +//ベースアドレスを変えた方がロードが早くなる #if _DLL #pragma comment(linker, "/base:0x06540000") #endif @@ -441,24 +441,24 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) if (!hEasyhk) return false; } - // - //DLL_PROCESS_DETACHł͂̋tɂ - //1. CRT֐̏ - //2. NeBJZNV̏ - //3. TLS̏ - //4. CGdippSettings̃CX^XAINIǂݍ - //5. ExcludeModule`FbN - // 6. FreeTypeCȕ - // 7. FreeTypeFontEnginẽCX^X - // 8. APItbN - // 9. ManagerGetProcAddresstbN + //初期化順序 + //DLL_PROCESS_DETACHではこれの逆順にする + //1. CRT関数の初期化 + //2. クリティカルセクションの初期化 + //3. TLSの準備 + //4. CGdippSettingsのインスタンス生成、INI読み込み + //5. ExcludeModuleチェック + // 6. FreeTypeライブラリの初期化 + // 7. FreeTypeFontEngineのインスタンス生成 + // 8. APIをフック + // 9. ManagerのGetProcAddressをフック //1 _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW); //_CrtSetBreakAlloc(100); - //Opera~܂` + //Operaよ止まれ~ //Assert(GetModuleHandleA("opera.exe") == NULL); setlocale(LC_ALL, ""); @@ -493,7 +493,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) IsUnload = IsProcessUnload(); bEnableDW = pSettings->DirectWrite(); } - if (!IsUnload) hook_initinternal(); //صģͲκǁE + if (!IsUnload) hook_initinternal(); //不加载的模块就不做任何事莵E //5 if (!IsProcessExcluded() && !IsUnload) { #ifndef _WIN64 @@ -531,7 +531,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) }*/ // InstallManagerHook(); } - //õǰģʽ + //获得当前加载模式 if (IsUnload) { @@ -542,11 +542,11 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) HANDLE mutex_CompMode = OpenMutex(MUTEX_ALL_ACCESS, false, _T("Global\\MacTypeCompMode")); if (!mutex_CompMode) mutex_CompMode = OpenMutex(MUTEX_ALL_ACCESS, false, _T("MacTypeCompMode")); - BOOL HookMode = (mutex_offical || (mutex_gditray2 && mutex_CompMode)) || (!mutex_offical && !mutex_gditray2); //Ƿڼģʽ + BOOL HookMode = (mutex_offical || (mutex_gditray2 && mutex_CompMode)) || (!mutex_offical && !mutex_gditray2); //是否在兼容模式下 CloseHandle(mutex_CompMode); CloseHandle(mutex_gditray2); CloseHandle(mutex_offical); - if (!HookMode) //Ǽģʽ£ܾ + if (!HookMode) //非兼容模式下,拒绝加载 return false; } @@ -562,7 +562,7 @@ BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID lpReserved) if (!bDllInited) return true; bDllInited = false; - if (InterlockedExchange(&g_bHookEnabled, FALSE) && lpReserved == NULL) { //ǽֹҪͷ + if (InterlockedExchange(&g_bHookEnabled, FALSE) && lpReserved == NULL) { //如果是进程终止,则不需要释放 hook_term(); //delete AACacheFull; //delete AACache; diff --git a/misc.cpp b/misc.cpp index b36e592..c5e13d3 100644 --- a/misc.cpp +++ b/misc.cpp @@ -10,7 +10,7 @@ TCHAR CGdippSettings::m_szexeName[MAX_PATH+1] = {0}; #define CharPrev(s, c) ((c) - 1) #endif -//蔲̃pX֐Q +//手抜きのパス操作関数群 BOOL WINAPI PathIsRelative(LPCTSTR pszPath) { if (!pszPath || !*pszPath) { @@ -24,7 +24,7 @@ BOOL WINAPI PathIsRelative(LPCTSTR pszPath) return FALSE; } if (ch1 == _T('\\') || (ch1 && ch2 == _T(':'))) { - //΃pX + //絶対パス return FALSE; } return TRUE; @@ -125,7 +125,7 @@ LPTSTR WINAPI PathCombine(LPTSTR pszDest, LPCTSTR pszDir, LPCTSTR pszFile) return NULL; } - //Ȃ蔲 + //かなり手抜き TCHAR szCurDir[MAX_PATH], szDir[MAX_PATH+1]; GetCurrentDirectory(MAX_PATH, szCurDir); _tcsncpy(szDir, pszDir, MAX_PATH - 1); diff --git a/override.cpp b/override.cpp index 07077d2..f3dc27b 100644 --- a/override.cpp +++ b/override.cpp @@ -1,4 +1,4 @@ -// override.cpp - LCTextOut +// override.cpp - キレイなTextOut // 2006/09/27 #include "override.h" @@ -56,7 +56,7 @@ HFONT GetCurrentFont(HDC hdc) { HFONT hCurFont = (HFONT)GetCurrentObject(hdc, OBJ_FONT); if (!hCurFont) { - // NULL̏ꍇSystemݒ肵Ă + // NULLの場合はSystemを設定しておく hCurFont = (HFONT)GetStockObject(SYSTEM_FONT); } return hCurFont; @@ -128,7 +128,7 @@ BOOL IsExeUnload(LPCTSTR lpApp) return FALSE; } -//؂グZ +//切り上げ除算 int div_ceil(int a, int b) { if(a % b) @@ -794,8 +794,8 @@ BOOL WINAPI IMPL_DrawStateA(HDC hdc, HBRUSH hbr, DRAWSTATEPROC lpOutputFunc, LPA return ORIG_DrawStateA(hdc, hbr, lpOutputFunc, lData, wData, x, y, cx, cy, uFlags); } -//DF`DrawText֓ -//DrawText͓ExtTextOutĂ̂ŖȂ +//灰色描画をDrawTextへ投げる +//DrawTextは内部でExtTextOutしてくれるので問題なし BOOL WINAPI IMPL_DrawStateW(HDC hdc, HBRUSH hbr, DRAWSTATEPROC lpOutputFunc, LPARAM lData, WPARAM wData, int x, int y, int cx, int cy, UINT uFlags) { //CThreadCounter __counter; @@ -804,16 +804,16 @@ BOOL WINAPI IMPL_DrawStateW(HDC hdc, HBRUSH hbr, DRAWSTATEPROC lpOutputFunc, LPA case DST_TEXT: case DST_PREFIXTEXT: { - //wData==0̎ɕvZ - //APIƈ-1̎ł͂Ȃ + //wData==0の時に文字数自動計算 + //他のAPIと違って-1の時ではない if(wData == 0) { wData = wcslen((LPCWSTR)lData); } RECT rect = { x, y, x + 10000, y + 10000 }; - //ǂ3DHighLight̏1px炵3DShadowd˂Ă炵 + //どうやら3DHighLightの上に1pxずらして3DShadowを重ねてるらしい int oldbm = SetBkMode(hdc, TRANSPARENT); COLORREF oldfg = SetTextColor(hdc, GetSysColor(COLOR_3DHIGHLIGHT)); - //DrawStateDrawTextłprefix̃tOt(API̐݌v_) + //DrawStateとDrawTextではprefixのフラグが逆(APIの設計ダメすぎ) const UINT uDTFlags = DT_SINGLELINE | DT_NOCLIP | (uFlags & DST_PREFIXTEXT ? 0 : DT_NOPREFIX); OffsetRect(&rect, 1, 1); @@ -879,7 +879,7 @@ void AnsiDxToUnicodeDx(LPCSTR lpStringA, int cbString, const int* lpDxA, int* lp } } -// ANSI->UnicodeɕϊExtTextOutWɓExtTextOutA +// ANSI->Unicodeに変換してExtTextOutWに投げるExtTextOutA BOOL WINAPI IMPL_ExtTextOutA(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCSTR lpString, UINT cbString, CONST INT *lpDx) { @@ -890,11 +890,11 @@ BOOL WINAPI IMPL_ExtTextOutA(HDC hdc, int nXStart, int nYStart, UINT fuOptions, //However, if the ANSI version of ExtTextOut is called with ETO_GLYPH_INDEX, //the function returns TRUE even though the function does nothing. - //Ƃ肠IWiɔ΂ + //とりあえずオリジナルに飛ばす if (fuOptions & ETO_GLYPH_INDEX) return ORIG_ExtTextOutA(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); - //HDBENCH`[g + //HDBENCHチート // if (lpString && cbString == 7 && pSettings->IsHDBench() && (memcmp(lpString, "HDBENCH", 7) == 0 || memcmp(lpString, " ", 7) == 0)) // return ORIG_ExtTextOutA(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); @@ -939,7 +939,7 @@ BOOL WINAPI IMPL_ExtTextOutA(HDC hdc, int nXStart, int nYStart, UINT fuOptions, lpszUnicode = _StrDupExAtoW(lpString, cbString, szStack, CCH_MAX_STACK, &bufferLength, nACP); if(!lpszUnicode) { - //s: ꉞIWiɓƂ + //メモリ不足: 一応オリジナルに投げとく return ORIG_ExtTextOutA(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); } @@ -992,7 +992,7 @@ typedef enum { ETOE_GENERAL = 19, } ExtTextOut_ErrorCode; -//OhL +//例外モドキ #define ETO_TRY() ExtTextOut_ErrorCode error = ETOE_OK; { #define ETO_THROW(code) error = (code); goto _EXCEPTION_THRU #define ETO_CATCH() } _EXCEPTION_THRU: @@ -1058,7 +1058,7 @@ class CETOBitmap }; extern ControlIder CID; -// ȡWindowsExtTextOutW +// 取代Windows的ExtTextOutW BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, CONST RECT *lprc, LPCWSTR lpString, UINT cbString, CONST INT *SyslpDx) { //CThreadCounter __counter; //用于安全退出的计数器 @@ -1136,7 +1136,7 @@ BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, { bool bZoomInOut = (xfm.eM12==0 && xfm.eM21==0 && xfm.eM11>0 && xfm.eM22>0); //只是缩放,且是正数缩放 if (!bZoomInOut) - return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); //Ⱦ + return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx); //放弃渲染 else { bZoomedDC = true; @@ -1177,7 +1177,7 @@ BOOL WINAPI IMPL_ExtTextOutW(HDC hdc, int nXStart, int nYStart, UINT fuOptions, if (!size.cx) return ORIG_ExtTextOutW(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx);*/ - COwnedCriticalSectionLock __lock2(1, COwnedCriticalSectionLock::OCS_DC); //ȡȨֹͻ + COwnedCriticalSectionLock __lock2(1, COwnedCriticalSectionLock::OCS_DC); //获取所有权,防止冲突 CBitmapCache& cache = pTLInfo->BitmapCache(); CETOBitmap bmp(cache); @@ -1197,7 +1197,7 @@ ETO_TRY(); //设置标志, pTLInfo->InExtTextOut(true); - POINT curPos = { nXStart, nYStart }; //¼ʼλ + POINT curPos = { nXStart, nYStart }; //记录开始的位置 POINT destPos; SIZE drawSize; @@ -1217,7 +1217,7 @@ ETO_TRY(); if (!nSize) { //nSize = sizeof(OUTLINETEXTMETRIC); ETO_THROW(ETOE_INVALIDHDC); - } //ʱ50-100ms + } //耗时50-100ms otm = (OUTLINETEXTMETRIC*)malloc(nSize); memset(otm, 0, nSize); @@ -1363,7 +1363,7 @@ ETO_TRY(); FTInfo.Dx[i]-=FTInfo.xBase; // modify the start position of painting } - /*if (bZoomedDC && DCTrans->MirrorX()) //ҷRGBBGRҪ෴ + /*if (bZoomedDC && DCTrans->MirrorX()) //左右反向,RGB和BGR要相反 for (int i=0; i>24)%2 || (bgcolor>>28)%2) // bgcolor = 0; if ((bgcolor>>24)%2 || (bgcolor>>28)%2) diff --git a/ownedcs.cpp b/ownedcs.cpp index beb182a..0742722 100644 --- a/ownedcs.cpp +++ b/ownedcs.cpp @@ -50,7 +50,7 @@ void WINAPI LeaveOwnedCritialSection(POWNED_CRITIAL_SECTION cs, WORD Owner) { if (InterlockedDecrementInt(cs->nRecursiveCount)<=0) { - InterlockedExchangeInt(cs->nOwner, -1);//黹Ȩ + InterlockedExchangeInt(cs->nOwner, -1);//归还所有权 if (InterlockedDecrementInt(cs->nRequests)>=0) SetEvent(cs->hEvent); } diff --git a/run.cpp b/run.cpp index 1e9d9fc..ba2ce1a 100644 --- a/run.cpp +++ b/run.cpp @@ -16,7 +16,7 @@ #include #include "gdiexe.rc" -// _vsnwprintfp +// _vsnwprintf用 #include #include @@ -116,9 +116,9 @@ void WINAPI _SHFree(void *pv) #endif -// P–ڂ̈t@CƂĈAsB +// 1つ目の引数だけファイルとして扱い、実行する。 // -// R}h ȊŘA܂B +// コマンドは こんな感じで連結されます。 // exe linkpath linkarg cmdarg2 cmdarg3 cmdarg4 ... // static HRESULT HookAndExecute(int show) @@ -179,10 +179,10 @@ static HRESULT HookAndExecute(int show) GetModuleFileNameW(NULL, gdippDir, _countof(gdippDir)); PathRemoveFileSpec(gdippDir); - // JgfBNggdi++.exe̒uĂfBNgƓA - // N悤ƂĂEXẼtpX甲ofBNgJg - // fBNgƂċNB(JgfBNgEXEƓꏊł - // OōĂAv΍) + // カレントディレクトリがgdi++.exeの置かれているディレクトリと同じだったら、 + // 起動しようとしているEXEのフルパスから抜き出したディレクトリ名をカレント + // ディレクトリとして起動する。(カレントディレクトリがEXEと同じ場所である + // 前提で作られているアプリ対策) if (wcscmp(dir, gdippDir) == 0) { StringCchCopyW(dir, _countof(dir), argv[1]); PathRemoveFileSpec(dir); @@ -203,11 +203,11 @@ static HRESULT HookAndExecute(int show) LPITEMIDLIST pidl = NULL; HRESULT hr; - //filẽACeIDXg擾 + //fileのアイテムIDリストを取得 hr = _SHILCreateFromPath(file, &pidl, NULL); if(SUCCEEDED(hr) && pidl) { - //SEE_MASK_INVOKEIDLISTg - //explorerŃNbNċN̂ƓɂȂ + //SEE_MASK_INVOKEIDLISTを使うと + //explorerでクリックして起動したのと同じ動作になる SHELLEXECUTEINFOW sei = { sizeof(SHELLEXECUTEINFOW) }; sei.fMask = SEE_MASK_INVOKEIDLIST | SEE_MASK_CONNECTNETDRV @@ -220,8 +220,8 @@ static HRESULT HookAndExecute(int show) sei.nShow = show; sei.lpIDList = pidl; - //ShellExecuteExWŌĂяoCreateProcessWtbN - //HookChildProcesses̏s + //ShellExecuteExWが内部で呼び出すCreateProcessWをフックして + //HookChildProcesses相当の処理を行う DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); @@ -257,8 +257,8 @@ int WINAPI wWinMain(HINSTANCE ins, HINSTANCE prev, LPWSTR cmd, int show) WCHAR path [MAX_PATH]; if(GetModuleFileNameW(NULL, path, _countof(path))) { PathRenameExtensionW(path, L".dll"); - //DONT_RESOLVE_DLL_REFERENCESw肷ƈˑ֌W̉ - //DllMaiňĂяosȂ + //DONT_RESOLVE_DLL_REFERENCESを指定すると依存関係の解決や + //DllMainの呼び出しが行われない hinstDLL = LoadLibraryExW(path, NULL, DONT_RESOLVE_DLL_REFERENCES); } if(!hinstDLL) { diff --git a/settings.cpp b/settings.cpp index 02b8789..943ce65 100644 --- a/settings.cpp +++ b/settings.cpp @@ -173,7 +173,7 @@ void CGdippSettings::DelayedInit() } - //tHg + //強制フォント /* LPCTSTR lpszFace = GetForceFontName(); if (lpszFace) @@ -389,8 +389,8 @@ void CGdippSettings::GetOSVersion() { bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) { - // eݒǂݍ - // INIt@C̗: + // 各種設定読み込み + // INIファイルの例: // [General] // HookChildProcesses=0 // HintingMode=0 @@ -400,7 +400,7 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) // ItalicSlant=0 // EnableKerning=0 // MaxHeight=0 - // ForceChangeFont=lr oSVbN + // ForceChangeFont=MS Pゴシック // TextTuning=0 // TextTuningR=0 // TextTuningG=0 @@ -414,7 +414,7 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) // LcdFilter=0 // Shadow=1,1,4 // [Individual] - // lr oSVbN=0,1,2,3,4,5 + // MS Pゴシック=0,1,2,3,4,5 GetOSVersion(); WritePrivateProfileString(NULL, NULL, NULL, lpszFile); @@ -460,19 +460,19 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) }*/ } m_bEnableShadow = true; - if (token.GetCount()>=4) //ָdzɫӰ - m_nShadowDarkColor = _httoi(token.GetArgument(3)); //ȡӰ + if (token.GetCount()>=4) //如果指定了浅色阴影 + m_nShadowDarkColor = _httoi(token.GetArgument(3)); //读取阴影 else - m_nShadowDarkColor = 0; //Ϊɫ - if (token.GetCount()>=6) //ָӰ + m_nShadowDarkColor = 0; //否则为黑色 + if (token.GetCount()>=6) //如果指定了甥瀚阴影 { - m_nShadowLightColor = _httoi(token.GetArgument(5)); //ȡӰ - m_nShadow[3] = _StrToInt(token.GetArgument(4), m_nShadow[2]); //ȡ + m_nShadowLightColor = _httoi(token.GetArgument(5)); //读取阴影 + m_nShadow[3] = _StrToInt(token.GetArgument(4), m_nShadow[2]); //读取甥胰 } else { - m_nShadowLightColor = m_nShadowDarkColor; //dzɫӰͬ - m_nShadow[3] = m_nShadow[2]; //Ҳͬ + m_nShadowLightColor = m_nShadowDarkColor; //否则和浅色阴影相同 + m_nShadow[3] = m_nShadow[2]; //甥胰也相同 } SKIP: ; @@ -495,16 +495,16 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) m_fClearTypeLevelForDW = Bound(FastGetProfileFloat(c_szDirectWrite, _T("ClearTypeLevel"), 1.0f), 0.0f, 1.0f); #ifdef _DEBUG - // GammaValueؗp + // GammaValue検証用 //CHAR GammaValueTest[1025]; //sprintf(GammaValueTest, "GammaValue=%.6f\nContrast=%.6f\n", m_fGammaValue, m_fContrast); - //MessageBoxA(NULL, GammaValueTest, "GammaValueeXg", 0); + //MessageBoxA(NULL, GammaValueTest, "GammaValueテスト", 0); #endif m_bLoadOnDemand = !!_GetFreeTypeProfileInt(_T("LoadOnDemand"), false, lpszFile); m_bFontLink = _GetFreeTypeProfileInt(_T("FontLink"), 0, lpszFile); m_bIsInclude = !!_GetFreeTypeProfileInt(_T("UseInclude"), false, lpszFile); - m_nMaxHeight = _GetFreeTypeProfileBoundInt(_T("MaxHeight"), 0, 0, 0xfff, lpszFile); //ֻܵ65535cacheƣҴʵʼֵ + m_nMaxHeight = _GetFreeTypeProfileBoundInt(_T("MaxHeight"), 0, 0, 0xfff, lpszFile); //赃只能到65535,cache的限制,而且大字体无实际价值 m_nMinHeight = _GetFreeTypeProfileBoundInt(_T("MinHeight"), 0, 0, (m_nMaxHeight) ? m_nMaxHeight : 0xfff, // shouldn't be greater than MaxHeight unless it is undefined lpszFile); //Minimum size of rendered font. DPI aware alternative. @@ -587,19 +587,19 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) #endif if (m_nFontLoader == SETTING_FONTLOADER_WIN32) { - // APIĂ͂Ȃ̂ŎO͖ + // APIが処理してくれるはずなので自前処理は無効化 if (m_nFontSubstitutes == SETTING_FONTSUBSTITUTE_ALL) { m_nFontSubstitutes = SETTING_FONTSUBSTITUTE_DISABLE; } m_bFontLink = 0; } - // tHgw + // フォント指定 ZeroMemory(&m_lfForceFont, sizeof(LOGFONT)); m_szForceChangeFont[0] = _T('\0'); _GetFreeTypeProfileString(_T("ForceChangeFont"), _T(""), m_szForceChangeFont, LF_FACESIZE, lpszFile); - // OS̃o[WXPȍ~ǂ + // OSのバージョンがXP以降かどうか //OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) }; //GetVersionEx(&osvi); m_bIsWinXPorLater = IsWindowsXPOrGreater(); @@ -629,17 +629,17 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) m_arrUnloadModule.clear(); m_arrUnFontSubModule.clear(); - // [Exclude]ZNV珜OtHgXgǂݍ - // [ExcludeModule]ZNV珜OW[Xgǂݍ + // [Exclude]セクションから除外フォントリストを読み込む + // [ExcludeModule]セクションから除外モジュールリストを読み込む AddListFromSection(_T("ExcludeModule"), lpszFile, m_arrExcludeModule); //AddListFromSection(_T("ExcludeModule"), szMainFile, m_arrExcludeModule); - // [IncludeModule]ZNVΏۃW[Xgǂݍ + // [IncludeModule]セクションから対象モジュールリストを読み込む AddListFromSection(_T("IncludeModule"), lpszFile, m_arrIncludeModule); //AddListFromSection(_T("IncludeModule"), szMainFile, m_arrIncludeModule); - // [UnloadDLL]́EصģE + // [UnloadDLL]蛠E患釉氐哪?丒 AddListFromSection(_T("UnloadDLL"), lpszFile, m_arrUnloadModule); //AddListFromSection(_T("UnloadDLL"), szMainFile, m_arrUnloadModule); - // [ExcludeSub]滻ģE + // [ExcludeSub]不进行字体替换的模縼E AddListFromSection(L"ExcludeSub", lpszFile, m_arrUnFontSubModule); //AddListFromSection(L"ExcludeSub", szMainFile, m_arrUnFontSubModule); //如果是排除的模块,则关闭字体替换 @@ -650,14 +650,14 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile) { if (GetModuleHandle(it->c_str())) { - m_nFontSubstitutes = 0; //ر滻 + m_nFontSubstitutes = 0; //关闭替换 break; } ++it; } } - // [Individual]ZNVtHgʐݒǂݍ + // [Individual]セクションからフォント別設定を読み込む wstring names = _T("LcdFilterWeight@") + wstring(m_szexeName); if (_IsFreeTypeProfileSectionExists(names.c_str(), lpszFile)) m_bUseCustomLcdFilter = AddLcdFilterFromSection(names.c_str(), lpszFile, m_arrLcdFilterWeights); @@ -688,11 +688,11 @@ bool CGdippSettings::AddExcludeListFromSection(LPCTSTR lpszSection, LPCTSTR lpsz LOGFONT truefont={0}; while (*p) { bool b = false; - GetFontLocalName(p, buff);//תÁE + GetFontLocalName(p, buff);//转换字体脕E set::const_iterator it = arr.find(buff); if (it==arr.end()) arr.insert(buff); - for (; *p; p++); //һ + for (; *p; p++); //来到下一行 p++; } return false; @@ -713,7 +713,7 @@ bool CGdippSettings::AddListFromSection(LPCTSTR lpszSection, LPCTSTR lpszFile, s set::const_iterator it = arr.find(p); if (it==arr.end()) arr.insert(p); - for (; *p; p++); //һ + for (; *p; p++); //来到下一行 p++; } return false; @@ -760,7 +760,7 @@ bool CGdippSettings::AddIndividualFromSection(LPCTSTR lpszSection, LPCTSTR lpszF LPTSTR pnext = p; for (; *pnext; pnext++); - //"lr oSVbN=0,0" ݂ȕ𕪊 + //"MS Pゴシック=0,0" みたいな文字列を分割 LPTSTR value = _tcschr(p, _T('=')); CStringTokenizer token; int argc = 0; @@ -769,12 +769,12 @@ bool CGdippSettings::AddIndividualFromSection(LPCTSTR lpszSection, LPCTSTR lpszF argc = token.Parse(value); } - GetFontLocalName(p, buff);//תÁE + GetFontLocalName(p, buff);//转换字体脕E CFontIndividual fi(buff); const CFontSettings& fsCommon = m_FontSettings; CFontSettings& fs = fi.GetIndividual(); - //Individual΋ʐݒg + //Individualが無ければ共通設定を使う fs = fsCommon; for (int i = 0; i < MAX_FONT_SETTINGS; i++) { LPCTSTR arg = token.GetArgument(i); @@ -808,7 +808,7 @@ LPTSTR CGdippSettings::_GetPrivateProfileSection(LPCTSTR lpszSection, LPCTSTR lp return const_cast((LPCTSTR)m_Config[lpszSection]); } -//atolɃftHglԂ悤ɂ悤ȕ +//atolにデフォルト値を返せるようにしたような物 int CGdippSettings::_StrToInt(LPCTSTR pStr, int nDefault) { #define isspace(ch) (ch == _T('\t') || ch == _T(' ')) @@ -887,7 +887,7 @@ int CGdippSettings::_httoi(const TCHAR *value) return result; } -//atofɃftHglԂ悤ɂ悤ȕ +//atofにデフォルト値を返せるようにしたような物 float CGdippSettings::_StrToFloat(LPCTSTR pStr, float fDefault) { #define isspace(ch) (ch == _T('\t') || ch == _T(' ')) @@ -988,7 +988,7 @@ bool CGdippSettings::IsProcessUnload() const return false; } -bool CGdippSettings::IsExeUnload(LPCTSTR lpApp) const //EǷںб? +bool CGdippSettings::IsExeUnload(LPCTSTR lpApp) const //紒E槭欠裨诤诿チ斜? { if (m_bRunFromGdiExe) { return false; @@ -1005,7 +1005,7 @@ bool CGdippSettings::IsProcessUnload() const return false; } -bool CGdippSettings::IsExeInclude(LPCTSTR lpApp) const //EǷڰб? +bool CGdippSettings::IsExeInclude(LPCTSTR lpApp) const //紒E槭欠裨诎酌チ斜? { if (m_bRunFromGdiExe) { return false; @@ -1085,8 +1085,8 @@ void CGdippSettings::InitInitTuneTable() #undef init_table } -// e[u֐ 0 - 12܂ -// LCDpe[u֐ e0 - 12܂ +// テーブル初期化関数 0 - 12まで +// LCD用テーブル初期化関数 各0 - 12まで void CGdippSettings::InitTuneTable(int v, int* table) { int i; @@ -1107,14 +1107,14 @@ void CGdippSettings::InitTuneTable(int v, int* table) } } -//‚Ȃꍇ͋ʐݒԂ +//見つからない場合は共通設定を返す extern BOOL g_ccbIndividual; const CFontSettings& CGdippSettings::FindIndividual(LPCTSTR lpFaceName) const { CFontIndividual* p = m_arrIndividual.Begin(); CFontIndividual* end = m_arrIndividual.End(); if (lpFaceName && *lpFaceName==L'@') - ++lpFaceName; //ʹú趨 + ++lpFaceName; //纵向字体使用横向的设定 StringHashFont hash(lpFaceName); for(; p != end; ++p) { @@ -1151,7 +1151,7 @@ bool CGdippSettings::CopyForceFont(LOGFONT& lf, const LOGFONT& lfOrg) const GetEnvironmentVariableW(L"MACTYPE_FONTSUBSTITUTES_ENV", NULL, 0); if (GetLastError()!=ERROR_ENVVAR_NOT_FOUND) return false; - //&lf == &lfOrg + //&lf == &lfOrgも可 bool bForceFont = !!GetForceFontName(); BOOL bFontExist = true; const LOGFONT *lplf; @@ -1168,7 +1168,7 @@ bool CGdippSettings::CopyForceFont(LOGFONT& lf, const LOGFONT& lfOrg) const return bForceFont; } -//lIchar(-128`127)ŏ\ +//値的にchar(-128~127)で十分 const char CFontSettings::m_bound[MAX_FONT_SETTINGS][2] = { { HINTING_MIN, HINTING_MAX }, //Hinting { AAMODE_MIN, AAMODE_MAX }, //AAMode @@ -1181,7 +1181,7 @@ const char CFontSettings::m_bound[MAX_FONT_SETTINGS][2] = { CFontLinkInfo::CFontLinkInfo() { memset(&info, 0, sizeof info); - memset(AllowDefaultLink, 1, sizeof(AllowDefaultLink)); //Ĭ + memset(AllowDefaultLink, 1, sizeof(AllowDefaultLink)); //默认允喧笾体链接 } CFontLinkInfo::~CFontLinkInfo() @@ -1197,7 +1197,7 @@ static int CALLBACK EnumFontCallBack(const LOGFONT *lplf, const TEXTMETRIC *lptm return 0; } -static void GetFontLocalName(LOGFONT& lf) //ıػ +static void GetFontLocalName(LOGFONT& lf) //获得字体的本地化名称 { HDC dc=GetDC(NULL); EnumFontFamiliesEx(dc, &lf, &EnumFontCallBack, (LPARAM)&lf, 0); @@ -1220,7 +1220,7 @@ void CFontLinkInfo::init() return; } //OSVERSIONINFO sOsVinfo={sizeof(OSVERSIONINFO),0,0,0,0,{0}}; - //GetVersionEx(&sOsVinfo); //òϵͳ汾 + //GetVersionEx(&sOsVinfo); //获得操作系统版本号 //const CGdippSettings* pSettings = CGdippSettings::GetInstance(); WCHAR* name = new WCHAR[0x2000]; @@ -1232,15 +1232,15 @@ void CFontLinkInfo::init() LONG rc; DWORD regtype; - for (int k = 0; ; ++k) { //е́E + for (int k = 0; ; ++k) { //获得字体柄蛐的所有字虂E namesz = nBufSize; valuesz = nBufSize; - rc = RegEnumValue(h2, k, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //Ѱ + rc = RegEnumValue(h2, k, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //从字体柄蛐寻找 if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) break; if (regtype != REG_SZ) continue; StringCchCopy(buf, nBufSize / sizeof(buf[0]), name); - if (buf[wcslen(buf) - 1] == L')') { //ȥ + if (buf[wcslen(buf) - 1] == L')') { //去掉括号 LPWSTR p; if ((p = wcsrchr(buf, L'(')) != NULL) { *p = 0; @@ -1248,7 +1248,7 @@ void CFontLinkInfo::init() } while (buf[wcslen(buf)-1] == L' ') buf[wcslen(buf)-1] = 0; - //õĶӦÁE + //获得的对应的字体脕E FontNameCache.Add(value, buf); } @@ -1260,22 +1260,22 @@ void CFontLinkInfo::init() namesz = nBufSize; valuesz = nBufSize; - rc = RegEnumValue(h1, i, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //һ + rc = RegEnumValue(h1, i, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //获得一个字体的字体链接 if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) break; - if (regtype != REG_MULTI_SZ) continue; //Ч - //ʵ + if (regtype != REG_MULTI_SZ) continue; //有效的字体链接 + //获得字体的真实名字 TCHAR buff[LF_FACESIZE]; GetFontLocalName(name, buff); - info[row][col] = _wcsdup(buff); //һÁE + info[row][col] = _wcsdup(buff); //第一消戟字体脕E ++col; for (LPCWSTR linep = value; col < FONTMAX && *linep; linep += wcslen(linep) + 1) { LPCWSTR valp = NULL; for (LPCWSTR p = linep; *p; ++p) { - if (*p == L',' && ((char)*(p+1)<0x30 || (char)*(p+1)>0x39)) //ѰСṩ + if (*p == L',' && ((char)*(p+1)<0x30 || (char)*(p+1)>0x39)) //尝试寻找字体链接中“,”后提供的字体名称 { LPWSTR lp; StringCchCopy(buf, nBufSize / sizeof(buf[0]), p + 1); @@ -1285,18 +1285,18 @@ void CFontLinkInfo::init() break; } } - if (!valp) { //ûҵṩ + if (!valp) { //没找到字体链接中提供的名称 /*for (int k = 0; ; ++k) { namesz = sizeof name; value2sz = sizeof value2; - rc = RegEnumValue(h2, k, name, &namesz, 0, ®type, (LPBYTE)value2, &value2sz); //Ѱ + rc = RegEnumValue(h2, k, name, &namesz, 0, ®type, (LPBYTE)value2, &value2sz); //从字体柄蛐寻找 if (rc == ERROR_NO_MORE_ITEMS) break; if (rc != ERROR_SUCCESS) break; if (regtype != REG_SZ) continue; if (lstrcmpi(value2, linep) != 0) continue; //寻找字体链接中字体文件对应的字体脕E StringCchCopyW(buf, sizeof(buf)/sizeof(buf[0]), name); - if (buf[wcslen(buf) - 1] == L')') { //ȥ + if (buf[wcslen(buf) - 1] == L')') { //去掉括号 LPWSTR p; if ((p = wcsrchr(buf, L'(')) != NULL) { *p = 0; @@ -1316,23 +1316,23 @@ void CFontLinkInfo::init() } if (valp) { GetFontLocalName((TCHAR*)valp, buff);; - //StringCchCopy(truefont.lfFaceName, LF_FACESIZE, buff); //Ƶṹ - //pSettings->CopyForceFont(truefont, truefont); //滻́E - info[row][col] = _wcsdup(buff);//truefont.lfFaceName); //Ƶӱ + //StringCchCopy(truefont.lfFaceName, LF_FACESIZE, buff); //复制到结构中 + //pSettings->CopyForceFont(truefont, truefont); //获得替换字虂E + info[row][col] = _wcsdup(buff);//truefont.lfFaceName); //复制到链接柄蛐 ++col; } } - if (col == 1) { //ֻһûӣɾ + if (col == 1) { //只有一消楷即没有链接,删掉。 free(info[row][0]); info[row][0] = NULL; } else { - /*if (sOsVinfo.dwMajorVersion>=6 && sOsVinfo.dwMinorVersion>=1) //汾>=6.1Win7ϵ + /*if (sOsVinfo.dwMajorVersion>=6 && sOsVinfo.dwMinorVersion>=1) //版本号>=6.1,是Win7系列 { - //ӱE + //对字体链接柄篥逆向处纴E LPWSTR swapbuff[32]; memcpy(swapbuff, info[row], 32*sizeof(LPWSTR)); //整个柄源制过来 for (int i=1; iFontSubstitutes()>=SETTING_FONTSUBSTITUTE_SAFE && pSettings->CopyForceFont(truefont, syslf)) //ʹ́E滻ģʽʱ滻ϵͳ́E + if (pSettings->FontSubstitutes()>=SETTING_FONTSUBSTITUTE_SAFE && pSettings->CopyForceFont(truefont, syslf)) //使用蛠E婊荒J绞保婊坏粝低匙痔丒 { WCHAR envname[30] = L"MT_SYSFONT"; WCHAR envvalue[30] = { 0 }; HFONT tempfont; - if (GetEnvironmentVariable(L"MT_SYSFONT", envvalue, 29) && GetObjectType(tempfont = (HFONT)wcstoull(envvalue, 0 ,10)) == OBJ_FONT)//Ѿ + if (GetEnvironmentVariable(L"MT_SYSFONT", envvalue, 29) && GetObjectType(tempfont = (HFONT)wcstoull(envvalue, 0 ,10)) == OBJ_FONT)//已经有字体存在 { - g_alterGUIFont = tempfont; //ֱʹǰ́E + g_alterGUIFont = tempfont; //直接使用先前的字虂E } else { - g_alterGUIFont = CreateFontIndirectW(&truefont); //һµ滻́E - _ui64tow((ULONG_PTR)g_alterGUIFont, envvalue, 10); //תΪַ - SetEnvironmentVariable(envname, envvalue); //дȁE? + g_alterGUIFont = CreateFontIndirectW(&truefont); //创建一个新的替换字虂E + _ui64tow((ULONG_PTR)g_alterGUIFont, envvalue, 10); //转换为字符串 + SetEnvironmentVariable(envname, envvalue); //写葋E肪潮淞? } } - //ڻȡӦ͵Ĭ - memset(DefaultFontLink, 0, sizeof(TCHAR)*(FF_DECORATIVE+1)*(LF_FACESIZE+1)); //ʼΪ0 + //现在获取对应字体类型的默认字体链接 + memset(DefaultFontLink, 0, sizeof(TCHAR)*(FF_DECORATIVE+1)*(LF_FACESIZE+1)); //初始化为0 HKEY h3; DWORD len; if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY3, 0, KEY_QUERY_VALUE, &h3)) return; @@ -1386,13 +1386,13 @@ void CFontLinkInfo::init() RegQueryValueEx(h3, _T("FontPackageSwiss"), 0, ®type, (LPBYTE)DefaultFontLink[FF_SWISS], &len); RegCloseKey(h3); - for (int i=0; im_bEnableShadow = true; - if (token.GetCount()>=4) //ָdzɫӰ - pSettings->m_nShadowDarkColor = pSettings->_httoi(token.GetArgument(3)); //ȡӰ + if (token.GetCount()>=4) //如果指定了浅色阴影 + pSettings->m_nShadowDarkColor = pSettings->_httoi(token.GetArgument(3)); //读取阴影 else - pSettings->m_nShadowDarkColor = 0; //Ϊɫ - if (token.GetCount()>=6) //ָɫӰ + pSettings->m_nShadowDarkColor = 0; //否则为黑色 + if (token.GetCount()>=6) //如果指定了深色阴影 { - pSettings->m_nShadowLightColor = pSettings->_httoi(token.GetArgument(5)); //ȡӰ - pSettings->m_nShadow[3] = pSettings->_StrToInt(token.GetArgument(4), pSettings->m_nShadow[2]); //ȡ + pSettings->m_nShadowLightColor = pSettings->_httoi(token.GetArgument(5)); //读取阴影 + pSettings->m_nShadow[3] = pSettings->_StrToInt(token.GetArgument(4), pSettings->m_nShadow[2]); //读取深度 } else { - //pSettings->m_nShadowLightColor = pSettings->m_nShadowLightColor; //dzɫӰͬ - pSettings->m_nShadow[3] = pSettings->m_nShadow[2]; //Ҳͬ + //pSettings->m_nShadowLightColor = pSettings->m_nShadowLightColor; //否则和浅色阴影相同 + pSettings->m_nShadow[3] = pSettings->m_nShadow[2]; //深度也相同 } RefreshAlphaTable(); } @@ -840,7 +840,7 @@ class CControlCenter: public IControlCenter LPTSTR pnext = p; for (; *pnext; pnext++); - //"lr oSVbN=0,0" ݂ȕ𕪊 + //"MS Pゴシック=0,0" みたいな文字列を分割 LPTSTR value = _tcschr(p, _T('=')); CStringTokenizer token; int argc = 0; @@ -854,7 +854,7 @@ class CControlCenter: public IControlCenter CFontIndividual fi(buff); const CFontSettings& fsCommon = pSettings->m_FontSettings; CFontSettings& fs = fi.GetIndividual(); - //Individual΋ʐݒg + //Individualが無ければ共通設定を使う fs = fsCommon; for (int i = 0; i < MAX_FONT_SETTINGS; i++) { LPCTSTR arg = token.GetArgument(i); diff --git a/strtoken.h b/strtoken.h index 7f45799..e660749 100644 --- a/strtoken.h +++ b/strtoken.h @@ -1,6 +1,6 @@ #pragma once -// +//例 // 'a,b,c,d' { "a", "b", "c", "d" } // 'a,,b,c,' { "a", "", "b", "c", "" } // '"a,b",c' { ""a,b"", "c" } diff --git a/supinfo.h b/supinfo.h index c1ceb69..9bbfa8a 100644 --- a/supinfo.h +++ b/supinfo.h @@ -9,7 +9,7 @@ typedef struct { // BYTE reserved[256]; } GDIPP_CREATE_MAGIC; -//Q +//参照 //http://www.catch22.net/tuts/undoc01.asp #ifdef _GDIPP_EXE @@ -42,7 +42,7 @@ EXTERN_C LPWSTR WINAPI GdippEnvironment(DWORD& dwCreationFlags, LPVOID lpEnviron -//qvZXɂgdi++Kp +//子プロセスにも自動でgdi++適用 template BOOL _CreateProcessAorW(const _TCHAR* lpApp, _TCHAR* lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, const _TCHAR* lpDir, _STARTUPINFO* psi, LPPROCESS_INFORMATION ppi, _Function fn) { @@ -165,7 +165,7 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) // WriteFile(logfile, L"lpApp=", 12, &aa, NULL); // WriteFile(logfile, lpApp, _tcslen(lpApp)*2, &aa, NULL); // WriteFile(logfile, _T("\n"), 2, &aa, NULL); - vlpApp = _tcsstr(vlpApp+1, _T(" ")); //õһոڵλ + vlpApp = _tcsstr(vlpApp+1, _T(" ")); //获得第一个空格所在的位置 ret.assign(lpApp); if (vlpApp) ret.resize(vlpApp-lpApp); @@ -176,7 +176,7 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) { int p = ret.find_last_of(_T("\\")); if (p!=-1) - ret.erase(0, p+1); //·ɾ· + ret.erase(0, p+1); //如果有路径就删掉路径 // WriteFile(logfile, ret.c_str(), ret.length()*2, &aa, NULL); // WriteFile(logfile, _T("\n"), 2, &aa, NULL); // WriteFile(logfile, _T("==========\n"), 24, &aa, NULL); @@ -185,13 +185,13 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) } else { - ret+=_T(".exe"); //.exeչ + ret+=_T(".exe"); //加上.exe扩展名再试 DWORD fa = GetFileAttributes(ret.c_str()); if (fa!=INVALID_FILE_ATTRIBUTES && fa!=FILE_ATTRIBUTE_DIRECTORY) { int p = ret.find_last_of(_T("\\")); if (p!=-1) - ret.erase(0, p+1); //·ɾ· + ret.erase(0, p+1); //如果有路径就删掉路径 // WriteFile(logfile, ret.c_str(), ret.length()*2, &aa, NULL); // WriteFile(logfile, _T("\n"), 2, &aa, NULL); // WriteFile(logfile, _T("==========\n"), 24, &aa, NULL); @@ -221,7 +221,7 @@ static wstring GetExeName(LPCTSTR lpApp, LPTSTR lpCmd) // WriteFile(logfile, _T("\n"), 2, &aa, NULL); p = ret.find_last_of(_T("\\")); if (p>0) - ret.erase(0, p+1); //·ɾ· + ret.erase(0, p+1); //如果有路径就删掉路径 // WriteFile(logfile, ret.c_str(), ret.length()*2, &aa, NULL); // WriteFile(logfile, _T("\n"), 2, &aa, NULL); // WriteFile(logfile, _T("==========\n"), 24, &aa, NULL); diff --git a/tlsdata.h b/tlsdata.h index 1c0831f..b42574e 100644 --- a/tlsdata.h +++ b/tlsdata.h @@ -51,7 +51,7 @@ class CTlsData if(tlsindex == INVALID_TLS_VALUE) { return; } - ThreadTerm(); //Ȃƃ[N + ThreadTerm(); //これ入れないとリークする ::TlsFree(tlsindex); tlsindex = INVALID_TLS_VALUE; From 3668c9e551672dea0f12f737dbbaf7c43bb8cd2b Mon Sep 17 00:00:00 2001 From: namazso <8676443+namazso@users.noreply.github.com> Date: Sun, 6 Dec 2020 11:43:08 +0100 Subject: [PATCH 4/6] add utf8 codepage pragma to rc files --- gdidll.rc | 4 ++-- gdiexe.rc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gdidll.rc b/gdidll.rc index 36c13da..d15ecbc 100644 --- a/gdidll.rc +++ b/gdidll.rc @@ -1,5 +1,7 @@ // Microsoft Visual C++ generated resource script. // +#pragma code_page(65001) + #include "resource." #define APSTUDIO_READONLY_SYMBOLS @@ -16,7 +18,6 @@ #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEUSD) LANGUAGE LANG_NEUTRAL, SUBLANG_SYS_DEFAULT -#pragma code_page(936) ///////////////////////////////////////////////////////////////////////////// // @@ -67,7 +68,6 @@ END #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#pragma code_page(936) #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// diff --git a/gdiexe.rc b/gdiexe.rc index a3d9e45..3addf8b 100644 --- a/gdiexe.rc +++ b/gdiexe.rc @@ -1,3 +1,4 @@ +#pragma code_page(65001) #ifdef RC_INVOKED #include #endif @@ -54,7 +55,6 @@ IDC_EXEC "error: 0x%08x\n実行できません." //えーご(適当) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) STRINGTABLE DISCARDABLE { From f2e3ac85c60bc8f407077057a9b61abf5b0f26b7 Mon Sep 17 00:00:00 2001 From: extratype Date: Wed, 6 Jan 2021 22:13:10 +0900 Subject: [PATCH 5/6] Add /utf-8 build option to handle warning C4819 --- gdipp.vcxproj | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/gdipp.vcxproj b/gdipp.vcxproj index bf8b26e..83aee03 100644 --- a/gdipp.vcxproj +++ b/gdipp.vcxproj @@ -288,6 +288,7 @@ Level3 EditAndContinue + /utf-8 %(AdditionalOptions) freetype.lib;usp10.lib;%(AdditionalDependencies) @@ -315,6 +316,7 @@ Level3 EditAndContinue + /utf-8 %(AdditionalOptions) freetype_inf.lib;usp10.lib;%(AdditionalDependencies) @@ -344,6 +346,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) @@ -374,6 +377,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) @@ -402,6 +406,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) @@ -429,6 +434,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) @@ -458,7 +464,7 @@ Level3 ProgramDatabase $(SolutionDir)deps\include;%(AdditionalIncludeDirectories) - /Zc:threadSafeInit- %(AdditionalOptions) + /Zc:threadSafeInit- /utf-8 %(AdditionalOptions) freetype.lib;usp10.lib;dwrite.lib;%(AdditionalDependencies) @@ -492,6 +498,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype_inf.lib;usp10.lib;dwrite.lib;%(AdditionalDependencies) @@ -525,6 +532,7 @@ Level3 ProgramDatabase $(SolutionDir)deps\include;%(AdditionalIncludeDirectories) + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) @@ -559,6 +567,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64_inf.lib;usp10.lib;%(AdditionalDependencies) @@ -590,6 +599,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) @@ -620,6 +630,7 @@ Level3 ProgramDatabase + /utf-8 %(AdditionalOptions) freetype64.lib;usp10.lib;%(AdditionalDependencies) From 905f74b4e37c60ab0a8e139248e0fad1af0540a9 Mon Sep 17 00:00:00 2001 From: extratype Date: Wed, 6 Jan 2021 22:37:17 +0900 Subject: [PATCH 6/6] Export FT_Glyph_To_BitmapEx in the patched freetype --- doc/glyph_to_bitmapex.diff | 22 +++++++++++++++++----- ft.cpp | 10 ---------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/doc/glyph_to_bitmapex.diff b/doc/glyph_to_bitmapex.diff index 185f236..cc98e0d 100644 --- a/doc/glyph_to_bitmapex.diff +++ b/doc/glyph_to_bitmapex.diff @@ -1,8 +1,3 @@ - src/base/ftglyph.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 112 insertions(+) - -diff --git a/src/base/ftglyph.c b/src/base/ftglyph.c -index 27402ecf8..7637388a8 100644 --- a/src/base/ftglyph.c +++ b/src/base/ftglyph.c @@ -634,6 +634,118 @@ @@ -124,3 +119,20 @@ index 27402ecf8..7637388a8 100644 /* documentation is in ftglyph.h */ FT_EXPORT_DEF( void ) +--- a/include/freetype/ftglyph.h ++++ b/include/freetype/ftglyph.h +@@ -574,6 +574,14 @@ + FT_Vector* origin, + FT_Bool destroy ); + ++ FT_EXPORT(FT_Error) ++ FT_Glyph_To_BitmapEx(FT_Glyph* the_glyph, ++ FT_Render_Mode render_mode, ++ FT_Vector* origin, ++ FT_Bool destroy, ++ FT_Bool loadcolor, ++ FT_UInt glyphindex, ++ FT_Face face); + + /************************************************************************** + * diff --git a/ft.cpp b/ft.cpp index cdde467..106f23d 100644 --- a/ft.cpp +++ b/ft.cpp @@ -99,16 +99,6 @@ void Log(wchar_t* Msg) fclose(f); } -FT_EXPORT_DEF(FT_Error) -FT_Glyph_To_BitmapEx(FT_Glyph* the_glyph, - FT_Render_Mode render_mode, - FT_Vector* origin, - FT_Bool destroy, - FT_Bool loadcolor, - FT_UInt glyphindex, - FT_Face face); - - class CAlphaBlend { private: