Monochrome Half Pixel Shift

Hooked up 4 modes to F9
This commit is contained in:
mpohoreski 2011-01-08 02:58:20 +00:00
parent ca9dea94b8
commit b3ce90d915
4 changed files with 473 additions and 129 deletions

View File

@ -608,8 +608,6 @@ static void DrawStatusArea (HDC passdc, int drawflags)
{ {
_tcscat( title," 50% " ); _tcscat( title," 50% " );
} }
extern char *g_apVideoModeDesc[ NUM_VIDEO_MODES ];
_tcscat( title, g_apVideoModeDesc[ g_eVideoType ] ); _tcscat( title, g_apVideoModeDesc[ g_eVideoType ] );
} }

View File

@ -75,30 +75,6 @@ TCHAR soundchoices[] = TEXT("Disabled\0")
TEXT("PC Speaker (translated)\0") TEXT("PC Speaker (translated)\0")
TEXT("Sound Card\0"); TEXT("Sound Card\0");
// Must match NUM_VIDEO_MODES!
TCHAR videochoices[] =
TEXT("Monochrome (Custom)\0")
TEXT("Color (standard)\0")
TEXT("Color (text optimized)\0")
TEXT("Color (TV emulation)\0")
TEXT("Color (Half-Shift)\0")
TEXT("Monochrome - Amber\0")
TEXT("Monochrome - Green\0")
TEXT("Monochrome - White\0")
;
char *g_apVideoModeDesc[ NUM_VIDEO_MODES ] =
{
"Custom",
"Std.",
"Text",
"TV",
"HalfPixel",
"Amber",
"Green",
"White"
};
TCHAR discchoices[] = TEXT("Authentic Speed\0") TCHAR discchoices[] = TEXT("Authentic Speed\0")
TEXT("Enhanced Speed\0"); TEXT("Enhanced Speed\0");
@ -479,7 +455,7 @@ static BOOL CALLBACK ConfigDlgProc( HWND window,
else else
FillComboBox(window,IDC_COMPUTER,computerchoices,iApple2String); FillComboBox(window,IDC_COMPUTER,computerchoices,iApple2String);
FillComboBox(window,IDC_VIDEOTYPE,videochoices,g_eVideoType); FillComboBox(window,IDC_VIDEOTYPE,g_aVideoChoices,g_eVideoType);
CheckDlgButton(window, IDC_CHECK_HALF_SCAN_LINES, g_uHalfScanLines ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(window, IDC_CHECK_HALF_SCAN_LINES, g_uHalfScanLines ? BST_CHECKED : BST_UNCHECKED);
FillComboBox(window,IDC_SERIALPORT, sg_SSC.GetSerialPortChoices(), sg_SSC.GetSerialPort()); FillComboBox(window,IDC_SERIALPORT, sg_SSC.GetSerialPortChoices(), sg_SSC.GetSerialPort());

View File

@ -130,21 +130,21 @@ enum Color_Palette_Index_e
, NUM_COLOR_PALETTE , NUM_COLOR_PALETTE
}; };
const int SRCOFFS_40COL = 0; // 0 const int SRCOFFS_40COL = 0; // 0
const int SRCOFFS_IIPLUS = (SRCOFFS_40COL + 256); // 256 const int SRCOFFS_IIPLUS = (SRCOFFS_40COL + 256); // 256
const int SRCOFFS_80COL = (SRCOFFS_IIPLUS + 256); // 512 const int SRCOFFS_80COL = (SRCOFFS_IIPLUS + 256); // 512
const int SRCOFFS_LORES = (SRCOFFS_80COL + 128); // 640 const int SRCOFFS_LORES = (SRCOFFS_80COL + 128); // 640
const int SRCOFFS_HIRES = (SRCOFFS_LORES + 16); // 656 const int SRCOFFS_HIRES = (SRCOFFS_LORES + 16); // 656
const int SRCOFFS_DHIRES = (SRCOFFS_HIRES + 512); // 1168 const int SRCOFFS_DHIRES = (SRCOFFS_HIRES + 512); // 1168
const int SRCOFFS_TOTAL = (SRCOFFS_DHIRES + 2560); // 3278 const int SRCOFFS_TOTAL = (SRCOFFS_DHIRES + 2560); // 3278
#define SW_80COL (g_bVideoMode & VF_80COL) #define SW_80COL (g_bVideoMode & VF_80COL)
#define SW_DHIRES (g_bVideoMode & VF_DHIRES) #define SW_DHIRES (g_bVideoMode & VF_DHIRES)
#define SW_HIRES (g_bVideoMode & VF_HIRES) #define SW_HIRES (g_bVideoMode & VF_HIRES)
#define SW_MASK2 (g_bVideoMode & VF_MASK2) #define SW_MASK2 (g_bVideoMode & VF_MASK2)
#define SW_MIXED (g_bVideoMode & VF_MIXED) #define SW_MIXED (g_bVideoMode & VF_MIXED)
#define SW_PAGE2 (g_bVideoMode & VF_PAGE2) #define SW_PAGE2 (g_bVideoMode & VF_PAGE2)
#define SW_TEXT (g_bVideoMode & VF_TEXT) #define SW_TEXT (g_bVideoMode & VF_TEXT)
#define SETSOURCEPIXEL(x,y,c) g_aSourceStartofLine[(y)][(x)] = (c) #define SETSOURCEPIXEL(x,y,c) g_aSourceStartofLine[(y)][(x)] = (c)
@ -227,33 +227,74 @@ static bool bVideoScannerNTSC = true; // NTSC video scanning (or PAL)
//------------------------------------- //-------------------------------------
// Video consts: // Video consts:
const UINT nVBlStop_NTSC = 21; const UINT nVBlStop_NTSC = 21;
const UINT nVBlStop_PAL = 29; const UINT nVBlStop_PAL = 29;
// NOTE: KEEP IN SYNC: VideoType_e g_aVideoChoices g_apVideoModeDesc
TCHAR g_aVideoChoices[] =
TEXT("Monochrome (Custom)\0")
TEXT("Color (standard)\0")
TEXT("Color (text optimized)\0")
TEXT("Color (TV emulation)\0")
TEXT("Color (Half-Shift)\0")
TEXT("Monochrome - Amber\0")
TEXT("Monochrome - Green\0")
TEXT("Monochrome - White\0")
TEXT("Monochrome Half Pixel 50%\0")
TEXT("Monochrome Half Pixel 75%\0")
TEXT("Monochrome Half Pixel Emboss\0")
TEXT("Monochrome Half Pixel Fake\0")
;
// NOTE: KEEP IN SYNC: VideoType_e g_aVideoChoices g_apVideoModeDesc
// The window title will be set to this.
char *g_apVideoModeDesc[ NUM_VIDEO_MODES ] =
{
"Custom"
,"Std."
,"Text"
,"TV"
,"HalfPixel"
,"Amber"
,"Green"
,"White"
,"Monochrome HalfPixel 50"
,"Monochrome HalfPixel 75"
,"Monochrome HalfPixel Emboss"
,"Monochrome HalfPixel Fake"
};
// Prototypes (Private) _____________________________________________ // Prototypes (Private) _____________________________________________
void DrawDHiResSource (); void DrawDHiResSource ();
void DrawHiResSource (); void DrawHiResSource ();
void DrawHiResSourceHalfShiftFull (); void DrawHiResSourceHalfShiftFull ();
void DrawHiResSourceHalfShiftDim (); void DrawHiResSourceHalfShiftDim ();
void DrawLoResSource (); void DrawLoResSource ();
void DrawMonoDHiResSource ();
void DrawMonoHiResSource ();
void DrawMonoLoResSource ();
void DrawMonoTextSource (HDC dc);
void DrawTextSource (HDC dc);
bool g_bDisplayPrintScreenFileName = false; void DrawTextSource (HDC dc);
void Util_MakeScreenShotFileName( char *pFinalFileName_ ); // Monochrome
bool Util_TestScreenShotFileName( const char *pFileName ); void DrawMonoDHiResSource ();
// true = 280x192 void DrawMonoHiResSource ();
// false = 560x384 void DrawMonoLoResSource ();
void Video_SaveScreenShot( const char *pScreenShotFileName ); void DrawMonoTextSource (HDC dc);
void Video_MakeScreenShot( FILE *pFile ); // Monochrome Half-Pixel Support
void CreateColorLookup_MonoHiResHalfPixel_50();
void CreateColorLookup_MonoHiResHalfPixel_75();
void CreateColorLookup_MonoHiResHalfPixel_Emboss();
void CreateColorLookup_MonoHiResHalfPixel_Fake();
int GetMonochromeIndex(); bool g_bDisplayPrintScreenFileName = false;
void Util_MakeScreenShotFileName( char *pFinalFileName_ );
bool Util_TestScreenShotFileName( const char *pFileName );
// true = 280x192
// false = 560x384
void Video_SaveScreenShot( const char *pScreenShotFileName );
void Video_MakeScreenShot( FILE *pFile );
/** Our BitClit() / VRAM_Copy() int GetMonochromeIndex();
/** Our BitBlit() / VRAM_Copy()
@param dx Dst X @param dx Dst X
@param dy Dst Y @param dy Dst Y
@param w Width (same for src & dst) @param w Width (same for src & dst)
@ -292,16 +333,17 @@ void CopySource (int dx, int dy, int w, int h, int sx, int sy )
//=========================================================================== //===========================================================================
void CreateFrameOffsetTable (LPBYTE addr, LONG pitch) { void CreateFrameOffsetTable (LPBYTE addr, LONG pitch)
if (framebufferaddr == addr && {
g_nFrameBufferPitch == pitch) if ((framebufferaddr == addr) && (g_nFrameBufferPitch == pitch))
return; return;
framebufferaddr = addr;
g_nFrameBufferPitch = pitch;
// CREATE THE OFFSET TABLE FOR EACH SCAN LINE IN THE FRAME BUFFER framebufferaddr = addr;
for (int y = 0; y < FRAMEBUFFER_H; y++) g_nFrameBufferPitch = pitch;
g_aFrameBufferOffset[y] = framebufferaddr + g_nFrameBufferPitch*((FRAMEBUFFER_H-1)-y);
// CREATE THE OFFSET TABLE FOR EACH SCAN LINE IN THE FRAME BUFFER
for (int y = 0; y < FRAMEBUFFER_H; y++)
g_aFrameBufferOffset[y] = framebufferaddr + g_nFrameBufferPitch*((FRAMEBUFFER_H-1)-y);
} }
//=========================================================================== //===========================================================================
@ -545,25 +587,33 @@ void CreateDIBSections ()
// DRAW THE SOURCE IMAGE INTO THE SOURCE BIT BUFFER // DRAW THE SOURCE IMAGE INTO THE SOURCE BIT BUFFER
ZeroMemory(g_pSourcePixels,SRCOFFS_TOTAL*512); ZeroMemory(g_pSourcePixels,SRCOFFS_TOTAL*512);
if((g_eVideoType != VT_MONO_CUSTOM) && if (g_eVideoType <VT_MONO_AMBER)
(g_eVideoType != VT_MONO_AMBER ) &&
(g_eVideoType != VT_MONO_GREEN ) &&
(g_eVideoType != VT_MONO_WHITE ))
// (g_eVideoType != VT_MONO_AUTHENTIC))
{ {
DrawTextSource(sourcedc); DrawTextSource(sourcedc);
DrawLoResSource(); DrawLoResSource();
if (g_eVideoType == VT_COLOR_HALF_SHIFT_DIM) if (g_eVideoType == VT_COLOR_HALF_SHIFT_DIM)
DrawHiResSourceHalfShiftDim(); DrawHiResSourceHalfShiftDim();
else else
DrawHiResSource(); DrawHiResSource();
DrawDHiResSource(); DrawDHiResSource();
} }
else else
{ {
DrawMonoTextSource(sourcedc); DrawMonoTextSource(sourcedc);
DrawMonoLoResSource(); DrawMonoLoResSource();
DrawMonoHiResSource();
switch(g_eVideoType)
{
case VT_MONO_AMBER :
case VT_MONO_GREEN :
case VT_MONO_WHITE : DrawMonoHiResSource(); break;
case VT_MONO_HALFPIXEL_50 : CreateColorLookup_MonoHiResHalfPixel_50(); break;
case VT_MONO_HALFPIXEL_95 : CreateColorLookup_MonoHiResHalfPixel_75(); break;
case VT_MONO_HALFPIXEL_EMBOSS: CreateColorLookup_MonoHiResHalfPixel_Emboss(); break;
default: DrawMonoHiResSource();
}
DrawMonoDHiResSource(); DrawMonoDHiResSource();
} }
DeleteDC(sourcedc); DeleteDC(sourcedc);
@ -982,7 +1032,7 @@ void DrawMonoHiResSource ()
{ {
int iMonochrome = GetMonochromeIndex(); int iMonochrome = GetMonochromeIndex();
#if 0 #if 1
for (int column = 0; column < 512; column += 16) for (int column = 0; column < 512; column += 16)
{ {
for (int y = 0; y < 512; y += 2) for (int y = 0; y < 512; y += 2)
@ -1114,6 +1164,313 @@ void DrawMonoHiResSource ()
#endif #endif
} }
//===========================================================================
void CreateColorLookup_MonoHiResHalfPixel_50 ()
{
int iMonochrome = GetMonochromeIndex();
for (int iColumn = 0; iColumn < 16; iColumn++)
{
int coloffs = iColumn << 5;
for (unsigned iByte = 0; iByte < 256; iByte++)
{
int aPixels[11];
aPixels[ 0] = iColumn & 4;
aPixels[ 1] = iColumn & 8;
aPixels[ 9] = iColumn & 1;
aPixels[10] = iColumn & 2;
int nBitMask = 1;
int iPixel;
for (iPixel = 2; iPixel < 9; iPixel++)
{
aPixels[iPixel] = ((iByte & nBitMask) != 0);
nBitMask <<= 1;
}
int hibit = ((iByte & 0x80) != 0);
int x = 0;
int y = iByte << 1;
while (x < 28)
{
int adj = (x >= 14) << 1;
int odd = (x >= 14);
for (iPixel = 2; iPixel < 9; iPixel++)
{
int color = CM_Black;
int color1 = BLACK;
int color2 = BLACK;
// 50% luminance: Gumball Logo looks "blocky", but silicon salad menu looks very good, and test pattern passes.
if (aPixels[iPixel])
{
color = ((odd ^ (iPixel&1)) << 1) | hibit;
}
switch(color)
{
case CM_Magenta: color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Blue : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Green : color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Orange : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Black : color1 = BLACK ; color2 = BLACK ; break;
case CM_White : color1 = iMonochrome ; color2 = iMonochrome ; break;
case NUM_COLOR_MAPPING: color1 = color2 = iMonochrome+1; break;
default: break;
}
// Colors - Top/Bottom Left/Right
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y ,color1); // TL buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y ,color2); // TR buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y+1,color1); // BL
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y+1,color2); // BR
x += 2;
}
}
}
}
}
//===========================================================================
void CreateColorLookup_MonoHiResHalfPixel_75 ()
{
int iMonochrome = GetMonochromeIndex();
for (int iColumn = 0; iColumn < 16; iColumn++)
{
int coloffs = iColumn << 5;
for (unsigned iByte = 0; iByte < 256; iByte++)
{
int aPixels[11];
aPixels[ 0] = iColumn & 4;
aPixels[ 1] = iColumn & 8;
aPixels[ 9] = iColumn & 1;
aPixels[10] = iColumn & 2;
int nBitMask = 1;
int iPixel;
for (iPixel = 2; iPixel < 9; iPixel++)
{
aPixels[iPixel] = ((iByte & nBitMask) != 0);
nBitMask <<= 1;
}
int hibit = ((iByte & 0x80) != 0);
int x = 0;
int y = iByte << 1;
while (x < 28)
{
int adj = (x >= 14) << 1;
int odd = (x >= 14);
for (iPixel = 2; iPixel < 9; iPixel++)
{
int color = CM_Black;
int color1 = BLACK;
int color2 = BLACK;
// 95% luminance - the left leading edge has a "pseudo" drop shadow. Gumball logo looks bright, with the 80's retro leading edge.
if (aPixels[iPixel])
{
color = ((odd ^ (iPixel&1)) << 1) | hibit;
if (aPixels[iPixel-1])
{
if(aPixels[iPixel+1])
color = CM_White;
else
color = CM_Magenta;
}
}
switch(color)
{
case CM_Magenta: color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Blue : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Green : color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Orange : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Black : color1 = BLACK ; color2 = BLACK ; break;
case CM_White : color1 = iMonochrome ; color2 = iMonochrome ; break;
default: break;
}
// Colors - Top/Bottom Left/Right
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y ,color1); // TL buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y ,color2); // TR buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y+1,color1); // BL
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y+1,color2); // BR
x += 2;
}
}
}
}
}
//===========================================================================
void CreateColorLookup_MonoHiResHalfPixel_Emboss ()
{
int iMonochrome = GetMonochromeIndex();
for (int iColumn = 0; iColumn < 16; iColumn++)
{
int coloffs = iColumn << 5;
for (unsigned iByte = 0; iByte < 256; iByte++)
{
int aPixels[11];
aPixels[ 0] = iColumn & 4;
aPixels[ 1] = iColumn & 8;
aPixels[ 9] = iColumn & 1;
aPixels[10] = iColumn & 2;
int nBitMask = 1;
int iPixel;
for (iPixel = 2; iPixel < 9; iPixel++)
{
aPixels[iPixel] = ((iByte & nBitMask) != 0);
nBitMask <<= 1;
}
int hibit = ((iByte & 0x80) != 0);
int x = 0;
int y = iByte << 1;
while (x < 28)
{
int adj = (x >= 14) << 1;
int odd = (x >= 14);
for (iPixel = 2; iPixel < 9; iPixel++)
{
int color = CM_Black;
int color1 = BLACK;
int color2 = BLACK;
// Emboss
if (aPixels[iPixel])
{
color = ((odd ^ (iPixel&1)) << 1) | hibit;
if (aPixels[iPixel-1])
color = NUM_COLOR_MAPPING;
}
switch(color)
{
case CM_Magenta: color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Blue : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Green : color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Orange : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Black : color1 = BLACK ; color2 = BLACK ; break;
case CM_White : color1 = iMonochrome ; color2 = iMonochrome ; break;
case NUM_COLOR_MAPPING: color1 = color2 = iMonochrome+1; break;
default: break;
}
// Colors - Top/Bottom Left/Right
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y ,color1); // TL buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y ,color2); // TR buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y+1,color1); // BL
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y+1,color2); // BR
x += 2;
}
}
}
}
}
//===========================================================================
void CreateColorLookup_MonoHiResHalfPixel_Fake ()
{
int iMonochrome = GetMonochromeIndex();
for (int iColumn = 0; iColumn < 16; iColumn++)
{
int coloffs = iColumn << 5;
for (unsigned iByte = 0; iByte < 256; iByte++)
{
int aPixels[11];
aPixels[ 0] = iColumn & 4;
aPixels[ 1] = iColumn & 8;
aPixels[ 9] = iColumn & 1;
aPixels[10] = iColumn & 2;
int nBitMask = 1;
int iPixel;
for (iPixel = 2; iPixel < 9; iPixel++)
{
aPixels[iPixel] = ((iByte & nBitMask) != 0);
nBitMask <<= 1;
}
int hibit = ((iByte & 0x80) != 0);
int x = 0;
int y = iByte << 1;
while (x < 28)
{
int adj = (x >= 14) << 1;
int odd = (x >= 14);
for (iPixel = 2; iPixel < 9; iPixel++)
{
int color = CM_Black;
int color1 = BLACK;
int color2 = BLACK;
// Gumball Logo looks better with this, as we have solid whites, but the test pattern: 22 92 14 8C 08 08 08 is off
if (aPixels[iPixel])
{
if (aPixels[iPixel-1] || aPixels[iPixel+1])
{
color = CM_White;
}
else
color = ((odd ^ (iPixel&1)) << 1) | hibit;
}
else if (aPixels[iPixel-1] && aPixels[iPixel+1])
if (!(aPixels[iPixel-2] && aPixels[iPixel+2]))
color = ((odd ^ !(iPixel&1)) << 1) | hibit;
switch(color)
{
case CM_Magenta: color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Blue : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Green : color1 = iMonochrome ; color2 = iMonochrome+1; break;
case CM_Orange : color1 = iMonochrome+1; color2 = iMonochrome ; break;
case CM_Black : color1 = BLACK ; color2 = BLACK ; break;
case CM_White : color1 = iMonochrome ; color2 = iMonochrome ; break;
case NUM_COLOR_MAPPING: color1 = color2 = iMonochrome+1; break;
default: break;
}
// Colors - Top/Bottom Left/Right
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y ,color1); // TL buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y ,color2); // TR buggy
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj ,y+1,color1); // BL
SETSOURCEPIXEL(SRCOFFS_HIRES+coloffs+x+adj+1,y+1,color2); // BR
x += 2;
}
}
}
}
}
//=========================================================================== //===========================================================================
void DrawMonoLoResSource () { void DrawMonoLoResSource () {
int iMonochrome = GetMonochromeIndex(); int iMonochrome = GetMonochromeIndex();
@ -2103,59 +2460,63 @@ BOOL VideoHasRefreshed () {
} }
//=========================================================================== //===========================================================================
void VideoInitialize () { void VideoInitialize ()
{
// CREATE A BUFFER FOR AN IMAGE OF THE LAST DRAWN MEMORY
vidlastmem = (LPBYTE)VirtualAlloc(NULL,0x10000,MEM_COMMIT,PAGE_READWRITE);
ZeroMemory(vidlastmem,0x10000);
// CREATE A BUFFER FOR AN IMAGE OF THE LAST DRAWN MEMORY // LOAD THE LOGO
vidlastmem = (LPBYTE)VirtualAlloc(NULL,0x10000,MEM_COMMIT,PAGE_READWRITE); g_hLogoBitmap = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_APPLEWIN), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
ZeroMemory(vidlastmem,0x10000);
// LOAD THE LOGO // CREATE A BITMAPINFO STRUCTURE FOR THE FRAME BUFFER
g_hLogoBitmap = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_APPLEWIN), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); g_pFramebufferinfo = (LPBITMAPINFO)VirtualAlloc(NULL,
// CREATE A BITMAPINFO STRUCTURE FOR THE FRAME BUFFER
g_pFramebufferinfo = (LPBITMAPINFO)VirtualAlloc(NULL,
sizeof(BITMAPINFOHEADER) sizeof(BITMAPINFOHEADER)
+256*sizeof(RGBQUAD), +256*sizeof(RGBQUAD),
MEM_COMMIT, MEM_COMMIT,
PAGE_READWRITE); PAGE_READWRITE);
ZeroMemory(g_pFramebufferinfo,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
g_pFramebufferinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
g_pFramebufferinfo->bmiHeader.biWidth = FRAMEBUFFER_W;
g_pFramebufferinfo->bmiHeader.biHeight = FRAMEBUFFER_H;
g_pFramebufferinfo->bmiHeader.biPlanes = 1;
g_pFramebufferinfo->bmiHeader.biBitCount = 8;
g_pFramebufferinfo->bmiHeader.biClrUsed = 256;
// CREATE A BITMAPINFO STRUCTURE FOR THE SOURCE IMAGE ZeroMemory(g_pFramebufferinfo,sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD));
g_pSourceHeader = (LPBITMAPINFO)VirtualAlloc(NULL, g_pFramebufferinfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
g_pFramebufferinfo->bmiHeader.biWidth = FRAMEBUFFER_W;
g_pFramebufferinfo->bmiHeader.biHeight = FRAMEBUFFER_H;
g_pFramebufferinfo->bmiHeader.biPlanes = 1;
g_pFramebufferinfo->bmiHeader.biBitCount = 8;
g_pFramebufferinfo->bmiHeader.biClrUsed = 256;
// CREATE A BITMAPINFO STRUCTURE FOR THE SOURCE IMAGE
g_pSourceHeader = (LPBITMAPINFO)VirtualAlloc(NULL,
sizeof(BITMAPINFOHEADER) sizeof(BITMAPINFOHEADER)
+256*sizeof(RGBQUAD), +256*sizeof(RGBQUAD),
MEM_COMMIT, MEM_COMMIT,
PAGE_READWRITE); PAGE_READWRITE);
ZeroMemory(g_pSourceHeader,sizeof(BITMAPINFOHEADER));
g_pSourceHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
g_pSourceHeader->bmiHeader.biWidth = SRCOFFS_TOTAL;
g_pSourceHeader->bmiHeader.biHeight = 512;
g_pSourceHeader->bmiHeader.biPlanes = 1;
g_pSourceHeader->bmiHeader.biBitCount = 8;
g_pSourceHeader->bmiHeader.biClrUsed = 256;
// CREATE AN IDENTITY PALETTE AND FILL IN THE CORRESPONDING COLORS IN ZeroMemory(g_pSourceHeader,sizeof(BITMAPINFOHEADER));
// THE BITMAPINFO STRUCTURE g_pSourceHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
CreateIdentityPalette(); g_pSourceHeader->bmiHeader.biWidth = SRCOFFS_TOTAL;
g_pSourceHeader->bmiHeader.biHeight = 512;
g_pSourceHeader->bmiHeader.biPlanes = 1;
g_pSourceHeader->bmiHeader.biBitCount = 8;
g_pSourceHeader->bmiHeader.biClrUsed = 256;
// PREFILL THE 16 CUSTOM COLORS AND MAKE SURE TO INCLUDE THE CURRENT MONOCHROME COLOR // CREATE AN IDENTITY PALETTE AND FILL IN THE CORRESPONDING COLORS IN
for (int index = DARK_RED; index <= NUM_COLOR_PALETTE; index++) // THE BITMAPINFO STRUCTURE
customcolors[index-DARK_RED] = RGB(g_pFramebufferinfo->bmiColors[index].rgbRed, CreateIdentityPalette();
g_pFramebufferinfo->bmiColors[index].rgbGreen,
g_pFramebufferinfo->bmiColors[index].rgbBlue);
// CREATE THE FRAME BUFFER DIB SECTION AND DEVICE CONTEXT, // PREFILL THE 16 CUSTOM COLORS AND MAKE SURE TO INCLUDE THE CURRENT MONOCHROME COLOR
// CREATE THE SOURCE IMAGE DIB SECTION AND DRAW INTO THE SOURCE BIT BUFFER for (int index = DARK_RED; index <= NUM_COLOR_PALETTE; index++)
CreateDIBSections(); customcolors[index-DARK_RED] = RGB(
g_pFramebufferinfo->bmiColors[index].rgbRed,
g_pFramebufferinfo->bmiColors[index].rgbGreen,
g_pFramebufferinfo->bmiColors[index].rgbBlue
);
// RESET THE VIDEO MODE SWITCHES AND THE CHARACTER SET OFFSET // CREATE THE FRAME BUFFER DIB SECTION AND DEVICE CONTEXT,
VideoResetState(); // CREATE THE SOURCE IMAGE DIB SECTION AND DRAW INTO THE SOURCE BIT BUFFER
CreateDIBSections();
// RESET THE VIDEO MODE SWITCHES AND THE CHARACTER SET OFFSET
VideoResetState();
} }
//=========================================================================== //===========================================================================

View File

@ -1,19 +1,28 @@
#pragma once #pragma once
// Types ____________________________________________________________ // Types ____________________________________________________________
enum VideoType_e
{ // NOTE: KEEP IN SYNC: VideoType_e g_aVideoChoices g_apVideoModeDesc
VT_MONO_CUSTOM enum VideoType_e
, VT_COLOR_STANDARD {
, VT_COLOR_TEXT_OPTIMIZED VT_MONO_CUSTOM
, VT_COLOR_TVEMU , VT_COLOR_STANDARD
, VT_COLOR_HALF_SHIFT_DIM , VT_COLOR_TEXT_OPTIMIZED
, VT_MONO_AMBER , VT_COLOR_TVEMU
, VT_MONO_GREEN , VT_COLOR_HALF_SHIFT_DIM
, VT_MONO_WHITE // , VT_MONO_AUTHENTIC -- been replaced with 3 mono modes
// , VT_MONO_AUTHENTIC , VT_MONO_AMBER
, NUM_VIDEO_MODES , VT_MONO_GREEN
}; , VT_MONO_WHITE
, VT_MONO_HALFPIXEL_50
, VT_MONO_HALFPIXEL_95
, VT_MONO_HALFPIXEL_EMBOSS
, VT_MONO_HALFPIXEL_FAKE
, NUM_VIDEO_MODES
};
extern TCHAR g_aVideoChoices[];
extern char *g_apVideoModeDesc[ NUM_VIDEO_MODES ];
enum VideoFlag_e enum VideoFlag_e
{ {