Chromium Code Reviews| Index: chrome/utility/chrome_content_utility_client.cc |
| diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc |
| index 7390adb3e50d85838ae4d1e3f79037af7f2f7723..465698f4114aabc710ed665b5bf4133b6f829319 100644 |
| --- a/chrome/utility/chrome_content_utility_client.cc |
| +++ b/chrome/utility/chrome_content_utility_client.cc |
| @@ -365,6 +365,8 @@ bool ChromeContentUtilityClient::OnMessageReceived( |
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64) |
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile, |
| OnRenderPDFPagesToMetafile) |
| + IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafileHandles, |
| + OnRenderPDFPagesToMetafileHandles) |
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster, |
| OnRenderPDFPagesToPWGRaster) |
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage, |
| @@ -590,6 +592,36 @@ void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile( |
| ReleaseProcessIfNeeded(); |
| } |
| +void ChromeContentUtilityClient::OnRenderPDFPagesToMetafileHandles( |
| + IPC::PlatformFileForTransit pdf_transit, |
| + IPC::PlatformFileForTransit metafile_transit, |
| + const printing::PdfRenderSettings& settings, |
| + const std::vector<printing::PageRange>& page_ranges) { |
| + bool succeeded = false; |
| +#if defined(OS_WIN) |
| + int highest_rendered_page_number = 0; |
| + double scale_factor = 1.0; |
| + base::PlatformFile pdf = |
| + IPC::PlatformFileForTransitToPlatformFile(pdf_transit); |
| + base::PlatformFile metafile = |
| + IPC::PlatformFileForTransitToPlatformFile(metafile_transit); |
| + succeeded = RenderPDFToWinMetafileHandles(pdf, |
| + metafile, |
| + settings, |
| + page_ranges, |
| + &highest_rendered_page_number, |
| + &scale_factor); |
| + if (succeeded) { |
| + Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded( |
| + highest_rendered_page_number, scale_factor)); |
| + } |
| +#endif // defined(OS_WIN) |
| + if (!succeeded) { |
| + Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed()); |
| + } |
| + ReleaseProcessIfNeeded(); |
| +} |
| + |
| void ChromeContentUtilityClient::OnRenderPDFPagesToPWGRaster( |
| IPC::PlatformFileForTransit pdf_transit, |
| const printing::PdfRenderSettings& settings, |
| @@ -615,6 +647,24 @@ bool ChromeContentUtilityClient::RenderPDFToWinMetafile( |
| const std::vector<printing::PageRange>& page_ranges, |
| int* highest_rendered_page_number, |
| double* scale_factor) { |
| + base::File metafile; |
| + metafile.Initialize(metafile_path, |
| + base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_APPEND); |
| + return RenderPDFToWinMetafileHandles(pdf_file, |
| + metafile.GetPlatformFile(), |
| + settings, |
| + page_ranges, |
| + highest_rendered_page_number, |
| + scale_factor); |
| +} |
| + |
| +bool ChromeContentUtilityClient::RenderPDFToWinMetafileHandles( |
| + base::PlatformFile pdf_file, |
| + base::PlatformFile metafile_file, |
| + const printing::PdfRenderSettings& settings, |
| + const std::vector<printing::PageRange>& page_ranges, |
| + int* highest_rendered_page_number, |
| + double* scale_factor) { |
| *highest_rendered_page_number = -1; |
| *scale_factor = 1.0; |
| base::win::ScopedHandle file(pdf_file); |
| @@ -644,7 +694,7 @@ bool ChromeContentUtilityClient::RenderPDFToWinMetafile( |
| } |
| printing::Emf metafile; |
| - metafile.InitToFile(metafile_path); |
| + 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. |
| @@ -680,6 +730,13 @@ bool ChromeContentUtilityClient::RenderPDFToWinMetafile( |
| } |
| } |
| metafile.FinishDocument(); |
| + |
| + uint32 final_size = metafile.GetDataSize(); |
| + scoped_ptr<char[]> final_buffer(new char[final_size]); |
| + CHECK(metafile.GetData(final_buffer.get(), final_size)); |
| + CHECK_EQ(static_cast<int>(final_size), |
|
Vitaly Buka (NO REVIEWS)
2014/04/25 22:35:24
This could be huge, metafile keeps images uncompre
scottmg
2014/04/25 23:07:18
Sorry, I'm not sure what you mean here. You mean c
Vitaly Buka (NO REVIEWS)
2014/04/28 06:47:33
It's not about rasterize.
You don't need to try t
Vitaly Buka (NO REVIEWS)
2014/04/28 06:49:07
base::WritePlatformFile -> base::WritePlatformFile
|
| + base::WritePlatformFile( |
| + metafile_file, 0, final_buffer.get(), final_size)); |
| return ret; |
| } |
| #endif // defined(OS_WIN) |