#include "common.h"
#include
#include
template
sk_sp CloneFlattenable(const SkShader& shader) {
auto data = shader.serialize();
auto flat = SkShader::Deserialize(
shader.getFlattenableType(), data->data(), data->size());
return sk_sp(reinterpret_cast(flat.release()));
}
template
sk_sp CloneFlattenable(const SkColorFilter& colorFilter) {
auto data = colorFilter.serialize();
auto flat = colorFilter.Deserialize(data->data(), data->size());
return sk_sp(
reinterpret_cast(flat.release()));
}
sk_sp CloneColorSpace(const SkColorSpace* cs) {
return (cs) ? CloneFlattenable(*cs) : sk_sp(nullptr);
}
sk_sp CloneImage(const SkImage& image) {
SkPixmap pixmap;
if (image.peekPixels(&pixmap))
return SkImages::RasterFromPixmapCopy(pixmap);
return SkImages::DeferredFromEncodedData(SkPngEncoder::Encode(nullptr, &image, {}));
}
size_t ValidateBufferToImageInfo(
const SkImageInfo& imageInfo,
const py::buffer_info& buffer,
size_t rowBytes) {
if (buffer.ndim == 0)
throw py::value_error("Buffer does not have dimensions.");
if (buffer.ndim == 1 && rowBytes == 0)
rowBytes = imageInfo.minRowBytes();
else if (buffer.ndim > 1)
rowBytes = buffer.strides[0];
if (!imageInfo.validRowBytes(rowBytes))
throw py::value_error(py::str(
"Row bytes is smaller than required (expected {}, given {})"
).format(imageInfo.minRowBytes(), rowBytes));
size_t byteSize = buffer.strides[0] * buffer.shape[0];
if (byteSize < imageInfo.computeByteSize(rowBytes))
throw py::value_error(py::str(
"Byte size is smaller than required (expected {}, given {})"
).format(imageInfo.computeByteSize(rowBytes), byteSize));
return rowBytes;
}
SkImageInfo NumPyToImageInfo(py::array array, SkColorType ct, SkAlphaType at,
const SkColorSpace* cs) {
if (!(array.flags() & py::array::c_style))
throw py::value_error("Array must be C-style contiguous.");
if (array.ndim()