Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(248)

Side by Side Diff: core/fpdfdoc/doc_vt.cpp

Issue 1919283008: Remove unneeded CPVT classes. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/fpdfdoc/doc_vt.h ('k') | core/fpdfdoc/include/cpdf_variabletext.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/fpdfdoc/doc_vt.h"
8
7 #include <algorithm> 9 #include <algorithm>
8 10
9 #include "core/fpdfdoc/cpvt_wordinfo.h" 11 #include "core/fpdfdoc/cpvt_wordinfo.h"
10 #include "core/fpdfdoc/csection.h" 12 #include "core/fpdfdoc/csection.h"
11 #include "core/fpdfdoc/include/cpdf_variabletext.h" 13 #include "core/fpdfdoc/include/cpdf_variabletext.h"
12 #include "core/fpdfdoc/include/fpdf_doc.h" 14 #include "core/fpdfdoc/include/fpdf_doc.h"
13 #include "core/fpdfdoc/pdf_vt.h"
14 15
15 CLine::CLine() {} 16 CLine::CLine() {}
17
16 CLine::~CLine() {} 18 CLine::~CLine() {}
19
17 CPVT_WordPlace CLine::GetBeginWordPlace() const { 20 CPVT_WordPlace CLine::GetBeginWordPlace() const {
18 return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1); 21 return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, -1);
19 } 22 }
20 CPVT_WordPlace CLine::GetEndWordPlace() const { 23 CPVT_WordPlace CLine::GetEndWordPlace() const {
21 return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex, 24 return CPVT_WordPlace(LinePlace.nSecIndex, LinePlace.nLineIndex,
22 m_LineInfo.nEndWordIndex); 25 m_LineInfo.nEndWordIndex);
23 } 26 }
24 CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace& place) const { 27 CPVT_WordPlace CLine::GetPrevWordPlace(const CPVT_WordPlace& place) const {
25 if (place.nWordIndex > m_LineInfo.nEndWordIndex) { 28 if (place.nWordIndex > m_LineInfo.nEndWordIndex) {
26 return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, 29 return CPVT_WordPlace(place.nSecIndex, place.nLineIndex,
(...skipping 27 matching lines...) Expand all
54 } 57 }
55 m_WordArray.RemoveAll(); 58 m_WordArray.RemoveAll();
56 } 59 }
57 void CSection::ResetLinePlace() { 60 void CSection::ResetLinePlace() {
58 for (int32_t i = 0, sz = m_LineArray.GetSize(); i < sz; i++) { 61 for (int32_t i = 0, sz = m_LineArray.GetSize(); i < sz; i++) {
59 if (CLine* pLine = m_LineArray.GetAt(i)) { 62 if (CLine* pLine = m_LineArray.GetAt(i)) {
60 pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1); 63 pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1);
61 } 64 }
62 } 65 }
63 } 66 }
67
64 CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace& place, 68 CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace& place,
65 const CPVT_WordInfo& wordinfo) { 69 const CPVT_WordInfo& wordinfo) {
66 CPVT_WordInfo* pWord = new CPVT_WordInfo(wordinfo); 70 CPVT_WordInfo* pWord = new CPVT_WordInfo(wordinfo);
67 int32_t nWordIndex = 71 int32_t nWordIndex =
68 std::max(std::min(place.nWordIndex, m_WordArray.GetSize()), 0); 72 std::max(std::min(place.nWordIndex, m_WordArray.GetSize()), 0);
69 if (nWordIndex == m_WordArray.GetSize()) { 73 if (nWordIndex == m_WordArray.GetSize())
70 m_WordArray.Add(pWord); 74 m_WordArray.Add(pWord);
71 } else { 75 else
72 m_WordArray.InsertAt(nWordIndex, pWord); 76 m_WordArray.InsertAt(nWordIndex, pWord);
77 return place;
78 }
79
80 CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo& lineinfo) {
81 return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1);
82 }
83
84 CPVT_FloatRect CSection::Rearrange() {
85 if (m_pVT->m_nCharArray > 0)
86 return CTypeset(this).CharArray();
87 return CTypeset(this).Typeset();
88 }
89
90 CFX_PointF CSection::GetSectionSize(FX_FLOAT fFontSize) {
91 return CTypeset(this).GetEditSize(fFontSize);
92 }
93
94 CPVT_WordPlace CSection::GetBeginWordPlace() const {
95 if (CLine* pLine = m_LineArray.GetAt(0))
96 return pLine->GetBeginWordPlace();
97 return SecPlace;
98 }
99
100 CPVT_WordPlace CSection::GetEndWordPlace() const {
101 if (CLine* pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1))
102 return pLine->GetEndWordPlace();
103 return SecPlace;
104 }
105
106 CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace& place) const {
107 if (place.nLineIndex < 0)
108 return GetBeginWordPlace();
109
110 if (place.nLineIndex >= m_LineArray.GetSize())
111 return GetEndWordPlace();
112
113 if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) {
114 if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex)
115 return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1);
116
117 if (place.nWordIndex >= pLine->m_LineInfo.nBeginWordIndex)
118 return pLine->GetPrevWordPlace(place);
119
120 if (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1))
121 return pPrevLine->GetEndWordPlace();
73 } 122 }
74 return place; 123 return place;
75 } 124 }
76 CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo& lineinfo) { 125
77 return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1); 126 CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace& place) const {
78 } 127 if (place.nLineIndex < 0)
79 CPVT_FloatRect CSection::Rearrange() {
80 if (m_pVT->m_nCharArray > 0) {
81 return CTypeset(this).CharArray();
82 }
83 return CTypeset(this).Typeset();
84 }
85 CPVT_Size CSection::GetSectionSize(FX_FLOAT fFontSize) {
86 return CTypeset(this).GetEditSize(fFontSize);
87 }
88 CPVT_WordPlace CSection::GetBeginWordPlace() const {
89 if (CLine* pLine = m_LineArray.GetAt(0)) {
90 return pLine->GetBeginWordPlace();
91 }
92 return SecPlace;
93 }
94 CPVT_WordPlace CSection::GetEndWordPlace() const {
95 if (CLine* pLine = m_LineArray.GetAt(m_LineArray.GetSize() - 1)) {
96 return pLine->GetEndWordPlace();
97 }
98 return SecPlace;
99 }
100 CPVT_WordPlace CSection::GetPrevWordPlace(const CPVT_WordPlace& place) const {
101 if (place.nLineIndex < 0) {
102 return GetBeginWordPlace(); 128 return GetBeginWordPlace();
103 } 129
104 if (place.nLineIndex >= m_LineArray.GetSize()) { 130 if (place.nLineIndex >= m_LineArray.GetSize())
105 return GetEndWordPlace(); 131 return GetEndWordPlace();
106 } 132
107 if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) { 133 if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) {
108 if (place.nWordIndex == pLine->m_LineInfo.nBeginWordIndex) { 134 if (place.nWordIndex < pLine->m_LineInfo.nEndWordIndex)
109 return CPVT_WordPlace(place.nSecIndex, place.nLineIndex, -1); 135 return pLine->GetNextWordPlace(place);
110 } 136
111 if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { 137 if (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1))
112 if (CLine* pPrevLine = m_LineArray.GetAt(place.nLineIndex - 1)) { 138 return pNextLine->GetBeginWordPlace();
113 return pPrevLine->GetEndWordPlace();
114 }
115 } else {
116 return pLine->GetPrevWordPlace(place);
117 }
118 } 139 }
119 return place; 140 return place;
120 } 141 }
121 CPVT_WordPlace CSection::GetNextWordPlace(const CPVT_WordPlace& place) const { 142
122 if (place.nLineIndex < 0) {
123 return GetBeginWordPlace();
124 }
125 if (place.nLineIndex >= m_LineArray.GetSize()) {
126 return GetEndWordPlace();
127 }
128 if (CLine* pLine = m_LineArray.GetAt(place.nLineIndex)) {
129 if (place.nWordIndex >= pLine->m_LineInfo.nEndWordIndex) {
130 if (CLine* pNextLine = m_LineArray.GetAt(place.nLineIndex + 1)) {
131 return pNextLine->GetBeginWordPlace();
132 }
133 } else {
134 return pLine->GetNextWordPlace(place);
135 }
136 }
137 return place;
138 }
139 void CSection::UpdateWordPlace(CPVT_WordPlace& place) const { 143 void CSection::UpdateWordPlace(CPVT_WordPlace& place) const {
140 int32_t nLeft = 0; 144 int32_t nLeft = 0;
141 int32_t nRight = m_LineArray.GetSize() - 1; 145 int32_t nRight = m_LineArray.GetSize() - 1;
142 int32_t nMid = (nLeft + nRight) / 2; 146 int32_t nMid = (nLeft + nRight) / 2;
143 while (nLeft <= nRight) { 147 while (nLeft <= nRight) {
144 if (CLine* pLine = m_LineArray.GetAt(nMid)) { 148 CLine* pLine = m_LineArray.GetAt(nMid);
145 if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) { 149 if (!pLine)
146 nRight = nMid - 1; 150 return;
147 nMid = (nLeft + nRight) / 2; 151
148 } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) { 152 if (place.nWordIndex < pLine->m_LineInfo.nBeginWordIndex) {
149 nLeft = nMid + 1; 153 nRight = nMid - 1;
150 nMid = (nLeft + nRight) / 2; 154 nMid = (nLeft + nRight) / 2;
151 } else { 155 } else if (place.nWordIndex > pLine->m_LineInfo.nEndWordIndex) {
152 place.nLineIndex = nMid; 156 nLeft = nMid + 1;
153 return; 157 nMid = (nLeft + nRight) / 2;
154 }
155 } else { 158 } else {
156 break; 159 place.nLineIndex = nMid;
160 return;
157 } 161 }
158 } 162 }
159 } 163 }
164
160 CPVT_WordPlace CSection::SearchWordPlace(const CFX_FloatPoint& point) const { 165 CPVT_WordPlace CSection::SearchWordPlace(const CFX_FloatPoint& point) const {
161 ASSERT(m_pVT); 166 ASSERT(m_pVT);
162 CPVT_WordPlace place = GetBeginWordPlace(); 167 CPVT_WordPlace place = GetBeginWordPlace();
163 FX_BOOL bUp = TRUE; 168 FX_BOOL bUp = TRUE;
164 FX_BOOL bDown = TRUE; 169 FX_BOOL bDown = TRUE;
165 int32_t nLeft = 0; 170 int32_t nLeft = 0;
166 int32_t nRight = m_LineArray.GetSize() - 1; 171 int32_t nRight = m_LineArray.GetSize() - 1;
167 int32_t nMid = m_LineArray.GetSize() / 2; 172 int32_t nMid = m_LineArray.GetSize() / 2;
168 FX_FLOAT fTop = 0; 173 FX_FLOAT fTop = 0;
169 FX_FLOAT fBottom = 0; 174 FX_FLOAT fBottom = 0;
170 while (nLeft <= nRight) { 175 while (nLeft <= nRight) {
171 if (CLine* pLine = m_LineArray.GetAt(nMid)) { 176 if (CLine* pLine = m_LineArray.GetAt(nMid)) {
172 fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent - 177 fTop = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineAscent -
173 m_pVT->GetLineLeading(m_SecInfo); 178 m_pVT->GetLineLeading(m_SecInfo);
174 fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent; 179 fBottom = pLine->m_LineInfo.fLineY - pLine->m_LineInfo.fLineDescent;
175 if (IsFloatBigger(point.y, fTop)) { 180 if (IsFloatBigger(point.y, fTop))
176 bUp = FALSE; 181 bUp = FALSE;
177 } 182
178 if (IsFloatSmaller(point.y, fBottom)) { 183 if (IsFloatSmaller(point.y, fBottom))
179 bDown = FALSE; 184 bDown = FALSE;
180 } 185
181 if (IsFloatSmaller(point.y, fTop)) { 186 if (IsFloatSmaller(point.y, fTop)) {
182 nRight = nMid - 1; 187 nRight = nMid - 1;
183 nMid = (nLeft + nRight) / 2; 188 nMid = (nLeft + nRight) / 2;
184 continue; 189 continue;
185 } else if (IsFloatBigger(point.y, fBottom)) { 190 }
191 if (IsFloatBigger(point.y, fBottom)) {
186 nLeft = nMid + 1; 192 nLeft = nMid + 1;
187 nMid = (nLeft + nRight) / 2; 193 nMid = (nLeft + nRight) / 2;
188 continue; 194 continue;
189 } else {
190 place = SearchWordPlace(
191 point.x,
192 CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
193 pLine->GetEndWordPlace()));
194 place.nLineIndex = nMid;
195 return place;
196 } 195 }
196
197 place = SearchWordPlace(
198 point.x,
199 CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
200 pLine->GetEndWordPlace()));
201 place.nLineIndex = nMid;
202 return place;
197 } 203 }
198 } 204 }
199 if (bUp) { 205 if (bUp)
200 place = GetBeginWordPlace(); 206 place = GetBeginWordPlace();
201 } 207 if (bDown)
202 if (bDown) {
203 place = GetEndWordPlace(); 208 place = GetEndWordPlace();
204 }
205 return place; 209 return place;
206 } 210 }
211
207 CPVT_WordPlace CSection::SearchWordPlace( 212 CPVT_WordPlace CSection::SearchWordPlace(
208 FX_FLOAT fx, 213 FX_FLOAT fx,
209 const CPVT_WordPlace& lineplace) const { 214 const CPVT_WordPlace& lineplace) const {
210 if (CLine* pLine = m_LineArray.GetAt(lineplace.nLineIndex)) { 215 CLine* pLine = m_LineArray.GetAt(lineplace.nLineIndex);
211 return SearchWordPlace( 216 if (!pLine)
212 fx - m_SecInfo.rcSection.left, 217 return GetBeginWordPlace();
213 CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()), 218 return SearchWordPlace(
214 pLine->GetEndWordPlace())); 219 fx - m_SecInfo.rcSection.left,
215 } 220 CPVT_WordRange(pLine->GetNextWordPlace(pLine->GetBeginWordPlace()),
216 return GetBeginWordPlace(); 221 pLine->GetEndWordPlace()));
217 } 222 }
223
218 CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx, 224 CPVT_WordPlace CSection::SearchWordPlace(FX_FLOAT fx,
219 const CPVT_WordRange& range) const { 225 const CPVT_WordRange& range) const {
220 CPVT_WordPlace wordplace = range.BeginPos; 226 CPVT_WordPlace wordplace = range.BeginPos;
221 wordplace.nWordIndex = -1; 227 wordplace.nWordIndex = -1;
222 if (!m_pVT) { 228 if (!m_pVT)
223 return wordplace; 229 return wordplace;
224 } 230
225 int32_t nLeft = range.BeginPos.nWordIndex; 231 int32_t nLeft = range.BeginPos.nWordIndex;
226 int32_t nRight = range.EndPos.nWordIndex + 1; 232 int32_t nRight = range.EndPos.nWordIndex + 1;
227 int32_t nMid = (nLeft + nRight) / 2; 233 int32_t nMid = (nLeft + nRight) / 2;
228 while (nLeft < nRight) { 234 while (nLeft < nRight) {
229 if (nMid == nLeft) { 235 if (nMid == nLeft)
230 break; 236 break;
231 } 237
232 if (nMid == nRight) { 238 if (nMid == nRight) {
233 nMid--; 239 nMid--;
234 break; 240 break;
235 } 241 }
236 if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) { 242
237 if (fx > 243 CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid);
238 pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) { 244 if (!pWord)
239 nLeft = nMid;
240 nMid = (nLeft + nRight) / 2;
241 continue;
242 } else {
243 nRight = nMid;
244 nMid = (nLeft + nRight) / 2;
245 continue;
246 }
247 } else {
248 break; 245 break;
249 } 246
247 if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF)
248 nLeft = nMid;
249 else
250 nRight = nMid;
251 nMid = (nLeft + nRight) / 2;
250 } 252 }
251 if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) { 253 if (CPVT_WordInfo* pWord = m_WordArray.GetAt(nMid)) {
252 if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) { 254 if (fx > pWord->fWordX + m_pVT->GetWordWidth(*pWord) * VARIABLETEXT_HALF) {
253 wordplace.nWordIndex = nMid; 255 wordplace.nWordIndex = nMid;
254 } 256 }
255 } 257 }
256 return wordplace; 258 return wordplace;
257 } 259 }
260
258 void CSection::ClearLeftWords(int32_t nWordIndex) { 261 void CSection::ClearLeftWords(int32_t nWordIndex) {
259 for (int32_t i = nWordIndex; i >= 0; i--) { 262 for (int32_t i = nWordIndex; i >= 0; i--) {
260 delete m_WordArray.GetAt(i); 263 delete m_WordArray.GetAt(i);
261 m_WordArray.RemoveAt(i); 264 m_WordArray.RemoveAt(i);
262 } 265 }
263 } 266 }
267
264 void CSection::ClearRightWords(int32_t nWordIndex) { 268 void CSection::ClearRightWords(int32_t nWordIndex) {
265 for (int32_t i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) { 269 for (int32_t i = m_WordArray.GetSize() - 1; i > nWordIndex; i--) {
266 delete m_WordArray.GetAt(i); 270 delete m_WordArray.GetAt(i);
267 m_WordArray.RemoveAt(i); 271 m_WordArray.RemoveAt(i);
268 } 272 }
269 } 273 }
274
270 void CSection::ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex) { 275 void CSection::ClearMidWords(int32_t nBeginIndex, int32_t nEndIndex) {
271 for (int32_t i = nEndIndex; i > nBeginIndex; i--) { 276 for (int32_t i = nEndIndex; i > nBeginIndex; i--) {
272 delete m_WordArray.GetAt(i); 277 delete m_WordArray.GetAt(i);
273 m_WordArray.RemoveAt(i); 278 m_WordArray.RemoveAt(i);
274 } 279 }
275 } 280 }
281
276 void CSection::ClearWords(const CPVT_WordRange& PlaceRange) { 282 void CSection::ClearWords(const CPVT_WordRange& PlaceRange) {
277 CPVT_WordPlace SecBeginPos = GetBeginWordPlace(); 283 CPVT_WordPlace SecBeginPos = GetBeginWordPlace();
278 CPVT_WordPlace SecEndPos = GetEndWordPlace(); 284 CPVT_WordPlace SecEndPos = GetEndWordPlace();
279 if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) { 285 if (PlaceRange.BeginPos.WordCmp(SecBeginPos) >= 0) {
280 if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { 286 if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
281 ClearMidWords(PlaceRange.BeginPos.nWordIndex, 287 ClearMidWords(PlaceRange.BeginPos.nWordIndex,
282 PlaceRange.EndPos.nWordIndex); 288 PlaceRange.EndPos.nWordIndex);
283 } else { 289 } else {
284 ClearRightWords(PlaceRange.BeginPos.nWordIndex); 290 ClearRightWords(PlaceRange.BeginPos.nWordIndex);
285 } 291 }
286 } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) { 292 } else if (PlaceRange.EndPos.WordCmp(SecEndPos) <= 0) {
287 ClearLeftWords(PlaceRange.EndPos.nWordIndex); 293 ClearLeftWords(PlaceRange.EndPos.nWordIndex);
288 } else { 294 } else {
289 ResetWordArray(); 295 ResetWordArray();
290 } 296 }
291 } 297 }
298
292 void CSection::ClearWord(const CPVT_WordPlace& place) { 299 void CSection::ClearWord(const CPVT_WordPlace& place) {
293 delete m_WordArray.GetAt(place.nWordIndex); 300 delete m_WordArray.GetAt(place.nWordIndex);
294 m_WordArray.RemoveAt(place.nWordIndex); 301 m_WordArray.RemoveAt(place.nWordIndex);
295 } 302 }
303
296 CTypeset::CTypeset(CSection* pSection) 304 CTypeset::CTypeset(CSection* pSection)
297 : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f), 305 : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f),
298 m_pVT(pSection->m_pVT), 306 m_pVT(pSection->m_pVT),
299 m_pSection(pSection) {} 307 m_pSection(pSection) {}
308
300 CTypeset::~CTypeset() {} 309 CTypeset::~CTypeset() {}
310
301 CPVT_FloatRect CTypeset::CharArray() { 311 CPVT_FloatRect CTypeset::CharArray() {
302 ASSERT(m_pSection); 312 ASSERT(m_pSection);
303 FX_FLOAT fLineAscent = 313 FX_FLOAT fLineAscent =
304 m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize()); 314 m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
305 FX_FLOAT fLineDescent = 315 FX_FLOAT fLineDescent =
306 m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize()); 316 m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
307 m_rcRet.Default(); 317 m_rcRet.Default();
308 FX_FLOAT x = 0.0f, y = 0.0f; 318 FX_FLOAT x = 0.0f, y = 0.0f;
309 FX_FLOAT fNextWidth; 319 FX_FLOAT fNextWidth;
310 int32_t nStart = 0; 320 int32_t nStart = 0;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 pLine->m_LineInfo.nBeginWordIndex = 0; 379 pLine->m_LineInfo.nBeginWordIndex = 0;
370 pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1; 380 pLine->m_LineInfo.nEndWordIndex = m_pSection->m_WordArray.GetSize() - 1;
371 pLine->m_LineInfo.fLineY = y; 381 pLine->m_LineInfo.fLineY = y;
372 pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX; 382 pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX;
373 pLine->m_LineInfo.fLineAscent = fLineAscent; 383 pLine->m_LineInfo.fLineAscent = fLineAscent;
374 pLine->m_LineInfo.fLineDescent = fLineDescent; 384 pLine->m_LineInfo.fLineDescent = fLineDescent;
375 y -= fLineDescent; 385 y -= fLineDescent;
376 } 386 }
377 return m_rcRet = CPVT_FloatRect(0, 0, x, y); 387 return m_rcRet = CPVT_FloatRect(0, 0, x, y);
378 } 388 }
379 CPVT_Size CTypeset::GetEditSize(FX_FLOAT fFontSize) { 389
390 CFX_PointF CTypeset::GetEditSize(FX_FLOAT fFontSize) {
380 ASSERT(m_pSection); 391 ASSERT(m_pSection);
381 ASSERT(m_pVT); 392 ASSERT(m_pVT);
382 SplitLines(FALSE, fFontSize); 393 SplitLines(FALSE, fFontSize);
383 return CPVT_Size(m_rcRet.Width(), m_rcRet.Height()); 394 return CFX_PointF(m_rcRet.Width(), m_rcRet.Height());
384 } 395 }
396
385 CPVT_FloatRect CTypeset::Typeset() { 397 CPVT_FloatRect CTypeset::Typeset() {
386 ASSERT(m_pVT); 398 ASSERT(m_pVT);
387 m_pSection->m_LineArray.Empty(); 399 m_pSection->m_LineArray.Empty();
388 SplitLines(TRUE, 0.0f); 400 SplitLines(TRUE, 0.0f);
389 m_pSection->m_LineArray.Clear(); 401 m_pSection->m_LineArray.Clear();
390 OutputLines(); 402 OutputLines();
391 return m_rcRet; 403 return m_rcRet;
392 } 404 }
393 405
394 static const uint8_t special_chars[128] = { 406 static const uint8_t special_chars[128] = {
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 line.fLineWidth = 0; 698 line.fLineWidth = 0;
687 line.fLineAscent = fLineAscent; 699 line.fLineAscent = fLineAscent;
688 line.fLineDescent = fLineDescent; 700 line.fLineDescent = fLineDescent;
689 m_pSection->AddLine(line); 701 m_pSection->AddLine(line);
690 } 702 }
691 fMaxY += m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent - 703 fMaxY += m_pVT->GetLineLeading(m_pSection->m_SecInfo) + fLineAscent -
692 fLineDescent; 704 fLineDescent;
693 } 705 }
694 m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY); 706 m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
695 } 707 }
708
696 void CTypeset::OutputLines() { 709 void CTypeset::OutputLines() {
697 ASSERT(m_pVT);
698 ASSERT(m_pSection);
699 FX_FLOAT fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
700 FX_FLOAT fPosX = 0.0f, fPosY = 0.0f;
701 FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo); 710 FX_FLOAT fLineIndent = m_pVT->GetLineIndent(m_pSection->m_SecInfo);
702 FX_FLOAT fTypesetWidth = std::max(m_pVT->GetPlateWidth() - fLineIndent, 0.0f); 711 FX_FLOAT fTypesetWidth = std::max(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
712 FX_FLOAT fMinX = GetXPosForAlignment(fTypesetWidth, m_rcRet.Width());
713 FX_FLOAT fMinY = 0.0f;
714 FX_FLOAT fMaxX = fMinX + m_rcRet.Width();
715 FX_FLOAT fMaxY = m_rcRet.Height();
716
717 int32_t nTotalLines = m_pSection->m_LineArray.GetSize();
718 if (nTotalLines <= 0) {
719 m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
720 return;
721 }
722
723 FX_FLOAT fPosX = 0.0f;
724 FX_FLOAT fPosY = 0.0f;
725 m_pSection->m_SecInfo.nTotalLine = nTotalLines;
726 for (int32_t l = 0; l < nTotalLines; l++) {
727 CLine* pLine = m_pSection->m_LineArray.GetAt(l);
728 if (!pLine)
729 continue;
730
731 fPosX = GetXPosForAlignment(fTypesetWidth, pLine->m_LineInfo.fLineWidth);
732 switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
733 default:
734 case 0:
735 fPosX = 0;
736 break;
737 case 1:
738 fPosX =
739 (fTypesetWidth - pLine->m_LineInfo.fLineWidth) * VARIABLETEXT_HALF;
740 break;
741 case 2:
742 fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
743 break;
744 }
745 fPosX += fLineIndent;
746 fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
747 fPosY += pLine->m_LineInfo.fLineAscent;
748 pLine->m_LineInfo.fLineX = fPosX - fMinX;
749 pLine->m_LineInfo.fLineY = fPosY - fMinY;
750 for (int32_t w = pLine->m_LineInfo.nBeginWordIndex;
751 w <= pLine->m_LineInfo.nEndWordIndex; w++) {
752 if (w < 0 || w >= m_pSection->m_WordArray.GetSize())
753 continue;
754
755 CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(w);
756 if (!pWord)
757 continue;
758
759 pWord->fWordX = fPosX - fMinX;
760 if (pWord->pWordProps) {
761 switch (pWord->pWordProps->nScriptType) {
762 default:
763 case CPDF_VariableText::ScriptType::Normal:
764 pWord->fWordY = fPosY - fMinY;
765 break;
766 case CPDF_VariableText::ScriptType::Super:
767 pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
768 break;
769 case CPDF_VariableText::ScriptType::Sub:
770 pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
771 break;
772 }
773 } else {
774 pWord->fWordY = fPosY - fMinY;
775 }
776 fPosX += m_pVT->GetWordWidth(*pWord);
777 }
778 fPosY -= pLine->m_LineInfo.fLineDescent;
779 }
780 m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
781 }
782
783 FX_FLOAT CTypeset::GetXPosForAlignment(FX_FLOAT fTypesetWidth,
784 FX_FLOAT fLineWidth) const {
703 switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) { 785 switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
704 default: 786 default:
705 case 0: 787 case 0:
706 fMinX = 0.0f; 788 return 0;
707 break;
708 case 1: 789 case 1:
709 fMinX = (fTypesetWidth - m_rcRet.Width()) * VARIABLETEXT_HALF; 790 return (fTypesetWidth - fLineWidth) * VARIABLETEXT_HALF;
710 break;
711 case 2: 791 case 2:
712 fMinX = fTypesetWidth - m_rcRet.Width(); 792 return fTypesetWidth - fLineWidth;
713 break;
714 } 793 }
715 fMaxX = fMinX + m_rcRet.Width();
716 fMinY = 0.0f;
717 fMaxY = m_rcRet.Height();
718 int32_t nTotalLines = m_pSection->m_LineArray.GetSize();
719 if (nTotalLines > 0) {
720 m_pSection->m_SecInfo.nTotalLine = nTotalLines;
721 for (int32_t l = 0; l < nTotalLines; l++) {
722 if (CLine* pLine = m_pSection->m_LineArray.GetAt(l)) {
723 switch (m_pVT->GetAlignment(m_pSection->m_SecInfo)) {
724 default:
725 case 0:
726 fPosX = 0;
727 break;
728 case 1:
729 fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) *
730 VARIABLETEXT_HALF;
731 break;
732 case 2:
733 fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
734 break;
735 }
736 fPosX += fLineIndent;
737 fPosY += m_pVT->GetLineLeading(m_pSection->m_SecInfo);
738 fPosY += pLine->m_LineInfo.fLineAscent;
739 pLine->m_LineInfo.fLineX = fPosX - fMinX;
740 pLine->m_LineInfo.fLineY = fPosY - fMinY;
741 for (int32_t w = pLine->m_LineInfo.nBeginWordIndex;
742 w <= pLine->m_LineInfo.nEndWordIndex; w++) {
743 if (CPVT_WordInfo* pWord = m_pSection->m_WordArray.GetAt(w)) {
744 pWord->fWordX = fPosX - fMinX;
745 if (pWord->pWordProps) {
746 switch (pWord->pWordProps->nScriptType) {
747 default:
748 case CPDF_VariableText::ScriptType::Normal:
749 pWord->fWordY = fPosY - fMinY;
750 break;
751 case CPDF_VariableText::ScriptType::Super:
752 pWord->fWordY = fPosY - m_pVT->GetWordAscent(*pWord) - fMinY;
753 break;
754 case CPDF_VariableText::ScriptType::Sub:
755 pWord->fWordY = fPosY - m_pVT->GetWordDescent(*pWord) - fMinY;
756 break;
757 }
758 } else {
759 pWord->fWordY = fPosY - fMinY;
760 }
761 fPosX += m_pVT->GetWordWidth(*pWord);
762 }
763 }
764 fPosY -= pLine->m_LineInfo.fLineDescent;
765 }
766 }
767 }
768 m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
769 } 794 }
795
796 CPDF_EditContainer::CPDF_EditContainer()
797 : m_rcPlate(0, 0, 0, 0), m_rcContent(0, 0, 0, 0) {}
798
799 CPDF_EditContainer::~CPDF_EditContainer() {}
800
801 CFX_FloatRect CPDF_EditContainer::InToOut(const CPVT_FloatRect& rect) const {
802 CFX_FloatPoint ptLeftTop = InToOut(CFX_FloatPoint(rect.left, rect.top));
803 CFX_FloatPoint ptRightBottom =
804 InToOut(CFX_FloatPoint(rect.right, rect.bottom));
805 return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x,
806 ptLeftTop.y);
807 }
OLDNEW
« no previous file with comments | « core/fpdfdoc/doc_vt.h ('k') | core/fpdfdoc/include/cpdf_variabletext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698