NicosiaPaintingEngineThreaded.cpp [plain text]
#include "config.h"
#include "NicosiaPaintingEngineThreaded.h"
#if USE(COORDINATED_GRAPHICS)
#include "GraphicsContext.h"
#include "GraphicsLayer.h"
#include "NicosiaBuffer.h"
#include "NicosiaPaintingContext.h"
namespace Nicosia {
using namespace WebCore;
static void paintLayer(GraphicsContext& context, GraphicsLayer& layer, const IntRect& sourceRect, const IntRect& mappedSourceRect, const IntRect& targetRect, float contentsScale, bool supportsAlpha)
{
context.save();
context.clip(targetRect);
context.translate(targetRect.x(), targetRect.y());
if (supportsAlpha) {
context.setCompositeOperation(CompositeOperator::Copy);
context.fillRect(IntRect(IntPoint::zero(), sourceRect.size()), Color::transparent);
context.setCompositeOperation(CompositeOperator::SourceOver);
}
context.translate(-sourceRect.x(), -sourceRect.y());
context.scale(FloatSize(contentsScale, contentsScale));
layer.paintGraphicsLayerContents(context, mappedSourceRect);
context.restore();
}
PaintingEngineThreaded::PaintingEngineThreaded(unsigned numThreads)
: m_workerPool(WorkerPool::create("PaintingThread"_s, numThreads))
{
}
PaintingEngineThreaded::~PaintingEngineThreaded()
{
}
bool PaintingEngineThreaded::paint(GraphicsLayer& layer, Ref<Buffer>&& buffer, const IntRect& sourceRect, const IntRect& mappedSourceRect, const IntRect& targetRect, float contentsScale)
{
buffer->beginPainting();
PaintingOperations paintingOperations;
PaintingContext::record(paintingOperations,
[&](GraphicsContext& context)
{
paintLayer(context, layer, sourceRect, mappedSourceRect, targetRect, contentsScale, buffer->supportsAlpha());
});
m_workerPool->postTask([paintingOperations = WTFMove(paintingOperations), buffer = WTFMove(buffer)] {
PaintingContext::replay(buffer, paintingOperations);
buffer->completePainting();
});
return true;
}
}
#endif // USE(COORDINATED_GRAPHICS)