Chromium Code Reviews| Index: chrome/browser/printing/print_job.cc |
| diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc |
| index 70bdb9004589a6d943d0d19c9ef62c9328cff8eb..611e3b213fdd6b5b75fd209ee3025d47d5bb9229 100644 |
| --- a/chrome/browser/printing/print_job.cc |
| +++ b/chrome/browser/printing/print_job.cc |
| @@ -235,10 +235,8 @@ class PrintJob::PdfToEmfState { |
| void Start(const scoped_refptr<base::RefCountedMemory>& data, |
| const PdfRenderSettings& conversion_settings, |
| - bool print_text_with_gdi, |
| const PdfToEmfConverter::StartCallback& start_callback) { |
| - converter_->Start(data, conversion_settings, print_text_with_gdi, |
| - start_callback); |
| + converter_->Start(data, conversion_settings, start_callback); |
| } |
| void GetMorePages( |
| @@ -261,8 +259,8 @@ class PrintJob::PdfToEmfState { |
| } |
| void set_page_count(int page_count) { page_count_ = page_count; } |
| - gfx::Size page_size() const { return page_size_; } |
| - gfx::Rect content_area() const { return content_area_; } |
| + const gfx::Size& page_size() const { return page_size_; } |
| + const gfx::Rect& content_area() const { return content_area_; } |
| private: |
| int page_count_; |
| @@ -273,6 +271,48 @@ class PrintJob::PdfToEmfState { |
| std::unique_ptr<PdfToEmfConverter> converter_; |
| }; |
| +class PrintJob::PdfToPostScriptState { |
| + public: |
| + PdfToPostScriptState() |
| + : page_count_(0), |
| + current_page_(0), |
| + pages_in_progress_(0), |
| + converter_(PdfToPostScriptConverter::CreateDefault()) {} |
| + |
| + void Start(const scoped_refptr<base::RefCountedMemory>& data, |
| + const PdfRenderSettings& conversion_settings, |
| + const PdfToPostScriptConverter::StartCallback& start_callback) { |
| + converter_->Start(data, conversion_settings, start_callback); |
| + } |
| + |
| + void GetMorePages( |
| + const PdfToPostScriptConverter::GetPageCallback& get_page_callback) { |
| + const int kMaxNumberOfTempFilesPerDocument = 3; |
| + while (pages_in_progress_ < kMaxNumberOfTempFilesPerDocument && |
| + current_page_ < page_count_) { |
| + ++pages_in_progress_; |
| + converter_->GetPage(current_page_++, get_page_callback); |
| + } |
| + } |
| + |
| + void OnPageProcessed( |
| + const PdfToPostScriptConverter::GetPageCallback& get_page_callback) { |
| + --pages_in_progress_; |
| + GetMorePages(get_page_callback); |
| + // Release converter if we don't need this any more. |
| + if (!pages_in_progress_ && current_page_ >= page_count_) |
| + converter_.reset(); |
|
dsinclair
2017/01/17 17:10:00
Shoudl this be .reset(PdfToPostScriptConverter::Cr
|
| + } |
| + |
| + void set_page_count(int page_count) { page_count_ = page_count; } |
| + |
| + private: |
| + int page_count_; |
| + int current_page_; |
| + int pages_in_progress_; |
| + std::unique_ptr<PdfToPostScriptConverter> converter_; |
| +}; |
| + |
| void PrintJob::AppendPrintedPage(int page_number) { |
| pdf_page_mapping_.push_back(page_number); |
| } |
| @@ -285,9 +325,12 @@ void PrintJob::StartPdfToEmfConversion( |
| DCHECK(!pdf_to_emf_state_); |
| pdf_to_emf_state_ = base::MakeUnique<PdfToEmfState>(page_size, content_area); |
| const int kPrinterDpi = settings().dpi(); |
| - pdf_to_emf_state_->Start( |
| - bytes, PdfRenderSettings(content_area, kPrinterDpi, true), |
| - print_text_with_gdi, base::Bind(&PrintJob::OnPdfToEmfStarted, this)); |
| + PdfRenderSettings settings( |
| + content_area, gfx::Point(0, 0), kPrinterDpi, true /* autorotate? */, |
| + print_text_with_gdi ? PdfRenderSettings::Mode::GDI_TEXT |
| + : PdfRenderSettings::Mode::NORMAL); |
| + pdf_to_emf_state_->Start(bytes, settings, |
| + base::Bind(&PrintJob::OnPdfToEmfStarted, this)); |
| } |
| void PrintJob::OnPdfToEmfStarted(int page_count) { |
| @@ -321,7 +364,54 @@ void PrintJob::OnPdfToEmfPageConverted(int page_number, |
| base::Bind(&PrintJob::OnPdfToEmfPageConverted, this)); |
| } |
| -#endif // OS_WIN |
| +void PrintJob::StartPdfToPostScriptConversion( |
| + const scoped_refptr<base::RefCountedMemory>& bytes, |
| + const gfx::Rect& content_area, |
| + const gfx::Point& physical_offsets, |
| + bool ps_level2) { |
| + DCHECK(!pdf_to_ps_state_); |
| + pdf_to_ps_state_ = base::MakeUnique<PdfToPostScriptState>(); |
| + const int kPrinterDpi = settings().dpi(); |
| + PdfRenderSettings settings( |
| + content_area, physical_offsets, kPrinterDpi, true /* autorotate? */, |
| + ps_level2 ? PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2 |
| + : PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3); |
| + pdf_to_ps_state_->Start( |
| + bytes, settings, base::Bind(&PrintJob::OnPdfToPostScriptStarted, this)); |
| +} |
| + |
| +void PrintJob::OnPdfToPostScriptStarted(int page_count) { |
| + if (page_count <= 0) { |
| + pdf_to_ps_state_.reset(); |
| + Cancel(); |
| + return; |
| + } |
| + pdf_to_ps_state_->set_page_count(page_count); |
| + pdf_to_ps_state_->GetMorePages( |
| + base::Bind(&PrintJob::OnPdfToPostScriptPageConverted, this)); |
| +} |
| + |
| +void PrintJob::OnPdfToPostScriptPageConverted( |
| + int page_number, |
| + std::unique_ptr<MetafilePlayer> ps_metafile) { |
| + DCHECK(pdf_to_ps_state_); |
| + if (!document_.get() || !ps_metafile || page_number < 0 || |
| + static_cast<size_t>(page_number) >= pdf_page_mapping_.size()) { |
| + pdf_to_ps_state_.reset(); |
| + Cancel(); |
| + return; |
| + } |
| + |
| + // Update the rendered document. It will send notifications to the listener. |
| + document_->SetPage(pdf_page_mapping_[page_number], std::move(ps_metafile), |
| + 0 /* dummy shrink_factor */, |
| + gfx::Size() /* dummy page_size */, |
| + gfx::Rect() /* dummy page_content_rect */); |
| + |
| + pdf_to_ps_state_->GetMorePages( |
| + base::Bind(&PrintJob::OnPdfToPostScriptPageConverted, this)); |
| +} |
| +#endif // defined(OS_WIN) |
| void PrintJob::UpdatePrintedDocument(PrintedDocument* new_document) { |
| if (document_.get() == new_document) |
| @@ -372,9 +462,14 @@ void PrintJob::OnNotifyPrintJobEvent(const JobEventDetails& event_details) { |
| } |
| case JobEventDetails::PAGE_DONE: |
| #if defined(OS_WIN) |
| - pdf_to_emf_state_->OnPageProcessed( |
| - base::Bind(&PrintJob::OnPdfToEmfPageConverted, this)); |
| -#endif // defined(OS_WIN) |
| + if (pdf_to_emf_state_) { |
| + pdf_to_emf_state_->OnPageProcessed( |
| + base::Bind(&PrintJob::OnPdfToEmfPageConverted, this)); |
| + } else { |
| + pdf_to_ps_state_->OnPageProcessed( |
| + base::Bind(&PrintJob::OnPdfToPostScriptPageConverted, this)); |
| + } |
| +#endif |
| break; |
| default: { |
| NOTREACHED(); |