Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(339)

Unified Diff: chrome/browser/printing/print_job.cc

Issue 2633573002: Add Postscript Printing (Closed)
Patch Set: Fix Linux compile error Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698