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

Side by Side Diff: fpdfsdk/fxedit/fxet_ap.cpp

Issue 1967963002: CPDF_VariableText::GetIterator() never returns NULL. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Fix more nits in CFX_Edit 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/include/cpdf_variabletext.h ('k') | fpdfsdk/fxedit/fxet_edit.cpp » ('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/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
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 }
OLDNEW
« no previous file with comments | « core/fpdfdoc/include/cpdf_variabletext.h ('k') | fpdfsdk/fxedit/fxet_edit.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698