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 |