More code cleanups
[lsnes.git] / framebuffer.cpp
blobf4b46fa083094360b5297919f383414b3823c823
1 #include "framebuffer.hpp"
2 #include "lua.hpp"
3 #include "render.hpp"
5 lcscreen framebuffer;
6 lcscreen screen_nosignal;
7 lcscreen screen_corrupt;
8 extern uint32_t fontdata[];
10 namespace
12 struct render_list_entry
14 uint32_t codepoint;
15 uint32_t x;
16 uint32_t y;
17 uint32_t scale;
20 struct render_list_entry rl_nosignal[] = {
21 {'N', 4, 168, 7},
22 {'O', 60, 168, 7},
23 {'S', 172, 168, 7},
24 {'I', 228, 168, 7},
25 {'G', 284, 168, 7},
26 {'N', 340, 168, 7},
27 {'A', 396, 168, 7},
28 {'L', 452, 168, 7},
29 {0, 0, 0, 0}
32 struct render_list_entry rl_corrupt[] = {
33 {'S', 88, 56, 7},
34 {'Y', 144, 56, 7},
35 {'S', 200, 56, 7},
36 {'T', 256, 56, 7},
37 {'E', 312, 56, 7},
38 {'M', 368, 56, 7},
39 {'S', 116, 168, 7},
40 {'T', 172, 168, 7},
41 {'A', 224, 168, 7},
42 {'T', 280, 168, 7},
43 {'E', 336, 168, 7},
44 {'C', 60, 280, 7},
45 {'O', 116, 280, 7},
46 {'R', 172, 280, 7},
47 {'R', 228, 280, 7},
48 {'U', 284, 280, 7},
49 {'P', 340, 280, 7},
50 {'T', 396, 280, 7},
51 {0, 0, 0, 0}
54 void draw_special_screen(uint16_t* target, struct render_list_entry* rlist)
56 while(rlist->scale) {
57 int32_t x;
58 int32_t y;
59 auto g = find_glyph(rlist->codepoint, 0, 0, 0, x, y);
60 for(uint32_t j = 0; j < 16; j++) {
61 for(uint32_t i = 0; i < 8; i++) {
62 uint32_t slice = g.second + j / 4;
63 uint32_t bit = 31 - ((j % 4) * 8 + i);
64 uint32_t value = (fontdata[slice] >> bit) & 1;
65 if(value) {
66 uint32_t basex = rlist->x + rlist->scale * i;
67 uint32_t basey = rlist->y + rlist->scale * j;
68 for(uint32_t j2 = 0; j2 < rlist->scale; j2++)
69 for(uint32_t i2 = 0; i2 < rlist->scale; i2++)
70 target[(basey + j2) * 512 + (basex + i2)] = 0x7FFF;
74 rlist++;
78 void draw_nosignal(uint16_t* target)
80 for(unsigned i = 0; i < 512 * 448; i++)
81 target[i] = 0x1F;
82 draw_special_screen(target, rl_nosignal);
85 void draw_corrupt(uint16_t* target)
87 for(unsigned i = 0; i < 512 * 448; i++)
88 target[i] = 0x1F;
89 draw_special_screen(target, rl_corrupt);
93 screen main_screen;
96 void init_special_screens() throw(std::bad_alloc)
98 uint16_t buf[512*448];
99 draw_nosignal(buf);
100 screen_nosignal = lcscreen(buf, 512, 448);
101 draw_corrupt(buf);
102 screen_corrupt = lcscreen(buf, 512, 448);
105 void redraw_framebuffer(window* win)
107 uint32_t hscl = 1, vscl = 1;
108 if(framebuffer.width < 512)
109 hscl = 2;
110 if(framebuffer.height < 400)
111 vscl = 2;
112 render_queue rq;
113 struct lua_render_context lrc;
114 lrc.left_gap = 0;
115 lrc.right_gap = 0;
116 lrc.bottom_gap = 0;
117 lrc.top_gap = 0;
118 lrc.queue = &rq;
119 lrc.width = framebuffer.width * hscl;
120 lrc.height = framebuffer.height * vscl;
121 lrc.rshift = main_screen.active_rshift;
122 lrc.gshift = main_screen.active_gshift;
123 lrc.bshift = main_screen.active_bshift;
124 lua_callback_do_paint(&lrc);
125 main_screen.reallocate(framebuffer.width * hscl + lrc.left_gap + lrc.right_gap, framebuffer.height * vscl +
126 lrc.top_gap + lrc.bottom_gap, lrc.left_gap, lrc.top_gap);
127 main_screen.copy_from(framebuffer, hscl, vscl);
128 //We would want divide by 2, but we'll do it ourselves in order to do mouse.
129 win->set_window_compensation(lrc.left_gap, lrc.top_gap, 1, 1);
130 rq.run(main_screen);
131 win->notify_screen_update();