Path: blob/master/libsnes/bsnes/snes/alt/ppu-compatibility/render/windows.cpp
2 views
#ifdef PPU_CPP12//screen: 0 = main, 1 = sub3void PPU::build_window_table(uint8 bg, bool screen) {4bool set = 1, clr = 0;5uint8 *table = (screen == 0 ? window[bg].main : window[bg].sub);67if(bg != COL) {8if(screen == 0 && regs.window_enabled[bg] == false) {9memset(table, 0, 256);10return;11}12if(screen == 1 && regs.sub_window_enabled[bg] == false) {13memset(table, 0, 256);14return;15}16} else {17switch(screen == 0 ? regs.color_mask : regs.colorsub_mask) {18case 0: memset(table, 1, 256); return; //always19case 3: memset(table, 0, 256); return; //never20case 1: set = 1, clr = 0; break; //inside window only21case 2: set = 0, clr = 1; break; //outside window only22}23}2425const uint16 window1_left = regs.window1_left;26const uint16 window1_right = regs.window1_right;27const uint16 window2_left = regs.window2_left;28const uint16 window2_right = regs.window2_right;2930if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == false) {31memset(table, clr, 256);32return;33}3435if(regs.window1_enabled[bg] == true && regs.window2_enabled[bg] == false) {36if(regs.window1_invert[bg] == true) set ^= clr ^= set ^= clr;37for(unsigned x = 0; x < 256; x++) {38table[x] = (x >= window1_left && x <= window1_right) ? set : clr;39}40return;41}4243if(regs.window1_enabled[bg] == false && regs.window2_enabled[bg] == true) {44if(regs.window2_invert[bg] == true) set ^= clr ^= set ^= clr;45for(unsigned x = 0; x < 256; x++) {46table[x] = (x >= window2_left && x <= window2_right) ? set : clr;47}48return;49}5051for(unsigned x = 0; x < 256; x++) {52bool w1_mask = (x >= window1_left && x <= window1_right) ^ regs.window1_invert[bg];53bool w2_mask = (x >= window2_left && x <= window2_right) ^ regs.window2_invert[bg];5455switch(regs.window_mask[bg]) {56case 0: table[x] = (w1_mask | w2_mask) == 1 ? set : clr; break; //or57case 1: table[x] = (w1_mask & w2_mask) == 1 ? set : clr; break; //and58case 2: table[x] = (w1_mask ^ w2_mask) == 1 ? set : clr; break; //xor59case 3: table[x] = (w1_mask ^ w2_mask) == 0 ? set : clr; break; //xnor60}61}62}6364void PPU::build_window_tables(uint8 bg) {65build_window_table(bg, 0);66build_window_table(bg, 1);67}6869#endif707172