CoordinatedImageBacking.h [plain text]
#pragma once
#if USE(COORDINATED_GRAPHICS)
#include "CoordinatedGraphicsState.h"
#include "Image.h"
#include "Timer.h"
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
namespace Nicosia {
class Buffer;
}
namespace WebCore {
class WEBCORE_EXPORT CoordinatedImageBacking : public RefCounted<CoordinatedImageBacking> {
public:
class Client {
public:
virtual void createImageBacking(CoordinatedImageBackingID) = 0;
virtual void updateImageBacking(CoordinatedImageBackingID, RefPtr<Nicosia::Buffer>&&) = 0;
virtual void clearImageBackingContents(CoordinatedImageBackingID) = 0;
virtual void removeImageBacking(CoordinatedImageBackingID) = 0;
};
class Host {
public:
virtual bool imageBackingVisible() = 0;
};
static Ref<CoordinatedImageBacking> create(Client& client, Ref<Image>&& image)
{
return adoptRef(*new CoordinatedImageBacking(client, WTFMove(image)));
}
virtual ~CoordinatedImageBacking();
static CoordinatedImageBackingID getCoordinatedImageBackingID(Image&);
CoordinatedImageBackingID id() const { return m_id; }
void addHost(Host&);
void removeHost(Host&);
void markDirty() { m_isDirty = true; }
void update();
private:
CoordinatedImageBacking(Client&, Ref<Image>&&);
void clearContentsTimerFired();
Client& m_client;
HashSet<Host*> m_hosts;
CoordinatedImageBackingID m_id;
Ref<Image> m_image;
NativeImagePtr m_nativeImagePtr;
Timer m_clearContentsTimer;
bool m_isDirty { false };
bool m_isVisible { false };
};
}
#endif // USE(COORDINATED_GRAPHICS)