mirror of
https://github.com/snowie2000/mactype.git
synced 2025-01-05 10:17:02 +08:00
manually correct ambigous encoding ones
This commit is contained in:
parent
412be722a4
commit
cc82d3a2bb
20
cache.cpp
20
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;
|
||||
}
|
||||
//カウンタ超過
|
||||
//ただしサイズが全く同じなら再生成しない
|
||||
//カウンタ超過
|
||||
//ただしサイズが全く同じなら再生成しない
|
||||
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);
|
||||
|
||||
//メモリ不足等でhbmpNew==NULLの場合を想定し、
|
||||
//成功したときのみキャッシュを更新
|
||||
//メモリ不足等で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は多分ページ境界かセグメント境界
|
||||
//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;
|
||||
}
|
||||
|
||||
//クリッピング
|
||||
//クリッピング
|
||||
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
|
||||
//無意味にアセンブリ化
|
||||
//無意味にアセンブリ化
|
||||
__asm {
|
||||
mov ebx, dword ptr [Yd]
|
||||
mov edx, dword ptr [lpPixels]
|
||||
|
6
cache.h
6
cache.h
@ -58,11 +58,11 @@ typedef StringHashT<LF_FACESIZE,true> StringHashFont;
|
||||
typedef StringHashT<MAX_PATH,true> 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のビットマップキャッシュ
|
||||
// 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);
|
||||
|
32
common.h
32
common.h
@ -91,7 +91,7 @@ FORCEINLINE HINSTANCE GetDLLInstance()
|
||||
return g_hinstDLL;
|
||||
}
|
||||
|
||||
//排他制御
|
||||
//排他制御
|
||||
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)sprintfは1024文字以上返してこない
|
||||
//w(v)sprintfは1024文字以上返してこない
|
||||
TCHAR szBuffer[10240];
|
||||
wvsprintf(szBuffer, pszFormat, argptr);
|
||||
|
||||
//デバッガをアタッチしてる時はデバッガにメッセージを出す
|
||||
//デバッガをアタッチしてる時はデバッガにメッセージを出す
|
||||
//if (IsDebuggerPresent()) {
|
||||
OutputDebugString(szBuffer);
|
||||
return;
|
||||
@ -188,7 +188,7 @@ static void _Trace(LPCTSTR pszFormat, ...)
|
||||
}
|
||||
#else //!_DEBUG
|
||||
#define TRACE NOP_FUNCTION
|
||||
//↓PSDK 2003R2のwinnt.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マクロ
|
||||
//使用例: 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)sprintfは1024文字以上返してこない
|
||||
//w(v)sprintfは1024文字以上返してこない
|
||||
TCHAR szBuffer[1024];
|
||||
wvsprintf(szBuffer, pszFormat, argptr);
|
||||
OutputDebugString(szBuffer);
|
||||
@ -332,7 +332,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
// 使用後はfreeで開放する事
|
||||
// 使用後は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<typename T> FORCEINLINE T Bound(T x, T m, T M) { return (x < m) ? m : (
|
||||
template<typename T> FORCEINLINE int Sgn(T x, T y) { return (x > y) ? 1 : ((x < y) ? -1 : 0); }
|
||||
|
||||
|
||||
//型チェック機能つきDeleteXXX/SelectXXX
|
||||
//SelectObject/DeleteObjectは使用できなくなる
|
||||
//型チェック機能つきDeleteXXX/SelectXXX
|
||||
//SelectObject/DeleteObjectは使用できなくなる
|
||||
|
||||
#ifdef _DEBUG
|
||||
#undef DeletePen
|
||||
@ -448,8 +448,8 @@ DEFINE_SELECT_FUNCTION(HBITMAP, Bitmap)
|
||||
#endif //_DEBUG
|
||||
|
||||
|
||||
//TRACEマクロ
|
||||
//使用例: 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;
|
||||
}
|
||||
|
||||
//使用例
|
||||
//使用例
|
||||
//{
|
||||
// CDebugElapsedCounter _cntr("hogehoge");
|
||||
// : (適当な処理)
|
||||
// : (適当な処理)
|
||||
//}
|
||||
//出力例: "hogehoge: 10000 clocks"
|
||||
//出力例: "hogehoge: 10000 clocks"
|
||||
class CDebugElapsedCounter
|
||||
{
|
||||
private:
|
||||
@ -577,7 +577,7 @@ int _httoi(const TCHAR *value)
|
||||
return result;
|
||||
}
|
||||
|
||||
//atofにデフォルト値を返せるようにしたような物
|
||||
//atofにデフォルト値を返せるようにしたような物
|
||||
float _StrToFloat(LPCTSTR pStr, float fDefault)
|
||||
{
|
||||
#define isspace(ch) (ch == _T('\t') || ch == _T(' '))
|
||||
|
48
dll.cpp
48
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 ;
|
||||
}
|
||||
|
70
expfunc.cpp
70
expfunc.cpp
@ -13,7 +13,7 @@
|
||||
#include <VersionHelpers.h>
|
||||
#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 <shlwapi.h>
|
||||
#include "dll.h"
|
||||
|
||||
//kernel32専用GetProcAddressモドキ
|
||||
//kernel32専用GetProcAddressモドキ
|
||||
FARPROC K32GetProcAddress(LPCSTR lpProcName)
|
||||
{
|
||||
#ifndef _WIN64
|
||||
//序数渡しには対応しない
|
||||
//序数渡しには対応しない
|
||||
Assert(!IS_INTRESOURCE(lpProcName));
|
||||
|
||||
//kernel32のベースアドレス取得
|
||||
//kernel32のベースアドレス取得
|
||||
LPBYTE pBase = (LPBYTE)GetModuleHandleA("kernel32.dll");
|
||||
|
||||
//この辺は100%成功するはずなのでエラーチェックしない
|
||||
//この辺は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のベースアドレス取得
|
||||
//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];
|
||||
|
||||
//注: dllpathをWORD境界にしないと場合によっては正常に動作しない
|
||||
//注: 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ウ<EFBFBD>シサッ
|
||||
bool initWow64(LPDWORD remoteaddr, LONG orgEIP) //Wow64初始化
|
||||
{
|
||||
//WORD境界チェック
|
||||
//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)
|
||||
|
||||
//なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので
|
||||
//kernel32のヘッダから自前で取得する
|
||||
//なぜか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]//ユ篋<EFBFBD>アコ<EFBFBD>axヨミア」エ豬トセヘハヌk32オトサ<EFBFBD>キチヒ
|
||||
ヤレwin7サ<EFBFBD>テオトハヌ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のパス
|
||||
// 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ホサウフミ<EFBFBD><EFBFBD>シサッ
|
||||
bool init32(LPDWORD remoteaddr, LONG orgEIP) //32位程序初始化
|
||||
{
|
||||
//WORD境界チェック
|
||||
//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)
|
||||
|
||||
//なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので
|
||||
//kernel32のヘッダから自前で取得する
|
||||
//なぜか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のパス
|
||||
// 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)
|
||||
|
||||
//なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので
|
||||
//kernel32のヘッダから自前で取得する
|
||||
//なぜか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のパス
|
||||
// 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のパス
|
||||
// gdi++.dllのパス
|
||||
|
||||
return !!nSize;
|
||||
}
|
||||
|
||||
bool init(DWORD_PTR* remoteaddr, DWORD_PTR orgEIP)
|
||||
{
|
||||
//WORD境界チェック
|
||||
//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)
|
||||
|
||||
//なぜかGetProcAddressでLoadLibraryWのアドレスが正しく取れないことがあるので
|
||||
//kernel32のヘッダから自前で取得する
|
||||
//なぜか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のパス
|
||||
// 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 <poppack.h>
|
||||
|
||||
// ーイネォオトネ。オテユ賁オマオヘウミナマ「
|
||||
// 安全的取得真实系统信息
|
||||
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
|
||||
// 止めているプロセスにLoadLibraryするコードを注入
|
||||
// 止めているプロセスに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なので基本的に成功するはず
|
||||
//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なので基本的に成功するはず
|
||||
//CREATE_SUSPENDEDなので基本的に成功するはず
|
||||
if(!GetThreadContext(ppi->hThread, &ctx))
|
||||
return false;
|
||||
|
||||
|
258
ft - non-ref.cpp
258
ft - non-ref.cpp
@ -1,22 +1,22 @@
|
||||
/* 2006-10-23(by 555)
|
||||
* http://hp.vector.co.jp/authors/VA028002/winfreetype.c (higambana(菅野友紀))
|
||||
* を丸写し
|
||||
* 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(菅野友紀))
|
||||
* を参考にしてやり直し
|
||||
* http://hp.vector.co.jp/authors/VA028002/freetype.html (higambana(菅野友紀))
|
||||
* を参考にしてやり直し
|
||||
*/
|
||||
/* 2006-10-29(by 555)
|
||||
* 693氏(と呼ぶことにする)の精力的な活動によって出来上がったウハウハソースと
|
||||
* 上記サイトの変更点を元にみみっちい修正。(ベースgdi0164)
|
||||
* 693氏(と呼ぶことにする)の精力的な活動によって出来上がったウハウハソースと
|
||||
* 上記サイトの変更点を元にみみっちい修正。(ベースgdi0164)
|
||||
*/
|
||||
/* (by 555)
|
||||
* さらに線引きもウハウハにしてもらったgdi0168を元に
|
||||
* イタリックとボールドを追加。
|
||||
* さらに線引きもウハウハにしてもらったgdi0168を元に
|
||||
* イタリックとボールドを追加。
|
||||
*/
|
||||
/* (by sy567)
|
||||
* 太字のアルゴリズムを変更。
|
||||
* ガンマ補正を実装してみる。
|
||||
* 太字のアルゴリズムを変更。
|
||||
* ガンマ補正を実装してみる。
|
||||
*/
|
||||
#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];
|
||||
// 通常のアルファ値補正
|
||||
// 通常のアルファ値補正
|
||||
int tunetbl[256];
|
||||
int tunetblR[256];
|
||||
int tunetblG[256];
|
||||
int tunetblB[256];
|
||||
// 影文字用のアルファ値補正
|
||||
// 影文字用のアルファ値補正
|
||||
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(液晶)用のアルファブレンド(サブピクセルレンダリング)
|
||||
// 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);
|
||||
// アルファ値を補正
|
||||
// アルファ値を補正
|
||||
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);
|
||||
}
|
||||
|
||||
// アルファブレンド(256階調)
|
||||
// アルファブレンド(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);
|
||||
// アルファ値を補正
|
||||
// アルファ値を補正
|
||||
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;
|
||||
|
||||
|
||||
// 2階調
|
||||
// 2階調
|
||||
static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo,
|
||||
CAlphaBlendColor& ab, int x, int y)
|
||||
{
|
||||
@ -493,8 +493,8 @@ static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo,
|
||||
}
|
||||
}
|
||||
|
||||
// LCD(液晶)用描画(サブピクセルレンダリング)
|
||||
// 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;
|
||||
|
||||
// LCDは3サブピクセル分ある
|
||||
// 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の順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
// これは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の順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
alphaR = p[i + 0];
|
||||
alphaG = p[i + 1];
|
||||
alphaB = p[i + 2];
|
||||
@ -659,14 +659,14 @@ static void FreeTypeDrawBitmapGray(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor&
|
||||
}
|
||||
}
|
||||
|
||||
// グリフビットマップのレンダリング
|
||||
// グリフビットマップのレンダリング
|
||||
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);
|
||||
}
|
||||
|
||||
// 縦書き用のレンダリング(コピペ手抜き)
|
||||
// 2階調
|
||||
// 縦書き用のレンダリング(コピペ手抜き)
|
||||
// 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 エラーチェック
|
||||
if (cache.GetPixel(dx, dy) != CLR_INVALID) { // dx dy エラーチェック
|
||||
cache.SetCurrentPixel(color);
|
||||
}
|
||||
}
|
||||
@ -716,8 +716,8 @@ static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo,
|
||||
}
|
||||
}
|
||||
|
||||
// LCD(液晶)用描画(サブピクセルレンダリング)
|
||||
// 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();
|
||||
|
||||
// LCDは3サブピクセル分ある
|
||||
// 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の順にサブピクセルがあるディスプレイ用
|
||||
// これは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の順にサブピクセルがあるディスプレイ用
|
||||
// これは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;
|
||||
|
||||
//前の方法だと、arial.ttfが無いとまずそうなので
|
||||
//適当に使えるアウトラインフォントを探す
|
||||
//前の方法だと、arial.ttfが無いとまずそうなので
|
||||
//適当に使えるアウトラインフォントを探す
|
||||
HDC hdc = CreateCompatibleDC(NULL);
|
||||
EnumFontFamilies(hdc, NULL, EnumFontFamProc, reinterpret_cast<LPARAM>(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!!シ<EFBFBD><EFBFBD>ユーラク゚カネ」ャ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);//ネ郢鈹ヌハ昕<EFBFBD>ヨフ螢ャスサササソ昤゚
|
||||
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){
|
||||
// セル高さ
|
||||
// セル高さ
|
||||
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;
|
||||
|
||||
/* ビットマップまでキャッシュする場合はFT_LOAD_RENDER | FT_LOAD_TARGET_*
|
||||
* とする。ただし途中でTARGETを変更した場合等はキャッシュが邪魔する。
|
||||
* そういう時はFT_LOAD_DEFAULTにしてFTC_ImageCache_Lookup後に
|
||||
* FT_Glyph_To_Bitmapしたほうが都合がいいと思う。
|
||||
/* ビットマップまでキャッシュする場合はFT_LOAD_RENDER | FT_LOAD_TARGET_*
|
||||
* とする。ただし途中でTARGETを変更した場合等はキャッシュが邪魔する。
|
||||
* そういう時はFT_LOAD_DEFAULTにしてFTC_ImageCache_Lookup後に
|
||||
* FT_Glyph_To_Bitmapしたほうが都合がいいと思う。
|
||||
*/
|
||||
// Boldは太り具合というものがあるので本当はこれだけでは足りない気がする。
|
||||
// Boldは太り具合というものがあるので本当はこれだけでは足りない気がする。
|
||||
/*if(IsFontBold(lf) && !(freetype_face->style_flags & FT_STYLE_FLAG_BOLD) ||
|
||||
lf.lfItalic && !(freetype_face->style_flags & FT_STYLE_FLAG_ITALIC)){
|
||||
// ボールド、イタリックは後でレンダリングする
|
||||
// 多少速度は劣化するだろうけど仕方ない。
|
||||
// ボールド、イタリックは後でレンダリングする
|
||||
// 多少速度は劣化するだろうけど仕方ない。
|
||||
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;
|
||||
|
||||
// ヒンティング
|
||||
// ヒンティング
|
||||
switch (pfs->GetHintingMode()) {
|
||||
case 0:
|
||||
// ignore.
|
||||
@ -1314,7 +1314,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo)
|
||||
}
|
||||
|
||||
//如果含有内置hinting则启用default模式,否则使用autohint模式,以保证效果
|
||||
// アンチエイリアス
|
||||
// アンチエイリアス
|
||||
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」ャオォハヌエ<EFBFBD>ェチヒミ。ラヨフ乕intingソェケリ
|
||||
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;
|
||||
}
|
||||
|
||||
// 縦にするやつはtrue(ASCIIと半角カナはfalse)
|
||||
// 縦にするやつはtrue(ASCIIと半角カナはfalse)
|
||||
inline bool IsVerticalChar(WCHAR wch){
|
||||
if(wch < 0x80)
|
||||
return false;
|
||||
if(0xFF61 <= wch && wch <= 0xFF9F)
|
||||
return false;
|
||||
// 本当はもっと真面目にやらないとまずいが。
|
||||
// 本当はもっと真面目にやらないとまずいが。
|
||||
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)); //ハヌキ<EFBFBD>ェキ釚ナ
|
||||
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;i<LinkNum;i++)
|
||||
{
|
||||
lpfontlink[i] = new WORD[cbString];
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ウ<EFBFBD>シサッホェボチエスモ
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //初始化为无链接
|
||||
}
|
||||
//
|
||||
hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体
|
||||
@ -1579,8 +1579,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString,
|
||||
GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //index的文字必须计算宽度
|
||||
if (FTInfo.font_type.height<=pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height))
|
||||
{
|
||||
f_glyph=false; //ハケモテオ耻<EFBFBD>ャイササ賚シ
|
||||
*drState=FT_DRAW_EMBEDDED_BITMAP; //ノ靹テホェオ耻<EFBFBD>賚シキスハス
|
||||
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]) //サケテサウ<EFBFBD>シサックテラヨフ蠏ト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); //ス<EFBFBD>ミ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 //ハケモテfreetypeス<EFBFBD>ミfontlink
|
||||
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;
|
||||
// ヒンティング
|
||||
// ヒンティング
|
||||
//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;
|
||||
}
|
||||
// アンチエイリアス
|
||||
// アンチエイリアス
|
||||
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」ャオォハヌエ<EFBFBD>ェチヒミ。ラヨフ乕intingソェケリ
|
||||
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; //ハケモテオ耻<EFBFBD>ャイササ賚シ
|
||||
*drState=FT_DRAW_EMBEDDED_BITMAP; //ノ靹テホェオ耻<EFBFBD>賚シキスハス
|
||||
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) //ボミァホトラヨ」ャカ<EFBFBD>メテサモミハツマネナナー貊<EFBFBD>゚ハヌナナー豬トラ鋓<EFBFBD>サク<EFBFBD>ヨキ鈆ヒ
|
||||
*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;
|
||||
}
|
||||
|
||||
// 縦書き
|
||||
// 縦書き
|
||||
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;
|
||||
@ -1762,7 +1762,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString,
|
||||
}
|
||||
|
||||
|
||||
// 縦横
|
||||
// 縦横
|
||||
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); //サ<EFBFBD>テソ昮ネ
|
||||
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) {
|
||||
//キャッシュ化
|
||||
//キャッシュ化
|
||||
if (glyph_index) {
|
||||
|
||||
if (bGlyphIndex) {
|
||||
@ -1904,7 +1904,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString,
|
||||
}
|
||||
|
||||
cont:
|
||||
*Dx = FTInfo.x; //Dxオトホサヨテハヌマツメサク<EFBFBD>ヨキ釤ェハシオトサ<EFBFBD>シホサヨテ」ャイ「イサハヌマツメサク<EFBFBD>ヨキ釤ェハシサュオトホサヨテ
|
||||
*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)); //ハヌキ<EFBFBD>ェキ釚ナ
|
||||
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;i<LinkNum;i++)
|
||||
{
|
||||
lpfontlink[i] = new WORD[cbString];
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ウ<EFBFBD>シサッホェボチエスモ
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //初始化为无链接
|
||||
}
|
||||
//
|
||||
hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体
|
||||
@ -1993,7 +1993,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
//fontlink
|
||||
|
||||
/*
|
||||
if (!FTInfo.lpDx) //テサモミヤ、マネシニヒ翡ナー譽ャミ靨ェサ<EFBFBD>テテソク<EFBFBD>トラヨオトソ昮ネミナマ「
|
||||
if (!FTInfo.lpDx) //没有预先计算排版,需要获得每个文字的宽度信息
|
||||
{
|
||||
if (bGlyphIndex)
|
||||
{
|
||||
@ -2008,7 +2008,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
}
|
||||
else
|
||||
{
|
||||
//ヤ、マネシニヒ羲テチヒナナー譽ャヨサミ靨ェサ<EFBFBD>テラ鋓<EFBFBD>サク<EFBFBD>ヨオトミナマ「セヘソノメヤチヒ
|
||||
//预先计算好了排版,只需要获得最后一个字的信息就可以了
|
||||
if (bGlyphIndex)
|
||||
{
|
||||
(GetCharWidthI(FTInfo.hdc, *(((LPWORD)lpString)+cbString-1), 1, (((LPWORD)lpString)+cbString-1), gdi32w+cbString-1));
|
||||
@ -2086,7 +2086,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
f_glyph = true;
|
||||
*AAList = AAMode;
|
||||
}
|
||||
GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //モミミァホトラヨ」ャシニヒ譱昮ネ
|
||||
GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //有效文字,计算宽度
|
||||
}
|
||||
if (lpString == lpStart && FTInfo.font_type.flags & FT_LOAD_FORCE_AUTOHINT) {
|
||||
// FORCE_AUTOHINT
|
||||
@ -2109,8 +2109,8 @@ BOOL ForEachGetGlyphGGO(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) //ボミァホトラヨ」ャカ<EFBFBD>メテサモミハツマネナナー貊<EFBFBD>゚ハヌナナー豬トラ鋓<EFBFBD>サク<EFBFBD>ヨキ鈆ヒ
|
||||
*drState = FT_DRAW_NOTFOUND; //找不到文字
|
||||
if ((!FTInfo.lpDx || lpString == lpEnd - 1) && !bGlyphIndex) //无效文字,而且没有事先排版或者是排版的最后一个字符了
|
||||
{
|
||||
GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x);
|
||||
}
|
||||
@ -2122,7 +2122,7 @@ BOOL ForEachGetGlyphGGO(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));
|
||||
@ -2159,7 +2159,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
}
|
||||
|
||||
|
||||
// 縦横
|
||||
// 縦横
|
||||
if(bVertical && IsVerticalChar(wch)){
|
||||
FTInfo.font_type.flags |= FT_LOAD_VERTICAL_LAYOUT;
|
||||
if(bLcdMode){
|
||||
@ -2261,7 +2261,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
FTInfo.x += bWidthGDI32 ? gdi32x : cx;
|
||||
} else */
|
||||
{
|
||||
int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //サ<EFBFBD>テソ昮ネ
|
||||
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; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置
|
||||
@ -2280,7 +2280,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
FTInfo.x += FTInfo.params->charExtra;
|
||||
|
||||
//if (bSizeOnly || bOwnCache) {
|
||||
//キャッシュ化
|
||||
//キャッシュ化
|
||||
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);//サュメ<EFBFBD>ー
|
||||
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); //サュメ<EFBFBD>ー
|
||||
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 sRGBオトRGB->Labヒ羚ィス<EFBDA8>ミササヒ罐ャLホェノォイハハモセ<EFBE93>チカネ
|
||||
//采用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, // デバイスコンテキストのハンドル
|
||||
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())
|
||||
{
|
||||
//ボハモオラノォホハフ筌ャヌソヨニソェニ<EFBFBD><EFBFBD>ー
|
||||
//无视底色问题,强制开启阴影
|
||||
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); //ク<EFBFBD>ンノォイ鋙<EFBFBD>鋐<EFBFBD>ーナィカネ
|
||||
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; //下線の位置
|
||||
int yPos = 0; //下線の位置
|
||||
int height = 0;
|
||||
int thickness = 0; // 適当な太さ
|
||||
int thickness = 0; // 適当な太さ
|
||||
switch (pSettings->FontLoader()) {
|
||||
case SETTING_FONTLOADER_FREETYPE:
|
||||
yPos = y - otm.otmsUnderscorePosition;
|
||||
@ -2608,7 +2608,7 @@ BOOL FreeTypeTextOut(
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL FreeTypeGetGlyph( //サ<EFBFBD>テヒ<EFBFBD>ミヘシミホコヘミ靨ェオトソ昮ネ
|
||||
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; //サ<EFBFBD>テチヒソ昮ネ
|
||||
width = FTInfo.px; //获得了宽度
|
||||
return nRet;
|
||||
}
|
||||
|
||||
@ -2644,9 +2644,9 @@ void VertFinalizer(void *object){
|
||||
ft2vert_final(face, (struct ft2vert_st *)face->generic.data);
|
||||
}
|
||||
//
|
||||
// グリフをIVSで指定された字形をサポートするかどうか調べ、
|
||||
// サポートしている場合はグリフを置換する。
|
||||
// サポートしていなければ何もしない。
|
||||
// グリフを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; // 置換を実行
|
||||
// ASCII空白のグリフを取得
|
||||
pwOutGlyphs[*pcGlyphs - 1] = glyph_index; // 置換を実行
|
||||
// ASCII空白のグリフを取得
|
||||
glyph_index = FTC_CMapCache_Lookup(
|
||||
cmap_cache,
|
||||
FTInfo.font_type.face_id,
|
||||
FTInfo.cmap_index,
|
||||
' ');
|
||||
// ゼロ幅グリフにする
|
||||
// ゼロ幅グリフにする
|
||||
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 {
|
||||
// フォントは指定された字形を持たない。IVSのグリフを取得
|
||||
// フォントは指定された字形を持たない。IVSのグリフを取得
|
||||
glyph_index = FTC_CMapCache_Lookup(
|
||||
cmap_cache,
|
||||
FTInfo.font_type.face_id,
|
||||
FTInfo.cmap_index,
|
||||
vsindex + 0xE0100);
|
||||
// IVSをサポートしていないフォントはIVSのグリフを持っている可能性もほとんどない。
|
||||
// missing glyphを返すとフォールバックされてしまうため確実に持っていそうなグリフを拾う
|
||||
// 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();
|
||||
|
||||
// 名称を指定してフォントを取得
|
||||
// 名称を指定してフォントを取得
|
||||
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マクロ使用
|
||||
//面倒なのでRGBマクロ使用
|
||||
return RGB(major, minor, patch);
|
||||
}*/
|
||||
|
||||
|
||||
//新太字アルゴリズム
|
||||
//新太字アルゴリズム
|
||||
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;
|
||||
//↓これをコメントアウトしただけ
|
||||
//↓これをコメントアウトしただけ
|
||||
//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;
|
||||
}
|
||||
|
||||
//こっちは縦方向
|
||||
//こっちは縦方向
|
||||
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;
|
||||
//↑これをコメントアウトしただけ
|
||||
//↑これをコメントアウトしただけ
|
||||
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*/ )
|
||||
|
244
ft.cpp
244
ft.cpp
@ -1,9 +1,9 @@
|
||||
/* 2006-10-23(by 555)
|
||||
* http://hp.vector.co.jp/authors/VA028002/winfreetype.c (higambana(ンムメーモムシo))
|
||||
* 、<EFBFBD>靤エ、キ
|
||||
* 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<int> alphatbl;
|
||||
std::vector<int> tbl1;
|
||||
std::vector<BYTE> tbl2;
|
||||
// 通常のアルファ値補正
|
||||
// 通常のアルファ値補正
|
||||
std::vector<int> tunetbl;
|
||||
std::vector<int> tunetblR;
|
||||
std::vector<int> tunetblG;
|
||||
std::vector<int> tunetblB;
|
||||
// 影文字用のアルファ値補正
|
||||
// 影文字用のアルファ値補正
|
||||
std::vector<int> tunetblS;
|
||||
std::vector<int> tunetblRS;
|
||||
std::vector<int> tunetblGS;
|
||||
@ -420,7 +420,7 @@ FORCEINLINE BYTE DoAlphaBlend(BYTE fg, BYTE bg, int alpha)
|
||||
return s_AlphaBlendTable.doAB(fg, bg, alpha);
|
||||
}
|
||||
|
||||
// LCD(液晶)用のアルファブレンド(サブピクセルレンダリング)
|
||||
// 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);
|
||||
// アルファ値を補正
|
||||
// アルファ値を補正
|
||||
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);
|
||||
}
|
||||
|
||||
// アルファブレンド(256階調)
|
||||
// アルファブレンド(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);
|
||||
// アルファ値を補正
|
||||
// アルファ値を補正
|
||||
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;
|
||||
|
||||
|
||||
// 2階調
|
||||
// 2階調
|
||||
static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo,
|
||||
CAlphaBlendColor& ab, int x, int y)
|
||||
{
|
||||
@ -536,8 +536,8 @@ static void FreeTypeDrawBitmapPixelModeMono(FreeTypeGlyphInfo& FTGInfo,
|
||||
}
|
||||
}
|
||||
|
||||
// LCD(液晶)用描画(サブピクセルレンダリング)
|
||||
// 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;
|
||||
|
||||
// LCDは3サブピクセル分ある
|
||||
// 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の順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
// これは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の順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
// これはRGBの順にサブピクセルがあるディスプレイ用
|
||||
alphaR = p[i + 0];
|
||||
alphaG = p[i + 1];
|
||||
alphaB = p[i + 2];
|
||||
@ -795,14 +795,14 @@ static void FreeTypeDrawBitmapGray(FreeTypeGlyphInfo& FTGInfo, CAlphaBlendColor&
|
||||
}
|
||||
}
|
||||
|
||||
// グリフビットマップのレンダリング
|
||||
// グリフビットマップのレンダリング
|
||||
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;
|
||||
}
|
||||
|
||||
// 縦書き用のレンダリング(コピペ手抜き)
|
||||
// 2階調
|
||||
// 縦書き用のレンダリング(コピペ手抜き)
|
||||
// 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 エラーチェック
|
||||
if (cache.GetPixel(dx, dy) != CLR_INVALID) { // dx dy エラーチェック
|
||||
cache.SetCurrentPixel(color);
|
||||
}
|
||||
}
|
||||
@ -856,8 +856,8 @@ static void FreeTypeDrawBitmapPixelModeMonoV(FreeTypeGlyphInfo& FTGInfo,
|
||||
}
|
||||
}
|
||||
|
||||
// LCD(液晶)用描画(サブピクセルレンダリング)
|
||||
// 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();
|
||||
|
||||
// LCDは3サブピクセル分ある
|
||||
// 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の順にサブピクセルがあるディスプレイ用
|
||||
// これは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の順にサブピクセルがあるディスプレイ用
|
||||
// これは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;
|
||||
|
||||
//前の方法だと、arial.ttfが無いとまずそうなので
|
||||
//適当に使えるアウトラインフォントを探す
|
||||
//前の方法だと、arial.ttfが無いとまずそうなので
|
||||
//適当に使えるアウトラインフォントを探す
|
||||
HDC hdc = CreateCompatibleDC(NULL);
|
||||
EnumFontFamilies(hdc, NULL, EnumFontFamProc, reinterpret_cast<LPARAM>(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!!シ<EFBFBD><EFBFBD>ユーラク゚カネ」ャ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);//ネ郢鈹ヌハ昕<EFBFBD>ヨフ螢ャスサササソ昤゚
|
||||
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){
|
||||
// セル高さ
|
||||
// セル高さ
|
||||
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;
|
||||
|
||||
/* ビットマップまでキャッシュする場合はFT_LOAD_RENDER | FT_LOAD_TARGET_*
|
||||
* とする。ただし途中でTARGETを変更した場合等はキャッシュが邪魔する。
|
||||
* そういう時はFT_LOAD_DEFAULTにしてFTC_ImageCache_Lookup後に
|
||||
* FT_Glyph_To_Bitmapしたほうが都合がいいと思う。
|
||||
/* ビットマップまでキャッシュする場合はFT_LOAD_RENDER | FT_LOAD_TARGET_*
|
||||
* とする。ただし途中でTARGETを変更した場合等はキャッシュが邪魔する。
|
||||
* そういう時はFT_LOAD_DEFAULTにしてFTC_ImageCache_Lookup後に
|
||||
* FT_Glyph_To_Bitmapしたほうが都合がいいと思う。
|
||||
*/
|
||||
// Boldは太り具合というものがあるので本当はこれだけでは足りない気がする。
|
||||
// Boldは太り具合というものがあるので本当はこれだけでは足りない気がする。
|
||||
/*if(IsFontBold(lf) && !(freetype_face->style_flags & FT_STYLE_FLAG_BOLD) ||
|
||||
lf.lfItalic && !(freetype_face->style_flags & FT_STYLE_FLAG_ITALIC)){
|
||||
// ボールド、イタリックは後でレンダリングする
|
||||
// 多少速度は劣化するだろうけど仕方ない。
|
||||
// ボールド、イタリックは後でレンダリングする
|
||||
// 多少速度は劣化するだろうけど仕方ない。
|
||||
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;
|
||||
|
||||
// ヒンティング
|
||||
// ヒンティング
|
||||
switch (pfs->GetHintingMode()) {
|
||||
case 0:
|
||||
// ignore.
|
||||
@ -1465,7 +1465,7 @@ BOOL FreeTypePrepare(FreeTypeDrawInfo& FTInfo)
|
||||
}
|
||||
|
||||
//如果含有内置hinting则启用default模式,否则使用autohint模式,以保证效果
|
||||
// アンチエイリアス
|
||||
// アンチエイリアス
|
||||
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」ャオォハヌエ<EFBFBD>ェチヒミ。ラヨフ乕intingソェケリ
|
||||
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;
|
||||
}
|
||||
|
||||
// 縦にするやつはtrue(ASCIIと半角カナはfalse)
|
||||
// 縦にするやつはtrue(ASCIIと半角カナはfalse)
|
||||
inline bool IsVerticalChar(WCHAR wch) {
|
||||
if (wch < 0x80)
|
||||
return false;
|
||||
if (0xFF61 <= wch && wch <= 0xFF9F)
|
||||
return false;
|
||||
// 本当はもっと真面目にやらないとまずいが。
|
||||
// 本当はもっと真面目にやらないとまずいが。
|
||||
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)); //ハヌキ<EFBFBD>ェキ釚ナ
|
||||
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; i<LinkNum; i++)
|
||||
{
|
||||
lpfontlink[i] = new WORD[cbString];
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ウ<EFBFBD>シサッホェボチエスモ
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //初始化为无链接
|
||||
}
|
||||
//
|
||||
hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体
|
||||
@ -1755,8 +1755,8 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString,
|
||||
GetCharWidthI(FTInfo.hdc, wch, 1, (LPWORD)&wch, &gdi32x); //index的文字必须计算宽度
|
||||
if (FTInfo.font_type.height <= pSettings->BitmapHeight() && pfi->EmbeddedBmpExist(FTInfo.font_type.height))
|
||||
{
|
||||
f_glyph = false; //ハケモテオ耻<EFBFBD>ャイササ賚シ
|
||||
*drState = FT_DRAW_EMBEDDED_BITMAP; //ノ靹テホェオ耻<EFBFBD>賚シキスハス
|
||||
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]) //サケテサウ<EFBFBD>シサックテラヨフ蠏ト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); //ス<EFBFBD>ミ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 //ハケモテfreetypeス<EFBFBD>ミfontlink
|
||||
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;
|
||||
// ヒンティング
|
||||
// ヒンティング
|
||||
//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;
|
||||
}
|
||||
// アンチエイリアス
|
||||
// アンチエイリアス
|
||||
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」ャオォハヌエ<EFBFBD>ェチヒミ。ラヨフ乕intingソェケリ
|
||||
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; //ハケモテオ耻<EFBFBD>ャイササ賚シ
|
||||
*drState = FT_DRAW_EMBEDDED_BITMAP; //ノ靹テホェオ耻<EFBFBD>賚シキスハス
|
||||
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) //ボミァホトラヨ」ャカ<EFBFBD>メテサモミハツマネナナー貊<EFBFBD>゚ハヌナナー豬トラ鋓<EFBFBD>サク<EFBFBD>ヨキ鈆ヒ
|
||||
*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);
|
||||
}
|
||||
|
||||
// ・ォゥ`・ヒ・<EFBE8B>ー
|
||||
// カーニング
|
||||
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); //サ<EFBFBD>テク゚カネ
|
||||
int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //サ<EFBFBD>テソ昮ネ
|
||||
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) {
|
||||
//キャッシュ化
|
||||
//キャッシュ化
|
||||
if (glyph_index) {
|
||||
|
||||
if (bGlyphIndex) {
|
||||
@ -2123,7 +2123,7 @@ BOOL ForEachGetGlyphFT(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString,
|
||||
}
|
||||
|
||||
cont:
|
||||
*Dx = FTInfo.x; //Dxオトホサヨテハヌマツメサク<EFBFBD>ヨキ釤ェハシオトサ<EFBFBD>シホサヨテ」ャイ「イサハヌマツメサク<EFBFBD>ヨキ釤ェハシサュオトホサヨテ
|
||||
*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)); //ハヌキ<EFBFBD>ェキ釚ナ
|
||||
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; i<LinkNum; i++)
|
||||
{
|
||||
lpfontlink[i] = new WORD[cbString];
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //ウ<EFBFBD>シサッホェボチエスモ
|
||||
ZeroMemory(lpfontlink[i], sizeof(WORD)*cbString); //初始化为无链接
|
||||
}
|
||||
//
|
||||
hOldFont = (HFONT)GetCurrentObject(FTInfo.hdc, OBJ_FONT); //加载第一个字体
|
||||
@ -2214,7 +2214,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
//fontlink
|
||||
|
||||
/*
|
||||
if (!FTInfo.lpDx) //テサモミヤ、マネシニヒ翡ナー譽ャミ靨ェサ<EFBFBD>テテソク<EFBFBD>トラヨオトソ昮ネミナマ「
|
||||
if (!FTInfo.lpDx) //没有预先计算排版,需要获得每个文字的宽度信息
|
||||
{
|
||||
if (bGlyphIndex)
|
||||
{
|
||||
@ -2229,7 +2229,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
}
|
||||
else
|
||||
{
|
||||
//ヤ、マネシニヒ羲テチヒナナー譽ャヨサミ靨ェサ<EFBFBD>テラ鋓<EFBFBD>サク<EFBFBD>ヨオトミナマ「セヘソノメヤチヒ
|
||||
//预先计算好了排版,只需要获得最后一个字的信息就可以了
|
||||
if (bGlyphIndex)
|
||||
{
|
||||
(GetCharWidthI(FTInfo.hdc, *(((LPWORD)lpString)+cbString-1), 1, (((LPWORD)lpString)+cbString-1), gdi32w+cbString-1));
|
||||
@ -2309,7 +2309,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
f_glyph = true;
|
||||
*AAList = AAMode;
|
||||
}
|
||||
GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //モミミァホトラヨ」ャシニヒ譱昮ネ
|
||||
GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x); //有效文字,计算宽度
|
||||
}
|
||||
if (lpString == lpStart && FTInfo.font_type.flags & FT_LOAD_FORCE_AUTOHINT) {
|
||||
// FORCE_AUTOHINT
|
||||
@ -2333,8 +2333,8 @@ BOOL ForEachGetGlyphGGO(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) //ボミァホトラヨ」ャカ<EFBFBD>メテサモミハツマネナナー貊<EFBFBD>゚ハヌナナー豬トラ鋓<EFBFBD>サク<EFBFBD>ヨキ鈆ヒ
|
||||
*drState = FT_DRAW_NOTFOUND; //找不到文字
|
||||
if ((!FTInfo.lpDx || lpString == lpEnd - 1) && !bGlyphIndex) //无效文字,而且没有事先排版或者是排版的最后一个字符了
|
||||
{
|
||||
GetCharWidth32W(FTInfo.hdc, wch, wch, &gdi32x);
|
||||
}
|
||||
@ -2346,7 +2346,7 @@ BOOL ForEachGetGlyphGGO(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));
|
||||
@ -2385,7 +2385,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
}
|
||||
|
||||
|
||||
// 縦横
|
||||
// 縦横
|
||||
if (bVertical && IsVerticalChar(wch)) {
|
||||
FTInfo.font_type.flags |= FT_LOAD_VERTICAL_LAYOUT;
|
||||
if (bLcdMode) {
|
||||
@ -2489,7 +2489,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
} else */
|
||||
{
|
||||
int dy = clpdx.gety(0);
|
||||
int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //サ<EFBFBD>テソ昮ネ
|
||||
int dx = clpdx.get(bWidthGDI32 ? gdi32x : cx); //获得宽度
|
||||
int left = FT_BitmapGlyph((*glyph_bitmap)->ft_glyph)->left;
|
||||
if (FTInfo.x + left< FTInfo.xBase)
|
||||
FTInfo.xBase = FTInfo.x + left; //如果有字符是负数起始位置的(合成符号), 调整文字的起始位置
|
||||
@ -2510,7 +2510,7 @@ BOOL ForEachGetGlyphGGO(FreeTypeDrawInfo& FTInfo, LPCTSTR lpString, int cbString
|
||||
FTInfo.x += FTInfo.params->charExtra;
|
||||
|
||||
//if (bSizeOnly || bOwnCache) {
|
||||
//キャッシュ化
|
||||
//キャッシュ化
|
||||
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);//サュメ<EFBFBD>ー
|
||||
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); //サュメ<EFBFBD>ー
|
||||
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 sRGBオトRGB->Labヒ羚ィス<EFBDA8>ミササヒ罐ャLホェノォイハハモセ<EFBE93>チカネ
|
||||
//采用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, // デバイスコンテキストのハンドル
|
||||
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())
|
||||
{
|
||||
//ボハモオラノォホハフ筌ャヌソヨニソェニ<EFBFBD><EFBFBD>ー
|
||||
//无视底色问题,强制开启阴影
|
||||
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); //ク<EFBFBD>ンノォイ鋙<EFBFBD>鋐<EFBFBD>ーナィカネ
|
||||
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; //下線の位置
|
||||
// int yPos = 0; //下線の位置
|
||||
// int height = 0;
|
||||
// int thickness = 0; // 適当な太さ
|
||||
// int thickness = 0; // 適当な太さ
|
||||
// switch (pSettings->FontLoader()) {
|
||||
// case SETTING_FONTLOADER_FREETYPE:
|
||||
// yPos = y - otm.otmsUnderscorePosition;
|
||||
@ -2906,7 +2906,7 @@ BOOL FreeTypeTextOut(
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL FreeTypeGetGlyph( //サ<EFBFBD>テヒ<EFBFBD>ミヘシミホコヘミ靨ェオトソ昮ネ
|
||||
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; //サ<EFBFBD>テチヒソ昮ネ
|
||||
width = FTInfo.px; //获得了宽度
|
||||
return nRet;
|
||||
}
|
||||
|
||||
@ -2942,9 +2942,9 @@ void VertFinalizer(void *object) {
|
||||
ft2vert_final(face, (struct ft2vert_st *)face->generic.data);
|
||||
}
|
||||
//
|
||||
// グリフをIVSで指定された字形をサポートするかどうか調べ、
|
||||
// サポートしている場合はグリフを置換する。
|
||||
// サポートしていなければ何もしない。
|
||||
// グリフを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; // 置換を実行
|
||||
// ASCII空白のグリフを取得
|
||||
pwOutGlyphs[*pcGlyphs - 1] = glyph_index; // 置換を実行
|
||||
// ASCII空白のグリフを取得
|
||||
glyph_index = FTC_CMapCache_Lookup(
|
||||
cmap_cache,
|
||||
FTInfo.font_type.face_id,
|
||||
FTInfo.cmap_index,
|
||||
' ');
|
||||
// ゼロ幅グリフにする
|
||||
// ゼロ幅グリフにする
|
||||
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 {
|
||||
// フォントは指定された字形を持たない。IVSのグリフを取得
|
||||
// フォントは指定された字形を持たない。IVSのグリフを取得
|
||||
glyph_index = FTC_CMapCache_Lookup(
|
||||
cmap_cache,
|
||||
FTInfo.font_type.face_id,
|
||||
FTInfo.cmap_index,
|
||||
vsindex + 0xE0100);
|
||||
// IVSをサポートしていないフォントはIVSのグリフを持っている可能性もほとんどない。
|
||||
// missing glyphを返すとフォールバックされてしまうため確実に持っていそうなグリフを拾う
|
||||
// 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();
|
||||
|
||||
// 名称を指定してフォントを取得
|
||||
// 名称を指定してフォントを取得
|
||||
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マクロ使用
|
||||
//面倒なのでRGBマクロ使用
|
||||
return RGB(major, minor, patch);
|
||||
}*/
|
||||
|
||||
|
||||
//新太字アルゴリズム
|
||||
//新太字アルゴリズム
|
||||
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;
|
||||
//↓これをコメントアウトしただけ
|
||||
//↓これをコメントアウトしただけ
|
||||
//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;
|
||||
}
|
||||
|
||||
//こっちは縦方向
|
||||
//こっちは縦方向
|
||||
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;
|
||||
//↑これをコメントアウトしただけ
|
||||
//↑これをコメントアウトしただけ
|
||||
outline->points[n].y = v_cur.y + strength + in.y;
|
||||
|
||||
v_prev = v_cur;
|
||||
|
6
ft.h
6
ft.h
@ -203,7 +203,7 @@ struct FREETYPE_PARAMS
|
||||
ZeroMemory(this, sizeof(*this));
|
||||
}
|
||||
|
||||
//FreeTypeTextOut用 (サイズ計算+文字描画)
|
||||
//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;
|
||||
|
||||
//呼び出し前に自分で設定する
|
||||
//呼び出し前に自分で設定する
|
||||
HDC hdc;
|
||||
int xBase;
|
||||
int y;//coord height, calculated by ETO_PDY, 0 if not provided
|
||||
|
20
ft2vert.c
20
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 Subtableから探す
|
||||
// 存在するならUVS Subtableから探す
|
||||
if (ft2vert->variantSelectors)
|
||||
return FT_Face_GetCharVariantIndex(face, baseChar, 0xE0100 + vsindex);
|
||||
|
||||
// GSUBテーブルのOpenType featureによりシミュレートする
|
||||
// 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;
|
||||
|
||||
// シミュレートできるfeatureが見つかったので置換を試みる。
|
||||
// シミュレートできるfeatureが見つかったので置換を試みる。
|
||||
newglyph = ft2gsub_get_gid(ft2vert, gid, found->otft_index);
|
||||
// 置換に成功したらそれを返す
|
||||
// 置換に成功したらそれを返す
|
||||
if (newglyph)
|
||||
return newglyph;
|
||||
// フォントがGSUBテーブルに置換定義を持っていない。
|
||||
// 'jp04'を持っているが'jp90'を持っていないときはJIS90フォントとみなし、
|
||||
// 'jp90'を持っているが'jp04'を持っていないときはJIS2004フォントとみなす。
|
||||
// JIS90フォントに'jp90'を要求された場合とJIS2004フォント'jp04'を要求された場合は
|
||||
// デフォルト字形が要求された字形であるとみなしてそのまま返す。
|
||||
// フォントが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;
|
||||
// どちらでもなければフォントは要求された字形を持っていないとみなす。
|
||||
// どちらでもなければフォントは要求された字形を持っていないとみなす。
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
94
fteng.cpp
94
fteng.cpp
@ -35,7 +35,7 @@ int CALLBACK EnumFontCallBack(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD
|
||||
|
||||
|
||||
|
||||
bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut) //サ<EFBFBD>テラヨフ蠏トアセオリサッテ﨤ニ,キオサリヨオホェラヨフ衞ヌキ<EFBE87>贇レ
|
||||
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);
|
||||
//GCモドキ
|
||||
//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
|
||||
|
||||
//追加(glyphのみ)
|
||||
//追加(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<int> linkset; //チエスモラヨフ蠑ッコマ」ャキタヨケヨリクエチエスモ」ャスオオヘミァツハ
|
||||
std::set<int> linkset; //链接字体集合,防止重复链接,降低效率
|
||||
linkset.insert(m_id);
|
||||
face_id_link[m_linknum] = (FTC_FaceID)m_id;
|
||||
ggo_link[m_linknum++] = m_ggoFont; //オレメサク<EFBFBD>エスモメサカィハヌラヤシコ」ャイサミ靨ェサ<EFBFBD>。
|
||||
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*/) //ウャエ<EFBFBD>ヨフ蟯サ葷ネセ
|
||||
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); //シニヒ緝ash
|
||||
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(); //ア鯊曻ontmap
|
||||
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(); //ア鯊曻ullmap
|
||||
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)); //ア鯊曻ontmap
|
||||
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()); //ア鯊曻ullmap
|
||||
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) //オ耻<EFBFBD>ヨ
|
||||
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) //オ耻<EFBFBD>ヨ
|
||||
if (pfi->GetFullName().size()==0) //点阵字
|
||||
{
|
||||
delete pfi;
|
||||
ReleaseFaceID();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FullNameMap::const_iterator it = m_mfullMap.find(pfi->GetFullName()); //ハヌキ<EFBFBD>レヨ<EFBFBD>apア櫢ミエ贇レチヒ
|
||||
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 を参考にした
|
||||
// http://kikyou.info/diary/?200510#i10 を参考にした
|
||||
#include <freetype/tttables.h> // FT_TRUETYPE_TABLES_H
|
||||
#include <mmsystem.h> //mmioFOURCC
|
||||
#define TVP_TT_TABLE_ttcf mmioFOURCC('t', 't', 'c', 'f')
|
||||
#define TVP_TT_TABLE_name mmioFOURCC('n', 'a', 'm', 'e')
|
||||
|
||||
// Windowsに登録されているフォントのバイナリデータを名称から取得
|
||||
// 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 タグの内容
|
||||
void* pNameFromFreeType = NULL; // FreeType から取得した name タグの内容
|
||||
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;
|
||||
}
|
||||
// 名前以外適当
|
||||
// 名前以外適当
|
||||
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);
|
||||
// フォントデータが得られそうかチェック
|
||||
// フォントデータが得られそうかチェック
|
||||
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 タグの内容をメモリに読み込む
|
||||
//- name タグの内容をメモリに読み込む
|
||||
if(ORIG_GetFontData(m_hdc, TVP_TT_TABLE_name, 0, pNameFromGDI, cbNameTable) == GDI_ERROR){
|
||||
goto ERROR_Init;
|
||||
}
|
||||
|
||||
// フォントサイズ取得処理
|
||||
// フォントサイズ取得処理
|
||||
cbFontData = ORIG_GetFontData(m_hdc, TVP_TT_TABLE_ttcf, 0, &buf, 1);
|
||||
if(cbFontData == 1){
|
||||
// TTC ファイルだと思われる
|
||||
// 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){
|
||||
// エラー; GetFontData では扱えなかった
|
||||
// エラー; GetFontData では扱えなかった
|
||||
goto ERROR_Init;
|
||||
}
|
||||
|
||||
@ -941,7 +941,7 @@ bool FreeTypeSysFontData::Init(LPCTSTR name, int weight, bool italic)
|
||||
}
|
||||
}
|
||||
|
||||
// FT_StreamRec の各フィールドを埋める
|
||||
// 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 から、name タグのサイズを取得する
|
||||
// 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 タグの長さを Windows から得た長さと比較
|
||||
// FreeType から得た name タグの長さを Windows から得た長さと比較
|
||||
if(length == cbNameTable){
|
||||
// FreeType から name タグを取得
|
||||
// FreeType から name タグを取得
|
||||
err = FT_Load_Sfnt_Table(m_ftFace, TTAG_name, 0, (unsigned char*)pNameFromFreeType, &length);
|
||||
if(err){
|
||||
goto ERROR_Init;
|
||||
}
|
||||
// FreeType から読み込んだ name タグの内容と、Windows から読み込んだ
|
||||
// name タグの内容を比較する。
|
||||
// 一致していればその index のフォントを使う。
|
||||
// FreeType から読み込んだ name タグの内容と、Windows から読み込んだ
|
||||
// name タグの内容を比較する。
|
||||
// 一致していればその index のフォントを使う。
|
||||
if(!memcmp(pNameFromGDI, pNameFromFreeType, cbNameTable)){
|
||||
// 一致した
|
||||
// face は開いたまま
|
||||
break; // ループを抜ける
|
||||
// 一致した
|
||||
// face は開いたまま
|
||||
break; // ループを抜ける
|
||||
}
|
||||
}
|
||||
|
||||
// 一致しなかった
|
||||
// インデックスを一つ増やし、その face を開く
|
||||
// 一致しなかった
|
||||
// インデックスを一つ増やし、その face を開く
|
||||
index ++;
|
||||
|
||||
if(!OpenFaceByIndex(index)){
|
||||
// 一致する face がないまま インデックスが範囲を超えたと見られる
|
||||
// index を 0 に設定してその index を開き、ループを抜ける
|
||||
// 一致する 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) {
|
||||
// エラー
|
||||
// エラー
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1060,7 +1060,7 @@ bool FreeTypeSysFontData::OpenFaceByIndex(int index)
|
||||
args.flags = FT_OPEN_STREAM;
|
||||
args.stream = &m_ftStream;
|
||||
|
||||
// FreeType で扱えるか?
|
||||
// FreeType で扱えるか?
|
||||
FT_Error ftErrCode = FT_Open_Face(freetype_library, &args, index, &m_ftFace);
|
||||
#ifdef DEBUG
|
||||
if (ftErrCode!=0)
|
||||
|
98
fteng.h
98
fteng.h
@ -21,7 +21,7 @@ typedef set<CBitmapCache*> CTLSDCArray;
|
||||
extern CTLSDCArray TLSDCArray;
|
||||
|
||||
LOGFONTW* GetFontNameFromFile(LPCTSTR Filename);
|
||||
bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut); //サ<EFBFBD>テラヨフ蠏トアセオリサッテ﨤ニ
|
||||
bool GetFontLocalName(TCHAR* pszFontName, __out TCHAR* pszNameOut); //获得字体的本地化名称
|
||||
|
||||
struct CFontSetCache
|
||||
{
|
||||
@ -70,41 +70,41 @@ enum FT_EngineConstants {
|
||||
};
|
||||
|
||||
/*
|
||||
FreeTypeに文字幅、太字、斜体をキャッシュする機構が無いのでそれらを補う
|
||||
FreeTypeに文字幅、太字、斜体をキャッシュする機構が無いのでそれらを補う
|
||||
|
||||
1. まずDllMain(DLL_PROCESS_ATTACH)でFreeTypeFontEngineのインスタンスが生成される。
|
||||
(順番はCGdiPPSettings→FontLInit(FreeType)→FreeTypeFontEngine→フック)
|
||||
ForceChangeFontもここで処理する。
|
||||
1. まずDllMain(DLL_PROCESS_ATTACH)でFreeTypeFontEngineのインスタンスが生成される。
|
||||
(順番はCGdiPPSettings→FontLInit(FreeType)→FreeTypeFontEngine→フック)
|
||||
ForceChangeFontもここで処理する。
|
||||
|
||||
2. CreateFontでFreeTypeFontEngine::AddFontが呼び出され、FreeTypeFontInfoと
|
||||
フォント名を結びつける。
|
||||
ついでにFreeTypeFontInfoはIndividualの設定をコピーして持つ。
|
||||
2. CreateFontでFreeTypeFontEngine::AddFontが呼び出され、FreeTypeFontInfoと
|
||||
フォント名を結びつける。
|
||||
ついでにFreeTypeFontInfoはIndividualの設定をコピーして持つ。
|
||||
|
||||
3. ExtTextOutやGetTextExtentなどからFreeTypePrepare関数が呼び出されると
|
||||
さらに内部でFreeTypeFontInfo::GetCacheが呼び出され、フォントサイズなどから
|
||||
FreeTypeFontCacheを得る。無ければ生成する。
|
||||
FreeTypeFontCacheは内部にFreeTypeCharDataのテーブル(UCS2なので2^16個)を
|
||||
持っていて、FreeTypeCharDataには文字毎にキャッシュデータを保管する。
|
||||
3. ExtTextOutやGetTextExtentなどからFreeTypePrepare関数が呼び出されると
|
||||
さらに内部でFreeTypeFontInfo::GetCacheが呼び出され、フォントサイズなどから
|
||||
FreeTypeFontCacheを得る。無ければ生成する。
|
||||
FreeTypeFontCacheは内部にFreeTypeCharDataのテーブル(UCS2なので2^16個)を
|
||||
持っていて、FreeTypeCharDataには文字毎にキャッシュデータを保管する。
|
||||
|
||||
4. FreeTypeFontCacheから、文字またはグリフ番号を元にFreeTypeCharDataを得る。
|
||||
キャッシュがあれば(メモリ中に残っていれば)、MRUカウンタをセットする。
|
||||
無い場合は一旦スルーし、後でAddCharDataでキャッシュを追加する。
|
||||
4. FreeTypeFontCacheから、文字またはグリフ番号を元にFreeTypeCharDataを得る。
|
||||
キャッシュがあれば(メモリ中に残っていれば)、MRUカウンタをセットする。
|
||||
無い場合は一旦スルーし、後でAddCharDataでキャッシュを追加する。
|
||||
|
||||
5. 追加しまくるとメモリを喰らうので、追加が一定数(FREETYPE_REQCOUNTMAX)を超えると
|
||||
GCモドキで最近参照されたキャッシュデータをFREETYPE_GC_COUNTER個だけ残し、
|
||||
それ以外のデータ(FreeTypeCharData)は開放される。
|
||||
この2つの定数はiniで設定変更できた方がいいような気もする。
|
||||
5. 追加しまくるとメモリを喰らうので、追加が一定数(FREETYPE_REQCOUNTMAX)を超えると
|
||||
GCモドキで最近参照されたキャッシュデータをFREETYPE_GC_COUNTER個だけ残し、
|
||||
それ以外のデータ(FreeTypeCharData)は開放される。
|
||||
この2つの定数はiniで設定変更できた方がいいような気もする。
|
||||
|
||||
6. 最後に、DllMain(DLL_PROCESS_DETACH)でFreeTypeFontEngineのインスタンスが破棄され、
|
||||
全てのキャッシュメモリが開放される。
|
||||
6. 最後に、DllMain(DLL_PROCESS_DETACH)でFreeTypeFontEngineのインスタンスが破棄され、
|
||||
全てのキャッシュメモリが開放される。
|
||||
|
||||
*/
|
||||
|
||||
class FreeTypeGCCounter
|
||||
{
|
||||
private:
|
||||
int m_addcount; //追加用
|
||||
int m_mrucount; //MRU用
|
||||
int m_addcount; //追加用
|
||||
int m_mrucount; //MRU用
|
||||
|
||||
public:
|
||||
FreeTypeGCCounter()
|
||||
@ -125,7 +125,7 @@ public:
|
||||
class FreeTypeMruCounter
|
||||
{
|
||||
private:
|
||||
int m_mrucounter; //GC用
|
||||
int m_mrucounter; //GC用
|
||||
|
||||
public:
|
||||
FreeTypeMruCounter(int n)
|
||||
@ -133,35 +133,35 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
//GC用MRUカウンタ
|
||||
//GC用MRUカウンタ
|
||||
int GetMruCounter() const { return m_mrucounter; }
|
||||
void ResetMruCounter() { m_mrucounter = 0; }
|
||||
void SetMruCounter(FreeTypeGCCounter* p) { m_mrucounter = p->MruIncrement(); }
|
||||
};
|
||||
|
||||
//文字幅、(glyph index)、FT_BitmapGlyph(太字、斜体のみ)をキャッシュする
|
||||
//文字幅、(glyph index)、FT_BitmapGlyph(太字、斜体のみ)をキャッシュする
|
||||
class FreeTypeCharData : public FreeTypeMruCounter
|
||||
{
|
||||
private:
|
||||
typedef CValArray<FreeTypeCharData**> CharDataArray;
|
||||
CharDataArray m_arrSelfChar; //自分自身の保存元(Char)
|
||||
CharDataArray m_arrSelfChar; //自分自身の保存元(Char)
|
||||
FreeTypeCharData** m_ppSelfGlyph; //(Glyph)
|
||||
UINT m_glyphindex; //グリフ番号
|
||||
int m_width; //文字幅
|
||||
int m_gdiWidth; //ハケモテGetCharWidthサ<EFBFBD>テオトGDIソ昮ネ
|
||||
FT_Referenced_BitmapGlyph m_glyph; //カラー用
|
||||
FT_Referenced_BitmapGlyph m_glyphMono; //モノクロ用
|
||||
int m_bmpSize; //ビットマップサイズ
|
||||
int m_bmpMonoSize; // 〃
|
||||
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; //参照カウンタ
|
||||
// LONG m_refcounter; //参照カウンタ
|
||||
|
||||
#ifdef _DEBUG
|
||||
WCHAR m_wch; //UCS2文字
|
||||
WCHAR m_wch; //UCS2文字
|
||||
#endif
|
||||
NOCOPY(FreeTypeCharData);
|
||||
|
||||
//FT_Bitmap::bufferのサイズを返す
|
||||
//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×2=512KBぐらいたかが知れてるので固定配列で問題無し
|
||||
//4×65536×2=512KBぐらいたかが知れてるので固定配列で問題無し
|
||||
#ifdef _USE_ARRAY
|
||||
FreeTypeCharData* m_chars[FT_MAX_CHARS];
|
||||
FreeTypeCharData* m_glyphs[FT_MAX_CHARS];
|
||||
@ -291,7 +291,7 @@ public:
|
||||
};
|
||||
|
||||
|
||||
// フォント名とFaceID(intを使うことにする)
|
||||
// フォント名と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); //サ<EFBFBD>。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); }; //シニヒ耡サク<EFBFBD>ashヨオタエカィホサ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);
|
||||
//サ<EFBFBD>テラヨフ蠏トネォウニ
|
||||
//获得字体的全称
|
||||
|
||||
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'@') //クスシモメサク<EFBFBD>
|
||||
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);
|
||||
//メモリ使用量カウンタ
|
||||
//メモリ使用量カウンタ
|
||||
void AddMemUsed(int x)
|
||||
{
|
||||
m_nMemUsed += x;
|
||||
@ -646,7 +646,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
//GetFontDataのメモリストリーム
|
||||
//GetFontDataのメモリストリーム
|
||||
class FreeTypeSysFontData
|
||||
{
|
||||
private:
|
||||
|
@ -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 ;
|
||||
|
12
gdiexe.rc
12
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
|
||||
"<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0""><dependency><dependentAssembly><assemblyIdentity type=""win32"" name=""Microsoft.Windows.Common-Controls"" version=""6.0.0.0"" processorArchitecture=""X86"" publicKeyToken=""6595b64144ccf1df"" language=""*"" /></dependentAssembly></dependency></assembly>"
|
||||
}
|
||||
|
||||
//じゃぱにーず
|
||||
//じゃぱにーず
|
||||
STRINGTABLE DISCARDABLE
|
||||
{
|
||||
IDS_USAGE "gdi++.exe <file> argument ...\n\nEXE, またはショートカットなどをドロップしてください."
|
||||
IDS_DLL "error: 0x%08x\nDLLが見つかりません."
|
||||
IDC_EXEC "error: 0x%08x\n実行できません."
|
||||
IDS_USAGE "gdi++.exe <file> argument ...\n\nEXE, またはショートカットなどをドロップしてください."
|
||||
IDS_DLL "error: 0x%08x\nDLLが見つかりません."
|
||||
IDC_EXEC "error: 0x%08x\n実行できません."
|
||||
}
|
||||
|
||||
//えーご(適当)
|
||||
//えーご(適当)
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
|
||||
|
52
hook.cpp
52
hook.cpp
@ -1,13 +1,13 @@
|
||||
// API hook
|
||||
//
|
||||
// GetProcAddressで得たcall先(関数本体)を直接書き換え、
|
||||
// 自分のフック関数にjmpさせる。
|
||||
// GetProcAddressで得たcall先(関数本体)を直接書き換え、
|
||||
// 自分のフック関数にjmpさせる。
|
||||
//
|
||||
// 内部で元のAPIを使う時は、コードを一度戻してからcall。
|
||||
// すぐにjmpコードに戻す。
|
||||
// 内部で元のAPIを使う時は、コードを一度戻してからcall。
|
||||
// すぐにjmpコードに戻す。
|
||||
//
|
||||
// マルチスレッドで 書き換え中にcallされると困るので、
|
||||
// CriticalSectionで排他制御しておく。
|
||||
// マルチスレッドで 書き換え中に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_foo、ORIG_foo の2つをまとめて定義するマクロ
|
||||
// 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"
|
||||
|
||||
//ベースアドレスを変えた方がロードが早くなる
|
||||
//ベースアドレスを変えた方がロードが早くなる
|
||||
#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ではこれの逆順にする
|
||||
//1. CRT関数の初期化
|
||||
//2. クリティカルセクションの初期化
|
||||
//3. TLSの準備
|
||||
//4. CGdippSettingsのインスタンス生成、INI読み込み
|
||||
//5. ExcludeModuleチェック
|
||||
// 6. FreeTypeライブラリの初期化
|
||||
// 7. FreeTypeFontEngineのインスタンス生成
|
||||
// 8. APIをフック
|
||||
// 9. ManagerのGetProcAddressをフック
|
||||
//初期化順序
|
||||
//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(); //イサシモヤリオトト」ソ鮴ヘイサラ<EFBFBD>ホコホハツヌ・
|
||||
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();
|
||||
}
|
||||
//サ<EFBFBD>テオアヌーシモヤリト」ハス
|
||||
//获得当前加载模式
|
||||
|
||||
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); //ハヌキ<EFBFBD>レシ貶ント」ハスマツ
|
||||
BOOL HookMode = (mutex_offical || (mutex_gditray2 && mutex_CompMode)) || (!mutex_offical && !mutex_gditray2); //是否在兼容模式下
|
||||
CloseHandle(mutex_CompMode);
|
||||
CloseHandle(mutex_gditray2);
|
||||
CloseHandle(mutex_offical);
|
||||
if (!HookMode) //キヌシ貶ント」ハスマツ」ャセワセ<EFBFBD>モヤリ
|
||||
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) { //ネ郢鈹ヌス<EFBFBD>フヨユヨケ」ャヤ<EFBFBD>サミ靨ェハヘキナ
|
||||
if (InterlockedExchange(&g_bHookEnabled, FALSE) && lpReserved == NULL) { //如果是进程终止,则不需要释放
|
||||
hook_term();
|
||||
//delete AACacheFull;
|
||||
//delete AACache;
|
||||
|
6
misc.cpp
6
misc.cpp
@ -10,7 +10,7 @@ TCHAR CGdippSettings::m_szexeName[MAX_PATH+1] = {0};
|
||||
#define CharPrev(s, c) ((c) - 1)
|
||||
#endif
|
||||
|
||||
//手抜きのパス操作関数群
|
||||
//手抜きのパス操作関数群
|
||||
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(':'))) {
|
||||
//絶対パス
|
||||
//絶対パス
|
||||
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);
|
||||
|
48
override.cpp
48
override.cpp
@ -1,4 +1,4 @@
|
||||
// override.cpp - キレイなTextOut
|
||||
// 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;
|
||||
}
|
||||
|
||||
//切り上げ除算
|
||||
//切り上げ除算
|
||||
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);
|
||||
}
|
||||
|
||||
//灰色描画を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の時に文字数自動計算
|
||||
//他のAPIと違って-1の時ではない
|
||||
//wData==0の時に文字数自動計算
|
||||
//他のAPIと違って-1の時ではない
|
||||
if(wData == 0) {
|
||||
wData = wcslen((LPCWSTR)lData);
|
||||
}
|
||||
RECT rect = { x, y, x + 10000, y + 10000 };
|
||||
//どうやら3DHighLightの上に1pxずらして3DShadowを重ねてるらしい
|
||||
//どうやら3DHighLightの上に1pxずらして3DShadowを重ねてるらしい
|
||||
int oldbm = SetBkMode(hdc, TRANSPARENT);
|
||||
COLORREF oldfg = SetTextColor(hdc, GetSysColor(COLOR_3DHIGHLIGHT));
|
||||
//DrawStateとDrawTextではprefixのフラグが逆(APIの設計ダメすぎ)
|
||||
//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.
|
||||
//とりあえずオリジナルに飛ばす
|
||||
//とりあえずオリジナルに飛ばす
|
||||
if (fuOptions & ETO_GLYPH_INDEX)
|
||||
return ORIG_ExtTextOutA(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx);
|
||||
|
||||
//HDBENCHチート
|
||||
//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) {
|
||||
//メモリ不足: 一応オリジナルに投げとく
|
||||
//メモリ不足: 一応オリジナルに投げとく
|
||||
return ORIG_ExtTextOutA(hdc, nXStart, nYStart, fuOptions, lprc, lpString, cbString, lpDx);
|
||||
}
|
||||
|
||||
@ -992,7 +992,7 @@ typedef enum {
|
||||
ETOE_GENERAL = 19,
|
||||
} ExtTextOut_ErrorCode;
|
||||
|
||||
//例外モドキ
|
||||
//例外モドキ
|
||||
#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;
|
||||
// ネ。エ"indowsオトExtTextOutW
|
||||
// 取代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); //サ<EFBFBD>。ヒ<EFBFBD>ミネィ」ャキタヨケウ袁サ
|
||||
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()) //ラ<EFBFBD>メキエマ<EFBFBD>ャRGBコヘBGRメェマ犢エ
|
||||
/*if (bZoomedDC && DCTrans->MirrorX()) //左右反向,RGB和BGR要相反
|
||||
for (int i=0; i<cbString; ++i)
|
||||
{
|
||||
switch (FTInfo.AAModes[i])
|
||||
@ -1382,7 +1382,7 @@ ETO_TRY();
|
||||
break;
|
||||
}
|
||||
}*/
|
||||
//POINT destSize; //LPマツオトエ<EFBFBD>。コヘニ<EFBFBD>シホサヨテ
|
||||
//POINT destSize; //LP下的大小和起始位置
|
||||
/*
|
||||
if (bZoomedDC)
|
||||
{
|
||||
@ -1455,7 +1455,7 @@ ETO_TRY();
|
||||
if(drawSize.cx < 1 || drawSize.cy < 1) {
|
||||
ETO_THROW(ETOE_NOAREA); //throw no area
|
||||
}
|
||||
//drawSize.cx += tm.tmMaxCharWidth; //シモノマメサク<EFBFBD>鋗<EFBFBD>ヨフ蠢昮ネ
|
||||
//drawSize.cx += tm.tmMaxCharWidth; //加上一个最大字体宽度
|
||||
|
||||
//bitmap
|
||||
|
||||
@ -1475,7 +1475,7 @@ ETO_TRY();
|
||||
}
|
||||
else
|
||||
IntersectRect(&rcClip, &rcBlt, lprc);
|
||||
xorg = rcClip.left-destPos.x; //シニヒ翦ォメニ
|
||||
xorg = rcClip.left-destPos.x; //计算偏移
|
||||
yorg = rcClip.top-destPos.y;
|
||||
destPos.x = rcClip.left;
|
||||
destPos.y = rcClip.top;
|
||||
@ -1488,7 +1488,7 @@ ETO_TRY();
|
||||
//clear bitmap
|
||||
|
||||
if(fillrect || GetBkMode(hdc) == OPAQUE) {
|
||||
COLORREF bgcolor = GetBkColor(hdc); //両方とも同じ背景色に
|
||||
COLORREF bgcolor = GetBkColor(hdc); //両方とも同じ背景色に
|
||||
//if ((bgcolor>>24)%2 || (bgcolor>>28)%2)
|
||||
// bgcolor = 0;
|
||||
if ((bgcolor>>24)%2 || (bgcolor>>28)%2)
|
||||
|
@ -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);
|
||||
}
|
||||
|
28
run.cpp
28
run.cpp
@ -16,7 +16,7 @@
|
||||
#include <strsafe.h>
|
||||
#include "gdiexe.rc"
|
||||
|
||||
// _vsnwprintf用
|
||||
// _vsnwprintf用
|
||||
#include <wchar.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
@ -116,9 +116,9 @@ void WINAPI _SHFree(void *pv)
|
||||
#endif
|
||||
|
||||
|
||||
// 1つ目の引数だけファイルとして扱い、実行する。
|
||||
// 1つ目の引数だけファイルとして扱い、実行する。
|
||||
//
|
||||
// コマンドは こんな感じで連結されます。
|
||||
// コマンドは こんな感じで連結されます。
|
||||
// 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);
|
||||
|
||||
// カレントディレクトリがgdi++.exeの置かれているディレクトリと同じだったら、
|
||||
// 起動しようとしているEXEのフルパスから抜き出したディレクトリ名をカレント
|
||||
// ディレクトリとして起動する。(カレントディレクトリがEXEと同じ場所である
|
||||
// 前提で作られているアプリ対策)
|
||||
// カレントディレクトリが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;
|
||||
|
||||
//fileのアイテムIDリストを取得
|
||||
//fileのアイテムIDリストを取得
|
||||
hr = _SHILCreateFromPath(file, &pidl, NULL);
|
||||
if(SUCCEEDED(hr) && pidl) {
|
||||
//SEE_MASK_INVOKEIDLISTを使うと
|
||||
//explorerでクリックして起動したのと同じ動作になる
|
||||
//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が内部で呼び出すCreateProcessWをフックして
|
||||
//HookChildProcesses相当の処理を行う
|
||||
//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_REFERENCESを指定すると依存関係の解決や
|
||||
//DllMainの呼び出しが行われない
|
||||
//DONT_RESOLVE_DLL_REFERENCESを指定すると依存関係の解決や
|
||||
//DllMainの呼び出しが行われない
|
||||
hinstDLL = LoadLibraryExW(path, NULL, DONT_RESOLVE_DLL_REFERENCES);
|
||||
}
|
||||
if(!hinstDLL) {
|
||||
|
156
settings.cpp
156
settings.cpp
@ -173,7 +173,7 @@ void CGdippSettings::DelayedInit()
|
||||
}
|
||||
|
||||
|
||||
//強制フォント
|
||||
//強制フォント
|
||||
/*
|
||||
LPCTSTR lpszFace = GetForceFontName();
|
||||
if (lpszFace)
|
||||
@ -389,8 +389,8 @@ void CGdippSettings::GetOSVersion() {
|
||||
|
||||
bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile)
|
||||
{
|
||||
// 各種設定読み込み
|
||||
// INIファイルの例:
|
||||
// 各種設定読み込み
|
||||
// INIファイルの例:
|
||||
// [General]
|
||||
// HookChildProcesses=0
|
||||
// HintingMode=0
|
||||
@ -400,7 +400,7 @@ bool CGdippSettings::LoadAppSettings(LPCTSTR lpszFile)
|
||||
// ItalicSlant=0
|
||||
// EnableKerning=0
|
||||
// MaxHeight=0
|
||||
// ForceChangeFont=MS Pゴシック
|
||||
// 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]
|
||||
// MS Pゴシック=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) //ネ郢鋓クカィチヒヌウノォメ<EFBFBD>ー
|
||||
m_nShadowDarkColor = _httoi(token.GetArgument(3)); //カチネ。メ<EFBFBD>ー
|
||||
if (token.GetCount()>=4) //如果指定了浅色阴影
|
||||
m_nShadowDarkColor = _httoi(token.GetArgument(3)); //读取阴影
|
||||
else
|
||||
m_nShadowDarkColor = 0; //キ<EFBFBD><EFBFBD>ェコレノォ
|
||||
if (token.GetCount()>=6) //ネ郢鋓クカィチヒノ鐱ォメ<EFBFBD>ー
|
||||
m_nShadowDarkColor = 0; //否则为黑色
|
||||
if (token.GetCount()>=6) //如果指定了甥瀚阴影
|
||||
{
|
||||
m_nShadowLightColor = _httoi(token.GetArgument(5)); //カチネ。メ<EFBFBD>ー
|
||||
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; //キ<EFBFBD><EFBFBD>ヘヌウノォメ<EFBFBD>ーマ猩ャ
|
||||
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検証用
|
||||
// GammaValue検証用
|
||||
//CHAR GammaValueTest[1025];
|
||||
//sprintf(GammaValueTest, "GammaValue=%.6f\nContrast=%.6f\n", m_fGammaValue, m_fContrast);
|
||||
//MessageBoxA(NULL, GammaValueTest, "GammaValueテスト", 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); //ラ鋕゚ヨサトワオス65535」ャcacheオトマ゙ヨニ」ャカ<EFBFBD>メエ<EFBFBD>ヨフ衾゙ハオシハシロヨオ
|
||||
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が処理してくれるはずなので自前処理は無効化
|
||||
// APIが処理してくれるはずなので自前処理は無効化
|
||||
if (m_nFontSubstitutes == SETTING_FONTSUBSTITUTE_ALL) {
|
||||
m_nFontSubstitutes = SETTING_FONTSUBSTITUTE_DISABLE;
|
||||
}
|
||||
m_bFontLink = 0;
|
||||
}
|
||||
|
||||
// フォント指定
|
||||
// フォント指定
|
||||
ZeroMemory(&m_lfForceFont, sizeof(LOGFONT));
|
||||
m_szForceChangeFont[0] = _T('\0');
|
||||
_GetFreeTypeProfileString(_T("ForceChangeFont"), _T(""), m_szForceChangeFont, LF_FACESIZE, lpszFile);
|
||||
|
||||
// OSのバージョンがXP以降かどうか
|
||||
// OSのバージョンがXP以降かどうか
|
||||
//OSVERSIONINFO osvi = { sizeof(OSVERSIONINFO) };
|
||||
//GetVersionEx(&osvi);
|
||||
m_bIsWinXPorLater = IsWindowsXPOrGreater();
|
||||
@ -629,17 +629,17 @@ SKIP:
|
||||
m_arrUnloadModule.clear();
|
||||
m_arrUnFontSubModule.clear();
|
||||
|
||||
// [Exclude]セクションから除外フォントリストを読み込む
|
||||
// [ExcludeModule]セクションから除外モジュールリストを読み込む
|
||||
// [Exclude]セクションから除外フォントリストを読み込む
|
||||
// [ExcludeModule]セクションから除外モジュールリストを読み込む
|
||||
AddListFromSection(_T("ExcludeModule"), lpszFile, m_arrExcludeModule);
|
||||
//AddListFromSection(_T("ExcludeModule"), szMainFile, m_arrExcludeModule);
|
||||
// [IncludeModule]セクションから対象モジュールリストを読み込む
|
||||
// [IncludeModule]セクションから対象モジュールリストを読み込む
|
||||
AddListFromSection(_T("IncludeModule"), lpszFile, m_arrIncludeModule);
|
||||
//AddListFromSection(_T("IncludeModule"), szMainFile, m_arrIncludeModule);
|
||||
// [UnloadDLL]ヘ・ォイサシモヤリオトト」ソ・
|
||||
// [UnloadDLL]蛠E患釉氐哪?丒
|
||||
AddListFromSection(_T("UnloadDLL"), lpszFile, m_arrUnloadModule);
|
||||
//AddListFromSection(_T("UnloadDLL"), szMainFile, m_arrUnloadModule);
|
||||
// [ExcludeSub]イサス<EFBFBD>ミラヨフ衫貊サオトト」ソ・
|
||||
// [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]セクションからフォント別設定を読み込む
|
||||
// [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);//ラェササラヨフ蠹・
|
||||
GetFontLocalName(p, buff);//转换字体脕E
|
||||
set<wstring>::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<wstring>::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++);
|
||||
|
||||
//"MS Pゴシック=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);//ラェササラヨフ蠹・
|
||||
GetFontLocalName(p, buff);//转换字体脕E
|
||||
|
||||
CFontIndividual fi(buff);
|
||||
const CFontSettings& fsCommon = m_FontSettings;
|
||||
CFontSettings& fs = fi.GetIndividual();
|
||||
//Individualが無ければ共通設定を使う
|
||||
//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<LPTSTR>((LPCTSTR)m_Config[lpszSection]);
|
||||
}
|
||||
|
||||
//atolにデフォルト値を返せるようにしたような物
|
||||
//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にデフォルト値を返せるようにしたような物
|
||||
//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 //シ・鯡ヌキ<EFBFBD>レコレテ遧・チミア朗?
|
||||
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 //シ・鯡ヌキ<EFBFBD>レーラテ遧・チミア朗?
|
||||
bool CGdippSettings::IsExeInclude(LPCTSTR lpApp) const //紒E槭欠裨诎酌チ斜?
|
||||
{
|
||||
if (m_bRunFromGdiExe) {
|
||||
return false;
|
||||
@ -1085,8 +1085,8 @@ void CGdippSettings::InitInitTuneTable()
|
||||
#undef init_table
|
||||
}
|
||||
|
||||
// テーブル初期化関数 0 - 12まで
|
||||
// LCD用テーブル初期化関数 各0 - 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; //ランマ<EFBFBD>ヨフ衞ケモテコ睹<EFBFBD>トノ雜ィ
|
||||
++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;
|
||||
}
|
||||
|
||||
//値的にchar(-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) //サ<EFBFBD>テラヨフ蠏トアセオリサッテ﨤ニ
|
||||
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); //サ<EFBFBD>テイルラ<EFBFBD>オヘウー豎セコナ
|
||||
//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) { //サ<EFBFBD>テラヨフ螻櫢ミオトヒ<EFBFBD>ミラヨフ・
|
||||
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')') { //ネ・オ<EFBFBD>ィコナ
|
||||
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;
|
||||
//サ<EFBFBD>テオトカヤモヲオトラヨフ蠹・
|
||||
//获得的对应的字体脕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); //サ<EFBFBD>テメサク<EFBFBD>ヨフ蠏トラヨフ蠱エスモ
|
||||
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; //モミミァオトラヨフ蠱エスモ
|
||||
//サ<EFBFBD>テラヨフ蠏トユ賁オテ錥ヨ
|
||||
if (regtype != REG_MULTI_SZ) continue; //有效的字体链接
|
||||
//获得字体的真实名字
|
||||
|
||||
TCHAR buff[LF_FACESIZE];
|
||||
GetFontLocalName(name, buff);
|
||||
|
||||
info[row][col] = _wcsdup(buff); //オレメサマ﨩ェラヨフ蠹・
|
||||
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)) //ウ「ハヤムーユメラヨフ蠱エスモヨミ。ー」ャ。アコ<EFBFBD>盪ゥオトラヨフ蠹﨤ニ
|
||||
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')') { //ネ・オ<EFBFBD>ィコナ
|
||||
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); //サ<EFBFBD>テフ貊サラヨフ・
|
||||
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) { //ヨサモミメサマ釤ャシエテサモミチエスモ」ャノセオ<EFBFBD>」
|
||||
if (col == 1) { //只有一消楷即没有链接,删掉。
|
||||
free(info[row][0]);
|
||||
info[row][0] = NULL;
|
||||
} else {
|
||||
/*if (sOsVinfo.dwMajorVersion>=6 && sOsVinfo.dwMinorVersion>=1) //ー豎セコナ>=6.1」ャハヌWin7マオチミ
|
||||
/*if (sOsVinfo.dwMajorVersion>=6 && sOsVinfo.dwMinorVersion>=1) //版本号>=6.1,是Win7系列
|
||||
{
|
||||
//カヤラヨフ蠱エスモア櫤<EFBFBD>賺<EFBFBD>ヲタ・
|
||||
//对字体链接柄篥逆向处纴E
|
||||
LPWSTR swapbuff[32];
|
||||
memcpy(swapbuff, info[row], 32*sizeof(LPWSTR)); //整个柄源制过来
|
||||
for (int i=1; i<col; i++)
|
||||
info[row][i]=swapbuff[col-i]; //ト賻<EFBFBD>ヨフ蠱エスモア・
|
||||
info[row][i]=swapbuff[col-i]; //逆序字体链接眮E
|
||||
}*/
|
||||
++row;
|
||||
}
|
||||
@ -1348,25 +1348,25 @@ void CFontLinkInfo::init()
|
||||
|
||||
extern HFONT g_alterGUIFont;
|
||||
const CGdippSettings* pSettings = CGdippSettings::GetInstance();
|
||||
if (pSettings->FontSubstitutes()>=SETTING_FONTSUBSTITUTE_SAFE && pSettings->CopyForceFont(truefont, syslf)) //ハケモテヘ・ォフ貊サト」ハスハア」ャフ貊サオ<EFBFBD>オヘウラヨフ・
|
||||
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; //ヨアスモハケモテマネヌーオトラヨフ・
|
||||
g_alterGUIFont = tempfont; //直接使用先前的字虂E
|
||||
}
|
||||
else
|
||||
{
|
||||
g_alterGUIFont = CreateFontIndirectW(&truefont); //エエスィメサク<EFBFBD>ツオトフ貊サラヨフ・
|
||||
_ui64tow((ULONG_PTR)g_alterGUIFont, envvalue, 10); //ラェササホェラヨキ逸ョ
|
||||
SetEnvironmentVariable(envname, envvalue); //ミエネ・キセウア菽?
|
||||
g_alterGUIFont = CreateFontIndirectW(&truefont); //创建一个新的替换字虂E
|
||||
_ui64tow((ULONG_PTR)g_alterGUIFont, envvalue, 10); //转换为字符串
|
||||
SetEnvironmentVariable(envname, envvalue); //写葋E肪潮淞?
|
||||
}
|
||||
}
|
||||
|
||||
//マヨヤレサ<EFBFBD>。カヤモヲラヨフ蠡獎ヘオトトャネマラヨフ蠱エスモ
|
||||
memset(DefaultFontLink, 0, sizeof(TCHAR)*(FF_DECORATIVE+1)*(LF_FACESIZE+1)); //ウ<EFBFBD>シサッホェ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; i<FF_DECORATIVE+1; ++i) //ラェササラヨフ蠹﨤ニ
|
||||
for (int i=0; i<FF_DECORATIVE+1; ++i) //转换字体名称
|
||||
{
|
||||
if (!*DefaultFontLink[i])
|
||||
GetFontLocalName(DefaultFontLink[i], DefaultFontLink[i]);
|
||||
}
|
||||
|
||||
//マヨヤレサ<EFBFBD>。カヤモヲオトCodePageハヌキ<EFBFBD>靨ェス<EFBFBD>ミfontlink。」トャネマカシミ靨ェス<EFBFBD>ミチエスモ。」
|
||||
//现在获取对应的CodePage是否需要进行fontlink。默认都需要进行链接。
|
||||
HKEY h4;
|
||||
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY4, 0, KEY_QUERY_VALUE, &h4)) return;
|
||||
|
||||
@ -1400,7 +1400,7 @@ void CFontLinkInfo::init()
|
||||
{
|
||||
namesz = nBufSize;
|
||||
valuesz = nBufSize;
|
||||
rc = RegEnumValue(h4, i, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //サ<EFBFBD>テメサク<EFBFBD>harsetオトヨオ
|
||||
rc = RegEnumValue(h4, i, name, &namesz, 0, ®type, (LPBYTE)value, &valuesz); //获得一个charset的值
|
||||
if (rc == ERROR_NO_MORE_ITEMS) break;
|
||||
if (rc != ERROR_SUCCESS) break;
|
||||
if (regtype != REG_SZ) continue;
|
||||
@ -1585,13 +1585,13 @@ CFontSubstitutesInfo::initini(const CFontSubstitutesIniArray& iniarray)
|
||||
/* StringCchCopy(truefont.lfFaceName, LF_FACESIZE, buf);
|
||||
truefont.lfCharSet=DEFAULT_CHARSET;
|
||||
if (!GetFontLocalName(truefont))
|
||||
continue; //テサモミエヒラヨフ・
|
||||
continue; //没有此字虂E
|
||||
buff = truefont.lfFaceName;
|
||||
|
||||
StringCchCopy(truefont2.lfFaceName, LF_FACESIZE, vp);
|
||||
truefont2.lfCharSet=DEFAULT_CHARSET;
|
||||
if (!GetFontLocalName(truefont2))
|
||||
continue; //テサモミエヒラヨフ・
|
||||
continue; //没有此字虂E
|
||||
buff2 = truefont2.lfFaceName;
|
||||
|
||||
if (m_mfontsub.find(buff)==m_mfontsub.end())
|
||||
@ -1634,7 +1634,7 @@ CFontSubstitutesInfo::lookup(LOGFONT& lf) const
|
||||
k.m_bCharSet = true;
|
||||
k.m_lf = lf;
|
||||
|
||||
TCHAR * buff; //ソ・ルサ<EFBFBD>テラヨフ蠏トユ賁オテ﨤?
|
||||
TCHAR * buff; //縼E倩竦米痔宓恼媸得?
|
||||
LOGFONT mylf(lf);
|
||||
if (!(buff = FontNameCache.Find((TCHAR*)lf.lfFaceName)))
|
||||
{
|
||||
|
38
settings.h
38
settings.h
@ -157,7 +157,7 @@ public:
|
||||
private:
|
||||
LPWSTR info[INFOMAX + 1][FONTMAX + 1];
|
||||
bool AllowDefaultLink[256];
|
||||
WCHAR DefaultFontLink[FF_DECORATIVE + 1][LF_FACESIZE + 1]; //エ豺ナカヤモヲラヨフ蠡獎ヘオトトャネマチエスモ
|
||||
WCHAR DefaultFontLink[FF_DECORATIVE + 1][LF_FACESIZE + 1]; //存放对应字体类型的默认链接
|
||||
public:
|
||||
CFontLinkInfo();
|
||||
~CFontLinkInfo();
|
||||
@ -247,7 +247,7 @@ class CGdippSettings
|
||||
friend BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
|
||||
private:
|
||||
static CGdippSettings* s_pInstance;
|
||||
//INI用
|
||||
//INI用
|
||||
CFontSettings m_FontSettings;
|
||||
static CParseIni m_Config;
|
||||
bool m_bHookChildProcesses : 1;
|
||||
@ -255,7 +255,7 @@ private:
|
||||
bool m_bLoadOnDemand : 1;
|
||||
bool m_bEnableShadow : 1;
|
||||
|
||||
//それ以外
|
||||
//それ以外
|
||||
bool m_bIsWinXPorLater : 1;
|
||||
bool m_bRunFromGdiExe : 1;
|
||||
bool m_bIsInclude : 1;
|
||||
@ -263,7 +263,7 @@ private:
|
||||
// bool m_bIsHDBench : 1;
|
||||
// bool m_bHaveNewerFreeType : 1;
|
||||
bool : 0;
|
||||
bool m_bUseCustomLcdFilter; //ハケモテラヤカィメ虱cdfilter
|
||||
bool m_bUseCustomLcdFilter; //使用自定义lcdfilter
|
||||
|
||||
BOOL m_bHintSmallFont;
|
||||
BOOL m_bDirectWrite;
|
||||
@ -299,7 +299,7 @@ private:
|
||||
int m_nRenderingModeForDW;
|
||||
CFontSubstitutesInfo m_FontSubstitutesInfoForDW;
|
||||
|
||||
//FTC_Manager_New、ヒカノ、ケ・ム・鬣皓`・ソ
|
||||
//FTC_Manager_Newに渡すパラメータ
|
||||
int m_nCacheMaxFaces;
|
||||
int m_nCacheMaxSizes;
|
||||
int m_nCacheMaxBytes;
|
||||
@ -308,7 +308,7 @@ private:
|
||||
|
||||
// アンチエイリアス調整用テーブル
|
||||
int m_nTuneTable[256];
|
||||
// LCDモテ
|
||||
// LCD用
|
||||
int m_nTuneTableR[256];
|
||||
int m_nTuneTableG[256];
|
||||
int m_nTuneTableB[256];
|
||||
@ -326,7 +326,7 @@ private:
|
||||
ModuleHashMap m_arrUnFontSubModule;
|
||||
IndividualArray m_arrIndividual;
|
||||
|
||||
// ヨクカィ・ユ・ゥ・<EFBFBD>ネ
|
||||
// 指定フォント
|
||||
LOGFONT m_lfForceFont;
|
||||
TCHAR m_szForceChangeFont[LF_FACESIZE];
|
||||
|
||||
@ -418,7 +418,7 @@ public:
|
||||
static CGdippSettings* GetInstance();
|
||||
static const CGdippSettings* GetInstanceNoInit(); //FreeTypeFontEngine
|
||||
|
||||
//INI用
|
||||
//INI用
|
||||
const CFontSettings& GetFontSettings() const { return m_FontSettings; }
|
||||
bool HookChildProcesses() const { return m_bHookChildProcesses; }
|
||||
bool UseMapping() const { return m_bUseMapping; }
|
||||
@ -456,7 +456,7 @@ public:
|
||||
bool InvertColor() const { return m_bInvertColor; }
|
||||
DWORD ShadowLightColor() const { return m_nShadowLightColor; }
|
||||
DWORD ShadowDarkColor() const { return m_nShadowDarkColor; }
|
||||
int FontSubstitutes() const { return m_nFontSubstitutes; } //ナミカマフ貊サト」ハス
|
||||
int FontSubstitutes() const { return m_nFontSubstitutes; } //判断替换模式
|
||||
int CacheMaxFaces() const { return m_nCacheMaxFaces; }
|
||||
int CacheMaxSizes() const { return m_nCacheMaxSizes; }
|
||||
int CacheMaxBytes() const { return m_nCacheMaxBytes; }
|
||||
@ -704,19 +704,19 @@ public:
|
||||
}*/
|
||||
}
|
||||
pSettings->m_bEnableShadow = true;
|
||||
if (token.GetCount()>=4) //ネ郢鋓クカィチヒヌウノォメ<EFBFBD>ー
|
||||
pSettings->m_nShadowDarkColor = pSettings->_httoi(token.GetArgument(3)); //カチネ。メ<EFBFBD>ー
|
||||
if (token.GetCount()>=4) //如果指定了浅色阴影
|
||||
pSettings->m_nShadowDarkColor = pSettings->_httoi(token.GetArgument(3)); //读取阴影
|
||||
else
|
||||
pSettings->m_nShadowDarkColor = 0; //キ<EFBFBD><EFBFBD>ェコレノォ
|
||||
if (token.GetCount()>=6) //ネ郢鋓クカィチヒノ鐱ォメ<EFBFBD>ー
|
||||
pSettings->m_nShadowDarkColor = 0; //否则为黑色
|
||||
if (token.GetCount()>=6) //如果指定了深色阴影
|
||||
{
|
||||
pSettings->m_nShadowLightColor = pSettings->_httoi(token.GetArgument(5)); //カチネ。メ<EFBFBD>ー
|
||||
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; //キ<EFBFBD><EFBFBD>ヘヌウノォメ<EFBFBD>ーマ猩ャ
|
||||
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++);
|
||||
|
||||
//"MS Pゴシック=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が無ければ共通設定を使う
|
||||
//Individualが無ければ共通設定を使う
|
||||
fs = fsCommon;
|
||||
for (int i = 0; i < MAX_FONT_SETTINGS; i++) {
|
||||
LPCTSTR arg = token.GetArgument(i);
|
||||
|
@ -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" }
|
||||
|
14
supinfo.h
14
supinfo.h
@ -9,7 +9,7 @@ typedef struct {
|
||||
// BYTE reserved[256];
|
||||
} GDIPP_CREATE_MAGIC;
|
||||
|
||||
//参照
|
||||
//参照
|
||||
//http://www.catch22.net/tuts/undoc01.asp
|
||||
|
||||
#ifdef _GDIPP_EXE
|
||||
@ -42,7 +42,7 @@ EXTERN_C LPWSTR WINAPI GdippEnvironment(DWORD& dwCreationFlags, LPVOID lpEnviron
|
||||
|
||||
|
||||
|
||||
//子プロセスにも自動でgdi++適用
|
||||
//子プロセスにも自動でgdi++適用
|
||||
template <typename _TCHAR, typename _STARTUPINFO, class _Function>
|
||||
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(" ")); //サ<EFBFBD>テオレメサク<EFBFBD>ユク<EFBFBD><EFBFBD>レオトホサヨテ
|
||||
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); //ネ郢﨧ミツキセカセヘノセオ<EFBFBD>キセカ
|
||||
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); //ネ郢﨧ミツキセカセヘノセオ<EFBFBD>キセカ
|
||||
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); //ネ郢﨧ミツキセカセヘノセオ<EFBFBD>キセカ
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user