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 @@ public: *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 @@ public: } }; -// 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 @@ private: 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 @@ public: #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 @@ public: 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 @@ public: 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 @@ public: #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 @@ private: 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 FreeTypeGetGlyph( // 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 @@ private: 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 FreeTypeGetGlyph( // 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 @@ public: class FreeTypeMruCounter { private: - int m_mrucounter; //GCp + int m_mrucounter; //GC用 public: FreeTypeMruCounter(int n) @@ -133,35 +133,35 @@ public: { } - //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 @@ private: 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 @@ public: }; -// tHgFaceID(intgƂɂ) +// フォント名とFaceID(intを使うことにする) //extern CFontSetCache g_fsetcache; extern CHashedStringList FontNameCache; class FreeTypeFontInfo : public FreeTypeMruCounter, public FreeTypeGCCounter @@ -352,15 +352,15 @@ public: { 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: 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 @@ public: } }; -//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 @@ public: }; 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 @@ SKIP: 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 @@ SKIP: #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 @@ SKIP: 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 @@ SKIP: { 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::IsExeUnload(LPCTSTR lpApp) 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 @@ public: 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 @@ public: 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 @@ public: if(tlsindex == INVALID_TLS_VALUE) { return; } - ThreadTerm(); //Ȃƃ[N + ThreadTerm(); //これ入れないとリークする ::TlsFree(tlsindex); tlsindex = INVALID_TLS_VALUE;