1 /* NOTE: this class will _NOT_ handle resolution changes cleanly. You have been warned. :-) */
4 #include "splitscreen.h"
7 SplitScreen::SplitScreen(GenericScreen *s1, GenericScreen *s2, GenericScreen *s3, GenericScreen *s4)
15 for (unsigned i = 0; i < 4; ++i)
19 SplitScreen::~SplitScreen()
23 bool SplitScreen::check_invalidated()
28 for (unsigned i = 0; i < 4; ++i) {
29 if (subscreens[i] && subscreens[i]->check_invalidated())
36 void SplitScreen::draw(unsigned char *buf, unsigned width, unsigned height)
38 for (unsigned i = 0; i < 4; ++i) {
39 if (subbufs[i] == NULL) { // see line 1
40 subbufs[i] = new unsigned char[width/2 * height/2 * 4];
41 memset(subbufs[i], 0, width/2 * height/2 * 4);
43 if (subscreens[i] && subscreens[i]->check_invalidated()) {
44 subscreens[i]->draw(subbufs[i], width/2, height/2);
48 copy_subscreen(buf, subbufs[0], width, height);
49 copy_subscreen(buf + (width/2) * 4, subbufs[1], width, height);
50 copy_subscreen(buf + width * (height/2) * 4, subbufs[2], width, height);
51 copy_subscreen(buf + width * (height/2) * 4 + (width/2) * 4, subbufs[3], width, height);
54 unsigned char *ptr = buf + (height/2) * width * 4;
55 for (unsigned x = 0; x < width; ++x) {
56 *ptr++ = DIVIDER_BLUE;
57 *ptr++ = DIVIDER_GREEN;
62 ptr = buf + (width/2) * 4;
63 for (unsigned y = 0; y < height; ++y) {
64 ptr[0] = DIVIDER_BLUE;
65 ptr[1] = DIVIDER_GREEN;
75 void SplitScreen::copy_subscreen(unsigned char *dst, unsigned char *src, unsigned width, unsigned height)
77 for (unsigned y = 0; y < height/2; ++y) {
78 unsigned char *sptr = src + y * width/2 * 4;
79 unsigned char *dptr = dst + y * width * 4;
81 memcpy(dptr, sptr, width/2 * 4);