Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(515)

Unified Diff: chrome/renderer/print_web_view_helper_linux.cc

Issue 7348010: Added Header and Footer support using Skia (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Added Headers and Footers support - New Snapshot Uploaded Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/print_web_view_helper_linux.cc
diff --git a/chrome/renderer/print_web_view_helper_linux.cc b/chrome/renderer/print_web_view_helper_linux.cc
index 9255a007bfc51867ec19bdadb47c67e446c21ee6..5ab53feebf0139a3575a9f58c9f8451e9bbbb6e1 100644
--- a/chrome/renderer/print_web_view_helper_linux.cc
+++ b/chrome/renderer/print_web_view_helper_linux.cc
@@ -5,23 +5,33 @@
#include "chrome/renderer/print_web_view_helper.h"
#include "base/file_descriptor_posix.h"
+#include "base/i18n/time_formatting.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "base/metrics/histogram.h"
+#include "base/string_number_conversions.h"
+#include "base/time.h"
+#include "base/utf_string_conversions.h"
#include "chrome/common/print_messages.h"
#include "content/common/view_messages.h"
#include "printing/metafile.h"
#include "printing/metafile_impl.h"
#include "printing/metafile_skia_wrapper.h"
#include "skia/ext/vector_canvas.h"
+#include "skia/ext/vector_platform_device_skia.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "third_party/skia/include/core/SkDraw.h"
#include "third_party/skia/include/core/SkRefCnt.h"
+#include "third_party/skia/include/core/SkTypeface.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
+#include "ui/base/text/text_elider.h"
#include "ui/gfx/point.h"
#if !defined(OS_CHROMEOS)
#include "base/process_util.h"
#endif // !defined(OS_CHROMEOS)
+using base::Time;
using WebKit::WebFrame;
using WebKit::WebNode;
@@ -164,6 +174,7 @@ bool PrintWebViewHelper::RenderPages(const PrintMsg_PrintPages_Params& params,
*page_count));
#endif
}
+ int total_pages = *page_count;
base::TimeTicks begin_time = base::TimeTicks::Now();
base::TimeTicks page_begin_time = begin_time;
@@ -174,7 +185,8 @@ bool PrintWebViewHelper::RenderPages(const PrintMsg_PrintPages_Params& params,
if (params.pages.empty()) {
for (int i = 0; i < *page_count; ++i) {
page_params.page_number = i;
- PrintPageInternal(page_params, canvas_size, frame, metafile);
+ PrintPageInternal(page_params, canvas_size, frame, metafile, is_preview,
+ total_pages);
if (is_preview) {
page_begin_time = ReportPreviewPageRenderTime(page_begin_time);
if (!PreviewPageRendered(i))
@@ -184,7 +196,8 @@ bool PrintWebViewHelper::RenderPages(const PrintMsg_PrintPages_Params& params,
} else {
for (size_t i = 0; i < params.pages.size(); ++i) {
page_params.page_number = params.pages[i];
- PrintPageInternal(page_params, canvas_size, frame, metafile);
+ PrintPageInternal(page_params, canvas_size, frame, metafile, is_preview,
+ total_pages);
if (is_preview) {
page_begin_time = ReportPreviewPageRenderTime(page_begin_time);
if (!PreviewPageRendered(params.pages[i]))
@@ -206,11 +219,87 @@ bool PrintWebViewHelper::RenderPages(const PrintMsg_PrintPages_Params& params,
return true;
}
+
+size_t GetString16ByteLength(string16 text) {
+ return text.length()*sizeof(char16);
+}
+
+SkScalar PrintWebViewHelper::GetHorizontalCoordinate(
+ string16 text,
+ SkPaint paint,
+ HorizontalHeaderFooterPosition pos,
+ SkScalar margin_left_in_points,
+ SkScalar margin_right_in_points,
+ SkScalar content_width_in_points) {
+ SkScalar text_width_in_points = paint.measureText(text.c_str(),
+ GetString16ByteLength(text));
+
+ switch (pos) {
+ case LEFT:
+ return margin_left_in_points*(-1) + header_footer_interstice;
+ case RIGHT:
+ return ((content_width_in_points+margin_right_in_points) -
+ (header_footer_interstice + text_width_in_points));
+ case CENTER:
+ SkScalar available_width = (margin_left_in_points +
+ margin_right_in_points +
+ content_width_in_points -
+ 4*header_footer_interstice)/3;
+ return (available_width - margin_left_in_points +
+ (available_width - text_width_in_points)/2);
+ }
+ NOTREACHED();
+ return 0;
+}
+
+SkScalar PrintWebViewHelper::GetVerticalCoordinate(
+ SkPaint paint,
+ VerticalHeaderFooterPosition pos,
+ SkScalar margin_top_in_points,
+ SkScalar margin_bottom_in_points,
+ SkScalar content_height_in_points) {
+ if (pos == TOP) {
+ return margin_top_in_points*(-0.5);
+ } else if (pos == BOTTOM) {
+ return margin_top_in_points+content_height_in_points;
+ } else {
+ NOTREACHED();
+ return 0;
+ }
+}
+
+void PrintWebViewHelper::PrintHeaderFooterText(
+ string16 text,
+ SkPaint paint,
+ const SkRefPtr<skia::VectorCanvas>& canvas,
+ SkScalar margin_left_in_points,
+ SkScalar margin_right_in_points,
+ SkScalar content_width_in_points,
+ SkScalar margin_top_in_points,
+ SkScalar margin_bottom_in_points,
+ SkScalar content_height_in_points,
+ HorizontalHeaderFooterPosition hor_pos,
+ VerticalHeaderFooterPosition ver_pos) {
+ SkScalar x_cord = GetHorizontalCoordinate(text, paint, hor_pos,
+ margin_left_in_points,
+ margin_right_in_points,
+ content_width_in_points);
+ SkScalar y_cord = GetVerticalCoordinate(paint, ver_pos, margin_top_in_points,
+ margin_bottom_in_points,
+ content_height_in_points);
+ size_t byte_length = GetString16ByteLength(text);
+
+ canvas->drawText(text.c_str(), byte_length, x_cord, y_cord, paint);
+}
+
void PrintWebViewHelper::PrintPageInternal(
const PrintMsg_PrintPage_Params& params,
const gfx::Size& canvas_size,
WebFrame* frame,
- printing::Metafile* metafile) {
+ printing::Metafile* metafile,
+ bool is_preview,
+ int total_pages) {
+ // TODO(aayushkumar): Make these variables private variables of the class.
double content_width_in_points;
double content_height_in_points;
double margin_top_in_points;
@@ -245,6 +334,70 @@ void PrintWebViewHelper::PrintPageInternal(
SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device);
canvas->unref(); // SkRefPtr and new both took a reference.
printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas.get(), metafile);
+
+ // TODO(aayushkumar): Have a seperate function for printing Headers and Footer
kmadhusu 2011/07/13 18:47:53 Implement this TODO.
Aayush Kumar 2011/07/13 21:52:16 Done.
+ // that will hopefully be in common for all platforms.
+ if (is_preview && params.params.header_footer) {
+ // Set the drawing area to draw in the margins.
+ ((skia::VectorPlatformDeviceSkia* )device)->
+ setDrawingArea(SkPDFDevice::kMargin_DrawingArea);
+
+ // Setting up styles for the headers and footers text.
+ SkPaint paint;
+ paint.setColor(SK_ColorBLACK);
+ paint.setTextSize(SkIntToScalar(8));
+ paint.setTypeface(SkTypeface::CreateFromName(NULL, SkTypeface::kNormal));
+ paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
+
+ // Printing the Date
+ Time now = Time::Now();
+ string16 date = base::TimeFormatShortDateNumeric(now);
+ PrintHeaderFooterText(date, paint, canvas, margin_left_in_points,
+ margin_right_in_points, content_width_in_points,
+ margin_top_in_points, margin_bottom_in_points,
+ content_height_in_points, LEFT, TOP);
+
+ // Printing the title
+ string16 title;
+ if (!header_footer_info_->GetString("title", &title))
+ NOTREACHED();
+
+ SkScalar maxTitleSize = (margin_left_in_points +
+ content_width_in_points +
+ margin_right_in_points)/3;
+ title = ui::ElideText(title, paint, maxTitleSize, false);
+ PrintHeaderFooterText(title, paint, canvas, margin_left_in_points,
+ margin_right_in_points, content_width_in_points,
+ margin_top_in_points, margin_bottom_in_points,
+ content_height_in_points, CENTER, TOP);
+
+ // Printing the URL
+ std::string url;
+ if (!header_footer_info_->GetString("url", &url))
+ NOTREACHED();
+ GURL gurl(url);
+ string16 url_elided = ui::ElideUrl(gurl, paint, maxTitleSize,
+ std::string());
+ PrintHeaderFooterText(url_elided, paint, canvas, margin_left_in_points,
+ margin_right_in_points, content_width_in_points,
+ margin_top_in_points, margin_bottom_in_points,
+ content_height_in_points, LEFT, BOTTOM);
+
+ // Printing the page numbers at the bottom right corner of page.
+ string16 page_on_page_total = base::IntToString16(params.page_number+1) +
+ UTF8ToUTF16("/") +
kmadhusu 2011/07/13 18:47:53 nit: Fix indentation.
Aayush Kumar 2011/07/13 21:52:16 Done.
+ base::IntToString16(total_pages);
+ PrintHeaderFooterText(page_on_page_total, paint, canvas,
+ margin_left_in_points, margin_right_in_points,
+ content_width_in_points, margin_top_in_points,
+ margin_bottom_in_points, content_height_in_points,
+ RIGHT, BOTTOM);
+
+ // Restore the drawing area to draw in the content area.
+ ((skia::VectorPlatformDeviceSkia* )device)->
+ setDrawingArea(SkPDFDevice::kContent_DrawingArea);
+ }
+
frame->printPage(params.page_number, canvas.get());
// TODO(myhuang): We should render the header and the footer.

Powered by Google App Engine
This is Rietveld 408576698