ThreadSafeCoordinatedSurface.cpp [plain text]
#include "config.h"
#if USE(COORDINATED_GRAPHICS)
#include "ThreadSafeCoordinatedSurface.h"
#include <WebCore/TextureMapperGL.h>
#include <wtf/StdLibExtras.h>
using namespace WebCore;
namespace WebKit {
Ref<ThreadSafeCoordinatedSurface> ThreadSafeCoordinatedSurface::create(const IntSize& size, CoordinatedSurface::Flags flags)
{
return adoptRef(*new ThreadSafeCoordinatedSurface(size, flags, ImageBuffer::create(size, Unaccelerated)));
}
ThreadSafeCoordinatedSurface::ThreadSafeCoordinatedSurface(const IntSize& size, CoordinatedSurface::Flags flags, std::unique_ptr<ImageBuffer> buffer)
: CoordinatedSurface(size, flags)
, m_imageBuffer(WTFMove(buffer))
{
}
ThreadSafeCoordinatedSurface::~ThreadSafeCoordinatedSurface()
{
}
void ThreadSafeCoordinatedSurface::paintToSurface(const IntRect& rect, CoordinatedSurface::Client& client)
{
GraphicsContext& context = beginPaint(rect);
client.paintToSurfaceContext(context);
endPaint();
}
GraphicsContext& ThreadSafeCoordinatedSurface::beginPaint(const IntRect& rect)
{
ASSERT(m_imageBuffer);
GraphicsContext& graphicsContext = m_imageBuffer->context();
graphicsContext.save();
graphicsContext.clip(rect);
graphicsContext.translate(rect.x(), rect.y());
return graphicsContext;
}
void ThreadSafeCoordinatedSurface::endPaint()
{
ASSERT(m_imageBuffer);
m_imageBuffer->context().restore();
}
void ThreadSafeCoordinatedSurface::copyToTexture(BitmapTexture& texture, const IntRect& target, const IntPoint& sourceOffset)
{
ASSERT(m_imageBuffer);
RefPtr<Image> image = m_imageBuffer->copyImage(DontCopyBackingStore);
texture.updateContents(image.get(), target, sourceOffset, BitmapTexture::UpdateCanModifyOriginalImageData);
}
}
#endif // USE(COORDINATED_GRAPHICS)