#pragma once
#include "FloatRect.h"
#include "IntRect.h"
#include "LengthBox.h"
#include "PlatformCALayer.h"
#include "PlatformCALayerClient.h"
#include "TiledBacking.h"
#include "Timer.h"
#include "VelocityData.h"
#include <wtf/Deque.h>
#include <wtf/Noncopyable.h>
#include <wtf/RetainPtr.h>
#include <wtf/Seconds.h>
namespace WebCore {
class FloatRect;
class IntPoint;
class IntRect;
class TileCoverageMap;
class TileGrid;
typedef Vector<RetainPtr<PlatformLayer>> PlatformLayerList;
const int kDefaultTileSize = 512;
class TileController final : public TiledBacking {
WTF_MAKE_NONCOPYABLE(TileController); WTF_MAKE_FAST_ALLOCATED;
friend class TileCoverageMap;
friend class TileGrid;
public:
WEBCORE_EXPORT explicit TileController(PlatformCALayer*);
WEBCORE_EXPORT ~TileController();
WEBCORE_EXPORT static String tileGridContainerLayerName();
static String zoomedOutTileGridContainerLayerName();
WEBCORE_EXPORT void tileCacheLayerBoundsChanged();
WEBCORE_EXPORT void setNeedsDisplay();
WEBCORE_EXPORT void setNeedsDisplayInRect(const IntRect&);
WEBCORE_EXPORT void setContentsScale(float);
WEBCORE_EXPORT float contentsScale() const;
bool acceleratesDrawing() const { return m_acceleratesDrawing; }
WEBCORE_EXPORT void setAcceleratesDrawing(bool);
bool wantsDeepColorBackingStore() const { return m_wantsDeepColorBackingStore; }
WEBCORE_EXPORT void setWantsDeepColorBackingStore(bool);
bool supportsSubpixelAntialiasedText() const { return m_supportsSubpixelAntialiasedText; }
WEBCORE_EXPORT void setSupportsSubpixelAntialiasedText(bool);
WEBCORE_EXPORT void setTilesOpaque(bool);
bool tilesAreOpaque() const { return m_tilesAreOpaque; }
PlatformCALayer& rootLayer() { return *m_tileCacheLayer; }
const PlatformCALayer& rootLayer() const { return *m_tileCacheLayer; }
WEBCORE_EXPORT void setTileDebugBorderWidth(float);
WEBCORE_EXPORT void setTileDebugBorderColor(Color);
FloatRect visibleRect() const final { return m_visibleRect; }
FloatRect coverageRect() const final { return m_coverageRect; }
Optional<FloatRect> layoutViewportRect() const { return m_layoutViewportRect; }
void setTileSizeUpdateDelayDisabledForTesting(bool) final;
unsigned blankPixelCount() const;
static unsigned blankPixelCountForTiles(const PlatformLayerList&, const FloatRect&, const IntPoint&);
#if PLATFORM(IOS_FAMILY)
unsigned numberOfUnparentedTiles() const;
void removeUnparentedTilesNow();
#endif
float deviceScaleFactor() const { return m_deviceScaleFactor; }
const Color& tileDebugBorderColor() const { return m_tileDebugBorderColor; }
float tileDebugBorderWidth() const { return m_tileDebugBorderWidth; }
ScrollingModeIndication indicatorMode() const { return m_indicatorMode; }
void willStartLiveResize() final;
void didEndLiveResize() final;
IntSize tileSize() const final;
IntRect bounds() const final;
IntRect boundsWithoutMargin() const final;
bool hasMargins() const final;
bool hasHorizontalMargins() const final;
bool hasVerticalMargins() const final;
int topMarginHeight() const final;
int bottomMarginHeight() const final;
int leftMarginWidth() const final;
int rightMarginWidth() const final;
TileCoverage tileCoverage() const final { return m_tileCoverage; }
FloatRect adjustTileCoverageRect(const FloatRect& coverageRect, const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect, bool sizeChanged) final;
FloatRect adjustTileCoverageRectForScrolling(const FloatRect& coverageRect, const FloatSize& newSize, const FloatRect& previousVisibleRect, const FloatRect& currentVisibleRect, float contentsScale) final;
bool scrollingPerformanceLoggingEnabled() const final { return m_scrollingPerformanceLoggingEnabled; }
IntSize computeTileSize();
IntRect boundsAtLastRevalidate() const { return m_boundsAtLastRevalidate; }
IntRect boundsAtLastRevalidateWithoutMargin() const;
void didRevalidateTiles();
bool shouldAggressivelyRetainTiles() const;
bool shouldTemporarilyRetainTileCohorts() const;
void updateTileCoverageMap();
Ref<PlatformCALayer> createTileLayer(const IntRect&, TileGrid&);
const TileGrid& tileGrid() const { return *m_tileGrid; }
WEBCORE_EXPORT Vector<RefPtr<PlatformCALayer>> containerLayers();
void logFilledVisibleFreshTile(unsigned blankPixelCount);
private:
TileGrid& tileGrid() { return *m_tileGrid; }
void scheduleTileRevalidation(Seconds interval);
float topContentInset() const { return m_topContentInset; }
void setVisibleRect(const FloatRect&) final;
void setLayoutViewportRect(Optional<FloatRect>) final;
void setCoverageRect(const FloatRect&) final;
bool tilesWouldChangeForCoverageRect(const FloatRect&) const final;
void setTiledScrollingIndicatorPosition(const FloatPoint&) final;
void setTopContentInset(float) final;
void setVelocity(const VelocityData&) final;
void setScrollability(Scrollability) final;
void prepopulateRect(const FloatRect&) final;
void setIsInWindow(bool) final;
bool isInWindow() const final { return m_isInWindow; }
void setTileCoverage(TileCoverage) final;
void revalidateTiles() final;
void forceRepaint() final;
IntRect tileGridExtent() const final;
void setScrollingPerformanceLoggingEnabled(bool flag) final { m_scrollingPerformanceLoggingEnabled = flag; }
double retainedTileBackingStoreMemory() const final;
IntRect tileCoverageRect() const final;
#if USE(CA)
PlatformCALayer* tiledScrollingIndicatorLayer() final;
#endif
void setScrollingModeIndication(ScrollingModeIndication) final;
void setHasMargins(bool marginTop, bool marginBottom, bool marginLeft, bool marginRight) final;
void setMarginSize(int) final;
void setZoomedOutContentsScale(float) final;
float zoomedOutContentsScale() const final;
void updateMargins();
void clearZoomedOutTileGrid();
void tileGridsChanged();
void tileRevalidationTimerFired();
void setNeedsRevalidateTiles();
void notePendingTileSizeChange();
void tileSizeChangeTimerFired();
#if !PLATFORM(IOS_FAMILY)
FloatRect adjustTileCoverageForDesktopPageScrolling(const FloatRect& coverageRect, const FloatSize& newSize, const FloatRect& previousVisibleRect, const FloatRect& visibleRect) const;
#endif
FloatRect adjustTileCoverageWithScrollingVelocity(const FloatRect& coverageRect, const FloatSize& newSize, const FloatRect& visibleRect, float contentsScale) const;
IntRect boundsForSize(const FloatSize&) const;
PlatformCALayerClient* owningGraphicsLayer() const { return m_tileCacheLayer->owner(); }
PlatformCALayer* m_tileCacheLayer;
float m_zoomedOutContentsScale { 0 };
float m_deviceScaleFactor;
std::unique_ptr<TileCoverageMap> m_coverageMap;
std::unique_ptr<TileGrid> m_tileGrid;
std::unique_ptr<TileGrid> m_zoomedOutTileGrid;
std::unique_ptr<HistoricalVelocityData> m_historicalVelocityData;
FloatRect m_visibleRect; Optional<FloatRect> m_layoutViewportRect; FloatRect m_coverageRect;
IntRect m_boundsAtLastRevalidate;
Timer m_tileRevalidationTimer;
DeferrableOneShotTimer m_tileSizeChangeTimer;
TileCoverage m_tileCoverage { CoverageForVisibleArea };
VelocityData m_velocity;
int m_marginSize { kDefaultTileSize };
Scrollability m_scrollability { HorizontallyScrollable | VerticallyScrollable };
RectEdges<bool> m_marginEdges;
bool m_isInWindow { false };
bool m_scrollingPerformanceLoggingEnabled { false };
bool m_acceleratesDrawing { false };
bool m_wantsDeepColorBackingStore { false };
bool m_supportsSubpixelAntialiasedText { false };
bool m_tilesAreOpaque { false };
bool m_hasTilesWithTemporaryScaleFactor { false }; bool m_inLiveResize { false };
bool m_tileSizeLocked { false };
bool m_haveExternalVelocityData { false };
bool m_isTileSizeUpdateDelayDisabledForTesting { false };
Color m_tileDebugBorderColor;
float m_tileDebugBorderWidth { 0 };
ScrollingModeIndication m_indicatorMode { SynchronousScrollingBecauseOfLackOfScrollingCoordinatorIndication };
float m_topContentInset { 0 };
};
}