Lua: Convert some functions to static-only classes
[lsnes.git] / src / lua / sysrc.lua
blob32cae47c92e923ae8f1a56a7539d039597e90c68
1 loopwrapper = function(fn, ...)
2 local routine = coroutine.create(fn);
3 local resume = function(...)
4 if coroutine.status(routine) ~= "dead" then
5 local x, y;
6 x, y = coroutine.resume(routine, ...);
7 if not x then
8 error(y);
9 end
10 end
11 end
12 local yield = function()
13 return coroutine.yield(routine);
14 end
15 resume(yield, ...);
16 return resume;
17 end;
18 print=print2;
19 loadfile=loadfile2;
20 dofile=dofile2;
21 render_queue_function=function(rq)
22 local _rq = rq;
23 return function()
24 _rq:run();
25 end;
26 end;
27 string.byteU=_lsnes_string_byteU;
28 string.charU=_lsnes_string_charU;
30 local _lookup_class = lookup_class;
31 local _all_classes = all_classes;
32 local classes_meta = {
33 ["__newindex"] = function() error("Classes table is not writable"); end,
34 ["__index"] = function(a, b) return _lookup_class(b); end
36 classes = {};
37 setmetatable(classes, classes_meta);
39 local register_in = function(table, class)
40 local methods = {classes[class]._static_methods()};
41 local utable;
42 if table then
43 _G[table] = _G[table] or {};
44 utable = _G[table];
45 else
46 utable = _G;
47 end
48 local i;
49 for i=1,#methods do
50 local m = methods[i];
51 utable[m] = classes[class][m];
52 end
53 end
55 --Register all classes that have special names at top level.
56 local classes_list = {_all_classes()};
57 local idx;
58 for idx=1,#classes_list do
59 local c = classes_list[idx];
60 if string.byte(c) == 42 then
61 _G[string.sub(c, 2)] = classes[c];
62 end
63 end
65 -- Classes
66 memory.mmap = classes.MMAP_STRUCT;
67 zip.writer = classes.ZIPWRITER;
68 gui.tiled_bitmap = classes.TILEMAP;
69 gui.renderctx = classes.RENDERCTX;
70 gui.palette = classes.PALETTE;
71 gui.bitmap = classes.BITMAP;
72 gui.dbitmap = classes.DBITMAP;
73 gui.image = classes.IMAGELOADER;
74 gui.font = classes.CUSTOMFONT;
75 iconv = classes.ICONV;
76 filereader = classes.FILEREADER;
78 -- Some ctors
79 memory2=classes.VMALIST.new();
80 callback=classes.CALLBACKS_LIST.new();
81 memory.map_structure=classes.MMAP_STRUCT.new;
82 zip.create=classes.ZIPWRITER.new;
83 gui.tilemap=classes.TILEMAP.new;
84 gui.renderq_new=classes.RENDERCTX.new;
85 gui.palette_new=classes.PALETTE.new;
86 gui.font_new = classes.CUSTOMFONT.new;
87 gui.loadfont = classes.CUSTOMFONT.load;
88 iconv_new = classes.ICONV.new;
89 create_ibind = classes.INVERSEBIND.new;
90 create_command = classes.COMMANDBIND.new;
91 open_file = classes.FILEREADER.open;
93 local do_arg_err = function(what, n, name)
94 error("Expected "..what.." as argument #"..n.." of "..name);
95 end
97 local normal_method = {}
99 local normal_method = function(class, method, name, parent)
100 if type(class) == "string" then
101 normal_method[name] = normal_method[name] or {};
102 normal_method[name][class] = method;
103 else
104 normal_method[name] = normal_method[name] or {};
105 local k, v;
106 for k, v in pairs(class) do
107 normal_method[name][v] = method;
110 parent[name] = function(o, ...)
111 local m = normal_method[name];
112 local c = identify_class(o);
113 if m[c] then
114 return o[m[c]](o, ...);
115 else
116 local what = "";
117 local k, v;
118 for k, v in pairs(m) do
119 if what ~= "" then
120 what = what .. " or " .. k;
121 else
122 what = k;
125 do_arg_err(what, 1, name);
130 gui.renderq_set=function(o, ...)
131 if type(o) == "nil" then
132 return classes.RENDERCTX.setnull();
133 elseif identify_class(o) == "RENDERCTX" then
134 return o:set(...);
135 else
136 do_arg_err("RENDERCTX or nil", 1, "gui.renderq_set");
140 normal_method("RENDERCTX", "run", "renderq_run", gui);
141 normal_method("RENDERCTX", "synchronous_repaint", "synchronous_repaint", gui);
142 normal_method("RENDERCTX", "clear", "renderq_clear", gui);
144 gui.bitmap_new=function(w, h, type, ...)
145 if type==true then
146 return classes.DBITMAP.new(w,h,...);
147 elseif type==false then
148 return classes.BITMAP.new(w,h,...);
149 else
150 do_arg_err("boolean", 3, "gui.bitmap_new");
154 gui.bitmap_draw=function(x, y, o, ...)
155 if identify_class(o) == "BITMAP" then
156 return o:draw(x, y, ...);
157 elseif identify_class(o) == "DBITMAP" then
158 return o:draw(x, y, ...);
159 else
160 do_arg_err("BITMAP or DBITMAP", 3, "gui.bitmap_draw");
164 gui.bitmap_save_png=function(...)
165 local x = {...};
166 local i = 1;
167 local j;
168 local obj;
169 for j=1,#x do
170 if type(x[j]) ~= "string" then
171 obj = table.remove(x, j);
172 i = j;
173 break;
176 if identify_class(obj) == "BITMAP" then
177 return obj:save_png(unpack(x));
178 elseif identify_class(obj) == "DBITMAP" then
179 return obj:save_png(unpack(x));
180 else
181 do_arg_err("BITMAP or DBITMAP", i, "gui.bitmap_save_png");
185 gui.bitmap_load=classes.IMAGELOADER.load;
186 gui.bitmap_load_str=classes.IMAGELOADER.load_str;
187 gui.bitmap_load_png=classes.IMAGELOADER.load_png;
188 gui.bitmap_load_png_str=classes.IMAGELOADER.load_png_str;
190 normal_method("PALETTE", "set", "palette_set", gui);
191 normal_method("PALETTE", "hash", "palette_hash", gui);
192 normal_method("PALETTE", "debug", "palette_debug", gui);
193 normal_method({"BITMAP", "DBITMAP"}, "pset", "bitmap_pset", gui);
194 normal_method({"BITMAP", "DBITMAP"}, "pget", "bitmap_pget", gui);
195 normal_method({"BITMAP", "DBITMAP"}, "size", "bitmap_size", gui);
196 normal_method({"BITMAP", "DBITMAP"}, "hash", "bitmap_hash", gui);
197 normal_method({"BITMAP", "DBITMAP"}, "blit", "bitmap_blit", gui);
198 normal_method({"BITMAP", "DBITMAP"}, "blit_scaled", "bitmap_blit_scaled", gui);
199 normal_method({"BITMAP", "DBITMAP"}, "blit_porterduff", "bitmap_blit_porterduff", gui);
200 normal_method({"BITMAP", "DBITMAP"}, "blit_scaled_porterduff", "bitmap_blit_scaled_porterduff", gui);
201 normal_method("BITMAP", "blit_priority", "bitmap_blit_priority", gui);
202 normal_method("BITMAP", "blit_scaled_priority", "bitmap_blit_scaled_priority", gui);
203 normal_method({"DBITMAP", "PALETTE"}, "adjust_transparency", "adjust_transparency", gui);