LayerTilerChromium.h [plain text]
#ifndef LayerTilerChromium_h
#define LayerTilerChromium_h
#if USE(ACCELERATED_COMPOSITING)
#include "LayerChromium.h"
#include "LayerTexture.h"
#include "PlatformCanvas.h"
#include "TilingData.h"
#include <wtf/HashTraits.h>
#include <wtf/OwnArrayPtr.h>
#include <wtf/RefCounted.h>
namespace WebCore {
class GraphicsContext3D;
class LayerRendererChromium;
class TilePaintInterface {
public:
virtual void paint(GraphicsContext& context, const IntRect& contentRect) = 0;
};
class LayerTilerChromium {
WTF_MAKE_NONCOPYABLE(LayerTilerChromium);
public:
enum BorderTexelOption { HasBorderTexels, NoBorderTexels };
static PassOwnPtr<LayerTilerChromium> create(LayerRendererChromium*, const IntSize& tileSize, BorderTexelOption);
~LayerTilerChromium();
void invalidateRect(const IntRect& contentRect);
void invalidateEntireLayer();
void update(TilePaintInterface& painter, const IntRect& contentRect);
void uploadCanvas();
void updateFromPixels(const IntRect& contentRect, const IntRect& paintRect, const uint8_t* pixels);
void draw(const IntRect& contentRect, const TransformationMatrix&, float opacity);
void setLayerPosition(const IntPoint& position);
void setTileSize(const IntSize& size);
void setLayerRenderer(LayerRendererChromium*);
bool skipsDraw() const { return m_skipsDraw; }
typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderTexAlpha> Program;
LayerTexture* getSingleTexture();
private:
LayerTilerChromium(LayerRendererChromium*, const IntSize& tileSize, BorderTexelOption);
class Tile : public RefCounted<Tile> {
WTF_MAKE_NONCOPYABLE(Tile);
public:
explicit Tile(PassOwnPtr<LayerTexture> tex) : m_tex(tex), m_i(-1), m_j(-1) {}
LayerTexture* texture() { return m_tex.get(); }
bool dirty() const { return !m_dirtyLayerRect.isEmpty(); }
void clearDirty() { m_dirtyLayerRect = IntRect(); }
int i() const { return m_i; }
int j() const { return m_j; }
void moveTo(int i, int j) { m_i = i; m_j = j; }
IntRect m_dirtyLayerRect;
private:
OwnPtr<LayerTexture> m_tex;
int m_i;
int m_j;
};
void drawTexturedQuad(GraphicsContext3D*, const TransformationMatrix& projectionMatrix, const TransformationMatrix& drawMatrix,
float width, float height, float opacity,
float texTranslateX, float texTranslateY,
float texScaleX, float texScaleY,
const LayerTilerChromium::Program*);
void growLayerToContain(const IntRect& contentRect);
LayerRendererChromium* layerRenderer() const { return m_layerRenderer; }
GraphicsContext3D* layerRendererContext() const;
Tile* createTile(int i, int j);
void invalidateTiles(const IntRect& contentRect);
void reset();
void contentRectToTileIndices(const IntRect& contentRect, int &left, int &top, int &right, int &bottom) const;
IntRect contentRectToLayerRect(const IntRect& contentRect) const;
IntRect layerRectToContentRect(const IntRect& layerRect) const;
Tile* tileAt(int, int) const;
IntRect tileContentRect(const Tile*) const;
IntRect tileLayerRect(const Tile*) const;
IntSize m_tileSize;
IntPoint m_layerPosition;
bool m_skipsDraw;
typedef std::pair<int, int> TileMapKey;
struct TileMapKeyTraits : HashTraits<TileMapKey> {
static const bool emptyValueIsZero = false;
static const bool needsDestruction = false;
static TileMapKey emptyValue() { return std::make_pair(-1, -1); }
static void constructDeletedValue(TileMapKey& slot) { slot = std::make_pair(-2, -2); }
static bool isDeletedValue(TileMapKey value) { return value.first == -2 && value.second == -2; }
};
typedef HashMap<TileMapKey, RefPtr<Tile>, DefaultHash<TileMapKey>::Hash, TileMapKeyTraits> TileMap;
TileMap m_tiles;
Vector<RefPtr<Tile> > m_unusedTiles;
IntRect m_paintRect;
IntRect m_updateRect;
PlatformCanvas m_canvas;
OwnArrayPtr<uint8_t> m_tilePixels;
TilingData m_tilingData;
bool m_useMapSubForUploads;
LayerRendererChromium* m_layerRenderer;
};
}
#endif // USE(ACCELERATED_COMPOSITING)
#endif