MCPcopy Create free account
hub / github.com/OpenStarbound/OpenStarbound / open

Method open

source/base/StarMemoryAssetSource.cpp:22–81  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

20}
21
22IODevicePtr MemoryAssetSource::open(String const& path) {
23 struct AssetReader : public IODevice {
24 AssetReader(char* assetData, size_t assetSize, String name) {
25 this->assetData = assetData;
26 this->assetSize = assetSize;
27 this->name = std::move(name);
28 setMode(IOMode::Read);
29 }
30
31 size_t read(char* data, size_t len) override {
32 len = min<StreamOffset>(len, StreamOffset(assetSize) - assetPos);
33 memcpy(data, assetData + assetPos, len);
34 assetPos += len;
35 return len;
36 }
37
38 size_t write(char const*, size_t) override {
39 throw IOException("Assets IODevices are read-only");
40 }
41
42 StreamOffset size() override { return assetSize; }
43 StreamOffset pos() override { return assetPos; }
44
45 String deviceName() const override { return name; }
46
47 bool atEnd() override {
48 return assetPos >= (StreamOffset)assetSize;
49 }
50
51 void seek(StreamOffset p, IOSeek mode) override {
52 if (mode == IOSeek::Absolute)
53 assetPos = p;
54 else if (mode == IOSeek::Relative)
55 assetPos = clamp<StreamOffset>(assetPos + p, 0, assetSize);
56 else
57 assetPos = clamp<StreamOffset>(assetPos - p, 0, assetSize);
58 }
59
60 IODevicePtr clone() override {
61 auto cloned = make_shared<AssetReader>(assetData, assetSize, name);
62 cloned->assetPos = assetPos;
63 return cloned;
64 }
65
66 char* assetData;
67 size_t assetSize;
68 StreamOffset assetPos = 0;
69 String name;
70 };
71
72 auto p = m_files.ptr(path);
73 if (!p)
74 throw AssetSourceException::format("Requested file '{}' does not exist in memory", path);
75 else if (auto byteArray = p->ptr<ByteArray>())
76 return make_shared<AssetReader>(byteArray->ptr(), byteArray->size(), path);
77 else {
78 auto image = p->get<ImagePtr>().get();
79 return make_shared<AssetReader>((char*)image->data(), image->width() * image->height() * image->bytesPerPixel(), path);

Callers

nothing calls this directly

Calls 8

bytesPerPixelMethod · 0.80
formatFunction · 0.50
ptrMethod · 0.45
sizeMethod · 0.45
getMethod · 0.45
dataMethod · 0.45
widthMethod · 0.45
heightMethod · 0.45

Tested by

no test coverage detected