OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 1112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1123 // | 1123 // |
1124 // FIXME: Another problem with simply moving lines is that the available line | 1124 // FIXME: Another problem with simply moving lines is that the available line |
1125 // width may change (because of floats). Technically if the location we move | 1125 // width may change (because of floats). Technically if the location we move |
1126 // the line to has a different line width than our old position, then we need | 1126 // the line to has a different line width than our old position, then we need |
1127 // to dirty the line and all following lines. | 1127 // to dirty the line and all following lines. |
1128 LayoutUnit logical_offset = line_box.LineTopWithLeading(); | 1128 LayoutUnit logical_offset = line_box.LineTopWithLeading(); |
1129 LayoutUnit line_height = line_box.LineBottomWithLeading() - logical_offset; | 1129 LayoutUnit line_height = line_box.LineBottomWithLeading() - logical_offset; |
1130 logical_offset += delta; | 1130 logical_offset += delta; |
1131 line_box.SetPaginationStrut(LayoutUnit()); | 1131 line_box.SetPaginationStrut(LayoutUnit()); |
1132 line_box.SetIsFirstAfterPageBreak(false); | 1132 line_box.SetIsFirstAfterPageBreak(false); |
1133 if (!View()->GetLayoutState()->IsPaginated()) | 1133 LayoutState* layout_state = View()->GetLayoutState(); |
| 1134 if (!layout_state->IsPaginated()) |
1134 return; | 1135 return; |
1135 LayoutUnit page_logical_height = PageLogicalHeightForOffset(logical_offset); | 1136 LayoutUnit page_logical_height = PageLogicalHeightForOffset(logical_offset); |
1136 if (!page_logical_height) | 1137 if (!page_logical_height) |
1137 return; | 1138 return; |
1138 LayoutUnit remaining_logical_height = PageRemainingLogicalHeightForOffset( | 1139 LayoutUnit remaining_logical_height = PageRemainingLogicalHeightForOffset( |
1139 logical_offset, kAssociateWithLatterPage); | 1140 logical_offset, kAssociateWithLatterPage); |
1140 int line_index = LineCount(&line_box); | 1141 int line_index = LineCount(&line_box); |
1141 if (remaining_logical_height < line_height || | 1142 if (remaining_logical_height < line_height || |
1142 (ShouldBreakAtLineToAvoidWidow() && | 1143 (ShouldBreakAtLineToAvoidWidow() && |
1143 LineBreakToAvoidWidow() == line_index)) { | 1144 LineBreakToAvoidWidow() == line_index)) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 LayoutUnit strut_to_propagate; | 1188 LayoutUnit strut_to_propagate; |
1188 if (remaining_logical_height == page_logical_height) { | 1189 if (remaining_logical_height == page_logical_height) { |
1189 // We're at the very top of a page or column. | 1190 // We're at the very top of a page or column. |
1190 if (line_box != FirstRootBox()) | 1191 if (line_box != FirstRootBox()) |
1191 line_box.SetIsFirstAfterPageBreak(true); | 1192 line_box.SetIsFirstAfterPageBreak(true); |
1192 // If this is the first line in the block, and the block has a top border or | 1193 // If this is the first line in the block, and the block has a top border or |
1193 // padding, we may want to set a strut on the block, so that everything ends | 1194 // padding, we may want to set a strut on the block, so that everything ends |
1194 // up in the next column or page. Setting a strut on the block is also | 1195 // up in the next column or page. Setting a strut on the block is also |
1195 // important when it comes to satisfying orphan requirements. | 1196 // important when it comes to satisfying orphan requirements. |
1196 if (ShouldSetStrutOnBlock(*this, line_box, logical_offset, line_index, | 1197 if (ShouldSetStrutOnBlock(*this, line_box, logical_offset, line_index, |
1197 page_logical_height)) | 1198 page_logical_height)) { |
1198 strut_to_propagate = logical_offset; | 1199 DCHECK(!IsTableCell()); |
| 1200 strut_to_propagate = |
| 1201 logical_offset + layout_state->HeightOffsetForTableHeaders(); |
| 1202 } else if (LayoutUnit pagination_strut = |
| 1203 layout_state->HeightOffsetForTableHeaders()) { |
| 1204 delta += pagination_strut; |
| 1205 line_box.SetPaginationStrut(pagination_strut); |
| 1206 } |
1199 } else if (line_box == FirstRootBox() && AllowsPaginationStrut()) { | 1207 } else if (line_box == FirstRootBox() && AllowsPaginationStrut()) { |
1200 // This is the first line in the block. The block may still start in the | 1208 // This is the first line in the block. The block may still start in the |
1201 // previous column or page, and if that's the case, attempt to pull it over | 1209 // previous column or page, and if that's the case, attempt to pull it over |
1202 // to where this line is, so that we don't split the top border or padding. | 1210 // to where this line is, so that we don't split the top border or padding. |
1203 LayoutUnit strut = | 1211 LayoutUnit strut = remaining_logical_height + logical_offset + |
1204 remaining_logical_height + logical_offset - page_logical_height; | 1212 layout_state->HeightOffsetForTableHeaders() - |
| 1213 page_logical_height; |
1205 if (strut > LayoutUnit()) { | 1214 if (strut > LayoutUnit()) { |
1206 // The block starts in a previous column or page. Set a strut on the block | 1215 // The block starts in a previous column or page. Set a strut on the block |
1207 // if there's room for the top border, padding and the line in one column | 1216 // if there's room for the top border, padding and the line in one column |
1208 // or page. | 1217 // or page. |
1209 if (logical_offset + line_height <= page_logical_height) | 1218 if (logical_offset + line_height <= page_logical_height) |
1210 strut_to_propagate = strut; | 1219 strut_to_propagate = strut; |
1211 } | 1220 } |
1212 } | 1221 } |
1213 | 1222 |
1214 // If we found that some preceding content (lines, border and padding) belongs | 1223 // If we found that some preceding content (lines, border and padding) belongs |
(...skipping 3481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4696 return LayoutBlock::DeprecatedInvalidatePaint(paint_invalidation_state); | 4705 return LayoutBlock::DeprecatedInvalidatePaint(paint_invalidation_state); |
4697 } | 4706 } |
4698 | 4707 |
4699 void LayoutBlockFlow::InvalidateDisplayItemClients( | 4708 void LayoutBlockFlow::InvalidateDisplayItemClients( |
4700 PaintInvalidationReason invalidation_reason) const { | 4709 PaintInvalidationReason invalidation_reason) const { |
4701 BlockFlowPaintInvalidator(*this).InvalidateDisplayItemClients( | 4710 BlockFlowPaintInvalidator(*this).InvalidateDisplayItemClients( |
4702 invalidation_reason); | 4711 invalidation_reason); |
4703 } | 4712 } |
4704 | 4713 |
4705 } // namespace blink | 4714 } // namespace blink |
OLD | NEW |