Merge to XFA: Use stdint.h types throughout PDFium.
[pdfium.git] / xfa / src / fgas / src / layout / fx_unicode.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_unicode.h"\r
9 void FX_TEXTLAYOUT_PieceSort(CFX_TPOArray &tpos, int32_t iStart, int32_t iEnd)\r
10 {\r
11     FXSYS_assert(iStart > -1 && iStart < tpos.GetSize());\r
12     FXSYS_assert(iEnd > -1 && iEnd < tpos.GetSize());\r
13     if (iStart >= iEnd) {\r
14         return;\r
15     }\r
16     int32_t i = iStart, j = iEnd;\r
17     FX_TPO *pCur = tpos.GetPtrAt(iStart), *pSort;\r
18     int32_t v = pCur->pos;\r
19     while (i < j) {\r
20         while (j > i) {\r
21             pSort = tpos.GetPtrAt(j);\r
22             if (pSort->pos < v) {\r
23                 FX_TPO t = *pSort;\r
24                 *pSort = *pCur;\r
25                 *pCur = t;\r
26                 pCur = pSort;\r
27                 break;\r
28             }\r
29             j --;\r
30         }\r
31         while (i < j) {\r
32             pSort = tpos.GetPtrAt(i);\r
33             if (pSort->pos > v) {\r
34                 FX_TPO t = *pSort;\r
35                 *pSort = *pCur;\r
36                 *pCur = t;\r
37                 pCur = pSort;\r
38                 break;\r
39             }\r
40             i ++;\r
41         }\r
42     }\r
43     i --, j ++;\r
44     if (iStart < i) {\r
45         FX_TEXTLAYOUT_PieceSort(tpos, iStart, i);\r
46     }\r
47     if (j < iEnd) {\r
48         FX_TEXTLAYOUT_PieceSort(tpos, j, iEnd);\r
49     }\r
50 }\r
51 static const FX_JAPCHARPROPERTYEX gs_FX_JapCharPropertysEx[] = {\r
52     {0x3001, 0x13},\r
53     {0x3002, 0x13},\r
54     {0x3041, 0x23},\r
55     {0x3043, 0x23},\r
56     {0x3045, 0x23},\r
57     {0x3047, 0x23},\r
58     {0x3049, 0x23},\r
59     {0x3063, 0x23},\r
60     {0x3083, 0x23},\r
61     {0x3085, 0x23},\r
62     {0x3087, 0x23},\r
63     {0x308E, 0x23},\r
64     {0x3095, 0x23},\r
65     {0x3096, 0x23},\r
66     {0x30A1, 0x23},\r
67     {0x30A3, 0x23},\r
68     {0x30A5, 0x23},\r
69     {0x30A7, 0x23},\r
70     {0x30A9, 0x23},\r
71     {0x30C3, 0x23},\r
72     {0x30E3, 0x23},\r
73     {0x30E5, 0x23},\r
74     {0x30E7, 0x23},\r
75     {0x30EE, 0x23},\r
76     {0x30F5, 0x23},\r
77     {0x30F6, 0x23},\r
78     {0x30FB, 0x22},\r
79     {0x31F0, 0x23},\r
80     {0x31F1, 0x23},\r
81     {0x31F2, 0x23},\r
82     {0x31F3, 0x23},\r
83     {0x31F4, 0x23},\r
84     {0x31F5, 0x23},\r
85     {0x31F6, 0x23},\r
86     {0x31F7, 0x23},\r
87     {0x31F8, 0x23},\r
88     {0x31F9, 0x23},\r
89     {0x31FA, 0x23},\r
90     {0x31FB, 0x23},\r
91     {0x31FC, 0x23},\r
92     {0x31FD, 0x23},\r
93     {0x31FE, 0x23},\r
94     {0x31FF, 0x23},\r
95 };\r
96 FX_LPCJAPCHARPROPERTYEX FX_GetJapCharPropertyEx(FX_WCHAR wch)\r
97 {\r
98     int32_t iStart = 0;\r
99     int32_t iEnd = sizeof(gs_FX_JapCharPropertysEx) / sizeof(FX_JAPCHARPROPERTYEX);\r
100     while (iStart <= iEnd) {\r
101         int32_t iMid = (iStart + iEnd) / 2;\r
102         FX_WCHAR wJapChar = gs_FX_JapCharPropertysEx[iMid].wChar;\r
103         if (wch == wJapChar) {\r
104             return gs_FX_JapCharPropertysEx + iMid;\r
105         } else if (wch < wJapChar) {\r
106             iEnd = iMid - 1;\r
107         } else {\r
108             iStart = iMid + 1;\r
109         }\r
110     }\r
111     return NULL;\r
112 }\r
113 FX_BOOL FX_AdjustJapCharDisplayPos(FX_WCHAR wch, FX_BOOL bMBCSCode, IFX_Font *pFont, FX_FLOAT fFontSize, FX_BOOL bVertical, CFX_PointF &ptOffset)\r
114 {\r
115     if (pFont == NULL || !bVertical)    {\r
116         return FALSE;\r
117     }\r
118     if (wch < 0x3001 || wch > 0x31FF)   {\r
119         return FALSE;\r
120     }\r
121     FX_LPCJAPCHARPROPERTYEX pJapChar = FX_GetJapCharPropertyEx(wch);\r
122     if (pJapChar == NULL) {\r
123         return FALSE;\r
124     }\r
125     CFX_Rect rtBBox;\r
126     rtBBox.Reset();\r
127     if (pFont->GetCharBBox(wch, rtBBox, bMBCSCode)) {\r
128         switch (pJapChar->uAlign & 0xF0) {\r
129             case FX_JAPCHARPROPERTYEX_Top:\r
130                 ptOffset.y = fFontSize * (1000 - rtBBox.height) / 1200.0f;\r
131                 break;\r
132             case FX_JAPCHARPROPERTYEX_Middle:\r
133                 ptOffset.y = fFontSize * (1000 - rtBBox.height) / 6000.0f;\r
134                 break;\r
135         }\r
136         switch (pJapChar->uAlign & 0x0F) {\r
137             case FX_JAPCHARPROPERTYEX_Center:\r
138                 ptOffset.x = fFontSize * (600 - rtBBox.right()) / 1000.0f;\r
139                 break;\r
140             case FX_JAPCHARPROPERTYEX_Right:\r
141                 ptOffset.x = fFontSize * (950 - rtBBox.right()) / 1000.0f;\r
142                 break;\r
143         }\r
144     }\r
145     return TRUE;\r
146 }\r