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

Unified Diff: chrome/utility/printing_handler.cc

Issue 566693002: Use file handles to interact with utility process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Wed Sep 17 10:40:51 PDT 2014 Created 6 years, 3 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
« no previous file with comments | « chrome/utility/printing_handler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/utility/printing_handler.cc
diff --git a/chrome/utility/printing_handler.cc b/chrome/utility/printing_handler.cc
index 7264e25060fa92e9b6a9b13ddba476c7b4c22d1d..9b576324508e430876a67e2948a2f9b01d8730ea 100644
--- a/chrome/utility/printing_handler.cc
+++ b/chrome/utility/printing_handler.cc
@@ -262,6 +262,10 @@ bool PrintingHandler::OnMessageReceived(const IPC::Message& message) {
#if defined(OS_WIN)
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles,
OnRenderPDFPagesToMetafile)
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage,
+ OnRenderPDFPagesToMetafileGetPage)
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop,
+ OnRenderPDFPagesToMetafileStop)
#endif // OS_WIN
#if defined(ENABLE_FULL_PRINTING)
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
@@ -279,31 +283,29 @@ bool PrintingHandler::OnMessageReceived(const IPC::Message& message) {
#if defined(OS_WIN)
void PrintingHandler::OnRenderPDFPagesToMetafile(
IPC::PlatformFileForTransit pdf_transit,
- const base::FilePath& metafile_path,
- const printing::PdfRenderSettings& settings,
- const std::vector<printing::PageRange>& page_ranges_const) {
- bool succeeded = false;
+ const printing::PdfRenderSettings& settings) {
+ pdf_rendering_settings_ = settings;
base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit);
- int highest_rendered_page_number = 0;
+ int page_count = LoadPDF(pdf_file.Pass());
+ Send(
+ new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count));
+}
+
+void PrintingHandler::OnRenderPDFPagesToMetafileGetPage(
+ int page_number,
+ IPC::PlatformFileForTransit output_file) {
+ base::File emf_file = IPC::PlatformFileForTransitToFile(output_file);
double scale_factor = 1.0;
- std::vector<printing::PageRange> page_ranges = page_ranges_const;
- succeeded = RenderPDFToWinMetafile(pdf_file.Pass(),
- metafile_path,
- settings,
- &page_ranges,
- &highest_rendered_page_number,
- &scale_factor);
- if (succeeded) {
- // TODO(vitalybuka|scottmg): http://crbug.com/170859. These could
- // potentially be sent as each page is converted so that the spool could
- // start sooner.
- Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_Succeeded(
- page_ranges, scale_factor));
- } else {
- Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed());
- }
+ bool success =
+ RenderPdfPageToMetafile(page_number, emf_file.Pass(), &scale_factor);
+ Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone(
+ success, scale_factor));
+}
+
+void PrintingHandler::OnRenderPDFPagesToMetafileStop() {
ReleaseProcessIfNeeded();
}
+
#endif // OS_WIN
#if defined(ENABLE_FULL_PRINTING)
@@ -325,88 +327,71 @@ void PrintingHandler::OnRenderPDFPagesToPWGRaster(
#endif // ENABLE_FULL_PRINTING
#if defined(OS_WIN)
-bool PrintingHandler::RenderPDFToWinMetafile(
- base::File pdf_file,
- const base::FilePath& metafile_path,
- const printing::PdfRenderSettings& settings,
- std::vector<printing::PageRange>* page_ranges,
- int* highest_rendered_page_number,
- double* scale_factor) {
- DCHECK(page_ranges);
- *highest_rendered_page_number = -1;
- *scale_factor = 1.0;
-
+int PrintingHandler::LoadPDF(base::File pdf_file) {
if (!g_pdf_lib.Get().IsValid())
- return false;
+ return 0;
- // TODO(sanjeevr): Add a method to the PDF DLL that takes in a file handle
- // and a page range array. That way we don't need to read the entire PDF into
- // memory.
int64 length = pdf_file.GetLength();
if (length < 0)
- return false;
+ return 0;
- std::vector<char> buffer;
- buffer.resize(length);
- if (length != pdf_file.Read(0, &buffer.front(), length))
- return false;
+ pdf_data_.resize(length);
+ if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size()))
+ return 0;
int total_page_count = 0;
- if (!g_pdf_lib.Get().GetPDFDocInfo(&buffer.front(), buffer.size(),
- &total_page_count, NULL)) {
- return false;
- }
-
- // If no range supplied, do all pages.
- if (page_ranges->empty()) {
- printing::PageRange page_range_all;
- page_range_all.from = 0;
- page_range_all.to = total_page_count - 1;
- page_ranges->push_back(page_range_all);
+ if (!g_pdf_lib.Get().GetPDFDocInfo(
+ &pdf_data_.front(), pdf_data_.size(), &total_page_count, NULL)) {
+ return 0;
}
+ return total_page_count;
+}
- bool ret = false;
- std::vector<printing::PageRange>::const_iterator iter;
- for (iter = page_ranges->begin(); iter != page_ranges->end(); ++iter) {
- for (int page_number = iter->from; page_number <= iter->to; ++page_number) {
- if (page_number >= total_page_count)
- break;
-
- printing::Emf metafile;
- metafile.InitToFile(metafile_path.InsertBeforeExtensionASCII(
- base::StringPrintf(".%d", page_number)));
-
- // We need to scale down DC to fit an entire page into DC available area.
- // Current metafile is based on screen DC and have current screen size.
- // Writing outside of those boundaries will result in the cut-off output.
- // On metafiles (this is the case here), scaling down will still record
- // original coordinates and we'll be able to print in full resolution.
- // Before playback we'll need to counter the scaling up that will happen
- // in the service (print_system_win.cc).
- *scale_factor = gfx::CalculatePageScale(metafile.context(),
- settings.area().right(),
- settings.area().bottom());
- gfx::ScaleDC(metafile.context(), *scale_factor);
-
- // The underlying metafile is of type Emf and ignores the arguments passed
- // to StartPage.
- metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
- if (g_pdf_lib.Get().RenderPDFPageToDC(
- &buffer.front(), buffer.size(), page_number, metafile.context(),
- settings.dpi(), settings.dpi(), settings.area().x(),
- settings.area().y(), settings.area().width(),
- settings.area().height(), true, false, true, true,
- settings.autorotate())) {
- if (*highest_rendered_page_number < page_number)
- *highest_rendered_page_number = page_number;
- ret = true;
- }
- metafile.FinishPage();
- metafile.FinishDocument();
- }
+bool PrintingHandler::RenderPdfPageToMetafile(int page_number,
+ base::File output_file,
+ double* scale_factor) {
+ printing::Emf metafile;
+ metafile.Init();
+
+ // We need to scale down DC to fit an entire page into DC available area.
+ // Current metafile is based on screen DC and have current screen size.
+ // Writing outside of those boundaries will result in the cut-off output.
+ // On metafiles (this is the case here), scaling down will still record
+ // original coordinates and we'll be able to print in full resolution.
+ // Before playback we'll need to counter the scaling up that will happen
+ // in the service (print_system_win.cc).
+ *scale_factor =
+ gfx::CalculatePageScale(metafile.context(),
+ pdf_rendering_settings_.area().right(),
+ pdf_rendering_settings_.area().bottom());
+ gfx::ScaleDC(metafile.context(), *scale_factor);
+
+ // The underlying metafile is of type Emf and ignores the arguments passed
+ // to StartPage.
+ metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
+ if (!g_pdf_lib.Get().RenderPDFPageToDC(
+ &pdf_data_.front(),
+ pdf_data_.size(),
+ page_number,
+ metafile.context(),
+ pdf_rendering_settings_.dpi(),
+ pdf_rendering_settings_.dpi(),
+ pdf_rendering_settings_.area().x(),
+ pdf_rendering_settings_.area().y(),
+ pdf_rendering_settings_.area().width(),
+ pdf_rendering_settings_.area().height(),
+ true,
+ false,
+ true,
+ true,
+ pdf_rendering_settings_.autorotate())) {
+ return false;
}
- return ret;
+ metafile.FinishPage();
+ metafile.FinishDocument();
+ return metafile.SaveTo(&output_file);
}
+
#endif // OS_WIN
#if defined(ENABLE_FULL_PRINTING)
« no previous file with comments | « chrome/utility/printing_handler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698