1/* 2 Copyright (C) 2010-2012 Nokia Corporation and/or its subsidiary(-ies) 3 4 This library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Library General Public 6 License as published by the Free Software Foundation; either 7 version 2 of the License, or (at your option) any later version. 8 9 This library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Library General Public License for more details. 13 14 You should have received a copy of the GNU Library General Public License 15 along with this library; see the file COPYING.LIB. If not, write to 16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 Boston, MA 02110-1301, USA. 18 */ 19 20#ifndef TiledBackingStore_h 21#define TiledBackingStore_h 22 23#if USE(TILED_BACKING_STORE) 24 25#include "FloatPoint.h" 26#include "IntPoint.h" 27#include "IntRect.h" 28#include "Tile.h" 29#include "TiledBackingStoreBackend.h" 30#include "Timer.h" 31#include <wtf/Assertions.h> 32#include <wtf/HashMap.h> 33#include <wtf/RefPtr.h> 34 35namespace WebCore { 36 37class GraphicsContext; 38class TiledBackingStore; 39class TiledBackingStoreClient; 40 41class TiledBackingStore { 42 WTF_MAKE_NONCOPYABLE(TiledBackingStore); WTF_MAKE_FAST_ALLOCATED; 43public: 44 TiledBackingStore(TiledBackingStoreClient*, std::unique_ptr<TiledBackingStoreBackend>); 45 ~TiledBackingStore(); 46 47 TiledBackingStoreClient* client() { return m_client; } 48 49 // Used when class methods cannot be called asynchronously by client. 50 // Updates of tiles are committed as soon as all the events in event queue have been processed. 51 void setCommitTileUpdatesOnIdleEventLoop(bool enable) { m_commitTileUpdatesOnIdleEventLoop = enable; } 52 53 void setTrajectoryVector(const FloatPoint&); 54 void coverWithTilesIfNeeded(); 55 56 float contentsScale() { return m_contentsScale; } 57 void setContentsScale(float); 58 59 bool contentsFrozen() const { return m_contentsFrozen; } 60 void setContentsFrozen(bool); 61 62 void updateTileBuffers(); 63 64 void invalidate(const IntRect& dirtyRect); 65 void paint(GraphicsContext*, const IntRect&); 66 67 IntSize tileSize() { return m_tileSize; } 68 void setTileSize(const IntSize&); 69 70 IntRect mapToContents(const IntRect&) const; 71 IntRect mapFromContents(const IntRect&) const; 72 73 IntRect tileRectForCoordinate(const Tile::Coordinate&) const; 74 Tile::Coordinate tileCoordinateForPoint(const IntPoint&) const; 75 double tileDistance(const IntRect& viewport, const Tile::Coordinate&) const; 76 77 IntRect coverRect() const { return m_coverRect; } 78 bool visibleAreaIsCovered() const; 79 void removeAllNonVisibleTiles(); 80 81 void setSupportsAlpha(bool); 82 83private: 84 void startTileBufferUpdateTimer(); 85 void startBackingStoreUpdateTimer(double = 0); 86 87 void tileBufferUpdateTimerFired(Timer<TiledBackingStore>*); 88 void backingStoreUpdateTimerFired(Timer<TiledBackingStore>*); 89 90 void createTiles(); 91 void computeCoverAndKeepRect(const IntRect& visibleRect, IntRect& coverRect, IntRect& keepRect) const; 92 93 bool isBackingStoreUpdatesSuspended() const; 94 bool isTileBufferUpdatesSuspended() const; 95 96 void commitScaleChange(); 97 98 bool resizeEdgeTiles(); 99 void setCoverRect(const IntRect& rect) { m_coverRect = rect; } 100 void setKeepRect(const IntRect&); 101 102 PassRefPtr<Tile> tileAt(const Tile::Coordinate&) const; 103 void setTile(const Tile::Coordinate& coordinate, PassRefPtr<Tile> tile); 104 void removeTile(const Tile::Coordinate& coordinate); 105 106 IntRect visibleRect() const; 107 108 float coverageRatio(const IntRect&) const; 109 void adjustForContentsRect(IntRect&) const; 110 111 void paintCheckerPattern(GraphicsContext*, const IntRect&, const Tile::Coordinate&); 112 113private: 114 TiledBackingStoreClient* m_client; 115 std::unique_ptr<TiledBackingStoreBackend> m_backend; 116 117 typedef HashMap<Tile::Coordinate, RefPtr<Tile> > TileMap; 118 TileMap m_tiles; 119 120 Timer<TiledBackingStore> m_tileBufferUpdateTimer; 121 Timer<TiledBackingStore> m_backingStoreUpdateTimer; 122 123 IntSize m_tileSize; 124 float m_coverAreaMultiplier; 125 126 FloatPoint m_trajectoryVector; 127 FloatPoint m_pendingTrajectoryVector; 128 IntRect m_visibleRect; 129 130 IntRect m_coverRect; 131 IntRect m_keepRect; 132 IntRect m_rect; 133 134 float m_contentsScale; 135 float m_pendingScale; 136 137 bool m_commitTileUpdatesOnIdleEventLoop; 138 bool m_contentsFrozen; 139 bool m_supportsAlpha; 140 bool m_pendingTileCreation; 141 142 friend class Tile; 143}; 144 145} 146 147#endif 148#endif 149