2011-06-28 Levi Weintraub <leviw@chromium.org>
[WebKit-https.git] / Source / WebCore / rendering / RenderBox.h
index edc1cf4..69511d1 100644 (file)
@@ -33,6 +33,8 @@ struct PaintInfo;
 
 enum LogicalWidthType { LogicalWidth, MinLogicalWidth, MaxLogicalWidth };
 
+enum OverlayScrollbarSizeRelevancy { IgnoreOverlayScrollbarSize, IncludeOverlayScrollbarSize };
+
 class RenderBox : public RenderBoxModelObject {
 public:
     RenderBox(Node*);
@@ -73,6 +75,13 @@ public:
         else
             setX(top);
     }
+    void setLogicalLocation(const IntPoint& location)
+    {
+        if (style()->isHorizontalWritingMode())
+            setLocation(location);
+        else
+            setLocation(location.transposedPoint());
+    }
     void setLogicalWidth(int size)
     {
         if (style()->isHorizontalWritingMode())
@@ -87,12 +96,12 @@ public:
         else
             setWidth(size);
     }
-    void setLogicalLocation(int left, int top)
+    void setLogicalSize(const IntSize& size)
     {
         if (style()->isHorizontalWritingMode())
-            setLocation(left, top);
+            setSize(size);
         else
-            setLocation(top, left);
+            setSize(size.transposedSize());
     }
 
     IntPoint location() const { return m_frameRect.location(); }
@@ -100,7 +109,6 @@ public:
     IntSize size() const { return m_frameRect.size(); }
 
     void setLocation(const IntPoint& location) { m_frameRect.setLocation(location); }
-    void setLocation(int x, int y) { setLocation(IntPoint(x, y)); }
     
     void setSize(const IntSize& size) { m_frameRect.setSize(size); }
     void move(int dx, int dy) { m_frameRect.move(dx, dy); }
@@ -120,7 +128,7 @@ public:
 
     // Bounds of the outline box in absolute coords. Respects transforms
     virtual IntRect outlineBoundsForRepaint(RenderBoxModelObject* /*repaintContainer*/, IntPoint* cachedOffsetToRepaintContainer) const;
-    virtual void addFocusRingRects(Vector<IntRect>&, int tx, int ty);
+    virtual void addFocusRingRects(Vector<IntRect>&, const IntPoint&);
 
     // Use this with caution! No type checking is done!
     RenderBox* previousSiblingBox() const;
@@ -136,6 +144,7 @@ public:
     int maxYLayoutOverflow() const { return m_overflow ? m_overflow->maxYLayoutOverflow() : borderTop() + clientHeight(); }
     int minXLayoutOverflow() const { return m_overflow ? m_overflow->minXLayoutOverflow() : borderLeft(); }
     int maxXLayoutOverflow() const { return m_overflow ? m_overflow->maxXLayoutOverflow() : borderLeft() + clientWidth(); }
+    IntSize maxLayoutOverflow() const { return IntSize(maxXLayoutOverflow(), maxYLayoutOverflow()); }
     int logicalLeftLayoutOverflow() const { return style()->isHorizontalWritingMode() ? minXLayoutOverflow() : minYLayoutOverflow(); }
     int logicalRightLayoutOverflow() const { return style()->isHorizontalWritingMode() ? maxXLayoutOverflow() : maxYLayoutOverflow(); }
     
@@ -221,7 +230,7 @@ public:
     virtual int collapsedMarginBefore() const { return marginBefore(); }
     virtual int collapsedMarginAfter() const { return marginAfter(); }
 
-    virtual void absoluteRects(Vector<IntRect>&, int tx, int ty);
+    virtual void absoluteRects(Vector<IntRect>&, const IntPoint& accumulatedOffset);
     virtual void absoluteQuads(Vector<FloatQuad>&);
     
     IntRect reflectionBox() const;
@@ -230,8 +239,8 @@ public:
     IntRect reflectedRect(const IntRect&) const;
 
     virtual void layout();
-    virtual void paint(PaintInfo&, int tx, int ty);
-    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty, HitTestAction);
+    virtual void paint(PaintInfo&, const IntPoint&);
+    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const IntPoint& pointInContainer, const IntPoint& accumulatedOffset, HitTestAction);
 
     virtual void destroy();
 
@@ -250,7 +259,7 @@ public:
     int computeContentBoxLogicalWidth(int width) const;
     int computeContentBoxLogicalHeight(int height) const;
 
-    virtual void borderFitAdjust(int& /*x*/, int& /*w*/) const { } // Shrink the box in which the border paints if border-fit is set.
+    virtual void borderFitAdjust(IntRect&) const { } // Shrink the box in which the border paints if border-fit is set.
 
     // Resolve auto margins in the inline direction of the containing block so that objects can be pushed to the start, middle or end
     // of the containing block.
@@ -299,7 +308,9 @@ public:
     int computeLogicalWidthUsing(LogicalWidthType, int availableLogicalWidth);
     int computeLogicalHeightUsing(const Length& height);
     int computeReplacedLogicalWidthUsing(Length width) const;
+    int computeReplacedLogicalWidthRespectingMinMaxWidth(int logicalWidth, bool includeMaxWidth = true) const;
     int computeReplacedLogicalHeightUsing(Length height) const;
+    int computeReplacedLogicalHeightRespectingMinMaxHeight(int logicalHeight) const;
 
     virtual int computeReplacedLogicalWidth(bool includeMaxWidth = true) const;
     virtual int computeReplacedLogicalHeight() const;
@@ -322,7 +333,7 @@ public:
     virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
     virtual bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier = 1, Node** stopNode = 0);
     bool canBeScrolledAndHasScrollableArea() const;
