blob: 06481831af2d2489924c2ed2b3bf94f6e6d168e8 [file]
/*
* Copyright 2025 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkCapture_DEFINED
#define SkCapture_DEFINED
#include "include/core/SkAlphaType.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSerialProcs.h"
#include "include/private/SkTArray.h"
#include <optional>
class SkData;
class SkImage;
class SkPicture;
class SkCanvas;
class SkCaptureCanvas;
/**
* Binary Serialization Layout (.capt):
*
* +-----------------------------------------------------------------------------+
* | Magic Bytes 1 ('skia') | 4 Bytes (uint32_t) |
* +-----------------------------------------------------------------------------+
* | Magic Bytes 2 ('capt') | 4 Bytes (uint32_t) |
* +-----------------------------------------------------------------------------+
* | Version (kVersion) | 4 Bytes (uint32_t) |
* +-----------------------------------------------------------------------------+
* | Asset Count (numAssets) | 4 Bytes (uint32_t) |
* +-----------------------------------------------------------------------------+
* | RecordingCapture Count (numRecCaptures) | 4 Bytes (uint32_t) |
* +=============================================================================+
* | ASSETS SECTION (N = numAssets) |
* +-----------------------------------------------------------------------------+
* | Picture 0 Data Size | 4 Bytes (uint32_t) |
* +-----------------------------------------------------------------------------+
* | Picture 0 Bytes | [Picture 0 Size] bytes |
* +-----------------------------------------------------------------------------+
* | ... | |
* +-----------------------------------------------------------------------------+
* | Picture N Data Size | 4 Bytes (uint32_t) |
* +-----------------------------------------------------------------------------+
* | Picture N Bytes | [Picture N Size] bytes |
* +=============================================================================+
* | TIMELINE SECTION (K = numRecCaptures) |
* +-----------------------------------------------------------------------------+
* | Recording 0 Task Count (taskCount) | 4 Bytes (uint32_t) |
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* | Recording 0 Tasks (fAssetIndex) | taskCount * sizeof(DrawTask) |
* +-----------------------------------------------------------------------------+
* | ... | |
* +-----------------------------------------------------------------------------+
* | Recording K Task Count (taskCount) | 4 Bytes (uint32_t) |
* + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* | Recording K Tasks (fAssetIndex) | taskCount * sizeof(DrawTask) |
* +-----------------------------------------------------------------------------+
*/
class SkCapture : public SkRefCnt {
public:
struct DrawTask {
uint32_t fAssetIndex;
};
struct RecordingCapture {
skia_private::TArray<DrawTask> fDrawTasks;
};
struct Metadata {
uint32_t version;
uint32_t numAssets;
uint32_t numRecordingCaptures;
};
static sk_sp<SkCapture> MakeFromData(sk_sp<const SkData>);
static sk_sp<SkCapture> MakeEmpty();
void addAsset(sk_sp<SkPicture>);
void addRecordingCapture(RecordingCapture);
sk_sp<SkData> serializeCapture();
sk_sp<SkPicture> getAsset(int i) const;
const RecordingCapture* getRecordingCapture(int i) const;
Metadata getMetadata() const;
private:
static SkSerialReturnType serializeImageProc(SkImage* img, void* ctx);
static sk_sp<SkImage> deserializeImageProc(sk_sp<SkData>,
std::optional<SkAlphaType>, void* ctx);
Metadata fMetadata;
skia_private::TArray<sk_sp<SkPicture>> fAssets;
skia_private::TArray<RecordingCapture> fTimeline;
static const uint32_t kVersion = 0;
};
#endif //SkCapture_DEFINED