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

Side by Side Diff: chrome/renderer/print_web_view_helper_mac.mm

Issue 7647010: Print preview page selection should not require a rerendering of draft pages. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixed comment Created 9 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/renderer/print_web_view_helper.h" 5 #include "chrome/renderer/print_web_view_helper.h"
6 6
7 #import <AppKit/AppKit.h> 7 #import <AppKit/AppKit.h>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/mac/scoped_nsautorelease_pool.h" 10 #include "base/mac/scoped_nsautorelease_pool.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 Send(new PrintHostMsg_DidPrintPage(routing_id(), page_params)); 60 Send(new PrintHostMsg_DidPrintPage(routing_id(), page_params));
61 } 61 }
62 62
63 bool PrintWebViewHelper::RenderPreviewPage(int page_number) { 63 bool PrintWebViewHelper::RenderPreviewPage(int page_number) {
64 float scale_factor = print_preview_context_.frame()->getPrintPageShrink(0); 64 float scale_factor = print_preview_context_.frame()->getPrintPageShrink(0);
65 PrintMsg_Print_Params printParams = print_preview_context_.print_params(); 65 PrintMsg_Print_Params printParams = print_preview_context_.print_params();
66 gfx::Rect content_area(printParams.margin_left, printParams.margin_top, 66 gfx::Rect content_area(printParams.margin_left, printParams.margin_top,
67 printParams.printable_size.width(), 67 printParams.printable_size.width(),
68 printParams.printable_size.height()); 68 printParams.printable_size.height());
69 69
70 scoped_ptr<printing::Metafile> draft_metafile;
70 printing::Metafile* initial_render_metafile = 71 printing::Metafile* initial_render_metafile =
71 print_preview_context_.metafile(); 72 print_preview_context_.metafile();
72 scoped_ptr<printing::PreviewMetafile> draft_metafile; 73
73 #if !defined(USE_SKIA) 74 #if defined(USE_SKIA)
74 if (print_preview_context_.IsModifiable()) { 75 bool render_to_draft = print_preview_context_.IsModifiable() &&
75 draft_metafile.reset(new printing::PreviewMetafile); 76 is_print_ready_metafile_sent_;
77 #else
78 // If the page needs to be in both draft metafile and print ready metafile,
79 // we should always render to the draft metafile first and then copy that
80 // into the print ready metafile because CG does not allow us to do it in
81 // the other order.
82 bool render_to_draft = print_preview_context_.IsModifiable() &&
83 print_preview_context_.generate_draft_pages();
84 #endif
85
86 if (render_to_draft) {
87 draft_metafile.reset(new printing::PreviewMetafile());
76 if (!draft_metafile->Init()) { 88 if (!draft_metafile->Init()) {
77 LOG(ERROR) << "Draft PreviewMetafile Init failed"; 89 LOG(ERROR) << "Draft PreviewMetafile Init failed";
78 return false; 90 return false;
79 } 91 }
80 initial_render_metafile = draft_metafile.get(); 92 initial_render_metafile = draft_metafile.get();
81 } 93 }
82 #endif
83 94
84 base::TimeTicks begin_time = base::TimeTicks::Now(); 95 base::TimeTicks begin_time = base::TimeTicks::Now();
85 RenderPage(printParams.page_size, content_area, scale_factor, page_number, 96 RenderPage(printParams.page_size, content_area, scale_factor, page_number,
86 print_preview_context_.frame(), initial_render_metafile); 97 print_preview_context_.frame(), initial_render_metafile);
87 print_preview_context_.RenderedPreviewPage( 98 print_preview_context_.RenderedPreviewPage(
88 base::TimeTicks::Now() - begin_time); 99 base::TimeTicks::Now() - begin_time);
89 100
90 if (print_preview_context_.IsModifiable()) { 101 if (draft_metafile.get()) {
102 draft_metafile->FinishDocument();
103 #if !defined(USE_SKIA)
104 if (!is_print_ready_metafile_sent_) {
105 // With CG, we rendered into a new metafile so we could get it as a draft
106 // document. Now we need to add it to print ready document. But the
107 // document has already been scaled and adjusted for margins, so do a 1:1
108 // drawing.
109 printing::Metafile* print_ready_metafile =
110 print_preview_context_.metafile();
111 bool success = print_ready_metafile->StartPage(
112 printParams.page_size, gfx::Rect(printParams.page_size), 1.0);
113 DCHECK(success);
114 // StartPage unconditionally flips the content over, flip it back since it
115 // was already flipped in |draft_metafile|.
116 CGContextTranslateCTM(print_ready_metafile->context(), 0,
117 printParams.page_size.height());
118 CGContextScaleCTM(print_ready_metafile->context(), 1.0, -1.0);
119 draft_metafile->RenderPage(1,
120 print_ready_metafile->context(),
121 draft_metafile->GetPageBounds(1).ToCGRect(),
122 false /* shrink_to_fit */,
123 false /* stretch_to_fit */,
124 true /* center_horizontally */,
125 true /* center_vertically */);
126 print_ready_metafile->FinishPage();
127 }
128 #endif
129 } else {
91 #if defined(USE_SKIA) 130 #if defined(USE_SKIA)
92 DCHECK(!draft_metafile.get()); 131 if (print_preview_context_.IsModifiable() &&
93 draft_metafile.reset( 132 print_preview_context_.generate_draft_pages()) {
94 print_preview_context_.metafile()->GetMetafileForCurrentPage()); 133 DCHECK(!draft_metafile.get());
95 #else 134 draft_metafile.reset(
96 draft_metafile->FinishDocument(); 135 print_preview_context_.metafile()->GetMetafileForCurrentPage());
97 136 }
98 // With CG, we rendered into a new metafile so we could get it as a draft
99 // document. Now we need to add it to complete document. But the document
100 // has already been scaled and adjusted for margins, so do a 1:1 drawing.
101 printing::Metafile* complete_metafile = print_preview_context_.metafile();
102 bool success = complete_metafile->StartPage(
103 printParams.page_size, gfx::Rect(printParams.page_size), 1.0);
104 DCHECK(success);
105 // StartPage unconditionally flips the content over, flip it back since it
106 // was already flipped in |draft_metafile|.
107 CGContextTranslateCTM(complete_metafile->context(), 0,
108 printParams.page_size.height());
109 CGContextScaleCTM(complete_metafile->context(), 1.0, -1.0);
110
111 draft_metafile->RenderPage(1,
112 complete_metafile->context(),
113 draft_metafile->GetPageBounds(1).ToCGRect(),
114 false /* shrink_to_fit */,
115 false /* stretch_to_fit */,
116 true /* center_horizontally */,
117 true /* center_vertically */);
118 complete_metafile->FinishPage();
119 #endif 137 #endif
120 } 138 }
121
122 return PreviewPageRendered(page_number, draft_metafile.get()); 139 return PreviewPageRendered(page_number, draft_metafile.get());
123 } 140 }
124 141
125 void PrintWebViewHelper::RenderPage( 142 void PrintWebViewHelper::RenderPage(
126 const gfx::Size& page_size, const gfx::Rect& content_area, 143 const gfx::Size& page_size, const gfx::Rect& content_area,
127 const float& scale_factor, int page_number, WebFrame* frame, 144 const float& scale_factor, int page_number, WebFrame* frame,
128 printing::Metafile* metafile) { 145 printing::Metafile* metafile) {
129 146
130 { 147 {
131 #if defined(USE_SKIA) 148 #if defined(USE_SKIA)
132 SkDevice* device = metafile->StartPageForVectorCanvas( 149 SkDevice* device = metafile->StartPageForVectorCanvas(
133 page_size, content_area, scale_factor); 150 page_size, content_area, scale_factor);
134 if (!device) 151 if (!device)
135 return; 152 return;
136 153
137 SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device); 154 SkRefPtr<skia::VectorCanvas> canvas = new skia::VectorCanvas(device);
138 canvas->unref(); // SkRefPtr and new both took a reference. 155 canvas->unref(); // SkRefPtr and new both took a reference.
139 WebKit::WebCanvas* canvas_ptr = canvas.get(); 156 printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas.get(), metafile);
140 printing::MetafileSkiaWrapper::SetMetafileOnCanvas(canvas_ptr, metafile); 157 printing::MetafileSkiaWrapper::SetDraftMode(canvas.get(),
158 is_print_ready_metafile_sent_);
141 #else 159 #else
142 bool success = metafile->StartPage(page_size, content_area, scale_factor); 160 bool success = metafile->StartPage(page_size, content_area, scale_factor);
143 DCHECK(success); 161 DCHECK(success);
144 // printPage can create autoreleased references to |context|. PDF contexts 162 // printPage can create autoreleased references to |context|. PDF contexts
145 // don't write all their data until they are destroyed, so we need to make 163 // don't write all their data until they are destroyed, so we need to make
146 // certain that there are no lingering references. 164 // certain that there are no lingering references.
147 base::mac::ScopedNSAutoreleasePool pool; 165 base::mac::ScopedNSAutoreleasePool pool;
148 CGContextRef cgContext = metafile->context(); 166 CGContextRef cgContext = metafile->context();
149 CGContextRef canvas_ptr = cgContext; 167 CGContextRef canvas_ptr = cgContext;
150 #endif 168 #endif
(...skipping 26 matching lines...) Expand all
177 print_preview_context_.total_page_count(), 195 print_preview_context_.total_page_count(),
178 scale_factor, page_layout_in_points, 196 scale_factor, page_layout_in_points,
179 *header_footer_info_); 197 *header_footer_info_);
180 } 198 }
181 #endif // defined(USE_SKIA) 199 #endif // defined(USE_SKIA)
182 } 200 }
183 201
184 // Done printing. Close the device context to retrieve the compiled metafile. 202 // Done printing. Close the device context to retrieve the compiled metafile.
185 metafile->FinishPage(); 203 metafile->FinishPage();
186 } 204 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698