summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/PrintContext.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/PrintContext.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/page/PrintContext.h')
-rw-r--r--Source/WebCore/page/PrintContext.h61
1 files changed, 40 insertions, 21 deletions
diff --git a/Source/WebCore/page/PrintContext.h b/Source/WebCore/page/PrintContext.h
index 2efd05d3f..ceaa23c5d 100644
--- a/Source/WebCore/page/PrintContext.h
+++ b/Source/WebCore/page/PrintContext.h
@@ -18,25 +18,28 @@
* Boston, MA 02110-1301, USA.
*/
-#ifndef PrintContext_h
-#define PrintContext_h
+#pragma once
#include <wtf/Forward.h>
+#include <wtf/HashMap.h>
#include <wtf/Vector.h>
+#include <wtf/text/WTFString.h>
namespace WebCore {
+class Document;
class Element;
class Frame;
class FloatRect;
class FloatSize;
class GraphicsContext;
class IntRect;
+class Node;
class PrintContext {
public:
- explicit PrintContext(Frame*);
- ~PrintContext();
+ WEBCORE_EXPORT explicit PrintContext(Frame*);
+ WEBCORE_EXPORT ~PrintContext();
Frame* frame() const { return m_frame; }
@@ -44,40 +47,53 @@ public:
// 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.
// FIXME: Header and footer height should be applied before layout, not after.
// FIXME: The printRect argument is only used to determine page aspect ratio, it would be better to pass a FloatSize with page dimensions instead.
- void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight, bool allowHorizontalTiling = false);
+ WEBCORE_EXPORT void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight, bool allowHorizontalTiling = false);
// Deprecated. Page size computation is already in this class, clients shouldn't be copying it.
- void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling);
+ WEBCORE_EXPORT void computePageRectsWithPageSize(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling);
// These are only valid after page rects are computed.
size_t pageCount() const { return m_pageRects.size(); }
const IntRect& pageRect(size_t pageNumber) const { return m_pageRects[pageNumber]; }
const Vector<IntRect>& pageRects() const { return m_pageRects; }
- float computeAutomaticScaleFactor(const FloatSize& availablePaperSize);
+ WEBCORE_EXPORT float computeAutomaticScaleFactor(const FloatSize& availablePaperSize);
// Enter print mode, updating layout for new page size.
// This function can be called multiple times to apply new print options without going back to screen mode.
- void begin(float width, float height = 0);
+ WEBCORE_EXPORT void begin(float width, float height = 0);
// FIXME: eliminate width argument.
- void spoolPage(GraphicsContext& ctx, int pageNumber, float width);
+ WEBCORE_EXPORT void spoolPage(GraphicsContext& ctx, int pageNumber, float width);
- void spoolRect(GraphicsContext& ctx, const IntRect&);
+ WEBCORE_EXPORT void spoolRect(GraphicsContext& ctx, const IntRect&);
// Return to screen mode.
- void end();
+ WEBCORE_EXPORT void end();
// Used by layout tests.
- static int pageNumberForElement(Element*, const FloatSize& pageSizeInPixels); // Returns -1 if page isn't found.
- static String pageProperty(Frame* frame, const char* propertyName, int pageNumber);
- static bool isPageBoxVisible(Frame* frame, int pageNumber);
- static String pageSizeAndMarginsInPixels(Frame* frame, int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft);
- static int numberOfPages(Frame*, const FloatSize& pageSizeInPixels);
+ WEBCORE_EXPORT static int pageNumberForElement(Element*, const FloatSize& pageSizeInPixels); // Returns -1 if page isn't found.
+ WEBCORE_EXPORT static String pageProperty(Frame*, const char* propertyName, int pageNumber);
+ WEBCORE_EXPORT static bool isPageBoxVisible(Frame*, int pageNumber);
+ WEBCORE_EXPORT static String pageSizeAndMarginsInPixels(Frame*, int pageNumber, int width, int height, int marginTop, int marginRight, int marginBottom, int marginLeft);
+ WEBCORE_EXPORT static int numberOfPages(Frame&, const FloatSize& pageSizeInPixels);
// Draw all pages into a graphics context with lines which mean page boundaries.
// The height of the graphics context should be
// (pageSizeInPixels.height() + 1) * number-of-pages - 1
- static void spoolAllPagesWithBoundaries(Frame*, GraphicsContext&, const FloatSize& pageSizeInPixels);
+ WEBCORE_EXPORT static void spoolAllPagesWithBoundaries(Frame&, GraphicsContext&, const FloatSize& pageSizeInPixels);
+
+ // By imaging to a width a little wider than the available pixels,
+ // thin pages will be scaled down a little, matching the way they
+ // print in IE and Camino. This lets them use fewer sheets than they
+ // would otherwise, which is presumably why other browsers do this.
+ // Wide pages will be scaled down more than this.
+ static constexpr float minimumShrinkFactor() { return 1.25; }
+
+ // This number determines how small we are willing to reduce the page content
+ // in order to accommodate the widest line. If the page would have to be
+ // reduced smaller to make the widest line fit, we just clip instead (this
+ // behavior matches MacIE and Mozilla, at least)
+ static constexpr float maximumShrinkFactor() { return 2; }
protected:
Frame* m_frame;
@@ -85,11 +101,14 @@ protected:
private:
void computePageRectsWithPageSizeInternal(const FloatSize& pageSizeInPixels, bool allowHorizontalTiling);
+ bool beginAndComputePageRectsWithPageSize(Frame&, const FloatSize& pageSizeInPixels);
+ void collectLinkedDestinations(Document&);
+ void outputLinkedDestinations(GraphicsContext&, Document&, const IntRect& pageRect);
// Used to prevent misuses of begin() and end() (e.g., call end without begin).
- bool m_isPrinting;
-};
+ bool m_isPrinting { false };
-}
+ std::unique_ptr<HashMap<String, Ref<Element>>> m_linkedDestinations;
+};
-#endif
+} // namespace WebCore