summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/TiledPage.h
blob: 718908d9dfa4015746f6302e1b311bba8b7093ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 * Copyright 2010, The Android Open Source Project
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef TiledPage_h
#define TiledPage_h

#if USE(ACCELERATED_COMPOSITING)

#include "BaseTile.h"
#include "SkCanvas.h"
#include "SkRegion.h"

#include "TilePainter.h"

namespace WebCore {

class GLWebViewState;
class IntRect;

/**
 * The TiledPage represents a map of BaseTiles covering the viewport. Each
 * GLWebViewState contains two TiledPages, one to display the page at the
 * current scale factor, and another in the background that we use to paint the
 * page at a different scale factor.  For instance, when we zoom using one
 * TiledPage its tiles are scaled in hardware and therefore are subject to a
 * loss of quality. To address this when the user finishes zooming we paint the
 * background TilePage at the new scale factor.  When the background TilePage is
 * ready, we swap it with the currently displaying TiledPage.
 */
class TiledPage : public TilePainter {
public:
    enum PrepareBounds {
        ExpandedBounds = 0,
        VisibleBounds = 1
    };
    enum SwapMethod {
        SwapWhateverIsReady = 0,
        SwapWholePage = 1
    };

    TiledPage(int id, GLWebViewState* state);
    ~TiledPage();

    // returns the other TiledPage who shares the same GLWebViewState
    TiledPage* sibling();

    // prepare the page for display on the screen
    void prepare(bool goingDown, bool goingLeft, const SkIRect& tileBounds, PrepareBounds bounds);

    // update tiles with inval information, return true if visible ones are
    // dirty (and thus repaint needed)
    bool updateTileDirtiness(const SkIRect& tileBounds);

    // check to see if the page is ready for display

    // swap 'buffers' by swapping each modified texture
    bool swapBuffersIfReady(const SkIRect& tileBounds, float scale, SwapMethod swap);
    // draw the page on the screen
    void draw(float transparency, const SkIRect& tileBounds);

    // TilePainter implementation
    // used by individual tiles to generate the bitmap for their tile
    bool paint(BaseTile*, SkCanvas*, unsigned int*);
    void paintExtra(SkCanvas*);

    // used by individual tiles to get the information about the current picture
    GLWebViewState* glWebViewState() { return m_glWebViewState; }

    float scale() const { return m_scale; }

    //TODO: clear all textures if this is called with a new value
    void setScale(float scale) { m_scale = scale; m_invScale = 1 / scale; }

    void invalidateRect(const IntRect& invalRect, const unsigned int pictureCount);
    void discardTextures();
    void updateBaseTileSize();
    bool scrollingDown() { return m_scrollingDown; }
    SkIRect* expandedTileBounds() { return &m_expandedTileBounds; }
    bool isPrefetchPage() { return m_isPrefetchPage; }
    void setIsPrefetchPage(bool isPrefetch) { m_isPrefetchPage = isPrefetch; }

private:
    void prepareRow(bool goingLeft, int tilesInRow, int firstTileX, int y, const SkIRect& tileBounds);

    BaseTile* getBaseTile(int x, int y) const;

    // array of tiles used to compose a page. The tiles are allocated in the
    // constructor to prevent them from potentially being allocated on the stack
    BaseTile* m_baseTiles;
    // stores the number of tiles in the m_baseTiles array. This enables us to
    // quickly iterate over the array without have to check it's size
    int m_baseTileSize;
    int m_id;
    float m_scale;
    float m_invScale;
    GLWebViewState* m_glWebViewState;

    // used to identify the tiles that have been invalidated (marked dirty) since
    // the last time updateTileState() has been called. The region is stored in
    // terms of the (x,y) coordinates used to determine the location of the tile
    // within the page, not in content/view pixel coordinates.
    SkRegion m_invalRegion;

    // inval regions in content coordinates
    SkRegion m_invalTilesRegion;
    unsigned int m_latestPictureInval;
    bool m_prepare;
    bool m_scrollingDown;
    SkIRect m_expandedTileBounds;
    bool m_isPrefetchPage;
};

} // namespace WebCore

#endif // USE(ACCELERATED_COMPOSITING)
#endif // TiledPage_h