dosbox-wii/src/gui/render_simple.h
2021-02-06 16:06:31 +01:00

122 lines
3.5 KiB
C

/*
* Copyright (C) 2002-2019 The DOSBox Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#if defined (SCALERLINEAR)
static void conc4d(SCALERNAME,SBPP,DBPP,L)(const void *s) {
#else
static void conc4d(SCALERNAME,SBPP,DBPP,R)(const void *s) {
#endif
#ifdef RENDER_NULL_INPUT
if (!s) {
render.scale.cacheRead += render.scale.cachePitch;
#if defined(SCALERLINEAR)
Bitu skipLines = SCALERHEIGHT;
#else
Bitu skipLines = Scaler_Aspect[ render.scale.outLine++ ];
#endif
ScalerAddLines( 0, skipLines );
return;
}
#endif
/* Clear the complete line marker */
Bitu hadChange = 0;
const SRCTYPE *src = (SRCTYPE*)s;
SRCTYPE *cache = (SRCTYPE*)(render.scale.cacheRead);
render.scale.cacheRead += render.scale.cachePitch;
PTYPE * line0=(PTYPE *)(render.scale.outWrite);
#if (SBPP == 9)
for (Bits x=render.src.width;x>0;) {
if (*(Bit32u const*)src == *(Bit32u*)cache && !(
render.pal.modified[src[0]] |
render.pal.modified[src[1]] |
render.pal.modified[src[2]] |
render.pal.modified[src[3]] )) {
x-=4;
src+=4;
cache+=4;
line0+=4*SCALERWIDTH;
#else
for (Bits x=render.src.width;x>0;) {
if (*(Bitu const*)src == *(Bitu*)cache) {
x-=(sizeof(Bitu)/sizeof(SRCTYPE));
src+=(sizeof(Bitu)/sizeof(SRCTYPE));
cache+=(sizeof(Bitu)/sizeof(SRCTYPE));
line0+=(sizeof(Bitu)/sizeof(SRCTYPE))*SCALERWIDTH;
#endif
} else {
#if defined(SCALERLINEAR)
#if (SCALERHEIGHT > 1)
PTYPE *line1 = WC[0];
#endif
#if (SCALERHEIGHT > 2)
PTYPE *line2 = WC[1];
#endif
#else
#if (SCALERHEIGHT > 1)
PTYPE *line1 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch);
#endif
#if (SCALERHEIGHT > 2)
PTYPE *line2 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 2);
#endif
#endif //defined(SCALERLINEAR)
hadChange = 1;
for (Bitu i = x > 32 ? 32 : x;i>0;i--,x--) {
const SRCTYPE S = *src;
*cache = S;
src++;cache++;
const PTYPE P = PMAKE(S);
SCALERFUNC;
line0 += SCALERWIDTH;
#if (SCALERHEIGHT > 1)
line1 += SCALERWIDTH;
#endif
#if (SCALERHEIGHT > 2)
line2 += SCALERWIDTH;
#endif
}
#if defined(SCALERLINEAR)
#if (SCALERHEIGHT > 1)
Bitu copyLen = (Bitu)((Bit8u*)line1 - (Bit8u*)WC[0]);
BituMove(((Bit8u*)line0)-copyLen+render.scale.outPitch ,WC[0], copyLen );
#endif
#if (SCALERHEIGHT > 2)
BituMove(((Bit8u*)line0)-copyLen+render.scale.outPitch*2,WC[1], copyLen );
#endif
#endif //defined(SCALERLINEAR)
}
}
#if defined(SCALERLINEAR)
Bitu scaleLines = SCALERHEIGHT;
#else
Bitu scaleLines = Scaler_Aspect[ render.scale.outLine++ ];
if ( scaleLines - SCALERHEIGHT && hadChange ) {
BituMove( render.scale.outWrite + render.scale.outPitch * SCALERHEIGHT,
render.scale.outWrite + render.scale.outPitch * (SCALERHEIGHT-1),
render.src.width * SCALERWIDTH * PSIZE);
}
#endif
ScalerAddLines( hadChange, scaleLines );
}
#if !defined(SCALERLINEAR)
#define SCALERLINEAR 1
#include "render_simple.h"
#undef SCALERLINEAR
#endif