Show
Ignore:
Timestamp:
04/25/07 12:10:24 (21 months ago)
Author:
hyatt
Message:

Rearchitect calcPrefWidths. The calculation is now done lazily only when minPrefWidth
or maxPrefWidth are asked for. The result of the calculation is cached.

The new invalidation scheme for pref width invalidation follows the
containing block hierarchy and knows to halt at positioned objects, since
they cannot influence the size of their containers.

Reviewed by darin

  • css/cssstyleselector.cpp: (WebCore::CSSStyleSelector::init): (WebCore::CSSStyleSelector::initForStyleResolve):
  • page/FrameView.cpp: (WebCore::FrameView::layout):
  • rendering/RenderApplet.cpp: (WebCore::RenderApplet::layout):
  • rendering/RenderBlock.cpp: (WebCore::RenderBlock::makeChildrenNonInline): (WebCore::RenderBlock::removeChild): (WebCore::RenderBlock::layout): (WebCore::RenderBlock::layoutBlock): (WebCore::RenderBlock::calcPrefWidths): (WebCore::InlineMinMaxIterator::endOfInline): (WebCore::shouldGrowTableCellForImage): (WebCore::RenderBlock::calcInlinePrefWidths): (WebCore::RenderBlock::calcBlockPrefWidths):
  • rendering/RenderBlock.h:
  • rendering/RenderBox.cpp: (WebCore::RenderBox::setStyle): (WebCore::RenderBox::minPrefWidth): (WebCore::RenderBox::maxPrefWidth): (WebCore::RenderBox::calcWidth): (WebCore::RenderBox::calcWidthUsing): (WebCore::RenderBox::calcAbsoluteHorizontal): (WebCore::RenderBox::calcAbsoluteHorizontalValues):
  • rendering/RenderBox.h:
  • rendering/RenderContainer.cpp: (WebCore::RenderContainer::removeChildNode): (WebCore::RenderContainer::appendChildNode): (WebCore::RenderContainer::insertChildNode): (WebCore::RenderContainer::layout):
  • rendering/RenderContainer.h: (WebCore::RenderContainer::moveChildNode):
  • rendering/RenderCounter.cpp: (WebCore::RenderCounter::dirtyLineBoxes): (WebCore::RenderCounter::calcPrefWidths):
  • rendering/RenderCounter.h:
  • rendering/RenderFileUploadControl.cpp: (WebCore::RenderFileUploadControl::calcPrefWidths):
  • rendering/RenderFlexibleBox.cpp: (WebCore::RenderFlexibleBox::calcHorizontalPrefWidths): (WebCore::RenderFlexibleBox::calcVerticalPrefWidths): (WebCore::RenderFlexibleBox::calcPrefWidths): (WebCore::RenderFlexibleBox::layoutBlock):
  • rendering/RenderForeignObject.cpp: (WebCore::RenderForeignObject::layout):
  • rendering/RenderFrameSet.cpp: (WebCore::RenderFrameSet::layout):
  • rendering/RenderHTMLCanvas.cpp: (WebCore::RenderHTMLCanvas::layout):
  • rendering/RenderImage.cpp: (WebCore::RenderImage::layout):
  • rendering/RenderInline.cpp:
  • rendering/RenderInline.h:
  • rendering/RenderListBox.cpp: (WebCore::RenderListBox::updateFromElement): (WebCore::RenderListBox::calcPrefWidths):
  • rendering/RenderListItem.cpp: (WebCore::firstNonMarkerChild): (WebCore::RenderListItem::updateMarkerLocation): (WebCore::RenderListItem::calcPrefWidths): (WebCore::RenderListItem::layout):
  • rendering/RenderListMarker.cpp: (WebCore::RenderListMarker::layout): (WebCore::RenderListMarker::calcPrefWidths): (WebCore::RenderListMarker::updateMargins):
  • rendering/RenderListMarker.h:
  • rendering/RenderObject.cpp: (WebCore::RenderObject::RenderObject): (WebCore::RenderObject::removeChildNode): (WebCore::RenderObject::moveChildNode): (WebCore::RenderObject::appendChildNode): (WebCore::RenderObject::insertChildNode): (WebCore::RenderObject::setPrefWidthsDirty): (WebCore::RenderObject::invalidateContainingBlockPrefWidths): (WebCore::RenderObject::information): (WebCore::RenderObject::setStyle):
  • rendering/RenderObject.h: (WebCore::RenderObject::layer): (WebCore::RenderObject::hasLayer): (WebCore::RenderObject::prefWidthsDirty): (WebCore::RenderObject::setNeedsLayoutAndPrefWidthsRecalc): (WebCore::RenderObject::setHasLayer):
  • rendering/RenderPartObject.cpp: (WebCore::RenderPartObject::layout):
  • rendering/RenderSVGContainer.cpp: (WebCore::RenderSVGContainer::layout):
  • rendering/RenderSVGContainer.h:
  • rendering/RenderSVGHiddenContainer.cpp:
  • rendering/RenderSVGHiddenContainer.h:
  • rendering/RenderSVGText.cpp: (WebCore::RenderSVGText::layout):
  • rendering/RenderTable.cpp: (WebCore::RenderTable::calcWidth): (WebCore::RenderTable::layout): (WebCore::RenderTable::removeChildNode):
  • rendering/RenderTable.h:
  • rendering/RenderTableRow.cpp: (WebCore::RenderTableRow::layout):
  • rendering/RenderTableSection.cpp: (WebCore::RenderTableSection::removeChildNode):
  • rendering/RenderTableSection.h:
  • rendering/RenderText.cpp: (WebCore::RenderText::trimmedPrefWidths): (WebCore::isSpaceAccordingToStyle): (WebCore::RenderText::minPrefWidth): (WebCore::RenderText::maxPrefWidth): (WebCore::RenderText::calcPrefWidths): (WebCore::RenderText::width):
  • rendering/RenderText.h:
  • rendering/RenderView.cpp: (WebCore::RenderView::RenderView): (WebCore::RenderView::calcPrefWidths): (WebCore::RenderView::layout):
  • rendering/RenderWidget.cpp: (WebCore::RenderWidget::layout):
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/rendering/RenderObject.h

    r21079 r21093  
    154154 
    155155    virtual RenderLayer* layer() const { return 0; } 
    156     bool hasLayer() const { return !!layer(); } 
    157156    RenderLayer* enclosingLayer() const; 
    158157    void addLayers(RenderLayer* parentLayer, RenderObject* newObject); 
     
    178177    // children. 
    179178    virtual RenderBlock* firstLineBlock() const; 
    180     virtual void updateFirstLetter(); 
    181179 
    182180    // Called when an object that was floating or positioned becomes a normal flow object 
     
    207205 
    208206    // raw tree manipulation 
    209     virtual RenderObject* removeChildNode(RenderObject*); 
    210     virtual void appendChildNode(RenderObject*); 
    211     virtual void insertChildNode(RenderObject* child, RenderObject* before); 
     207    virtual RenderObject* removeChildNode(RenderObject*, bool fullRemove = true); 
     208    virtual void appendChildNode(RenderObject*, bool fullAppend = true); 
     209    virtual void insertChildNode(RenderObject* child, RenderObject* before, bool fullInsert = true); 
     210    // Designed for speed.  Don't waste time doing a bunch of work like layer updating and repainting when we know that our 
     211    // change in parentage is not going to affect anything. 
     212    virtual void moveChildNode(RenderObject*); 
    212213    ////////////////////////////////////////// 
    213214 
     
    311312    bool isDragging() const { return m_isDragging; } 
    312313    bool isReplaced() const { return m_replaced; } // a "replaced" element (see CSS) 
    313  
     314     
     315    bool hasLayer() const { return m_hasLayer; } 
     316     
    314317    bool hasBoxDecorations() const { return m_paintBackground; } 
    315318    bool mustRepaintBackgroundOrBorder() const; 
     
    321324 
    322325    bool prefWidthsDirty() const { return m_prefWidthsDirty; } 
    323     bool recalcMinMax() const { return m_recalcMinMax; } 
    324326 
    325327    bool isSelectionBorder() const; 
     
    370372    void setChildNeedsLayout(bool b, bool markParents = true); 
    371373 
    372     void setPrefWidthsDirty(bool b) 
    373     { 
    374         m_prefWidthsDirty = b; 
    375         if (b) { 
    376             RenderObject* o = this; 
    377             RenderObject* root = this; 
    378             while(o) { // FIXME: && !o->m_recalcMinMax ) { 
    379                 o->m_recalcMinMax = true; 
    380                 root = o; 
    381                 o = o->m_parent; 
    382             } 
    383         } 
    384     } 
    385  
     374    void setPrefWidthsDirty(bool, bool markParents = true); 
     375    void invalidateContainingBlockPrefWidths(); 
     376     
    386377    void setNeedsLayoutAndPrefWidthsRecalc() 
    387378    { 
     379        setNeedsLayout(true); 
    388380        setPrefWidthsDirty(true); 
    389         setNeedsLayout(true); 
    390381    } 
    391382 
     
    398389    void setReplaced(bool b = true) { m_replaced = b; } 
    399390    void setHasOverflowClip(bool b = true) { m_hasOverflowClip = b; } 
     391    void setHasLayer(bool b = true) { m_hasLayer = b; } 
    400392 
    401393    void scheduleRelayout(); 
     
    460452                                         bool includeLeftEdge = true, bool includeRightEdge = true) { } 
    461453 
    462     /* 
    463      * This function calculates the minimum & maximum width that the object 
    464      * can be set to. 
    465      * 
    466      * when the Element calls setPrefWidthsDirty(false), calcPrefWidths() will 
    467      * be no longer called. 
    468      * 
    469      * when a element has a fixed size, m_minPrefWidth and m_maxPrefWidth should be 
    470      * set to the same value. This has the special meaning that m_width, 
    471      * contains the actual value. 
    472      * 
    473      * assumes calcPrefWidths has already been called for all children. 
    474      */ 
    475     virtual void calcPrefWidths() { } 
    476  
    477     /* 
    478      * Does the min max width recalculations after changes. 
    479      */ 
    480     void recalcMinMaxWidths(); 
    481  
     454     
    482455    /* 
    483456     * Calculates the actual width of the object (only for non inline 
     
    923896 
    924897    bool m_isAnonymous               : 1; 
    925     bool m_recalcMinMax              : 1; 
    926898    bool m_isText                    : 1; 
    927899    bool m_inline                    : 1; 
     
    929901    bool m_isDragging                : 1; 
    930902 
     903    bool m_hasLayer                  : 1; 
    931904    bool m_hasOverflowClip           : 1; 
    932905