0

Reorganize some PDFiumPrint code and fix nits.

Reorganize:
- Move NupPdfToPdf() into the anonymous namespace.
- Make NupPdfToPdf() return a PDF instead of the PDF data.
- Return earlier in PrintPagesAsRasterPDF().

- Make CreateSinglePageRasterPdf() return a ScopedFPDFDocument.
- Put |scale_factor| in the smallest possible scope.
- Group static methods together in the header.
- Use "Pdf" consistently in method names.
- Mark some methods const.

Nits: 
Change-Id: I25ac995d2041990eab42391915a6736044ad6b63
Reviewed-on: https://chromium-review.googlesource.com/1238075
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Rebekah Potter <rbpotter@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593432}
This commit is contained in:
Lei Zhang
2018-09-22 06:01:42 +00:00
committed by Commit Bot
parent d98e9a9b82
commit 0b3b28dcdc
4 changed files with 94 additions and 96 deletions

@ -1124,17 +1124,17 @@ pp::Resource PDFiumEngine::PrintPages(
if ((print_settings.format & PP_PRINTOUTPUTFORMAT_PDF) &&
HasPermission(PERMISSION_PRINT_HIGH_QUALITY)) {
return PrintPagesAsPDF(page_ranges, page_range_count, print_settings,
return PrintPagesAsPdf(page_ranges, page_range_count, print_settings,
pdf_print_settings);
}
if (HasPermission(PERMISSION_PRINT_LOW_QUALITY)) {
return PrintPagesAsRasterPDF(page_ranges, page_range_count, print_settings,
return PrintPagesAsRasterPdf(page_ranges, page_range_count, print_settings,
pdf_print_settings);
}
return pp::Resource();
}
pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
@ -1151,11 +1151,11 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsRasterPDF(
g_last_instance_id = client_->GetPluginInstance()->pp_instance();
#endif
return print_.PrintPagesAsRasterPDF(page_ranges, page_range_count,
return print_.PrintPagesAsRasterPdf(page_ranges, page_range_count,
print_settings, pdf_print_settings);
}
pp::Buffer_Dev PDFiumEngine::PrintPagesAsPDF(
pp::Buffer_Dev PDFiumEngine::PrintPagesAsPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
@ -1174,7 +1174,7 @@ pp::Buffer_Dev PDFiumEngine::PrintPagesAsPDF(
pages_[page_number]->Unload();
}
return print_.PrintPagesAsPDF(page_ranges, page_range_count, print_settings,
return print_.PrintPagesAsPdf(page_ranges, page_range_count, print_settings,
pdf_print_settings);
}

@ -300,13 +300,13 @@ class PDFiumEngine : public PDFEngine,
bool ExtendSelection(int page_index, int char_index);
pp::Buffer_Dev PrintPagesAsRasterPDF(
pp::Buffer_Dev PrintPagesAsRasterPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings);
pp::Buffer_Dev PrintPagesAsPDF(
pp::Buffer_Dev PrintPagesAsPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,

@ -16,7 +16,6 @@
#include "ppapi/c/private/ppp_pdf.h"
#include "printing/nup_parameters.h"
#include "printing/units.h"
#include "third_party/pdfium/public/cpp/fpdf_scopers.h"
#include "third_party/pdfium/public/fpdf_flatten.h"
#include "third_party/pdfium/public/fpdf_ppo.h"
#include "third_party/pdfium/public/fpdf_transformpage.h"
@ -166,6 +165,36 @@ void FitContentsToPrintableAreaIfRequired(
}
}
// Performs N-up PDF generation for |doc| based on |pages_per_sheet| and
// the parameters in |print_settings|.
// On success, returns the N-up version of |doc|. On failure, returns nullptr.
ScopedFPDFDocument NupPdfToPdf(FPDF_DOCUMENT doc,
uint32_t pages_per_sheet,
const PP_PrintSettings_Dev& print_settings) {
DCHECK(doc);
DCHECK(ShouldDoNup(pages_per_sheet));
PP_Size page_size = print_settings.paper_size;
printing::NupParameters nup_params;
bool is_landscape = PDFiumPrint::IsSourcePdfLandscape(doc);
nup_params.SetParameters(pages_per_sheet, is_landscape);
// Import n pages to one.
bool paper_is_landscape = page_size.width > page_size.height;
if (nup_params.landscape() != paper_is_landscape)
std::swap(page_size.width, page_size.height);
ScopedFPDFDocument output_doc_nup(FPDF_ImportNPagesToOne(
doc, page_size.width, page_size.height, nup_params.num_pages_on_x_axis(),
nup_params.num_pages_on_y_axis()));
if (output_doc_nup) {
FitContentsToPrintableAreaIfRequired(output_doc_nup.get(), 1.0f,
print_settings);
}
return output_doc_nup;
}
int GetBlockForJpeg(void* param,
unsigned long pos,
unsigned char* buf,
@ -218,6 +247,7 @@ std::vector<uint32_t> PDFiumPrint::GetPageNumbersFromPrintPageNumberRange(
return page_numbers;
}
// static
bool PDFiumPrint::IsSourcePdfLandscape(FPDF_DOCUMENT doc) {
DCHECK(doc);
@ -229,6 +259,7 @@ bool PDFiumPrint::IsSourcePdfLandscape(FPDF_DOCUMENT doc) {
return is_source_landscape;
}
// static
void PDFiumPrint::FitContentsToPrintableArea(FPDF_DOCUMENT doc,
const gfx::Size& page_size,
const gfx::Rect& printable_area) {
@ -242,7 +273,7 @@ void PDFiumPrint::FitContentsToPrintableArea(FPDF_DOCUMENT doc,
FitContentsToPrintableAreaIfRequired(doc, 1.0, print_settings);
}
pp::Buffer_Dev PDFiumPrint::PrintPagesAsRasterPDF(
pp::Buffer_Dev PDFiumPrint::PrintPagesAsRasterPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
@ -274,48 +305,47 @@ pp::Buffer_Dev PDFiumPrint::PrintPagesAsRasterPDF(
ScopedFPDFDocument output_doc(FPDF_CreateNewDocument());
DCHECK(output_doc);
size_t i = 0;
for (; i < pages_to_print.size(); ++i) {
for (size_t i = 0; i < pages_to_print.size(); ++i) {
double source_page_width = source_page_sizes[i].first;
double source_page_height = source_page_sizes[i].second;
// Use |temp_doc| to compress image by saving PDF to |buffer|.
pp::Buffer_Dev buffer;
// Use |temp_doc| to compress image by saving PDF to |temp_buffer|.
pp::Buffer_Dev temp_buffer;
{
ScopedFPDFDocument temp_doc(
ScopedFPDFDocument temp_doc =
CreateSinglePageRasterPdf(source_page_width, source_page_height,
print_settings, &pages_to_print[i]));
print_settings, &pages_to_print[i]);
if (!temp_doc)
break;
return pp::Buffer_Dev();
buffer = GetFlattenedPrintData(temp_doc.get());
temp_buffer = GetFlattenedPrintData(temp_doc.get());
}
PDFiumMemBufferFileRead file_read(buffer.data(), buffer.size());
PDFiumMemBufferFileRead file_read(temp_buffer.data(), temp_buffer.size());
ScopedFPDFDocument temp_doc(FPDF_LoadCustomDocument(&file_read, nullptr));
if (!FPDF_ImportPages(output_doc.get(), temp_doc.get(), "1", i))
break;
return pp::Buffer_Dev();
}
pp::Buffer_Dev buffer;
if (i == pages_to_print.size()) {
FPDF_CopyViewerPreferences(output_doc.get(), engine_->doc());
uint32_t pages_per_sheet = pdf_print_settings.pages_per_sheet;
uint32_t scale_factor = pdf_print_settings.scale_factor;
if (ShouldDoNup(pages_per_sheet)) {
buffer = NupPdfToPdf(output_doc.get(), pages_per_sheet, print_settings);
} else {
FitContentsToPrintableAreaIfRequired(
output_doc.get(), scale_factor / 100.0f, print_settings);
FPDF_CopyViewerPreferences(output_doc.get(), engine_->doc());
uint32_t pages_per_sheet = pdf_print_settings.pages_per_sheet;
if (ShouldDoNup(pages_per_sheet)) {
ScopedFPDFDocument doc = std::move(output_doc);
output_doc = NupPdfToPdf(doc.get(), pages_per_sheet, print_settings);
if (output_doc)
buffer = GetPrintData(output_doc.get());
}
} else {
double scale_factor = pdf_print_settings.scale_factor / 100.0;
FitContentsToPrintableAreaIfRequired(output_doc.get(), scale_factor,
print_settings);
buffer = GetPrintData(output_doc.get());
}
return buffer;
}
pp::Buffer_Dev PDFiumPrint::PrintPagesAsPDF(
pp::Buffer_Dev PDFiumPrint::PrintPagesAsPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
@ -333,13 +363,17 @@ pp::Buffer_Dev PDFiumPrint::PrintPagesAsPDF(
pp::Buffer_Dev buffer;
uint32_t pages_per_sheet = pdf_print_settings.pages_per_sheet;
uint32_t scale_factor = pdf_print_settings.scale_factor;
if (ShouldDoNup(pages_per_sheet)) {
if (FlattenPrintData(output_doc.get()))
buffer = NupPdfToPdf(output_doc.get(), pages_per_sheet, print_settings);
if (FlattenPrintData(output_doc.get())) {
ScopedFPDFDocument doc = std::move(output_doc);
output_doc = NupPdfToPdf(doc.get(), pages_per_sheet, print_settings);
if (output_doc)
buffer = GetPrintData(output_doc.get());
}
} else {
FitContentsToPrintableAreaIfRequired(output_doc.get(),
scale_factor / 100.0f, print_settings);
double scale_factor = pdf_print_settings.scale_factor / 100.0;
FitContentsToPrintableAreaIfRequired(output_doc.get(), scale_factor,
print_settings);
if (FlattenPrintData(output_doc.get()))
buffer = GetPrintData(output_doc.get());
}
@ -347,12 +381,12 @@ pp::Buffer_Dev PDFiumPrint::PrintPagesAsPDF(
return buffer;
}
FPDF_DOCUMENT PDFiumPrint::CreateSinglePageRasterPdf(
ScopedFPDFDocument PDFiumPrint::CreateSinglePageRasterPdf(
double source_page_width,
double source_page_height,
const PP_PrintSettings_Dev& print_settings,
PDFiumPage* page_to_print) {
FPDF_DOCUMENT temp_doc = FPDF_CreateNewDocument();
ScopedFPDFDocument temp_doc(FPDF_CreateNewDocument());
DCHECK(temp_doc);
const pp::Size& bitmap_size(page_to_print->rect().size());
@ -390,7 +424,7 @@ FPDF_DOCUMENT PDFiumPrint::CreateSinglePageRasterPdf(
// Add the bitmap to an image object and add the image object to the output
// page.
FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImageObj(temp_doc);
FPDF_PAGEOBJECT temp_img = FPDFPageObj_NewImageObj(temp_doc.get());
bool encoded = false;
std::vector<uint8_t> compressed_bitmap_data;
@ -408,7 +442,7 @@ FPDF_DOCUMENT PDFiumPrint::CreateSinglePageRasterPdf(
{
ScopedFPDFPage temp_page_holder(
FPDFPage_New(temp_doc, 0, source_page_width, source_page_height));
FPDFPage_New(temp_doc.get(), 0, source_page_width, source_page_height));
FPDF_PAGE temp_page = temp_page_holder.get();
if (encoded) {
FPDF_FILEACCESS file_access = {};
@ -431,36 +465,7 @@ FPDF_DOCUMENT PDFiumPrint::CreateSinglePageRasterPdf(
return temp_doc;
}
pp::Buffer_Dev PDFiumPrint::NupPdfToPdf(
FPDF_DOCUMENT doc,
uint32_t pages_per_sheet,
const PP_PrintSettings_Dev& print_settings) {
DCHECK(doc);
DCHECK(ShouldDoNup(pages_per_sheet));
PP_Size page_size = print_settings.paper_size;
printing::NupParameters nup_params;
bool is_landscape = IsSourcePdfLandscape(doc);
nup_params.SetParameters(pages_per_sheet, is_landscape);
// Import n pages to one.
bool paper_is_landscape = page_size.width > page_size.height;
if (nup_params.landscape() != paper_is_landscape)
std::swap(page_size.width, page_size.height);
ScopedFPDFDocument output_doc_nup(FPDF_ImportNPagesToOne(
doc, page_size.width, page_size.height, nup_params.num_pages_on_x_axis(),
nup_params.num_pages_on_y_axis()));
if (!output_doc_nup)
return pp::Buffer_Dev();
FitContentsToPrintableAreaIfRequired(output_doc_nup.get(), 1.0f,
print_settings);
return GetPrintData(output_doc_nup.get());
}
bool PDFiumPrint::FlattenPrintData(FPDF_DOCUMENT doc) {
bool PDFiumPrint::FlattenPrintData(FPDF_DOCUMENT doc) const {
DCHECK(doc);
ScopedSubstFont scoped_subst_font(engine_);
@ -474,7 +479,7 @@ bool PDFiumPrint::FlattenPrintData(FPDF_DOCUMENT doc) {
return true;
}
pp::Buffer_Dev PDFiumPrint::GetPrintData(FPDF_DOCUMENT doc) {
pp::Buffer_Dev PDFiumPrint::GetPrintData(FPDF_DOCUMENT doc) const {
DCHECK(doc);
pp::Buffer_Dev buffer;
@ -488,7 +493,7 @@ pp::Buffer_Dev PDFiumPrint::GetPrintData(FPDF_DOCUMENT doc) {
return buffer;
}
pp::Buffer_Dev PDFiumPrint::GetFlattenedPrintData(FPDF_DOCUMENT doc) {
pp::Buffer_Dev PDFiumPrint::GetFlattenedPrintData(FPDF_DOCUMENT doc) const {
DCHECK(doc);
pp::Buffer_Dev buffer;

@ -9,6 +9,7 @@
#include "base/macros.h"
#include "ppapi/cpp/dev/buffer_dev.h"
#include "third_party/pdfium/public/cpp/fpdf_scopers.h"
#include "third_party/pdfium/public/fpdfview.h"
struct PP_PdfPrintSettings_Dev;
@ -34,17 +35,6 @@ class PDFiumPrint {
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count);
pp::Buffer_Dev PrintPagesAsRasterPDF(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings);
pp::Buffer_Dev PrintPagesAsPDF(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings);
// Check the source doc orientation. Returns true if the doc is landscape.
// For now the orientation of the doc is determined by its first page's
// orientation. Improvement can be added in the future to better determine
@ -58,24 +48,27 @@ class PDFiumPrint {
const gfx::Size& page_size,
const gfx::Rect& printable_area);
pp::Buffer_Dev PrintPagesAsRasterPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings);
pp::Buffer_Dev PrintPagesAsPdf(
const PP_PrintPageNumberRange_Dev* page_ranges,
uint32_t page_range_count,
const PP_PrintSettings_Dev& print_settings,
const PP_PdfPrintSettings_Dev& pdf_print_settings);
private:
FPDF_DOCUMENT CreateSinglePageRasterPdf(
ScopedFPDFDocument CreateSinglePageRasterPdf(
double source_page_width,
double source_page_height,
const PP_PrintSettings_Dev& print_settings,
PDFiumPage* page_to_print);
// Perform N-up PDF generation from |doc| based on |pages_per_sheet| and
// the parameters in |print_settings|.
// On success, the returned buffer contains the N-up version of |doc|.
// On failure, the returned buffer is empty.
pp::Buffer_Dev NupPdfToPdf(FPDF_DOCUMENT doc,
uint32_t pages_per_sheet,
const PP_PrintSettings_Dev& print_settings);
bool FlattenPrintData(FPDF_DOCUMENT doc);
pp::Buffer_Dev GetPrintData(FPDF_DOCUMENT doc);
pp::Buffer_Dev GetFlattenedPrintData(FPDF_DOCUMENT doc);
bool FlattenPrintData(FPDF_DOCUMENT doc) const;
pp::Buffer_Dev GetPrintData(FPDF_DOCUMENT doc) const;
pp::Buffer_Dev GetFlattenedPrintData(FPDF_DOCUMENT doc) const;
PDFiumEngine* const engine_;