15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_print_settings_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/content_browser_client.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/common/content_client.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/printing_context.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Print units conversion functions.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t DeviceUnitsInPoints(int32_t device_units,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int32_t device_units_per_inch) {
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return printing::ConvertUnit(
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      device_units, device_units_per_inch, printing::kPointsPerInch);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Size PrintSizeToPPPrintSize(const gfx::Size& print_size,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int32_t device_units_per_inch) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Size result;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result.width = DeviceUnitsInPoints(print_size.width(), device_units_per_inch);
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  result.height =
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      DeviceUnitsInPoints(print_size.height(), device_units_per_inch);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Rect PrintAreaToPPPrintArea(const gfx::Rect& print_area,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               int32_t device_units_per_inch) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Rect result;
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  result.point.x =
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      DeviceUnitsInPoints(print_area.origin().x(), device_units_per_inch);
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  result.point.y =
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      DeviceUnitsInPoints(print_area.origin().y(), device_units_per_inch);
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  result.size =
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      PrintSizeToPPPrintSize(print_area.size(), device_units_per_inch);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PrintingContextDelegate : public printing::PrintingContext::Delegate {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // PrintingContext::Delegate methods.
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual gfx::NativeView GetParentView() OVERRIDE { return NULL; }
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual std::string GetAppLocale() OVERRIDE {
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return GetContentClient()->browser()->GetApplicationLocale();
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperPrintSettingsManager::Result ComputeDefaultPrintSettings() {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function should run on the UI thread because |PrintingContext| methods
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call into platform APIs.
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PrintingContextDelegate delegate;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<printing::PrintingContext> context(
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      printing::PrintingContext::Create(&delegate));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context.get() ||
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context->UseDefaultSettings() != printing::PrintingContext::OK) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PepperPrintSettingsManager::Result(PP_PrintSettings_Dev(),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              PP_ERROR_FAILED);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const printing::PrintSettings& print_settings = context->settings();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const printing::PageSetup& page_setup =
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      print_settings.page_setup_device_units();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int device_units_per_inch = print_settings.device_units_per_inch();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (device_units_per_inch <= 0) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PepperPrintSettingsManager::Result(PP_PrintSettings_Dev(),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              PP_ERROR_FAILED);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_PrintSettings_Dev settings;
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  settings.printable_area = PrintAreaToPPPrintArea(page_setup.printable_area(),
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                   device_units_per_inch);
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  settings.content_area =
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      PrintAreaToPPPrintArea(page_setup.content_area(), device_units_per_inch);
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  settings.paper_size =
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      PrintSizeToPPPrintSize(page_setup.physical_size(), device_units_per_inch);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.dpi = print_settings.dpi();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The remainder of the attributes are hard-coded to the defaults as set
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // elsewhere.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.orientation = PP_PRINTORIENTATION_NORMAL;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.grayscale = PP_FALSE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.print_scaling_option = PP_PRINTSCALINGOPTION_SOURCE_SIZE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(raymes): Should be computed in the same way as
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |PluginInstance::GetPreferredPrintOutputFormat|.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |PP_PRINTOUTPUTFORMAT_PDF| is currently the only supported format though,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so just make it the default.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.format = PP_PRINTOUTPUTFORMAT_PDF;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PepperPrintSettingsManager::Result(settings, PP_OK);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperPrintSettingsManager::Result ComputeDefaultPrintSettings() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PepperPrintSettingsManager::Result(PP_PrintSettings_Dev(),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            PP_ERROR_NOTSUPPORTED);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperPrintSettingsManagerImpl::GetDefaultPrintSettings(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PepperPrintSettingsManager::Callback callback) {
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  BrowserThread::PostTaskAndReplyWithResult(
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      BrowserThread::UI,
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      FROM_HERE,
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      base::Bind(ComputeDefaultPrintSettings),
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      callback);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
118