Index: chrome/utility/printing_handler.cc |
diff --git a/chrome/utility/printing_handler.cc b/chrome/utility/printing_handler.cc |
index 436497d16c448e122a503ffd40baf32536ebb6b6..1d7727f6f18f5e07e5f29969be67bb0e80de768d 100644 |
--- a/chrome/utility/printing_handler.cc |
+++ b/chrome/utility/printing_handler.cc |
@@ -64,8 +64,8 @@ bool PrintingHandler::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(PrintingHandler, message) |
#if defined(OS_WIN) |
- IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles, |
- OnRenderPDFPagesToMetafile) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Start, |
+ OnRenderPDFPagesToMetafileStart) |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_GetPage, |
OnRenderPDFPagesToMetafileGetPage) |
IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafiles_Stop, |
@@ -85,7 +85,7 @@ bool PrintingHandler::OnMessageReceived(const IPC::Message& message) { |
} |
#if defined(OS_WIN) |
-void PrintingHandler::OnRenderPDFPagesToMetafile( |
+void PrintingHandler::OnRenderPDFPagesToMetafileStart( |
IPC::PlatformFileForTransit pdf_transit, |
const PdfRenderSettings& settings, |
bool print_text_with_gdi) { |
@@ -109,6 +109,8 @@ void PrintingHandler::OnRenderPDFPagesToMetafileGetPage( |
} |
void PrintingHandler::OnRenderPDFPagesToMetafileStop() { |
+ chrome_pdf::ReleasePDFHandle(pdf_handle_); |
+ pdf_handle_ = nullptr; |
ReleaseProcessIfNeeded(); |
} |
@@ -134,6 +136,8 @@ void PrintingHandler::OnRenderPDFPagesToPWGRaster( |
#if defined(OS_WIN) |
int PrintingHandler::LoadPDF(base::File pdf_file) { |
+ DCHECK(!pdf_handle_); |
+ |
int64_t length64 = pdf_file.GetLength(); |
if (length64 <= 0 || length64 > std::numeric_limits<int>::max()) |
return 0; |
@@ -145,7 +149,7 @@ int PrintingHandler::LoadPDF(base::File pdf_file) { |
int total_page_count = 0; |
if (!chrome_pdf::GetPDFDocInfo(&pdf_data_.front(), pdf_data_.size(), |
- &total_page_count, nullptr)) { |
+ &total_page_count, nullptr, &pdf_handle_)) { |
return 0; |
} |
return total_page_count; |
@@ -174,19 +178,11 @@ bool PrintingHandler::RenderPdfPageToMetafile(int page_number, |
// to StartPage. |
metafile.StartPage(gfx::Size(), gfx::Rect(), 1); |
if (!chrome_pdf::RenderPDFPageToDC( |
- &pdf_data_.front(), |
- pdf_data_.size(), |
- page_number, |
- metafile.context(), |
- pdf_rendering_settings_.dpi(), |
- pdf_rendering_settings_.area().x(), |
+ pdf_handle_, page_number, metafile.context(), |
+ 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_.area().height(), true, false, true, true, |
pdf_rendering_settings_.autorotate())) { |
return false; |
} |
@@ -215,8 +211,9 @@ bool PrintingHandler::RenderPDFPagesToPWGRaster( |
return false; |
int total_page_count = 0; |
+ void* pdf_handle = nullptr; |
if (!chrome_pdf::GetPDFDocInfo(data.data(), data_size, &total_page_count, |
- nullptr)) { |
+ nullptr, &pdf_handle)) { |
return false; |
} |
@@ -225,11 +222,14 @@ bool PrintingHandler::RenderPDFPagesToPWGRaster( |
encoder.EncodeDocumentHeader(&pwg_header); |
int bytes_written = bitmap_file.WriteAtCurrentPos(pwg_header.data(), |
pwg_header.size()); |
- if (bytes_written != static_cast<int>(pwg_header.size())) |
+ if (bytes_written != static_cast<int>(pwg_header.size())) { |
+ chrome_pdf::ReleasePDFHandle(pdf_handle); |
return false; |
+ } |
cloud_print::BitmapImage image(settings.area().size(), |
cloud_print::BitmapImage::BGRA); |
+ bool ret = true; |
for (int i = 0; i < total_page_count; ++i) { |
int page_number = i; |
@@ -237,15 +237,11 @@ bool PrintingHandler::RenderPDFPagesToPWGRaster( |
page_number = total_page_count - 1 - page_number; |
} |
- if (!chrome_pdf::RenderPDFPageToBitmap(data.data(), |
- data_size, |
- page_number, |
- image.pixel_data(), |
- image.size().width(), |
- image.size().height(), |
- settings.dpi(), |
- autoupdate)) { |
- return false; |
+ if (!chrome_pdf::RenderPDFPageToBitmap( |
+ pdf_handle, page_number, image.pixel_data(), image.size().width(), |
+ image.size().height(), settings.dpi(), autoupdate)) { |
+ ret = false; |
+ break; |
} |
cloud_print::PwgHeaderInfo header_info; |
@@ -276,14 +272,19 @@ bool PrintingHandler::RenderPDFPagesToPWGRaster( |
} |
std::string pwg_page; |
- if (!encoder.EncodePage(image, header_info, &pwg_page)) |
- return false; |
+ if (!encoder.EncodePage(image, header_info, &pwg_page)) { |
+ ret = false; |
+ break; |
+ } |
bytes_written = bitmap_file.WriteAtCurrentPos(pwg_page.data(), |
pwg_page.size()); |
- if (bytes_written != static_cast<int>(pwg_page.size())) |
- return false; |
+ if (bytes_written != static_cast<int>(pwg_page.size())) { |
+ ret = false; |
+ break; |
+ } |
} |
- return true; |
+ chrome_pdf::ReleasePDFHandle(pdf_handle); |
+ return ret; |
} |
void PrintingHandler::OnGetPrinterCapsAndDefaults( |