| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007 Alp Toker <alp@atoker.com> | 2 * Copyright (C) 2007 Alp Toker <alp@atoker.com> |
| 3 * Copyright (C) 2007 Apple Inc. | 3 * Copyright (C) 2007 Apple Inc. |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 // reduced smaller to make the widest line fit, we just clip instead (this | 39 // reduced smaller to make the widest line fit, we just clip instead (this |
| 40 // behavior matches MacIE and Mozilla, at least). | 40 // behavior matches MacIE and Mozilla, at least). |
| 41 // TODO(rhogan): Decide if this quirk is still required. | 41 // TODO(rhogan): Decide if this quirk is still required. |
| 42 const float kPrintingMaximumShrinkFactor = 2; | 42 const float kPrintingMaximumShrinkFactor = 2; |
| 43 | 43 |
| 44 PrintContext::PrintContext(LocalFrame* frame) | 44 PrintContext::PrintContext(LocalFrame* frame) |
| 45 : frame_(frame), is_printing_(false), linked_destinations_valid_(false) {} | 45 : frame_(frame), is_printing_(false), linked_destinations_valid_(false) {} |
| 46 | 46 |
| 47 PrintContext::~PrintContext() { | 47 PrintContext::~PrintContext() { |
| 48 if (is_printing_) | 48 if (is_printing_) |
| 49 end(); | 49 EndPrintMode(); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void PrintContext::ComputePageRects(const FloatRect& print_rect, | 52 void PrintContext::ComputePageRects(const FloatRect& print_rect, |
| 53 float header_height, | 53 float header_height, |
| 54 float footer_height, | 54 float footer_height, |
| 55 float user_scale_factor, | 55 float user_scale_factor, |
| 56 float& out_page_height) { | 56 float& out_page_height) { |
| 57 page_rects_.clear(); | 57 page_rects_.clear(); |
| 58 out_page_height = 0; | 58 out_page_height = 0; |
| 59 | 59 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 ? inline_direction_start | 156 ? inline_direction_start |
| 157 : inline_direction_start - page_logical_width; | 157 : inline_direction_start - page_logical_width; |
| 158 IntRect page_rect(page_logical_left, page_logical_top, page_logical_width, | 158 IntRect page_rect(page_logical_left, page_logical_top, page_logical_width, |
| 159 page_logical_height); | 159 page_logical_height); |
| 160 if (!is_horizontal) | 160 if (!is_horizontal) |
| 161 page_rect = page_rect.TransposedRect(); | 161 page_rect = page_rect.TransposedRect(); |
| 162 page_rects_.push_back(page_rect); | 162 page_rects_.push_back(page_rect); |
| 163 } | 163 } |
| 164 } | 164 } |
| 165 | 165 |
| 166 void PrintContext::begin(float width, float height) { | 166 void PrintContext::BeginPrintMode(float width, float height) { |
| 167 ASSERT(width > 0); | 167 ASSERT(width > 0); |
| 168 ASSERT(height > 0); | 168 ASSERT(height > 0); |
| 169 | 169 |
| 170 // This function can be called multiple times to adjust printing parameters | 170 // This function can be called multiple times to adjust printing parameters |
| 171 // without going back to screen mode. | 171 // without going back to screen mode. |
| 172 is_printing_ = true; | 172 is_printing_ = true; |
| 173 | 173 |
| 174 FloatSize original_page_size = FloatSize(width, height); | 174 FloatSize original_page_size = FloatSize(width, height); |
| 175 FloatSize min_layout_size = frame_->ResizePageRectsKeepingRatio( | 175 FloatSize min_layout_size = frame_->ResizePageRectsKeepingRatio( |
| 176 original_page_size, FloatSize(width * kPrintingMinimumShrinkFactor, | 176 original_page_size, FloatSize(width * kPrintingMinimumShrinkFactor, |
| 177 height * kPrintingMinimumShrinkFactor)); | 177 height * kPrintingMinimumShrinkFactor)); |
| 178 | 178 |
| 179 // This changes layout, so callers need to make sure that they don't paint to | 179 // This changes layout, so callers need to make sure that they don't paint to |
| 180 // screen while in printing mode. | 180 // screen while in printing mode. |
| 181 frame_->SetPrinting( | 181 frame_->SetPrinting( |
| 182 true, min_layout_size, original_page_size, | 182 true, min_layout_size, original_page_size, |
| 183 kPrintingMaximumShrinkFactor / kPrintingMinimumShrinkFactor); | 183 kPrintingMaximumShrinkFactor / kPrintingMinimumShrinkFactor); |
| 184 } | 184 } |
| 185 | 185 |
| 186 void PrintContext::end() { | 186 void PrintContext::EndPrintMode() { |
| 187 ASSERT(is_printing_); | 187 ASSERT(is_printing_); |
| 188 is_printing_ = false; | 188 is_printing_ = false; |
| 189 frame_->SetPrinting(false, FloatSize(), FloatSize(), 0); | 189 frame_->SetPrinting(false, FloatSize(), FloatSize(), 0); |
| 190 linked_destinations_.clear(); | 190 linked_destinations_.clear(); |
| 191 linked_destinations_valid_ = false; | 191 linked_destinations_valid_ = false; |
| 192 } | 192 } |
| 193 | 193 |
| 194 static LayoutBoxModelObject* EnclosingBoxModelObject(LayoutObject* object) { | 194 static LayoutBoxModelObject* EnclosingBoxModelObject(LayoutObject* object) { |
| 195 while (object && !object->IsBoxModelObject()) | 195 while (object && !object->IsBoxModelObject()) |
| 196 object = object->Parent(); | 196 object = object->Parent(); |
| 197 if (!object) | 197 if (!object) |
| 198 return nullptr; | 198 return nullptr; |
| 199 return ToLayoutBoxModelObject(object); | 199 return ToLayoutBoxModelObject(object); |
| 200 } | 200 } |
| 201 | 201 |
| 202 int PrintContext::PageNumberForElement(Element* element, | 202 int PrintContext::PageNumberForElement(Element* element, |
| 203 const FloatSize& page_size_in_pixels) { | 203 const FloatSize& page_size_in_pixels) { |
| 204 element->GetDocument().UpdateStyleAndLayout(); | 204 element->GetDocument().UpdateStyleAndLayout(); |
| 205 | 205 |
| 206 LocalFrame* frame = element->GetDocument().GetFrame(); | 206 LocalFrame* frame = element->GetDocument().GetFrame(); |
| 207 FloatRect page_rect(FloatPoint(0, 0), page_size_in_pixels); | 207 FloatRect page_rect(FloatPoint(0, 0), page_size_in_pixels); |
| 208 PrintContext print_context(frame); | 208 PrintContext print_context(frame); |
| 209 print_context.begin(page_rect.Width(), page_rect.Height()); | 209 print_context.BeginPrintMode(page_rect.Width(), page_rect.Height()); |
| 210 | 210 |
| 211 LayoutBoxModelObject* box = | 211 LayoutBoxModelObject* box = |
| 212 EnclosingBoxModelObject(element->GetLayoutObject()); | 212 EnclosingBoxModelObject(element->GetLayoutObject()); |
| 213 if (!box) | 213 if (!box) |
| 214 return -1; | 214 return -1; |
| 215 | 215 |
| 216 FloatSize scaled_page_size = page_size_in_pixels; | 216 FloatSize scaled_page_size = page_size_in_pixels; |
| 217 scaled_page_size.Scale(frame->View()->ContentsSize().Width() / | 217 scaled_page_size.Scale(frame->View()->ContentsSize().Width() / |
| 218 page_rect.Width()); | 218 page_rect.Width()); |
| 219 print_context.ComputePageRectsWithPageSize(scaled_page_size); | 219 print_context.ComputePageRectsWithPageSize(scaled_page_size); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 } | 278 } |
| 279 | 279 |
| 280 String PrintContext::PageProperty(LocalFrame* frame, | 280 String PrintContext::PageProperty(LocalFrame* frame, |
| 281 const char* property_name, | 281 const char* property_name, |
| 282 int page_number) { | 282 int page_number) { |
| 283 Document* document = frame->GetDocument(); | 283 Document* document = frame->GetDocument(); |
| 284 PrintContext print_context(frame); | 284 PrintContext print_context(frame); |
| 285 // Any non-zero size is OK here. We don't care about actual layout. We just | 285 // Any non-zero size is OK here. We don't care about actual layout. We just |
| 286 // want to collect @page rules and figure out what declarations apply on a | 286 // want to collect @page rules and figure out what declarations apply on a |
| 287 // given page (that may or may not exist). | 287 // given page (that may or may not exist). |
| 288 print_context.begin(800, 1000); | 288 print_context.BeginPrintMode(800, 1000); |
| 289 RefPtr<ComputedStyle> style = document->StyleForPage(page_number); | 289 RefPtr<ComputedStyle> style = document->StyleForPage(page_number); |
| 290 | 290 |
| 291 // Implement formatters for properties we care about. | 291 // Implement formatters for properties we care about. |
| 292 if (!strcmp(property_name, "margin-left")) { | 292 if (!strcmp(property_name, "margin-left")) { |
| 293 if (style->MarginLeft().IsAuto()) | 293 if (style->MarginLeft().IsAuto()) |
| 294 return String("auto"); | 294 return String("auto"); |
| 295 return String::Number(style->MarginLeft().Value()); | 295 return String::Number(style->MarginLeft().Value()); |
| 296 } | 296 } |
| 297 if (!strcmp(property_name, "line-height")) | 297 if (!strcmp(property_name, "line-height")) |
| 298 return String::Number(style->LineHeight().Value()); | 298 return String::Number(style->LineHeight().Value()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 329 String::Number(margin_top) + ' ' + String::Number(margin_right) + ' ' + | 329 String::Number(margin_top) + ' ' + String::Number(margin_right) + ' ' + |
| 330 String::Number(margin_bottom) + ' ' + String::Number(margin_left); | 330 String::Number(margin_bottom) + ' ' + String::Number(margin_left); |
| 331 } | 331 } |
| 332 | 332 |
| 333 int PrintContext::NumberOfPages(LocalFrame* frame, | 333 int PrintContext::NumberOfPages(LocalFrame* frame, |
| 334 const FloatSize& page_size_in_pixels) { | 334 const FloatSize& page_size_in_pixels) { |
| 335 frame->GetDocument()->UpdateStyleAndLayout(); | 335 frame->GetDocument()->UpdateStyleAndLayout(); |
| 336 | 336 |
| 337 FloatRect page_rect(FloatPoint(0, 0), page_size_in_pixels); | 337 FloatRect page_rect(FloatPoint(0, 0), page_size_in_pixels); |
| 338 PrintContext print_context(frame); | 338 PrintContext print_context(frame); |
| 339 print_context.begin(page_rect.Width(), page_rect.Height()); | 339 print_context.BeginPrintMode(page_rect.Width(), page_rect.Height()); |
| 340 // Account for shrink-to-fit. | 340 // Account for shrink-to-fit. |
| 341 FloatSize scaled_page_size = page_size_in_pixels; | 341 FloatSize scaled_page_size = page_size_in_pixels; |
| 342 scaled_page_size.Scale(frame->View()->ContentsSize().Width() / | 342 scaled_page_size.Scale(frame->View()->ContentsSize().Width() / |
| 343 page_rect.Width()); | 343 page_rect.Width()); |
| 344 print_context.ComputePageRectsWithPageSize(scaled_page_size); | 344 print_context.ComputePageRectsWithPageSize(scaled_page_size); |
| 345 return print_context.PageCount(); | 345 return print_context.PageCount(); |
| 346 } | 346 } |
| 347 | 347 |
| 348 DEFINE_TRACE(PrintContext) { | 348 DEFINE_TRACE(PrintContext) { |
| 349 visitor->Trace(frame_); | 349 visitor->Trace(frame_); |
| 350 visitor->Trace(linked_destinations_); | 350 visitor->Trace(linked_destinations_); |
| 351 } | 351 } |
| 352 | 352 |
| 353 } // namespace blink | 353 } // namespace blink |
| OLD | NEW |