| 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 28 matching lines...) Expand all Loading... |
| 39 , m_nonUniformStepsCount(0) | 39 , m_nonUniformStepsCount(0) |
| 40 , m_transformedStepsCount(0) | 40 , m_transformedStepsCount(0) |
| 41 , m_mapCoordinatesFlags(flags) | 41 , m_mapCoordinatesFlags(flags) |
| 42 { | 42 { |
| 43 } | 43 } |
| 44 | 44 |
| 45 RenderGeometryMap::~RenderGeometryMap() | 45 RenderGeometryMap::~RenderGeometryMap() |
| 46 { | 46 { |
| 47 } | 47 } |
| 48 | 48 |
| 49 void RenderGeometryMap::mapToContainer(TransformState& transformState, const Ren
derLayerModelObject* container) const | 49 void RenderGeometryMap::mapToContainer(TransformState& transformState, const Ren
derBox* container) const |
| 50 { | 50 { |
| 51 // If the mapping includes something like columns, we have to go via rendere
rs. | 51 // If the mapping includes something like columns, we have to go via rendere
rs. |
| 52 if (hasNonUniformStep()) { | 52 if (hasNonUniformStep()) { |
| 53 m_mapping.last().m_renderer->mapLocalToContainer(container, transformSta
te, ApplyContainerFlip | m_mapCoordinatesFlags); | 53 m_mapping.last().m_renderer->mapLocalToContainer(container, transformSta
te, ApplyContainerFlip | m_mapCoordinatesFlags); |
| 54 transformState.flatten(); | 54 transformState.flatten(); |
| 55 return; | 55 return; |
| 56 } | 56 } |
| 57 | 57 |
| 58 #if ENABLE(ASSERT) | 58 #if ENABLE(ASSERT) |
| 59 bool foundContainer = !container || (m_mapping.size() && m_mapping[0].m_rend
erer == container); | 59 bool foundContainer = !container || (m_mapping.size() && m_mapping[0].m_rend
erer == container); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 82 transformState.applyTransform(*currentStep.m_transform.get(), ac
cumulate); | 82 transformState.applyTransform(*currentStep.m_transform.get(), ac
cumulate); |
| 83 else | 83 else |
| 84 transformState.move(currentStep.m_offset.width(), currentStep.m_
offset.height(), accumulate); | 84 transformState.move(currentStep.m_offset.width(), currentStep.m_
offset.height(), accumulate); |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 ASSERT(foundContainer); | 88 ASSERT(foundContainer); |
| 89 transformState.flatten(); | 89 transformState.flatten(); |
| 90 } | 90 } |
| 91 | 91 |
| 92 FloatPoint RenderGeometryMap::mapToContainer(const FloatPoint& p, const RenderLa
yerModelObject* container) const | 92 FloatPoint RenderGeometryMap::mapToContainer(const FloatPoint& p, const RenderBo
x* container) const |
| 93 { | 93 { |
| 94 FloatPoint result; | 94 FloatPoint result; |
| 95 | 95 |
| 96 if (!hasTransformStep() && !hasNonUniformStep() && (!container || (m_mapping
.size() && container == m_mapping[0].m_renderer))) | 96 if (!hasTransformStep() && !hasNonUniformStep() && (!container || (m_mapping
.size() && container == m_mapping[0].m_renderer))) |
| 97 result = p + m_accumulatedOffset; | 97 result = p + m_accumulatedOffset; |
| 98 else { | 98 else { |
| 99 TransformState transformState(TransformState::ApplyTransformDirection, p
); | 99 TransformState transformState(TransformState::ApplyTransformDirection, p
); |
| 100 mapToContainer(transformState, container); | 100 mapToContainer(transformState, container); |
| 101 result = transformState.lastPlanarPoint(); | 101 result = transformState.lastPlanarPoint(); |
| 102 } | 102 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 127 fprintf(stderr, "RenderGeometryMap::dumpSteps accumulatedOffset=%d,%d\n", m_
accumulatedOffset.width().toInt(), m_accumulatedOffset.height().toInt()); | 127 fprintf(stderr, "RenderGeometryMap::dumpSteps accumulatedOffset=%d,%d\n", m_
accumulatedOffset.width().toInt(), m_accumulatedOffset.height().toInt()); |
| 128 for (int i = m_mapping.size() - 1; i >= 0; --i) { | 128 for (int i = m_mapping.size() - 1; i >= 0; --i) { |
| 129 fprintf(stderr, " [%d] %s: offset=%d,%d", i, m_mapping[i].m_renderer->de
bugName().ascii().data(), m_mapping[i].m_offset.width().toInt(), m_mapping[i].m_
offset.height().toInt()); | 129 fprintf(stderr, " [%d] %s: offset=%d,%d", i, m_mapping[i].m_renderer->de
bugName().ascii().data(), m_mapping[i].m_offset.width().toInt(), m_mapping[i].m_
offset.height().toInt()); |
| 130 if (m_mapping[i].m_hasTransform) | 130 if (m_mapping[i].m_hasTransform) |
| 131 fprintf(stderr, " hasTransform"); | 131 fprintf(stderr, " hasTransform"); |
| 132 fprintf(stderr, "\n"); | 132 fprintf(stderr, "\n"); |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 #endif | 135 #endif |
| 136 | 136 |
| 137 FloatQuad RenderGeometryMap::mapToContainer(const FloatRect& rect, const RenderL
ayerModelObject* container) const | 137 FloatQuad RenderGeometryMap::mapToContainer(const FloatRect& rect, const RenderB
ox* container) const |
| 138 { | 138 { |
| 139 FloatRect result; | 139 FloatRect result; |
| 140 | 140 |
| 141 if (!hasTransformStep() && !hasNonUniformStep() && (!container || (m_mapping
.size() && container == m_mapping[0].m_renderer))) { | 141 if (!hasTransformStep() && !hasNonUniformStep() && (!container || (m_mapping
.size() && container == m_mapping[0].m_renderer))) { |
| 142 result = rect; | 142 result = rect; |
| 143 result.move(m_accumulatedOffset); | 143 result.move(m_accumulatedOffset); |
| 144 } else { | 144 } else { |
| 145 TransformState transformState(TransformState::ApplyTransformDirection, r
ect.center(), rect); | 145 TransformState transformState(TransformState::ApplyTransformDirection, r
ect.center(), rect); |
| 146 mapToContainer(transformState, container); | 146 mapToContainer(transformState, container); |
| 147 result = transformState.lastPlanarQuad().boundingBox(); | 147 result = transformState.lastPlanarQuad().boundingBox(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 158 | 158 |
| 159 // Inspector creates renderers with negative width <https://bugs.webkit.
org/show_bug.cgi?id=87194>. | 159 // Inspector creates renderers with negative width <https://bugs.webkit.
org/show_bug.cgi?id=87194>. |
| 160 // Taking FloatQuad bounds avoids spurious assertions because of that. | 160 // Taking FloatQuad bounds avoids spurious assertions because of that. |
| 161 ASSERT(enclosingIntRect(rendererMappedResult) == enclosingIntRect(FloatQ
uad(result).boundingBox())); | 161 ASSERT(enclosingIntRect(rendererMappedResult) == enclosingIntRect(FloatQ
uad(result).boundingBox())); |
| 162 } | 162 } |
| 163 #endif | 163 #endif |
| 164 | 164 |
| 165 return result; | 165 return result; |
| 166 } | 166 } |
| 167 | 167 |
| 168 void RenderGeometryMap::pushMappingsToAncestor(const RenderObject* renderer, con
st RenderLayerModelObject* ancestorRenderer) | 168 void RenderGeometryMap::pushMappingsToAncestor(const RenderObject* renderer, con
st RenderBox* ancestorRenderer) |
| 169 { | 169 { |
| 170 // We need to push mappings in reverse order here, so do insertions rather t
han appends. | 170 // We need to push mappings in reverse order here, so do insertions rather t
han appends. |
| 171 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.size()
); | 171 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.size()
); |
| 172 do { | 172 do { |
| 173 renderer = renderer->pushMappingToContainer(ancestorRenderer, *this); | 173 renderer = renderer->pushMappingToContainer(ancestorRenderer, *this); |
| 174 } while (renderer && renderer != ancestorRenderer); | 174 } while (renderer && renderer != ancestorRenderer); |
| 175 | 175 |
| 176 ASSERT(m_mapping.isEmpty() || isTopmostRenderView(m_mapping[0].m_renderer)); | 176 ASSERT(m_mapping.isEmpty() || isTopmostRenderView(m_mapping[0].m_renderer)); |
| 177 } | 177 } |
| 178 | 178 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 if (!m_mapping.size()) { | 210 if (!m_mapping.size()) { |
| 211 ASSERT(ancestorLayer->renderer()->isRenderView()); | 211 ASSERT(ancestorLayer->renderer()->isRenderView()); |
| 212 pushMappingsToAncestor(ancestorLayer->renderer(), 0); | 212 pushMappingsToAncestor(ancestorLayer->renderer(), 0); |
| 213 } | 213 } |
| 214 | 214 |
| 215 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.si
ze()); | 215 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.si
ze()); |
| 216 bool accumulatingTransform = layer->renderer()->style()->preserves3D() |
| ancestorLayer->renderer()->style()->preserves3D(); | 216 bool accumulatingTransform = layer->renderer()->style()->preserves3D() |
| ancestorLayer->renderer()->style()->preserves3D(); |
| 217 push(renderer, toLayoutSize(layerOffset), accumulatingTransform, /*isNon
Uniform*/ false, /*hasTransform*/ false); | 217 push(renderer, toLayoutSize(layerOffset), accumulatingTransform, /*isNon
Uniform*/ false, /*hasTransform*/ false); |
| 218 return; | 218 return; |
| 219 } | 219 } |
| 220 const RenderLayerModelObject* ancestorRenderer = ancestorLayer ? ancestorLay
er->renderer() : 0; | 220 const RenderBox* ancestorRenderer = ancestorLayer ? ancestorLayer->renderer(
) : 0; |
| 221 pushMappingsToAncestor(renderer, ancestorRenderer); | 221 pushMappingsToAncestor(renderer, ancestorRenderer); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void RenderGeometryMap::push(const RenderObject* renderer, const LayoutSize& off
setFromContainer, bool accumulatingTransform, bool isNonUniform, bool hasTransfo
rm) | 224 void RenderGeometryMap::push(const RenderObject* renderer, const LayoutSize& off
setFromContainer, bool accumulatingTransform, bool isNonUniform, bool hasTransfo
rm) |
| 225 { | 225 { |
| 226 // fprintf(stderr, "RenderGeometryMap::push %p %d,%d isNonUniform=%d\n", rend
erer, offsetFromContainer.width().toInt(), offsetFromContainer.height().toInt(),
isNonUniform); | 226 // fprintf(stderr, "RenderGeometryMap::push %p %d,%d isNonUniform=%d\n", rend
erer, offsetFromContainer.width().toInt(), offsetFromContainer.height().toInt(),
isNonUniform); |
| 227 | 227 |
| 228 ASSERT(m_insertionPosition != kNotFound); | 228 ASSERT(m_insertionPosition != kNotFound); |
| 229 ASSERT(!renderer->isRenderView() || !m_insertionPosition || m_mapCoordinates
Flags & TraverseDocumentBoundaries); | 229 ASSERT(!renderer->isRenderView() || !m_insertionPosition || m_mapCoordinates
Flags & TraverseDocumentBoundaries); |
| 230 | 230 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 246 RenderGeometryMapStep& step = m_mapping[m_insertionPosition]; | 246 RenderGeometryMapStep& step = m_mapping[m_insertionPosition]; |
| 247 | 247 |
| 248 if (!t.isIntegerTranslation()) | 248 if (!t.isIntegerTranslation()) |
| 249 step.m_transform = adoptPtr(new TransformationMatrix(t)); | 249 step.m_transform = adoptPtr(new TransformationMatrix(t)); |
| 250 else | 250 else |
| 251 step.m_offset = LayoutSize(t.e(), t.f()); | 251 step.m_offset = LayoutSize(t.e(), t.f()); |
| 252 | 252 |
| 253 stepInserted(step); | 253 stepInserted(step); |
| 254 } | 254 } |
| 255 | 255 |
| 256 void RenderGeometryMap::popMappingsToAncestor(const RenderLayerModelObject* ance
storRenderer) | 256 void RenderGeometryMap::popMappingsToAncestor(const RenderBox* ancestorRenderer) |
| 257 { | 257 { |
| 258 ASSERT(m_mapping.size()); | 258 ASSERT(m_mapping.size()); |
| 259 | 259 |
| 260 while (m_mapping.size() && m_mapping.last().m_renderer != ancestorRenderer)
{ | 260 while (m_mapping.size() && m_mapping.last().m_renderer != ancestorRenderer)
{ |
| 261 stepRemoved(m_mapping.last()); | 261 stepRemoved(m_mapping.last()); |
| 262 m_mapping.removeLast(); | 262 m_mapping.removeLast(); |
| 263 } | 263 } |
| 264 } | 264 } |
| 265 | 265 |
| 266 void RenderGeometryMap::popMappingsToAncestor(const RenderLayer* ancestorLayer) | 266 void RenderGeometryMap::popMappingsToAncestor(const RenderLayer* ancestorLayer) |
| 267 { | 267 { |
| 268 const RenderLayerModelObject* ancestorRenderer = ancestorLayer ? ancestorLay
er->renderer() : 0; | 268 const RenderBox* ancestorRenderer = ancestorLayer ? ancestorLayer->renderer(
) : 0; |
| 269 popMappingsToAncestor(ancestorRenderer); | 269 popMappingsToAncestor(ancestorRenderer); |
| 270 } | 270 } |
| 271 | 271 |
| 272 void RenderGeometryMap::stepInserted(const RenderGeometryMapStep& step) | 272 void RenderGeometryMap::stepInserted(const RenderGeometryMapStep& step) |
| 273 { | 273 { |
| 274 m_accumulatedOffset += step.m_offset; | 274 m_accumulatedOffset += step.m_offset; |
| 275 | 275 |
| 276 if (step.m_isNonUniform) | 276 if (step.m_isNonUniform) |
| 277 ++m_nonUniformStepsCount; | 277 ++m_nonUniformStepsCount; |
| 278 | 278 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 301 if (!renderer->isRenderView()) | 301 if (!renderer->isRenderView()) |
| 302 return false; | 302 return false; |
| 303 | 303 |
| 304 // If we're not working with multiple RenderViews, then any view is consider
ed | 304 // If we're not working with multiple RenderViews, then any view is consider
ed |
| 305 // "topmost" (to preserve original behavior). | 305 // "topmost" (to preserve original behavior). |
| 306 return !(m_mapCoordinatesFlags & TraverseDocumentBoundaries); | 306 return !(m_mapCoordinatesFlags & TraverseDocumentBoundaries); |
| 307 } | 307 } |
| 308 #endif | 308 #endif |
| 309 | 309 |
| 310 } // namespace blink | 310 } // namespace blink |
| OLD | NEW |