]> git.sesse.net Git - ccbs/blobdiff - bigscreen/splitscreen.cpp
Added split screen functionality, for showing up to four groups at a time.
[ccbs] / bigscreen / splitscreen.cpp
diff --git a/bigscreen/splitscreen.cpp b/bigscreen/splitscreen.cpp
new file mode 100644 (file)
index 0000000..a322fec
--- /dev/null
@@ -0,0 +1,70 @@
+#include <cstring>
+#include "splitscreen.h"
+
+SplitScreen::SplitScreen(GenericScreen *s1, GenericScreen *s2, GenericScreen *s3, GenericScreen *s4)
+       : valid(false)
+{
+       subscreens[0] = s1;
+       subscreens[1] = s2;
+       subscreens[2] = s3;
+       subscreens[3] = s4;
+
+       memset(subbufs[0], 0, 800*600*4);
+       memset(subbufs[1], 0, 800*600*4);
+       memset(subbufs[2], 0, 800*600*4);
+       memset(subbufs[3], 0, 800*600*4);
+}
+
+SplitScreen::~SplitScreen()
+{
+}
+
+bool SplitScreen::check_invalidated()
+{
+       if (!valid)
+               return true;
+       
+       for (unsigned i = 0; i < 4; ++i) {
+               if (subscreens[i] && subscreens[i]->check_invalidated())
+                       return true;
+       }
+
+       return false;
+}
+
+void SplitScreen::draw(unsigned char *buf)
+{
+       for (unsigned i = 0; i < 4; ++i) {
+               if (subscreens[i] && subscreens[i]->check_invalidated()) {
+                       subscreens[i]->draw(subbufs[i]);
+               }
+       }
+       
+       downscale_2x2(buf, subbufs[0]);
+       downscale_2x2(buf + 400 * 4, subbufs[1]);
+       downscale_2x2(buf + 800 * 300 * 4, subbufs[2]);
+       downscale_2x2(buf + 800 * 300 * 4 + 400 * 4, subbufs[3]); 
+
+       valid = true;
+}
+       
+// simple box filter (blah)
+void SplitScreen::downscale_2x2(unsigned char *dst, unsigned char *src)
+{
+       for (unsigned y = 0; y < 300; ++y) {
+               unsigned char *sptr1 = src + (y*2) * 800 * 4;
+               unsigned char *sptr2 = src + (y*2+1) * 800 * 4;
+               unsigned char *dptr = dst + y * 800 * 4;
+               
+               for (unsigned x = 0; x < 400; ++x) {
+                       *dptr++ = (sptr1[0] + sptr1[4] + sptr2[0] + sptr2[4]) >> 2;  // red
+                       *dptr++ = (sptr1[1] + sptr1[5] + sptr2[1] + sptr2[5]) >> 2;  // green
+                       *dptr++ = (sptr1[2] + sptr1[6] + sptr2[2] + sptr2[6]) >> 2;  // blue
+                       *dptr++ = (sptr1[3] + sptr1[7] + sptr2[3] + sptr2[7]) >> 2;  // alpha
+
+                       sptr1 += 8;
+                       sptr2 += 8;
+               }
+       }
+}
+