| 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(
|
|
|