| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2012 Apple 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 | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 if (currentStep.m_transform) | 91 if (currentStep.m_transform) |
| 92 transformState.applyTransform(*currentStep.m_transform.get(), ac
cumulate); | 92 transformState.applyTransform(*currentStep.m_transform.get(), ac
cumulate); |
| 93 else | 93 else |
| 94 transformState.move(currentStep.m_offset.width(), currentStep.m_
offset.height(), accumulate); | 94 transformState.move(currentStep.m_offset.width(), currentStep.m_
offset.height(), accumulate); |
| 95 } | 95 } |
| 96 | 96 |
| 97 if (inFixed && !currentStep.m_offsetForFixedPosition.isZero()) { | 97 if (inFixed && !currentStep.m_offsetForFixedPosition.isZero()) { |
| 98 ASSERT(currentStep.m_layoutObject->isLayoutView()); | 98 ASSERT(currentStep.m_layoutObject->isLayoutView()); |
| 99 transformState.move(currentStep.m_offsetForFixedPosition); | 99 transformState.move(currentStep.m_offsetForFixedPosition); |
| 100 } | 100 } |
| 101 if (!currentStep.m_offsetForStickyPosition.isZero()) { |
| 102 ASSERT(currentStep.m_layoutObject->style()->position() == StickyPosi
tion); |
| 103 transformState.move(currentStep.m_offsetForStickyPosition); |
| 104 } |
| 101 } | 105 } |
| 102 | 106 |
| 103 ASSERT(foundContainer); | 107 ASSERT(foundContainer); |
| 104 transformState.flatten(); | 108 transformState.flatten(); |
| 105 } | 109 } |
| 106 | 110 |
| 107 #ifndef NDEBUG | 111 #ifndef NDEBUG |
| 108 // Handy function to call from gdb while debugging mismatched point/rect errors. | 112 // Handy function to call from gdb while debugging mismatched point/rect errors. |
| 109 void LayoutGeometryMap::dumpSteps() const | 113 void LayoutGeometryMap::dumpSteps() const |
| 110 { | 114 { |
| 111 fprintf(stderr, "LayoutGeometryMap::dumpSteps accumulatedOffset=%d,%d\n", m_
accumulatedOffset.width().toInt(), m_accumulatedOffset.height().toInt()); | 115 fprintf(stderr, "LayoutGeometryMap::dumpSteps accumulatedOffset=%d,%d\n", m_
accumulatedOffset.width().toInt(), m_accumulatedOffset.height().toInt()); |
| 112 for (int i = m_mapping.size() - 1; i >= 0; --i) { | 116 for (int i = m_mapping.size() - 1; i >= 0; --i) { |
| 113 fprintf(stderr, " [%d] %s: offset=%d,%d", i, | 117 fprintf(stderr, " [%d] %s: offset=%d,%d", i, |
| 114 m_mapping[i].m_layoutObject->debugName().ascii().data(), | 118 m_mapping[i].m_layoutObject->debugName().ascii().data(), |
| 115 m_mapping[i].m_offset.width().toInt(), | 119 m_mapping[i].m_offset.width().toInt(), |
| 116 m_mapping[i].m_offset.height().toInt()); | 120 m_mapping[i].m_offset.height().toInt()); |
| 117 if (m_mapping[i].m_hasTransform) | 121 if (m_mapping[i].m_hasTransform) |
| 118 fprintf(stderr, " hasTransform"); | 122 fprintf(stderr, " hasTransform"); |
| 119 fprintf(stderr, "\n"); | 123 fprintf(stderr, "\n"); |
| 120 } | 124 } |
| 121 } | 125 } |
| 122 #endif | 126 #endif |
| 123 | 127 |
| 124 FloatQuad LayoutGeometryMap::mapToContainer(const FloatRect& rect, const LayoutB
oxModelObject* container) const | 128 FloatQuad LayoutGeometryMap::mapToContainer(const FloatRect& rect, const LayoutB
oxModelObject* container) const |
| 125 { | 129 { |
| 126 FloatQuad result; | 130 FloatQuad result; |
| 127 | |
| 128 if (!hasFixedPositionStep() && !hasTransformStep() && !hasNonUniformStep() &
& (!container || (m_mapping.size() && container == m_mapping[0].m_layoutObject))
) { | 131 if (!hasFixedPositionStep() && !hasTransformStep() && !hasNonUniformStep() &
& (!container || (m_mapping.size() && container == m_mapping[0].m_layoutObject))
) { |
| 129 result = rect; | 132 result = rect; |
| 130 result.move(m_accumulatedOffset); | 133 result.move(m_accumulatedOffset); |
| 131 } else { | 134 } else { |
| 132 TransformState transformState(TransformState::ApplyTransformDirection, r
ect.center(), rect); | 135 TransformState transformState(TransformState::ApplyTransformDirection, r
ect.center(), rect); |
| 133 mapToContainer(transformState, container); | 136 mapToContainer(transformState, container); |
| 134 result = transformState.lastPlanarQuad(); | 137 result = transformState.lastPlanarQuad(); |
| 135 } | 138 } |
| 136 | 139 |
| 137 #if ENABLE(ASSERT) | 140 #if ENABLE(ASSERT) |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 | 213 |
| 211 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.si
ze()); | 214 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.si
ze()); |
| 212 bool accumulatingTransform = layer->layoutObject()->style()->preserves3D
() || ancestorLayer->layoutObject()->style()->preserves3D(); | 215 bool accumulatingTransform = layer->layoutObject()->style()->preserves3D
() || ancestorLayer->layoutObject()->style()->preserves3D(); |
| 213 push(layoutObject, toLayoutSize(layerOffset), accumulatingTransform, /*i
sNonUniform*/ false, /*isFixedPosition*/ false, /*hasTransform*/ false); | 216 push(layoutObject, toLayoutSize(layerOffset), accumulatingTransform, /*i
sNonUniform*/ false, /*isFixedPosition*/ false, /*hasTransform*/ false); |
| 214 return; | 217 return; |
| 215 } | 218 } |
| 216 const LayoutBoxModelObject* ancestorLayoutObject = ancestorLayer ? ancestorL
ayer->layoutObject() : 0; | 219 const LayoutBoxModelObject* ancestorLayoutObject = ancestorLayer ? ancestorL
ayer->layoutObject() : 0; |
| 217 pushMappingsToAncestor(layoutObject, ancestorLayoutObject); | 220 pushMappingsToAncestor(layoutObject, ancestorLayoutObject); |
| 218 } | 221 } |
| 219 | 222 |
| 220 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const LayoutSize&
offsetFromContainer, bool accumulatingTransform, bool isNonUniform, bool isFixe
dPosition, bool hasTransform, LayoutSize offsetForFixedPosition) | 223 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const LayoutSize&
offsetFromContainer, bool accumulatingTransform, bool isNonUniform, bool isFixe
dPosition, bool hasTransform, LayoutSize offsetForFixedPosition, LayoutSize offs
etForStickyPosition) |
| 221 { | 224 { |
| 222 // fprintf(stderr, "LayoutGeometryMap::push %p %d,%d isNonUniform=%d\n", layo
utObject, offsetFromContainer.width().toInt(), offsetFromContainer.height().toIn
t(), isNonUniform); | 225 // fprintf(stderr, "LayoutGeometryMap::push %p %d,%d isNonUniform=%d\n", layo
utObject, offsetFromContainer.width().toInt(), offsetFromContainer.height().toIn
t(), isNonUniform); |
| 223 | 226 |
| 224 ASSERT(m_insertionPosition != kNotFound); | 227 ASSERT(m_insertionPosition != kNotFound); |
| 225 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin
atesFlags & TraverseDocumentBoundaries); | 228 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin
atesFlags & TraverseDocumentBoundaries); |
| 226 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView()); | 229 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView()); |
| 230 ASSERT(offsetForStickyPosition.isZero() || layoutObject->style()->position()
== StickyPosition); |
| 227 | 231 |
| 228 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac
cumulatingTransform, isNonUniform, isFixedPosition, hasTransform)); | 232 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac
cumulatingTransform, isNonUniform, isFixedPosition, hasTransform)); |
| 229 | 233 |
| 230 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition]; | 234 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition]; |
| 231 step.m_offset = offsetFromContainer; | 235 step.m_offset = offsetFromContainer; |
| 232 step.m_offsetForFixedPosition = offsetForFixedPosition; | 236 step.m_offsetForFixedPosition = offsetForFixedPosition; |
| 237 step.m_offsetForStickyPosition = offsetForStickyPosition; |
| 233 | 238 |
| 234 stepInserted(step); | 239 stepInserted(step); |
| 235 } | 240 } |
| 236 | 241 |
| 237 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const Transformat
ionMatrix& t, bool accumulatingTransform, bool isNonUniform, bool isFixedPositio
n, bool hasTransform, LayoutSize offsetForFixedPosition) | 242 void LayoutGeometryMap::push(const LayoutObject* layoutObject, const Transformat
ionMatrix& t, bool accumulatingTransform, bool isNonUniform, bool isFixedPositio
n, bool hasTransform, LayoutSize offsetForFixedPosition, LayoutSize offsetForSti
ckyPosition) |
| 238 { | 243 { |
| 239 ASSERT(m_insertionPosition != kNotFound); | 244 ASSERT(m_insertionPosition != kNotFound); |
| 240 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin
atesFlags & TraverseDocumentBoundaries); | 245 ASSERT(!layoutObject->isLayoutView() || !m_insertionPosition || m_mapCoordin
atesFlags & TraverseDocumentBoundaries); |
| 241 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView()); | 246 ASSERT(offsetForFixedPosition.isZero() || layoutObject->isLayoutView()); |
| 247 ASSERT(offsetForStickyPosition.isZero() || layoutObject->style()->position()
== StickyPosition); |
| 242 | 248 |
| 243 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac
cumulatingTransform, isNonUniform, isFixedPosition, hasTransform)); | 249 m_mapping.insert(m_insertionPosition, LayoutGeometryMapStep(layoutObject, ac
cumulatingTransform, isNonUniform, isFixedPosition, hasTransform)); |
| 244 | 250 |
| 245 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition]; | 251 LayoutGeometryMapStep& step = m_mapping[m_insertionPosition]; |
| 246 step.m_offsetForFixedPosition = offsetForFixedPosition; | 252 step.m_offsetForFixedPosition = offsetForFixedPosition; |
| 253 step.m_offsetForStickyPosition = offsetForStickyPosition; |
| 247 | 254 |
| 248 if (!t.isIntegerTranslation()) | 255 if (!t.isIntegerTranslation()) |
| 249 step.m_transform = adoptPtr(new TransformationMatrix(t)); | 256 step.m_transform = adoptPtr(new TransformationMatrix(t)); |
| 250 else | 257 else |
| 251 step.m_offset = LayoutSize(t.e(), t.f()); | 258 step.m_offset = LayoutSize(t.e(), t.f()); |
| 252 | 259 |
| 253 stepInserted(step); | 260 stepInserted(step); |
| 254 } | 261 } |
| 255 | 262 |
| 256 void LayoutGeometryMap::popMappingsToAncestor(const LayoutBoxModelObject* ancest
orLayoutObject) | 263 void LayoutGeometryMap::popMappingsToAncestor(const LayoutBoxModelObject* ancest
orLayoutObject) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 // If we're not working with multiple LayoutViews, then any view is consider
ed | 319 // If we're not working with multiple LayoutViews, then any view is consider
ed |
| 313 // "topmost" (to preserve original behavior). | 320 // "topmost" (to preserve original behavior). |
| 314 if (!(m_mapCoordinatesFlags & TraverseDocumentBoundaries)) | 321 if (!(m_mapCoordinatesFlags & TraverseDocumentBoundaries)) |
| 315 return true; | 322 return true; |
| 316 | 323 |
| 317 return layoutObject->frame()->isMainFrame(); | 324 return layoutObject->frame()->isMainFrame(); |
| 318 } | 325 } |
| 319 #endif | 326 #endif |
| 320 | 327 |
| 321 } // namespace blink | 328 } // namespace blink |
| OLD | NEW |