| 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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 // adding too much latency to the display of the final image when the user | 103 // adding too much latency to the display of the final image when the user |
| 104 // stops scrolling. | 104 // stops scrolling. |
| 105 // Setting a higher value has minimal benefit (scrolling at less than 4 fps will | 105 // Setting a higher value has minimal benefit (scrolling at less than 4 fps will |
| 106 // never be a great experience) and there is some cost, since when the user | 106 // never be a great experience) and there is some cost, since when the user |
| 107 // stops scrolling the in-progress painting has to complete or timeout before | 107 // stops scrolling the in-progress painting has to complete or timeout before |
| 108 // the final painting can start. | 108 // the final painting can start. |
| 109 // The scrollbar will always be responsive since it is managed by a separate | 109 // The scrollbar will always be responsive since it is managed by a separate |
| 110 // process. | 110 // process. |
| 111 const int32_t kMaxInitialProgressivePaintTimeMs = 250; | 111 const int32_t kMaxInitialProgressivePaintTimeMs = 250; |
| 112 | 112 |
| 113 PDFiumEngine* g_engine_for_fontmapper = nullptr; |
| 114 |
| 113 std::vector<uint32_t> GetPageNumbersFromPrintPageNumberRange( | 115 std::vector<uint32_t> GetPageNumbersFromPrintPageNumberRange( |
| 114 const PP_PrintPageNumberRange_Dev* page_ranges, | 116 const PP_PrintPageNumberRange_Dev* page_ranges, |
| 115 uint32_t page_range_count) { | 117 uint32_t page_range_count) { |
| 116 std::vector<uint32_t> page_numbers; | 118 std::vector<uint32_t> page_numbers; |
| 117 for (uint32_t index = 0; index < page_range_count; ++index) { | 119 for (uint32_t index = 0; index < page_range_count; ++index) { |
| 118 for (uint32_t page_number = page_ranges[index].first_page_number; | 120 for (uint32_t page_number = page_ranges[index].first_page_number; |
| 119 page_number <= page_ranges[index].last_page_number; ++page_number) { | 121 page_number <= page_ranges[index].last_page_number; ++page_number) { |
| 120 page_numbers.push_back(page_number); | 122 page_numbers.push_back(page_number); |
| 121 } | 123 } |
| 122 } | 124 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 description.set_face(face_utf8); | 254 description.set_face(face_utf8); |
| 253 description.set_weight(WeightToBrowserFontTrustedWeight(weight)); | 255 description.set_weight(WeightToBrowserFontTrustedWeight(weight)); |
| 254 description.set_italic(italic > 0); | 256 description.set_italic(italic > 0); |
| 255 } | 257 } |
| 256 | 258 |
| 257 if (!pp::PDF::IsAvailable()) { | 259 if (!pp::PDF::IsAvailable()) { |
| 258 NOTREACHED(); | 260 NOTREACHED(); |
| 259 return nullptr; | 261 return nullptr; |
| 260 } | 262 } |
| 261 | 263 |
| 264 if (g_engine_for_fontmapper) |
| 265 g_engine_for_fontmapper->FontSubstituted(); |
| 266 |
| 262 PP_Resource font_resource = pp::PDF::GetFontFileWithFallback( | 267 PP_Resource font_resource = pp::PDF::GetFontFileWithFallback( |
| 263 pp::InstanceHandle(g_last_instance_id), | 268 pp::InstanceHandle(g_last_instance_id), |
| 264 &description.pp_font_description(), | 269 &description.pp_font_description(), |
| 265 static_cast<PP_PrivateFontCharset>(charset)); | 270 static_cast<PP_PrivateFontCharset>(charset)); |
| 266 long res_id = font_resource; | 271 long res_id = font_resource; |
| 267 return reinterpret_cast<void*>(res_id); | 272 return reinterpret_cast<void*>(res_id); |
| 268 } | 273 } |
| 269 | 274 |
| 270 unsigned long GetFontData(struct _FPDF_SYSFONTINFO*, void* font_id, | 275 unsigned long GetFontData(struct _FPDF_SYSFONTINFO*, void* font_id, |
| 271 unsigned int table, unsigned char* buffer, | 276 unsigned int table, unsigned char* buffer, |
| (...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1164 case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA: | 1169 case FPDF_UNSP_ANNOT_SCREEN_RICHMEDIA: |
| 1165 feature = "Screen"; | 1170 feature = "Screen"; |
| 1166 break; | 1171 break; |
| 1167 case FPDF_UNSP_ANNOT_SIG: | 1172 case FPDF_UNSP_ANNOT_SIG: |
| 1168 feature = "Digital_Signature"; | 1173 feature = "Digital_Signature"; |
| 1169 break; | 1174 break; |
| 1170 } | 1175 } |
| 1171 client_->DocumentHasUnsupportedFeature(feature); | 1176 client_->DocumentHasUnsupportedFeature(feature); |
| 1172 } | 1177 } |
| 1173 | 1178 |
| 1179 void PDFiumEngine::FontSubstituted() { |
| 1180 client_->FontSubstituted(); |
| 1181 } |
| 1182 |
| 1174 void PDFiumEngine::ContinueFind(int32_t result) { | 1183 void PDFiumEngine::ContinueFind(int32_t result) { |
| 1175 StartFind(current_find_text_, result != 0); | 1184 StartFind(current_find_text_, result != 0); |
| 1176 } | 1185 } |
| 1177 | 1186 |
| 1178 bool PDFiumEngine::HandleEvent(const pp::InputEvent& event) { | 1187 bool PDFiumEngine::HandleEvent(const pp::InputEvent& event) { |
| 1179 DCHECK(!defer_page_unload_); | 1188 DCHECK(!defer_page_unload_); |
| 1180 defer_page_unload_ = true; | 1189 defer_page_unload_ = true; |
| 1181 bool rv = false; | 1190 bool rv = false; |
| 1182 switch (event.GetType()) { | 1191 switch (event.GetType()) { |
| 1183 case PP_INPUTEVENT_TYPE_MOUSEDOWN: | 1192 case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 return PP_PRINTOUTPUTFORMAT_PDF; | 1225 return PP_PRINTOUTPUTFORMAT_PDF; |
| 1217 } | 1226 } |
| 1218 | 1227 |
| 1219 void PDFiumEngine::PrintBegin() { | 1228 void PDFiumEngine::PrintBegin() { |
| 1220 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WP); | 1229 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WP); |
| 1221 } | 1230 } |
| 1222 | 1231 |
| 1223 pp::Resource PDFiumEngine::PrintPages( | 1232 pp::Resource PDFiumEngine::PrintPages( |
| 1224 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, | 1233 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, |
| 1225 const PP_PrintSettings_Dev& print_settings) { | 1234 const PP_PrintSettings_Dev& print_settings) { |
| 1235 ScopedSubstFont scoped_subst_font(this); |
| 1226 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) | 1236 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) |
| 1227 return PrintPagesAsPDF(page_ranges, page_range_count, print_settings); | 1237 return PrintPagesAsPDF(page_ranges, page_range_count, print_settings); |
| 1228 else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) | 1238 else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) |
| 1229 return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings); | 1239 return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings); |
| 1230 return pp::Resource(); | 1240 return pp::Resource(); |
| 1231 } | 1241 } |
| 1232 | 1242 |
| 1233 FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf( | 1243 FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf( |
| 1234 double source_page_width, | 1244 double source_page_width, |
| 1235 double source_page_height, | 1245 double source_page_height, |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1368 FitContentsToPrintableAreaIfRequired(output_doc, print_settings); | 1378 FitContentsToPrintableAreaIfRequired(output_doc, print_settings); |
| 1369 // Now flatten all the output pages. | 1379 // Now flatten all the output pages. |
| 1370 buffer = GetFlattenedPrintData(output_doc); | 1380 buffer = GetFlattenedPrintData(output_doc); |
| 1371 } | 1381 } |
| 1372 FPDF_CloseDocument(output_doc); | 1382 FPDF_CloseDocument(output_doc); |
| 1373 return buffer; | 1383 return buffer; |
| 1374 } | 1384 } |
| 1375 | 1385 |
| 1376 pp::Buffer_Dev PDFiumEngine::GetFlattenedPrintData(const FPDF_DOCUMENT& doc) { | 1386 pp::Buffer_Dev PDFiumEngine::GetFlattenedPrintData(const FPDF_DOCUMENT& doc) { |
| 1377 pp::Buffer_Dev buffer; | 1387 pp::Buffer_Dev buffer; |
| 1388 ScopedSubstFont scoped_subst_font(this); |
| 1378 int page_count = FPDF_GetPageCount(doc); | 1389 int page_count = FPDF_GetPageCount(doc); |
| 1379 for (int i = 0; i < page_count; ++i) { | 1390 for (int i = 0; i < page_count; ++i) { |
| 1380 FPDF_PAGE page = FPDF_LoadPage(doc, i); | 1391 FPDF_PAGE page = FPDF_LoadPage(doc, i); |
| 1381 DCHECK(page); | 1392 DCHECK(page); |
| 1382 int flatten_ret = FPDFPage_Flatten(page, FLAT_PRINT); | 1393 int flatten_ret = FPDFPage_Flatten(page, FLAT_PRINT); |
| 1383 FPDF_ClosePage(page); | 1394 FPDF_ClosePage(page); |
| 1384 if (flatten_ret == FLATTEN_FAIL) | 1395 if (flatten_ret == FLATTEN_FAIL) |
| 1385 return buffer; | 1396 return buffer; |
| 1386 } | 1397 } |
| 1387 | 1398 |
| (...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2446 !FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) { | 2457 !FPDFAvail_IsDocAvail(fpdf_availability_, &download_hints_)) { |
| 2447 return; | 2458 return; |
| 2448 } | 2459 } |
| 2449 | 2460 |
| 2450 // If we're in the middle of getting a password, just return. We will retry | 2461 // If we're in the middle of getting a password, just return. We will retry |
| 2451 // loading the document after we get the password anyway. | 2462 // loading the document after we get the password anyway. |
| 2452 if (getting_password_) | 2463 if (getting_password_) |
| 2453 return; | 2464 return; |
| 2454 | 2465 |
| 2455 ScopedUnsupportedFeature scoped_unsupported_feature(this); | 2466 ScopedUnsupportedFeature scoped_unsupported_feature(this); |
| 2467 ScopedSubstFont scoped_subst_font(this); |
| 2456 bool needs_password = false; | 2468 bool needs_password = false; |
| 2457 if (TryLoadingDoc(std::string(), &needs_password)) { | 2469 if (TryLoadingDoc(std::string(), &needs_password)) { |
| 2458 ContinueLoadingDocument(std::string()); | 2470 ContinueLoadingDocument(std::string()); |
| 2459 return; | 2471 return; |
| 2460 } | 2472 } |
| 2461 if (needs_password) | 2473 if (needs_password) |
| 2462 GetPasswordAndLoad(); | 2474 GetPasswordAndLoad(); |
| 2463 else | 2475 else |
| 2464 client_->DocumentLoadFailed(); | 2476 client_->DocumentLoadFailed(); |
| 2465 } | 2477 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2510 getting_password_ = false; | 2522 getting_password_ = false; |
| 2511 | 2523 |
| 2512 std::string password_text; | 2524 std::string password_text; |
| 2513 if (result == PP_OK && password.is_string()) | 2525 if (result == PP_OK && password.is_string()) |
| 2514 password_text = password.AsString(); | 2526 password_text = password.AsString(); |
| 2515 ContinueLoadingDocument(password_text); | 2527 ContinueLoadingDocument(password_text); |
| 2516 } | 2528 } |
| 2517 | 2529 |
| 2518 void PDFiumEngine::ContinueLoadingDocument(const std::string& password) { | 2530 void PDFiumEngine::ContinueLoadingDocument(const std::string& password) { |
| 2519 ScopedUnsupportedFeature scoped_unsupported_feature(this); | 2531 ScopedUnsupportedFeature scoped_unsupported_feature(this); |
| 2532 ScopedSubstFont scoped_subst_font(this); |
| 2520 | 2533 |
| 2521 bool needs_password = false; | 2534 bool needs_password = false; |
| 2522 bool loaded = TryLoadingDoc(password, &needs_password); | 2535 bool loaded = TryLoadingDoc(password, &needs_password); |
| 2523 bool password_incorrect = !loaded && needs_password && !password.empty(); | 2536 bool password_incorrect = !loaded && needs_password && !password.empty(); |
| 2524 if (password_incorrect && password_tries_remaining_ > 0) { | 2537 if (password_incorrect && password_tries_remaining_ > 0) { |
| 2525 GetPasswordAndLoad(); | 2538 GetPasswordAndLoad(); |
| 2526 return; | 2539 return; |
| 2527 } | 2540 } |
| 2528 | 2541 |
| 2529 if (!doc_) { | 2542 if (!doc_) { |
| (...skipping 1196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3726 | 3739 |
| 3727 ScopedUnsupportedFeature::ScopedUnsupportedFeature(PDFiumEngine* engine) | 3740 ScopedUnsupportedFeature::ScopedUnsupportedFeature(PDFiumEngine* engine) |
| 3728 : old_engine_(g_engine_for_unsupported) { | 3741 : old_engine_(g_engine_for_unsupported) { |
| 3729 g_engine_for_unsupported = engine; | 3742 g_engine_for_unsupported = engine; |
| 3730 } | 3743 } |
| 3731 | 3744 |
| 3732 ScopedUnsupportedFeature::~ScopedUnsupportedFeature() { | 3745 ScopedUnsupportedFeature::~ScopedUnsupportedFeature() { |
| 3733 g_engine_for_unsupported = old_engine_; | 3746 g_engine_for_unsupported = old_engine_; |
| 3734 } | 3747 } |
| 3735 | 3748 |
| 3749 ScopedSubstFont::ScopedSubstFont(PDFiumEngine* engine) |
| 3750 : old_engine_(g_engine_for_fontmapper) { |
| 3751 g_engine_for_fontmapper = engine; |
| 3752 } |
| 3753 |
| 3754 ScopedSubstFont::~ScopedSubstFont() { |
| 3755 g_engine_for_fontmapper = old_engine_; |
| 3756 } |
| 3757 |
| 3736 namespace { | 3758 namespace { |
| 3737 | 3759 |
| 3738 base::LazyInstance<PDFiumEngineExports>::Leaky g_pdf_engine_exports = | 3760 base::LazyInstance<PDFiumEngineExports>::Leaky g_pdf_engine_exports = |
| 3739 LAZY_INSTANCE_INITIALIZER; | 3761 LAZY_INSTANCE_INITIALIZER; |
| 3740 | 3762 |
| 3741 int CalculatePosition(FPDF_PAGE page, | 3763 int CalculatePosition(FPDF_PAGE page, |
| 3742 const PDFiumEngineExports::RenderingSettings& settings, | 3764 const PDFiumEngineExports::RenderingSettings& settings, |
| 3743 pp::Rect* dest) { | 3765 pp::Rect* dest) { |
| 3744 int page_width = static_cast<int>(ConvertUnitDouble(FPDF_GetPageWidth(page), | 3766 int page_width = static_cast<int>(ConvertUnitDouble(FPDF_GetPageWidth(page), |
| 3745 kPointsPerInch, | 3767 kPointsPerInch, |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3829 | 3851 |
| 3830 #if defined(OS_WIN) | 3852 #if defined(OS_WIN) |
| 3831 bool PDFiumEngineExports::RenderPDFPageToDC(const void* pdf_buffer, | 3853 bool PDFiumEngineExports::RenderPDFPageToDC(const void* pdf_buffer, |
| 3832 int buffer_size, | 3854 int buffer_size, |
| 3833 int page_number, | 3855 int page_number, |
| 3834 const RenderingSettings& settings, | 3856 const RenderingSettings& settings, |
| 3835 HDC dc) { | 3857 HDC dc) { |
| 3836 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr); | 3858 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, buffer_size, nullptr); |
| 3837 if (!doc) | 3859 if (!doc) |
| 3838 return false; | 3860 return false; |
| 3861 ScopedSubstFont scoped_subst_font(this); |
| 3839 FPDF_PAGE page = FPDF_LoadPage(doc, page_number); | 3862 FPDF_PAGE page = FPDF_LoadPage(doc, page_number); |
| 3840 if (!page) { | 3863 if (!page) { |
| 3841 FPDF_CloseDocument(doc); | 3864 FPDF_CloseDocument(doc); |
| 3842 return false; | 3865 return false; |
| 3843 } | 3866 } |
| 3844 RenderingSettings new_settings = settings; | 3867 RenderingSettings new_settings = settings; |
| 3845 // calculate the page size | 3868 // calculate the page size |
| 3846 if (new_settings.dpi_x == -1) | 3869 if (new_settings.dpi_x == -1) |
| 3847 new_settings.dpi_x = GetDeviceCaps(dc, LOGPIXELSX); | 3870 new_settings.dpi_x = GetDeviceCaps(dc, LOGPIXELSX); |
| 3848 if (new_settings.dpi_y == -1) | 3871 if (new_settings.dpi_y == -1) |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3981 FPDF_DOCUMENT doc = | 4004 FPDF_DOCUMENT doc = |
| 3982 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | 4005 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); |
| 3983 if (!doc) | 4006 if (!doc) |
| 3984 return false; | 4007 return false; |
| 3985 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 4008 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
| 3986 FPDF_CloseDocument(doc); | 4009 FPDF_CloseDocument(doc); |
| 3987 return success; | 4010 return success; |
| 3988 } | 4011 } |
| 3989 | 4012 |
| 3990 } // namespace chrome_pdf | 4013 } // namespace chrome_pdf |
| OLD | NEW |