2009-07-13 Brent Fulgham <bfulgham@webkit.org>
authorbfulgham@webkit.org <bfulgham@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Jul 2009 23:42:10 +0000 (23:42 +0000)
committerbfulgham@webkit.org <bfulgham@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Jul 2009 23:42:10 +0000 (23:42 +0000)
        Reviewed by Adam Roben.

        Refactor WebFrame::spoolPages for easier sharing with Windows Cairo.
        https://bugs.webkit.org/show_bug.cgi?id=27240.

        * WebFrame.cpp:
        (WebFrame::printHeader): New shared method to print the header.
        (WebFrame::printFooter): New shared method to print the footer.
        (WebFrame::spoolPage): New conditionally-compiled method to print
         a page.
        (WebFrame::spoolPages): Revised to call the platform-specific spoolPage
         for each page.
        * WebFrame.h: Add new method prototypes.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@45846 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/win/ChangeLog
WebKit/win/WebFrame.cpp
WebKit/win/WebFrame.h

index 62ac8bb..2695986 100644 (file)
@@ -2,6 +2,22 @@
 
         Reviewed by Adam Roben.
 
+        Refactor WebFrame::spoolPages for easier sharing with Windows Cairo.
+        https://bugs.webkit.org/show_bug.cgi?id=27240.
+
+        * WebFrame.cpp:
+        (WebFrame::printHeader): New shared method to print the header.
+        (WebFrame::printFooter): New shared method to print the footer.
+        (WebFrame::spoolPage): New conditionally-compiled method to print
+         a page.
+        (WebFrame::spoolPages): Revised to call the platform-specific spoolPage
+         for each page.
+        * WebFrame.h: Add new method prototypes.
+
+2009-07-13  Brent Fulgham  <bfulgham@webkit.org>
+
+        Reviewed by Adam Roben.
+
         Add new configuration flag for redistributable Windows build.
         https://bugs.webkit.org/show_bug.cgi=27087
 
index 59a4a52..e50a830 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include <wtf/MathExtras.h>
 #pragma warning(pop)
 
+#if PLATFORM(CG)
 #include <CoreGraphics/CoreGraphics.h>
+#elif PLATFORM(CAIRO)
+#include <cairo-win32.h>
+#endif
 
+#if PLATFORM(CG)
 // CG SPI used for printing
 extern "C" {
     CGAffineTransform CGContextGetBaseCTM(CGContextRef c); 
     void CGContextSetBaseCTM(CGContextRef c, CGAffineTransform m); 
 }
+#endif
 
 using namespace WebCore;
 using namespace HTMLNames;
@@ -1850,6 +1856,98 @@ HRESULT STDMETHODCALLTYPE WebFrame::getPrintedPageCount(
     return S_OK;
 }
 
