1/*
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef DrawingAreaImpl_h
27#define DrawingAreaImpl_h
28
29#include "DrawingArea.h"
30#include "LayerTreeHost.h"
31#include "Region.h"
32#include "RunLoop.h"
33
34namespace WebKit {
35
36class UpdateInfo;
37
38class DrawingAreaImpl : public DrawingArea {
39public:
40    static PassOwnPtr<DrawingAreaImpl> create(WebPage*, const WebPageCreationParameters&);
41    virtual ~DrawingAreaImpl();
42
43    void setLayerHostNeedsDisplay();
44    void layerHostDidFlushLayers();
45
46private:
47    DrawingAreaImpl(WebPage*, const WebPageCreationParameters&);
48
49    // DrawingArea
50    virtual void setNeedsDisplay(const WebCore::IntRect&);
51    virtual void scroll(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);
52    virtual void forceRepaint();
53
54    virtual void didInstallPageOverlay();
55    virtual void didUninstallPageOverlay();
56    virtual void setPageOverlayNeedsDisplay(const WebCore::IntRect&);
57
58    virtual void setRootCompositingLayer(WebCore::GraphicsLayer*);
59    virtual void scheduleCompositingLayerSync();
60    virtual void syncCompositingLayers();
61    virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
62
63    // CoreIPC message handlers.
64    virtual void updateBackingStoreState(uint64_t backingStoreStateID, bool respondImmediately, const WebCore::IntSize&, const WebCore::IntSize& scrollOffset);
65    virtual void didUpdate();
66    virtual void suspendPainting();
67    virtual void resumePainting();
68
69    void sendDidUpdateBackingStoreState();
70
71    void enterAcceleratedCompositingMode(WebCore::GraphicsLayer*);
72    void exitAcceleratedCompositingModeSoon();
73    void exitAcceleratedCompositingMode();
74
75    void scheduleDisplay();
76    void displayTimerFired();
77    void display();
78    void display(UpdateInfo&);
79
80    uint64_t m_backingStoreStateID;
81
82    Region m_dirtyRegion;
83    WebCore::IntRect m_scrollRect;
84    WebCore::IntSize m_scrollOffset;
85
86    // Whether we're currently processing an UpdateBackingStoreState message.
87    bool m_inUpdateBackingStoreState;
88
89    // When true, we should send an UpdateBackingStoreState message instead of any other messages
90    // we normally send to the UI process.
91    bool m_shouldSendDidUpdateBackingStoreState;
92
93    // Whether we're waiting for a DidUpdate message. Used for throttling paints so that the
94    // web process won't paint more frequent than the UI process can handle.
95    bool m_isWaitingForDidUpdate;
96
97    // Whether painting is suspended. We'll still keep track of the dirty region but we
98    // won't paint until painting has resumed again.
99    bool m_isPaintingSuspended;
100    bool m_alwaysUseCompositing;
101
102    double m_lastDisplayTime;
103
104    RunLoop::Timer<DrawingAreaImpl> m_displayTimer;
105    RunLoop::Timer<DrawingAreaImpl> m_exitCompositingTimer;
106
107    // The layer tree host that handles accelerated compositing.
108    RefPtr<LayerTreeHost> m_layerTreeHost;
109};
110
111} // namespace WebKit
112
113#endif // DrawingAreaImpl_h
114