| 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 | 8 |
| 9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "ppapi/c/private/ppb_pdf.h" | 26 #include "ppapi/c/private/ppb_pdf.h" |
| 27 #include "ppapi/cpp/dev/memory_dev.h" | 27 #include "ppapi/cpp/dev/memory_dev.h" |
| 28 #include "ppapi/cpp/input_event.h" | 28 #include "ppapi/cpp/input_event.h" |
| 29 #include "ppapi/cpp/instance.h" | 29 #include "ppapi/cpp/instance.h" |
| 30 #include "ppapi/cpp/module.h" | 30 #include "ppapi/cpp/module.h" |
| 31 #include "ppapi/cpp/private/pdf.h" | 31 #include "ppapi/cpp/private/pdf.h" |
| 32 #include "ppapi/cpp/trusted/browser_font_trusted.h" | 32 #include "ppapi/cpp/trusted/browser_font_trusted.h" |
| 33 #include "ppapi/cpp/url_response_info.h" | 33 #include "ppapi/cpp/url_response_info.h" |
| 34 #include "ppapi/cpp/var.h" | 34 #include "ppapi/cpp/var.h" |
| 35 #include "ppapi/cpp/var_dictionary.h" | 35 #include "ppapi/cpp/var_dictionary.h" |
| 36 #include "printing/units.h" |
| 36 #include "third_party/pdfium/fpdfsdk/include/fpdf_ext.h" | 37 #include "third_party/pdfium/fpdfsdk/include/fpdf_ext.h" |
| 37 #include "third_party/pdfium/fpdfsdk/include/fpdf_flatten.h" | 38 #include "third_party/pdfium/fpdfsdk/include/fpdf_flatten.h" |
| 38 #include "third_party/pdfium/fpdfsdk/include/fpdf_searchex.h" | 39 #include "third_party/pdfium/fpdfsdk/include/fpdf_searchex.h" |
| 39 #include "third_party/pdfium/fpdfsdk/include/fpdf_sysfontinfo.h" | 40 #include "third_party/pdfium/fpdfsdk/include/fpdf_sysfontinfo.h" |
| 40 #include "third_party/pdfium/fpdfsdk/include/fpdf_transformpage.h" | 41 #include "third_party/pdfium/fpdfsdk/include/fpdf_transformpage.h" |
| 41 #include "third_party/pdfium/fpdfsdk/include/fpdfedit.h" | 42 #include "third_party/pdfium/fpdfsdk/include/fpdfedit.h" |
| 42 #include "third_party/pdfium/fpdfsdk/include/fpdfppo.h" | 43 #include "third_party/pdfium/fpdfsdk/include/fpdfppo.h" |
| 43 #include "third_party/pdfium/fpdfsdk/include/fpdfsave.h" | 44 #include "third_party/pdfium/fpdfsdk/include/fpdfsave.h" |
| 44 #include "third_party/pdfium/fpdfsdk/include/pdfwindow/PDFWindow.h" | 45 #include "third_party/pdfium/fpdfsdk/include/pdfwindow/PDFWindow.h" |
| 45 #include "third_party/pdfium/fpdfsdk/include/pdfwindow/PWL_FontMap.h" | 46 #include "third_party/pdfium/fpdfsdk/include/pdfwindow/PWL_FontMap.h" |
| 46 #include "ui/events/keycodes/keyboard_codes.h" | 47 #include "ui/events/keycodes/keyboard_codes.h" |
| 47 | 48 |
| 49 using printing::ConvertUnit; |
| 50 using printing::ConvertUnitDouble; |
| 51 using printing::kPointsPerInch; |
| 52 using printing::kPixelsPerInch; |
| 53 |
| 48 namespace chrome_pdf { | 54 namespace chrome_pdf { |
| 49 | 55 |
| 50 namespace { | 56 namespace { |
| 51 | 57 |
| 52 #define kPageShadowTop 3 | 58 #define kPageShadowTop 3 |
| 53 #define kPageShadowBottom 7 | 59 #define kPageShadowBottom 7 |
| 54 #define kPageShadowLeft 5 | 60 #define kPageShadowLeft 5 |
| 55 #define kPageShadowRight 5 | 61 #define kPageShadowRight 5 |
| 56 | 62 |
| 57 #define kPageSeparatorThickness 4 | 63 #define kPageSeparatorThickness 4 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 83 // than the above to keep things smooth if the user is scrolling quickly. We | 89 // than the above to keep things smooth if the user is scrolling quickly. We |
| 84 // try painting a little because with accelerated compositing, we get flushes | 90 // try painting a little because with accelerated compositing, we get flushes |
| 85 // only every 16 ms. If we were to wait until the next flush to paint the rest | 91 // only every 16 ms. If we were to wait until the next flush to paint the rest |
| 86 // of the pdf, we would never get to draw the pdf and would only draw the | 92 // of the pdf, we would never get to draw the pdf and would only draw the |
| 87 // scrollbars. This value is picked to give enough time for gpu related code to | 93 // scrollbars. This value is picked to give enough time for gpu related code to |
| 88 // do its thing and still fit within the timelimit for 60Hz. For the | 94 // do its thing and still fit within the timelimit for 60Hz. For the |
| 89 // non-composited case, this doesn't make things worse since we're still | 95 // non-composited case, this doesn't make things worse since we're still |
| 90 // painting the scrollbars > 60 Hz. | 96 // painting the scrollbars > 60 Hz. |
| 91 #define kMaxInitialProgressivePaintTimeMs 10 | 97 #define kMaxInitialProgressivePaintTimeMs 10 |
| 92 | 98 |
| 93 // Copied from printing/units.cc because we don't want to depend on printing | |
| 94 // since it brings in libpng which causes duplicate symbols with PDFium. | |
| 95 const int kPointsPerInch = 72; | |
| 96 const int kPixelsPerInch = 96; | |
| 97 | |
| 98 struct ClipBox { | 99 struct ClipBox { |
| 99 float left; | 100 float left; |
| 100 float right; | 101 float right; |
| 101 float top; | 102 float top; |
| 102 float bottom; | 103 float bottom; |
| 103 }; | 104 }; |
| 104 | 105 |
| 105 int ConvertUnit(int value, int old_unit, int new_unit) { | |
| 106 // With integer arithmetic, to divide a value with correct rounding, you need | |
| 107 // to add half of the divisor value to the dividend value. You need to do the | |
| 108 // reverse with negative number. | |
| 109 if (value >= 0) { | |
| 110 return ((value * new_unit) + (old_unit / 2)) / old_unit; | |
| 111 } else { | |
| 112 return ((value * new_unit) - (old_unit / 2)) / old_unit; | |
| 113 } | |
| 114 } | |
| 115 | |
| 116 std::vector<uint32_t> GetPageNumbersFromPrintPageNumberRange( | 106 std::vector<uint32_t> GetPageNumbersFromPrintPageNumberRange( |
| 117 const PP_PrintPageNumberRange_Dev* page_ranges, | 107 const PP_PrintPageNumberRange_Dev* page_ranges, |
| 118 uint32_t page_range_count) { | 108 uint32_t page_range_count) { |
| 119 std::vector<uint32_t> page_numbers; | 109 std::vector<uint32_t> page_numbers; |
| 120 for (uint32_t index = 0; index < page_range_count; ++index) { | 110 for (uint32_t index = 0; index < page_range_count; ++index) { |
| 121 for (uint32_t page_number = page_ranges[index].first_page_number; | 111 for (uint32_t page_number = page_ranges[index].first_page_number; |
| 122 page_number <= page_ranges[index].last_page_number; ++page_number) { | 112 page_number <= page_ranges[index].last_page_number; ++page_number) { |
| 123 page_numbers.push_back(page_number); | 113 page_numbers.push_back(page_number); |
| 124 } | 114 } |
| 125 } | 115 } |
| (...skipping 1265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1391 pp::Rect page_rect = page_to_print->rect(); | 1381 pp::Rect page_rect = page_to_print->rect(); |
| 1392 FPDF_RenderPageBitmap(bitmap, | 1382 FPDF_RenderPageBitmap(bitmap, |
| 1393 page_to_print->GetPrintPage(), | 1383 page_to_print->GetPrintPage(), |
| 1394 page_rect.x(), | 1384 page_rect.x(), |
| 1395 page_rect.y(), | 1385 page_rect.y(), |
| 1396 page_rect.width(), | 1386 page_rect.width(), |
| 1397 page_rect.height(), | 1387 page_rect.height(), |
| 1398 print_settings.orientation, | 1388 print_settings.orientation, |
| 1399 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); | 1389 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); |
| 1400 | 1390 |
| 1401 double ratio_x = (static_cast<double>(bitmap_size.width()) * kPointsPerInch) / | 1391 double ratio_x = ConvertUnitDouble(bitmap_size.width(), |
| 1402 print_settings.dpi; | 1392 print_settings.dpi, |
| 1403 double ratio_y = | 1393 kPointsPerInch); |
| 1404 (static_cast<double>(bitmap_size.height()) * kPointsPerInch) / | 1394 double ratio_y = ConvertUnitDouble(bitmap_size.height(), |
| 1405 print_settings.dpi; | 1395 print_settings.dpi, |
| 1396 kPointsPerInch); |
| 1406 | 1397 |
| 1407 // Add the bitmap to an image object and add the image object to the output | 1398 // Add the bitmap to an image object and add the image object to the output |
| 1408 // page. | 1399 // page. |
| 1409 FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); | 1400 FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); |
| 1410 FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap); | 1401 FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap); |
| 1411 FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0); | 1402 FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0); |
| 1412 FPDFPage_InsertObject(temp_page, temp_img); | 1403 FPDFPage_InsertObject(temp_page, temp_img); |
| 1413 FPDFPage_GenerateContent(temp_page); | 1404 FPDFPage_GenerateContent(temp_page); |
| 1414 FPDF_ClosePage(temp_page); | 1405 FPDF_ClosePage(temp_page); |
| 1415 | 1406 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1443 GetPageNumbersFromPrintPageNumberRange(page_ranges, page_range_count); | 1434 GetPageNumbersFromPrintPageNumberRange(page_ranges, page_range_count); |
| 1444 for (size_t i = 0; i < page_numbers.size(); ++i) { | 1435 for (size_t i = 0; i < page_numbers.size(); ++i) { |
| 1445 uint32_t page_number = page_numbers[i]; | 1436 uint32_t page_number = page_numbers[i]; |
| 1446 FPDF_PAGE pdf_page = FPDF_LoadPage(doc_, page_number); | 1437 FPDF_PAGE pdf_page = FPDF_LoadPage(doc_, page_number); |
| 1447 double source_page_width = FPDF_GetPageWidth(pdf_page); | 1438 double source_page_width = FPDF_GetPageWidth(pdf_page); |
| 1448 double source_page_height = FPDF_GetPageHeight(pdf_page); | 1439 double source_page_height = FPDF_GetPageHeight(pdf_page); |
| 1449 source_page_sizes.push_back(std::make_pair(source_page_width, | 1440 source_page_sizes.push_back(std::make_pair(source_page_width, |
| 1450 source_page_height)); | 1441 source_page_height)); |
| 1451 | 1442 |
| 1452 int width_in_pixels = ConvertUnit(source_page_width, | 1443 int width_in_pixels = ConvertUnit(source_page_width, |
| 1453 static_cast<int>(kPointsPerInch), | 1444 kPointsPerInch, |
| 1454 print_settings.dpi); | 1445 print_settings.dpi); |
| 1455 int height_in_pixels = ConvertUnit(source_page_height, | 1446 int height_in_pixels = ConvertUnit(source_page_height, |
| 1456 static_cast<int>(kPointsPerInch), | 1447 kPointsPerInch, |
| 1457 print_settings.dpi); | 1448 print_settings.dpi); |
| 1458 | 1449 |
| 1459 pp::Rect rect(width_in_pixels, height_in_pixels); | 1450 pp::Rect rect(width_in_pixels, height_in_pixels); |
| 1460 pages_to_print.push_back(PDFiumPage(this, page_number, rect, true)); | 1451 pages_to_print.push_back(PDFiumPage(this, page_number, rect, true)); |
| 1461 FPDF_ClosePage(pdf_page); | 1452 FPDF_ClosePage(pdf_page); |
| 1462 } | 1453 } |
| 1463 | 1454 |
| 1464 #if defined(OS_LINUX) | 1455 #if defined(OS_LINUX) |
| 1465 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); | 1456 g_last_instance_id = client_->GetPluginInstance()->pp_instance(); |
| 1466 #endif | 1457 #endif |
| (...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2499 page_rects.push_back(rect); | 2490 page_rects.push_back(rect); |
| 2500 | 2491 |
| 2501 document_size_.Enlarge(0, page_size.height()); | 2492 document_size_.Enlarge(0, page_size.height()); |
| 2502 } | 2493 } |
| 2503 | 2494 |
| 2504 // Create blank pages. | 2495 // Create blank pages. |
| 2505 for (int i = 1; i < num_pages; ++i) { | 2496 for (int i = 1; i < num_pages; ++i) { |
| 2506 pp::Rect page_rect(page_rects[i]); | 2497 pp::Rect page_rect(page_rects[i]); |
| 2507 page_rect.Inset(kPageShadowLeft, kPageShadowTop, | 2498 page_rect.Inset(kPageShadowLeft, kPageShadowTop, |
| 2508 kPageShadowRight, kPageShadowBottom); | 2499 kPageShadowRight, kPageShadowBottom); |
| 2509 double width_in_points = | 2500 double width_in_points = ConvertUnitDouble(page_rect.width(), |
| 2510 page_rect.width() * kPointsPerInch / kPixelsPerInch; | 2501 kPixelsPerInch, |
| 2511 double height_in_points = | 2502 kPointsPerInch); |
| 2512 page_rect.height() * kPointsPerInch / kPixelsPerInch; | 2503 double height_in_points = ConvertUnitDouble(page_rect.height(), |
| 2504 kPixelsPerInch, |
| 2505 kPointsPerInch); |
| 2513 FPDFPage_New(doc_, i, width_in_points, height_in_points); | 2506 FPDFPage_New(doc_, i, width_in_points, height_in_points); |
| 2514 pages_.push_back(new PDFiumPage(this, i, page_rect, true)); | 2507 pages_.push_back(new PDFiumPage(this, i, page_rect, true)); |
| 2515 } | 2508 } |
| 2516 | 2509 |
| 2517 CalculateVisiblePages(); | 2510 CalculateVisiblePages(); |
| 2518 if (document_size_ != old_document_size) | 2511 if (document_size_ != old_document_size) |
| 2519 client_->DocumentSizeUpdated(document_size_); | 2512 client_->DocumentSizeUpdated(document_size_); |
| 2520 } | 2513 } |
| 2521 | 2514 |
| 2522 void PDFiumEngine::LoadDocument() { | 2515 void PDFiumEngine::LoadDocument() { |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2786 | 2779 |
| 2787 pp::Size PDFiumEngine::GetPageSize(int index) { | 2780 pp::Size PDFiumEngine::GetPageSize(int index) { |
| 2788 pp::Size size; | 2781 pp::Size size; |
| 2789 double width_in_points = 0; | 2782 double width_in_points = 0; |
| 2790 double height_in_points = 0; | 2783 double height_in_points = 0; |
| 2791 int rv = FPDF_GetPageSizeByIndex( | 2784 int rv = FPDF_GetPageSizeByIndex( |
| 2792 doc_, index, &width_in_points, &height_in_points); | 2785 doc_, index, &width_in_points, &height_in_points); |
| 2793 | 2786 |
| 2794 if (rv) { | 2787 if (rv) { |
| 2795 int width_in_pixels = static_cast<int>( | 2788 int width_in_pixels = static_cast<int>( |
| 2796 width_in_points * kPixelsPerInch / kPointsPerInch); | 2789 ConvertUnitDouble(width_in_points, kPointsPerInch, kPixelsPerInch)); |
| 2797 int height_in_pixels = static_cast<int>( | 2790 int height_in_pixels = static_cast<int>( |
| 2798 height_in_points * kPixelsPerInch / kPointsPerInch); | 2791 ConvertUnitDouble(height_in_points, kPointsPerInch, kPixelsPerInch)); |
| 2799 if (current_rotation_ % 2 == 1) | 2792 if (current_rotation_ % 2 == 1) |
| 2800 std::swap(width_in_pixels, height_in_pixels); | 2793 std::swap(width_in_pixels, height_in_pixels); |
| 2801 size = pp::Size(width_in_pixels, height_in_pixels); | 2794 size = pp::Size(width_in_pixels, height_in_pixels); |
| 2802 } | 2795 } |
| 2803 return size; | 2796 return size; |
| 2804 } | 2797 } |
| 2805 | 2798 |
| 2806 int PDFiumEngine::StartPaint(int page_index, const pp::Rect& dirty) { | 2799 int PDFiumEngine::StartPaint(int page_index, const pp::Rect& dirty) { |
| 2807 // For the first time we hit paint, do nothing and just record the paint for | 2800 // For the first time we hit paint, do nothing and just record the paint for |
| 2808 // the next callback. This keeps the UI responsive in case the user is doing | 2801 // the next callback. This keeps the UI responsive in case the user is doing |
| (...skipping 964 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3773 | 3766 |
| 3774 PDFEngineExports* PDFEngineExports::Create() { | 3767 PDFEngineExports* PDFEngineExports::Create() { |
| 3775 return new PDFiumEngineExports; | 3768 return new PDFiumEngineExports; |
| 3776 } | 3769 } |
| 3777 | 3770 |
| 3778 namespace { | 3771 namespace { |
| 3779 | 3772 |
| 3780 int CalculatePosition(FPDF_PAGE page, | 3773 int CalculatePosition(FPDF_PAGE page, |
| 3781 const PDFiumEngineExports::RenderingSettings& settings, | 3774 const PDFiumEngineExports::RenderingSettings& settings, |
| 3782 pp::Rect* dest) { | 3775 pp::Rect* dest) { |
| 3783 int page_width = static_cast<int>( | 3776 int page_width = static_cast<int>(ConvertUnitDouble(FPDF_GetPageWidth(page), |
| 3784 FPDF_GetPageWidth(page) * settings.dpi_x / kPointsPerInch); | 3777 kPointsPerInch, |
| 3785 int page_height = static_cast<int>( | 3778 settings.dpi_x)); |
| 3786 FPDF_GetPageHeight(page) * settings.dpi_y / kPointsPerInch); | 3779 int page_height = static_cast<int>(ConvertUnitDouble(FPDF_GetPageHeight(page), |
| 3780 kPointsPerInch, |
| 3781 settings.dpi_y)); |
| 3787 | 3782 |
| 3788 // Start by assuming that we will draw exactly to the bounds rect | 3783 // Start by assuming that we will draw exactly to the bounds rect |
| 3789 // specified. | 3784 // specified. |
| 3790 *dest = settings.bounds; | 3785 *dest = settings.bounds; |
| 3791 | 3786 |
| 3792 int rotate = 0; // normal orientation. | 3787 int rotate = 0; // normal orientation. |
| 3793 | 3788 |
| 3794 // Auto-rotate landscape pages to print correctly. | 3789 // Auto-rotate landscape pages to print correctly. |
| 3795 if (settings.autorotate && | 3790 if (settings.autorotate && |
| 3796 (dest->width() > dest->height()) != (page_width > page_height)) { | 3791 (dest->width() > dest->height()) != (page_width > page_height)) { |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3999 double* height) { | 3994 double* height) { |
| 4000 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, NULL); | 3995 FPDF_DOCUMENT doc = FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, NULL); |
| 4001 if (!doc) | 3996 if (!doc) |
| 4002 return false; | 3997 return false; |
| 4003 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 3998 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
| 4004 FPDF_CloseDocument(doc); | 3999 FPDF_CloseDocument(doc); |
| 4005 return success; | 4000 return success; |
| 4006 } | 4001 } |
| 4007 | 4002 |
| 4008 } // namespace chrome_pdf | 4003 } // namespace chrome_pdf |
| OLD | NEW |