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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
50 #include "third_party/pdfium/public/fpdf_edit.h" | 50 #include "third_party/pdfium/public/fpdf_edit.h" |
51 #include "third_party/pdfium/public/fpdf_ext.h" | 51 #include "third_party/pdfium/public/fpdf_ext.h" |
52 #include "third_party/pdfium/public/fpdf_flatten.h" | 52 #include "third_party/pdfium/public/fpdf_flatten.h" |
53 #include "third_party/pdfium/public/fpdf_ppo.h" | 53 #include "third_party/pdfium/public/fpdf_ppo.h" |
54 #include "third_party/pdfium/public/fpdf_save.h" | 54 #include "third_party/pdfium/public/fpdf_save.h" |
55 #include "third_party/pdfium/public/fpdf_searchex.h" | 55 #include "third_party/pdfium/public/fpdf_searchex.h" |
56 #include "third_party/pdfium/public/fpdf_sysfontinfo.h" | 56 #include "third_party/pdfium/public/fpdf_sysfontinfo.h" |
57 #include "third_party/pdfium/public/fpdf_transformpage.h" | 57 #include "third_party/pdfium/public/fpdf_transformpage.h" |
58 #include "third_party/pdfium/public/fpdfview.h" | 58 #include "third_party/pdfium/public/fpdfview.h" |
59 #include "ui/events/keycodes/keyboard_codes.h" | 59 #include "ui/events/keycodes/keyboard_codes.h" |
60 #include "ui/gfx/codec/jpeg_codec.h" | |
60 #include "ui/gfx/geometry/rect.h" | 61 #include "ui/gfx/geometry/rect.h" |
61 #include "v8/include/v8.h" | 62 #include "v8/include/v8.h" |
62 | 63 |
63 using printing::ConvertUnit; | 64 using printing::ConvertUnit; |
64 using printing::ConvertUnitDouble; | 65 using printing::ConvertUnitDouble; |
65 using printing::kPointsPerInch; | 66 using printing::kPointsPerInch; |
66 using printing::kPixelsPerInch; | 67 using printing::kPixelsPerInch; |
67 | 68 |
68 namespace chrome_pdf { | 69 namespace chrome_pdf { |
69 | 70 |
(...skipping 540 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
610 new gin::IsolateHolder(gin::IsolateHolder::kSingleThread); | 611 new gin::IsolateHolder(gin::IsolateHolder::kSingleThread); |
611 g_isolate_holder->isolate()->Enter(); | 612 g_isolate_holder->isolate()->Enter(); |
612 } | 613 } |
613 | 614 |
614 void TearDownV8() { | 615 void TearDownV8() { |
615 g_isolate_holder->isolate()->Exit(); | 616 g_isolate_holder->isolate()->Exit(); |
616 delete g_isolate_holder; | 617 delete g_isolate_holder; |
617 g_isolate_holder = nullptr; | 618 g_isolate_holder = nullptr; |
618 } | 619 } |
619 | 620 |
621 struct simple_buf { | |
Tom Sepez
2016/12/15 21:09:23
actually, can we avoid this altogether by passing
rbpotter
2016/12/16 00:06:31
Yes, done
| |
622 size_t size; | |
623 uint8_t* data; | |
624 }; | |
625 | |
626 int GetBlockForJpeg(void* param, | |
627 unsigned long pos, | |
628 unsigned char* buf, | |
629 unsigned long size) { | |
630 simple_buf* buf_p = static_cast<simple_buf*>(param); | |
631 if (pos + size < pos || pos + size > buf_p->size) | |
632 return 0; | |
633 memcpy(buf, buf_p->data + pos, size); | |
634 return 1; | |
635 } | |
636 | |
620 } // namespace | 637 } // namespace |
621 | 638 |
622 bool InitializeSDK() { | 639 bool InitializeSDK() { |
623 SetUpV8(); | 640 SetUpV8(); |
624 | 641 |
625 FPDF_LIBRARY_CONFIG config; | 642 FPDF_LIBRARY_CONFIG config; |
626 config.version = 2; | 643 config.version = 2; |
627 config.m_pUserFontPaths = nullptr; | 644 config.m_pUserFontPaths = nullptr; |
628 config.m_pIsolate = v8::Isolate::GetCurrent(); | 645 config.m_pIsolate = v8::Isolate::GetCurrent(); |
629 config.m_v8EmbedderSlot = gin::kEmbedderPDFium; | 646 config.m_v8EmbedderSlot = gin::kEmbedderPDFium; |
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1346 | 1363 |
1347 DCHECK(defer_page_unload_); | 1364 DCHECK(defer_page_unload_); |
1348 defer_page_unload_ = false; | 1365 defer_page_unload_ = false; |
1349 for (int page_index : deferred_page_unloads_) | 1366 for (int page_index : deferred_page_unloads_) |
1350 pages_[page_index]->Unload(); | 1367 pages_[page_index]->Unload(); |
1351 deferred_page_unloads_.clear(); | 1368 deferred_page_unloads_.clear(); |
1352 return rv; | 1369 return rv; |
1353 } | 1370 } |
1354 | 1371 |
1355 uint32_t PDFiumEngine::QuerySupportedPrintOutputFormats() { | 1372 uint32_t PDFiumEngine::QuerySupportedPrintOutputFormats() { |
1356 if (!HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) | 1373 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) |
1357 return 0; | 1374 return PP_PRINTOUTPUTFORMAT_PDF | PP_PRINTOUTPUTFORMAT_RASTER; |
1358 return PP_PRINTOUTPUTFORMAT_PDF; | 1375 if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) |
1376 return PP_PRINTOUTPUTFORMAT_RASTER; | |
1377 return 0; | |
1359 } | 1378 } |
1360 | 1379 |
1361 void PDFiumEngine::PrintBegin() { | 1380 void PDFiumEngine::PrintBegin() { |
1362 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WP); | 1381 FORM_DoDocumentAAction(form_, FPDFDOC_AACTION_WP); |
1363 } | 1382 } |
1364 | 1383 |
1365 pp::Resource PDFiumEngine::PrintPages( | 1384 pp::Resource PDFiumEngine::PrintPages( |
1366 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, | 1385 const PP_PrintPageNumberRange_Dev* page_ranges, uint32_t page_range_count, |
1367 const PP_PrintSettings_Dev& print_settings) { | 1386 const PP_PrintSettings_Dev& print_settings) { |
1368 ScopedSubstFont scoped_subst_font(this); | 1387 ScopedSubstFont scoped_subst_font(this); |
1369 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) | 1388 if (HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY) && |
1389 (print_settings.format & PP_PRINTOUTPUTFORMAT_PDF)) { | |
1370 return PrintPagesAsPDF(page_ranges, page_range_count, print_settings); | 1390 return PrintPagesAsPDF(page_ranges, page_range_count, print_settings); |
1371 else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) | 1391 } else if (HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY)) { |
1372 return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings); | 1392 return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings); |
1393 } | |
1394 | |
1373 return pp::Resource(); | 1395 return pp::Resource(); |
1374 } | 1396 } |
1375 | 1397 |
1376 FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf( | 1398 FPDF_DOCUMENT PDFiumEngine::CreateSinglePageRasterPdf( |
1377 double source_page_width, | 1399 double source_page_width, |
1378 double source_page_height, | 1400 double source_page_height, |
1379 const PP_PrintSettings_Dev& print_settings, | 1401 const PP_PrintSettings_Dev& print_settings, |
1380 PDFiumPage* page_to_print) { | 1402 PDFiumPage* page_to_print) { |
1381 FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument(); | 1403 FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument(); |
1382 if (!temp_doc) | 1404 if (!temp_doc) |
(...skipping 22 matching lines...) Expand all Loading... | |
1405 pp::Rect page_rect = page_to_print->rect(); | 1427 pp::Rect page_rect = page_to_print->rect(); |
1406 FPDF_RenderPageBitmap(bitmap, | 1428 FPDF_RenderPageBitmap(bitmap, |
1407 page_to_print->GetPrintPage(), | 1429 page_to_print->GetPrintPage(), |
1408 page_rect.x(), | 1430 page_rect.x(), |
1409 page_rect.y(), | 1431 page_rect.y(), |
1410 page_rect.width(), | 1432 page_rect.width(), |
1411 page_rect.height(), | 1433 page_rect.height(), |
1412 print_settings.orientation, | 1434 print_settings.orientation, |
1413 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); | 1435 FPDF_ANNOT | FPDF_PRINTING | FPDF_NO_CATCH); |
1414 | 1436 |
1437 unsigned char* bitmap_data = | |
1438 static_cast<unsigned char*>(FPDFBitmap_GetBuffer(bitmap)); | |
1415 double ratio_x = ConvertUnitDouble(bitmap_size.width(), | 1439 double ratio_x = ConvertUnitDouble(bitmap_size.width(), |
1416 print_settings.dpi, | 1440 print_settings.dpi, |
1417 kPointsPerInch); | 1441 kPointsPerInch); |
1418 double ratio_y = ConvertUnitDouble(bitmap_size.height(), | 1442 double ratio_y = ConvertUnitDouble(bitmap_size.height(), |
1419 print_settings.dpi, | 1443 print_settings.dpi, |
1420 kPointsPerInch); | 1444 kPointsPerInch); |
1421 | 1445 |
1422 // Add the bitmap to an image object and add the image object to the output | 1446 // Add the bitmap to an image object and add the image object to the output |
1423 // page. | 1447 // page. |
1424 FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); | 1448 FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImgeObj(temp_doc); |
1425 FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap); | 1449 |
1450 std::vector<uint8_t> compressed_bitmap_data; | |
1451 int quality = 40; | |
1452 if (!(print_settings.format & PP_PRINTOUTPUTFORMAT_PDF) && | |
1453 (gfx::JPEGCodec::Encode( | |
1454 bitmap_data, gfx::JPEGCodec::FORMAT_BGRA, FPDFBitmap_GetWidth(bitmap), | |
1455 FPDFBitmap_GetHeight(bitmap), FPDFBitmap_GetStride(bitmap), quality, | |
1456 &compressed_bitmap_data))) { | |
1457 simple_buf buffer; | |
1458 buffer.size = compressed_bitmap_data.size(); | |
1459 buffer.data = compressed_bitmap_data.data(); | |
1460 | |
1461 FPDF_FILEACCESS file_access; | |
1462 memset(&file_access, '\0', sizeof(file_access)); | |
1463 file_access.m_FileLen = | |
1464 static_cast<unsigned long>(compressed_bitmap_data.size()); | |
1465 file_access.m_GetBlock = &GetBlockForJpeg; | |
1466 file_access.m_Param = &buffer; | |
1467 | |
1468 FPDFImageObj_LoadJpegFileInline(&temp_page, 1, temp_img, &file_access); | |
1469 } else { | |
1470 FPDFImageObj_SetBitmap(&temp_page, 1, temp_img, bitmap); | |
1471 } | |
1472 | |
1426 FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0); | 1473 FPDFImageObj_SetMatrix(temp_img, ratio_x, 0, 0, ratio_y, 0, 0); |
1427 FPDFPage_InsertObject(temp_page, temp_img); | 1474 FPDFPage_InsertObject(temp_page, temp_img); |
1428 FPDFPage_GenerateContent(temp_page); | 1475 FPDFPage_GenerateContent(temp_page); |
1429 FPDF_ClosePage(temp_page); | 1476 FPDF_ClosePage(temp_page); |
1430 | 1477 |
1431 page_to_print->ClosePrintPage(); | 1478 page_to_print->ClosePrintPage(); |
1432 FPDFBitmap_Destroy(bitmap); | 1479 FPDFBitmap_Destroy(bitmap); |
1433 | 1480 |
1434 return temp_doc; | 1481 return temp_doc; |
1435 } | 1482 } |
(...skipping 2702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4138 FPDF_DOCUMENT doc = | 4185 FPDF_DOCUMENT doc = |
4139 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); | 4186 FPDF_LoadMemDocument(pdf_buffer, pdf_buffer_size, nullptr); |
4140 if (!doc) | 4187 if (!doc) |
4141 return false; | 4188 return false; |
4142 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; | 4189 bool success = FPDF_GetPageSizeByIndex(doc, page_number, width, height) != 0; |
4143 FPDF_CloseDocument(doc); | 4190 FPDF_CloseDocument(doc); |
4144 return success; | 4191 return success; |
4145 } | 4192 } |
4146 | 4193 |
4147 } // namespace chrome_pdf | 4194 } // namespace chrome_pdf |
OLD | NEW |