1/*
2 * Copyright 2010, The Android Open Source Project
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 *  * Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 *  * 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 THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef TiledPage_h
27#define TiledPage_h
28
29#if USE(ACCELERATED_COMPOSITING)
30
31#include "BaseTile.h"
32#include "SkCanvas.h"
33#include "SkRegion.h"
34
35#include "TilePainter.h"
36
37namespace WebCore {
38
39class GLWebViewState;
40class IntRect;
41
42/**
43 * The TiledPage represents a map of BaseTiles covering the viewport. Each
44 * GLWebViewState contains two TiledPages, one to display the page at the
45 * current scale factor, and another in the background that we use to paint the
46 * page at a different scale factor.  For instance, when we zoom using one
47 * TiledPage its tiles are scaled in hardware and therefore are subject to a
48 * loss of quality. To address this when the user finishes zooming we paint the
49 * background TilePage at the new scale factor.  When the background TilePage is
50 * ready, we swap it with the currently displaying TiledPage.
51 */
52class TiledPage : public TilePainter {
53public:
54    enum PrepareBounds {
55        ExpandedBounds = 0,
56        VisibleBounds = 1
57    };
58
59    TiledPage(int id, GLWebViewState* state);
60    ~TiledPage();
61
62    // returns the other TiledPage who shares the same GLWebViewState
63    TiledPage* sibling();
64
65    // prepare the page for display on the screen
66    void prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds, PrepareBounds bounds);
67
68    // update tiles with inval information, return true if visible ones are
69    // dirty (and thus repaint needed)
70    bool updateTileDirtiness(const SkIRect& tileBounds);
71
72    // returns true if the page can't draw the entire region (may still be stale)
73    bool hasMissingContent(const SkIRect& tileBounds);
74
75    bool isReady(const SkIRect& tileBounds);
76
77    // swap 'buffers' by swapping each modified texture
78    bool swapBuffersIfReady(const SkIRect& tileBounds, float scale);
79    // save the transparency and bounds to be drawn in drawGL()
80    void prepareForDrawGL(float transparency, const SkIRect& tileBounds);
81    // draw the page on the screen
82    void drawGL();
83
84    // TilePainter implementation
85    // used by individual tiles to generate the bitmap for their tile
86    bool paint(BaseTile*, SkCanvas*, unsigned int*);
87
88    // used by individual tiles to get the information about the current picture
89    GLWebViewState* glWebViewState() { return m_glWebViewState; }
90
91    float scale() const { return m_scale; }
92
93    //TODO: clear all textures if this is called with a new value
94    void setScale(float scale) { m_scale = scale; m_invScale = 1 / scale; }
95
96    void invalidateRect(const IntRect& invalRect, const unsigned int pictureCount);
97    void discardTextures();
98    void updateBaseTileSize();
99    bool scrollingDown() { return m_scrollingDown; }
100    bool isPrefetchPage() { return m_isPrefetchPage; }
101    void setIsPrefetchPage(bool isPrefetch) { m_isPrefetchPage = isPrefetch; }
102
103private:
104    void prepareRow(bool goingLeft, int tilesInRow, int firstTileX, int y, const SkIRect& tileBounds);
105
106    BaseTile* getBaseTile(int x, int y) const;
107
108    // array of tiles used to compose a page. The tiles are allocated in the
109    // constructor to prevent them from potentially being allocated on the stack
110    BaseTile* m_baseTiles;
111    // stores the number of tiles in the m_baseTiles array. This enables us to
112    // quickly iterate over the array without have to check it's size
113    int m_baseTileSize;
114    int m_id;
115    float m_scale;
116    float m_invScale;
117    GLWebViewState* m_glWebViewState;
118
119    // used to identify the tiles that have been invalidated (marked dirty) since
120    // the last time updateTileState() has been called. The region is stored in
121    // terms of the (x,y) coordinates used to determine the location of the tile
122    // within the page, not in content/view pixel coordinates.
123    SkRegion m_invalRegion;
124
125    // inval regions in content coordinates
126    SkRegion m_invalTilesRegion;
127    unsigned int m_latestPictureInval;
128    bool m_prepare;
129    bool m_scrollingDown;
130    bool m_isPrefetchPage;
131
132    // info saved in prepare, used in drawGL()
133    bool m_willDraw;
134    SkIRect m_tileBounds;
135    float m_transparency;
136};
137
138} // namespace WebCore
139
140#endif // USE(ACCELERATED_COMPOSITING)
141#endif // TiledPage_h
142