From e2b6ae9beb5dcfa6c470ff567ddcf191bdab76a4 Mon Sep 17 00:00:00 2001 From: lethosor Date: Sat, 28 Mar 2015 11:27:47 -0400 Subject: [PATCH] Allocate Lua PenArray objects using an existing buffer --- library/LuaApi.cpp | 3 ++- library/include/LuaTools.h | 1 - library/include/modules/Screen.h | 2 ++ library/modules/Screen.cpp | 12 ++++++++++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index ff444013c..cccd8d88c 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1064,7 +1064,8 @@ static int dfhack_penarray_new(lua_State *L) { int bufwidth = luaL_checkint(L, 1); int bufheight = luaL_checkint(L, 2); - new (L) PenArray(bufwidth, bufheight); + void *buf = lua_newuserdata(L, sizeof(PenArray) + (sizeof(Pen) * bufwidth * bufheight)); + new (buf) PenArray(bufwidth, bufheight, buf); lua_rawgetp(L, LUA_REGISTRYINDEX, &DFHACK_PENARRAY_TOKEN); lua_setmetatable(L, -2); diff --git a/library/include/LuaTools.h b/library/include/LuaTools.h index cbcad7ccf..042870273 100644 --- a/library/include/LuaTools.h +++ b/library/include/LuaTools.h @@ -48,7 +48,6 @@ namespace DFHack { } namespace Screen { struct Pen; - struct PenArray; }; } diff --git a/library/include/modules/Screen.h b/library/include/modules/Screen.h index bd87d416b..47bcdd0a6 100644 --- a/library/include/modules/Screen.h +++ b/library/include/modules/Screen.h @@ -118,8 +118,10 @@ namespace DFHack Pen *buffer; unsigned int dimx; unsigned int dimy; + bool static_alloc; public: PenArray(unsigned int bufwidth, unsigned int bufheight); + PenArray(unsigned int bufwidth, unsigned int bufheight, void *buf); ~PenArray(); void clear(); void set_tile(unsigned int x, unsigned int y, Screen::Pen pen); diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index f14068c47..e7fd2df04 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -442,15 +442,23 @@ df::interface_key Screen::charToKey(char code) */ PenArray::PenArray(unsigned int bufwidth, unsigned int bufheight) - :dimx(bufwidth), dimy(bufheight) + :dimx(bufwidth), dimy(bufheight), static_alloc(false) { buffer = new Pen[bufwidth * bufheight]; clear(); } +PenArray::PenArray(unsigned int bufwidth, unsigned int bufheight, void *buf) + :dimx(bufwidth), dimy(bufheight), static_alloc(true) +{ + buffer = (Pen*)((uint8_t*)buf + sizeof(PenArray)); + clear(); +} + PenArray::~PenArray() { - delete[] buffer; + if (!static_alloc) + delete[] buffer; } void PenArray::clear()