Fullscreen defaults to 32-bit. Use -fs8bit for 8-bit mode

This commit is contained in:
tomcw 2014-06-26 22:44:02 +01:00
parent 39a7fee002
commit c509349469
5 changed files with 147 additions and 50 deletions

View File

@ -838,6 +838,10 @@ int APIENTRY WinMain(HINSTANCE passinstance, HINSTANCE, LPSTR lpCmdLine, int)
{
bSetFullScreen = true;
}
else if (strcmp(lpCmdLine, "-fs8bit") == 0)
{
SetFullScreen32Bit(false); // Support old v1.24 fullscreen 8-bit palette mode
}
else if (strcmp(lpCmdLine, "-no-di") == 0)
{
g_bDisableDirectInput = true;

View File

@ -133,6 +133,7 @@ static bool FileExists(string strFilename);
bool g_bScrollLock_FullSpeed = false;
bool g_bFreshReset = false;
static bool g_bFullScreen32Bit = true;
// __ Prototypes __________________________________________________________________________________
static void DrawCrosshairs (int x, int y);
@ -534,7 +535,7 @@ static void DrawFrameWindow ()
else if (g_nAppMode == MODE_DEBUG)
DebugDisplay(1);
else
VideoRedrawScreen();
VideoRedrawScreen(g_bIsFullScreen ? 2 : 1); // TC: 22/06/2014: Why 2 redraws in full-screen mode (32-bit only. 8-bit doesn't need this)
// DD Full-Screen Palette: BUGFIX: needs to come _after_ all drawing...
if (g_bPaintingWindow)
@ -1488,6 +1489,7 @@ static void ScreenWindowResize(const bool bCtrlKey)
g_nOldViewportScale = g_nViewportScale;
FrameResizeWindow(1); // reset to 1x
SetFullScreenMode();
VideoRedrawScreen(1); // [TC-10/06/2014] Why isn't this working?
}
else
{
@ -1602,6 +1604,7 @@ static void ProcessButtonClick(int button, bool bFromButtonUI /*=false*/)
g_bDebugBreakDelayCheck = true;
ProcessButtonClick(BTN_RUN); // Exit debugger, switch to MODE_RUNNING or MODE_STEPPING
// TC: 22/6/2014: Remove this comment now we are using 32-bits per pixel for Fullscreen?
// TODO: DD Full-Screen Palette
// exiting debugger using wrong palette, but this makes problem worse...
//InvalidateRect(g_hFrameWindow,NULL,1);
@ -1796,6 +1799,17 @@ void CtrlReset()
//===========================================================================
bool GetFullScreen32Bit(void)
{
return g_bFullScreen32Bit;
}
void SetFullScreen32Bit(bool b32Bit)
{
g_bFullScreen32Bit = b32Bit;
}
void SetFullScreenMode ()
{
#ifdef NO_DIRECT_X
@ -1819,7 +1833,7 @@ void SetFullScreenMode ()
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if (DirectDrawCreate(NULL,&g_pDD,NULL) != DD_OK ||
g_pDD->SetCooperativeLevel(g_hFrameWindow,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK ||
g_pDD->SetDisplayMode(640,480,8) != DD_OK ||
g_pDD->SetDisplayMode(640,480,g_bFullScreen32Bit ? 32 : 8) != DD_OK ||
g_pDD->CreateSurface(&ddsd,&g_pDDPrimarySurface,NULL) != DD_OK)
{
g_pDDPrimarySurface = NULL;
@ -2128,9 +2142,8 @@ HDC FrameGetVideoDC (LPBYTE *pAddr_, LONG *pPitch_)
// g_pDDPrimarySurface->SetPalette(g_pDDPal); // this sets the palette for the primary surface
// }
}
*pAddr_ = (LPBYTE)surfacedesc.lpSurface+(g_nViewportCY-1)*surfacedesc.lPitch;
*pAddr_ = (LPBYTE)surfacedesc.lpSurface + (g_nViewportCY-1) * surfacedesc.lPitch;
*pPitch_ = -surfacedesc.lPitch;
return (HDC)0;
}
else

View File

@ -45,6 +45,8 @@
int GetViewportScale(void);
int SetViewportScale(int nNewScale);
void GetViewportCXCY(int& nViewportCX, int& nViewportCY);
bool GetFullScreen32Bit(void);
void SetFullScreen32Bit(bool b32Bit);
LRESULT CALLBACK FrameWndProc (
HWND window,

View File

@ -221,7 +221,7 @@ int const kVLine0State = 0x100; // V[543210CBA] = 100000000
int const kVPresetLine = 256; // line when V state presets
int const kVSyncLines = 4; // lines per VSync duration
static BYTE celldirty[40][32];
static BYTE celldirty[40][32]; // NB. No longer used!
// NUM_COLOR_PALETTE
static COLORREF customcolors[256]; // MONOCHROME is last custom color
@ -254,7 +254,7 @@ static WORD colormixmap[6][6][6];
int g_nAltCharSetOffset = 0; // alternate character set
bool g_bVideoDisplayPage2 = 0;
bool g_VideoForceFullRedraw = 1;
/*bool*/ UINT g_VideoForceFullRedraw = 1;
static LPBYTE framebufferaddr = (LPBYTE)0;
static LONG g_nFrameBufferPitch = 0;
@ -376,7 +376,6 @@ static bool bVideoScannerNTSC = true; // NTSC video scanning (or PAL)
void V_CreateDIBSections ();
HBRUSH V_CreateCustomBrush (COLORREF nColor);
/** Our BitBlit() / VRAM_Copy()
@param dx Dst X
@param dy Dst Y
@ -385,7 +384,8 @@ static bool bVideoScannerNTSC = true; // NTSC video scanning (or PAL)
@param sx Src X
@param sy Src Y
// =========================================================================== */
void CopySource (int dx, int dy, int w, int h, int sx, int sy )
static inline void CopySource8(int dx, int dy, int w, int h, int sx, int sy)
{
LPBYTE pDst = g_aFrameBufferOffset[ dy ] + dx;
LPBYTE pSrc = g_aSourceStartofLine[ sy ] + sx;
@ -398,15 +398,15 @@ void CopySource (int dx, int dy, int w, int h, int sx, int sy )
// If not multiple of 3 bytes, copy first 3 bytes, so the next copy is 4-byte aligned.
while (nBytes & 3)
{
--nBytes;
*(pDst+nBytes) = *(pSrc+nBytes);
--nBytes;
*(pDst+nBytes) = *(pSrc+nBytes);
}
// Copy 4 bytes at a time
while (nBytes)
{
nBytes -= 4;
*(LPDWORD)(pDst+nBytes) = *(LPDWORD)(pSrc+nBytes);
nBytes -= 4;
*(LPDWORD)(pDst+nBytes) = *(LPDWORD)(pSrc+nBytes);
}
pDst -= g_nFrameBufferPitch;
@ -414,6 +414,33 @@ void CopySource (int dx, int dy, int w, int h, int sx, int sy )
}
}
static void CopySource(int dx, int dy, int w, int h, int sx, int sy)
{
if (!g_bIsFullScreen || !GetFullScreen32Bit())
{
CopySource8(dx,dy,w,h,sx,sy);
return;
}
UINT32* pDst = (UINT32*) (g_aFrameBufferOffset[ dy ] + dx*sizeof(UINT32));
LPBYTE pSrc = g_aSourceStartofLine[ sy ] + sx;
int nBytes;
while (h--)
{
nBytes = w;
while (nBytes)
{
--nBytes;
const RGBQUAD& rRGB = g_pFramebufferinfo->bmiColors[ *(pSrc+nBytes) ];
const UINT32 rgb = (((UINT32)rRGB.rgbRed)<<16) | (((UINT32)rRGB.rgbGreen)<<8) | ((UINT32)rRGB.rgbBlue);
*(pDst+nBytes) = rgb;
}
pDst -= g_nFrameBufferPitch / sizeof(UINT32);
pSrc -= SRCOFFS_TOTAL;
}
}
//===========================================================================
void CreateFrameOffsetTable (LPBYTE addr, LONG pitch)
@ -2674,51 +2701,84 @@ void __stdcall MixColorsVertical(int matx, int maty)
[bot2idx];
colormixbuffer[4] = (twoHalfPixel & 0xFF00) >> 8;
colormixbuffer[5] = twoHalfPixel & 0x00FF;
}
//===========================================================================
void __stdcall CopyMixedSource (int x, int y, int sourcex, int sourcey)
static inline void __stdcall CopyMixedSource8(int x, int y, int sourcex, int sourcey)
{
// For tv emulation HGR Video Mode
LPBYTE currsourceptr = g_aSourceStartofLine[sourcey]+sourcex;
LPBYTE currdestptr = g_aFrameBufferOffset[y<<1] + (x<<1);
LPBYTE currptr;
const BYTE* const currsourceptr = g_aSourceStartofLine[sourcey]+sourcex;
BYTE* const currdestptr = g_aFrameBufferOffset[y*2] + (x*2);
int matx = x;
int maty = HGR_MATRIX_YOFFSET + y;
int count;
int bufxoffset;
int hgrlinesabove = (y > 0)? 1 : 0;
int hgrlinesbelow = SW_MIXED ? ((y < 159)? 1:0) : ((y < 191)? 1:0);
int i;
int istart = 2 - (hgrlinesabove << 1);
int iend = 3 + (hgrlinesbelow << 1);
const int matx = x;
const int maty = HGR_MATRIX_YOFFSET + y;
const int hgrlinesabove = (y > 0) ? 1 : 0;
const int hgrlinesbelow = SW_MIXED ? ((y < 159)? 1:0) : ((y < 191)? 1:0);
const int istart = 2 - (hgrlinesabove*2);
const int iend = 3 + (hgrlinesbelow*2);
// transfer 7 pixels (i.e. the visible part of an apple hgr-byte) from row to pixelmatrix
for (count = 0, bufxoffset = 0;
count < 7;
count++, bufxoffset += 2) {
hgrpixelmatrix[matx+count][maty] = *(currsourceptr+bufxoffset);
// color mixing between adjacent scanlines at current x position
MixColorsVertical(matx+count, maty);
// transfer 7 pixels (i.e. the visible part of an apple hgr-byte) from row to pixelmatrix
for (int count = 0, bufxoffset = 0; count < 7; count++, bufxoffset += 2)
{
hgrpixelmatrix[matx+count][maty] = *(currsourceptr+bufxoffset);
// transfer up to 6 mixed (half-)pixels of current column to framebuffer
currptr = currdestptr+bufxoffset;
if (hgrlinesabove)
currptr += g_nFrameBufferPitch << 1;
// color mixing between adjacent scanlines at current x position
MixColorsVertical(matx+count, maty);
for (i = istart;
i <= iend;
currptr -= g_nFrameBufferPitch, i++) {
*currptr = *(currptr+1) = colormixbuffer[i];
// transfer up to 6 mixed (half-)pixels of current column to framebuffer
BYTE* currptr = currdestptr+bufxoffset;
if (hgrlinesabove)
currptr += g_nFrameBufferPitch * 2;
for (int i = istart; i <= iend; currptr -= g_nFrameBufferPitch, i++)
{
*currptr = *(currptr+1) = colormixbuffer[i];
}
}
}
}
// For tv emulation HGR Video Mode
static void __stdcall CopyMixedSource(int x, int y, int sourcex, int sourcey)
{
if (!g_bIsFullScreen || !GetFullScreen32Bit())
{
CopyMixedSource8(x,y,sourcex,sourcey);
return;
}
const BYTE* const currsourceptr = g_aSourceStartofLine[sourcey]+sourcex;
UINT32* const currdestptr = (UINT32*) (g_aFrameBufferOffset[ y*2 ] + (x*2)*sizeof(UINT32));
const int matx = x;
const int maty = HGR_MATRIX_YOFFSET + y;
const int hgrlinesabove = (y > 0) ? 1 : 0;
const int hgrlinesbelow = SW_MIXED ? ((y < 159)? 1:0) : ((y < 191)? 1:0);
const int istart = 2 - (hgrlinesabove*2);
const int iend = 3 + (hgrlinesbelow*2);
// transfer 7 pixels (i.e. the visible part of an apple hgr-byte) from row to pixelmatrix
for (int count = 0, bufxoffset = 0; count < 7; count++, bufxoffset += 2)
{
hgrpixelmatrix[matx+count][maty] = *(currsourceptr+bufxoffset);
// color mixing between adjacent scanlines at current x position
MixColorsVertical(matx+count, maty);
// transfer up to 6 mixed (half-)pixels of current column to framebuffer
UINT32* currptr = currdestptr+bufxoffset;
if (hgrlinesabove)
currptr += (g_nFrameBufferPitch / sizeof(UINT32)) * 2;
for (int i = istart; i <= iend; currptr -= g_nFrameBufferPitch/sizeof(UINT32), i++)
{
RGBQUAD& rRGB = g_pFramebufferinfo->bmiColors[ colormixbuffer[i] ];
const UINT32 rgb = (((UINT32)rRGB.rgbRed)<<16) | (((UINT32)rRGB.rgbGreen)<<8) | ((UINT32)rRGB.rgbBlue);
*currptr = *(currptr+1) = rgb;
}
}
}
//===========================================================================
bool UpdateHiResCell (int x, int y, int xpixel, int ypixel, int offset)
@ -3339,6 +3399,12 @@ void VideoRealizePalette(HDC dc)
}
//===========================================================================
VideoUpdateFuncPtr_t VideoRedrawScreen (UINT n)
{
g_VideoForceFullRedraw = n;
return VideoRefreshScreen();
}
VideoUpdateFuncPtr_t VideoRedrawScreen ()
{
g_VideoForceFullRedraw = 1;
@ -3384,7 +3450,8 @@ VideoUpdateFuncPtr_t VideoRefreshScreen ()
bool bMixed = (SW_MIXED) ? true : false;
_Video_RedrawScreen( pfUpdate, bMixed );
g_VideoForceFullRedraw = 0;
//g_VideoForceFullRedraw = 0;
if (g_VideoForceFullRedraw) --g_VideoForceFullRedraw;
return pfUpdate;
}
@ -3442,12 +3509,22 @@ void _Video_RedrawScreen( VideoUpdateFuncPtr_t pfUpdate, bool bMixed )
// Shift-Print Screen saves only the even rows.
// NOTE: Keep in sync with _Video_RedrawScreen() & Video_MakeScreenShot()
// [TC-10/06-2014] In full-screen mode, there's noticable flicker when blanking out these alt lines.
// - Consider doing this 50% operation in CopySource() instead
for( int y = 1; y < FRAMEBUFFER_H; y += 2 )
{
unsigned char *pSrc = g_aFrameBufferOffset[y];
for( int x = 0; x < FRAMEBUFFER_W; x++ )
{
if (!g_bIsFullScreen || !GetFullScreen32Bit())
{
*pSrc++ = 0;
unsigned char *pSrc = g_aFrameBufferOffset[y]; // 8-bit
for( int x = 0; x < FRAMEBUFFER_W; x++ )
*pSrc++ = 0;
}
else
{
unsigned int *pSrc = (unsigned int *) g_aFrameBufferOffset[y]; // 32-bit
for( int x = 0; x < FRAMEBUFFER_W; x++ )
*pSrc++ = 0;
}
}
}

View File

@ -97,6 +97,7 @@ void VideoDisplayLogo ();
BOOL VideoHasRefreshed ();
void VideoInitialize ();
void VideoRealizePalette (HDC);
VideoUpdateFuncPtr_t VideoRedrawScreen (UINT);
VideoUpdateFuncPtr_t VideoRedrawScreen ();
VideoUpdateFuncPtr_t VideoRefreshScreen ();
void VideoReinitialize ();
@ -110,7 +111,7 @@ DWORD VideoSetSnapshot(SS_IO_Video* pSS);
extern bool g_bVideoDisplayPage2;
extern bool g_VideoForceFullRedraw;
extern /*bool*/ UINT g_VideoForceFullRedraw;
void _Video_Dirty();
void _Video_RedrawScreen( VideoUpdateFuncPtr_t update, bool bMixed = false );