15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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 "printing/page_setup.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace printing { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PageMargins::PageMargins() 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : header(0), 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) footer(0), 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left(0), 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right(0), 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top(0), 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom(0) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageMargins::Clear() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header = 0; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) footer = 0; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left = 0; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right = 0; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top = 0; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom = 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PageMargins::Equals(const PageMargins& rhs) const { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return header == rhs.header && 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) footer == rhs.footer && 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left == rhs.left && 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) top == rhs.top && 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right == rhs.right && 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bottom == rhs.bottom; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PageSetup::PageSetup() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Clear(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PageSetup::~PageSetup() {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::Clear() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.SetSize(0, 0); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printable_area_.SetRect(0, 0, 0, 0); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.SetRect(0, 0, 0, 0); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.SetRect(0, 0, 0, 0); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.Clear(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_height_ = 0; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forced_margins_ = false; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PageSetup::Equals(const PageSetup& rhs) const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return physical_size_ == rhs.physical_size_ && 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printable_area_ == rhs.printable_area_ && 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_ == rhs.overlay_area_ && 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_ == rhs.content_area_ && 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.Equals(rhs.effective_margins_) && 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_margins_.Equals(rhs.requested_margins_) && 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_height_ == rhs.text_height_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::Init(const gfx::Size& physical_size, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& printable_area, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int text_height) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LE(printable_area.right(), physical_size.width()); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // I've seen this assert triggers on Canon GP160PF PCL 5e and HP LaserJet 5. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since we don't know the dpi here, just disable the check. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DCHECK_LE(printable_area.bottom(), physical_size.height()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(printable_area.x(), 0); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(printable_area.y(), 0); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(text_height, 0); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_ = physical_size; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printable_area_ = printable_area; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_height_ = text_height; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRequestedMarginsAndCalculateSizes(requested_margins_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::SetRequestedMargins(const PageMargins& requested_margins) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forced_margins_ = false; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRequestedMarginsAndCalculateSizes(requested_margins); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::ForceRequestedMargins(const PageMargins& requested_margins) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forced_margins_ = true; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRequestedMarginsAndCalculateSizes(requested_margins); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::FlipOrientation() { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (physical_size_.width() && physical_size_.height()) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size new_size(physical_size_.height(), physical_size_.width()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int new_y = physical_size_.width() - 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (printable_area_.width() + printable_area_.x()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_printable_area(printable_area_.y(), 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_y, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printable_area_.height(), 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printable_area_.width()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(new_size, new_printable_area, text_height_); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::SetRequestedMarginsAndCalculateSizes( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PageMargins& requested_margins) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_margins_ = requested_margins; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (physical_size_.width() && physical_size_.height()) { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (forced_margins_) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateSizesWithinRect(gfx::Rect(physical_size_), 0); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CalculateSizesWithinRect(printable_area_, text_height_); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PageSetup::CalculateSizesWithinRect(const gfx::Rect& bounds, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int text_height) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the effective margins. The tricky part. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.header = std::max(requested_margins_.header, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.y()); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.footer = std::max(requested_margins_.footer, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.height() - 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.bottom()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.left = std::max(requested_margins_.left, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.x()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.top = std::max(std::max(requested_margins_.top, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.y()), 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.header + text_height); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.right = std::max(requested_margins_.right, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.width() - 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.right()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.bottom = 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::max(std::max(requested_margins_.bottom, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.height() - bounds.bottom()), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.footer + text_height); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the overlay area. If the margins are excessive, the overlay_area 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size will be (0, 0). 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.set_x(effective_margins_.left); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.set_y(effective_margins_.header); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.set_width(std::max(0, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.width() - 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.right - 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.x())); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.set_height(std::max(0, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.height() - 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.footer - 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_area_.y())); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate the content area. If the margins are excessive, the content_area 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size will be (0, 0). 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.set_x(effective_margins_.left); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.set_y(effective_margins_.top); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.set_width(std::max(0, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.width() - 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.right - 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.x())); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.set_height(std::max(0, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) physical_size_.height() - 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effective_margins_.bottom - 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_area_.y())); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace printing 166