mirror of
https://github.com/love2d/love.git
synced 2026-08-18 19:54:22 +02:00
Add optional source data start index arg to Buffer:setArrayData
The argument list is now Buffer:setArrayData(data or table, sourceindex=1, destindex=1, count=automatically computed) #1598
This commit is contained in:
@@ -190,34 +190,49 @@ static int w_Buffer_setArrayData(lua_State *L)
|
|||||||
{
|
{
|
||||||
Buffer *t = luax_checkbuffer(L, 1);
|
Buffer *t = luax_checkbuffer(L, 1);
|
||||||
|
|
||||||
int startindex = (int) luaL_optnumber(L, 3, 1) - 1;
|
int sourceindex = (int) luaL_optnumber(L, 3, 1) - 1;
|
||||||
|
int destindex = (int) luaL_optnumber(L, 4, 1) - 1;
|
||||||
|
|
||||||
|
if (sourceindex < 0)
|
||||||
|
return luaL_error(L, "Source start index must be at least 1.");
|
||||||
|
|
||||||
int count = -1;
|
int count = -1;
|
||||||
if (!lua_isnoneornil(L, 4))
|
if (!lua_isnoneornil(L, 5))
|
||||||
{
|
{
|
||||||
count = (int) luaL_checknumber(L, 4);
|
count = (int) luaL_checknumber(L, 5);
|
||||||
if (count <= 0)
|
if (count <= 0)
|
||||||
return luaL_error(L, "Element count must be greater than 0.");
|
return luaL_error(L, "Element count must be greater than 0.");
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t stride = t->getArrayStride();
|
size_t stride = t->getArrayStride();
|
||||||
size_t offset = startindex * stride;
|
size_t bufferoffset = destindex * stride;
|
||||||
int arraylength = (int) t->getArrayLength();
|
int arraylength = (int) t->getArrayLength();
|
||||||
|
|
||||||
if (startindex >= arraylength || startindex < 0)
|
if (destindex >= arraylength || destindex < 0)
|
||||||
return luaL_error(L, "Invalid vertex start index (must be between 1 and %d)", arraylength);
|
return luaL_error(L, "Invalid buffer start index (must be between 1 and %d)", arraylength);
|
||||||
|
|
||||||
if (luax_istype(L, 2, Data::type))
|
if (luax_istype(L, 2, Data::type))
|
||||||
{
|
{
|
||||||
Data *d = luax_checktype<Data>(L, 2);
|
Data *d = luax_checktype<Data>(L, 2);
|
||||||
|
|
||||||
count = count >= 0 ? count : (arraylength - startindex);
|
int dataarraylength = d->getSize() / stride;
|
||||||
if (startindex + count > arraylength)
|
|
||||||
return luaL_error(L, "Too many array elements (expected at most %d, got %d)", arraylength - startindex, count);
|
|
||||||
|
|
||||||
size_t datasize = std::min(d->getSize(), count * stride);
|
if (sourceindex >= dataarraylength)
|
||||||
|
return luaL_error(L, "Invalid data start index (must be between 1 and %d)", dataarraylength);
|
||||||
|
|
||||||
t->fill(offset, datasize, d->getData());
|
int maxcount = std::min(dataarraylength - sourceindex, arraylength - destindex);
|
||||||
|
|
||||||
|
if (count < 0)
|
||||||
|
count = maxcount;
|
||||||
|
|
||||||
|
if (count > maxcount)
|
||||||
|
return luaL_error(L, "Too many array elements (expected at most %d, got %d)", maxcount, count);
|
||||||
|
|
||||||
|
size_t dataoffset = sourceindex * stride;
|
||||||
|
size_t datasize = std::min(d->getSize() - dataoffset, count * stride);
|
||||||
|
const void *sourcedata = (const uint8 *) d->getData() + dataoffset;
|
||||||
|
|
||||||
|
t->fill(bufferoffset, datasize, sourcedata);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,15 +256,19 @@ static int w_Buffer_setArrayData(lua_State *L)
|
|||||||
tablelen /= ncomponents;
|
tablelen /= ncomponents;
|
||||||
}
|
}
|
||||||
|
|
||||||
count = count >= 0 ? std::min(count, tablelen) : tablelen;
|
if (sourceindex >= tablelen)
|
||||||
if (startindex + count > arraylength)
|
return luaL_error(L, "Invalid data start index (must be between 1 and %d)", tablelen);
|
||||||
return luaL_error(L, "Too many array elements (expected at most %d, got %d)", arraylength - startindex, count);
|
|
||||||
|
|
||||||
char *data = (char *) t->map(Buffer::MAP_WRITE_INVALIDATE, offset, count * stride);
|
count = count >= 0 ? std::min(count, tablelen - sourceindex) : tablelen - sourceindex;
|
||||||
|
|
||||||
|
if (destindex + count > arraylength)
|
||||||
|
return luaL_error(L, "Too many array elements (expected at most %d, got %d)", arraylength - destindex, count);
|
||||||
|
|
||||||
|
char *data = (char *) t->map(Buffer::MAP_WRITE_INVALIDATE, bufferoffset, count * stride);
|
||||||
|
|
||||||
if (tableoftables)
|
if (tableoftables)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = sourceindex; i < count; i++)
|
||||||
{
|
{
|
||||||
// get arraydata[index]
|
// get arraydata[index]
|
||||||
lua_rawgeti(L, 2, i + 1);
|
lua_rawgeti(L, 2, i + 1);
|
||||||
@@ -273,7 +292,7 @@ static int w_Buffer_setArrayData(lua_State *L)
|
|||||||
}
|
}
|
||||||
else // Flat array
|
else // Flat array
|
||||||
{
|
{
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = sourceindex; i < count; i++)
|
||||||
{
|
{
|
||||||
// get arraydata[arrayindex * ncomponents + componentindex]
|
// get arraydata[arrayindex * ncomponents + componentindex]
|
||||||
for (int componentindex = 1; componentindex <= ncomponents; componentindex++)
|
for (int componentindex = 1; componentindex <= ncomponents; componentindex++)
|
||||||
@@ -292,7 +311,7 @@ static int w_Buffer_setArrayData(lua_State *L)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
t->unmap(offset, count * stride);
|
t->unmap(bufferoffset, count * stride);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user