forked from mtcontrib/signs_lib
		
	Fix out-of-bounds textures in [combine (#27)
				
					
				
			This commit is contained in:
		
							
								
								
									
										24
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								api.lua
									
									
									
									
									
								
							| @@ -467,10 +467,11 @@ signs_lib.charwidth_wide32 = build_char_db(32) | ||||
|  | ||||
| local math_max = math.max | ||||
|  | ||||
| local function fill_line(x, y, w, c, font_size, colorbgw) | ||||
| local function fill_line(x, y, w, c, font_size, colorbgw, line_width) | ||||
| 	c = c or "0" | ||||
| 	local tex = { } | ||||
| 	for xx = 0, math.max(0, w), colorbgw do | ||||
| 	for xx = 0, w, colorbgw do | ||||
| 		if x + xx > line_width then break end | ||||
| 		table.insert(tex, (":%d,%d=signs_lib_color_"..font_size.."px_%s.png"):format(x + xx, y, c)) | ||||
| 	end | ||||
| 	return table.concat(tex) | ||||
| @@ -583,9 +584,10 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi | ||||
| 					end | ||||
| 				end | ||||
| 				if w then | ||||
| 					width = width + w + 1 | ||||
| 					width = width + w | ||||
| 					if width >= (line_width - cwidth_tab[" "]) then | ||||
| 						width = 0 | ||||
| 						break | ||||
| 					else | ||||
| 						maxw = math_max(width, maxw) | ||||
| 					end | ||||
| @@ -615,9 +617,10 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi | ||||
| 			else | ||||
| 				local w = cwidth_tab[c] | ||||
| 				if w then | ||||
| 					width = width + w + 1 | ||||
| 					width = width + w | ||||
| 					if width >= (line_width - cwidth_tab[" "]) then | ||||
| 						width = 0 | ||||
| 						break | ||||
| 					else | ||||
| 						maxw = math_max(width, maxw) | ||||
| 					end | ||||
| @@ -633,7 +636,7 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi | ||||
| 			end | ||||
| 			i = i + 1 | ||||
| 		end | ||||
| 		width = width + cwidth_tab[" "] + 1 | ||||
| 		width = width + cwidth_tab[" "] | ||||
| 		maxw = math_max(width, maxw) | ||||
| 		table.insert(words, { chars=chars, w=ch_offs }) | ||||
| 	end | ||||
| @@ -652,17 +655,16 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi | ||||
| 	for word_i, word in ipairs(words) do | ||||
| 		local xoffs = (xpos - start_xpos) | ||||
| 		if (xoffs > 0) and ((xoffs + word.w) > maxw) then | ||||
| 			table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) | ||||
| 			xpos = start_xpos | ||||
| 			ypos = ypos + line_height + def.line_spacing | ||||
| 			lineno = lineno + 1 | ||||
| 			if lineno >= def.number_of_lines then break end | ||||
| 			table.insert(texture, fill_line(xpos, ypos, maxw, cur_color, font_size, colorbgw)) | ||||
| 			table.insert(texture, fill_line(xpos, ypos, maxw, cur_color, font_size, colorbgw, line_width)) | ||||
| 		end | ||||
| 		for ch_i, ch in ipairs(word.chars) do | ||||
| 			if ch.col ~= cur_color then | ||||
| 				cur_color = ch.col | ||||
| 				table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color, font_size, colorbgw)) | ||||
| 				table.insert(texture, fill_line(xpos + ch.off, ypos, maxw, cur_color, font_size, colorbgw, line_width)) | ||||
| 			end | ||||
| 			table.insert(texture, (":%d,%d=%s"):format(xpos + ch.off, ypos, ch.tex)) | ||||
| 		end | ||||
| @@ -671,11 +673,9 @@ local function make_line_texture(line, lineno, pos, line_width, line_height, cwi | ||||
| 			(":%d,%d="):format(xpos + word.w, ypos) .. char_tex(font_name, " ") | ||||
| 		) | ||||
| 		xpos = xpos + word.w + cwidth_tab[" "] | ||||
| 		if xpos >= (line_width + cwidth_tab[" "]) then break end | ||||
| 	end | ||||
|  | ||||
| 	table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw)) | ||||
| 	table.insert(texture, fill_line(start_xpos, ypos + line_height, maxw, "n", font_size, colorbgw)) | ||||
| 	table.insert(texture, fill_line(xpos, ypos, maxw, "n", font_size, colorbgw, line_width)) | ||||
| 	table.insert(texture, fill_line(start_xpos, ypos + line_height, maxw, "n", font_size, colorbgw, line_width)) | ||||
|  | ||||
| 	return table.concat(texture), lineno | ||||
| end | ||||
|   | ||||
		Reference in New Issue
	
	Block a user