22 void* allocation = ::operator
new(
length);
23 return std::unique_ptr<SkDescriptor>(
new (allocation)
SkDescriptor{});
26void SkDescriptor::operator
delete(
void* p) { ::operator
delete(p); }
27void* SkDescriptor::operator
new(size_t) {
28 SK_ABORT(
"Descriptors are created with placement new.");
32 buffer.writePad32(
static_cast<const void*
>(
this), this->fLength);
40 Entry* entry = (
Entry*)((
char*)
this + fLength);
44 memcpy(entry + 1, data,
length);
53 fChecksum = SkDescriptor::ComputeChecksum(
this);
60 while (--
count >= 0) {
61 if (entry->
fTag == tag) {
67 entry = (
const Entry*)((
const char*)(entry + 1) + entry->
fLen);
74 memcpy(desc.get(),
this, fLength);
83 const uint32_t* aa = (
const uint32_t*)
this;
84 const uint32_t* bb = (
const uint32_t*)&other;
85 const uint32_t* stop = (
const uint32_t*)((
const char*)aa + fLength);
105uint32_t SkDescriptor::ComputeChecksum(
const SkDescriptor* desc) {
106 const uint32_t* ptr = (
const uint32_t*)desc + 1;
107 size_t len = desc->fLength -
sizeof(uint32_t);
112 uint32_t
count = fCount;
113 size_t lengthRemaining = this->fLength;
120 while (lengthRemaining > 0 &&
count > 0) {
121 if (lengthRemaining <
sizeof(
Entry)) {
124 lengthRemaining -=
sizeof(
Entry);
126 const Entry* entry = (
const Entry*)(
reinterpret_cast<const char*
>(
this) +
offset);
128 if (lengthRemaining < entry->fLen) {
131 lengthRemaining -= entry->
fLen;
141 return lengthRemaining == 0 &&
count == 0;
156 this->
reset(*that.getDesc());
159 that.fDesc =
nullptr;
164 this->
reset(*that.getDesc());
168 that.fDesc =
nullptr;
185 if (bodyLength >
buffer.available()) {
190 memcpy(ad.fDesc, &descriptorHeader,
sizeof(
SkDescriptor));
191 if (!
buffer.readPad32(SkTAddOffset<void>(ad.fDesc,
sizeof(
SkDescriptor)), bodyLength)) {
198#if defined(SK_BUILD_FOR_FUZZER)
199 SkDescriptor::ComputeChecksum(ad.getDesc());
201 if (SkDescriptor::ComputeChecksum(ad.getDesc()) != ad.getDesc()->fChecksum) {
return {}; }
203 if (!ad.getDesc()->isValid()) {
return {}; }
210 if (size <=
sizeof(fStorage)) {
218 size_t size = desc.getLength();
220 memcpy(fDesc, &desc, size);
223void SkAutoDescriptor::free() {
225 fDesc->~SkDescriptor();
static constexpr T SkAlign4(T x)
#define SK_ABORT(message,...)
#define kRec_SkDescriptorTag
constexpr uint32_t SkToU32(S x)
SkAutoDescriptor & operator=(const SkAutoDescriptor &)
SkDescriptor * getDesc() const
static std::optional< SkAutoDescriptor > MakeFromBuffer(SkReadBuffer &buffer)
void * addEntry(uint32_t tag, size_t length, const void *data=nullptr)
void flatten(SkWriteBuffer &buffer) const
static std::unique_ptr< SkDescriptor > Alloc(size_t length)
std::unique_ptr< SkDescriptor > copy() const
uint32_t getLength() const
const void * findEntry(uint32_t tag, uint32_t *length) const
bool operator==(const SkDescriptor &other) const
void void void appendf(const char format[],...) SK_PRINTF_LIKE(2
static const uint8_t buffer[]
uint32_t Hash32(const void *data, size_t bytes, uint32_t seed)