1 #include "framebuffer.hpp"
6 lcscreen screen_nosignal
;
7 lcscreen screen_corrupt
;
8 extern uint32_t fontdata
[];
12 struct render_list_entry
20 struct render_list_entry rl_nosignal
[] = {
32 struct render_list_entry rl_corrupt
[] = {
54 void draw_special_screen(uint16_t* target
, struct render_list_entry
* rlist
)
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;
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;
78 void draw_nosignal(uint16_t* target
)
80 for(unsigned i
= 0; i
< 512 * 448; i
++)
82 draw_special_screen(target
, rl_nosignal
);
85 void draw_corrupt(uint16_t* target
)
87 for(unsigned i
= 0; i
< 512 * 448; i
++)
89 draw_special_screen(target
, rl_corrupt
);
96 void init_special_screens() throw(std::bad_alloc
)
98 uint16_t buf
[512*448];
100 screen_nosignal
= lcscreen(buf
, 512, 448);
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)
110 if(framebuffer
.height
< 400)
113 struct lua_render_context lrc
;
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);
131 win
->notify_screen_update();