/** This constructor means we are inline with our fPtr's contents. * Thus we set fPtr to point right after this.
*/
SkData::SkData(size_t size)
: fReleaseProc(nullptr)
, fReleaseProcContext(nullptr)
, fPtr((constchar*)(this + 1))
, fSize(size)
{}
SkData::~SkData() { if (fReleaseProc) {
fReleaseProc(fPtr, fReleaseProcContext);
}
}
// assumes context is a SkData staticvoid sk_dataref_releaseproc(constvoid*, void* context) {
SkData* src = reinterpret_cast<SkData*>(context);
src->unref();
}
sk_sp<SkData> SkData::MakeSubset(const SkData* src, size_t offset, size_t length) { /* We could, if we wanted/need to, just make a deep copy of src's data, rather than referencing it. This would duplicate the storage (of the subset amount) but would possibly allow src to go out of scope sooner.
*/
size_t available = src->size(); if (offset >= available || 0 == length) { return SkData::MakeEmpty();
}
available -= offset; if (length > available) {
length = available;
}
SkASSERT(length > 0);
src->ref(); // this will be balanced in sk_dataref_releaseproc return sk_sp<SkData>(new SkData(src->bytes() + offset, length, sk_dataref_releaseproc, const_cast<SkData*>(src)));
}
sk_sp<SkData> SkData::MakeFromStream(SkStream* stream, size_t size) { // reduce the chance of OOM by checking that the stream has enough bytes to read from before // allocating that potentially large buffer. if (StreamRemainingLengthIsBelow(stream, size)) { return nullptr;
}
sk_sp<SkData> data(SkData::MakeUninitialized(size)); if (stream->read(data->writable_data(), size) != size) { return nullptr;
} return data;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.