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 "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 7 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
8 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" | 8 #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" |
9 #include "core/fpdfdoc/include/cpvt_word.h" | 9 #include "core/fpdfdoc/include/cpvt_word.h" |
10 #include "core/fpdfdoc/include/ipvt_fontmap.h" | 10 #include "core/fpdfdoc/include/ipvt_fontmap.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 IFX_Edit* pEdit, | 63 IFX_Edit* pEdit, |
64 const CFX_FloatPoint& ptOffset, | 64 const CFX_FloatPoint& ptOffset, |
65 const CPVT_WordRange* pRange /* = NULL*/, | 65 const CPVT_WordRange* pRange /* = NULL*/, |
66 FX_BOOL bContinuous /* = TRUE*/, | 66 FX_BOOL bContinuous /* = TRUE*/, |
67 uint16_t SubWord /* = 0*/) { | 67 uint16_t SubWord /* = 0*/) { |
68 CFX_ByteTextBuf sEditStream, sWords; | 68 CFX_ByteTextBuf sEditStream, sWords; |
69 | 69 |
70 CFX_FloatPoint ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f); | 70 CFX_FloatPoint ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f); |
71 int32_t nCurFontIndex = -1; | 71 int32_t nCurFontIndex = -1; |
72 | 72 |
73 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { | 73 IFX_Edit_Iterator* pIterator = pEdit->GetIterator(); |
74 if (pRange) | 74 if (pRange) |
75 pIterator->SetAt(pRange->BeginPos); | 75 pIterator->SetAt(pRange->BeginPos); |
76 else | 76 else |
77 pIterator->SetAt(0); | 77 pIterator->SetAt(0); |
78 | 78 |
79 CPVT_WordPlace oldplace; | 79 CPVT_WordPlace oldplace; |
80 | 80 |
81 while (pIterator->NextWord()) { | 81 while (pIterator->NextWord()) { |
82 CPVT_WordPlace place = pIterator->GetAt(); | 82 CPVT_WordPlace place = pIterator->GetAt(); |
83 | 83 |
84 if (pRange && place.WordCmp(pRange->EndPos) > 0) | 84 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
85 break; | 85 break; |
86 | 86 |
87 if (bContinuous) { | 87 if (bContinuous) { |
88 if (place.LineCmp(oldplace) != 0) { | 88 if (place.LineCmp(oldplace) != 0) { |
| 89 if (sWords.GetSize() > 0) { |
| 90 sEditStream << GetWordRenderString(sWords.AsStringC()); |
| 91 sWords.Clear(); |
| 92 } |
| 93 |
| 94 CPVT_Word word; |
| 95 if (pIterator->GetWord(word)) { |
| 96 ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x, |
| 97 word.ptWord.y + ptOffset.y); |
| 98 } else { |
| 99 CPVT_Line line; |
| 100 pIterator->GetLine(line); |
| 101 ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x, |
| 102 line.ptLine.y + ptOffset.y); |
| 103 } |
| 104 |
| 105 if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { |
| 106 sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y |
| 107 << " Td\n"; |
| 108 |
| 109 ptOld = ptNew; |
| 110 } |
| 111 } |
| 112 |
| 113 CPVT_Word word; |
| 114 if (pIterator->GetWord(word)) { |
| 115 if (word.nFontIndex != nCurFontIndex) { |
89 if (sWords.GetSize() > 0) { | 116 if (sWords.GetSize() > 0) { |
90 sEditStream << GetWordRenderString(sWords.AsStringC()); | 117 sEditStream << GetWordRenderString(sWords.AsStringC()); |
91 sWords.Clear(); | 118 sWords.Clear(); |
92 } | 119 } |
93 | 120 sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex, |
94 CPVT_Word word; | 121 word.fFontSize); |
95 if (pIterator->GetWord(word)) { | 122 nCurFontIndex = word.nFontIndex; |
96 ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x, | |
97 word.ptWord.y + ptOffset.y); | |
98 } else { | |
99 CPVT_Line line; | |
100 pIterator->GetLine(line); | |
101 ptNew = CFX_FloatPoint(line.ptLine.x + ptOffset.x, | |
102 line.ptLine.y + ptOffset.y); | |
103 } | |
104 | |
105 if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { | |
106 sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y | |
107 << " Td\n"; | |
108 | |
109 ptOld = ptNew; | |
110 } | |
111 } | 123 } |
112 | 124 |
113 CPVT_Word word; | 125 sWords << GetPDFWordString(pEdit->GetFontMap(), nCurFontIndex, |
114 if (pIterator->GetWord(word)) { | 126 word.Word, SubWord); |
115 if (word.nFontIndex != nCurFontIndex) { | 127 } |
116 if (sWords.GetSize() > 0) { | |
117 sEditStream << GetWordRenderString(sWords.AsStringC()); | |
118 sWords.Clear(); | |
119 } | |
120 sEditStream << GetFontSetString(pEdit->GetFontMap(), | |
121 word.nFontIndex, word.fFontSize); | |
122 nCurFontIndex = word.nFontIndex; | |
123 } | |
124 | 128 |
125 sWords << GetPDFWordString(pEdit->GetFontMap(), nCurFontIndex, | 129 oldplace = place; |
126 word.Word, SubWord); | 130 } else { |
| 131 CPVT_Word word; |
| 132 if (pIterator->GetWord(word)) { |
| 133 ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x, |
| 134 word.ptWord.y + ptOffset.y); |
| 135 |
| 136 if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { |
| 137 sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y |
| 138 << " Td\n"; |
| 139 ptOld = ptNew; |
127 } | 140 } |
128 | 141 |
129 oldplace = place; | 142 if (word.nFontIndex != nCurFontIndex) { |
130 } else { | 143 sEditStream << GetFontSetString(pEdit->GetFontMap(), word.nFontIndex, |
131 CPVT_Word word; | 144 word.fFontSize); |
132 if (pIterator->GetWord(word)) { | 145 nCurFontIndex = word.nFontIndex; |
133 ptNew = CFX_FloatPoint(word.ptWord.x + ptOffset.x, | 146 } |
134 word.ptWord.y + ptOffset.y); | |
135 | 147 |
136 if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { | 148 sEditStream << GetWordRenderString(GetPDFWordString( |
137 sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y | 149 pEdit->GetFontMap(), nCurFontIndex, word.Word, SubWord)); |
138 << " Td\n"; | |
139 ptOld = ptNew; | |
140 } | |
141 | |
142 if (word.nFontIndex != nCurFontIndex) { | |
143 sEditStream << GetFontSetString(pEdit->GetFontMap(), | |
144 word.nFontIndex, word.fFontSize); | |
145 nCurFontIndex = word.nFontIndex; | |
146 } | |
147 | |
148 sEditStream << GetWordRenderString(GetPDFWordString( | |
149 pEdit->GetFontMap(), nCurFontIndex, word.Word, SubWord)); | |
150 } | |
151 } | 150 } |
152 } | 151 } |
153 | |
154 if (sWords.GetSize() > 0) { | |
155 sEditStream << GetWordRenderString(sWords.AsStringC()); | |
156 sWords.Clear(); | |
157 } | |
158 } | 152 } |
159 | 153 |
| 154 if (sWords.GetSize() > 0) { |
| 155 sEditStream << GetWordRenderString(sWords.AsStringC()); |
| 156 sWords.Clear(); |
| 157 } |
| 158 |
160 CFX_ByteTextBuf sAppStream; | 159 CFX_ByteTextBuf sAppStream; |
161 if (sEditStream.GetSize() > 0) { | 160 if (sEditStream.GetSize() > 0) { |
162 int32_t nHorzScale = pEdit->GetHorzScale(); | 161 int32_t nHorzScale = pEdit->GetHorzScale(); |
163 if (nHorzScale != 100) { | 162 if (nHorzScale != 100) { |
164 sAppStream << nHorzScale << " Tz\n"; | 163 sAppStream << nHorzScale << " Tz\n"; |
165 } | 164 } |
166 | 165 |
167 FX_FLOAT fCharSpace = pEdit->GetCharSpace(); | 166 FX_FLOAT fCharSpace = pEdit->GetCharSpace(); |
168 if (!FX_EDIT_IsFloatZero(fCharSpace)) { | 167 if (!FX_EDIT_IsFloatZero(fCharSpace)) { |
169 sAppStream << fCharSpace << " Tc\n"; | 168 sAppStream << fCharSpace << " Tc\n"; |
170 } | 169 } |
171 | 170 |
172 sAppStream << sEditStream; | 171 sAppStream << sEditStream; |
173 } | 172 } |
174 | 173 |
175 return sAppStream.AsStringC(); | 174 return sAppStream.AsStringC(); |
176 } | 175 } |
177 | 176 |
178 CFX_ByteString IFX_Edit::GetSelectAppearanceStream( | 177 CFX_ByteString IFX_Edit::GetSelectAppearanceStream( |
179 IFX_Edit* pEdit, | 178 IFX_Edit* pEdit, |
180 const CFX_FloatPoint& ptOffset, | 179 const CFX_FloatPoint& ptOffset, |
181 const CPVT_WordRange* pRange) { | 180 const CPVT_WordRange* pRange) { |
182 CFX_ByteTextBuf sRet; | 181 CFX_ByteTextBuf sRet; |
183 | 182 |
184 if (pRange && pRange->IsExist()) { | 183 if (pRange && pRange->IsExist()) { |
185 if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) { | 184 IFX_Edit_Iterator* pIterator = pEdit->GetIterator(); |
186 pIterator->SetAt(pRange->BeginPos); | 185 pIterator->SetAt(pRange->BeginPos); |
187 | 186 |
188 while (pIterator->NextWord()) { | 187 while (pIterator->NextWord()) { |
189 CPVT_WordPlace place = pIterator->GetAt(); | 188 CPVT_WordPlace place = pIterator->GetAt(); |
190 | 189 |
191 if (pRange && place.WordCmp(pRange->EndPos) > 0) | 190 if (pRange && place.WordCmp(pRange->EndPos) > 0) |
192 break; | 191 break; |
193 | 192 |
194 CPVT_Word word; | 193 CPVT_Word word; |
195 CPVT_Line line; | 194 CPVT_Line line; |
196 if (pIterator->GetWord(word) && pIterator->GetLine(line)) { | 195 if (pIterator->GetWord(word) && pIterator->GetLine(line)) { |
197 sRet << word.ptWord.x + ptOffset.x << " " | 196 sRet << word.ptWord.x + ptOffset.x << " " |
198 << line.ptLine.y + line.fLineDescent << " " << word.fWidth << " " | 197 << line.ptLine.y + line.fLineDescent << " " << word.fWidth << " " |
199 << line.fLineAscent - line.fLineDescent << " re\nf\n"; | 198 << line.fLineAscent - line.fLineDescent << " re\nf\n"; |
200 } | |
201 } | 199 } |
202 } | 200 } |
203 } | 201 } |
204 | 202 |
205 return sRet.AsStringC(); | 203 return sRet.AsStringC(); |
206 } | 204 } |
OLD | NEW |