blob: c14cb8c8dee3c50270fc12ec569287ce0e290b88 [file] [log] [blame]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/capture/SkCaptureManager.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkSurface.h"
#include "src/capture/SkCapture.h"
#include "src/capture/SkCaptureCanvas.h"
#include <memory>
SkCaptureManager::SkCaptureManager() {}
SkCanvas* SkCaptureManager::makeCaptureCanvas(SkCanvas* canvas) {
auto newCanvas = std::make_unique<SkCaptureCanvas>(canvas, this);
auto rawCanvasPtr = newCanvas.get();
fTrackedCanvases.emplace_back(std::move(newCanvas));
return rawCanvasPtr;
}
void SkCaptureManager::snapPictures() {
for (auto& canvas : fTrackedCanvases) {
if (canvas) {
auto picture = canvas->snapPicture();
if (picture) {
fPictures.emplace_back(picture);
}
}
}
}
// TODO: make thread saffe by using exchange() and a mutex.
void SkCaptureManager::toggleCapture(bool capturing) {
if (capturing != fIsCurrentlyCapturing && !capturing) {
// on capture stop, save the capture and reset
this->snapPictures();
fLastCapture = SkCapture::MakeFromPictures(fPictures);
fPictures.clear();
}
fIsCurrentlyCapturing = capturing;
}
void SkCaptureManager::snapPicture(SkSurface* surface) {
for (auto& canvas : fTrackedCanvases) {
if (canvas) {
if (canvas->getSurface() == surface) {
auto picture = canvas->snapPicture();
if (picture) {
// TODO(412351769): for every storing of a picture, we should track a content id
// and the surface it was drawn to.
fPictures.emplace_back(picture);
}
return;
}
}
}
}
sk_sp<SkCapture> SkCaptureManager::getLastCapture() const {
return fLastCapture;
}