Home | History | Annotate | Download | only in page
      1 /*
      2  * Copyright (C) 2007 Alp Toker <alp (at) atoker.com>
      3  * Copyright (C) 2007 Apple Inc.
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18  * Boston, MA 02110-1301, USA.
     19  */
     20 
     21 #ifndef PrintContext_h
     22 #define PrintContext_h
     23 
     24 #include <wtf/Forward.h>
     25 #include <wtf/Vector.h>
     26 
     27 namespace WebCore {
     28 
     29 class Element;
     30 class Frame;
     31 class FloatRect;
     32 class FloatSize;
     33 class GraphicsContext;
     34 class IntRect;
     35 
     36 class PrintContext {
     37 public:
     38     PrintContext(Frame*);
     39     ~PrintContext();
     40 
     41     Frame* frame() const { return m_frame; }
     42 
     43     // Break up a page into rects without relayout.
     44     // 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.
     45     // FIXME: Header and footer height should be applied before layout, not after.
     46     // FIXME: The printRect argument is only used to determine page aspect ratio, it would be better to pass a FloatSize with page dimensions instead.
     47     void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight, bool allowHorizontalTiling = false);
     48 
     49     // Deprecated. Page size computation is already in this class, clients shouldn't be copying it.
     50     void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling);
     51 
     52     // These are only valid after page rects are computed.
     53     size_t pageCount() const { return m_pageRects.size(); }
     54     const IntRect& pageRect(size_t pageNumber) const { return m_pageRects[pageNumber]; }
     55     const Vector<IntRect>& pageRects() const { return m_pageRects; }
     56 
     57     float computeAutomaticScaleFactor(const FloatSize& availablePaperSize);
     58 
     59     // Enter print mode, updating layout for new page size.
     60     // This function can be called multiple times to apply new print options without going back to screen mode.
     61     void begin(float width, float height = 0);
     62 
     63     // FIXME: eliminate width argument.
     64     void spoolPage(GraphicsContext& ctx, int pageNumber, float width);
     65 
     66     void spoolRect(GraphicsContext& ctx, const IntRect&);
     67 
     68     // Return to screen mode.
     69     void end();
     70 
     71     // Used by layout tests.
     72     static int pageNumberForElement(Element*, const FloatSize& pageSizeInPixels); // Returns -1 if page isn't found.
     73     static String pageProperty(Frame* frame, const char* propertyName, int pageNumber);
     74     static bool isPageBoxVisible(Frame* frame, int pageNumber);
     75     static String pageSizeAndMarginsInPixels(Frame* frame, int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft);
     76     static int numberOfPages(Frame*, const FloatSize& pageSizeInPixels);
     77     // Draw all pages into a graphics context with lines which mean page boundaries.
     78     // The height of the graphics context should be
     79     // (pageSizeInPixels.height() + 1) * number-of-pages - 1
     80     static void spoolAllPagesWithBoundaries(Frame*, GraphicsContext&, const FloatSize& pageSizeInPixels);
     81 
     82 protected:
     83     Frame* m_frame;
     84     Vector<IntRect> m_pageRects;
     85 
     86 private:
     87     void computePageRectsWithPageSizeInternal(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling);
     88 
     89     // Used to prevent misuses of begin() and end() (e.g., call end without begin).
     90     bool m_isPrinting;
     91 };
     92 
     93 }
     94 
     95 #endif
     96