From 0a3991aeb6da32676897f57ef624eb54026a3895 Mon Sep 17 00:00:00 2001
From: Alexander Sedov <alex0player@gmail.com>
Date: Sat, 24 Jan 2015 02:26:19 +0300
Subject: [PATCH] Loads of easy changes #1

---
 game/engines/default/engine/ui/Base.lua     |  1 +
 game/engines/default/engine/ui/Button.lua   | 12 ++++----
 game/engines/default/engine/ui/Checkbox.lua | 22 +++++++-------
 game/engines/default/engine/ui/Dialog.lua   | 14 +++------
 game/engines/default/engine/ui/Textbox.lua  | 33 ++++++++-------------
 5 files changed, 33 insertions(+), 49 deletions(-)

diff --git a/game/engines/default/engine/ui/Base.lua b/game/engines/default/engine/ui/Base.lua
index 8d03d9ebb1..d2e85dcb4d 100644
--- a/game/engines/default/engine/ui/Base.lua
+++ b/game/engines/default/engine/ui/Base.lua
@@ -122,6 +122,7 @@ end
 function _M:drawFontLine(font, text, width) -- always draw with white, outputting texture can have it changed
 	local cached = table.getTable(fcache, font, font:getStyle())
 	if cached[text] then return cached[text] end
+	width = width or font:size(text)
 	local tex = font:draw(text, width, 255, 255, 255, true)[1]
 	local r = {t = tex._tex, w=tex.w, h=tex.h, tw=tex._tex_w, th=tex._tex_h}
 	cached[text] = r
diff --git a/game/engines/default/engine/ui/Button.lua b/game/engines/default/engine/ui/Button.lua
index 11b7daa687..a2a66debb8 100644
--- a/game/engines/default/engine/ui/Button.lua
+++ b/game/engines/default/engine/ui/Button.lua
@@ -52,9 +52,7 @@ function _M:generate()
 	if self.force_w then w = self.force_w end
 	self.w, self.h = w - frame_ox1 + frame_ox2, h - frame_oy1 + frame_oy2
 
-	local s = core.display.newSurface(w, h)
-	s:drawColorStringBlended(self.font, self.text, 0, 0, 255, 255, 255, true)
-	self.tex = {s:glTexture()}
+	self.tex = self:drawFontLine(self.font, self.text, w)
 	self.font:setStyle("normal")
 
 	-- Add UI controls
@@ -94,8 +92,8 @@ function _M:display(x, y, nb_keyframes, ox, oy)
 		else
 			self:drawFrame(self.frame_sel, x, y)
 		end
