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