OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. |
5 * All rights reserved. | 5 * All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1186 } | 1186 } |
1187 if (!rects.isEmpty()) { | 1187 if (!rects.isEmpty()) { |
1188 LayoutRect outlineRect = unionRectEvenIfEmpty(rects); | 1188 LayoutRect outlineRect = unionRectEvenIfEmpty(rects); |
1189 outlineRect.inflate(outlineOutset); | 1189 outlineRect.inflate(outlineOutset); |
1190 overflowRect.unite(outlineRect); | 1190 overflowRect.unite(outlineRect); |
1191 } | 1191 } |
1192 } | 1192 } |
1193 return overflowRect; | 1193 return overflowRect; |
1194 } | 1194 } |
1195 | 1195 |
1196 bool LayoutInline::mapToVisualRectInAncestorSpace( | 1196 bool LayoutInline::mapToVisualRectInAncestorSpaceInternal( |
1197 const LayoutBoxModelObject* ancestor, | 1197 const LayoutBoxModelObject* ancestor, |
1198 LayoutRect& rect, | 1198 TransformState& transformState, |
1199 VisualRectFlags visualRectFlags) const { | 1199 VisualRectFlags visualRectFlags) const { |
1200 if (ancestor == this) | 1200 if (ancestor == this) |
1201 return true; | 1201 return true; |
1202 | 1202 |
1203 LayoutObject* container = this->container(); | 1203 LayoutObject* container = this->container(); |
1204 ASSERT(container == parent()); | 1204 ASSERT(container == parent()); |
1205 if (!container) | 1205 if (!container) |
1206 return true; | 1206 return true; |
1207 | 1207 |
| 1208 bool preserve3D = container->style()->preserves3D() || style()->preserves3D(); |
| 1209 |
| 1210 TransformState::TransformAccumulation accumulation = |
| 1211 preserve3D ? TransformState::AccumulateTransform |
| 1212 : TransformState::FlattenTransform; |
| 1213 |
1208 if (style()->hasInFlowPosition() && layer()) { | 1214 if (style()->hasInFlowPosition() && layer()) { |
1209 // Apply the in-flow position offset when invalidating a rectangle. The | 1215 // Apply the in-flow position offset when invalidating a rectangle. The |
1210 // layer is translated, but the layout box isn't, so we need to do this to | 1216 // layer is translated, but the layout box isn't, so we need to do this to |
1211 // get the right dirty rect. Since this is called from LayoutObject:: | 1217 // get the right dirty rect. Since this is called from LayoutObject:: |
1212 // setStyle, the relative position flag on the LayoutObject has been | 1218 // setStyle, the relative position flag on the LayoutObject has been |
1213 // cleared, so use the one on the style(). | 1219 // cleared, so use the one on the style(). |
1214 rect.move(layer()->offsetForInFlowPosition()); | 1220 transformState.move(layer()->offsetForInFlowPosition(), accumulation); |
1215 } | 1221 } |
1216 | 1222 |
1217 LayoutBox* containerBox = | 1223 LayoutBox* containerBox = |
1218 container->isBox() ? toLayoutBox(container) : nullptr; | 1224 container->isBox() ? toLayoutBox(container) : nullptr; |
1219 if (containerBox && container != ancestor && | 1225 if (containerBox && container != ancestor && |
1220 !containerBox->mapScrollingContentsRectToBoxSpace(rect, visualRectFlags)) | 1226 !containerBox->mapScrollingContentsRectToBoxSpace( |
| 1227 transformState, accumulation, visualRectFlags)) |
1221 return false; | 1228 return false; |
1222 | 1229 |
1223 // TODO(wkorman): Generalize Ruby specialization and/or document more clearly. | 1230 // TODO(wkorman): Generalize Ruby specialization and/or document more clearly. |
1224 if (containerBox && !isRuby()) | 1231 if (containerBox && !isRuby()) { |
| 1232 transformState.flatten(); |
| 1233 LayoutRect rect(transformState.lastPlanarQuad().boundingBox()); |
1225 containerBox->flipForWritingMode(rect); | 1234 containerBox->flipForWritingMode(rect); |
1226 return container->mapToVisualRectInAncestorSpace(ancestor, rect, | 1235 transformState.setQuad(FloatQuad(FloatRect(rect))); |
1227 visualRectFlags); | 1236 } |
| 1237 return container->mapToVisualRectInAncestorSpaceInternal( |
| 1238 ancestor, transformState, visualRectFlags); |
1228 } | 1239 } |
1229 | 1240 |
1230 LayoutSize LayoutInline::offsetFromContainer( | 1241 LayoutSize LayoutInline::offsetFromContainer( |
1231 const LayoutObject* container) const { | 1242 const LayoutObject* container) const { |
1232 ASSERT(container == this->container()); | 1243 ASSERT(container == this->container()); |
1233 | 1244 |
1234 LayoutSize offset; | 1245 LayoutSize offset; |
1235 if (isInFlowPositioned()) | 1246 if (isInFlowPositioned()) |
1236 offset += offsetForInFlowPosition(); | 1247 offset += offsetForInFlowPosition(); |
1237 | 1248 |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1517 paintInvalidator.invalidateDisplayItemClient(*box, invalidationReason); | 1528 paintInvalidator.invalidateDisplayItemClient(*box, invalidationReason); |
1518 } | 1529 } |
1519 | 1530 |
1520 // TODO(lunalu): Not to just dump 0, 0 as the x and y here | 1531 // TODO(lunalu): Not to just dump 0, 0 as the x and y here |
1521 LayoutRect LayoutInline::debugRect() const { | 1532 LayoutRect LayoutInline::debugRect() const { |
1522 IntRect linesBox = enclosingIntRect(linesBoundingBox()); | 1533 IntRect linesBox = enclosingIntRect(linesBoundingBox()); |
1523 return LayoutRect(IntRect(0, 0, linesBox.width(), linesBox.height())); | 1534 return LayoutRect(IntRect(0, 0, linesBox.width(), linesBox.height())); |
1524 } | 1535 } |
1525 | 1536 |
1526 } // namespace blink | 1537 } // namespace blink |
OLD | NEW |