+void WebFrame::drawHeader(PlatformGraphicsContext* pctx, IWebUIDelegate* ui, const IntRect& pageRect, float headerHeight)
+{
+    int x = pageRect.x();
+    int y = 0;
+    RECT headerRect = {x, y, x+pageRect.width(), y+static_cast<int>(headerHeight)};
+    ui->drawHeaderInRect(d->webView, &headerRect, static_cast<OLE_HANDLE>(reinterpret_cast<LONG64>(pctx)));
+}
+
+void WebFrame::drawFooter(PlatformGraphicsContext* pctx, IWebUIDelegate* ui, const IntRect& pageRect, UINT page, UINT pageCount, float headerHeight, float footerHeight)
+{
+    int x = pageRect.x();
+    int y = max((int)headerHeight+pageRect.height(), m_pageHeight-static_cast<int>(footerHeight));
+    RECT footerRect = {x, y, x+pageRect.width(), y+static_cast<int>(footerHeight)};
+    ui->drawFooterInRect(d->webView, &footerRect, static_cast<OLE_HANDLE>(reinterpret_cast<LONG64>(pctx)), page+1, pageCount);
+}
+
+#if PLATFORM(CG)
+void WebFrame::spoolPage(PlatformGraphicsContext* pctx, GraphicsContext* spoolCtx, HDC printDC, IWebUIDelegate* ui, float headerHeight, float footerHeight, UINT page, UINT pageCount)
+{
+    Frame* coreFrame = core(this);
+
+    IntRect pageRect = m_pageRects[page];
+
+    CGContextSaveGState(pctx);
+
+    IntRect printRect = printerRect(printDC);
+    CGRect mediaBox = CGRectMake(CGFloat(0),
+                                 CGFloat(0),
+                                 CGFloat(printRect.width()),
+                                 CGFloat(printRect.height()));
+
+    CGContextBeginPage(pctx, &mediaBox);
+
+    // FIXME: Could some of this coordinate space manipulation be shared with Cairo?
+    CGFloat scale = static_cast<float>(mediaBox.size.width)/static_cast<float>(pageRect.width());
+    CGAffineTransform ctm = CGContextGetBaseCTM(pctx);
+    ctm = CGAffineTransformScale(ctm, -scale, -scale);
+    ctm = CGAffineTransformTranslate(ctm, CGFloat(-pageRect.x()), CGFloat(-pageRect.y()+headerHeight)); // reserves space for header
+    CGContextScaleCTM(pctx, scale, scale);
+    CGContextTranslateCTM(pctx, CGFloat(-pageRect.x()), CGFloat(-pageRect.y()+headerHeight));   // reserves space for header
+    CGContextSetBaseCTM(pctx, ctm);
+
+    coreFrame->view()->paintContents(spoolCtx, pageRect);
+
+    CGContextTranslateCTM(pctx, CGFloat(pageRect.x()), CGFloat(pageRect.y())-headerHeight);
+
+    if (headerHeight)
+        drawHeader(pctx, ui, pageRect, headerHeight);
+
+    if (footerHeight)
+        drawFooter(pctx, ui, pageRect, page, pageCount, headerHeight, footerHeight);
+
+    CGContextEndPage(pctx);
+    CGContextRestoreGState(pctx);
+}
+#elif PLATFORM(CAIRO)
+void WebFrame::spoolPage(PlatformGraphicsContext* pctx, GraphicsContext* spoolCtx, HDC printDC, IWebUIDelegate* ui, float headerHeight, float footerHeight, UINT page, UINT pageCount)
+{
+    Frame* coreFrame = core(this);
+
+    IntRect pageRect = m_pageRects[page];
+
+    cairo_save(pctx);
+
+    IntRect printRect = printerRect(printDC);
+    IntRect mediaBox(0, 0, printRect.width(), printRect.height());
+
+    ::StartPage(printDC);
+
+    // FIXME: Could some of this coordinate space manipulation be shared with CG?
+    float scale = static_cast<float>(mediaBox.size().width())/static_cast<float>(pageRect.width());
+    cairo_scale(pctx, -scale, -scale);
+    cairo_translate(pctx, -pageRect.x(), -pageRect.y()+headerHeight);
+    cairo_scale(pctx, scale, scale);
+    cairo_translate(pctx, -pageRect.x(), -pageRect.y()+headerHeight);   // reserves space for header
+
+    coreFrame->view()->paintContents(spoolCtx, pageRect);
+
+    cairo_translate(pctx, pageRect.x(), pageRect.y()-headerHeight);
+
+    if (headerHeight)
+        drawHeader(pctx, ui, pageRect, headerHeight);
+    
+    if (footerHeight)
+        drawFooter(pctx, ui, pageRect, page, pageCount, headerHeight, footerHeight);
+
+    cairo_show_page(pctx);
+    ::EndPage(printDC);
+    cairo_restore(pctx);
+}
+#endif
+
 HRESULT STDMETHODCALLTYPE WebFrame::spoolPages( 
     /* [in] */ HDC printDC,
     /* [in] */ UINT startPage,
@@ -1893,47 +1991,8 @@ HRESULT STDMETHODCALLTYPE WebFrame::spoolPages(
     GraphicsContext spoolCtx(pctx);
     spoolCtx.setShouldIncludeChildWindows(true);
 
-    for (UINT ii = startPage; ii < endPage; ii++) {
-        IntRect pageRect = m_pageRects[ii];
-
-        CGContextSaveGState(pctx);
-
-        IntRect printRect = printerRect(printDC);
-        CGRect mediaBox = CGRectMake(CGFloat(0),
-                                     CGFloat(0),
-                                     CGFloat(printRect.width()),
-                                     CGFloat(printRect.height()));
-
-        CGContextBeginPage(pctx, &mediaBox);
-
-        CGFloat scale = (float)mediaBox.size.width/ (float)pageRect.width();
-        CGAffineTransform ctm = CGContextGetBaseCTM(pctx);
-        ctm = CGAffineTransformScale(ctm, -scale, -scale);
-        ctm = CGAffineTransformTranslate(ctm, CGFloat(-pageRect.x()), CGFloat(-pageRect.y()+headerHeight)); // reserves space for header
-        CGContextScaleCTM(pctx, scale, scale);
-        CGContextTranslateCTM(pctx, CGFloat(-pageRect.x()), CGFloat(-pageRect.y()+headerHeight));   // reserves space for header
-        CGContextSetBaseCTM(pctx, ctm);
-
-        coreFrame->view()->paintContents(&spoolCtx, pageRect);
-
-        CGContextTranslateCTM(pctx, CGFloat(pageRect.x()), CGFloat(pageRect.y())-headerHeight);
-
-        int x = pageRect.x();
-        int y = 0;
-        if (headerHeight) {
-            RECT headerRect = {x, y, x+pageRect.width(), y+(int)headerHeight};
-            ui->drawHeaderInRect(d->webView, &headerRect, (OLE_HANDLE)(LONG64)pctx);
-        }
-
-        if (footerHeight) {
-            y = max((int)headerHeight+pageRect.height(), m_pageHeight-(int)footerHeight);
-            RECT footerRect = {x, y, x+pageRect.width(), y+(int)footerHeight};
-            ui->drawFooterInRect(d->webView, &footerRect, (OLE_HANDLE)(LONG64)pctx, ii+1, pageCount);
-        }
-
-        CGContextEndPage(pctx);
-        CGContextRestoreGState(pctx);
-    }
+    for (UINT ii = startPage; ii < endPage; ii++)
+        spoolPage(pctx, &spoolCtx, printDC, ui.get(), headerHeight, footerHeight, ii, pageCount);
  
     return S_OK;
 }
@@ -2120,4 +2179,3 @@ void WebFrame::updateBackground()
 
     coreFrame->view()->updateBackgroundRecursively(backgroundColor, webView()->transparent());
 }
