Skip to content

Commit 0c961e8

Browse files
committed
Reworking PCSX.Misc.uclWrap
1 parent e5dc3df commit 0c961e8

File tree

2 files changed

+65
-25
lines changed

2 files changed

+65
-25
lines changed

src/supportpsx/binffi.lua

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ struct PS1PackerOptions {
4848
bool binaryLoaderLoad(LuaFile* src, LuaFile* dest, struct BinaryLoaderInfo* info);
4949
void ps1PackerPack(LuaFile* src, LuaFile* dest, uint32_t addr, uint32_t pc, uint32_t gp, uint32_t sp,
5050
struct PS1PackerOptions options);
51-
uint32_t uclPack(LuaFile* src, LuaFile* dest);
51+
uint32_t uclWrapper(const uint8_t* in, uint32_t size, uint8_t* out);
5252
uint32_t writeUclDecomp(LuaFile* dest);
5353

5454
]]
@@ -146,9 +146,63 @@ end
146146
if type(PCSX.Misc) ~= 'table' then PCSX.Misc = {} end
147147

148148
PCSX.Misc.uclPack = function(src, dest)
149-
if type(src) ~= 'table' or src._type ~= 'File' then error('Expected a File object as first argument') end
150-
if type(dest) ~= 'table' or dest._type ~= 'File' then error('Expected a File object as second argument') end
151-
return C.uclPack(src._wrapper, dest._wrapper)
149+
local srcPtr
150+
local srcSize
151+
if type(src) == 'table' and src._type == 'File' then
152+
src = src:read(src:size())
153+
srcPtr = ffi.cast('uint8_t*', src.data)
154+
srcSize = src.size
155+
elseif type(src) == 'string' then
156+
srcPtr = ffi.cast('uint8_t*', src)
157+
srcSize = #src
158+
elseif Support.isLuaBuffer(src) then
159+
srcPtr = ffi.cast('uint8_t*', src.data)
160+
srcSize = src.size
161+
elseif type(src) == 'table' and src._type == 'Slice' then
162+
srcPtr = src.data
163+
srcSize = src.size
164+
else
165+
error('Expected a File object, string, LuaBuffer, or Slice as first argument')
166+
end
167+
168+
local bufferSize = srcSize * 1.2 + 2048
169+
170+
local retIsDest = false
171+
local destPtr
172+
local destSlice
173+
if not dest then
174+
dest = Support.File.createEmptySlice()
175+
dest:resize(bufferSize)
176+
destPtr = dest.mutable
177+
retIsDest = true
178+
elseif type(dest) == 'table' and dest._type == 'File' then
179+
destSlice = Support.File.createEmptySlice()
180+
destSlice:resize(bufferSize)
181+
destPtr = destSlice.mutable
182+
elseif Support.isLuaBuffer(dest) then
183+
destPtr = ffi.cast('uint8_t*', dest.data)
184+
dest:resize(bufferSize)
185+
elseif type(dest) == 'table' and dest._type == 'Slice' then
186+
destPtr = dest.mutable
187+
dest:resize(bufferSize)
188+
else
189+
error('Expected a File object, string, LuaBuffer, or Slice as second argument')
190+
end
191+
192+
local outSize = C.uclWrapper(srcPtr, srcSize, destPtr)
193+
194+
if outSize == 0 then
195+
error('Fatal error during data compression.')
196+
end
197+
198+
if type(dest) == 'table' and dest._type == 'File' then
199+
destSlice:resize(outSize)
200+
dest:writeMoveSlice(destSlice)
201+
else
202+
dest:resize(outSize)
203+
end
204+
205+
return retIsDest and dest or outSize
152206
end
153207

154208
PCSX.Misc.writeUclDecomp = function(dest)

src/supportpsx/binlua.cc

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -68,26 +68,6 @@ void ps1PackerPack(PCSX::LuaFFI::LuaFile* src, PCSX::LuaFFI::LuaFile* dest, uint
6868
PCSX::PS1Packer::pack(src->file, dest->file, addr, pc, gp, sp, options);
6969
}
7070

71-
uint32_t uclPack(PCSX::LuaFFI::LuaFile* src, PCSX::LuaFFI::LuaFile* dest) {
72-
std::vector<uint8_t> dataIn;
73-
dataIn.resize(src->file->size());
74-
src->file->read(dataIn.data(), dataIn.size());
75-
76-
std::vector<uint8_t> dataOut;
77-
dataOut.resize(dataIn.size() * 1.2 + 2048);
78-
ucl_uint outSize;
79-
int r;
80-
81-
r = ucl_nrv2e_99_compress(dataIn.data(), dataIn.size(), dataOut.data(), &outSize, nullptr, 10, nullptr, nullptr);
82-
if (r != UCL_E_OK) {
83-
throw std::runtime_error("Fatal error during data compression.\n");
84-
}
85-
dataOut.resize(outSize);
86-
dest->file->write(dataOut.data(), outSize);
87-
88-
return outSize;
89-
}
90-
9171
uint32_t writeUclDecomp(PCSX::LuaFFI::LuaFile* dest) {
9272
dest->file->write(n2e_d::code, sizeof(n2e_d::code));
9373
return sizeof(n2e_d::code);
@@ -100,6 +80,12 @@ void registerSymbol(PCSX::Lua L, const char (&name)[S], const T ptr) {
10080
L.settable();
10181
}
10282

83+
uint32_t uclWrapper(const uint8_t* in, uint32_t size, uint8_t* out) {
84+
ucl_uint outSize;
85+
auto r = ucl_nrv2e_99_compress(in, size, out, &outSize, nullptr, 10, nullptr, nullptr);
86+
return r == UCL_E_OK ? outSize : 0;
87+
}
88+
10389
#define REGISTER(L, s) registerSymbol(L, #s, s)
10490

10591
void registerAllSymbols(PCSX::Lua L) {
@@ -108,7 +94,7 @@ void registerAllSymbols(PCSX::Lua L) {
10894
L.newtable();
10995
REGISTER(L, binaryLoaderLoad);
11096
REGISTER(L, ps1PackerPack);
111-
REGISTER(L, uclPack);
97+
REGISTER(L, uclWrapper);
11298
REGISTER(L, writeUclDecomp);
11399
L.settable();
114100
L.pop();

0 commit comments

Comments
 (0)