mirror of
https://github.com/zenith391/OCEmu.git
synced 2025-09-30 08:35:26 -04:00
Higher success
Check for and clamp to NUL in the unicode api math.floor depth when changing screen depth Fix getForeground and getBackground to return the palette index when using a palette, which is still not really correct but will mostly work for depth 8 Have palette changes recolor the screen
This commit is contained in:
parent
dd2daa2554
commit
c4475849ff
@ -2,11 +2,11 @@ local env = ...
|
|||||||
|
|
||||||
local utf8 = require("utf8")
|
local utf8 = require("utf8")
|
||||||
|
|
||||||
env.unicode = {
|
local function cln(str)
|
||||||
len = utf8.len,
|
return str:gsub("%z.*","") .. ""
|
||||||
reverse = utf8.reverse,
|
end
|
||||||
sub = utf8.sub,
|
|
||||||
}
|
env.unicode = {}
|
||||||
|
|
||||||
function env.unicode.char(...)
|
function env.unicode.char(...)
|
||||||
cprint("unicode.char", ...)
|
cprint("unicode.char", ...)
|
||||||
@ -21,17 +21,41 @@ function env.unicode.lower(str)
|
|||||||
cprint("unicode.lower", str)
|
cprint("unicode.lower", str)
|
||||||
if type(str) == "number" then str = tostring(str) end
|
if type(str) == "number" then str = tostring(str) end
|
||||||
checkArg(1,str,"string")
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
return utf8.lower(str)
|
return utf8.lower(str)
|
||||||
end
|
end
|
||||||
function env.unicode.upper(str)
|
function env.unicode.upper(str)
|
||||||
cprint("unicode.upper", str)
|
cprint("unicode.upper", str)
|
||||||
if type(str) == "number" then str = tostring(str) end
|
if type(str) == "number" then str = tostring(str) end
|
||||||
checkArg(1,str,"string")
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
return utf8.upper(str)
|
return utf8.upper(str)
|
||||||
end
|
end
|
||||||
|
function env.unicode.len(str)
|
||||||
|
cprint("unicode.len", str)
|
||||||
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
|
return utf8.len(str)
|
||||||
|
end
|
||||||
|
function env.unicode.reverse(str)
|
||||||
|
cprint("unicode.reverse", str)
|
||||||
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
|
return utf8.reverse(str)
|
||||||
|
end
|
||||||
|
function env.unicode.sub(str, i, j)
|
||||||
|
cprint("unicode.isWide", str)
|
||||||
|
checkArg(1,str,"string")
|
||||||
|
checkArg(2,i,"number")
|
||||||
|
if j == nil then j = -1 end
|
||||||
|
checkArg(3,j,"number")
|
||||||
|
str=cln(str)
|
||||||
|
return utf8.sub(str,i,j)
|
||||||
|
end
|
||||||
function env.unicode.isWide(str)
|
function env.unicode.isWide(str)
|
||||||
cprint("unicode.isWide", str)
|
cprint("unicode.isWide", str)
|
||||||
checkArg(1,str,"string")
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
if #str == 0 then
|
if #str == 0 then
|
||||||
error("String index out of range: 0",3)
|
error("String index out of range: 0",3)
|
||||||
end
|
end
|
||||||
@ -41,6 +65,7 @@ end
|
|||||||
function env.unicode.charWidth(str)
|
function env.unicode.charWidth(str)
|
||||||
cprint("unicode.charWidth", str)
|
cprint("unicode.charWidth", str)
|
||||||
checkArg(1,str,"string")
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
if #str == 0 then
|
if #str == 0 then
|
||||||
error("String index out of range: 0",3)
|
error("String index out of range: 0",3)
|
||||||
end
|
end
|
||||||
@ -50,6 +75,7 @@ end
|
|||||||
function env.unicode.wlen(str)
|
function env.unicode.wlen(str)
|
||||||
cprint("unicode.wlen", str)
|
cprint("unicode.wlen", str)
|
||||||
checkArg(1,str,"string")
|
checkArg(1,str,"string")
|
||||||
|
str=cln(str)
|
||||||
local length = 0
|
local length = 0
|
||||||
for _,c in utf8.next, str do
|
for _,c in utf8.next, str do
|
||||||
length = length + getCharWidth(c)
|
length = length + getCharWidth(c)
|
||||||
@ -60,6 +86,7 @@ function env.unicode.wtrunc(str, count)
|
|||||||
cprint("unicode.wtrunc", str, count)
|
cprint("unicode.wtrunc", str, count)
|
||||||
checkArg(1,str,"string")
|
checkArg(1,str,"string")
|
||||||
checkArg(2,count,"number")
|
checkArg(2,count,"number")
|
||||||
|
str=cln(str)
|
||||||
if count == math.huge then
|
if count == math.huge then
|
||||||
count = 0
|
count = 0
|
||||||
end
|
end
|
||||||
|
@ -79,6 +79,7 @@ function obj.setDepth(depth) -- Set the color depth. Returns the previous value.
|
|||||||
if bindaddress == nil then
|
if bindaddress == nil then
|
||||||
return nil, "no screen"
|
return nil, "no screen"
|
||||||
end
|
end
|
||||||
|
depth = math.floor(depth)
|
||||||
local scrmax = component.cecinvoke(bindaddress, "maxDepth")
|
local scrmax = component.cecinvoke(bindaddress, "maxDepth")
|
||||||
if rdepthTbl[depth] == nil or rdepthTbl[depth] > math.max(scrmax, maxtier) then
|
if rdepthTbl[depth] == nil or rdepthTbl[depth] > math.max(scrmax, maxtier) then
|
||||||
error("unsupported depth",3)
|
error("unsupported depth",3)
|
||||||
|
@ -313,8 +313,12 @@ end
|
|||||||
|
|
||||||
local cec = {}
|
local cec = {}
|
||||||
|
|
||||||
|
-- TODO: For (get/set)(Fore/Back)ground, they return what was passed in, rather than the current screen state
|
||||||
function cec.getForeground() -- Get the current foreground color and whether it's from the palette or not.
|
function cec.getForeground() -- Get the current foreground color and whether it's from the palette or not.
|
||||||
cprint("(cec) screen.getForeground")
|
cprint("(cec) screen.getForeground")
|
||||||
|
if scrfgp then
|
||||||
|
return scrfgp, true
|
||||||
|
end
|
||||||
return scrrfc, scrfgp
|
return scrrfc, scrfgp
|
||||||
end
|
end
|
||||||
function cec.setForeground(value, palette) -- Sets the foreground color to the specified value. Optionally takes an explicit palette index. Returns the old value and if it was from the palette its palette index.
|
function cec.setForeground(value, palette) -- Sets the foreground color to the specified value. Optionally takes an explicit palette index. Returns the old value and if it was from the palette its palette index.
|
||||||
@ -327,6 +331,9 @@ function cec.setForeground(value, palette) -- Sets the foreground color to the s
|
|||||||
end
|
end
|
||||||
function cec.getBackground() -- Get the current background color and whether it's from the palette or not.
|
function cec.getBackground() -- Get the current background color and whether it's from the palette or not.
|
||||||
cprint("(cec) screen.getBackground")
|
cprint("(cec) screen.getBackground")
|
||||||
|
if scrbgp then
|
||||||
|
return scrbgp, true
|
||||||
|
end
|
||||||
return scrrbc, scrbgp
|
return scrrbc, scrbgp
|
||||||
end
|
end
|
||||||
function cec.setBackground(value, palette) -- Sets the background color to the specified value. Optionally takes an explicit palette index. Returns the old value and if it was from the palette its palette index.
|
function cec.setBackground(value, palette) -- Sets the background color to the specified value. Optionally takes an explicit palette index. Returns the old value and if it was from the palette its palette index.
|
||||||
@ -404,7 +411,19 @@ function cec.setPaletteColor(index, color) -- Set the palette color at the speci
|
|||||||
if scrbgp == index then
|
if scrbgp == index then
|
||||||
scrrbc, scrbgc = color, color
|
scrrbc, scrbgc = color, color
|
||||||
end
|
end
|
||||||
-- TODO: Palette changes recolor the screen for respective characters
|
for y = 1,height do
|
||||||
|
for x = 1,width do
|
||||||
|
if screen.fgp[y][x] == index or screen.bgp[y][x] == index then
|
||||||
|
if screen.fgp[y][x] == index then
|
||||||
|
screen.fg[y][x] = color
|
||||||
|
end
|
||||||
|
if screen.bgp[y][x] == index then
|
||||||
|
screen.bg[y][x] = color
|
||||||
|
end
|
||||||
|
renderChar(utf8.byte(screen.txt[y][x]),(x-1)*8,(y-1)*16,screen.fg[y][x],screen.bg[y][x])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
return old
|
return old
|
||||||
end
|
end
|
||||||
function cec.get(x, y) -- Get the value displayed on the screen at the specified index, as well as the foreground and background color. If the foreground or background is from the palette, returns the palette indices as fourth and fifth results, else nil, respectively.
|
function cec.get(x, y) -- Get the value displayed on the screen at the specified index, as well as the foreground and background color. If the foreground or background is from the palette, returns the palette indices as fourth and fifth results, else nil, respectively.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user