static const uint8_t bayer_matrix[16] = { 0, 4, 1, 5, 4, 0, 5, 1, 3, 7, 2, 6, 7, 3, 6, 2 }; static const uint8_t magic_matrix[16] = { 0, 6, 1, 7, 4, 2, 5, 3, 3, 5, 2, 4, 7, 1, 6, 0 }; static STRICTINLINE void rgb_dither(int rgb_dither_sel, int* r, int* g, int* b, int dith) { int32_t newr = *r, newg = *g, newb = *b; int32_t rcomp, gcomp, bcomp; if (newr > 247) newr = 255; else newr = (newr & 0xf8) + 8; if (newg > 247) newg = 255; else newg = (newg & 0xf8) + 8; if (newb > 247) newb = 255; else newb = (newb & 0xf8) + 8; if (rgb_dither_sel != 2) rcomp = gcomp = bcomp = dith; else { rcomp = dith & 7; gcomp = (dith >> 3) & 7; bcomp = (dith >> 6) & 7; } int32_t replacesign = (rcomp - (*r & 7)) >> 31; int32_t ditherdiff = newr - *r; *r = *r + (ditherdiff & replacesign); replacesign = (gcomp - (*g & 7)) >> 31; ditherdiff = newg - *g; *g = *g + (ditherdiff & replacesign); replacesign = (bcomp - (*b & 7)) >> 31; ditherdiff = newb - *b; *b = *b + (ditherdiff & replacesign); } static STRICTINLINE void get_dither_noise(uint32_t wid, int x, int y, int* cdith, int* adith) { if (!state[wid].other_modes.f.getditherlevel) state[wid].noise = ((irand(&state[wid].rseed) & 7) << 6) | 0x20; y >>= state[wid].scfield; int dithindex; switch(state[wid].other_modes.f.rgb_alpha_dither) { case 0: dithindex = ((y & 3) << 2) | (x & 3); *adith = *cdith = magic_matrix[dithindex]; break; case 1: dithindex = ((y & 3) << 2) | (x & 3); *cdith = magic_matrix[dithindex]; *adith = (~(*cdith)) & 7; break; case 2: dithindex = ((y & 3) << 2) | (x & 3); *cdith = magic_matrix[dithindex]; *adith = (state[wid].noise >> 6) & 7; break; case 3: dithindex = ((y & 3) << 2) | (x & 3); *cdith = magic_matrix[dithindex]; *adith = 0; break; case 4: dithindex = ((y & 3) << 2) | (x & 3); *adith = *cdith = bayer_matrix[dithindex]; break; case 5: dithindex = ((y & 3) << 2) | (x & 3); *cdith = bayer_matrix[dithindex]; *adith = (~(*cdith)) & 7; break; case 6: dithindex = ((y & 3) << 2) | (x & 3); *cdith = bayer_matrix[dithindex]; *adith = (state[wid].noise >> 6) & 7; break; case 7: dithindex = ((y & 3) << 2) | (x & 3); *cdith = bayer_matrix[dithindex]; *adith = 0; break; case 8: dithindex = ((y & 3) << 2) | (x & 3); *cdith = irand(&state[wid].rseed); *adith = magic_matrix[dithindex]; break; case 9: dithindex = ((y & 3) << 2) | (x & 3); *cdith = irand(&state[wid].rseed); *adith = (~magic_matrix[dithindex]) & 7; break; case 10: *cdith = irand(&state[wid].rseed); *adith = (state[wid].noise >> 6) & 7; break; case 11: *cdith = irand(&state[wid].rseed); *adith = 0; break; case 12: dithindex = ((y & 3) << 2) | (x & 3); *cdith = 7; *adith = bayer_matrix[dithindex]; break; case 13: dithindex = ((y & 3) << 2) | (x & 3); *cdith = 7; *adith = (~bayer_matrix[dithindex]) & 7; break; case 14: *cdith = 7; *adith = (state[wid].noise >> 6) & 7; break; case 15: *cdith = 7; *adith = 0; break; } }