1 /* NOTE: this class will _NOT_ handle resolution changes cleanly. You have been warned. :-) */
4 #include "splitscreen.h"
6 SplitScreen::SplitScreen(GenericScreen *s1, GenericScreen *s2, GenericScreen *s3, GenericScreen *s4)
14 for (unsigned i = 0; i < 4; ++i)
18 SplitScreen::~SplitScreen()
22 bool SplitScreen::check_invalidated()
27 for (unsigned i = 0; i < 4; ++i) {
28 if (subscreens[i] && subscreens[i]->check_invalidated())
35 void SplitScreen::draw(unsigned char *buf, unsigned width, unsigned height)
37 for (unsigned i = 0; i < 4; ++i) {
38 if (subbufs[i] == NULL) { // see line 1
39 subbufs[i] = new unsigned char[width/2 * height/2 * 4];
40 memset(subbufs[i], 0, width/2 * height/2 * 4);
42 if (subscreens[i] && subscreens[i]->check_invalidated()) {
43 subscreens[i]->draw(subbufs[i], width/2, height/2);
47 copy_subscreen(buf, subbufs[0], width, height);
48 copy_subscreen(buf + (width/2) * 4, subbufs[1], width, height);
49 copy_subscreen(buf + width * (height/2) * 4, subbufs[2], width, height);
50 copy_subscreen(buf + width * (height/2) * 4 + (width/2) * 4, subbufs[3], width, height);
53 unsigned char *ptr = buf + (height/2) * width * 4;
54 for (unsigned x = 0; x < width; ++x) {
61 ptr = buf + (width/2) * 4;
62 for (unsigned y = 0; y < height; ++y) {
74 void SplitScreen::copy_subscreen(unsigned char *dst, unsigned char *src, unsigned width, unsigned height)
76 for (unsigned y = 0; y < height/2; ++y) {
77 unsigned char *sptr = src + y * width/2 * 4;
78 unsigned char *dptr = dst + y * width * 4;
80 memcpy(dptr, sptr, width/2 * 4);