blob: 7d1312b010a0f3c1ef7fc059ac0c18440a4e1baf [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.
*/
#ifndef skcpu_Recorder_DEFINED
#define skcpu_Recorder_DEFINED
#include "include/core/SkRecorder.h"
#include "include/core/SkRefCnt.h"
#include "include/private/base/SkAPI.h"
class SkCanvas;
class SkSurface;
class SkSurfaceProps;
struct SkImageInfo;
#include <cstddef>
namespace skcpu {
class SK_API Recorder : public SkRecorder {
public:
/** Returns a non-null global context. Can be used as a means of transitioning onto
* new APIs when a skcpu::Context/Recorder has not been piped down into the code paths
*/
static Recorder* TODO();
SkRecorder::Type type() const final { return SkRecorder::Type::kCPU; }
skcpu::Recorder* cpuRecorder() final { return this; }
/** Allocates a bitmap-backed SkSurface. SkCanvas returned by SkSurface draws directly into
* those allocated pixels, which are zeroed before use. Pixel memory size is imageInfo.height()
* times imageInfo.minRowBytes() or rowBytes, if provided and non-zero.
*
* Pixel memory is deleted when SkSurface is deleted.
*
* Validity constraints include:
* - info dimensions are greater than zero;
* - info contains SkColorType and SkAlphaType supported by raster surface.
*
* @param imageInfo width, height, SkColorType, SkAlphaType, SkColorSpace,
* of raster surface; width and height must be greater than zero
* @param rowBytes interval from one SkSurface row to the next.
* @param props LCD striping orientation and setting for device independent fonts;
* may be nullptr
* @return SkSurface if parameters are valid and memory was allocated, else nullptr.
*/
sk_sp<SkSurface> makeBitmapSurface(const SkImageInfo& imageInfo,
size_t rowBytes,
const SkSurfaceProps* surfaceProps);
sk_sp<SkSurface> makeBitmapSurface(const SkImageInfo& imageInfo,
const SkSurfaceProps* surfaceProps = nullptr);
private:
// TODO (b/412351769): Implement this so we can capture from a CPU Recorder.
SkCanvas* makeCaptureCanvas(SkCanvas*) final { return nullptr; }
void createCaptureBreakpoint(SkSurface*) final {}
};
inline Recorder* AsRecorder(SkRecorder* recorder) {
if (!recorder) {
return nullptr;
}
if (recorder->type() != SkRecorder::Type::kCPU) {
return nullptr;
}
return static_cast<Recorder*>(recorder);
}
} // namespace skcpu
#endif