OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/utility/printing_handler.h" | 5 #include "chrome/utility/printing_handler.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 IPC_MESSAGE_UNHANDLED(handled = false) | 82 IPC_MESSAGE_UNHANDLED(handled = false) |
83 IPC_END_MESSAGE_MAP() | 83 IPC_END_MESSAGE_MAP() |
84 return handled; | 84 return handled; |
85 } | 85 } |
86 | 86 |
87 #if defined(OS_WIN) | 87 #if defined(OS_WIN) |
88 void PrintingHandler::OnRenderPDFPagesToMetafile( | 88 void PrintingHandler::OnRenderPDFPagesToMetafile( |
89 IPC::PlatformFileForTransit pdf_transit, | 89 IPC::PlatformFileForTransit pdf_transit, |
90 const PdfRenderSettings& settings) { | 90 const PdfRenderSettings& settings) { |
91 pdf_rendering_settings_ = settings; | 91 pdf_rendering_settings_ = settings; |
92 chrome_pdf::SetPDFPostscriptPrintingLevel(0); // Not using postscript. | |
92 chrome_pdf::SetPDFUseGDIPrinting(pdf_rendering_settings_.mode == | 93 chrome_pdf::SetPDFUseGDIPrinting(pdf_rendering_settings_.mode == |
93 PdfRenderSettings::Mode::GDI_TEXT); | 94 PdfRenderSettings::Mode::GDI_TEXT); |
95 if (pdf_rendering_settings_.mode == | |
96 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2) { | |
97 chrome_pdf::SetPDFPostscriptPrintingLevel(2); | |
98 } else if (pdf_rendering_settings_.mode == | |
99 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3) { | |
100 chrome_pdf::SetPDFPostscriptPrintingLevel(3); | |
101 } | |
94 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); | 102 base::File pdf_file = IPC::PlatformFileForTransitToFile(pdf_transit); |
95 int page_count = LoadPDF(std::move(pdf_file)); | 103 int page_count = LoadPDF(std::move(pdf_file)); |
96 Send( | 104 Send( |
97 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count)); | 105 new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageCount(page_count)); |
98 } | 106 } |
99 | 107 |
100 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage( | 108 void PrintingHandler::OnRenderPDFPagesToMetafileGetPage( |
101 int page_number, | 109 int page_number, |
102 IPC::PlatformFileForTransit output_file) { | 110 IPC::PlatformFileForTransit output_file) { |
103 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file); | 111 base::File emf_file = IPC::PlatformFileForTransitToFile(output_file); |
104 float scale_factor = 1.0f; | 112 float scale_factor = 1.0f; |
105 bool success = | 113 bool success = false; |
106 RenderPdfPageToMetafile(page_number, std::move(emf_file), &scale_factor); | 114 if (pdf_rendering_settings_.mode == |
115 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL2 || | |
116 pdf_rendering_settings_.mode == | |
117 PdfRenderSettings::Mode::POSTSCRIPT_LEVEL3) { | |
118 success = RenderPdfPageToPostScript(page_number, std::move(emf_file)); | |
Nico
2017/01/31 20:17:42
add comment why scale factor of 1 is always right
rbpotter
2017/02/01 01:09:00
Done.
| |
119 } else { | |
120 success = RenderPdfPageToMetafile(page_number, std::move(emf_file), | |
121 &scale_factor); | |
122 } | |
123 | |
107 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone( | 124 Send(new ChromeUtilityHostMsg_RenderPDFPagesToMetafiles_PageDone( |
108 success, scale_factor)); | 125 success, scale_factor)); |
109 } | 126 } |
110 | 127 |
111 void PrintingHandler::OnRenderPDFPagesToMetafileStop() { | 128 void PrintingHandler::OnRenderPDFPagesToMetafileStop() { |
112 ReleaseProcessIfNeeded(); | 129 ReleaseProcessIfNeeded(); |
113 } | 130 } |
114 | 131 |
115 #endif // OS_WIN | 132 #endif // defined(OS_WIN) |
116 | 133 |
117 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) | 134 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) |
118 void PrintingHandler::OnRenderPDFPagesToPWGRaster( | 135 void PrintingHandler::OnRenderPDFPagesToPWGRaster( |
119 IPC::PlatformFileForTransit pdf_transit, | 136 IPC::PlatformFileForTransit pdf_transit, |
120 const PdfRenderSettings& settings, | 137 const PdfRenderSettings& settings, |
121 const PwgRasterSettings& bitmap_settings, | 138 const PwgRasterSettings& bitmap_settings, |
122 IPC::PlatformFileForTransit bitmap_transit) { | 139 IPC::PlatformFileForTransit bitmap_transit) { |
123 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit); | 140 base::File pdf = IPC::PlatformFileForTransitToFile(pdf_transit); |
124 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit); | 141 base::File bitmap = IPC::PlatformFileForTransitToFile(bitmap_transit); |
125 if (RenderPDFPagesToPWGRaster(std::move(pdf), settings, bitmap_settings, | 142 if (RenderPDFPagesToPWGRaster(std::move(pdf), settings, bitmap_settings, |
126 std::move(bitmap))) { | 143 std::move(bitmap))) { |
127 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded()); | 144 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Succeeded()); |
128 } else { | 145 } else { |
129 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); | 146 Send(new ChromeUtilityHostMsg_RenderPDFPagesToPWGRaster_Failed()); |
130 } | 147 } |
131 ReleaseProcessIfNeeded(); | 148 ReleaseProcessIfNeeded(); |
132 } | 149 } |
133 #endif // ENABLE_PRINT_PREVIEW | 150 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) |
134 | 151 |
135 #if defined(OS_WIN) | 152 #if defined(OS_WIN) |
136 int PrintingHandler::LoadPDF(base::File pdf_file) { | 153 int PrintingHandler::LoadPDF(base::File pdf_file) { |
137 int64_t length64 = pdf_file.GetLength(); | 154 int64_t length64 = pdf_file.GetLength(); |
138 if (length64 <= 0 || length64 > std::numeric_limits<int>::max()) | 155 if (length64 <= 0 || length64 > std::numeric_limits<int>::max()) |
139 return 0; | 156 return 0; |
140 int length = static_cast<int>(length64); | 157 int length = static_cast<int>(length64); |
141 | 158 |
142 pdf_data_.resize(length); | 159 pdf_data_.resize(length); |
143 if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size())) | 160 if (length != pdf_file.Read(0, pdf_data_.data(), pdf_data_.size())) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 pdf_rendering_settings_.area.y(), | 195 pdf_rendering_settings_.area.y(), |
179 pdf_rendering_settings_.area.width(), | 196 pdf_rendering_settings_.area.width(), |
180 pdf_rendering_settings_.area.height(), true, false, true, true, | 197 pdf_rendering_settings_.area.height(), true, false, true, true, |
181 pdf_rendering_settings_.autorotate)) { | 198 pdf_rendering_settings_.autorotate)) { |
182 return false; | 199 return false; |
183 } | 200 } |
184 metafile.FinishPage(); | 201 metafile.FinishPage(); |
185 metafile.FinishDocument(); | 202 metafile.FinishDocument(); |
186 return metafile.SaveTo(&output_file); | 203 return metafile.SaveTo(&output_file); |
187 } | 204 } |
205 | |
206 bool PrintingHandler::RenderPdfPageToPostScript(int page_number, | |
207 base::File output_file) { | |
208 Emf metafile; | |
209 metafile.Init(); | |
Nico
2017/01/31 20:17:41
this function looks identical to RenderPdfPageToMe
rbpotter
2017/02/01 01:09:00
I merged these two to eliminate the duplication.
T
| |
210 | |
211 // The underlying metafile is of type Emf and ignores the arguments passed | |
212 // to StartPage. | |
213 metafile.StartPage(gfx::Size(), gfx::Rect(), 1); | |
214 if (!chrome_pdf::RenderPDFPageToDC( | |
215 &pdf_data_.front(), pdf_data_.size(), page_number, metafile.context(), | |
216 pdf_rendering_settings_.dpi, pdf_rendering_settings_.area.x() - | |
217 pdf_rendering_settings_.offsets.x(), | |
218 pdf_rendering_settings_.area.y() - | |
219 pdf_rendering_settings_.offsets.y(), | |
220 pdf_rendering_settings_.area.width(), | |
221 pdf_rendering_settings_.area.height(), true, false, true, true, | |
222 pdf_rendering_settings_.autorotate)) { | |
223 return false; | |
224 } | |
225 metafile.FinishPage(); | |
226 metafile.FinishDocument(); | |
227 return metafile.SaveTo(&output_file); | |
228 } | |
188 #endif // defined(OS_WIN) | 229 #endif // defined(OS_WIN) |
189 | 230 |
190 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) | 231 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) |
191 bool PrintingHandler::RenderPDFPagesToPWGRaster( | 232 bool PrintingHandler::RenderPDFPagesToPWGRaster( |
192 base::File pdf_file, | 233 base::File pdf_file, |
193 const PdfRenderSettings& settings, | 234 const PdfRenderSettings& settings, |
194 const PwgRasterSettings& bitmap_settings, | 235 const PwgRasterSettings& bitmap_settings, |
195 base::File bitmap_file) { | 236 base::File bitmap_file) { |
196 base::File::Info info; | 237 base::File::Info info; |
197 if (!pdf_file.GetInfo(&info) || info.size <= 0 || | 238 if (!pdf_file.GetInfo(&info) || info.size <= 0 || |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
302 if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, | 343 if (print_backend->GetPrinterSemanticCapsAndDefaults(printer_name, |
303 &printer_info)) { | 344 &printer_info)) { |
304 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( | 345 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Succeeded( |
305 printer_name, printer_info)); | 346 printer_name, printer_info)); |
306 } else { | 347 } else { |
307 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( | 348 Send(new ChromeUtilityHostMsg_GetPrinterSemanticCapsAndDefaults_Failed( |
308 printer_name)); | 349 printer_name)); |
309 } | 350 } |
310 ReleaseProcessIfNeeded(); | 351 ReleaseProcessIfNeeded(); |
311 } | 352 } |
312 #endif // ENABLE_PRINT_PREVIEW | 353 #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) |
313 | 354 |
314 } // namespace printing | 355 } // namespace printing |
OLD | NEW |