OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../include/fxedit/fxet_stub.h" | 7 #include "../../include/fxedit/fxet_stub.h" |
8 #include "../../include/fxedit/fx_edit.h" | 8 #include "../../include/fxedit/fx_edit.h" |
9 #include "../../include/fxedit/fxet_edit.h" | 9 #include "../../include/fxedit/fxet_edit.h" |
10 | 10 |
11 #define FX_EDIT_UNDERLINEHALFWIDTH 0.5f | 11 #define FX_EDIT_UNDERLINEHALFWIDTH 0.5f |
12 #define FX_EDIT_CROSSOUTHALFWIDTH 0.5f | 12 #define FX_EDIT_CROSSOUTHALFWIDTH 0.5f |
13 | 13 |
14 extern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, FX_INT32 nFo
ntIndex, FX_WORD Word, FX_WORD SubWord); | 14 extern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap* pFontMap, |
15 | 15 FX_INT32 nFontIndex, |
16 CPDF_Rect GetUnderLineRect(const CPVT_Word& word) | 16 FX_WORD Word, |
17 { | 17 FX_WORD SubWord); |
18 return CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f, | 18 |
19 word.ptWord.x + word.fWidth, wor
d.ptWord.y + word.fDescent * 0.25f); | 19 CPDF_Rect GetUnderLineRect(const CPVT_Word& word) { |
20 } | 20 return CPDF_Rect(word.ptWord.x, |
21 | 21 word.ptWord.y + word.fDescent * 0.5f, |
22 CPDF_Rect GetCrossoutRect(const CPVT_Word& word) | 22 word.ptWord.x + word.fWidth, |
23 { | 23 word.ptWord.y + word.fDescent * 0.25f); |
24 return CPDF_Rect(word.ptWord.x, word.ptWord.y + (word.fAscent + word.fDe
scent) * 0.5f + word.fDescent * 0.25f, | 24 } |
25 word.ptWord.x + word.fWi
dth, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f); | 25 |
26 } | 26 CPDF_Rect GetCrossoutRect(const CPVT_Word& word) { |
27 | 27 return CPDF_Rect(word.ptWord.x, |
28 static void DrawTextString(CFX_RenderDevice* pDevice, const CPDF_Point& pt, CPDF
_Font* pFont, FX_FLOAT fFontSize, CPDF_Matrix* pUser2Device, | 28 word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f + |
29 const CFX_ByteString& str, FX_ARGB crT
extFill, FX_ARGB crTextStroke, FX_INT32 nHorzScale) | 29 word.fDescent * 0.25f, |
30 { | 30 word.ptWord.x + word.fWidth, |
31 FX_FLOAT x = pt.x, y = pt.y; | 31 word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f); |
32 pUser2Device->Transform(x, y); | 32 } |
33 | 33 |
34 if (pFont) | 34 static void DrawTextString(CFX_RenderDevice* pDevice, |
35 { | 35 const CPDF_Point& pt, |
36 if (nHorzScale != 100) | 36 CPDF_Font* pFont, |
37 { | 37 FX_FLOAT fFontSize, |
38 CPDF_Matrix mt(nHorzScale/100.0f,0,0,1,0,0); | 38 CPDF_Matrix* pUser2Device, |
39 mt.Concat(*pUser2Device); | 39 const CFX_ByteString& str, |
40 | 40 FX_ARGB crTextFill, |
41 CPDF_RenderOptions ro; | 41 FX_ARGB crTextStroke, |
42 ro.m_Flags = RENDER_CLEARTYPE; | 42 FX_INT32 nHorzScale) { |
43 ro.m_ColorMode = RENDER_COLOR_NORMAL; | 43 FX_FLOAT x = pt.x, y = pt.y; |
44 | 44 pUser2Device->Transform(x, y); |
45 if (crTextStroke != 0) | 45 |
46 { | 46 if (pFont) { |
47 CPDF_Point pt1(0,0), pt2(1,0); | 47 if (nHorzScale != 100) { |
48 pUser2Device->Transform(pt1.x, pt1.y); | 48 CPDF_Matrix mt(nHorzScale / 100.0f, 0, 0, 1, 0, 0); |
49 pUser2Device->Transform(pt2.x, pt2.y); | 49 mt.Concat(*pUser2Device); |
50 CFX_GraphStateData gsd; | 50 |
51 gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x +
pt2.y) - (pt1.x + pt1.y)); | 51 CPDF_RenderOptions ro; |
52 | 52 ro.m_Flags = RENDER_CLEARTYPE; |
53 CPDF_TextRenderer::DrawTextString(pDevice,x, y,
pFont, fFontSize, &mt, str, crTextFill, crTextStroke, &gsd, &ro); | 53 ro.m_ColorMode = RENDER_COLOR_NORMAL; |
54 } | 54 |
55 else | 55 if (crTextStroke != 0) { |
56 CPDF_TextRenderer::DrawTextString(pDevice,x, y,
pFont, fFontSize, &mt, str, crTextFill, 0, NULL, &ro); | 56 CPDF_Point pt1(0, 0), pt2(1, 0); |
57 } | 57 pUser2Device->Transform(pt1.x, pt1.y); |
58 else | 58 pUser2Device->Transform(pt2.x, pt2.y); |
59 { | 59 CFX_GraphStateData gsd; |
60 CPDF_RenderOptions ro; | 60 gsd.m_LineWidth = |
61 ro.m_Flags = RENDER_CLEARTYPE; | 61 (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y)); |
62 ro.m_ColorMode = RENDER_COLOR_NORMAL; | 62 |
63 | 63 CPDF_TextRenderer::DrawTextString(pDevice, |
64 if (crTextStroke != 0) | 64 x, |
65 { | 65 y, |
66 CPDF_Point pt1(0,0), pt2(1,0); | 66 pFont, |
67 pUser2Device->Transform(pt1.x, pt1.y); | 67 fFontSize, |
68 pUser2Device->Transform(pt2.x, pt2.y); | 68 &mt, |
69 CFX_GraphStateData gsd; | 69 str, |
70 gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x +
pt2.y) - (pt1.x + pt1.y)); | 70 crTextFill, |
71 | 71 crTextStroke, |
72 CPDF_TextRenderer::DrawTextString(pDevice,x, y,
pFont, fFontSize, pUser2Device, str, crTextFill, crTextStroke, &gsd, &ro); | 72 &gsd, |
73 } | 73 &ro); |
74 else | 74 } else |
75 CPDF_TextRenderer::DrawTextString(pDevice,x, y,
pFont, fFontSize, pUser2Device, str, crTextFill, 0, NULL, &ro); | 75 CPDF_TextRenderer::DrawTextString(pDevice, |
76 } | 76 x, |
77 } | 77 y, |
78 } | 78 pFont, |
79 | 79 fFontSize, |
80 void IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Devic
e, IFX_Edit* pEdit, FX_COLORREF color, | 80 &mt, |
81 const CPDF_Rect&
rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange) | 81 str, |
82 { | 82 crTextFill, |
83 pDevice->SaveState(); | 83 0, |
84 | 84 NULL, |
85 if (!rcClip.IsEmpty()) | 85 &ro); |
86 { | 86 } else { |
87 CPDF_Rect rcTemp = rcClip; | 87 CPDF_RenderOptions ro; |
88 pUser2Device->TransformRect(rcTemp); | 88 ro.m_Flags = RENDER_CLEARTYPE; |
89 FX_RECT rcDevClip; | 89 ro.m_ColorMode = RENDER_COLOR_NORMAL; |
90 rcDevClip.left = (FX_INT32)rcTemp.left; | 90 |
91 rcDevClip.right = (FX_INT32)rcTemp.right; | 91 if (crTextStroke != 0) { |
92 rcDevClip.top = (FX_INT32)rcTemp.top; | 92 CPDF_Point pt1(0, 0), pt2(1, 0); |
93 rcDevClip.bottom = (FX_INT32)rcTemp.bottom; | 93 pUser2Device->Transform(pt1.x, pt1.y); |
94 pDevice->SetClip_Rect(&rcDevClip); | 94 pUser2Device->Transform(pt2.x, pt2.y); |
95 } | 95 CFX_GraphStateData gsd; |
96 | 96 gsd.m_LineWidth = |
97 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) | 97 (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y)); |
98 { | 98 |
99 if (pEdit->GetFontMap()) | 99 CPDF_TextRenderer::DrawTextString(pDevice, |
100 { | 100 x, |
101 if (pRange) | 101 y, |
102 pIterator->SetAt(pRange->BeginPos); | 102 pFont, |
103 else | 103 fFontSize, |
104 pIterator->SetAt(0); | 104 pUser2Device, |
105 | 105 str, |
106 while (pIterator->NextWord()) | 106 crTextFill, |
107 { | 107 crTextStroke, |
108 CPVT_WordPlace place = pIterator->GetAt(); | 108 &gsd, |
109 if (pRange && place.WordCmp(pRange->EndPos) > 0)
break; | 109 &ro); |
110 | 110 } else |
111 CPVT_Word word; | 111 CPDF_TextRenderer::DrawTextString(pDevice, |
112 if (pIterator->GetWord(word)) | 112 x, |
113 { | 113 y, |
114 CFX_PathData pathUnderline; | 114 pFont, |
115 CPDF_Rect rcUnderline = GetUnderLineRect
(word); | 115 fFontSize, |
116 rcUnderline.left += ptOffset.x; | 116 pUser2Device, |
117 rcUnderline.right += ptOffset.x; | 117 str, |
118 rcUnderline.top += ptOffset.y; | 118 crTextFill, |
119 rcUnderline.bottom += ptOffset.y; | 119 0, |
120 pathUnderline.AppendRect(rcUnderline.lef
t, rcUnderline.bottom, rcUnderline.right, rcUnderline.top); | 120 NULL, |
121 | 121 &ro); |
122 pDevice->DrawPath(&pathUnderline, pUser2
Device, NULL, color, 0, FXFILL_WINDING); | 122 } |
123 } | 123 } |
124 } | 124 } |
125 } | 125 |
126 } | 126 void IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, |
127 | 127 CPDF_Matrix* pUser2Device, |
128 pDevice->RestoreState(); | 128 IFX_Edit* pEdit, |
129 } | 129 FX_COLORREF color, |
130 | 130 const CPDF_Rect& rcClip, |
131 void IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IF
X_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke, | 131 const CPDF_Point& ptOffset, |
132 const CPDF_Rect& rcClip, const C
PDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHan
dler, void* pFFLData) | 132 const CPVT_WordRange* pRange) { |
133 { | 133 pDevice->SaveState(); |
134 | 134 |
135 FX_BOOL bContinuous = pEdit->GetCharArray() == 0; | 135 if (!rcClip.IsEmpty()) { |
136 if (pEdit->GetCharSpace() > 0.0f) | 136 CPDF_Rect rcTemp = rcClip; |
137 bContinuous = FALSE; | 137 pUser2Device->TransformRect(rcTemp); |
138 | 138 FX_RECT rcDevClip; |
139 FX_WORD SubWord = pEdit->GetPasswordChar(); | 139 rcDevClip.left = (FX_INT32)rcTemp.left; |
140 FX_FLOAT fFontSize = pEdit->GetFontSize(); | 140 rcDevClip.right = (FX_INT32)rcTemp.right; |
141 CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); | 141 rcDevClip.top = (FX_INT32)rcTemp.top; |
142 FX_INT32 nHorzScale = pEdit->GetHorzScale(); | 142 rcDevClip.bottom = (FX_INT32)rcTemp.bottom; |
143 | 143 pDevice->SetClip_Rect(&rcDevClip); |
144 FX_COLORREF crCurFill = crTextFill; | 144 } |
145 FX_COLORREF crOldFill = crCurFill; | 145 |
146 | 146 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { |
147 FX_BOOL bSelect = FALSE; | 147 if (pEdit->GetFontMap()) { |
148 const FX_COLORREF crWhite = ArgbEncode(255,255,255,255); | 148 if (pRange) |
149 const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113); | 149 pIterator->SetAt(pRange->BeginPos); |
150 | 150 else |
151 CFX_ByteTextBuf sTextBuf; | 151 pIterator->SetAt(0); |
152 FX_INT32 nFontIndex = -1; | 152 |
153 CPDF_Point ptBT(0.0f,0.0f); | 153 while (pIterator->NextWord()) { |
154 | 154 CPVT_WordPlace place = pIterator->GetAt(); |
155 pDevice->SaveState(); | 155 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
156 | 156 break; |
157 if (!rcClip.IsEmpty()) | 157 |
158 { | 158 CPVT_Word word; |
159 CPDF_Rect rcTemp = rcClip; | 159 if (pIterator->GetWord(word)) { |
160 pUser2Device->TransformRect(rcTemp); | 160 CFX_PathData pathUnderline; |
161 FX_RECT rcDevClip; | 161 CPDF_Rect rcUnderline = GetUnderLineRect(word); |
162 rcDevClip.left = (FX_INT32)rcTemp.left; | 162 rcUnderline.left += ptOffset.x; |
163 rcDevClip.right = (FX_INT32)rcTemp.right; | 163 rcUnderline.right += ptOffset.x; |
164 rcDevClip.top = (FX_INT32)rcTemp.top; | 164 rcUnderline.top += ptOffset.y; |
165 rcDevClip.bottom = (FX_INT32)rcTemp.bottom; | 165 rcUnderline.bottom += ptOffset.y; |
166 pDevice->SetClip_Rect(&rcDevClip); | 166 pathUnderline.AppendRect(rcUnderline.left, |
167 } | 167 rcUnderline.bottom, |
168 | 168 rcUnderline.right, |
169 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) | 169 rcUnderline.top); |
170 { | 170 |
171 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) | 171 pDevice->DrawPath( |
172 { | 172 &pathUnderline, pUser2Device, NULL, color, 0, FXFILL_WINDING); |
173 if (pRange) | 173 } |
174 pIterator->SetAt(pRange->BeginPos); | 174 } |
175 else | 175 } |
176 pIterator->SetAt(0); | 176 } |
177 | 177 |
178 CPVT_WordPlace oldplace; | 178 pDevice->RestoreState(); |
179 | 179 } |
180 while (pIterator->NextWord()) | 180 |
181 { | 181 void IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, |
182 CPVT_WordPlace place = pIterator->GetAt(); | 182 CPDF_Matrix* pUser2Device, |
183 if (pRange && place.WordCmp(pRange->EndPos) > 0)
break; | 183 IFX_Edit* pEdit, |
184 | 184 FX_COLORREF crTextFill, |
185 if (wrSelect.IsExist()) | 185 FX_COLORREF crTextStroke, |
186 { | 186 const CPDF_Rect& rcClip, |
187 bSelect = place.WordCmp(wrSelect.BeginPo
s) > 0 && place.WordCmp(wrSelect.EndPos) <= 0; | 187 const CPDF_Point& ptOffset, |
188 if (bSelect) | 188 const CPVT_WordRange* pRange, |
189 {
| 189 IFX_SystemHandler* pSystemHandler, |
190 crCurFill = crWhite;
| 190 void* pFFLData) { |
191 } | 191 FX_BOOL bContinuous = pEdit->GetCharArray() == 0; |
192 else | 192 if (pEdit->GetCharSpace() > 0.0f) |
193 { | 193 bContinuous = FALSE; |
194 crCurFill = crTextFill; | 194 |
195 } | 195 FX_WORD SubWord = pEdit->GetPasswordChar(); |
196 } | 196 FX_FLOAT fFontSize = pEdit->GetFontSize(); |
197 if(pSystemHandler && pSystemHandler->IsSelection
Implemented()) | 197 CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); |
198 { | 198 FX_INT32 nHorzScale = pEdit->GetHorzScale(); |
199 crCurFill = crTextFill; | 199 |
200 crOldFill = crCurFill; | 200 FX_COLORREF crCurFill = crTextFill; |
201 } | 201 FX_COLORREF crOldFill = crCurFill; |
202 CPVT_Word word; | 202 |
203 if (pIterator->GetWord(word)) | 203 FX_BOOL bSelect = FALSE; |
204 { | 204 const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255); |
205 | 205 const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113); |
206 if (bSelect) | 206 |
207 { | 207 CFX_ByteTextBuf sTextBuf; |
208 | 208 FX_INT32 nFontIndex = -1; |
209 CPVT_Line line; | 209 CPDF_Point ptBT(0.0f, 0.0f); |
210 pIterator->GetLine(line); | 210 |
211 | 211 pDevice->SaveState(); |
212 if(pSystemHandler && pSystemHand
ler->IsSelectionImplemented()) | 212 |
213 { | 213 if (!rcClip.IsEmpty()) { |
214 CPDF_Rect rc(word.ptWord
.x,line.ptLine.y + line.fLineDescent, | 214 CPDF_Rect rcTemp = rcClip; |
215 word.ptWord.x+wo
rd.fWidth,line.ptLine.y + line.fLineAscent); | 215 pUser2Device->TransformRect(rcTemp); |
216 rc.Intersect(rcClip); | 216 FX_RECT rcDevClip; |
217 //CFX_Edit* pEt = (CFX_E
dit*)pEdit; | 217 rcDevClip.left = (FX_INT32)rcTemp.left; |
218 //CPDF_Rect rcEdit = pEt
->VTToEdit(rc); | 218 rcDevClip.right = (FX_INT32)rcTemp.right; |
219 pSystemHandler->OutputSe
lectedRect(pFFLData,rc); | 219 rcDevClip.top = (FX_INT32)rcTemp.top; |
220 } | 220 rcDevClip.bottom = (FX_INT32)rcTemp.bottom; |
221 else | 221 pDevice->SetClip_Rect(&rcDevClip); |
222 { | 222 } |
223 CFX_PathData pathSelBK; | 223 |
224 pathSelBK.AppendRect(wor
d.ptWord.x,line.ptLine.y + line.fLineDescent, | 224 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { |
225 word.ptWord.x+wo
rd.fWidth,line.ptLine.y + line.fLineAscent); | 225 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { |
226 | 226 if (pRange) |
227 pDevice->DrawPath(&pathS
elBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING); | 227 pIterator->SetAt(pRange->BeginPos); |
228 } | 228 else |
229 } | 229 pIterator->SetAt(0); |
230 | 230 |
231 if (bContinuous) | 231 CPVT_WordPlace oldplace; |
232 { | 232 |
233 if (place.LineCmp(oldplace) != 0
|| word.nFontIndex != nFontIndex || | 233 while (pIterator->NextWord()) { |
234 crOldFill != crCurFill) | 234 CPVT_WordPlace place = pIterator->GetAt(); |
235 { | 235 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
236 if (sTextBuf.GetLength()
> 0) | 236 break; |
237 {
| 237 |
238 DrawTextString(p
Device, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(n
FontIndex), | 238 if (wrSelect.IsExist()) { |
239 fFontSiz
e, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale); | 239 bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && |
240 | 240 place.WordCmp(wrSelect.EndPos) <= 0; |
241 sTextBuf.Clear()
; | 241 if (bSelect) { |
242 } | 242 crCurFill = crWhite; |
243 nFontIndex = word.nFontI
ndex; | 243 } else { |
244 ptBT = word.ptWord; | 244 crCurFill = crTextFill; |
245 crOldFill = crCurFill; | 245 } |
246 } | 246 } |
247 | 247 if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) { |
248 sTextBuf << GetPDFWordString(pFo
ntMap, word.nFontIndex, word.Word, SubWord);
| 248 crCurFill = crTextFill; |
249 } | 249 crOldFill = crCurFill; |
250 else | 250 } |
251 { | 251 CPVT_Word word; |
252 DrawTextString(pDevice,CPDF_Poin
t(word.ptWord.x+ptOffset.x, word.ptWord.y+ptOffset.y), pFontMap->GetPDFFont(word
.nFontIndex), | 252 if (pIterator->GetWord(word)) { |
253 fFontSize, pUser2Device,
GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), crCurFill, crT
extStroke, nHorzScale); | 253 if (bSelect) { |
254 | 254 CPVT_Line line; |
255 } | 255 pIterator->GetLine(line); |
256 oldplace = place; | 256 |
257 | 257 if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) { |
258 | 258 CPDF_Rect rc(word.ptWord.x, |
259 } | 259 line.ptLine.y + line.fLineDescent, |
260 } | 260 word.ptWord.x + word.fWidth, |
261 | 261 line.ptLine.y + line.fLineAscent); |
262 if (sTextBuf.GetLength() > 0) | 262 rc.Intersect(rcClip); |
263 { | 263 // CFX_Edit* pEt = (CFX_Edit*)pEdit; |
264 DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffs
et.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex), | 264 // CPDF_Rect rcEdit = pEt->VTToEdit(rc); |
265 fFontSize, pUser2Device, sTextBuf.GetByt
eString(), crOldFill, crTextStroke, nHorzScale); | 265 pSystemHandler->OutputSelectedRect(pFFLData, rc); |
266 } | 266 } else { |
267 } | 267 CFX_PathData pathSelBK; |
268 } | 268 pathSelBK.AppendRect(word.ptWord.x, |
269 | 269 line.ptLine.y + line.fLineDescent, |
270 pDevice->RestoreState(); | 270 word.ptWord.x + word.fWidth, |
271 } | 271 line.ptLine.y + line.fLineAscent); |
272 | 272 |
273 void IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device
, IFX_Edit* pEdit, | 273 pDevice->DrawPath( |
274 const CPDF_Rect& rcClip, const C
PDF_Point& ptOffset, const CPVT_WordRange* pRange) | 274 &pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING); |
275 { | 275 } |
276 //FX_FLOAT fFontSize = pEdit->GetFontSize(); | 276 } |
277 CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); | 277 |
278 | 278 if (bContinuous) { |
279 FX_COLORREF crCurText = ArgbEncode(255, 0,0,0); | 279 if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex || |
280 FX_COLORREF crOld = crCurText; | 280 crOldFill != crCurFill) { |
281 FX_BOOL bSelect = FALSE; | 281 if (sTextBuf.GetLength() > 0) { |
282 const FX_COLORREF crWhite = ArgbEncode(255,255,255,255); | 282 DrawTextString( |
283 const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113); | 283 pDevice, |
284 | 284 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
285 CFX_ByteTextBuf sTextBuf; | 285 pFontMap->GetPDFFont(nFontIndex), |
286 CPVT_WordProps wp; | 286 fFontSize, |
287 CPDF_Point ptBT(0.0f,0.0f); | 287 pUser2Device, |
288 | 288 sTextBuf.GetByteString(), |
289 pDevice->SaveState(); | 289 crOldFill, |
290 | 290 crTextStroke, |
291 if (!rcClip.IsEmpty()) | 291 nHorzScale); |
292 { | 292 |
293 CPDF_Rect rcTemp = rcClip; | 293 sTextBuf.Clear(); |
294 pUser2Device->TransformRect(rcTemp); | 294 } |
295 FX_RECT rcDevClip; | 295 nFontIndex = word.nFontIndex; |
296 rcDevClip.left = (FX_INT32)rcTemp.left; | 296 ptBT = word.ptWord; |
297 rcDevClip.right = (FX_INT32)rcTemp.right; | 297 crOldFill = crCurFill; |
298 rcDevClip.top = (FX_INT32)rcTemp.top; | 298 } |
299 rcDevClip.bottom = (FX_INT32)rcTemp.bottom; | 299 |
300 pDevice->SetClip_Rect(&rcDevClip); | 300 sTextBuf << GetPDFWordString( |
301 } | 301 pFontMap, word.nFontIndex, word.Word, SubWord); |
302 | 302 } else { |
303 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) | 303 DrawTextString( |
304 { | 304 pDevice, |
305 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) | 305 CPDF_Point(word.ptWord.x + ptOffset.x, |
306 { | 306 word.ptWord.y + ptOffset.y), |
307 if (pRange) | 307 pFontMap->GetPDFFont(word.nFontIndex), |
308 pIterator->SetAt(pRange->BeginPos); | 308 fFontSize, |
309 else | 309 pUser2Device, |
310 pIterator->SetAt(0); | 310 GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), |
311 | 311 crCurFill, |
312 CPVT_WordPlace oldplace; | 312 crTextStroke, |
313 | 313 nHorzScale); |
314 while (pIterator->NextWord()) | 314 } |
315 { | 315 oldplace = place; |
316 CPVT_WordPlace place = pIterator->GetAt(); | 316 } |
317 if (pRange && place.WordCmp(pRange->EndPos) > 0)
break; | 317 } |
318 | 318 |
319 CPVT_Word word; | 319 if (sTextBuf.GetLength() > 0) { |
320 if (pIterator->GetWord(word)) | 320 DrawTextString(pDevice, |
321 { | 321 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
322 word.WordProps.fFontSize = word.fFontSiz
e; | 322 pFontMap->GetPDFFont(nFontIndex), |
323 | 323 fFontSize, |
324 crCurText = ArgbEncode(255,word.WordProp
s.dwWordColor); | 324 pUser2Device, |
325 | 325 sTextBuf.GetByteString(), |
326 if (wrSelect.IsExist()) | 326 crOldFill, |
327 { | 327 crTextStroke, |
328 bSelect = place.WordCmp(wrSelect
.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0; | 328 nHorzScale); |
329 if (bSelect) | 329 } |
330 {
| 330 } |
331 crCurText = crWhite; | 331 } |
332 } | 332 |
333 } | 333 pDevice->RestoreState(); |
334 | 334 } |
335 if (bSelect) | 335 |
336 { | 336 void IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, |
337 CPVT_Line line; | 337 CPDF_Matrix* pUser2Device, |
338 pIterator->GetLine(line); | 338 IFX_Edit* pEdit, |
339 | 339 const CPDF_Rect& rcClip, |
340 CFX_PathData pathSelBK; | 340 const CPDF_Point& ptOffset, |
341 pathSelBK.AppendRect(word.ptWord
.x + ptOffset.x, | 341 const CPVT_WordRange* pRange) { |
342 line.ptLine.y + line.fLi
neDescent + ptOffset.y, | 342 // FX_FLOAT fFontSize = pEdit->GetFontSize(); |
343 word.ptWord.x+word.fWidt
h + ptOffset.x, | 343 CPVT_WordRange wrSelect = pEdit->GetSelectWordRange(); |
344 line.ptLine.y + line.fLi
neAscent + ptOffset.y); | 344 |
345 | 345 FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0); |
346 pDevice->DrawPath(&pathSelBK, pU
ser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
| 346 FX_COLORREF crOld = crCurText; |
347 } | 347 FX_BOOL bSelect = FALSE; |
348 | 348 const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255); |
349 if (place.LineCmp(oldplace) != 0 || word
.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 || | 349 const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113); |
350 FXSYS_memcmp(&word.WordProps, &w
p, sizeof(CPVT_WordProps)) != 0 || | 350 |
351 crOld != crCurText) | 351 CFX_ByteTextBuf sTextBuf; |
352 { | 352 CPVT_WordProps wp; |
353 if (sTextBuf.GetLength() > 0) | 353 CPDF_Point ptBT(0.0f, 0.0f); |
354 {
| 354 |
355 DrawTextString(pDevice,
CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontI
ndex), | 355 pDevice->SaveState(); |
356 wp.fFontSize, pU
ser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale); | 356 |
357 | 357 if (!rcClip.IsEmpty()) { |
358 sTextBuf.Clear(); | 358 CPDF_Rect rcTemp = rcClip; |
359 } | 359 pUser2Device->TransformRect(rcTemp); |
360 wp = word.WordProps; | 360 FX_RECT rcDevClip; |
361 ptBT = word.ptWord; | 361 rcDevClip.left = (FX_INT32)rcTemp.left; |
362 crOld = crCurText; | 362 rcDevClip.right = (FX_INT32)rcTemp.right; |
363 } | 363 rcDevClip.top = (FX_INT32)rcTemp.top; |
364 | 364 rcDevClip.bottom = (FX_INT32)rcTemp.bottom; |
365 sTextBuf << GetPDFWordString(pFontMap, w
ord.WordProps.nFontIndex, word.Word, 0); | 365 pDevice->SetClip_Rect(&rcDevClip); |
366 | 366 } |
367 if (word.WordProps.nWordStyle & PVTWORD_
STYLE_UNDERLINE) | 367 |
368 { | 368 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { |
369 CFX_PathData pathUnderline; | 369 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { |
370 CPDF_Rect rcUnderline = GetUnder
LineRect(word); | 370 if (pRange) |
371 pathUnderline.AppendRect(rcUnder
line.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top); | 371 pIterator->SetAt(pRange->BeginPos); |
372 | 372 else |
373 pDevice->DrawPath(&pathUnderline
, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING); | 373 pIterator->SetAt(0); |
374 } | 374 |
375 | 375 CPVT_WordPlace oldplace; |
376 if (word.WordProps.nWordStyle & PVTWORD_
STYLE_CROSSOUT) | 376 |
377 { | 377 while (pIterator->NextWord()) { |
378 CFX_PathData pathCrossout; | 378 CPVT_WordPlace place = pIterator->GetAt(); |
379 CPDF_Rect rcCrossout = GetCrosso
utRect(word); | 379 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
380 pathCrossout.AppendRect(rcCrosso
ut.left, rcCrossout.bottom, rcCrossout.right, rcCrossout.top); | 380 break; |
381 | 381 |
382 pDevice->DrawPath(&pathCrossout,
pUser2Device, NULL, crCurText, 0, FXFILL_WINDING); | 382 CPVT_Word word; |
383 } | 383 if (pIterator->GetWord(word)) { |
384 | 384 word.WordProps.fFontSize = word.fFontSize; |
385 oldplace = place;
| 385 |
386 } | 386 crCurText = ArgbEncode(255, word.WordProps.dwWordColor); |
387 } | 387 |
388 | 388 if (wrSelect.IsExist()) { |
389 if (sTextBuf.GetLength() > 0) | 389 bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && |
390 { | 390 place.WordCmp(wrSelect.EndPos) <= 0; |
391 DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffs
et.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex), | 391 if (bSelect) { |
392 wp.fFontSize, pUser2Device, sTextBuf.Get
ByteString(), crOld, 0, wp.nHorzScale); | 392 crCurText = crWhite; |
393 } | 393 } |
394 } | 394 } |
395 } | 395 |
396 | 396 if (bSelect) { |
397 pDevice->RestoreState(); | 397 CPVT_Line line; |
398 } | 398 pIterator->GetLine(line); |
399 | 399 |
400 static void AddLineToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crStro
ke, | 400 CFX_PathData pathSelBK; |
401 const CPDF_Poin
t& pt1, const CPDF_Point& pt2) | 401 pathSelBK.AppendRect(word.ptWord.x + ptOffset.x, |
402 { | 402 line.ptLine.y + line.fLineDescent + ptOffset.y, |
403 CPDF_PathObject* pPathObj = new CPDF_PathObject; | 403 word.ptWord.x + word.fWidth + ptOffset.x, |
404 CPDF_PathData* pPathData = pPathObj->m_Path.GetModify(); | 404 line.ptLine.y + line.fLineAscent + ptOffset.y); |
405 | 405 |
406 pPathData->SetPointCount(2); | 406 pDevice->DrawPath( |
407 pPathData->SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); | 407 &pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING); |
408 pPathData->SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); | 408 } |
409 | 409 |
410 FX_FLOAT rgb[3]; | 410 if (place.LineCmp(oldplace) != 0 || |
411 rgb[0] = FXARGB_R(crStroke) / 255.0f; | 411 word.WordProps.fCharSpace > 0.0f || |
412 rgb[1] = FXARGB_G(crStroke) / 255.0f; | 412 word.WordProps.nHorzScale != 100 || |
413 rgb[2] = FXARGB_B(crStroke) / 255.0f; | 413 FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 || |
414 pPathObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_
DEVICERGB), rgb, 3); | 414 crOld != crCurText) { |
415 | 415 if (sTextBuf.GetLength() > 0) { |
416 CFX_GraphStateData* pData = pPathObj->m_GraphState.GetModify(); | 416 DrawTextString( |
417 pData->m_LineWidth = 1; | 417 pDevice, |
418 | 418 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
419 pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj); | 419 pFontMap->GetPDFFont(wp.nFontIndex), |
420 } | 420 wp.fFontSize, |
421 | 421 pUser2Device, |
422 static void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crFill
, const CPDF_Rect& rcFill) | 422 sTextBuf.GetByteString(), |
423 { | 423 crOld, |
424 CPDF_PathObject* pPathObj = new CPDF_PathObject; | 424 0, |
425 CPDF_PathData* pPathData = pPathObj->m_Path.GetModify(); | 425 wp.nHorzScale); |
426 pPathData->AppendRect(rcFill.left,rcFill.bottom,rcFill.right,rcFill.top)
; | 426 |
427 | 427 sTextBuf.Clear(); |
428 FX_FLOAT rgb[3]; | 428 } |
429 rgb[0] = FXARGB_R(crFill) / 255.0f ; | 429 wp = word.WordProps; |
430 rgb[1] = FXARGB_G(crFill) / 255.0f; | 430 ptBT = word.ptWord; |
431 rgb[2] = FXARGB_B(crFill) / 255.0f; | 431 crOld = crCurText; |
432 pPathObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DE
VICERGB), rgb, 3); | 432 } |
433 | 433 |
434 pPathObj->m_FillType = FXFILL_ALTERNATE; | 434 sTextBuf << GetPDFWordString( |
435 pPathObj->m_bStroke = FALSE; | 435 pFontMap, word.WordProps.nFontIndex, word.Word, 0); |
436 | 436 |
437 pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj); | 437 if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) { |
438 } | 438 CFX_PathData pathUnderline; |
439 | 439 CPDF_Rect rcUnderline = GetUnderLineRect(word); |
440 static CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, FX_
COLORREF crText, | 440 pathUnderline.AppendRect(rcUnderline.left, |
441 CPDF_Font* pFont, FX_FL
OAT fFontSize, FX_FLOAT fCharSpace, FX_INT32 nHorzScale, | 441 rcUnderline.bottom, |
442 const CPDF_Point& point
, const CFX_ByteString& text) | 442 rcUnderline.right, |
443 { | 443 rcUnderline.top); |
444 CPDF_TextObject* pTxtObj = new CPDF_TextObject; | 444 |
445 | 445 pDevice->DrawPath(&pathUnderline, |
446 CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify(); | 446 pUser2Device, |
447 pTextStateData->m_pFont = pFont; | 447 NULL, |
448 pTextStateData->m_FontSize = fFontSize; | 448 crCurText, |
449 pTextStateData->m_CharSpace = fCharSpace; | 449 0, |
450 pTextStateData->m_WordSpace = 0; | 450 FXFILL_WINDING); |
451 pTextStateData->m_TextMode = 0; | 451 } |
452 pTextStateData->m_Matrix[0] = nHorzScale / 100.0f; | 452 |
453 pTextStateData->m_Matrix[1] = 0; | 453 if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) { |
454 pTextStateData->m_Matrix[2] = 0; | 454 CFX_PathData pathCrossout; |
455 pTextStateData->m_Matrix[3] = 1; | 455 CPDF_Rect rcCrossout = GetCrossoutRect(word); |
456 | 456 pathCrossout.AppendRect(rcCrossout.left, |
457 FX_FLOAT rgb[3]; | 457 rcCrossout.bottom, |
458 rgb[0] = FXARGB_R(crText) / 255.0f ; | 458 rcCrossout.right, |
459 rgb[1] = FXARGB_G(crText) / 255.0f; | 459 rcCrossout.top); |
460 rgb[2] = FXARGB_B(crText) / 255.0f; | 460 |
461 pTxtObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEV
ICERGB),rgb, 3); | 461 pDevice->DrawPath(&pathCrossout, |
462 pTxtObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_D
EVICERGB),rgb, 3); | 462 pUser2Device, |
463 | 463 NULL, |
464 pTxtObj->SetPosition(point.x,point.y); | 464 crCurText, |
465 pTxtObj->SetText(text); | 465 0, |
466 | 466 FXFILL_WINDING); |
467 pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pTxtObj); | 467 } |
468 | 468 |
469 return pTxtObj; | 469 oldplace = place; |
470 } | 470 } |
471 | 471 } |
472 void IFX_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEd
it, | 472 |
473 const CPDF_Po
int& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTempla
te<CPDF_TextObject*>& ObjArray) | 473 if (sTextBuf.GetLength() > 0) { |
474 { | 474 DrawTextString(pDevice, |
475 FX_FLOAT fFontSize = pEdit->GetFontSize(); | 475 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
476 | 476 pFontMap->GetPDFFont(wp.nFontIndex), |
477 FX_INT32 nOldFontIndex = -1; | 477 wp.fFontSize, |
478 | 478 pUser2Device, |
479 CFX_ByteTextBuf sTextBuf; | 479 sTextBuf.GetByteString(), |
480 CPDF_Point ptBT(0.0f,0.0f); | 480 crOld, |
481 | 481 0, |
482 ObjArray.RemoveAll(); | 482 wp.nHorzScale); |
483 | 483 } |
484 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) | 484 } |
485 { | 485 } |
486 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) | 486 |
487 { | 487 pDevice->RestoreState(); |
488 if (pRange) | 488 } |
489 pIterator->SetAt(pRange->BeginPos); | 489 |
490 else | 490 static void AddLineToPageObjects(CPDF_PageObjects* pPageObjs, |
491 pIterator->SetAt(0); | 491 FX_COLORREF crStroke, |
492 | 492 const CPDF_Point& pt1, |
493 CPVT_WordPlace oldplace; | 493 const CPDF_Point& pt2) { |
494 | 494 CPDF_PathObject* pPathObj = new CPDF_PathObject; |
495 while (pIterator->NextWord()) | 495 CPDF_PathData* pPathData = pPathObj->m_Path.GetModify(); |
496 { | 496 |
497 CPVT_WordPlace place = pIterator->GetAt(); | 497 pPathData->SetPointCount(2); |
498 if (pRange && place.WordCmp(pRange->EndPos) > 0)
break; | 498 pPathData->SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); |
499 | 499 pPathData->SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); |
500 CPVT_Word word; | 500 |
501 if (pIterator->GetWord(word)) | 501 FX_FLOAT rgb[3]; |
502 { | 502 rgb[0] = FXARGB_R(crStroke) / 255.0f; |
503 if (place.LineCmp(oldplace) != 0 || nOld
FontIndex != word.nFontIndex) | 503 rgb[1] = FXARGB_G(crStroke) / 255.0f; |
504 { | 504 rgb[2] = FXARGB_B(crStroke) / 255.0f; |
505 if (sTextBuf.GetLength() > 0) | 505 pPathObj->m_ColorState.SetStrokeColor( |
506 { | 506 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); |
507 ObjArray.Add(AddTextObjT
oPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSiz
e, 0.0f, 100, | 507 |
508 CPDF_Point(ptBT.
x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString())); | 508 CFX_GraphStateData* pData = pPathObj->m_GraphState.GetModify(); |
509 | 509 pData->m_LineWidth = 1; |
510 sTextBuf.Clear(); | 510 |
511 } | 511 pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(), pPathObj); |
512 | 512 } |
513 ptBT = word.ptWord; | 513 |
514 nOldFontIndex = word.nFontIndex; | 514 static void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, |
515 } | 515 FX_COLORREF crFill, |
516 | 516 const CPDF_Rect& rcFill) { |
517 sTextBuf << GetPDFWordString(pFontMap, w
ord.nFontIndex, word.Word, 0); | 517 CPDF_PathObject* pPathObj = new CPDF_PathObject; |
518 oldplace = place;
| 518 CPDF_PathData* pPathData = pPathObj->m_Path.GetModify(); |
519 } | 519 pPathData->AppendRect(rcFill.left, rcFill.bottom, rcFill.right, rcFill.top); |
520 } | 520 |
521 | 521 FX_FLOAT rgb[3]; |
522 if (sTextBuf.GetLength() > 0) | 522 rgb[0] = FXARGB_R(crFill) / 255.0f; |
523 { | 523 rgb[1] = FXARGB_G(crFill) / 255.0f; |
524 ObjArray.Add(AddTextObjToPageObjects(pPageObject
s, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100, | 524 rgb[2] = FXARGB_B(crFill) / 255.0f; |
525 CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptO
ffset.y), sTextBuf.GetByteString())); | 525 pPathObj->m_ColorState.SetFillColor( |
526 } | 526 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); |
527 } | 527 |
528 } | 528 pPathObj->m_FillType = FXFILL_ALTERNATE; |
529 } | 529 pPathObj->m_bStroke = FALSE; |
530 | 530 |
531 void IFX_Edit::GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit*
pEdit, | 531 pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(), pPathObj); |
532 const CPDF_Po
int& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>
& ObjArray) | 532 } |
533 { | 533 |
534 | 534 static CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, |
535 | 535 FX_COLORREF crText, |
536 FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0); | 536 CPDF_Font* pFont, |
537 FX_COLORREF crOld = crCurText; | 537 FX_FLOAT fFontSize, |
538 | 538 FX_FLOAT fCharSpace, |
539 | 539 FX_INT32 nHorzScale, |
540 CFX_ByteTextBuf sTextBuf; | 540 const CPDF_Point& point, |
541 CPVT_WordProps wp; | 541 const CFX_ByteString& text) { |
542 CPDF_Point ptBT(0.0f,0.0f); | 542 CPDF_TextObject* pTxtObj = new CPDF_TextObject; |
543 | 543 |
544 ObjArray.RemoveAll(); | 544 CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify(); |
545 | 545 pTextStateData->m_pFont = pFont; |
546 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) | 546 pTextStateData->m_FontSize = fFontSize; |
547 { | 547 pTextStateData->m_CharSpace = fCharSpace; |
548 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) | 548 pTextStateData->m_WordSpace = 0; |
549 { | 549 pTextStateData->m_TextMode = 0; |
550 if (pRange) | 550 pTextStateData->m_Matrix[0] = nHorzScale / 100.0f; |
551 pIterator->SetAt(pRange->BeginPos); | 551 pTextStateData->m_Matrix[1] = 0; |
552 else | 552 pTextStateData->m_Matrix[2] = 0; |
553 pIterator->SetAt(0); | 553 pTextStateData->m_Matrix[3] = 1; |
554 | 554 |
555 CPVT_WordPlace oldplace; | 555 FX_FLOAT rgb[3]; |
556 | 556 rgb[0] = FXARGB_R(crText) / 255.0f; |
557 while (pIterator->NextWord()) | 557 rgb[1] = FXARGB_G(crText) / 255.0f; |
558 { | 558 rgb[2] = FXARGB_B(crText) / 255.0f; |
559 CPVT_WordPlace place = pIterator->GetAt(); | 559 pTxtObj->m_ColorState.SetFillColor( |
560 if (pRange && place.WordCmp(pRange->EndPos) > 0)
break; | 560 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); |
561 | 561 pTxtObj->m_ColorState.SetStrokeColor( |
562 CPVT_Word word; | 562 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3); |
563 if (pIterator->GetWord(word)) | 563 |
564 { | 564 pTxtObj->SetPosition(point.x, point.y); |
565 word.WordProps.fFontSize = word.fFontSiz
e; | 565 pTxtObj->SetText(text); |
566 | 566 |
567 crCurText = ArgbEncode(255,word.WordProp
s.dwWordColor); | 567 pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(), pTxtObj); |
568 | 568 |
569 if (place.LineCmp(oldplace) != 0 || word
.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 || | 569 return pTxtObj; |
570 FXSYS_memcmp(&word.WordProps, &w
p, sizeof(CPVT_WordProps)) != 0 || | 570 } |
571 crOld != crCurText) | 571 |
572 { | 572 void IFX_Edit::GeneratePageObjects( |
573 if (sTextBuf.GetLength() > 0) | 573 CPDF_PageObjects* pPageObjects, |
574 { | 574 IFX_Edit* pEdit, |
575 ObjArray.Add(AddTextObjT
oPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontS
ize, wp.fCharSpace, wp.nHorzScale, | 575 const CPDF_Point& ptOffset, |
576 CPDF_Point(ptBT.
x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString())); | 576 const CPVT_WordRange* pRange, |
577 | 577 FX_COLORREF crText, |
578 sTextBuf.Clear(); | 578 CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { |
579 } | 579 FX_FLOAT fFontSize = pEdit->GetFontSize(); |
580 | 580 |
581 wp = word.WordProps; | 581 FX_INT32 nOldFontIndex = -1; |
582 ptBT = word.ptWord; | 582 |
583 crOld = crCurText; | 583 CFX_ByteTextBuf sTextBuf; |
584 | 584 CPDF_Point ptBT(0.0f, 0.0f); |
585 } | 585 |
586 | 586 ObjArray.RemoveAll(); |
587 sTextBuf << GetPDFWordString(pFontMap, w
ord.WordProps.nFontIndex, word.Word, 0); | 587 |
588 | 588 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { |
589 if (word.WordProps.nWordStyle & PVTWORD_
STYLE_UNDERLINE) | 589 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { |
590 {/* | 590 if (pRange) |
591 AddLineToPageObjects(pPageObject
s, crCurText, | 591 pIterator->SetAt(pRange->BeginPos); |
592 CPDF_Point(word.ptWord.x
, word.ptWord.y + word.fDescent * 0.4f), | 592 else |
593 CPDF_Point(word.ptWord.x
+ word.fWidth, word.ptWord.y + word.fDescent * 0.4f));
| 593 pIterator->SetAt(0); |
| 594 |
| 595 CPVT_WordPlace oldplace; |
| 596 |
| 597 while (pIterator->NextWord()) { |
| 598 CPVT_WordPlace place = pIterator->GetAt(); |
| 599 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
| 600 break; |
| 601 |
| 602 CPVT_Word word; |
| 603 if (pIterator->GetWord(word)) { |
| 604 if (place.LineCmp(oldplace) != 0 || |
| 605 nOldFontIndex != word.nFontIndex) { |
| 606 if (sTextBuf.GetLength() > 0) { |
| 607 ObjArray.Add(AddTextObjToPageObjects( |
| 608 pPageObjects, |
| 609 crText, |
| 610 pFontMap->GetPDFFont(nOldFontIndex), |
| 611 fFontSize, |
| 612 0.0f, |
| 613 100, |
| 614 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
| 615 sTextBuf.GetByteString())); |
| 616 |
| 617 sTextBuf.Clear(); |
| 618 } |
| 619 |
| 620 ptBT = word.ptWord; |
| 621 nOldFontIndex = word.nFontIndex; |
| 622 } |
| 623 |
| 624 sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0); |
| 625 oldplace = place; |
| 626 } |
| 627 } |
| 628 |
| 629 if (sTextBuf.GetLength() > 0) { |
| 630 ObjArray.Add(AddTextObjToPageObjects( |
| 631 pPageObjects, |
| 632 crText, |
| 633 pFontMap->GetPDFFont(nOldFontIndex), |
| 634 fFontSize, |
| 635 0.0f, |
| 636 100, |
| 637 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
| 638 sTextBuf.GetByteString())); |
| 639 } |
| 640 } |
| 641 } |
| 642 } |
| 643 |
| 644 void IFX_Edit::GenerateRichPageObjects( |
| 645 CPDF_PageObjects* pPageObjects, |
| 646 IFX_Edit* pEdit, |
| 647 const CPDF_Point& ptOffset, |
| 648 const CPVT_WordRange* pRange, |
| 649 CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) { |
| 650 FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0); |
| 651 FX_COLORREF crOld = crCurText; |
| 652 |
| 653 CFX_ByteTextBuf sTextBuf; |
| 654 CPVT_WordProps wp; |
| 655 CPDF_Point ptBT(0.0f, 0.0f); |
| 656 |
| 657 ObjArray.RemoveAll(); |
| 658 |
| 659 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { |
| 660 if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) { |
| 661 if (pRange) |
| 662 pIterator->SetAt(pRange->BeginPos); |
| 663 else |
| 664 pIterator->SetAt(0); |
| 665 |
| 666 CPVT_WordPlace oldplace; |
| 667 |
| 668 while (pIterator->NextWord()) { |
| 669 CPVT_WordPlace place = pIterator->GetAt(); |
| 670 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
| 671 break; |
| 672 |
| 673 CPVT_Word word; |
| 674 if (pIterator->GetWord(word)) { |
| 675 word.WordProps.fFontSize = word.fFontSize; |
| 676 |
| 677 crCurText = ArgbEncode(255, word.WordProps.dwWordColor); |
| 678 |
| 679 if (place.LineCmp(oldplace) != 0 || |
| 680 word.WordProps.fCharSpace > 0.0f || |
| 681 word.WordProps.nHorzScale != 100 || |
| 682 FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 || |
| 683 crOld != crCurText) { |
| 684 if (sTextBuf.GetLength() > 0) { |
| 685 ObjArray.Add(AddTextObjToPageObjects( |
| 686 pPageObjects, |
| 687 crOld, |
| 688 pFontMap->GetPDFFont(wp.nFontIndex), |
| 689 wp.fFontSize, |
| 690 wp.fCharSpace, |
| 691 wp.nHorzScale, |
| 692 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
| 693 sTextBuf.GetByteString())); |
| 694 |
| 695 sTextBuf.Clear(); |
| 696 } |
| 697 |
| 698 wp = word.WordProps; |
| 699 ptBT = word.ptWord; |
| 700 crOld = crCurText; |
| 701 } |
| 702 |
| 703 sTextBuf << GetPDFWordString( |
| 704 pFontMap, word.WordProps.nFontIndex, word.Word, 0); |
| 705 |
| 706 if (word.WordProps.nWordStyle & |
| 707 PVTWORD_STYLE_UNDERLINE) { /* |
| 708 AddLineToPageObjects(pPageObject
s, |
| 709 crCurText, |
| 710 CPDF_Point(word.ptWord.x
, |
| 711 word.ptWord.y + word.fDescent * |
| 712 0.4f), |
| 713 CPDF_Point(word.ptWord.x |
| 714 + word.fWidth, word.ptWord.y + |
| 715 word.fDescent * 0.4f)); |
594 */ | 716 */ |
595 » » » » » » CPDF_Rect rcUnderline = GetUnder
LineRect(word); | 717 CPDF_Rect rcUnderline = GetUnderLineRect(word); |
596 » » » » » » rcUnderline.left += ptOffset.x; | 718 rcUnderline.left += ptOffset.x; |
597 » » » » » » rcUnderline.right += ptOffset.x; | 719 rcUnderline.right += ptOffset.x; |
598 » » » » » » rcUnderline.top += ptOffset.y; | 720 rcUnderline.top += ptOffset.y; |
599 » » » » » » rcUnderline.bottom += ptOffset.y
; | 721 rcUnderline.bottom += ptOffset.y; |
600 » » » » » » | 722 |
601 » » » » » » AddRectToPageObjects(pPageObject
s, crCurText, rcUnderline);» » » » » » » | 723 AddRectToPageObjects(pPageObjects, crCurText, rcUnderline); |
602 » » » » » } | 724 } |
603 | 725 |
604 » » » » » if (word.WordProps.nWordStyle & PVTWORD_
STYLE_CROSSOUT) | 726 if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) { |
605 » » » » » { | 727 CPDF_Rect rcCrossout = GetCrossoutRect(word); |
606 » » » » » » CPDF_Rect rcCrossout = GetCrosso
utRect(word); | 728 rcCrossout.left += ptOffset.x; |
607 » » » » » » rcCrossout.left += ptOffset.x; | 729 rcCrossout.right += ptOffset.x; |
608 » » » » » » rcCrossout.right += ptOffset.x; | 730 rcCrossout.top += ptOffset.y; |
609 » » » » » » rcCrossout.top += ptOffset.y; | 731 rcCrossout.bottom += ptOffset.y; |
610 » » » » » » rcCrossout.bottom += ptOffset.y; | 732 |
611 | 733 AddRectToPageObjects(pPageObjects, crCurText, rcCrossout); |
612 » » » » » » AddRectToPageObjects(pPageObject
s, crCurText, rcCrossout);» » » » » » | 734 } |
613 » » » » » } | 735 |
614 | 736 oldplace = place; |
615 » » » » » oldplace = place;» » »
» » | 737 } |
616 » » » » } | 738 } |
617 » » » } | 739 |
618 | 740 if (sTextBuf.GetLength() > 0) { |
619 » » » if (sTextBuf.GetLength() > 0) | 741 ObjArray.Add(AddTextObjToPageObjects( |
620 » » » {» » » » | 742 pPageObjects, |
621 » » » » ObjArray.Add(AddTextObjToPageObjects(pPageObject
s, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.n
HorzScale, | 743 crOld, |
622 » » » » » CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptO
ffset.y), sTextBuf.GetByteString())); | 744 pFontMap->GetPDFFont(wp.nFontIndex), |
623 » » » } | 745 wp.fFontSize, |
624 » » } | 746 wp.fCharSpace, |
625 » } | 747 wp.nHorzScale, |
626 } | 748 CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y), |
627 | 749 sTextBuf.GetByteString())); |
628 void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit
* pEdit, | 750 } |
629 » » » » » » » » const CPDF_Po
int& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color) | 751 } |
630 { | 752 } |
631 | 753 } |
632 | 754 |
633 » if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) | 755 void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, |
634 » { | 756 IFX_Edit* pEdit, |
635 » » if (pEdit->GetFontMap()) | 757 const CPDF_Point& ptOffset, |
636 » » { | 758 const CPVT_WordRange* pRange, |
637 » » » if (pRange) | 759 FX_COLORREF color) { |
638 » » » » pIterator->SetAt(pRange->BeginPos); | 760 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { |
639 » » » else | 761 if (pEdit->GetFontMap()) { |
640 » » » » pIterator->SetAt(0); | 762 if (pRange) |
641 | 763 pIterator->SetAt(pRange->BeginPos); |
642 » » » CPVT_WordPlace oldplace;» » » | 764 else |
643 | 765 pIterator->SetAt(0); |
644 » » » while (pIterator->NextWord()) | 766 |
645 » » » { | 767 CPVT_WordPlace oldplace; |
646 » » » » CPVT_WordPlace place = pIterator->GetAt(); | 768 |
647 » » » » if (pRange && place.WordCmp(pRange->EndPos) > 0)
break; | 769 while (pIterator->NextWord()) { |
648 » » » » | 770 CPVT_WordPlace place = pIterator->GetAt(); |
649 » » » » CPVT_Word word;»» » » | 771 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
650 » » » » if (pIterator->GetWord(word)) | 772 break; |
651 » » » » { | 773 |
652 » » » » » CPDF_Rect rcUnderline = GetUnderLineRect
(word); | 774 CPVT_Word word; |
653 » » » » » rcUnderline.left += ptOffset.x; | 775 if (pIterator->GetWord(word)) { |
654 » » » » » rcUnderline.right += ptOffset.x; | 776 CPDF_Rect rcUnderline = GetUnderLineRect(word); |
655 » » » » » rcUnderline.top += ptOffset.y; | 777 rcUnderline.left += ptOffset.x; |
656 » » » » » rcUnderline.bottom += ptOffset.y; | 778 rcUnderline.right += ptOffset.x; |
657 » » » » » AddRectToPageObjects(pPageObjects, color
, rcUnderline); | 779 rcUnderline.top += ptOffset.y; |
658 » » » » } | 780 rcUnderline.bottom += ptOffset.y; |
659 » » » } | 781 AddRectToPageObjects(pPageObjects, color, rcUnderline); |
660 » » } | 782 } |
661 » } | 783 } |
662 } | 784 } |
663 | 785 } |
| 786 } |
OLD | NEW |