static void RENDER_Reset( void ) { Bitu width=render.src.width; Bitu height=render.src.height; bool dblw=render.src.dblw; bool dblh=render.src.dblh; double gfx_scalew; double gfx_scaleh; Bitu gfx_flags = GFX_CAN_8 | GFX_CAN_15 | GFX_CAN_16 | GFX_CAN_32, xscale = dblw ? 2 : 1; if (render.aspect) { if (render.src.ratio>1.0) { gfx_scalew = 1; gfx_scaleh = render.src.ratio; } else { gfx_scalew = (1/render.src.ratio); gfx_scaleh = 1; } } else { gfx_scalew = 1; gfx_scaleh = 1; } switch (render.src.bpp) { case 8: render.src.start = ( render.src.width * 1) / sizeof(Bitu); if (gfx_flags & GFX_CAN_8) gfx_flags |= GFX_LOVE_8; else gfx_flags |= GFX_LOVE_32; break; case 15: render.src.start = ( render.src.width * 2) / sizeof(Bitu); gfx_flags |= GFX_LOVE_15; gfx_flags = (gfx_flags & ~GFX_CAN_8) | GFX_RGBONLY; break; case 16: render.src.start = ( render.src.width * 2) / sizeof(Bitu); gfx_flags |= GFX_LOVE_16; gfx_flags = (gfx_flags & ~GFX_CAN_8) | GFX_RGBONLY; break; case 32: render.src.start = ( render.src.width * 4) / sizeof(Bitu); gfx_flags |= GFX_LOVE_32; gfx_flags = (gfx_flags & ~GFX_CAN_8) | GFX_RGBONLY; break; } gfx_flags=GFX_GetBestMode(gfx_flags); /* Setup the scaler variables */ gfx_flags=GFX_SetSize(width,height,gfx_flags,gfx_scalew,gfx_scaleh,&RENDER_CallBack); /* Reset the palette change detection to it's initial value */ render.pal.first= 0; render.pal.last = 255; //Finish this frame using a copy only handler RENDER_DrawLine = RENDER_FinishLineHandler; render.active=true; }
static void RENDER_Reset( void ) { Bitu width=render.src.width; Bitu height=render.src.height; bool dblw=render.src.dblw; bool dblh=render.src.dblh; double gfx_scalew; double gfx_scaleh; Bitu gfx_flags, xscale, yscale; ScalerSimpleBlock_t *simpleBlock = &ScaleNormal1x; ScalerComplexBlock_t *complexBlock = 0; if (render.aspect) { if (render.src.ratio>1.0) { gfx_scalew = 1; gfx_scaleh = render.src.ratio; } else { gfx_scalew = (1/render.src.ratio); gfx_scaleh = 1; } } else { gfx_scalew = 1; gfx_scaleh = 1; } if ((dblh && dblw) || (render.scale.forced && !dblh && !dblw)) { /* Initialize always working defaults */ if (render.scale.size == 2) simpleBlock = &ScaleNormal2x; else if (render.scale.size == 3) simpleBlock = &ScaleNormal3x; else simpleBlock = &ScaleNormal1x; /* Maybe override them */ #if RENDER_USE_ADVANCED_SCALERS>0 switch (render.scale.op) { #if RENDER_USE_ADVANCED_SCALERS>2 case scalerOpAdvInterp: if (render.scale.size == 2) complexBlock = &ScaleAdvInterp2x; else if (render.scale.size == 3) complexBlock = &ScaleAdvInterp3x; break; case scalerOpAdvMame: if (render.scale.size == 2) complexBlock = &ScaleAdvMame2x; else if (render.scale.size == 3) complexBlock = &ScaleAdvMame3x; break; case scalerOpHQ: if (render.scale.size == 2) complexBlock = &ScaleHQ2x; else if (render.scale.size == 3) complexBlock = &ScaleHQ3x; break; case scalerOpSuperSaI: if (render.scale.size == 2) complexBlock = &ScaleSuper2xSaI; break; case scalerOpSuperEagle: if (render.scale.size == 2) complexBlock = &ScaleSuperEagle; break; case scalerOpSaI: if (render.scale.size == 2) complexBlock = &Scale2xSaI; break; #endif case scalerOpTV: if (render.scale.size == 2) simpleBlock = &ScaleTV2x; else if (render.scale.size == 3) simpleBlock = &ScaleTV3x; break; case scalerOpRGB: if (render.scale.size == 2) simpleBlock = &ScaleRGB2x; else if (render.scale.size == 3) simpleBlock = &ScaleRGB3x; break; case scalerOpScan: if (render.scale.size == 2) simpleBlock = &ScaleScan2x; else if (render.scale.size == 3) simpleBlock = &ScaleScan3x; break; default: break; } #endif } else if (dblw) { simpleBlock = &ScaleNormalDw; } else if (dblh) { simpleBlock = &ScaleNormalDh; } else { forcenormal: complexBlock = 0; simpleBlock = &ScaleNormal1x; } if (complexBlock) { #if RENDER_USE_ADVANCED_SCALERS>1 if ((width >= SCALER_COMPLEXWIDTH - 16) || height >= SCALER_COMPLEXHEIGHT - 16) { LOG_MSG("Scaler can't handle this resolution, going back to normal"); goto forcenormal; } #else goto forcenormal; #endif gfx_flags = complexBlock->gfxFlags; xscale = complexBlock->xscale; yscale = complexBlock->yscale; // LOG_MSG("Scaler:%s",complexBlock->name); } else { gfx_flags = simpleBlock->gfxFlags; xscale = simpleBlock->xscale; yscale = simpleBlock->yscale; // LOG_MSG("Scaler:%s",simpleBlock->name); } switch (render.src.bpp) { case 8: render.src.start = ( render.src.width * 1) / sizeof(Bitu); if (gfx_flags & GFX_CAN_8) gfx_flags |= GFX_LOVE_8; else gfx_flags |= GFX_LOVE_32; break; case 15: render.src.start = ( render.src.width * 2) / sizeof(Bitu); gfx_flags |= GFX_LOVE_15; gfx_flags = (gfx_flags & ~GFX_CAN_8) | GFX_RGBONLY; break; case 16: render.src.start = ( render.src.width * 2) / sizeof(Bitu); gfx_flags |= GFX_LOVE_16; gfx_flags = (gfx_flags & ~GFX_CAN_8) | GFX_RGBONLY; break; case 32: render.src.start = ( render.src.width * 4) / sizeof(Bitu); gfx_flags |= GFX_LOVE_32; gfx_flags = (gfx_flags & ~GFX_CAN_8) | GFX_RGBONLY; break; } gfx_flags=GFX_GetBestMode(gfx_flags); if (!gfx_flags) { if (!complexBlock && simpleBlock == &ScaleNormal1x) E_Exit("Failed to create a rendering output"); else goto forcenormal; } width *= xscale; Bitu skip = complexBlock ? 1 : 0; if (gfx_flags & GFX_SCALING) { height = MakeAspectTable(skip, render.src.height, yscale, yscale ); } else { if ((gfx_flags & GFX_CAN_RANDOM) && gfx_scaleh > 1) { gfx_scaleh *= yscale; height = MakeAspectTable( skip, render.src.height, gfx_scaleh, yscale ); } else { gfx_flags &= ~GFX_CAN_RANDOM; //Hardware surface when possible height = MakeAspectTable( skip, render.src.height, yscale, yscale); } } /* Setup the scaler variables */ gfx_flags=GFX_SetSize(width,height,gfx_flags,gfx_scalew,gfx_scaleh,&RENDER_CallBack); if (gfx_flags & GFX_CAN_8) render.scale.outMode = scalerMode8; else if (gfx_flags & GFX_CAN_15) render.scale.outMode = scalerMode15; else if (gfx_flags & GFX_CAN_16) render.scale.outMode = scalerMode16; else if (gfx_flags & GFX_CAN_32) render.scale.outMode = scalerMode32; else E_Exit("Failed to create a rendering output"); ScalerLineBlock_t *lineBlock; if (gfx_flags & GFX_HARDWARE) { #if RENDER_USE_ADVANCED_SCALERS>1 if (complexBlock) { lineBlock = &ScalerCache; render.scale.complexHandler = complexBlock->Linear[ render.scale.outMode ]; } else #endif { render.scale.complexHandler = 0; lineBlock = &simpleBlock->Linear; } } else { #if RENDER_USE_ADVANCED_SCALERS>1 if (complexBlock) { lineBlock = &ScalerCache; render.scale.complexHandler = complexBlock->Random[ render.scale.outMode ]; } else #endif { render.scale.complexHandler = 0; lineBlock = &simpleBlock->Random; } } switch (render.src.bpp) { case 8: render.scale.lineHandler = (*lineBlock)[0][render.scale.outMode]; render.scale.linePalHandler = (*lineBlock)[4][render.scale.outMode]; render.scale.inMode = scalerMode8; render.scale.cachePitch = render.src.width * 1; break; case 15: render.scale.lineHandler = (*lineBlock)[1][render.scale.outMode]; render.scale.linePalHandler = 0; render.scale.inMode = scalerMode15; render.scale.cachePitch = render.src.width * 2; break; case 16: render.scale.lineHandler = (*lineBlock)[2][render.scale.outMode]; render.scale.linePalHandler = 0; render.scale.inMode = scalerMode16; render.scale.cachePitch = render.src.width * 2; break; case 32: render.scale.lineHandler = (*lineBlock)[3][render.scale.outMode]; render.scale.linePalHandler = 0; render.scale.inMode = scalerMode32; render.scale.cachePitch = render.src.width * 4; break; default: E_Exit("RENDER:Wrong source bpp %d", render.src.bpp ); } render.scale.blocks = render.src.width / SCALER_BLOCKSIZE; render.scale.lastBlock = render.src.width % SCALER_BLOCKSIZE; render.scale.inHeight = render.src.height; /* Reset the palette change detection to it's initial value */ render.pal.first= 0; render.pal.last = 255; render.pal.changed = false; memset(render.pal.modified, 0, sizeof(render.pal.modified)); //Finish this frame using a copy only handler RENDER_DrawLine = RENDER_FinishLineHandler; render.scale.outWrite = 0; /* Signal the next frame to first reinit the cache */ render.scale.clearCache = true; render.active=true; }