From c278d997ff1fd1c5e4a7188df53c39cdd3c01cd8 Mon Sep 17 00:00:00 2001 From: Alessandro Proto Date: Sat, 28 Jan 2023 23:13:12 +0100 Subject: [PATCH] Add term.blit --- Capy64/Runtime/Libraries/Term.cs | 56 +++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/Capy64/Runtime/Libraries/Term.cs b/Capy64/Runtime/Libraries/Term.cs index 974fe89..cc67bfc 100644 --- a/Capy64/Runtime/Libraries/Term.cs +++ b/Capy64/Runtime/Libraries/Term.cs @@ -139,6 +139,11 @@ internal class Term : IPlugin name = "setBlink", function = L_SetBlink, }, + new() + { + name = "blit", + function = L_Blit, + }, new(), }; @@ -281,7 +286,7 @@ internal class Term : IPlugin { var L = Lua.FromIntPtr(state); string str = ""; - if(!L.IsNone(1)) + if (!L.IsNone(1)) str = L.ToString(1); Write(str); @@ -561,4 +566,53 @@ internal class Term : IPlugin return 0; } + + private static int L_Blit(IntPtr state) + { + var L = Lua.FromIntPtr(state); + + var text = L.CheckString(1); + L.CheckType(2, LuaType.Table); + L.CheckType(3, LuaType.Table); + + var len = L.Length(1); + L.ArgumentCheck(L.Length(2) == len, 2, "length does not match"); + L.ArgumentCheck(L.Length(3) == len, 3, "length does not match"); + + var fg = new Color[len]; + var bg = new Color[len]; + + L.PushCopy(2); + for (int i = 1; i <= len; i++) + { + L.GetInteger(-1, i); + var v = L.CheckInteger(-1); + L.Pop(1); + + UnpackRGB((uint)v, out var r, out var g, out var b); + fg[i - 1] = new Color(r, g, b); + } + L.Pop(1); + + L.PushCopy(3); + for (int i = 1; i <= len; i++) + { + L.GetInteger(-1, i); + var v = L.CheckInteger(-1); + L.Pop(1); + + UnpackRGB((uint)v, out var r, out var g, out var b); + bg[i - 1] = new Color(r, g, b); + } + L.Pop(1); + + for (int i = 0; i < len; i++) + { + ForegroundColor = fg[i]; + BackgroundColor = bg[i]; + Write(text[i].ToString()); + } + + return 0; + } }