OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium 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 #include "pdf/pdfium/pdfium_engine.h" | 5 #include "pdf/pdfium/pdfium_engine.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 2154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2165 } | 2165 } |
2166 | 2166 |
2167 FPDFText_FindClose(find); | 2167 FPDFText_FindClose(find); |
2168 } | 2168 } |
2169 | 2169 |
2170 void PDFiumEngine::SearchUsingICU(const base::string16& term, | 2170 void PDFiumEngine::SearchUsingICU(const base::string16& term, |
2171 bool case_sensitive, | 2171 bool case_sensitive, |
2172 bool first_search, | 2172 bool first_search, |
2173 int character_to_start_searching_from, | 2173 int character_to_start_searching_from, |
2174 int current_page) { | 2174 int current_page) { |
2175 base::string16 page_text; | 2175 DCHECK(!term.empty()); |
2176 int text_length = pages_[current_page]->GetCharCount(); | 2176 |
| 2177 const int original_text_length = pages_[current_page]->GetCharCount(); |
| 2178 int text_length = original_text_length; |
2177 if (character_to_start_searching_from) { | 2179 if (character_to_start_searching_from) { |
2178 text_length -= character_to_start_searching_from; | 2180 text_length -= character_to_start_searching_from; |
2179 } else if (!first_search && | 2181 } else if (!first_search && |
2180 last_character_index_to_search_ != -1 && | 2182 last_character_index_to_search_ != -1 && |
2181 current_page == last_page_to_search_) { | 2183 current_page == last_page_to_search_) { |
2182 text_length = last_character_index_to_search_; | 2184 text_length = last_character_index_to_search_; |
2183 } | 2185 } |
2184 if (text_length <= 0) | 2186 if (text_length <= 0) |
2185 return; | 2187 return; |
2186 | 2188 |
| 2189 base::string16 page_text; |
2187 PDFiumAPIStringBufferAdapter<base::string16> api_string_adapter(&page_text, | 2190 PDFiumAPIStringBufferAdapter<base::string16> api_string_adapter(&page_text, |
2188 text_length, | 2191 text_length, |
2189 false); | 2192 false); |
2190 unsigned short* data = | 2193 unsigned short* data = |
2191 reinterpret_cast<unsigned short*>(api_string_adapter.GetData()); | 2194 reinterpret_cast<unsigned short*>(api_string_adapter.GetData()); |
2192 int written = FPDFText_GetText(pages_[current_page]->GetTextPage(), | 2195 int written = FPDFText_GetText(pages_[current_page]->GetTextPage(), |
2193 character_to_start_searching_from, | 2196 character_to_start_searching_from, |
2194 text_length, | 2197 text_length, |
2195 data); | 2198 data); |
2196 api_string_adapter.Close(written); | 2199 api_string_adapter.Close(written); |
2197 | 2200 |
2198 std::vector<PDFEngine::Client::SearchStringResult> results; | 2201 std::vector<PDFEngine::Client::SearchStringResult> results; |
2199 client_->SearchString( | 2202 client_->SearchString( |
2200 page_text.c_str(), term.c_str(), case_sensitive, &results); | 2203 page_text.c_str(), term.c_str(), case_sensitive, &results); |
2201 for (const auto& result : results) { | 2204 for (const auto& result : results) { |
2202 // Need to map the indexes from the page text, which may have generated | 2205 // Need to map the indexes from the page text, which may have generated |
2203 // characters like space etc, to character indices from the page. | 2206 // characters like space etc, to character indices from the page. |
2204 int temp_start = result.start_index + character_to_start_searching_from; | 2207 int temp_start = result.start_index + character_to_start_searching_from; |
2205 int start = FPDFText_GetCharIndexFromTextIndex( | 2208 int start = FPDFText_GetCharIndexFromTextIndex( |
2206 pages_[current_page]->GetTextPage(), temp_start); | 2209 pages_[current_page]->GetTextPage(), temp_start); |
2207 int end = FPDFText_GetCharIndexFromTextIndex( | 2210 int end = FPDFText_GetCharIndexFromTextIndex( |
2208 pages_[current_page]->GetTextPage(), | 2211 pages_[current_page]->GetTextPage(), |
2209 temp_start + result.length); | 2212 temp_start + result.length); |
| 2213 |
| 2214 // If |term| occurs at the end of a page, then |end| will be -1 due to the |
| 2215 // index being out of bounds. Compensate for this case so the range |
| 2216 // character count calculation below works out. |
| 2217 if (temp_start + result.length == original_text_length) { |
| 2218 DCHECK_EQ(-1, end); |
| 2219 end = original_text_length; |
| 2220 } |
| 2221 DCHECK_LT(start, end); |
| 2222 DCHECK_EQ(term.size(), static_cast<size_t>(end - start)); |
2210 AddFindResult(PDFiumRange(pages_[current_page].get(), start, end - start)); | 2223 AddFindResult(PDFiumRange(pages_[current_page].get(), start, end - start)); |
2211 } | 2224 } |
2212 } | 2225 } |
2213 | 2226 |
2214 void PDFiumEngine::AddFindResult(const PDFiumRange& result) { | 2227 void PDFiumEngine::AddFindResult(const PDFiumRange& result) { |
2215 // Figure out where to insert the new location, since we could have | 2228 // Figure out where to insert the new location, since we could have |
2216 // started searching midway and now we wrapped. | 2229 // started searching midway and now we wrapped. |
2217 size_t result_index; | 2230 size_t result_index; |
2218 int page_index = result.page_index(); | 2231 int page_index = result.page_index(); |
2219 int char_index = result.char_index(); | 2232 int char_index = result.char_index(); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2267 | 2280 |
2268 // Update the selection before telling the client to scroll, since it could | 2281 // Update the selection before telling the client to scroll, since it could |
2269 // paint then. | 2282 // paint then. |
2270 selection_.clear(); | 2283 selection_.clear(); |
2271 selection_.push_back(find_results_[current_find_index_.GetIndex()]); | 2284 selection_.push_back(find_results_[current_find_index_.GetIndex()]); |
2272 | 2285 |
2273 // If the result is not in view, scroll to it. | 2286 // If the result is not in view, scroll to it. |
2274 pp::Rect bounding_rect; | 2287 pp::Rect bounding_rect; |
2275 pp::Rect visible_rect = GetVisibleRect(); | 2288 pp::Rect visible_rect = GetVisibleRect(); |
2276 // Use zoom of 1.0 since visible_rect is without zoom. | 2289 // Use zoom of 1.0 since visible_rect is without zoom. |
2277 std::vector<pp::Rect> rects; | 2290 std::vector<pp::Rect> rects = |
2278 rects = find_results_[current_find_index_.GetIndex()].GetScreenRects( | 2291 find_results_[current_find_index_.GetIndex()].GetScreenRects( |
2279 pp::Point(), 1.0, current_rotation_); | 2292 pp::Point(), 1.0, current_rotation_); |
2280 for (const auto& rect : rects) | 2293 for (const auto& rect : rects) |
2281 bounding_rect = bounding_rect.Union(rect); | 2294 bounding_rect = bounding_rect.Union(rect); |
2282 if (!visible_rect.Contains(bounding_rect)) { | 2295 if (!visible_rect.Contains(bounding_rect)) { |
2283 pp::Point center = bounding_rect.CenterPoint(); | 2296 pp::Point center = bounding_rect.CenterPoint(); |
2284 // Make the page centered. | 2297 // Make the page centered. |
2285 int new_y = static_cast<int>(center.y() * current_zoom_) - | 2298 int new_y = static_cast<int>(center.y() * current_zoom_) - |
2286 static_cast<int>(visible_rect.height() * current_zoom_ / 2); | 2299 static_cast<int>(visible_rect.height() * current_zoom_ / 2); |
2287 if (new_y < 0) | 2300 if (new_y < 0) |
2288 new_y = 0; | 2301 new_y = 0; |
2289 client_->ScrollToY(new_y); | 2302 client_->ScrollToY(new_y); |
(...skipping 1892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4182 FPDF_DOCUMENT doc = | 4195 FPDF_DOCUMENT doc = |
4183 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | 4196 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); |
4184 if (!doc) | 4197 if (!doc) |
4185 return false; | 4198 return false; |
4186 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 4199 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
4187 FPDF_CloseDocument(doc); | 4200 FPDF_CloseDocument(doc); |
4188 return success; | 4201 return success; |
4189 } | 4202 } |
4190 | 4203 |
4191 } // namespace chrome_pdf | 4204 } // namespace chrome_pdf |
OLD | NEW |