From b3ce90d91577963597c3963002f3785183012cb0 Mon Sep 17 00:00:00 2001 From: mpohoreski Date: Sat, 8 Jan 2011 02:58:20 +0000 Subject: [PATCH] Monochrome Half Pixel Shift Hooked up 4 modes to F9 --- source/Frame.cpp | 2 - source/PropertySheetPage.cpp | 26 +- source/Video.cpp | 539 +++++++++++++++++++++++++++++------ source/Video.h | 35 ++- 4 files changed, 473 insertions(+), 129 deletions(-) diff --git a/source/Frame.cpp b/source/Frame.cpp index 917519d4..eef027c6 100644 --- a/source/Frame.cpp +++ b/source/Frame.cpp @@ -608,8 +608,6 @@ static void DrawStatusArea (HDC passdc, int drawflags) { _tcscat( title," 50% " ); } - - extern char *g_apVideoModeDesc[ NUM_VIDEO_MODES ]; _tcscat( title, g_apVideoModeDesc[ g_eVideoType ] ); } diff --git a/source/PropertySheetPage.cpp b/source/PropertySheetPage.cpp index e010a540..03b922e4 100644 --- a/source/PropertySheetPage.cpp +++ b/source/PropertySheetPage.cpp @@ -75,30 +75,6 @@ TCHAR soundchoices[] = TEXT("Disabled\0") TEXT("PC Speaker (translated)\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") TEXT("Enhanced Speed\0"); @@ -479,7 +455,7 @@ static BOOL CALLBACK ConfigDlgProc( HWND window, else 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); FillComboBox(window,IDC_SERIALPORT, sg_SSC.GetSerialPortChoices(), sg_SSC.GetSerialPort()); diff --git a/source/Video.cpp b/source/Video.cpp index 139f0039..8ed42e49 100644 --- a/source/Video.cpp +++ b/source/Video.cpp @@ -130,21 +130,21 @@ enum Color_Palette_Index_e , NUM_COLOR_PALETTE }; -const int SRCOFFS_40COL = 0; // 0 -const int SRCOFFS_IIPLUS = (SRCOFFS_40COL + 256); // 256 -const int SRCOFFS_80COL = (SRCOFFS_IIPLUS + 256); // 512 -const int SRCOFFS_LORES = (SRCOFFS_80COL + 128); // 640 -const int SRCOFFS_HIRES = (SRCOFFS_LORES + 16); // 656 -const int SRCOFFS_DHIRES = (SRCOFFS_HIRES + 512); // 1168 -const int SRCOFFS_TOTAL = (SRCOFFS_DHIRES + 2560); // 3278 + const int SRCOFFS_40COL = 0; // 0 + const int SRCOFFS_IIPLUS = (SRCOFFS_40COL + 256); // 256 + const int SRCOFFS_80COL = (SRCOFFS_IIPLUS + 256); // 512 + const int SRCOFFS_LORES = (SRCOFFS_80COL + 128); // 640 + const int SRCOFFS_HIRES = (SRCOFFS_LORES + 16); // 656 + const int SRCOFFS_DHIRES = (SRCOFFS_HIRES + 512); // 1168 + const int SRCOFFS_TOTAL = (SRCOFFS_DHIRES + 2560); // 3278 -#define SW_80COL (g_bVideoMode & VF_80COL) -#define SW_DHIRES (g_bVideoMode & VF_DHIRES) -#define SW_HIRES (g_bVideoMode & VF_HIRES) -#define SW_MASK2 (g_bVideoMode & VF_MASK2) -#define SW_MIXED (g_bVideoMode & VF_MIXED) -#define SW_PAGE2 (g_bVideoMode & VF_PAGE2) -#define SW_TEXT (g_bVideoMode & VF_TEXT) + #define SW_80COL (g_bVideoMode & VF_80COL) + #define SW_DHIRES (g_bVideoMode & VF_DHIRES) + #define SW_HIRES (g_bVideoMode & VF_HIRES) + #define SW_MASK2 (g_bVideoMode & VF_MASK2) + #define SW_MIXED (g_bVideoMode & VF_MIXED) + #define SW_PAGE2 (g_bVideoMode & VF_PAGE2) + #define SW_TEXT (g_bVideoMode & VF_TEXT) #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: -const UINT nVBlStop_NTSC = 21; -const UINT nVBlStop_PAL = 29; + const UINT nVBlStop_NTSC = 21; + 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) _____________________________________________ -void DrawDHiResSource (); -void DrawHiResSource (); -void DrawHiResSourceHalfShiftFull (); -void DrawHiResSourceHalfShiftDim (); -void DrawLoResSource (); -void DrawMonoDHiResSource (); -void DrawMonoHiResSource (); -void DrawMonoLoResSource (); -void DrawMonoTextSource (HDC dc); -void DrawTextSource (HDC dc); + void DrawDHiResSource (); + void DrawHiResSource (); + void DrawHiResSourceHalfShiftFull (); + void DrawHiResSourceHalfShiftDim (); + void DrawLoResSource (); -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 ); + void DrawTextSource (HDC dc); +// Monochrome + void DrawMonoDHiResSource (); + void DrawMonoHiResSource (); + void DrawMonoLoResSource (); + void DrawMonoTextSource (HDC dc); +// 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 dy Dst Y @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) { - if (framebufferaddr == addr && - g_nFrameBufferPitch == pitch) - return; - framebufferaddr = addr; - g_nFrameBufferPitch = pitch; +void CreateFrameOffsetTable (LPBYTE addr, LONG pitch) +{ + if ((framebufferaddr == addr) && (g_nFrameBufferPitch == pitch)) + return; - // 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); + framebufferaddr = addr; + g_nFrameBufferPitch = pitch; + + // 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 ZeroMemory(g_pSourcePixels,SRCOFFS_TOTAL*512); - if((g_eVideoType != VT_MONO_CUSTOM) && - (g_eVideoType != VT_MONO_AMBER ) && - (g_eVideoType != VT_MONO_GREEN ) && - (g_eVideoType != VT_MONO_WHITE )) -// (g_eVideoType != VT_MONO_AUTHENTIC)) + if (g_eVideoType = 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 () { 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 - vidlastmem = (LPBYTE)VirtualAlloc(NULL,0x10000,MEM_COMMIT,PAGE_READWRITE); - ZeroMemory(vidlastmem,0x10000); + // LOAD THE LOGO + g_hLogoBitmap = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_APPLEWIN), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - // LOAD THE LOGO - g_hLogoBitmap = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(IDB_APPLEWIN), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - - // CREATE A BITMAPINFO STRUCTURE FOR THE FRAME BUFFER - g_pFramebufferinfo = (LPBITMAPINFO)VirtualAlloc(NULL, + // CREATE A BITMAPINFO STRUCTURE FOR THE FRAME BUFFER + g_pFramebufferinfo = (LPBITMAPINFO)VirtualAlloc(NULL, sizeof(BITMAPINFOHEADER) +256*sizeof(RGBQUAD), MEM_COMMIT, 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 - g_pSourceHeader = (LPBITMAPINFO)VirtualAlloc(NULL, + 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 + g_pSourceHeader = (LPBITMAPINFO)VirtualAlloc(NULL, sizeof(BITMAPINFOHEADER) +256*sizeof(RGBQUAD), MEM_COMMIT, 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 - // THE BITMAPINFO STRUCTURE - CreateIdentityPalette(); + 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; - // PREFILL THE 16 CUSTOM COLORS AND MAKE SURE TO INCLUDE THE CURRENT MONOCHROME COLOR - for (int index = DARK_RED; index <= NUM_COLOR_PALETTE; index++) - customcolors[index-DARK_RED] = RGB(g_pFramebufferinfo->bmiColors[index].rgbRed, - g_pFramebufferinfo->bmiColors[index].rgbGreen, - g_pFramebufferinfo->bmiColors[index].rgbBlue); + // CREATE AN IDENTITY PALETTE AND FILL IN THE CORRESPONDING COLORS IN + // THE BITMAPINFO STRUCTURE + CreateIdentityPalette(); - // CREATE THE FRAME BUFFER DIB SECTION AND DEVICE CONTEXT, - // CREATE THE SOURCE IMAGE DIB SECTION AND DRAW INTO THE SOURCE BIT BUFFER - CreateDIBSections(); + // PREFILL THE 16 CUSTOM COLORS AND MAKE SURE TO INCLUDE THE CURRENT MONOCHROME COLOR + for (int index = DARK_RED; index <= NUM_COLOR_PALETTE; index++) + 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 - VideoResetState(); + // CREATE THE FRAME BUFFER DIB SECTION AND DEVICE CONTEXT, + // 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(); } //=========================================================================== diff --git a/source/Video.h b/source/Video.h index a49d9352..070b0d60 100644 --- a/source/Video.h +++ b/source/Video.h @@ -1,19 +1,28 @@ #pragma once // Types ____________________________________________________________ -enum VideoType_e -{ - VT_MONO_CUSTOM - , VT_COLOR_STANDARD - , VT_COLOR_TEXT_OPTIMIZED - , VT_COLOR_TVEMU - , VT_COLOR_HALF_SHIFT_DIM - , VT_MONO_AMBER - , VT_MONO_GREEN - , VT_MONO_WHITE -// , VT_MONO_AUTHENTIC - , NUM_VIDEO_MODES -}; + + // NOTE: KEEP IN SYNC: VideoType_e g_aVideoChoices g_apVideoModeDesc + enum VideoType_e + { + VT_MONO_CUSTOM + , VT_COLOR_STANDARD + , VT_COLOR_TEXT_OPTIMIZED + , VT_COLOR_TVEMU + , VT_COLOR_HALF_SHIFT_DIM + // , VT_MONO_AUTHENTIC -- been replaced with 3 mono modes + , VT_MONO_AMBER + , 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 {