| 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 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 static bool hasExplicitWidth(const RenderBlock* block) | 272 static bool hasExplicitWidth(const RenderBlock* block) |
| 273 { | 273 { |
| 274 // FIXME: This heuristic may need to be expanded to other ways a block can b
e wider or narrower | 274 // FIXME: This heuristic may need to be expanded to other ways a block can b
e wider or narrower |
| 275 // than its parent containing block. | 275 // than its parent containing block. |
| 276 return block->style() && block->style()->width().isSpecified(); | 276 return block->style() && block->style()->width().isSpecified(); |
| 277 } | 277 } |
| 278 | 278 |
| 279 FastTextAutosizer::FastTextAutosizer(const Document* document) | 279 FastTextAutosizer::FastTextAutosizer(const Document* document) |
| 280 : m_document(document) | 280 : m_document(document) |
| 281 , m_firstBlockToBeginLayout(0) | 281 , m_firstBlockToBeginLayout(0) |
| 282 #ifndef NDEBUG | 282 #if ENABLE(ASSERT) |
| 283 , m_blocksThatHaveBegunLayout() | 283 , m_blocksThatHaveBegunLayout() |
| 284 #endif | 284 #endif |
| 285 , m_superclusters() | 285 , m_superclusters() |
| 286 , m_clusterStack() | 286 , m_clusterStack() |
| 287 , m_fingerprintMapper() | 287 , m_fingerprintMapper() |
| 288 , m_pageInfo() | 288 , m_pageInfo() |
| 289 , m_updatePageInfoDeferred(false) | 289 , m_updatePageInfoDeferred(false) |
| 290 { | 290 { |
| 291 } | 291 } |
| 292 | 292 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 316 // Clear the cluster stack and the supercluster map to avoid stale point
ers. | 316 // Clear the cluster stack and the supercluster map to avoid stale point
ers. |
| 317 // Speculative fix for http://crbug.com/369485. | 317 // Speculative fix for http://crbug.com/369485. |
| 318 m_firstBlockToBeginLayout = 0; | 318 m_firstBlockToBeginLayout = 0; |
| 319 m_clusterStack.clear(); | 319 m_clusterStack.clear(); |
| 320 m_superclusters.clear(); | 320 m_superclusters.clear(); |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 | 323 |
| 324 FastTextAutosizer::BeginLayoutBehavior FastTextAutosizer::prepareForLayout(const
RenderBlock* block) | 324 FastTextAutosizer::BeginLayoutBehavior FastTextAutosizer::prepareForLayout(const
RenderBlock* block) |
| 325 { | 325 { |
| 326 #ifndef NDEBUG | 326 #if ENABLE(ASSERT) |
| 327 m_blocksThatHaveBegunLayout.add(block); | 327 m_blocksThatHaveBegunLayout.add(block); |
| 328 #endif | 328 #endif |
| 329 | 329 |
| 330 if (!m_firstBlockToBeginLayout) { | 330 if (!m_firstBlockToBeginLayout) { |
| 331 m_firstBlockToBeginLayout = block; | 331 m_firstBlockToBeginLayout = block; |
| 332 prepareClusterStack(block->parent()); | 332 prepareClusterStack(block->parent()); |
| 333 } else if (block == currentCluster()->m_root) { | 333 } else if (block == currentCluster()->m_root) { |
| 334 // Ignore beginLayout on the same block twice. | 334 // Ignore beginLayout on the same block twice. |
| 335 // This can happen with paginated overflow. | 335 // This can happen with paginated overflow. |
| 336 return StopLayout; | 336 return StopLayout; |
| 337 } | 337 } |
| 338 | 338 |
| 339 return ContinueLayout; | 339 return ContinueLayout; |
| 340 } | 340 } |
| 341 | 341 |
| 342 void FastTextAutosizer::prepareClusterStack(const RenderObject* renderer) | 342 void FastTextAutosizer::prepareClusterStack(const RenderObject* renderer) |
| 343 { | 343 { |
| 344 if (!renderer) | 344 if (!renderer) |
| 345 return; | 345 return; |
| 346 prepareClusterStack(renderer->parent()); | 346 prepareClusterStack(renderer->parent()); |
| 347 | 347 |
| 348 if (renderer->isRenderBlock()) { | 348 if (renderer->isRenderBlock()) { |
| 349 const RenderBlock* block = toRenderBlock(renderer); | 349 const RenderBlock* block = toRenderBlock(renderer); |
| 350 #ifndef NDEBUG | 350 #if ENABLE(ASSERT) |
| 351 m_blocksThatHaveBegunLayout.add(block); | 351 m_blocksThatHaveBegunLayout.add(block); |
| 352 #endif | 352 #endif |
| 353 if (Cluster* cluster = maybeCreateCluster(block)) | 353 if (Cluster* cluster = maybeCreateCluster(block)) |
| 354 m_clusterStack.append(adoptPtr(cluster)); | 354 m_clusterStack.append(adoptPtr(cluster)); |
| 355 } | 355 } |
| 356 } | 356 } |
| 357 | 357 |
| 358 void FastTextAutosizer::beginLayout(RenderBlock* block) | 358 void FastTextAutosizer::beginLayout(RenderBlock* block) |
| 359 { | 359 { |
| 360 ASSERT(shouldHandleLayout()); | 360 ASSERT(shouldHandleLayout()); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 | 419 |
| 420 void FastTextAutosizer::endLayout(RenderBlock* block) | 420 void FastTextAutosizer::endLayout(RenderBlock* block) |
| 421 { | 421 { |
| 422 ASSERT(shouldHandleLayout()); | 422 ASSERT(shouldHandleLayout()); |
| 423 | 423 |
| 424 if (block == m_firstBlockToBeginLayout) { | 424 if (block == m_firstBlockToBeginLayout) { |
| 425 m_firstBlockToBeginLayout = 0; | 425 m_firstBlockToBeginLayout = 0; |
| 426 m_clusterStack.clear(); | 426 m_clusterStack.clear(); |
| 427 m_superclusters.clear(); | 427 m_superclusters.clear(); |
| 428 m_stylesRetainedDuringLayout.clear(); | 428 m_stylesRetainedDuringLayout.clear(); |
| 429 #ifndef NDEBUG | 429 #if ENABLE(ASSERT) |
| 430 m_blocksThatHaveBegunLayout.clear(); | 430 m_blocksThatHaveBegunLayout.clear(); |
| 431 #endif | 431 #endif |
| 432 // Tables can create two layout scopes for the same block so the isEmpty | 432 // Tables can create two layout scopes for the same block so the isEmpty |
| 433 // check below is needed to guard against endLayout being called twice. | 433 // check below is needed to guard against endLayout being called twice. |
| 434 } else if (!m_clusterStack.isEmpty() && currentCluster()->m_root == block) { | 434 } else if (!m_clusterStack.isEmpty() && currentCluster()->m_root == block) { |
| 435 m_clusterStack.removeLast(); | 435 m_clusterStack.removeLast(); |
| 436 } | 436 } |
| 437 } | 437 } |
| 438 | 438 |
| 439 float FastTextAutosizer::inflate(RenderObject* parent, InflateBehavior behavior,
float multiplier) | 439 float FastTextAutosizer::inflate(RenderObject* parent, InflateBehavior behavior,
float multiplier) |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1002 | 1002 |
| 1003 return false; | 1003 return false; |
| 1004 } | 1004 } |
| 1005 | 1005 |
| 1006 FastTextAutosizer::Cluster* FastTextAutosizer::currentCluster() const | 1006 FastTextAutosizer::Cluster* FastTextAutosizer::currentCluster() const |
| 1007 { | 1007 { |
| 1008 ASSERT_WITH_SECURITY_IMPLICATION(!m_clusterStack.isEmpty()); | 1008 ASSERT_WITH_SECURITY_IMPLICATION(!m_clusterStack.isEmpty()); |
| 1009 return m_clusterStack.last().get(); | 1009 return m_clusterStack.last().get(); |
| 1010 } | 1010 } |
| 1011 | 1011 |
| 1012 #ifndef NDEBUG | 1012 #if ENABLE(ASSERT) |
| 1013 void FastTextAutosizer::FingerprintMapper::assertMapsAreConsistent() | 1013 void FastTextAutosizer::FingerprintMapper::assertMapsAreConsistent() |
| 1014 { | 1014 { |
| 1015 // For each fingerprint -> block mapping in m_blocksForFingerprint we should
have an associated | 1015 // For each fingerprint -> block mapping in m_blocksForFingerprint we should
have an associated |
| 1016 // map from block -> fingerprint in m_fingerprints. | 1016 // map from block -> fingerprint in m_fingerprints. |
| 1017 ReverseFingerprintMap::iterator end = m_blocksForFingerprint.end(); | 1017 ReverseFingerprintMap::iterator end = m_blocksForFingerprint.end(); |
| 1018 for (ReverseFingerprintMap::iterator fingerprintIt = m_blocksForFingerprint.
begin(); fingerprintIt != end; ++fingerprintIt) { | 1018 for (ReverseFingerprintMap::iterator fingerprintIt = m_blocksForFingerprint.
begin(); fingerprintIt != end; ++fingerprintIt) { |
| 1019 Fingerprint fingerprint = fingerprintIt->key; | 1019 Fingerprint fingerprint = fingerprintIt->key; |
| 1020 BlockSet* blocks = fingerprintIt->value.get(); | 1020 BlockSet* blocks = fingerprintIt->value.get(); |
| 1021 for (BlockSet::iterator blockIt = blocks->begin(); blockIt != blocks->en
d(); ++blockIt) { | 1021 for (BlockSet::iterator blockIt = blocks->begin(); blockIt != blocks->en
d(); ++blockIt) { |
| 1022 const RenderBlock* block = (*blockIt); | 1022 const RenderBlock* block = (*blockIt); |
| 1023 ASSERT(m_fingerprints.get(block) == fingerprint); | 1023 ASSERT(m_fingerprints.get(block) == fingerprint); |
| 1024 } | 1024 } |
| 1025 } | 1025 } |
| 1026 } | 1026 } |
| 1027 #endif | 1027 #endif |
| 1028 | 1028 |
| 1029 void FastTextAutosizer::FingerprintMapper::add(const RenderObject* renderer, Fin
gerprint fingerprint) | 1029 void FastTextAutosizer::FingerprintMapper::add(const RenderObject* renderer, Fin
gerprint fingerprint) |
| 1030 { | 1030 { |
| 1031 remove(renderer); | 1031 remove(renderer); |
| 1032 | 1032 |
| 1033 m_fingerprints.set(renderer, fingerprint); | 1033 m_fingerprints.set(renderer, fingerprint); |
| 1034 #ifndef NDEBUG | 1034 #if ENABLE(ASSERT) |
| 1035 assertMapsAreConsistent(); | 1035 assertMapsAreConsistent(); |
| 1036 #endif | 1036 #endif |
| 1037 } | 1037 } |
| 1038 | 1038 |
| 1039 void FastTextAutosizer::FingerprintMapper::addTentativeClusterRoot(const RenderB
lock* block, Fingerprint fingerprint) | 1039 void FastTextAutosizer::FingerprintMapper::addTentativeClusterRoot(const RenderB
lock* block, Fingerprint fingerprint) |
| 1040 { | 1040 { |
| 1041 add(block, fingerprint); | 1041 add(block, fingerprint); |
| 1042 | 1042 |
| 1043 ReverseFingerprintMap::AddResult addResult = m_blocksForFingerprint.add(fing
erprint, PassOwnPtr<BlockSet>()); | 1043 ReverseFingerprintMap::AddResult addResult = m_blocksForFingerprint.add(fing
erprint, PassOwnPtr<BlockSet>()); |
| 1044 if (addResult.isNewEntry) | 1044 if (addResult.isNewEntry) |
| 1045 addResult.storedValue->value = adoptPtr(new BlockSet); | 1045 addResult.storedValue->value = adoptPtr(new BlockSet); |
| 1046 addResult.storedValue->value->add(block); | 1046 addResult.storedValue->value->add(block); |
| 1047 #ifndef NDEBUG | 1047 #if ENABLE(ASSERT) |
| 1048 assertMapsAreConsistent(); | 1048 assertMapsAreConsistent(); |
| 1049 #endif | 1049 #endif |
| 1050 } | 1050 } |
| 1051 | 1051 |
| 1052 bool FastTextAutosizer::FingerprintMapper::remove(const RenderObject* renderer) | 1052 bool FastTextAutosizer::FingerprintMapper::remove(const RenderObject* renderer) |
| 1053 { | 1053 { |
| 1054 Fingerprint fingerprint = m_fingerprints.take(renderer); | 1054 Fingerprint fingerprint = m_fingerprints.take(renderer); |
| 1055 if (!fingerprint || !renderer->isRenderBlock()) | 1055 if (!fingerprint || !renderer->isRenderBlock()) |
| 1056 return false; | 1056 return false; |
| 1057 | 1057 |
| 1058 ReverseFingerprintMap::iterator blocksIter = m_blocksForFingerprint.find(fin
gerprint); | 1058 ReverseFingerprintMap::iterator blocksIter = m_blocksForFingerprint.find(fin
gerprint); |
| 1059 if (blocksIter == m_blocksForFingerprint.end()) | 1059 if (blocksIter == m_blocksForFingerprint.end()) |
| 1060 return false; | 1060 return false; |
| 1061 | 1061 |
| 1062 BlockSet& blocks = *blocksIter->value; | 1062 BlockSet& blocks = *blocksIter->value; |
| 1063 blocks.remove(toRenderBlock(renderer)); | 1063 blocks.remove(toRenderBlock(renderer)); |
| 1064 if (blocks.isEmpty()) | 1064 if (blocks.isEmpty()) |
| 1065 m_blocksForFingerprint.remove(blocksIter); | 1065 m_blocksForFingerprint.remove(blocksIter); |
| 1066 #ifndef NDEBUG | 1066 #if ENABLE(ASSERT) |
| 1067 assertMapsAreConsistent(); | 1067 assertMapsAreConsistent(); |
| 1068 #endif | 1068 #endif |
| 1069 return true; | 1069 return true; |
| 1070 } | 1070 } |
| 1071 | 1071 |
| 1072 FastTextAutosizer::Fingerprint FastTextAutosizer::FingerprintMapper::get(const R
enderObject* renderer) | 1072 FastTextAutosizer::Fingerprint FastTextAutosizer::FingerprintMapper::get(const R
enderObject* renderer) |
| 1073 { | 1073 { |
| 1074 return m_fingerprints.get(renderer); | 1074 return m_fingerprints.get(renderer); |
| 1075 } | 1075 } |
| 1076 | 1076 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 computedSize = multiplier * specifiedSize; | 1148 computedSize = multiplier * specifiedSize; |
| 1149 } else { | 1149 } else { |
| 1150 computedSize = multiplier * pleasantSize + gradientAfterPleasantSize * (
specifiedSize - pleasantSize); | 1150 computedSize = multiplier * pleasantSize + gradientAfterPleasantSize * (
specifiedSize - pleasantSize); |
| 1151 if (computedSize < specifiedSize) | 1151 if (computedSize < specifiedSize) |
| 1152 computedSize = specifiedSize; | 1152 computedSize = specifiedSize; |
| 1153 } | 1153 } |
| 1154 return computedSize; | 1154 return computedSize; |
| 1155 } | 1155 } |
| 1156 | 1156 |
| 1157 } // namespace WebCore | 1157 } // namespace WebCore |
| OLD | NEW |