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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutTableCell.h

Issue 2846563002: Optimize collapsed border calculation (step 1) (Closed)
Patch Set: - Created 3 years, 7 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2013 Apple Inc. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2013 Apple Inc.
8 * All rights reserved. 8 * All rights reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 17 matching lines...) Expand all
28 28
29 #include "core/CoreExport.h" 29 #include "core/CoreExport.h"
30 #include "core/layout/LayoutBlockFlow.h" 30 #include "core/layout/LayoutBlockFlow.h"
31 #include "core/layout/LayoutTableRow.h" 31 #include "core/layout/LayoutTableRow.h"
32 #include "core/layout/LayoutTableSection.h" 32 #include "core/layout/LayoutTableSection.h"
33 #include "platform/LengthFunctions.h" 33 #include "platform/LengthFunctions.h"
34 #include <memory> 34 #include <memory>
35 35
36 namespace blink { 36 namespace blink {
37 37
38 static const unsigned kUnsetColumnIndex = 0x1FFFFFFF; 38 #define BITS_OF_ABSOLUTE_COLUMN_INDEX 27
39 static const unsigned kMaxColumnIndex = 0x1FFFFFFE; // 536,870,910 39 static const unsigned kUnsetColumnIndex =
40 40 (1u << BITS_OF_ABSOLUTE_COLUMN_INDEX) - 1;
41 enum IncludeBorderColorOrNot { kDoNotIncludeBorderColor, kIncludeBorderColor }; 41 static const unsigned kMaxColumnIndex = kUnsetColumnIndex - 1;
42 42
43 class SubtreeLayoutScope; 43 class SubtreeLayoutScope;
44 44
45 // LayoutTableCell is used to represent a table cell (display: table-cell). 45 // LayoutTableCell is used to represent a table cell (display: table-cell).
46 // 46 //
47 // Because rows are as tall as the tallest cell, cells need to be aligned into 47 // Because rows are as tall as the tallest cell, cells need to be aligned into
48 // the enclosing row space. To achieve this, LayoutTableCell introduces the 48 // the enclosing row space. To achieve this, LayoutTableCell introduces the
49 // concept of 'intrinsic padding'. Those 2 paddings are used to shift the box 49 // concept of 'intrinsic padding'. Those 2 paddings are used to shift the box
50 // into the row as follows: 50 // into the row as follows:
51 // 51 //
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 private: 320 private:
321 const LayoutTableCell& layout_table_cell_; 321 const LayoutTableCell& layout_table_cell_;
322 CollapsedBorderValue start_border_; 322 CollapsedBorderValue start_border_;
323 CollapsedBorderValue end_border_; 323 CollapsedBorderValue end_border_;
324 CollapsedBorderValue before_border_; 324 CollapsedBorderValue before_border_;
325 CollapsedBorderValue after_border_; 325 CollapsedBorderValue after_border_;
326 }; 326 };
327 327
328 bool UsesCompositedCellDisplayItemClients() const; 328 bool UsesCompositedCellDisplayItemClients() const;
329 const CollapsedBorderValues* GetCollapsedBorderValues() const { 329 const CollapsedBorderValues* GetCollapsedBorderValues() const {
330 DCHECK(collapsed_border_values_valid_);
330 return collapsed_border_values_.get(); 331 return collapsed_border_values_.get();
331 } 332 }
333 void InvalidateCollapsedBorderValues() {
334 collapsed_border_values_valid_ = false;
335 }
332 336
333 LayoutRect DebugRect() const override; 337 LayoutRect DebugRect() const override;
334 338
335 void AdjustChildDebugRect(LayoutRect&) const override; 339 void AdjustChildDebugRect(LayoutRect&) const override;
336 340
337 // A table cell's location is relative to its containing section. 341 // A table cell's location is relative to its containing section.
338 LayoutBox* LocationContainer() const override { return Section(); } 342 LayoutBox* LocationContainer() const override { return Section(); }
339 343
340 bool HasLineIfEmpty() const override; 344 bool HasLineIfEmpty() const override;
341 345
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 // column, column group). 401 // column, column group).
398 // TODO(jchaffraix): It should be easier to compute all the borders in 402 // TODO(jchaffraix): It should be easier to compute all the borders in
399 // physical coordinates. However this is not the design of the current code. 403 // physical coordinates. However this is not the design of the current code.
400 // 404 //
401 // Blink's support for mixed directionality is currently partial. We only 405 // Blink's support for mixed directionality is currently partial. We only
402 // support the directionality up to |styleForCellFlow|. See comment on the 406 // support the directionality up to |styleForCellFlow|. See comment on the
403 // function above for more details. 407 // function above for more details.
404 // See also https://code.google.com/p/chromium/issues/detail?id=128227 for 408 // See also https://code.google.com/p/chromium/issues/detail?id=128227 for
405 // some history. 409 // some history.
406 // 410 //
407 // Those functions are called when the cache (m_collapsedBorders) is 411 // Those functions are called during UpdateCollapsedBorderValues().
408 // invalidated on LayoutTable. 412 inline CSSPropertyID ResolveBorderProperty(CSSPropertyID) const;
409 CollapsedBorderValue ComputeCollapsedStartBorder( 413 CollapsedBorderValue ComputeCollapsedStartBorder() const;
410 IncludeBorderColorOrNot = kIncludeBorderColor) const; 414 CollapsedBorderValue ComputeCollapsedEndBorder() const;
411 CollapsedBorderValue ComputeCollapsedEndBorder( 415 CollapsedBorderValue ComputeCollapsedBeforeBorder() const;
412 IncludeBorderColorOrNot = kIncludeBorderColor) const; 416 CollapsedBorderValue ComputeCollapsedAfterBorder() const;
413 CollapsedBorderValue ComputeCollapsedBeforeBorder( 417
414 IncludeBorderColorOrNot = kIncludeBorderColor) const; 418 void UpdateCollapsedBorderValues() const;
415 CollapsedBorderValue ComputeCollapsedAfterBorder(
416 IncludeBorderColorOrNot = kIncludeBorderColor) const;
417 419
418 Length LogicalWidthFromColumns(LayoutTableCol* first_col_for_this_cell, 420 Length LogicalWidthFromColumns(LayoutTableCol* first_col_for_this_cell,
419 Length width_from_style) const; 421 Length width_from_style) const;
420 422
421 void UpdateColAndRowSpanFlags(); 423 void UpdateColAndRowSpanFlags();
422 424
423 unsigned ParseRowSpanFromDOM() const; 425 unsigned ParseRowSpanFromDOM() const;
424 unsigned ParseColSpanFromDOM() const; 426 unsigned ParseColSpanFromDOM() const;
425 427
426 void NextSibling() const = delete; 428 void NextSibling() const = delete;
427 void PreviousSibling() const = delete; 429 void PreviousSibling() const = delete;
428 430
431 unsigned absolute_column_index_ : BITS_OF_ABSOLUTE_COLUMN_INDEX;
432
433 // When adding or removing bits here, we should also adjust
434 // BITS_OF_ABSOLUTE_COLUMN_INDEX to use remaining bits of a 32-bit word.
429 // Note MSVC will only pack members if they have identical types, hence we use 435 // Note MSVC will only pack members if they have identical types, hence we use
430 // unsigned instead of bool here. 436 // unsigned instead of bool here.
431 unsigned absolute_column_index_ : 29;
432 unsigned cell_width_changed_ : 1; 437 unsigned cell_width_changed_ : 1;
433 unsigned has_col_span_ : 1; 438 unsigned has_col_span_ : 1;
434 unsigned has_row_span_ : 1; 439 unsigned has_row_span_ : 1;
435 440
441 // This is set when collapsed_border_values_ needs recalculation.
442 mutable unsigned collapsed_border_values_valid_ : 1;
443 // This is set by UpdateCollapsedBorderValues() if the newly calculated
444 // collapsed borders are visually different from the previous values.
445 mutable unsigned collapsed_borders_visually_changed_ : 1;
446 mutable std::unique_ptr<CollapsedBorderValues> collapsed_border_values_;
447
436 // The intrinsic padding. 448 // The intrinsic padding.
437 // See class comment for what they are. 449 // See class comment for what they are.
438 // 450 //
439 // Note: Those fields are using non-subpixel units (int) 451 // Note: Those fields are using non-subpixel units (int)
440 // because we don't do fractional arithmetic on tables. 452 // because we don't do fractional arithmetic on tables.
441 int intrinsic_padding_before_; 453 int intrinsic_padding_before_;
442 int intrinsic_padding_after_; 454 int intrinsic_padding_after_;
443
444 std::unique_ptr<CollapsedBorderValues> collapsed_border_values_;
445 }; 455 };
446 456
447 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableCell, IsTableCell()); 457 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableCell, IsTableCell());
448 458
449 inline LayoutTableCell* LayoutTableCell::PreviousCell() const { 459 inline LayoutTableCell* LayoutTableCell::PreviousCell() const {
450 return ToLayoutTableCell(LayoutObject::PreviousSibling()); 460 return ToLayoutTableCell(LayoutObject::PreviousSibling());
451 } 461 }
452 462
453 inline LayoutTableCell* LayoutTableCell::NextCell() const { 463 inline LayoutTableCell* LayoutTableCell::NextCell() const {
454 return ToLayoutTableCell(LayoutObject::NextSibling()); 464 return ToLayoutTableCell(LayoutObject::NextSibling());
455 } 465 }
456 466
457 inline LayoutTableCell* LayoutTableRow::FirstCell() const { 467 inline LayoutTableCell* LayoutTableRow::FirstCell() const {
458 return ToLayoutTableCell(FirstChild()); 468 return ToLayoutTableCell(FirstChild());
459 } 469 }
460 470
461 inline LayoutTableCell* LayoutTableRow::LastCell() const { 471 inline LayoutTableCell* LayoutTableRow::LastCell() const {
462 return ToLayoutTableCell(LastChild()); 472 return ToLayoutTableCell(LastChild());
463 } 473 }
464 474
465 } // namespace blink 475 } // namespace blink
466 476
467 #endif // LayoutTableCell_h 477 #endif // LayoutTableCell_h
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutTable.cpp ('k') | third_party/WebKit/Source/core/layout/LayoutTableCell.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698