-		if self.text_shadow then self.tex[1]:toScreenFull(x-frame_ox1+1, y-frame_oy1+1, self.rw, self.rh, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end
-		self.tex[1]:toScreenFull(x-frame_ox1, y-frame_oy1, self.rw, self.rh, self.tex[2], self.tex[3])
+		if self.text_shadow then self:textureToScreen(self.tex, x-frame_ox1+1, y-frame_oy1+1, 0, 0, 0, self.text_shadow) end
+		self:textureToScreen(self.tex, x-frame_ox1, y-frame_oy1)
 	else
 		if self.glow then
 			local v = self.glow + (1 - self.glow) * (1 + math.cos(core.game.getTime() / 300)) / 2
@@ -109,7 +107,7 @@ function _M:display(x, y, nb_keyframes, ox, oy)
 			self.focus_decay = self.focus_decay - nb_keyframes
 			if self.focus_decay <= 0 then self.focus_decay = nil end
 		end
-		if self.text_shadow then self.tex[1]:toScreenFull(x-frame_ox1+1, y-frame_oy1+1, self.rw, self.rh, self.tex[2], self.tex[3], 0, 0, 0, self.alpha_unfocus * self.text_shadow) end
-		self.tex[1]:toScreenFull(x-frame_ox1, y-frame_oy1, self.rw, self.rh, self.tex[2], self.tex[3], 1, 1, 1, self.alpha_unfocus)
+		if self.text_shadow then self:textureToScreen(self.tex, x-frame_ox1+1, y-frame_oy1+1, 0, 0, 0, self.alpha_unfocus * self.text_shadow) end
+		self:textureToScreen(self.tex, x-frame_ox1, y-frame_oy1, 1, 1, 1, self.alpha_unfocus)
 	end
 end
diff --git a/game/engines/default/engine/ui/Checkbox.lua b/game/engines/default/engine/ui/Checkbox.lua
index ea27fe5a60..8efcf1e938 100644
--- a/game/engines/default/engine/ui/Checkbox.lua
+++ b/game/engines/default/engine/ui/Checkbox.lua
@@ -43,12 +43,10 @@ function _M:generate()
 	self.tick = self:getUITexture("ui/checkbox-ok.png")
 
 	-- Draw UI
-	self.title_w, self.title_h = self.font:size(self.title)
-	self.w, self.h = self.title_w + self.check.w, math.max(self.font_h, self.check.h)
+	self.tex = self:drawFontLine(self.font, self.title)
+	self.w, self.h = self.tex.w + self.check.w, math.max(self.font_h, self.check.h)
+
 
-	local s = core.display.newSurface(self.title_w, self.title_h)
-	s:drawColorStringBlended(self.font, self.title, 0, 0, 255, 255, 255, true)
-	self.tex = {s:glTexture()}
 
 	-- Add UI controls
 	self.mouse:registerZone(0, 0, self.w, self.h, function(button, x, y, xrel, yrel, bx, by, event)
@@ -70,8 +68,8 @@ end
 
 function _M:display(x, y, nb_keyframes)
 	if self.check_first then
-		if self.text_shadow then self.tex[1]:toScreenFull(x+1 + self.check.w, y+1 + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end
-		self.tex[1]:toScreenFull(x + self.check.w, y + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3])
+		if self.text_shadow then self:textureToScreen(self.tex, x+1 + self.check.w, y+1 + (self.h - self.tex.h) / 2, 0, 0, 0, self.text_shadow) end
+		self:textureToScreen(self.tex, x + self.check.w, y + (self.h - self.tex.h) / 2)
 		if self.focused then
 			self.check.t:toScreenFull(x, y, self.check.w, self.check.h, self.check.tw, self.check.th)
 		else
@@ -81,15 +79,15 @@ function _M:display(x, y, nb_keyframes)
 			self.tick.t:toScreenFull(x, y, self.tick.w, self.tick.h, self.tick.tw, self.tick.th)
 		end
 	else
-		if self.text_shadow then self.tex[1]:toScreenFull(x+1, y+1 + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end
-		self.tex[1]:toScreenFull(x, y + (self.h - self.title_h) / 2, self.title_w, self.title_h, self.tex[2], self.tex[3])
+		if self.text_shadow then self.tex[1]:toScreenFull(x+1, y+1 + (self.h - self.tex.h) / 2, self.tex.w, self.tex.h, self.tex[2], self.tex[3], 0, 0, 0, self.text_shadow) end
+		self.tex[1]:toScreenFull(x, y + (self.h - self.tex.h) / 2, self.tex.w, self.tex.h, self.tex[2], self.tex[3])
 		if self.focused then
-			self.check.t:toScreenFull(x + self.title_w, y, self.check.w, self.check.h, self.check.tw, self.check.th)
+			self.check.t:toScreenFull(x + self.tex.w, y, self.check.w, self.check.h, self.check.tw, self.check.th)
 		else
-			self.check.t:toScreenFull(x + self.title_w, y, self.check.w, self.check.h, self.check.tw, self.check.th)
+			self.check.t:toScreenFull(x + self.tex.w, y, self.check.w, self.check.h, self.check.tw, self.check.th)
 		end
 		if self.checked then
-			self.tick.t:toScreenFull(x + self.title_w, y, self.tick.w, self.tick.h, self.tick.tw, self.tick.th)
+			self.tick.t:toScreenFull(x + self.tex.w, y, self.tick.w, self.tick.h, self.tick.tw, self.tick.th)
 		end
 	end
 end
diff --git a/game/engines/default/engine/ui/Dialog.lua b/game/engines/default/engine/ui/Dialog.lua
index a72ef1974d..9362e9f991 100644
--- a/game/engines/default/engine/ui/Dialog.lua
+++ b/game/engines/default/engine/ui/Dialog.lua
@@ -356,14 +356,8 @@ function _M:updateTitle(title)
 	local title = title
 	if type(title)=="function" then title = title() end
 	self.font_bold:setStyle("bold")
-	local tw, th = self.font_bold:size(title)
-	local s = core.display.newSurface(tw, th)
-	s:erase(0, 0, 0, 0)
-	s:drawColorStringBlended(self.font_bold, title, 0, 0, self.color.r, self.color.g, self.color.b, true)
+	self.title_tex = self:drawFontLine(self.font_bold, title)
 	self.font_bold:setStyle("normal")
-	self.title_tex = {s:glTexture()}
-	self.title_tex.w = tw
-	self.title_tex.h = th
 end
 
 function _M:loadUI(t)
@@ -743,12 +737,12 @@ function _M:toScreen(x, y, nb_keyframes)
 			if shader then
 				shader:use(true)
 				shader:uniOutlineSize(self.shadow_power, self.shadow_power)
-				shader:uniTextSize(self.title_tex[2], self.title_tex[3])
+				shader:uniTextSize(self.title_tex.tw, self.title_tex.th)
 			else
-				self.title_tex[1]:toScreenFull(x + (self.w - self.title_tex.w) / 2 + 3 + self.frame.title_x, y + 3 + self.frame.title_y, self.title_tex.w, self.title_tex.h, self.title_tex[2], self.title_tex[3], 0, 0, 0, 0.5)
+				self:textureToScreen(self.title_tex, x + (self.w - self.title_tex.w) / 2 + 3 + self.frame.title_x, y + 3 + self.frame.title_y, 0, 0, 0, 0.5)
 			end
 		end
-		self.title_tex[1]:toScreenFull(x + (self.w - self.title_tex.w) / 2 + self.frame.title_x, y + self.frame.title_y, self.title_tex.w, self.title_tex.h, self.title_tex[2], self.title_tex[3])
+		self:textureToScreen(self.title_tex, x + (self.w - self.title_tex.w) / 2 + self.frame.title_x, y + self.frame.title_y)
 		if self.title_shadow and shader then shader:use(false) end
 	end
 
diff --git a/game/engines/default/engine/ui/Textbox.lua b/game/engines/default/engine/ui/Textbox.lua
index b7fcd09482..0619aff6c6 100644
--- a/game/engines/default/engine/ui/Textbox.lua
+++ b/game/engines/default/engine/ui/Textbox.lua
@@ -71,15 +71,10 @@ function _M:generate()
 	self.text_y = (h - fh) / 2
 	self.cursor_y = (h - self.texcursor.h) / 2
 	self.max_display = math.floor(fw / self.font_mono_w)
-	self.text_surf = core.display.newSurface(fw, fh)
-	self.text_tex, self.text_tex_w, self.text_tex_h = self.text_surf:glTexture()
 	self:updateText()
 
 	if title_w > 0 then
-		local s = core.display.newSurface(title_w, h)
-		s:erase(0, 0, 0, 0)
-		s:drawColorStringBlended(self.font, self.title, 0, (h - fh) / 2, 255, 255, 255, true)
-		self.tex, self.tex_w, self.tex_h = s:glTexture()
+		self.tex = self:drawFontLine(self.font, self.title, title_w)
 	end
 
 	-- Add UI controls
@@ -162,28 +157,26 @@ end
 function _M:updateText()
 	if not self.tmp[1] then self.tmp = {} end
 	self.text = table.concat(self.tmp)
-	local text = ""
-	for i = self.scroll, self.scroll + self.max_display - 1 do
-		if not self.tmp[i] then break end
-		if not self.hide then text = text .. self.tmp[i]
-		else text = text .. "*" end
-	end
+	local text
+	local b, e = self.scroll, math.min(self.scroll + self.max_display - 1, #self.tmp)
+	if not self.hide then text = table.concat(self.tmp, nil, b, e)
+	else text = string.rep("*", e - b + 1) end
+
+	self.text_tex = self:drawFontLine(self.font_mono, text, self.fw)
 
-	self.text_surf:erase(0, 0, 0, 0)
-	self.text_surf:drawStringBlended(self.font_mono, text, 0, 0, 255, 255, 255, true)
-	self.text_surf:updateTexture(self.text_tex)
 	if self.on_change and self.old_text ~= self.text then self.on_change(self.text) end
 	self.old_text = self.text
 end
 
 function _M:display(x, y, nb_keyframes)
+	local text_x, text_y = self.text_x, self.text_y
 	if self.tex then
-		if self.text_shadow then self.tex:toScreenFull(x+1, y+1, self.title_w, self.h, self.tex_w, self.tex_h, 0, 0, 0, self.text_shadow) end
-		self.tex:toScreenFull(x, y, self.title_w, self.h, self.tex_w, self.tex_h)
+		if self.text_shadow then self:textureToScreen(self.tex, x+1, y+text_y+1, 0, 0, 0, self.text_shadow) end
+		self:textureToScreen(self.tex, x, y+text_y)
 	end
 	if self.focused then
 		self:drawFrame(self.frame_sel, x + self.title_w, y)
-		self.texcursor.t:toScreenFull(x + self.text_x + (self.cursor-self.scroll) * self.font_mono_w - (self.texcursor.w / 2), y + self.cursor_y, self.texcursor.w, self.texcursor.h, self.texcursor.tw, self.texcursor.th)
+		self:textureToScreen(self.texcursor, x + self.text_x + (self.cursor-self.scroll) * self.font_mono_w - (self.texcursor.w / 2), y + self.cursor_y)
 	else
 		self:drawFrame(self.frame, x + self.title_w, y)
 		if self.focus_decay then
@@ -192,6 +185,6 @@ function _M:display(x, y, nb_keyframes)
 			if self.focus_decay <= 0 then self.focus_decay = nil end
 		end
 	end
-	if self.text_shadow then self.text_tex:toScreenFull(x+1 + self.text_x, y+1 + self.text_y, self.fw, self.fh, self.text_tex_w, self.text_tex_h, 0, 0, 0, self.text_shadow) end
-	self.text_tex:toScreenFull(x + self.text_x, y + self.text_y, self.fw, self.fh, self.text_tex_w, self.text_tex_h)
+	if self.text_shadow then self:textureToScreen(self.text_tex, x+1 + self.text_x, y+1 + self.text_y, 0, 0, 0, self.text_shadow) end
+	self:textureToScreen(self.text_tex, x+1 + self.text_x, y+1 + self.text_y)
 end
-- 
GitLab