mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-09-29 06:55:15 +00:00
Removed border from:
. final rendered window . print-screen bmps (both sizes) Fixed full-screen so that: . all mode (RUNNING, DEBUG and LOGO) all occupy the same screen position . there's no intermediate data drawn out of position when first switching to full-screen Tested on Win7 and Win10
This commit is contained in:
parent
80ad4df409
commit
d23ae15774
@ -568,7 +568,7 @@ void StretchBltMemToFrameDC(void)
|
|||||||
nViewportCX, nViewportCY, // int nWidthDest, int nHeightDest,
|
nViewportCX, nViewportCY, // int nWidthDest, int nHeightDest,
|
||||||
GetDebuggerMemDC(), // HDC hdcSrc,
|
GetDebuggerMemDC(), // HDC hdcSrc,
|
||||||
0, 0, // int nXOriginSrc, int nYOriginSrc,
|
0, 0, // int nXOriginSrc, int nYOriginSrc,
|
||||||
FRAMEBUFFER_W, FRAMEBUFFER_H, // int nWidthSrc, int nHeightSrc,
|
FRAMEBUFFER_BORDERLESS_W, FRAMEBUFFER_BORDERLESS_H, // int nWidthSrc, int nHeightSrc,
|
||||||
SRCCOPY // DWORD dwRop
|
SRCCOPY // DWORD dwRop
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -65,8 +65,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#define MAGICY 5 // 3D border between Apple window & Title bar
|
#define MAGICY 5 // 3D border between Apple window & Title bar
|
||||||
|
|
||||||
static const int kDEFAULT_VIEWPORT_SCALE = 2;
|
static const int kDEFAULT_VIEWPORT_SCALE = 2;
|
||||||
int g_nViewportCX = FRAMEBUFFER_W * kDEFAULT_VIEWPORT_SCALE;
|
int g_nViewportCX = FRAMEBUFFER_BORDERLESS_W * kDEFAULT_VIEWPORT_SCALE;
|
||||||
int g_nViewportCY = FRAMEBUFFER_H * kDEFAULT_VIEWPORT_SCALE;
|
int g_nViewportCY = FRAMEBUFFER_BORDERLESS_H * kDEFAULT_VIEWPORT_SCALE;
|
||||||
static int g_nViewportScale = kDEFAULT_VIEWPORT_SCALE; // saved REGSAVE
|
static int g_nViewportScale = kDEFAULT_VIEWPORT_SCALE; // saved REGSAVE
|
||||||
static int g_nMaxViewportScale = kDEFAULT_VIEWPORT_SCALE;
|
static int g_nMaxViewportScale = kDEFAULT_VIEWPORT_SCALE;
|
||||||
|
|
||||||
@ -568,11 +568,7 @@ static void DrawFrameWindow ()
|
|||||||
else if (g_nAppMode == MODE_DEBUG)
|
else if (g_nAppMode == MODE_DEBUG)
|
||||||
DebugDisplay(1);
|
DebugDisplay(1);
|
||||||
else
|
else
|
||||||
// Win7: In fullscreen mode with 1 redraw the screen doesn't get redrawn.
|
VideoRedrawScreen(g_bIsFullScreen ? 1 : 0); // On WM_PAINT: delay 1 refresh before rendering full-screen
|
||||||
// TC: 07/01/2015: Tryed with MP's double-buffered DX full-screen code, but still the same.
|
|
||||||
//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 nor does Win8, just Win7 or older OS's)
|
|
||||||
//VideoRefreshScreen(0);
|
|
||||||
VideoRedrawScreen();
|
|
||||||
|
|
||||||
if (g_bPaintingWindow)
|
if (g_bPaintingWindow)
|
||||||
EndPaint(g_hFrameWindow,&ps);
|
EndPaint(g_hFrameWindow,&ps);
|
||||||
@ -2167,8 +2163,8 @@ int SetViewportScale(int nNewScale)
|
|||||||
nNewScale = g_nMaxViewportScale;
|
nNewScale = g_nMaxViewportScale;
|
||||||
|
|
||||||
g_nViewportScale = nNewScale;
|
g_nViewportScale = nNewScale;
|
||||||
g_nViewportCX = g_nViewportScale * FRAMEBUFFER_W;
|
g_nViewportCX = g_nViewportScale * FRAMEBUFFER_BORDERLESS_W;
|
||||||
g_nViewportCY = g_nViewportScale * FRAMEBUFFER_H;
|
g_nViewportCY = g_nViewportScale * FRAMEBUFFER_BORDERLESS_H;
|
||||||
|
|
||||||
return nNewScale;
|
return nNewScale;
|
||||||
}
|
}
|
||||||
@ -2267,8 +2263,8 @@ void FrameCreateWindow(void)
|
|||||||
int nOldViewportCX = g_nViewportCX;
|
int nOldViewportCX = g_nViewportCX;
|
||||||
int nOldViewportCY = g_nViewportCY;
|
int nOldViewportCY = g_nViewportCY;
|
||||||
|
|
||||||
g_nViewportCX = FRAMEBUFFER_W * 2;
|
g_nViewportCX = FRAMEBUFFER_BORDERLESS_W * 2;
|
||||||
g_nViewportCY = FRAMEBUFFER_H * 2;
|
g_nViewportCY = FRAMEBUFFER_BORDERLESS_H * 2;
|
||||||
GetWidthHeight(nWidth, nHeight); // Probe with 2x dimensions
|
GetWidthHeight(nWidth, nHeight); // Probe with 2x dimensions
|
||||||
|
|
||||||
g_nViewportCX = nOldViewportCX;
|
g_nViewportCX = nOldViewportCX;
|
||||||
|
@ -11,14 +11,22 @@
|
|||||||
#define VIEWPORTY 5
|
#define VIEWPORTY 5
|
||||||
|
|
||||||
// 560 = Double Hi-Res
|
// 560 = Double Hi-Res
|
||||||
// 384 = Doule Scan Line
|
// 384 = Double Scan Line
|
||||||
|
#define FRAMEBUFFER_BORDERLESS_W 560
|
||||||
|
#define FRAMEBUFFER_BORDERLESS_H 384
|
||||||
// NTSC_BEGIN
|
// NTSC_BEGIN
|
||||||
#if 0
|
#if 0
|
||||||
#define FRAMEBUFFER_W 560
|
// TC: No good as NTSC render code writes to border area:
|
||||||
#define FRAMEBUFFER_H 384
|
// . NTSC.cpp: updateVideoScannerHorzEOL(): "NOTE: This writes out-of-bounds for a 560x384 framebuffer"
|
||||||
|
#define BORDER_W 0
|
||||||
|
#define BORDER_H 0
|
||||||
|
#define FRAMEBUFFER_W FRAMEBUFFER_BORDERLESS_W
|
||||||
|
#define FRAMEBUFFER_H FRAMEBUFFER_BORDERLESS_H
|
||||||
#else
|
#else
|
||||||
#define FRAMEBUFFER_W 600
|
#define BORDER_W 20
|
||||||
#define FRAMEBUFFER_H 420
|
#define BORDER_H 18
|
||||||
|
#define FRAMEBUFFER_W (FRAMEBUFFER_BORDERLESS_W + BORDER_W*2)
|
||||||
|
#define FRAMEBUFFER_H (FRAMEBUFFER_BORDERLESS_H + BORDER_H*2)
|
||||||
#endif
|
#endif
|
||||||
// NTSC_END
|
// NTSC_END
|
||||||
|
|
||||||
|
@ -996,7 +996,7 @@ void VideoDisplayLogo ()
|
|||||||
// Draw Logo at top of screen so when the Apple display is refreshed it will automagically clear it
|
// Draw Logo at top of screen so when the Apple display is refreshed it will automagically clear it
|
||||||
if( g_bIsFullScreen )
|
if( g_bIsFullScreen )
|
||||||
{
|
{
|
||||||
g_nLogoX = 10;
|
g_nLogoX = 0;
|
||||||
g_nLogoY = 0;
|
g_nLogoY = 0;
|
||||||
}
|
}
|
||||||
VideoDrawLogoBitmap( hFrameDC, g_nLogoX, g_nLogoY, bm.bmWidth, bm.bmHeight, scale );
|
VideoDrawLogoBitmap( hFrameDC, g_nLogoX, g_nLogoY, bm.bmWidth, bm.bmHeight, scale );
|
||||||
@ -1094,11 +1094,11 @@ void VideoDisplayLogo ()
|
|||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
void VideoRedrawScreen ()
|
void VideoRedrawScreen (UINT uDelayRefresh /* =0 */)
|
||||||
{
|
{
|
||||||
g_VideoForceFullRedraw = 1;
|
g_VideoForceFullRedraw = 1;
|
||||||
|
|
||||||
VideoRefreshScreen( g_uVideoMode );
|
VideoRefreshScreen( g_uVideoMode, uDelayRefresh );
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
@ -1136,8 +1136,11 @@ static void DebugRefresh(char uDebugFlag)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void VideoRefreshScreen ( int bVideoModeFlags )
|
void VideoRefreshScreen ( int bVideoModeFlags, UINT uDelayRefresh /* =0 */ )
|
||||||
{
|
{
|
||||||
|
static UINT uDelayRefreshCount = 0;
|
||||||
|
if (uDelayRefresh) uDelayRefreshCount = uDelayRefresh;
|
||||||
|
|
||||||
#if defined(_DEBUG) && defined(DEBUG_REFRESH_TIMINGS)
|
#if defined(_DEBUG) && defined(DEBUG_REFRESH_TIMINGS)
|
||||||
DebugRefresh(0);
|
DebugRefresh(0);
|
||||||
#endif
|
#endif
|
||||||
@ -1165,30 +1168,39 @@ void VideoRefreshScreen ( int bVideoModeFlags )
|
|||||||
|
|
||||||
if (hFrameDC)
|
if (hFrameDC)
|
||||||
{
|
{
|
||||||
// Display the logo for a second so that any full screen screen-caps will have it
|
if (uDelayRefreshCount)
|
||||||
static int nLogo = 30; // HACK
|
|
||||||
if ((nLogo > 0) && nLogo-- )
|
|
||||||
{
|
{
|
||||||
int nScale = g_bIsFullScreen ? 1 : GetViewportScale();
|
// Delay the refresh in full-screen mode (to allow screen-capabilities to take effect) - required for Win7 (and others?)
|
||||||
VideoDrawLogoBitmap( hFrameDC, g_nLogoX, g_nLogoY, 560, 384, nScale );
|
--uDelayRefreshCount;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
int xDst = 0;
|
||||||
|
int yDst = 0;
|
||||||
|
|
||||||
|
if (g_bIsFullScreen)
|
||||||
|
{
|
||||||
|
// Why the need to set the mid-position here, but not for (full-screen) LOGO or DEBUG modes?
|
||||||
|
xDst = (g_nDDFullScreenW-W)/2 - VIEWPORTX*2;
|
||||||
|
yDst = (g_nDDFullScreenH-H)/2;
|
||||||
|
}
|
||||||
|
|
||||||
StretchBlt(
|
StretchBlt(
|
||||||
hFrameDC,
|
hFrameDC,
|
||||||
0, 0,
|
xDst, yDst, // xDst, yDst
|
||||||
W, // dst
|
W, H, // wDst, hDst
|
||||||
H, // dst
|
|
||||||
g_hDeviceDC,
|
g_hDeviceDC,
|
||||||
0, 0,
|
BORDER_W, BORDER_H, // xSrc, ySrc
|
||||||
FRAMEBUFFER_W, FRAMEBUFFER_H, // src // NOT 560, 384
|
FRAMEBUFFER_BORDERLESS_W, FRAMEBUFFER_BORDERLESS_H, // wSrc, hSrc
|
||||||
SRCCOPY );
|
SRCCOPY );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GdiFlush();
|
GdiFlush();
|
||||||
|
|
||||||
FrameReleaseVideoDC();
|
FrameReleaseVideoDC();
|
||||||
|
|
||||||
if (g_VideoForceFullRedraw)
|
g_VideoForceFullRedraw = 0;
|
||||||
--g_VideoForceFullRedraw;
|
|
||||||
// NTSC_END
|
// NTSC_END
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1665,8 +1677,8 @@ void Video_MakeScreenShot(FILE *pFile)
|
|||||||
|
|
||||||
Video_SetBitmapHeader(
|
Video_SetBitmapHeader(
|
||||||
pBmp,
|
pBmp,
|
||||||
g_iScreenshotType ? FRAMEBUFFER_W/2 :FRAMEBUFFER_W,
|
g_iScreenshotType ? FRAMEBUFFER_BORDERLESS_W/2 : FRAMEBUFFER_BORDERLESS_W,
|
||||||
g_iScreenshotType ? FRAMEBUFFER_H/2 : FRAMEBUFFER_H,
|
g_iScreenshotType ? FRAMEBUFFER_BORDERLESS_H/2 : FRAMEBUFFER_BORDERLESS_H,
|
||||||
32
|
32
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1680,14 +1692,13 @@ void Video_MakeScreenShot(FILE *pFile)
|
|||||||
/**/ sIfSizeZeroOrUnknown_BadWinBmpHeaderPackingSize54[0]=0;
|
/**/ sIfSizeZeroOrUnknown_BadWinBmpHeaderPackingSize54[0]=0;
|
||||||
|
|
||||||
// Write Header
|
// Write Header
|
||||||
int nLen;
|
|
||||||
fwrite( pBmp, sizeof( WinBmpHeader_t ), 1, pFile );
|
fwrite( pBmp, sizeof( WinBmpHeader_t ), 1, pFile );
|
||||||
|
|
||||||
uint32_t *pSrc;
|
uint32_t *pSrc;
|
||||||
#if VIDEO_SCREENSHOT_PALETTE
|
#if VIDEO_SCREENSHOT_PALETTE
|
||||||
// Write Palette Data
|
// Write Palette Data
|
||||||
pSrc = ((uint8_t*)g_pFramebufferinfo) + sizeof(BITMAPINFOHEADER);
|
pSrc = ((uint8_t*)g_pFramebufferinfo) + sizeof(BITMAPINFOHEADER);
|
||||||
nLen = g_tBmpHeader.nPaletteColors * sizeof(bgra_t); // RGBQUAD
|
int nLen = g_tBmpHeader.nPaletteColors * sizeof(bgra_t); // RGBQUAD
|
||||||
fwrite( pSrc, nLen, 1, pFile );
|
fwrite( pSrc, nLen, 1, pFile );
|
||||||
pSrc += nLen;
|
pSrc += nLen;
|
||||||
#endif
|
#endif
|
||||||
@ -1696,7 +1707,8 @@ void Video_MakeScreenShot(FILE *pFile)
|
|||||||
// No need to use GetDibBits() since we already have http://msdn.microsoft.com/en-us/library/ms532334.aspx
|
// No need to use GetDibBits() since we already have http://msdn.microsoft.com/en-us/library/ms532334.aspx
|
||||||
// @reference: "Storing an Image" http://msdn.microsoft.com/en-us/library/ms532340(VS.85).aspx
|
// @reference: "Storing an Image" http://msdn.microsoft.com/en-us/library/ms532340(VS.85).aspx
|
||||||
pSrc = (uint32_t*) g_pFramebufferbits;
|
pSrc = (uint32_t*) g_pFramebufferbits;
|
||||||
nLen = (g_tBmpHeader.nWidthPixels * g_tBmpHeader.nHeightPixels * g_tBmpHeader.nBitsPerPixel) / 8;
|
pSrc += BORDER_H * FRAMEBUFFER_W; // Skip top border
|
||||||
|
pSrc += BORDER_W; // Skip left border
|
||||||
|
|
||||||
if( g_iScreenshotType == SCREENSHOT_280x192 )
|
if( g_iScreenshotType == SCREENSHOT_280x192 )
|
||||||
{
|
{
|
||||||
@ -1708,21 +1720,26 @@ void Video_MakeScreenShot(FILE *pFile)
|
|||||||
// 50% Half Scan Line clears every odd scanline.
|
// 50% Half Scan Line clears every odd scanline.
|
||||||
// SHIFT+PrintScreen saves only the even rows.
|
// SHIFT+PrintScreen saves only the even rows.
|
||||||
// NOTE: Keep in sync with _Video_RedrawScreen() & Video_MakeScreenShot()
|
// NOTE: Keep in sync with _Video_RedrawScreen() & Video_MakeScreenShot()
|
||||||
for( int y = 0; y < FRAMEBUFFER_H/2; y++ )
|
for( int y = 0; y < FRAMEBUFFER_BORDERLESS_H/2; y++ )
|
||||||
{
|
{
|
||||||
pDst = aScanLine;
|
pDst = aScanLine;
|
||||||
for( int x = 0; x < FRAMEBUFFER_W/2; x++ )
|
for( int x = 0; x < FRAMEBUFFER_BORDERLESS_W/2; x++ )
|
||||||
{
|
{
|
||||||
*pDst++ = pSrc[1]; // correction for left edge loss of scaled scanline [Bill Buckel, B#18928]
|
*pDst++ = pSrc[1]; // correction for left edge loss of scaled scanline [Bill Buckel, B#18928]
|
||||||
pSrc += 2; // skip odd pixels
|
pSrc += 2; // skip odd pixels
|
||||||
}
|
}
|
||||||
fwrite( aScanLine, FRAMEBUFFER_W/2, 1, pFile );
|
fwrite( aScanLine, sizeof(uint32_t), FRAMEBUFFER_BORDERLESS_W/2, pFile );
|
||||||
pSrc += FRAMEBUFFER_W; // scan lines doubled - skip odd ones
|
pSrc += FRAMEBUFFER_W; // scan lines doubled - skip odd ones
|
||||||
|
pSrc += BORDER_W*2; // Skip right border & next line's left border
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fwrite( pSrc, nLen, 1, pFile );
|
for( int y = 0; y < FRAMEBUFFER_BORDERLESS_H; y++ )
|
||||||
|
{
|
||||||
|
fwrite( pSrc, sizeof(uint32_t), FRAMEBUFFER_BORDERLESS_W, pFile );
|
||||||
|
pSrc += FRAMEBUFFER_W;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // SCREENSHOT_BMP
|
#endif // SCREENSHOT_BMP
|
||||||
|
|
||||||
|
@ -170,8 +170,8 @@ void VideoDrawLogoBitmap(HDC hDstDC, int xoff, int yoff, int srcw, int srch,
|
|||||||
void VideoDisplayLogo ();
|
void VideoDisplayLogo ();
|
||||||
void VideoInitialize ();
|
void VideoInitialize ();
|
||||||
void VideoRealizePalette (HDC);
|
void VideoRealizePalette (HDC);
|
||||||
void VideoRedrawScreen ();
|
void VideoRedrawScreen (UINT uDelayRefresh = 0);
|
||||||
void VideoRefreshScreen (int bVideoFlags );
|
void VideoRefreshScreen (int bVideoFlags, UINT uDelayRefresh =0 );
|
||||||
void VideoReinitialize ();
|
void VideoReinitialize ();
|
||||||
void VideoResetState ();
|
void VideoResetState ();
|
||||||
WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles);
|
WORD VideoGetScannerAddress(bool* pbVblBar_OUT, const DWORD uExecutedCycles);
|
||||||
|
Loading…
Reference in New Issue
Block a user