-
index 66b12b0..7af72d4 100644 (file)
@@ -35,6 +35,7 @@
 
 #pragma warning(push, 0)
 #include <WebCore/FrameWin.h>
+#include <WebCore/GraphicsContext.h>
 #include <WebCore/KURL.h>
 #include <WebCore/PlatformString.h>
 #include <WebCore/ResourceHandleClient.h>
@@ -49,6 +50,7 @@ namespace WebCore {
     class DocumentLoader;
     class Element;
     class Frame;
+    class GraphicsContext;
     class HTMLFrameOwnerElement;
     class IntRect;
     class Page;
@@ -59,6 +61,12 @@ namespace WebCore {
 typedef const struct OpaqueJSContext* JSContextRef;
 typedef struct OpaqueJSValue* JSObjectRef;
 
+#if PLATFORM(CG)
+typedef struct CGContext PlatformGraphicsContext;
+#elif PLATFORM(CAIRO)
+typedef struct _cairo PlatformGraphicsContext;
+#endif
+
 class WebFrame;
 class WebFramePolicyListener;
 class WebHistory;
@@ -334,6 +342,9 @@ protected:
     void setPrinting(bool printing, float minPageWidth, float maxPageWidth, bool adjustViewSize);
     void headerAndFooterHeights(float*, float*);
     WebCore::IntRect printerMarginRect(HDC);
+    void spoolPage (PlatformGraphicsContext* pctx, WebCore::GraphicsContext* spoolCtx, HDC printDC, IWebUIDelegate*, float headerHeight, float footerHeight, UINT page, UINT pageCount);
+    void drawHeader(PlatformGraphicsContext* pctx, IWebUIDelegate*, const WebCore::IntRect& pageRect, float headerHeight);
+    void drawFooter(PlatformGraphicsContext* pctx, IWebUIDelegate*, const WebCore::IntRect& pageRect, UINT page, UINT pageCount, float headerHeight, float footerHeight);
 
 protected:
     ULONG               m_refCount;