-    virtual bool canBeProgramaticallyScrolled(bool) const;
+    virtual bool canBeProgramaticallyScrolled() const;
     virtual void autoscroll();
     virtual void stopAutoscroll() { }
     virtual void panScroll(const IntPoint&);
@@ -334,29 +345,29 @@ public:
     
     virtual IntRect localCaretRect(InlineBox*, int caretOffset, int* extraWidthToEndOfLine = 0);
 
-    virtual IntRect overflowClipRect(int tx, int ty);
-    IntRect clipRect(int tx, int ty);
+    virtual IntRect overflowClipRect(const IntPoint& location, OverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize);
+    IntRect clipRect(const IntPoint& location);
     virtual bool hasControlClip() const { return false; }
-    virtual IntRect controlClipRect(int /*tx*/, int /*ty*/) const { return IntRect(); }
-    bool pushContentsClip(PaintInfo&, int tx, int ty);
-    void popContentsClip(PaintInfo&, PaintPhase originalPhase, int tx, int ty);
+    virtual IntRect controlClipRect(const IntPoint&) const { return IntRect(); }
+    bool pushContentsClip(PaintInfo&, const IntPoint& accumulatedOffset);
+    void popContentsClip(PaintInfo&, PaintPhase originalPhase, const IntPoint& accumulatedOffset);
 
-    virtual void paintObject(PaintInfo&, int /*tx*/, int /*ty*/) { ASSERT_NOT_REACHED(); }
-    virtual void paintBoxDecorations(PaintInfo&, int tx, int ty);
-    virtual void paintMask(PaintInfo&, int tx, int ty);
+    virtual void paintObject(PaintInfo&, const IntPoint&) { ASSERT_NOT_REACHED(); }
+    virtual void paintBoxDecorations(PaintInfo&, const IntPoint&);
+    virtual void paintMask(PaintInfo&, const LayoutPoint&);
     virtual void imageChanged(WrappedImagePtr, const IntRect* = 0);
 
     // Called when a positioned object moves but doesn't necessarily change size.  A simplified layout is attempted
     // that just updates the object's position. If the size does change, the object remains dirty.
-    void tryLayoutDoingPositionedMovementOnly()
+    bool tryLayoutDoingPositionedMovementOnly()
     {
         int oldWidth = width();
         computeLogicalWidth();
         // If we shrink to fit our width may have changed, so we still need full layout.
         if (oldWidth != width())
-            return;
+            return false;
         computeLogicalHeight();
-        setNeedsLayout(false);
+        return true;
     }
 
     IntRect maskClipRect();
@@ -396,26 +407,30 @@ public:
     IntRect logicalLayoutOverflowRectForPropagation(RenderStyle*) const;
     IntRect layoutOverflowRectForPropagation(RenderStyle*) const;
 
+    RenderOverflow* hasRenderOverflow() const { return m_overflow.get(); }
+
+    virtual bool needsPreferredWidthsRecalculation() const;
+    virtual void computeIntrinsicRatioInformation(FloatSize& /* intrinsicRatio */, bool& /* isPercentageIntrinsicSize */) const { }
+
 protected:
     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
     virtual void updateBoxModelInfoFromStyle();
 
-    void paintFillLayer(const PaintInfo&, const Color&, const FillLayer*, int tx, int ty, int width, int height, CompositeOperator op, RenderObject* backgroundObject);
-    void paintFillLayers(const PaintInfo&, const Color&, const FillLayer*, int tx, int ty, int width, int height, CompositeOperator = CompositeSourceOver, RenderObject* backgroundObject = 0);
+    void paintFillLayer(const PaintInfo&, const Color&, const FillLayer*, const LayoutRect&, BackgroundBleedAvoidance, CompositeOperator, RenderObject* backgroundObject);
+    void paintFillLayers(const PaintInfo&, const Color&, const FillLayer*, const LayoutRect&, BackgroundBleedAvoidance = BackgroundBleedNone, CompositeOperator = CompositeSourceOver, RenderObject* backgroundObject = 0);
 
-    void paintBoxDecorationsWithSize(PaintInfo&, int tx, int ty, int width, int height);
-    void paintMaskImages(const PaintInfo&, int tx, int ty, int width, int height);
+    void paintMaskImages(const PaintInfo&, const LayoutRect&);
 
 #if PLATFORM(MAC)
-    void paintCustomHighlight(int tx, int ty, const AtomicString& type, bool behindText);
+    void paintCustomHighlight(const IntPoint&, const AtomicString& type, bool behindText);
 #endif
 
     void computePositionedLogicalWidth();
     
     virtual bool shouldComputeSizeAsReplaced() const { return isReplaced() && !isInlineBlockOrInlineTable(); }
 
-    virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState&) const;
+    virtual void mapLocalToContainer(RenderBoxModelObject* repaintContainer, bool fixed, bool useTransforms, TransformState&, bool* wasFixed = 0) const;
     virtual void mapAbsoluteToLocalPoint(bool fixed, bool useTransforms, TransformState&) const;
 
     void paintRootBoxFillLayers(const PaintInfo&);
@@ -448,6 +463,8 @@ private:
     // These include tables, positioned objects, floats and flexible boxes.
     virtual void computePreferredLogicalWidths() { setPreferredLogicalWidthsDirty(false); }
 
+    BackgroundBleedAvoidance determineBackgroundBleedAvoidance(GraphicsContext*) const;
+
 private:
     // The width/height of the contents + borders + padding.  The x/y location is relative to our container (which is not always our parent).
     IntRect m_frameRect;