Modified: trunk/Source/WebKit2/ChangeLog (108091 => 108092)
--- trunk/Source/WebKit2/ChangeLog 2012-02-17 18:17:34 UTC (rev 108091)
+++ trunk/Source/WebKit2/ChangeLog 2012-02-17 18:19:18 UTC (rev 108092)
@@ -1,5 +1,26 @@
2012-02-17 Carlos Garcia Campos <[email protected]>
+ [GTK] Allow printing scaled pages in WebKit2 for printers that don't support it
+ https://bugs.webkit.org/show_bug.cgi?id=78823
+
+ Reviewed by Gustavo Noronha Silva.
+
+ * UIProcess/API/gtk/WebKitPrintOperation.cpp:
+ (webkitPrintOperationRunDialogUnix): Enable scale option in print
+ dialog.
+ * WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp:
+ (WebKit::WebPrintOperationGtk::WebPrintOperationGtk): Initialize
+ manual scale to 1.
+ (WebKit::WebPrintOperationGtk::rotatePageIfNeeded): Renamed and
+ moved the needs rotate check here as an early return.
+ (WebKit::WebPrintOperationGtk::prepareContextToDraw): Scale the
+ page according to the manual scale factor.
+ (WebKit::WebPrintOperationGtk::renderPage): Move rotatePage to
+ prepareContextToDraw.
+ * WebProcess/WebPage/gtk/WebPrintOperationGtk.h:
+
+2012-02-17 Carlos Garcia Campos <[email protected]>
+
[GTK] Allow printing multiple copies in WebKit2 for printers that don't support it
https://bugs.webkit.org/show_bug.cgi?id=78805
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp (108091 => 108092)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp 2012-02-17 18:17:34 UTC (rev 108091)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitPrintOperation.cpp 2012-02-17 18:19:18 UTC (rev 108092)
@@ -205,7 +205,8 @@
| GTK_PRINT_CAPABILITY_PAGE_SET
| GTK_PRINT_CAPABILITY_REVERSE
| GTK_PRINT_CAPABILITY_COPIES
- | GTK_PRINT_CAPABILITY_COLLATE));
+ | GTK_PRINT_CAPABILITY_COLLATE
+ | GTK_PRINT_CAPABILITY_SCALE));
WebKitPrintOperationPrivate* priv = printOperation->priv;
if (priv->printSettings)
Modified: trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp (108091 => 108092)
--- trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp 2012-02-17 18:17:34 UTC (rev 108091)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.cpp 2012-02-17 18:19:18 UTC (rev 108092)
@@ -95,6 +95,7 @@
printOperation->m_reverse = gtk_print_job_get_reverse(printOperation->m_printJob.get());
printOperation->m_copies = gtk_print_job_get_num_copies(printOperation->m_printJob.get());
printOperation->m_collateCopies = gtk_print_job_get_collate(printOperation->m_printJob.get());
+ printOperation->m_scale = gtk_print_job_get_scale(printOperation->m_printJob.get());
printOperation->print(surface, 72, 72);
}
@@ -393,6 +394,7 @@
, m_reverse(false)
, m_copies(1)
, m_collateCopies(false)
+ , m_scale(1)
{
}
@@ -417,8 +419,11 @@
return (m_numberUp < 2 || !((m_pagePosition + 1) % m_numberUp) || m_pagePosition == m_numberOfPagesToPrint - 1);
}
-void WebPrintOperationGtk::rotatePage()
+void WebPrintOperationGtk::rotatePageIfNeeded()
{
+ if (!m_needsRotation)
+ return;
+
GtkPaperSize* paperSize = gtk_page_setup_get_paper_size(m_pageSetup.get());
double width = gtk_paper_size_get_width(paperSize, GTK_UNIT_INCH) * m_xDPI;
double height = gtk_paper_size_get_height(paperSize, GTK_UNIT_INCH) * m_yDPI;
@@ -519,11 +524,16 @@
if (m_numberUp < 2) {
double left = gtk_page_setup_get_left_margin(m_pageSetup.get(), GTK_UNIT_INCH);
double top = gtk_page_setup_get_top_margin(m_pageSetup.get(), GTK_UNIT_INCH);
+ if (m_scale != 1.0)
+ cairo_scale(m_cairoContext.get(), m_scale, m_scale);
+ rotatePageIfNeeded();
cairo_translate(m_cairoContext.get(), left * m_xDPI, top * m_yDPI);
return;
}
+ rotatePageIfNeeded();
+
// Multiple pages per sheet.
double marginLeft = gtk_page_setup_get_left_margin(m_pageSetup.get(), GTK_UNIT_POINTS);
double marginRight = gtk_page_setup_get_right_margin(m_pageSetup.get(), GTK_UNIT_POINTS);
@@ -585,6 +595,8 @@
cairo_scale(m_cairoContext.get(), scale, scale);
cairo_translate(m_cairoContext.get(), x * stepX + offsetX, y * stepY + offsetY);
+ if (m_scale != 1.0)
+ cairo_scale(m_cairoContext.get(), m_scale, m_scale);
break;
}
case 2:
@@ -601,6 +613,8 @@
cairo_scale(m_cairoContext.get(), scale, scale);
cairo_translate(m_cairoContext.get(), y * paperHeight + offsetY, (columns - x) * paperWidth + offsetX);
+ if (m_scale != 1.0)
+ cairo_scale(m_cairoContext.get(), m_scale, m_scale);
cairo_rotate(m_cairoContext.get(), -G_PI / 2);
break;
}
@@ -614,14 +628,12 @@
startPage(m_cairoContext.get());
cairo_save(m_cairoContext.get());
- if (m_needsRotation)
- rotatePage();
prepareContextToDraw();
double pageWidth = gtk_page_setup_get_page_width(m_pageSetup.get(), GTK_UNIT_INCH) * m_xDPI;
WebCore::PlatformContextCairo platformContext(m_cairoContext.get());
WebCore::GraphicsContext graphicsContext(&platformContext);
- m_printContext->spoolPage(graphicsContext, pageNumber, pageWidth);
+ m_printContext->spoolPage(graphicsContext, pageNumber, pageWidth / m_scale);
cairo_restore(m_cairoContext.get());
endPage(m_cairoContext.get());
Modified: trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h (108091 => 108092)
--- trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h 2012-02-17 18:17:34 UTC (rev 108091)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gtk/WebPrintOperationGtk.h 2012-02-17 18:19:18 UTC (rev 108092)
@@ -67,6 +67,7 @@
bool reverse() const { return m_reverse; }
unsigned int copies() const { return m_copies; }
bool collateCopies() const { return m_collateCopies; }
+ double scale() const { return m_scale; }
virtual void startPrint(WebCore::PrintContext*, uint64_t callbackID) = 0;
@@ -82,7 +83,7 @@
void print(cairo_surface_t*, double xDPI, double yDPI);
void renderPage(int pageNumber);
- void rotatePage();
+ void rotatePageIfNeeded();
void getRowsAndColumnsOfPagesPerSheet(size_t& rows, size_t& columns);
void getPositionOfPageInSheet(size_t rows, size_t columns, int& x, int&y);
void prepareContextToDraw();
@@ -112,6 +113,7 @@
bool m_reverse;
unsigned int m_copies;
bool m_collateCopies;
+ double m_scale;
};
}