From e18f467885eeb7998cb8973e80f70f30fa5511ea Mon Sep 17 00:00:00 2001 From: Inuyasha <MattWCSTRFAN@gmail.com> Date: Fri, 8 Jan 2016 08:16:16 -0800 Subject: [PATCH] Further optimization of fading code because I'm crazy The less branches, the better. Optimization is a bitch, you know. --- src/f_wipe.c | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/f_wipe.c b/src/f_wipe.c index 8e7c622c43..6f14e577aa 100644 --- a/src/f_wipe.c +++ b/src/f_wipe.c @@ -231,34 +231,52 @@ static void F_DoWipe(fademask_t *fademask) maskx = masky = 0; do { - // pointer to transtable that this mask would use - transtbl = transtables + ((9 - *mask)<<FF_TRANSSHIFT); - // (ignore that it goes out of bounds if *mask is 0 or 10 -- - // it wouldn't be used in those cases anyway) - draw_rowstart = scrxpos[maskx]; draw_rowend = scrxpos[maskx + 1]; draw_linestart = scrypos[masky]; draw_lineend = scrypos[masky + 1]; - // DRAWING LOOP relativepos = (draw_linestart * vid.width) + draw_rowstart; draw_linestogo = draw_lineend - draw_linestart; - while (draw_linestogo--) + + if (*mask == 0) { - w = w_base + relativepos; - s = s_base + relativepos; - e = e_base + relativepos; - draw_rowstogo = draw_rowend - draw_rowstart; - while (draw_rowstogo--) + // shortcut - memcpy source to work + while (draw_linestogo--) { - if (*s != *e) - *w = ((*mask == 0) ? *s : (*mask == 10) ? *e : transtbl[(*e<<8) + *s]); - ++w, ++s, ++e; + M_Memcpy(w_base+relativepos, s_base+relativepos, draw_rowend-draw_rowstart); + relativepos += vid.width; + } + } + else if (*mask == 10) + { + // shortcut - memcpy target to work + while (draw_linestogo--) + { + M_Memcpy(w_base+relativepos, e_base+relativepos, draw_rowend-draw_rowstart); + relativepos += vid.width; + } + } + else + { + // pointer to transtable that this mask would use + transtbl = transtables + ((9 - *mask)<<FF_TRANSSHIFT); + + // DRAWING LOOP + while (draw_linestogo--) + { + w = w_base + relativepos; + s = s_base + relativepos; + e = e_base + relativepos; + draw_rowstogo = draw_rowend - draw_rowstart; + + while (draw_rowstogo--) + *w++ = transtbl[ ( *e++ << 8 ) + *s++ ]; + + relativepos += vid.width; } - relativepos += vid.width; + // END DRAWING LOOP } - // END DRAWING LOOP if (++maskx >= fademask->width) ++masky, maskx = 0; -- GitLab