18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Alp Toker <alp@atoker.com> 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Apple Inc. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef PrintContext_h 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define PrintContext_h 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h> 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h> 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockclass Element; 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Frame; 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass FloatRect; 325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockclass FloatSize; 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass GraphicsContext; 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass IntRect; 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass PrintContext { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PrintContext(Frame*); 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ~PrintContext(); 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Frame* frame() const { return m_frame; } 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Break up a page into rects without relayout. 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: This means that CSS page breaks won't be on page boundary if the size is different than what was passed to begin(). That's probably not always desirable. 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: Header and footer height should be applied before layout, not after. 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: The printRect argument is only used to determine page aspect ratio, it would be better to pass a FloatSize with page dimensions instead. 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight, bool allowHorizontalTiling = false); 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Deprecated. Page size computation is already in this class, clients shouldn't be copying it. 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling); 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // These are only valid after page rects are computed. 532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block size_t pageCount() const { return m_pageRects.size(); } 542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const IntRect& pageRect(size_t pageNumber) const { return m_pageRects[pageNumber]; } 558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block const Vector<IntRect>& pageRects() const { return m_pageRects; } 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float computeAutomaticScaleFactor(const FloatSize& availablePaperSize); 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Enter print mode, updating layout for new page size. 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // This function can be called multiple times to apply new print options without going back to screen mode. 61db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block void begin(float width, float height = 0); 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // FIXME: eliminate width argument. 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void spoolPage(GraphicsContext& ctx, int pageNumber, float width); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void spoolRect(GraphicsContext& ctx, const IntRect&); 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Return to screen mode. 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void end(); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 715e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block // Used by layout tests. 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static int pageNumberForElement(Element*, const FloatSize& pageSizeInPixels); // Returns -1 if page isn't found. 7306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static String pageProperty(Frame* frame, const char* propertyName, int pageNumber); 7406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static bool isPageBoxVisible(Frame* frame, int pageNumber); 75ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block static String pageSizeAndMarginsInPixels(Frame* frame, int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft); 768a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static int numberOfPages(Frame*, const FloatSize& pageSizeInPixels); 77967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // Draw all pages into a graphics context with lines which mean page boundaries. 78967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // The height of the graphics context should be 79967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch // (pageSizeInPixels.height() + 1) * number-of-pages - 1 80967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch static void spoolAllPagesWithBoundaries(Frame*, GraphicsContext&, const FloatSize& pageSizeInPixels); 815e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected: 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* m_frame; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<IntRect> m_pageRects; 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate: 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void computePageRectsWithPageSizeInternal(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling); 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Used to prevent misuses of begin() and end() (e.g., call end without begin). 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool m_isPrinting; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 96