#ifndef TextureMapperGL_h
#define TextureMapperGL_h
#if USE(ACCELERATED_COMPOSITING)
#include "FloatQuad.h"
#include "IntSize.h"
#include "TextureMapper.h"
#include "TransformationMatrix.h"
namespace WebCore {
class TextureMapperGLData;
class GraphicsContext;
class TextureMapperGL : public TextureMapper {
public:
TextureMapperGL();
virtual ~TextureMapperGL();
virtual void drawTexture(const BitmapTexture&, const FloatRect&, const TransformationMatrix&, float opacity, const BitmapTexture* maskTexture);
virtual void drawTexture(uint32_t texture, bool opaque, const FloatSize&, const FloatRect&, const TransformationMatrix&, float opacity, const BitmapTexture* maskTexture, bool flip);
virtual void bindSurface(BitmapTexture* surface);
virtual void beginClip(const TransformationMatrix&, const FloatRect&);
virtual void endClip();
virtual bool allowSurfaceForRoot() const { return false; }
virtual PassRefPtr<BitmapTexture> createTexture();
virtual const char* type() const;
static PassOwnPtr<TextureMapperGL> create() { return adoptPtr(new TextureMapperGL); }
void beginPainting();
void endPainting();
void setGraphicsContext(GraphicsContext* context) { m_context = context; }
GraphicsContext* graphicsContext() { return m_context; }
virtual bool isOpenGLBacked() const { return true; }
private:
void initializeShaders();
inline TextureMapperGLData& data() { return *m_data; }
TextureMapperGLData* m_data;
GraphicsContext* m_context;
friend class BitmapTextureGL;
};
class RGBA32PremultimpliedBuffer : public RefCounted<RGBA32PremultimpliedBuffer> {
public:
virtual ~RGBA32PremultimpliedBuffer() {}
virtual PlatformGraphicsContext* beginPaint(const IntRect& dirtyRect, bool opaque) = 0;
virtual void endPaint() = 0;
virtual const void* data() const = 0;
static PassRefPtr<RGBA32PremultimpliedBuffer> create();
};
static inline int nextPowerOfTwo(int num)
{
for (int i = 0x10000000; i > 0; i >>= 1) {
if (num == i)
return num;
if (num & i)
return (i << 1);
}
return 1;
}
static inline IntSize nextPowerOfTwo(const IntSize& size)
{
return IntSize(nextPowerOfTwo(size.width()), nextPowerOfTwo(size.height()));
}
typedef uint64_t ImageUID;
ImageUID uidForImage(Image*);
};
#endif
#endif