Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fgas / src / font / fx_fontutils.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../fgas_base.h"\r
8 #include "fx_fontutils.h"\r
9 FX_DWORD FGAS_GetFontHashCode(FX_WORD wCodePage, FX_DWORD dwFontStyles)\r
10 {\r
11     FX_DWORD dwHash = wCodePage;\r
12     if (dwFontStyles & FX_FONTSTYLE_FixedPitch) {\r
13         dwHash |= 0x00010000;\r
14     }\r
15     if (dwFontStyles & FX_FONTSTYLE_Serif) {\r
16         dwHash |= 0x00020000;\r
17     }\r
18     if (dwFontStyles & FX_FONTSTYLE_Symbolic) {\r
19         dwHash |= 0x00040000;\r
20     }\r
21     if (dwFontStyles & FX_FONTSTYLE_Script) {\r
22         dwHash |= 0x00080000;\r
23     }\r
24     if (dwFontStyles & FX_FONTSTYLE_Italic) {\r
25         dwHash |= 0x00100000;\r
26     }\r
27     if (dwFontStyles & FX_FONTSTYLE_Bold) {\r
28         dwHash |= 0x00200000;\r
29     }\r
30     return dwHash;\r
31 }\r
32 FX_DWORD FGAS_GetFontFamilyHash(FX_LPCWSTR pszFontFamily, FX_DWORD dwFontStyles, FX_WORD wCodePage)\r
33 {\r
34     CFX_WideString wsFont(pszFontFamily);\r
35     if (dwFontStyles & FX_FONTSTYLE_Bold) {\r
36         wsFont += L"Bold";\r
37     }\r
38     if (dwFontStyles & FX_FONTSTYLE_Italic) {\r
39         wsFont += L"Italic";\r
40     }\r
41     wsFont += wCodePage;\r
42     return FX_HashCode_String_GetW((FX_LPCWSTR)wsFont, wsFont.GetLength());\r
43 }\r
44 static const FGAS_FONTUSB g_FXGdiFontUSBTable[] = {\r
45     {0x0000  ,  0x007F  ,       0  ,    1252  },\r
46     {0x0080  ,  0x00FF  ,       1  ,    1252  },\r
47     {0x0100  ,  0x017F  ,       2  ,    1250  },\r
48     {0x0180  ,  0x024F  ,       3  ,    1250  },\r
49     {0x0250  ,  0x02AF  ,       4  ,    0xFFFF},\r
50     {0x02B0  ,  0x02FF  ,       5  ,    0xFFFF},\r
51     {0x0300  ,  0x036F  ,       6  ,    0xFFFF},\r
52     {0x0370  ,  0x03FF  ,       7  ,    1253  },\r
53     {0x0400  ,  0x04FF  ,       9  ,    1251  },\r
54     {0x0500  ,  0x052F  ,       9  ,    0xFFFF},\r
55     {0x0530  ,  0x058F  ,       10 ,    0xFFFF},\r
56     {0x0590  ,  0x05FF  ,       11 ,    1255  },\r
57     {0x0600  ,  0x06FF  ,       13 ,    1256  },\r
58     {0x0700  ,  0x074F  ,       71 ,    0xFFFF},\r
59     {0x0750  ,  0x077F  ,       13 ,    0xFFFF},\r
60     {0x0780  ,  0x07BF  ,       72 ,    0xFFFF},\r
61     {0x07C0  ,  0x07FF  ,       14 ,    0xFFFF},\r
62     {0x0800  ,  0x08FF  ,       999,    0xFFFF},\r
63     {0x0900  ,  0x097F  ,       15 ,    0xFFFF},\r
64     {0x0980  ,  0x09FF  ,       16 ,    0xFFFF},\r
65     {0x0A00  ,  0x0A7F  ,       17 ,    0xFFFF},\r
66     {0x0A80  ,  0x0AFF  ,       18 ,    0xFFFF},\r
67     {0x0B00  ,  0x0B7F  ,       19 ,    0xFFFF},\r
68     {0x0B80  ,  0x0BFF  ,       20 ,    0xFFFF},\r
69     {0x0C00  ,  0x0C7F  ,       21 ,    0xFFFF},\r
70     {0x0C80  ,  0x0CFF  ,       22 ,    0xFFFF},\r
71     {0x0D00  ,  0x0D7F  ,       23 ,    0xFFFF},\r
72     {0x0D80  ,  0x0DFF  ,       73 ,    0xFFFF},\r
73     {0x0E00  ,  0x0E7F  ,       24 ,    874   },\r
74     {0x0E80  ,  0x0EFF  ,       25 ,    0xFFFF},\r
75     {0x0F00  ,  0x0FFF  ,       70 ,    0xFFFF},\r
76     {0x1000  ,  0x109F  ,       74 ,    0xFFFF},\r
77     {0x10A0  ,  0x10FF  ,       26 ,    0xFFFF},\r
78     {0x1100  ,  0x11FF  ,       28 ,    0xFFFF},\r
79     {0x1200  ,  0x137F  ,       75 ,    0xFFFF},\r
80     {0x1380  ,  0x139F  ,       75 ,    0xFFFF},\r
81     {0x13A0  ,  0x13FF  ,       76 ,    0xFFFF},\r
82     {0x1400  ,  0x167F  ,       77 ,    0xFFFF},\r
83     {0x1680  ,  0x169F  ,       78 ,    0xFFFF},\r
84     {0x16A0  ,  0x16FF  ,       79 ,    0xFFFF},\r
85     {0x1700  ,  0x171F  ,       84 ,    0xFFFF},\r
86     {0x1720  ,  0x173F  ,       84 ,    0xFFFF},\r
87     {0x1740  ,  0x175F  ,       84 ,    0xFFFF},\r
88     {0x1760  ,  0x177F  ,       84 ,    0xFFFF},\r
89     {0x1780  ,  0x17FF  ,       80 ,    0xFFFF},\r
90     {0x1800  ,  0x18AF  ,       81 ,    0xFFFF},\r
91     {0x18B0  ,  0x18FF  ,       999,    0xFFFF},\r
92     {0x1900  ,  0x194F  ,       93 ,    0xFFFF},\r
93     {0x1950  ,  0x197F  ,       94 ,    0xFFFF},\r
94     {0x1980  ,  0x19DF  ,       95 ,    0xFFFF},\r
95     {0x19E0  ,  0x19FF  ,       80 ,    0xFFFF},\r
96     {0x1A00  ,  0x1A1F  ,       96 ,    0xFFFF},\r
97     {0x1A20  ,  0x1AFF  ,       999,    0xFFFF},\r
98     {0x1B00  ,  0x1B7F  ,       27 ,    0xFFFF},\r
99     {0x1B80  ,  0x1BBF  ,       112,    0xFFFF},\r
100     {0x1BC0  ,  0x1BFF  ,       999,    0xFFFF},\r
101     {0x1C00  ,  0x1C4F  ,       113,    0xFFFF},\r
102     {0x1C50  ,  0x1C7F  ,       114,    0xFFFF},\r
103     {0x1C80  ,  0x1CFF  ,       999,    0xFFFF},\r
104     {0x1D00  ,  0x1D7F  ,       4  ,    0xFFFF},\r
105     {0x1D80  ,  0x1DBF  ,       4  ,    0xFFFF},\r
106     {0x1DC0  ,  0x1DFF  ,       6  ,    0xFFFF},\r
107     {0x1E00  ,  0x1EFF  ,       29 ,    0xFFFF},\r
108     {0x1F00  ,  0x1FFF  ,       30 ,    0xFFFF},\r
109     {0x2000  ,  0x206F  ,       31 ,    0xFFFF},\r
110     {0x2070  ,  0x209F  ,       32 ,    0xFFFF},\r
111     {0x20A0  ,  0x20CF  ,       33 ,    0xFFFF},\r
112     {0x20D0  ,  0x20FF  ,       34 ,    0xFFFF},\r
113     {0x2100  ,  0x214F  ,       35 ,    0xFFFF},\r
114     {0x2150  ,  0x215F  ,       36 ,    0xFFFF},\r
115     {0x2160  ,  0x216B  ,       36 ,    936   },\r
116     {0x216C  ,  0x216F  ,       36 ,    0xFFFF},\r
117     {0x2170  ,  0x2179  ,       36 ,    936   },\r
118     {0x217A  ,  0x218F  ,       36 ,    0xFFFF},\r
119     {0x2190  ,  0x2199  ,       37 ,    949   },\r
120     {0x219A  ,  0x21FF  ,       37 ,    0xFFFF},\r
121     {0x2200  ,  0x22FF  ,       38 ,    0xFFFF},\r
122     {0x2300  ,  0x23FF  ,       39 ,    0xFFFF},\r
123     {0x2400  ,  0x243F  ,       40 ,    0xFFFF},\r
124     {0x2440  ,  0x245F  ,       41 ,    0xFFFF},\r
125     {0x2460  ,  0x2473  ,       42 ,    932   },\r
126     {0x2474  ,  0x249B  ,       42 ,    936   },\r
127     {0x249C  ,  0x24E9  ,       42 ,    949   },\r
128     {0x24EA  ,  0x24FF  ,       42 ,    0xFFFF},\r
129     {0x2500  ,  0x2573  ,       43 ,    936   },\r
130     {0x2574  ,  0x257F  ,       43 ,    0xFFFF},\r
131     {0x2580  ,  0x2580  ,       44 ,    0xFFFF},\r
132     {0x2581  ,  0x258F  ,       44 ,    936   },\r
133     {0x2590  ,  0x259F  ,       44 ,    0xFFFF},\r
134     {0x25A0  ,  0x25FF  ,       45 ,    0xFFFF},\r
135     {0x2600  ,  0x26FF  ,       46 ,    0xFFFF},\r
136     {0x2700  ,  0x27BF  ,       47 ,    0xFFFF},\r
137     {0x27C0  ,  0x27EF  ,       38 ,    0xFFFF},\r
138     {0x27F0  ,  0x27FF  ,       37 ,    0xFFFF},\r
139     {0x2800  ,  0x28FF  ,       82 ,    0xFFFF},\r
140     {0x2900  ,  0x297F  ,       37 ,    0xFFFF},\r
141     {0x2980  ,  0x29FF  ,       38 ,    0xFFFF},\r
142     {0x2A00  ,  0x2AFF  ,       38 ,    0xFFFF},\r
143     {0x2B00  ,  0x2BFF  ,       37 ,    0xFFFF},\r
144     {0x2C00  ,  0x2C5F  ,       97 ,    0xFFFF},\r
145     {0x2C60  ,  0x2C7F  ,       29 ,    0xFFFF},\r
146     {0x2C80  ,  0x2CFF  ,       8  ,    0xFFFF},\r
147     {0x2D00  ,  0x2D2F  ,       26 ,    0xFFFF},\r
148     {0x2D30  ,  0x2D7F  ,       98 ,    0xFFFF},\r
149     {0x2D80  ,  0x2DDF  ,       75 ,    0xFFFF},\r
150     {0x2DE0  ,  0x2DFF  ,       9  ,    0xFFFF},\r
151     {0x2E00  ,  0x2E7F  ,       31 ,    0xFFFF},\r
152     {0x2E80  ,  0x2EFF  ,       59 ,    0xFFFF},\r
153     {0x2F00  ,  0x2FDF  ,       59 ,    0xFFFF},\r
154     {0x2FE0  ,  0x2FEF  ,       999,    0xFFFF},\r
155     {0x2FF0  ,  0x2FFF  ,       59 ,    0xFFFF},\r
156     {0x3000  ,  0x303F  ,       48 ,    0xFFFF},\r
157     {0x3040  ,  0x309F  ,       49 ,    932   },\r
158     {0x30A0  ,  0x30FF  ,       50 ,    932   },\r
159     {0x3100  ,  0x3129  ,       51 ,    936   },\r
160     {0x312A  ,  0x312F  ,       51 ,    0xFFFF},\r
161     {0x3130  ,  0x318F  ,       52 ,    949   },\r
162     {0x3190  ,  0x319F  ,       59 ,    0xFFFF},\r
163     {0x31A0  ,  0x31BF  ,       51 ,    0xFFFF},\r
164     {0x31C0  ,  0x31EF  ,       61 ,    0xFFFF},\r
165     {0x31F0  ,  0x31FF  ,       50 ,    0xFFFF},\r
166     {0x3200  ,  0x321C  ,       54 ,    949   },\r
167     {0x321D  ,  0x325F  ,       54 ,    0xFFFF},\r
168     {0x3260  ,  0x327F  ,       54 ,    949   },\r
169     {0x3280  ,  0x32FF  ,       54 ,    0xFFFF},\r
170     {0x3300  ,  0x3387  ,       55 ,    0xFFFF},\r
171     {0x3388  ,  0x33D0  ,       55 ,    949   },\r
172     {0x33D1  ,  0x33FF  ,       55 ,    0xFFFF},\r
173     {0x3400  ,  0x4DBF  ,       59 ,    0xFFFF},\r
174     {0x4DC0  ,  0x4DFF  ,       99 ,    0xFFFF},\r
175     {0x4E00  ,  0x9FA5  ,       59 ,    936   },\r
176     {0x9FA6  ,  0x9FFF  ,       59 ,    0xFFFF},\r
177     {0xA000  ,  0xA48F  ,       83 ,    0xFFFF},\r
178     {0xA490  ,  0xA4CF  ,       83 ,    0xFFFF},\r
179     {0xA4D0  ,  0xA4FF  ,       999,    0xFFFF},\r
180     {0xA500  ,  0xA63F  ,       12 ,    0xFFFF},\r
181     {0xA640  ,  0xA69F  ,       9  ,    0xFFFF},\r
182     {0xA6A0  ,  0xA6FF  ,       999,    0xFFFF},\r
183     {0xA700  ,  0xA71F  ,       5  ,    0xFFFF},\r
184     {0xA720  ,  0xA7FF  ,       29 ,    0xFFFF},\r
185     {0xA800  ,  0xA82F  ,       100,    0xFFFF},\r
186     {0xA830  ,  0xA8FF  ,       999,    0xFFFF},\r
187     {0xA840  ,  0xA87F  ,       53 ,    0xFFFF},\r
188     {0xA880  ,  0xA8DF  ,       115,    0xFFFF},\r
189     {0xA8E0  ,  0xA8FF  ,       999,    0xFFFF},\r
190     {0xA900  ,  0xA92F  ,       116,    0xFFFF},\r
191     {0xA930  ,  0xA95F  ,       117,    0xFFFF},\r
192     {0xA960  ,  0xA9FF  ,       999,    0xFFFF},\r
193     {0xAA00  ,  0xAA5F  ,       118,    0xFFFF},\r
194     {0xAA60  ,  0xABFF  ,       999,    0xFFFF},\r
195     {0xAC00  ,  0xD7AF  ,       56 ,    949   },\r
196     {0xD7B0  ,  0xD7FF  ,       999,    0xFFFF},\r
197     {0xD800  ,  0xDB7F  ,       57 ,    0xFFFF},\r
198     {0xDB80  ,  0xDBFF  ,       57 ,    0xFFFF},\r
199     {0xDC00  ,  0xDFFF  ,       57 ,    0xFFFF},\r
200     {0xE000  ,  0xE814  ,       60 ,    0xFFFF},\r
201     {0xE815  ,  0xE864  ,       60 ,    936   },\r
202     {0xE865  ,  0xF8FF  ,       60 ,    0xFFFF},\r
203     {0xF900  ,  0xFA0B  ,       61 ,    949   },\r
204     {0xFA0C  ,  0xFA0D  ,       61 ,    936   },\r
205     {0xFA0E  ,  0xFA2D  ,       61 ,    932   },\r
206     {0xFA2E  ,  0xFAFF  ,       61 ,    0xFFFF},\r
207     {0xFB00  ,  0xFB4F  ,       62 ,    0xFFFF},\r
208     {0xFB50  ,  0xFDFF  ,       63 ,    1256  },\r
209     {0xFE00  ,  0xFE0F  ,       91 ,    0xFFFF},\r
210     {0xFE10  ,  0xFE1F  ,       65 ,    0xFFFF},\r
211     {0xFE20  ,  0xFE2F  ,       64 ,    0xFFFF},\r
212     {0xFE30  ,  0xFE4F  ,       65 ,    0xFFFF},\r
213     {0xFE50  ,  0xFE6F  ,       66 ,    0xFFFF},\r
214     {0xFE70  ,  0xFEFF  ,       67 ,    1256  },\r
215     {0xFF00  ,  0xFF5F  ,       68 ,    936   },\r
216     {0xFF60  ,  0xFF9F  ,       68 ,    932   },\r
217     {0xFFA0  ,  0xFFEF  ,       68 ,    0xFFFF},\r
218 };\r
219 FGAS_LPCFONTUSB FGAS_GetUnicodeBitField(FX_WCHAR wUnicode)\r
220 {\r
221     FX_INT32 iEnd = sizeof(g_FXGdiFontUSBTable) / sizeof(FGAS_FONTUSB) - 1;\r
222     FXSYS_assert(iEnd >= 0);\r
223     FX_INT32 iStart = 0, iMid;\r
224     do {\r
225         iMid = (iStart + iEnd) / 2;\r
226         const FGAS_FONTUSB &usb = g_FXGdiFontUSBTable[iMid];\r
227         if (wUnicode < usb.wStartUnicode) {\r
228             iEnd = iMid - 1;\r
229         } else if (wUnicode > usb.wEndUnicode) {\r
230             iStart = iMid + 1;\r
231         } else {\r
232             return &usb;\r
233         }\r
234     } while (iStart <= iEnd);\r
235     return NULL;\r
236 }\r