diff -urN dosbox-0.73/src/dosbox.cpp dosbox-0.73/src/dosbox.cpp --- dosbox-0.73/src/dosbox.cpp 2009-05-25 20:44:46.000000000 +0200 +++ dosbox-0.73/src/dosbox.cpp 2010-01-19 11:56:25.387344693 +0100 @@ -378,9 +378,9 @@ Pstring = Pmulti->GetSection()->Add_string("type",Property::Changeable::Always,"normal2x"); const char *scalers[] = { - "none", "normal2x", "normal3x", + "none", "normal2x", "normal3x", "normal4x", #if RENDER_USE_ADVANCED_SCALERS>2 - "advmame2x", "advmame3x", "advinterp2x", "advinterp3x", "hq2x", "hq3x", "2xsai", "super2xsai", "supereagle", + "advmame2x", "advmame3x", "advmame4x", "advinterp2x", "advinterp3x", "advinterp4x", "hq2x", "hq3x", "2xsai", "super2xsai", "supereagle", #endif #if RENDER_USE_ADVANCED_SCALERS>0 "tv2x", "tv3x", "rgb2x", "rgb3x", "scan2x", "scan3x", diff -urN dosbox-0.73/src/gui/render.cpp dosbox-0.73/src/gui/render.cpp --- dosbox-0.73/src/gui/render.cpp 2009-05-25 20:44:46.000000000 +0200 +++ dosbox-0.73/src/gui/render.cpp 2010-01-19 11:58:59.469013482 +0100 @@ -288,6 +288,8 @@ simpleBlock = &ScaleNormal2x; else if (render.scale.size == 3) simpleBlock = &ScaleNormal3x; + else if (render.scale.size == 4) + simpleBlock = &ScaleNormal4x; else simpleBlock = &ScaleNormal1x; /* Maybe override them */ @@ -299,12 +301,16 @@ complexBlock = &ScaleAdvInterp2x; else if (render.scale.size == 3) complexBlock = &ScaleAdvInterp3x; + else if (render.scale.size == 4) + complexBlock = &ScaleAdvInterp4x; break; case scalerOpAdvMame: if (render.scale.size == 2) complexBlock = &ScaleAdvMame2x; else if (render.scale.size == 3) complexBlock = &ScaleAdvMame3x; + else if (render.scale.size == 4) + complexBlock = &ScaleAdvMame4x; break; case scalerOpHQ: if (render.scale.size == 2) @@ -597,11 +603,14 @@ if (scaler == "none") { render.scale.op = scalerOpNormal;render.scale.size = 1; } else if (scaler == "normal2x") { render.scale.op = scalerOpNormal;render.scale.size = 2; } else if (scaler == "normal3x") { render.scale.op = scalerOpNormal;render.scale.size = 3; } + else if (scaler == "normal4x") { render.scale.op = scalerOpNormal;render.scale.size = 4; } #if RENDER_USE_ADVANCED_SCALERS>2 else if (scaler == "advmame2x") { render.scale.op = scalerOpAdvMame;render.scale.size = 2; } else if (scaler == "advmame3x") { render.scale.op = scalerOpAdvMame;render.scale.size = 3; } + else if (scaler == "advmame4x") { render.scale.op = scalerOpAdvMame;render.scale.size = 4; } else if (scaler == "advinterp2x") { render.scale.op = scalerOpAdvInterp;render.scale.size = 2; } else if (scaler == "advinterp3x") { render.scale.op = scalerOpAdvInterp;render.scale.size = 3; } + else if (scaler == "advinterp4x") { render.scale.op = scalerOpAdvInterp;render.scale.size = 4; } else if (scaler == "hq2x") { render.scale.op = scalerOpHQ;render.scale.size = 2; } else if (scaler == "hq3x") { render.scale.op = scalerOpHQ;render.scale.size = 3; } else if (scaler == "2xsai") { render.scale.op = scalerOpSaI;render.scale.size = 2; } diff -urN dosbox-0.73/src/gui/render_loops.h dosbox-0.73/src/gui/render_loops.h --- dosbox-0.73/src/gui/render_loops.h 2009-05-25 20:44:46.000000000 +0200 +++ dosbox-0.73/src/gui/render_loops.h 2010-01-19 11:55:13.982380988 +0100 @@ -51,6 +51,9 @@ #if (SCALERHEIGHT > 2) PTYPE * line2; #endif +#if (SCALERHEIGHT > 3) + PTYPE * line3; +#endif /* Clear this block being dirty marker */ const Bitu changeType = changed[b]; changed[b] = 0; @@ -66,6 +69,9 @@ #if (SCALERHEIGHT > 2) line2 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 2); #endif +#if (SCALERHEIGHT > 3) + line3 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 3); +#endif SCALERFUNC; line0 += SCALERWIDTH * SCALER_BLOCKSIZE; fc += SCALER_BLOCKSIZE; @@ -77,6 +83,9 @@ #if (SCALERHEIGHT > 2) line2 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 2); #endif +#if (SCALERHEIGHT > 3) + line3 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 3); +#endif SCALERFUNC; case SCALE_RIGHT: #if (SCALERHEIGHT > 1) @@ -85,6 +94,9 @@ #if (SCALERHEIGHT > 2) line2 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 2); #endif +#if (SCALERHEIGHT > 3) + line3 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 3); +#endif line0 += SCALERWIDTH * (SCALER_BLOCKSIZE -1); #if (SCALERHEIGHT > 1) line1 += SCALERWIDTH * (SCALER_BLOCKSIZE -1); @@ -92,6 +104,9 @@ #if (SCALERHEIGHT > 2) line2 += SCALERWIDTH * (SCALER_BLOCKSIZE -1); #endif +#if (SCALERHEIGHT > 3) + line3 += SCALERWIDTH * (SCALER_BLOCKSIZE -1); +#endif fc += SCALER_BLOCKSIZE -1; SCALERFUNC; line0 += SCALERWIDTH; @@ -105,6 +120,9 @@ #if (SCALERHEIGHT > 2) line2 = WC[1]; #endif +#if (SCALERHEIGHT > 3) + line3 = WC[2]; +#endif #else #if (SCALERHEIGHT > 1) line1 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch); @@ -112,6 +130,9 @@ #if (SCALERHEIGHT > 2) line2 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 2); #endif +#if (SCALERHEIGHT > 3) + line3 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 3); +#endif #endif //defined(SCALERLINEAR) for (Bitu i = 0; i 2) line2 += SCALERWIDTH; #endif +#if (SCALERHEIGHT > 3) + line3 += SCALERWIDTH; +#endif fc++; } #if defined(SCALERLINEAR) @@ -131,6 +155,9 @@ #if (SCALERHEIGHT > 2) BituMove((Bit8u*)(&line0[-SCALER_BLOCKSIZE*SCALERWIDTH])+render.scale.outPitch*2,WC[1], SCALER_BLOCKSIZE *SCALERWIDTH*PSIZE); #endif +#if (SCALERHEIGHT > 3) + BituMove((Bit8u*)(&line0[-SCALER_BLOCKSIZE*SCALERWIDTH])+render.scale.outPitch*3,WC[2], SCALER_BLOCKSIZE *SCALERWIDTH*PSIZE); +#endif #endif //defined(SCALERLINEAR) break; } diff -urN dosbox-0.73/src/gui/render_scalers.cpp dosbox-0.73/src/gui/render_scalers.cpp --- dosbox-0.73/src/gui/render_scalers.cpp 2009-05-25 20:44:46.000000000 +0200 +++ dosbox-0.73/src/gui/render_scalers.cpp 2010-01-19 12:02:29.860881690 +0100 @@ -256,6 +256,23 @@ { Normal3x_8_8_R, Normal3x_9_15_R , Normal3x_9_16_R , Normal3x_9_32_R } }}; + ScalerSimpleBlock_t ScaleNormal4x = { + "Normal4x", + GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, + 4,4,{ +{ Normal4x_8_8_L, Normal4x_8_15_L , Normal4x_8_16_L , Normal4x_8_32_L }, +{ 0, Normal4x_15_15_L, Normal4x_15_16_L, Normal4x_15_32_L}, +{ 0, Normal4x_16_15_L, Normal4x_16_16_L, Normal4x_16_32_L}, +{ 0, Normal4x_32_15_L, Normal4x_32_16_L, Normal4x_32_32_L}, +{ Normal4x_8_8_L, Normal4x_9_15_L , Normal4x_9_16_L , Normal4x_9_32_L } +},{ +{ Normal4x_8_8_R, Normal4x_8_15_R , Normal4x_8_16_R , Normal4x_8_32_R }, +{ 0, Normal4x_15_15_R, Normal4x_15_16_R, Normal4x_15_32_R}, +{ 0, Normal4x_16_15_R, Normal4x_16_16_R, Normal4x_16_32_R}, +{ 0, Normal4x_32_15_R, Normal4x_32_16_R, Normal4x_32_32_R}, +{ Normal4x_8_8_R, Normal4x_9_15_R , Normal4x_9_16_R , Normal4x_9_32_R } +}}; + #if RENDER_USE_ADVANCED_SCALERS>0 ScalerSimpleBlock_t ScaleTV2x = { "TV2x", @@ -380,6 +397,14 @@ { AdvMame3x_8_R,AdvMame3x_16_R,AdvMame3x_16_R,AdvMame3x_32_R} }; +ScalerComplexBlock_t ScaleAdvMame4x = { + "AdvMame4x", + GFX_CAN_8|GFX_CAN_15|GFX_CAN_16|GFX_CAN_32, + 4,4, +{ AdvMame4x_8_L,AdvMame4x_16_L,AdvMame4x_16_L,AdvMame4x_32_L}, +{ AdvMame4x_8_R,AdvMame4x_16_R,AdvMame4x_16_R,AdvMame4x_32_R} +}; + /* These need specific 15bpp versions */ ScalerComplexBlock_t ScaleHQ2x ={ "HQ2x", @@ -437,4 +462,12 @@ { 0,AdvInterp3x_15_R,AdvInterp3x_16_R,AdvInterp3x_32_R} }; +ScalerComplexBlock_t ScaleAdvInterp4x = { + "AdvInterp4x", + GFX_CAN_15|GFX_CAN_16|GFX_CAN_32|GFX_RGBONLY, + 4,4, +{ 0,AdvInterp4x_15_L,AdvInterp4x_16_L,AdvInterp4x_32_L}, +{ 0,AdvInterp4x_15_R,AdvInterp4x_16_R,AdvInterp4x_32_R} +}; + #endif diff -urN dosbox-0.73/src/gui/render_scalers.h dosbox-0.73/src/gui/render_scalers.h --- dosbox-0.73/src/gui/render_scalers.h 2009-05-25 20:44:46.000000000 +0200 +++ dosbox-0.73/src/gui/render_scalers.h 2010-01-19 12:03:28.170822333 +0100 @@ -113,6 +113,7 @@ extern ScalerSimpleBlock_t ScaleNormalDh; extern ScalerSimpleBlock_t ScaleNormal2x; extern ScalerSimpleBlock_t ScaleNormal3x; +extern ScalerSimpleBlock_t ScaleNormal4x; #if RENDER_USE_ADVANCED_SCALERS>0 extern ScalerSimpleBlock_t ScaleTV2x; extern ScalerSimpleBlock_t ScaleTV3x; @@ -130,8 +131,10 @@ extern ScalerComplexBlock_t ScaleSuperEagle; extern ScalerComplexBlock_t ScaleAdvMame2x; extern ScalerComplexBlock_t ScaleAdvMame3x; +extern ScalerComplexBlock_t ScaleAdvMame4x; extern ScalerComplexBlock_t ScaleAdvInterp2x; extern ScalerComplexBlock_t ScaleAdvInterp3x; +extern ScalerComplexBlock_t ScaleAdvInterp4x; #endif #if RENDER_USE_ADVANCED_SCALERS>1 extern ScalerLineBlock_t ScalerCache; diff -urN dosbox-0.73/src/gui/render_simple.h dosbox-0.73/src/gui/render_simple.h --- dosbox-0.73/src/gui/render_simple.h 2009-05-27 11:15:41.000000000 +0200 +++ dosbox-0.73/src/gui/render_simple.h 2010-01-19 11:55:13.982380988 +0100 @@ -68,6 +68,9 @@ #if (SCALERHEIGHT > 2) PTYPE *line2 = WC[1]; #endif +#if (SCALERHEIGHT > 3) + PTYPE *line3 = WC[2]; +#endif #else #if (SCALERHEIGHT > 1) PTYPE *line1 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch); @@ -75,6 +78,9 @@ #if (SCALERHEIGHT > 2) PTYPE *line2 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 2); #endif +#if (SCALERHEIGHT > 3) + PTYPE *line3 = (PTYPE *)(((Bit8u*)line0)+ render.scale.outPitch * 3); +#endif #endif //defined(SCALERLINEAR) hadChange = 1; for (Bitu i = x > 32 ? 32 : x;i>0;i--,x--) { @@ -90,6 +96,9 @@ #if (SCALERHEIGHT > 2) line2 += SCALERWIDTH; #endif +#if (SCALERHEIGHT > 3) + line3 += SCALERWIDTH; +#endif } #if defined(SCALERLINEAR) #if (SCALERHEIGHT > 1) @@ -99,6 +108,9 @@ #if (SCALERHEIGHT > 2) BituMove(((Bit8u*)line0)-copyLen+render.scale.outPitch*2,WC[1], copyLen ); #endif +#if (SCALERHEIGHT > 3) + BituMove(((Bit8u*)line0)-copyLen+render.scale.outPitch*3,WC[2], copyLen ); +#endif #endif //defined(SCALERLINEAR) } } diff -urN dosbox-0.73/src/gui/render_templates.h dosbox-0.73/src/gui/render_templates.h --- dosbox-0.73/src/gui/render_templates.h 2009-05-25 20:44:46.000000000 +0200 +++ dosbox-0.73/src/gui/render_templates.h 2010-01-19 13:52:18.048640601 +0100 @@ -257,6 +257,32 @@ #undef SCALERHEIGHT #undef SCALERFUNC +#define SCALERNAME Normal4x +#define SCALERWIDTH 4 +#define SCALERHEIGHT 4 +#define SCALERFUNC \ + line0[0] = P; \ + line0[1] = P; \ + line0[2] = P; \ + line0[3] = P; \ + line1[0] = P; \ + line1[1] = P; \ + line1[2] = P; \ + line1[3] = P; \ + line2[0] = P; \ + line2[1] = P; \ + line2[2] = P; \ + line2[3] = P; \ + line3[0] = P; \ + line3[1] = P; \ + line3[2] = P; \ + line3[3] = P; +#include "render_simple.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + #define SCALERNAME NormalDw #define SCALERWIDTH 2 #define SCALERHEIGHT 1 @@ -508,6 +534,44 @@ #undef SCALERHEIGHT #undef SCALERFUNC +#define SCALERNAME AdvInterp4x +#define SCALERWIDTH 4 +#define SCALERHEIGHT 4 +#define SCALERFUNC \ + if ((C1 != C7) && (C3 != C5)) { \ + line0[0] = C3 == C1 ? interp_w2(C3,C4,5U,3U) : C4; \ + line0[3] = C1 == C5 ? interp_w2(C5,C4,5U,3U) : C4; \ + line1[1] = C4; \ + line1[2] = C4; \ + line2[1] = C4; \ + line2[2] = C4; \ + line3[0] = C3 == C7 ? interp_w2(C3,C4,5U,3U) : C4; \ + line3[3] = C7 == C5 ? interp_w2(C5,C4,5U,3U) : C4; \ + line0[1] = line0[0]; \ + line0[2] = line0[3]; \ + line1[0] = line0[0]; \ + line1[3] = line0[3]; \ + line2[0] = line3[0]; \ + line2[3] = line3[3]; \ + line3[1] = line3[0]; \ + line3[2] = line3[3]; \ + if (line0[0] != C4){line0[0] = interp_w2(C3,line0[0],5U,3U);} \ + if (line0[3] != C4){line0[3] = interp_w2(C5,line0[3],5U,3U);} \ + if (line3[0] != C4){line3[0] = interp_w2(C3,line3[0],5U,3U);} \ + if (line3[3] != C4){line3[3] = interp_w2(C5,line3[3],5U,3U);} \ + } else { \ + line0[0] = line0[1] = line0[2] = line0[3] = C4; \ + line1[0] = line1[1] = line1[2] = line1[3] = C4; \ + line2[0] = line2[1] = line2[2] = line2[3] = C4; \ + line3[0] = line3[1] = line3[2] = line3[3] = C4; \ + } + +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC + #endif // #if (DBPP > 8) #define SCALERNAME AdvMame2x @@ -555,6 +619,39 @@ #undef SCALERHEIGHT #undef SCALERFUNC +#define SCALERNAME AdvMame4x +#define SCALERWIDTH 4 +#define SCALERHEIGHT 4 +#define SCALERFUNC \ + if ((C1 != C7) && (C3 != C5)) { \ + line0[0] = C3 == C1 ? C3 : C4; \ + line0[3] = C5 == C1 ? C5 : C4; \ + line1[1] = C4; \ + line1[2] = C4; \ + line2[1] = C4; \ + line2[2] = C4; \ + line3[0] = C3 == C7 ? C3 : C4; \ + line3[3] = C5 == C7 ? C5 : C4; \ + line0[1] = line0[0]; \ + line0[2] = line0[3]; \ + line1[0] = line0[0]; \ + line1[3] = line0[3]; \ + line2[0] = line3[0]; \ + line2[3] = line3[3]; \ + line3[1] = line3[0]; \ + line3[2] = line3[3]; \ + } else { \ + line0[0] = line0[1] = line0[2] = line0[3] = C4; \ + line1[0] = line1[1] = line1[2] = line1[3] = C4; \ + line2[0] = line2[1] = line2[2] = line2[3] = C4; \ + line3[0] = line3[1] = line3[2] = line3[3] = C4; \ + } + +#include "render_loops.h" +#undef SCALERNAME +#undef SCALERWIDTH +#undef SCALERHEIGHT +#undef SCALERFUNC #endif // (SBPP == DBPP) && !defined (CACHEWITHPAL)