diff --git a/game/engines/default/engine/LogDisplay.lua b/game/engines/default/engine/LogDisplay.lua index eec92bc071d6bf6b8b7ee87bab27a7246246fcd9..e81e7488395450121c67aecb97e91e0581c8d7ac 100644 --- a/game/engines/default/engine/LogDisplay.lua +++ b/game/engines/default/engine/LogDisplay.lua @@ -40,6 +40,7 @@ function _M:init(x, y, w, h, max, fontname, fontsize, color, bgcolor) self.max_log = max or 4000 self.scroll = 0 self.changed = true + self.cache = {} self:resize(x, y, w, h) end @@ -80,7 +81,8 @@ function _M:call(str, ...) local tstr = str:toString() table.insert(self.log, 1, tstr) while #self.log > self.max_log do - table.remove(self.log) + local old = table.remove(self.log) + self.cache[old] = nil end self.max = #self.log self.changed = true @@ -88,6 +90,7 @@ end --- Clear the log function _M:empty() + self.cache = {} self.log = {} self.changed = true end @@ -116,8 +119,13 @@ function _M:display() for z = 1 + self.scroll, #self.log do local stop = false local tstr = self.log[z] --- local gen = tstring.makeLineTextures(tstr, self.w - 4, self.font) - local gen = self.font:draw(tstr, self.w, 255, 255, 255) + local gen + if self.cache[tstr] then + gen = self.cache[tstr] + else + gen = self.font:draw(tstr, self.w, 255, 255, 255) + self.cache[tstr] = gen + end for i = #gen, 1, -1 do self.dlist[#self.dlist+1] = gen[i] h = h + self.fh diff --git a/game/engines/default/engine/ui/TextzoneList.lua b/game/engines/default/engine/ui/TextzoneList.lua index 0b8a3953898ea07e499bf98a98e7233e76090ba1..5313841459bc107388538d83fd2f79b6d92bafbb 100644 --- a/game/engines/default/engine/ui/TextzoneList.lua +++ b/game/engines/default/engine/ui/TextzoneList.lua @@ -69,7 +69,7 @@ function _M:createItem(item, text) local old_style = self.font:getStyle() -- Handle normal text - if type(text) == "string" then + if false and type(text) == "string" then local list = text:splitLines(self.w, self.font) local scroll = 1 local max = #list @@ -98,7 +98,7 @@ function _M:createItem(item, text) -- Handle "pre formated" text, as a table else -- Draw the list items - local gen = tstring.makeLineTextures(text, self.fw, self.font) + local gen = self.font:draw(text:toString(), self.fw, 255, 255, 255) local scroll = 1 local max = #gen diff --git a/src/core_lua.c b/src/core_lua.c index a3efd805bc60c113b8fa1c615da91de864c0c6e9..d083deebc35eba315c554c1a93b816cfbf383040 100644 --- a/src/core_lua.c +++ b/src/core_lua.c @@ -488,7 +488,7 @@ static int sdl_surface_drawstring_newsurface_aa(lua_State *L) static font_make_texture_line(lua_State *L, SDL_Surface *s, int id) { - lua_newtable(L); + lua_createtable(L, 0, 5); lua_pushstring(L, "_tex"); GLuint *t = (GLuint*)lua_newuserdata(L, sizeof(GLuint)); @@ -520,7 +520,6 @@ static font_make_texture_line(lua_State *L, SDL_Surface *s, int id) static int sdl_font_draw(lua_State *L) { -// if (no_text_aa) return sdl_surface_drawstring(L); TTF_Font **f = (TTF_Font**)auxiliar_checkclass(L, "sdl{font}", 1); const char *str = luaL_checkstring(L, 2); int max_width = luaL_checknumber(L, 3); @@ -528,6 +527,7 @@ static int sdl_font_draw(lua_State *L) int g = luaL_checknumber(L, 5); int b = luaL_checknumber(L, 6); int h = TTF_FontLineSkip(*f); + SDL_Color color = {r,g,b}; int space_w = 0, space_h = 0; TTF_SizeUTF8(*f, " ", &space_w, &space_h); @@ -538,17 +538,9 @@ static int sdl_font_draw(lua_State *L) #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif - SDL_Surface *s = SDL_CreateRGBSurface( - SDL_SWSURFACE | SDL_SRCALPHA, - max_width, - h, - 32, - rmask, gmask, bmask, amask - ); + SDL_Surface *s = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, max_width, h, 32, rmask, gmask, bmask, amask); SDL_FillRect(s, NULL, SDL_MapRGBA(s->format, 0, 0, 0, 0)); - SDL_Color color = {r,g,b}; - lua_newtable(L); int nb_lines = 1; @@ -568,7 +560,8 @@ static int sdl_font_draw(lua_State *L) char old = *next; *next = '\0'; if (txt) SDL_FreeSurface(txt); - txt = TTF_RenderUTF8_Blended(*f, start, color); + if (no_text_aa) txt = TTF_RenderUTF8_Solid(*f, start, color); + else txt = TTF_RenderUTF8_Blended(*f, start, color); // If we must do a newline, flush the previous word and the start the new line if (force_nl || (txt && (size + txt->w + space_w > max_width))) @@ -688,7 +681,7 @@ static int sdl_font_draw(lua_State *L) color.g = gh; color.b = bh; } - lua_pop(L, 1); + lua_pop(L, 2); } char old = *codestop; @@ -705,6 +698,7 @@ static int sdl_font_draw(lua_State *L) } font_make_texture_line(L, s, nb_lines); + if (size > max_size) max_size = size; if (txt) SDL_FreeSurface(txt); SDL_FreeSurface(s);