| 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 1ca9c94f4627ae2a1d24b09ca4ea12bcb5ef532c..ecd9ac50506ceae9f492ad95a6290c5f6f138fcc 100644
|
| --- a/chrome/utility/chrome_content_utility_client.cc
|
| +++ b/chrome/utility/chrome_content_utility_client.cc
|
| @@ -170,7 +170,7 @@ class PdfFunctionsBase {
|
| const base::FilePath& pdf_module_path,
|
| const base::ScopedNativeLibrary& pdf_lib) {
|
| return true;
|
| - };
|
| + }
|
|
|
| private:
|
| // Exported by PDF plugin.
|
| @@ -365,6 +365,8 @@ bool ChromeContentUtilityClient::OnMessageReceived(
|
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_DecodeImageBase64, OnDecodeImageBase64)
|
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToMetafile,
|
| OnRenderPDFPagesToMetafile)
|
| + IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFToMetafile,
|
| + OnRenderPDFToMetafile)
|
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RenderPDFPagesToPWGRaster,
|
| OnRenderPDFPagesToPWGRaster)
|
| IPC_MESSAGE_HANDLER(ChromeUtilityMsg_RobustJPEGDecodeImage,
|
| @@ -590,6 +592,69 @@ void ChromeContentUtilityClient::OnRenderPDFPagesToMetafile(
|
| ReleaseProcessIfNeeded();
|
| }
|
|
|
| +#if defined(OS_WIN)
|
| +void ChromeContentUtilityClient::OnRenderPDFToMetafile(
|
| + base::PlatformFile pdf_transit,
|
| + const base::FilePath& metafile_path,
|
| + const printing::PdfRenderSettings& settings) {
|
| + base::PlatformFile pdf_file =
|
| + IPC::PlatformFileForTransitToPlatformFile(pdf_transit);
|
| + bool succeeded = false;
|
| + int highest_rendered_page_number = -1;
|
| + double scale_factor = 1.0;
|
| +
|
| + if (!g_pdf_lib.Get().IsValid())
|
| + return;
|
| +
|
| + DWORD length = ::GetFileSize(pdf_file, NULL);
|
| + if (length == INVALID_FILE_SIZE)
|
| + return;
|
| +
|
| + std::vector<uint8> buffer;
|
| + buffer.resize(length);
|
| + DWORD bytes_read = 0;
|
| + if (!ReadFile(pdf_file, &buffer.front(), length, &bytes_read, NULL) ||
|
| + (bytes_read != length)) {
|
| + return;
|
| + }
|
| +
|
| + int total_page_count = 0;
|
| + if (!g_pdf_lib.Get().GetPDFDocInfo(&buffer.front(), buffer.size(),
|
| + &total_page_count, NULL)) {
|
| + return;
|
| + }
|
| +
|
| + for (int i = 0; i < total_page_count; ++i) {
|
| + printing::Emf metafile;
|
| + metafile.InitToFile(
|
| + metafile_path.InsertBeforeExtensionASCII(base::StringPrintf(".%d", i)));
|
| + scale_factor = gfx::CalculatePageScale(
|
| + metafile.context(), settings.area().right(), settings.area().bottom());
|
| + gfx::ScaleDC(metafile.context(), scale_factor);
|
| + metafile.StartPage(gfx::Size(), gfx::Rect(), 1);
|
| + if (g_pdf_lib.Get().RenderPDFPageToDC(
|
| + &buffer.front(), buffer.size(), i, 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 < i)
|
| + highest_rendered_page_number = i;
|
| + }
|
| + metafile.FinishPage();
|
| + metafile.FinishDocument();
|
| + }
|
| +
|
| + if (highest_rendered_page_number >= 0) {
|
| + Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Succeeded(
|
| + highest_rendered_page_number, scale_factor));
|
| + } else {
|
| + Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafile_Failed());
|
| + }
|
| + ReleaseProcessIfNeeded();
|
| +}
|
| +#endif // defined(OS_WIN)
|
| +
|
| void ChromeContentUtilityClient::OnRenderPDFPagesToPWGRaster(
|
| IPC::PlatformFileForTransit pdf_transit,
|
| const printing::PdfRenderSettings& settings,
|
|
|