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