2008-08-08 Maxime Britto <britto@apple.com>
[WebKit-https.git] / WebCore / rendering / RenderLayer.h
1 /*
2  * Copyright (C) 2003 Apple Computer, Inc.
3  *
4  * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5  *
6  * Other contributors:
7  *   Robert O'Callahan <roc+@cs.cmu.edu>
8  *   David Baron <dbaron@fas.harvard.edu>
9  *   Christian Biesinger <cbiesinger@web.de>
10  *   Randall Jesup <rjesup@wgate.com>
11  *   Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
12  *   Josh Soref <timeless@mac.com>
13  *   Boris Zbarsky <bzbarsky@mit.edu>
14  *
15  * This library is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU Lesser General Public
17  * License as published by the Free Software Foundation; either
18  * version 2.1 of the License, or (at your option) any later version.
19  *
20  * This library is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23  * Lesser General Public License for more details.
24  *
25  * You should have received a copy of the GNU Lesser General Public
26  * License along with this library; if not, write to the Free Software
27  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
28  *
29  * Alternatively, the contents of this file may be used under the terms
30  * of either the Mozilla Public License Version 1.1, found at
31  * http://www.mozilla.org/MPL/ (the "MPL") or the GNU General Public
32  * License Version 2.0, found at http://www.fsf.org/copyleft/gpl.html
33  * (the "GPL"), in which case the provisions of the MPL or the GPL are
34  * applicable instead of those above.  If you wish to allow use of your
35  * version of this file only under the terms of one of those two
36  * licenses (the MPL or the GPL) and not to allow others to use your
37  * version of this file under the LGPL, indicate your decision by
38  * deletingthe provisions above and replace them with the notice and
39  * other provisions required by the MPL or the GPL, as the case may be.
40  * If you do not delete the provisions above, a recipient may use your
41  * version of this file under any of the LGPL, the MPL or the GPL.
42  */
43
44 #ifndef RenderLayer_h
45 #define RenderLayer_h
46
47 #include "RenderObject.h"
48 #include "ScrollBar.h"
49 #include "Timer.h"
50 #include <wtf/OwnPtr.h>
51
52 namespace WebCore {
53
54 class AffineTransform;
55 class CachedResource;
56 class HitTestResult;
57 class PlatformScrollbar;
58 class RenderFrameSet;
59 class RenderMarquee;
60 class RenderObject;
61 class RenderReplica;
62 class RenderStyle;
63 class RenderTable;
64 class RenderText;
65 class RenderView;
66 class Scrollbar;
67
68 struct HitTestRequest;
69
70 class ClipRects {
71 public:
72     ClipRects(const IntRect& r)
73         : m_overflowClipRect(r)
74         , m_fixedClipRect(r)
75         , m_posClipRect(r)
76         , m_refCnt(0)
77         , m_fixed(false)
78     {
79     }
80
81     ClipRects(const IntRect& overflowRect, const IntRect& fixedRect, const IntRect& posRect, bool fixed)
82         : m_overflowClipRect(overflowRect)
83         , m_fixedClipRect(fixedRect)
84         , m_posClipRect(posRect)
85         , m_refCnt(0)
86         , m_fixed(fixed)
87     {
88     }
89
90     const IntRect& overflowClipRect() { return m_overflowClipRect; }
91     const IntRect& fixedClipRect() { return m_fixedClipRect; }
92     const IntRect& posClipRect() { return m_posClipRect; }
93     bool fixed() const { return m_fixed; }
94
95     void ref() { m_refCnt++; }
96     void deref(RenderArena* renderArena) { if (--m_refCnt == 0) destroy(renderArena); }
97
98     void destroy(RenderArena*);
99
100     // Overloaded new operator.
101     void* operator new(size_t, RenderArena*) throw();
102
103     // Overridden to prevent the normal delete from being called.
104     void operator delete(void*, size_t);
105         
106 private:
107     // The normal operator new is disallowed on all render objects.
108     void* operator new(size_t) throw();
109
110 private:
111     IntRect m_overflowClipRect;
112     IntRect m_fixedClipRect;
113     IntRect m_posClipRect;
114     unsigned m_refCnt : 31;
115     bool m_fixed : 1;
116 };
117
118 class RenderLayer : public ScrollbarClient {
119 public:
120     enum ScrollBehavior {
121         noScroll,
122         alignCenter,
123         alignTop,
124         alignBottom, 
125         alignLeft,
126         alignRight,
127         alignToClosestEdge
128     };
129
130     struct ScrollAlignment {
131         ScrollBehavior m_rectVisible;
132         ScrollBehavior m_rectHidden;
133         ScrollBehavior m_rectPartial;
134     };
135
136     friend class RenderReplica;
137
138     static const ScrollAlignment gAlignCenterIfNeeded;
139     static const ScrollAlignment gAlignToEdgeIfNeeded;
140     static const ScrollAlignment gAlignCenterAlways;
141     static const ScrollAlignment gAlignTopAlways;
142     static const ScrollAlignment gAlignBottomAlways;
143
144     static ScrollBehavior getVisibleBehavior(const ScrollAlignment& s) { return s.m_rectVisible; }
145     static ScrollBehavior getPartialBehavior(const ScrollAlignment& s) { return s.m_rectPartial; }
146     static ScrollBehavior getHiddenBehavior(const ScrollAlignment& s) { return s.m_rectHidden; }
147
148     RenderLayer(RenderObject*);
149     ~RenderLayer();
150
151     RenderObject* renderer() const { return m_object; }
152     RenderLayer* parent() const { return m_parent; }
153     RenderLayer* previousSibling() const { return m_previous; }
154     RenderLayer* nextSibling() const { return m_next; }
155     RenderLayer* firstChild() const { return m_first; }
156     RenderLayer* lastChild() const { return m_last; }
157
158     void addChild(RenderLayer* newChild, RenderLayer* beforeChild = 0);
159     RenderLayer* removeChild(RenderLayer*);
160
161     void removeOnlyThisLayer();
162     void insertOnlyThisLayer();
163
164     void repaintIncludingDescendants();
165
166     void styleChanged(RenderStyle*);
167
168     RenderMarquee* marquee() const { return m_marquee; }
169     void suspendMarquees();
170
171     bool isOverflowOnly() const { return m_isOverflowOnly; }
172
173     bool isTransparent() const;
174     RenderLayer* transparentAncestor();
175     void beginTransparencyLayers(GraphicsContext*, const RenderLayer* rootLayer);
176
177     bool hasReflection() const { return m_object->hasReflection(); }
178     RenderReplica* reflection() const { return m_reflection; }
179     RenderLayer* reflectionLayer() const;
180
181     const RenderLayer* root() const
182     {
183         const RenderLayer* curr = this;
184         while (curr->parent())
185             curr = curr->parent();
186         return curr;
187     }
188     
189     int xPos() const { return m_x; }
190     int yPos() const { return m_y; }
191     void setPos(int xPos, int yPos)
192     {
193         m_x = xPos;
194         m_y = yPos;
195     }
196
197     int width() const { return m_width; }
198     int height() const { return m_height; }
199     void setWidth(int w) { m_width = w; }
200     void setHeight(int h) { m_height = h; }
201
202     int scrollWidth();
203     int scrollHeight();
204
205     void panScrollFromPoint(const IntPoint&);
206
207     // Scrolling methods for layers that can scroll their overflow.
208     void scrollOffset(int& x, int& y);
209     void subtractScrollOffset(int& x, int& y);
210     int scrollXOffset() const { return m_scrollX + m_scrollOriginX; }
211     int scrollYOffset() const { return m_scrollY; }
212     void scrollToOffset(int x, int y, bool updateScrollbars = true, bool repaint = true);
213     void scrollToXOffset(int x) { scrollToOffset(x, m_scrollY); }
214     void scrollToYOffset(int y) { scrollToOffset(m_scrollX + m_scrollOriginX, y); }
215     void scrollRectToVisible(const IntRect&, bool scrollToAnchor = false, const ScrollAlignment& alignX = gAlignCenterIfNeeded, const ScrollAlignment& alignY = gAlignCenterIfNeeded);
216
217     IntRect getRectToExpose(const IntRect& visibleRect, const IntRect& exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& alignY);    
218
219     void setHasHorizontalScrollbar(bool);
220     void setHasVerticalScrollbar(bool);
221
222     PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation);
223     void destroyScrollbar(ScrollbarOrientation);
224
225     Scrollbar* horizontalScrollbar() { return m_hBar.get(); }
226     Scrollbar* verticalScrollbar() { return m_vBar.get(); }
227
228     PlatformScrollbar* horizontalScrollbarWidget() const;
229     PlatformScrollbar* verticalScrollbarWidget() const;
230
231     int verticalScrollbarWidth() const;
232     int horizontalScrollbarHeight() const;
233
234     void positionOverflowControls();
235     bool isPointInResizeControl(const IntPoint&);
236     bool hitTestOverflowControls(HitTestResult&);
237     IntSize offsetFromResizeCorner(const IntPoint&) const;
238
239     void paintOverflowControls(GraphicsContext*, int tx, int ty, const IntRect& damageRect);
240
241     void updateScrollInfoAfterLayout();
242
243     bool scroll(ScrollDirection, ScrollGranularity, float multiplier = 1.0f);
244     void autoscroll();
245
246     void resize(const PlatformMouseEvent&, const IntSize&);
247     bool inResizeMode() const { return m_inResizeMode; }
248     void setInResizeMode(bool b) { m_inResizeMode = b; }
249     
250     void updateLayerPosition();
251     void updateLayerPositions(bool doFullRepaint = false, bool checkForRepaint = true);
252
253     void updateTransform();
254
255     void relativePositionOffset(int& relX, int& relY) { relX += m_relX; relY += m_relY; }
256
257     void clearClipRects();
258     void clearClipRect();
259
260     // Get the enclosing stacking context for this layer.  A stacking context is a layer
261     // that has a non-auto z-index.
262     RenderLayer* stackingContext() const;
263     bool isStackingContext() const { return !hasAutoZIndex() || renderer()->isRenderView(); }
264
265     void dirtyZOrderLists();
266     void updateZOrderLists();
267     Vector<RenderLayer*>* posZOrderList() const { return m_posZOrderList; }
268     Vector<RenderLayer*>* negZOrderList() const { return m_negZOrderList; }
269
270     void dirtyOverflowList();
271     void updateOverflowList();
272     Vector<RenderLayer*>* overflowList() const { return m_overflowList; }
273
274     bool hasVisibleContent() const { return m_hasVisibleContent; }
275     void setHasVisibleContent(bool);
276     void dirtyVisibleContentStatus();
277
278     // Gets the nearest enclosing positioned ancestor layer (also includes
279     // the <html> layer and the root layer).
280     RenderLayer* enclosingPositionedAncestor() const;
281
282     void convertToLayerCoords(const RenderLayer* ancestorLayer, int& x, int& y) const;
283
284     bool hasAutoZIndex() const { return renderer()->style()->hasAutoZIndex(); }
285     int zIndex() const { return renderer()->style()->zIndex(); }
286
287     // The two main functions that use the layer system.  The paint method
288     // paints the layers that intersect the damage rect from back to
289     // front.  The hitTest method looks for mouse events by walking
290     // layers that intersect the point from front to back.
291     void paint(GraphicsContext*, const IntRect& damageRect, PaintRestriction = PaintRestrictionNone, RenderObject* paintingRoot = 0);
292     bool hitTest(const HitTestRequest&, HitTestResult&);
293
294     // This method figures out our layerBounds in coordinates relative to
295     // |rootLayer}.  It also computes our background and foreground clip rects
296     // for painting/event handling.
297     void calculateRects(const RenderLayer* rootLayer, const IntRect& paintDirtyRect, IntRect& layerBounds,
298                         IntRect& backgroundRect, IntRect& foregroundRect, IntRect& outlineRect) const;
299     void calculateClipRects(const RenderLayer* rootLayer);
300     ClipRects* clipRects() const { return m_clipRects; }
301     IntRect childrenClipRect() const; // Returns the foreground clip rect of the layer in the document's coordinate space.
302     IntRect selfClipRect() const; // Returns the background clip rect of the layer in the document's coordinate space.
303
304     bool intersectsDamageRect(const IntRect& layerBounds, const IntRect& damageRect, const RenderLayer* rootLayer) const;
305
306     // Returns a bounding box for this layer only.
307     IntRect boundingBox(const RenderLayer* rootLayer) const;
308
309     void updateHoverActiveState(const HitTestRequest&, HitTestResult&);
310
311     IntRect repaintRect() const { return m_repaintRect; }
312     void setNeedsFullRepaint(bool f = true) { m_needsFullRepaint = f; }
313     
314     int staticX() const { return m_staticX; }
315     int staticY() const { return m_staticY; }
316     void setStaticX(int staticX) { m_staticX = staticX; }
317     void setStaticY(int staticY) { m_staticY = staticY; }
318
319     AffineTransform* transform() const { return m_transform.get(); }
320
321     void destroy(RenderArena*);
322
323      // Overloaded new operator.  Derived classes must override operator new
324     // in order to allocate out of the RenderArena.
325     void* operator new(size_t, RenderArena*) throw();
326
327     // Overridden to prevent the normal delete from being called.
328     void operator delete(void*, size_t);
329
330 private:
331     // The normal operator new is disallowed on all render objects.
332     void* operator new(size_t) throw();
333
334 private:
335     void setNextSibling(RenderLayer* next) { m_next = next; }
336     void setPreviousSibling(RenderLayer* prev) { m_previous = prev; }
337     void setParent(RenderLayer* parent) { m_parent = parent; }
338     void setFirstChild(RenderLayer* first) { m_first = first; }
339     void setLastChild(RenderLayer* last) { m_last = last; }
340
341     void collectLayers(Vector<RenderLayer*>*&, Vector<RenderLayer*>*&);
342
343     void paintLayer(RenderLayer* rootLayer, GraphicsContext*, const IntRect& paintDirtyRect,
344                     bool haveTransparency, PaintRestriction, RenderObject* paintingRoot, bool appliedTransform = false);
345     RenderLayer* hitTestLayer(RenderLayer* rootLayer, const HitTestRequest&, HitTestResult&, const IntRect& hitTestRect, const IntPoint& hitTestPoint, bool appliedTransform = false);
346     void computeScrollDimensions(bool* needHBar = 0, bool* needVBar = 0);
347
348     bool shouldBeOverflowOnly() const;
349
350     virtual void valueChanged(Scrollbar*);
351     virtual IntRect windowClipRect() const;
352     virtual bool isActive() const;
353
354     void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow);
355
356     void childVisibilityChanged(bool newVisibility);
357     void dirtyVisibleDescendantStatus();
358     void updateVisibilityStatus();
359
360     Node* enclosingElement() const;
361
362     void createReflection();
363     void updateReflectionStyle();
364     bool paintingInsideReflection() const { return m_paintingInsideReflection; }
365
366     RenderLayer* enclosingTransformedAncestor() const;
367
368 protected:   
369     RenderObject* m_object;
370
371     RenderLayer* m_parent;
372     RenderLayer* m_previous;
373     RenderLayer* m_next;
374     RenderLayer* m_first;
375     RenderLayer* m_last;
376
377     IntRect m_repaintRect; // Cached repaint rects. Used by layout.
378     IntRect m_outlineBox;
379
380     // Our current relative position offset.
381     int m_relX;
382     int m_relY;
383
384     // Our (x,y) coordinates are in our parent layer's coordinate space.
385     int m_x;
386     int m_y;
387
388     // The layer's width/height
389     int m_width;
390     int m_height;
391
392     // Our scroll offsets if the view is scrolled.
393     int m_scrollX;
394     int m_scrollY;
395     int m_scrollOriginX;
396     int m_scrollLeftOverflow;
397
398     // The width/height of our scrolled area.
399     int m_scrollWidth;
400     int m_scrollHeight;
401
402     // For layers with overflow, we have a pair of scrollbars.
403     RefPtr<Scrollbar> m_hBar;
404     RefPtr<Scrollbar> m_vBar;
405
406     // Keeps track of whether the layer is currently resizing, so events can cause resizing to start and stop.
407     bool m_inResizeMode;
408
409     // For layers that establish stacking contexts, m_posZOrderList holds a sorted list of all the
410     // descendant layers within the stacking context that have z-indices of 0 or greater
411     // (auto will count as 0).  m_negZOrderList holds descendants within our stacking context with negative
412     // z-indices.
413     Vector<RenderLayer*>* m_posZOrderList;
414     Vector<RenderLayer*>* m_negZOrderList;
415
416     // This list contains child layers that cannot create stacking contexts.  For now it is just
417     // overflow layers, but that may change in the future.
418     Vector<RenderLayer*>* m_overflowList;
419
420     ClipRects* m_clipRects;      // Cached clip rects used when painting and hit testing.
421
422     bool m_scrollDimensionsDirty : 1;
423     bool m_zOrderListsDirty : 1;
424     bool m_overflowListDirty: 1;
425     bool m_isOverflowOnly : 1;
426
427     bool m_usedTransparency : 1; // Tracks whether we need to close a transparent layer, i.e., whether
428                                  // we ended up painting this layer or any descendants (and therefore need to
429                                  // blend).
430     bool m_paintingInsideReflection : 1;  // A state bit tracking if we are painting inside a replica.
431     bool m_inOverflowRelayout : 1;
432     bool m_needsFullRepaint : 1;
433
434     bool m_overflowStatusDirty : 1;
435     bool m_horizontalOverflow : 1;
436     bool m_verticalOverflow : 1;
437     bool m_visibleContentStatusDirty : 1;
438     bool m_hasVisibleContent : 1;
439     bool m_visibleDescendantStatusDirty : 1;
440     bool m_hasVisibleDescendant : 1;
441
442     RenderMarquee* m_marquee; // Used by layers with overflow:marquee
443     
444     // Cached normal flow values for absolute positioned elements with static left/top values.
445     int m_staticX;
446     int m_staticY;
447     
448     OwnPtr<AffineTransform> m_transform;
449     
450     // May ultimately be extended to many replicas (with their own paint order).
451     RenderReplica* m_reflection;
452 };
453
454 } // namespace WebCore
455
456 #endif // RenderLayer_h