forked from zhujian198/unispim
-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathfontcheck.c
122 lines (96 loc) · 4.63 KB
/
fontcheck.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/** fontmap模块
* fontmap的读取以及检索功能。
*/
#include <assert.h>
#include <utility.h>
#include <fontcheck.h>
#include <tchar.h>
#include <pim_resource.h>
#include <share_segment.h>
static byte *fontmap = 0;
static TCHAR *fontmap_share_name = TEXT("HYPIM_FONTMAP_SHARED_NAME");
/** 加载fontmap到内存。
* 参数:
* fontmap_file_name fontmap文件全路径
* 返回:
* 成功:1
* 失败:0
*/
int LoadFontMapData(const TCHAR *file_name)
{
int file_length;
assert(file_name);
if ( pim_config->scope_gbk == HZ_SCOPE_GBK || !pim_config->hide_black_window )
{
share_segment->fontmap_loaded = 0;
return 0;
}
if (share_segment->fontmap_loaded)
return 1;
file_length = GetFileLength(file_name);
if (file_length <= 0)
return 0;
fontmap = AllocateSharedMemory(fontmap_share_name, file_length);
if (!fontmap)
return 0;
if ((file_length = LoadFromFile(file_name, fontmap, file_length)) == -1)
{
FreeSharedMemory(fontmap_share_name, fontmap);
Log(LOG_ID, L"FONT MAP文件打开失败。name=%s", file_name);
return 0;
}
if (!file_length)
return 0;
share_segment->fontmap_loaded = 1;
return 1;
}
/** 释放FONT MAP文件
*/
int FreeFontMapData()
{
share_segment->fontmap_loaded = 0;
if (fontmap)
{
FreeSharedMemory(fontmap_share_name, fontmap);
fontmap = 0;
}
return 1;
}
int FontCanSupport(UC zi)
{
int pos_offset;
byte pos_mask,*pos;
TCHAR *fontname,*pos1,*pos2;
extern int LoadFontMapResource();
if(!share_segment->fontmap_loaded)
return 1;
//if font map data isn't loaded,return 1(support)
if(!fontmap)
{
fontmap = GetReadOnlySharedMemory(fontmap_share_name);
//可能存在其他进程已经装载了,但是退出后共享内存被释放的问题
if (!fontmap && share_segment->fontmap_loaded)
{
share_segment->fontmap_loaded = 0;
LoadFontMapResource();
}
}
if(!fontmap)
return 1;
fontname = (TCHAR *)(fontmap + 0x6000);
if (!fontname)
return 1;
pos1 = _tcsstr( fontname, pim_config->chinese_font_name );
pos2 = _tcsstr( fontname, TEXT("{") );
if (!pos1 || pos1 > pos2)
return 1;
if (!fontmap || zi > 0x2FFFF)
return 1;
//PUA
if ( !_tcscmp(pim_config->chinese_font_name,TEXT("微软雅黑")) && zi >= 0xE000 && zi <= 0xF8FF )
return 0;
pos_offset = zi >> 3;
pos_mask = 1 << (zi % 8);
pos = (byte*)(fontmap + pos_offset);
return (*pos) & pos_mask;
}