diff --git a/source/NTSC.cpp b/source/NTSC.cpp index 2805ec97..ae0d7d91 100644 --- a/source/NTSC.cpp +++ b/source/NTSC.cpp @@ -119,6 +119,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA static unsigned char g_aNTSCMonoTelevision [NTSC_NUM_SEQUENCES][NUM_COLOR_CHANNELS]; static unsigned char g_aNTSCColorTelevision[NTSC_NUM_PHASES][NTSC_NUM_SEQUENCES][NUM_COLOR_CHANNELS]; +// g_aNTSCMonoMonitor * g_nMonochromeRGB -> g_aNTSCMonoMonitorCustom +// g_aNTSCMonoTelevision * g_nMonochromeRGB -> g_aNTSCMonoTelevisionCustom + static unsigned char g_aNTSCMonoMonitorCustom [NTSC_NUM_SEQUENCES][NUM_COLOR_CHANNELS]; + static unsigned char g_aNTSCMonoTelevisionCustom [NTSC_NUM_SEQUENCES][NUM_COLOR_CHANNELS]; + #define NUM_SIGZEROS 2 #define NUM_SIGPOLES 2 #define SIGGAIN 7.614490548f @@ -280,6 +285,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA void init_chroma_phase_table(); void updateColorPhase(); void updateVideoHorzEOL(); + void updateMonochromeColor( uint16_t r, uint16_t g, uint16_t b ); //=========================================================================== inline float clampZeroOne( const float & x ) @@ -522,6 +528,7 @@ void NTSC_VideoInit( uint8_t* pFramebuffer ) // wsVideoInit make_csbits(); init_video_tables(); init_chroma_phase_table(); + updateMonochromeColor( 0xFF, 0xFF, 0xFF ); for (int y = 0; y < 384; y++) g_NTSC_Lines[y] = g_pFramebufferbits + 4 * FRAMEBUFFER_W * ((FRAMEBUFFER_H - 1) - y - 18) + 80; @@ -625,12 +632,12 @@ void NTSC_VideoInit( uint8_t* pFramebuffer ) // wsVideoInit static void ntscMonoSinglePixel (int compositeSignal) { - SINGLEPIXEL(compositeSignal, g_aNTSCMonoMonitor); + SINGLEPIXEL(compositeSignal, g_aNTSCMonoMonitorCustom); } static void ntscMonoDoublePixel (int compositeSignal) { - DOUBLEPIXEL(compositeSignal, g_aNTSCMonoMonitor); + DOUBLEPIXEL(compositeSignal, g_aNTSCMonoMonitorCustom); } static void ntscColorSinglePixel (int compositeSignal) @@ -648,12 +655,12 @@ static void ntscColorDoublePixel (int compositeSignal) static void ntscMonoTVSinglePixel (int compositeSignal) { - SINGLETVPIXEL(compositeSignal, g_aNTSCMonoTelevision); + SINGLETVPIXEL(compositeSignal, g_aNTSCMonoTelevisionCustom); } static void ntscMonoTVDoublePixel (int compositeSignal) { - DOUBLETVPIXEL(compositeSignal, g_aNTSCMonoTelevision); + DOUBLETVPIXEL(compositeSignal, g_aNTSCMonoTelevisionCustom); } static void ntscColorTVSinglePixel (int compositeSignal) @@ -671,11 +678,30 @@ static void ntscColorTVDoublePixel (int compositeSignal) static void (*ntscMonoPixel)(int) = ntscMonoSinglePixel; static void (*ntscColorPixel)(int) = ntscColorSinglePixel; +//=========================================================================== +void updateMonochromeColor( uint16_t r, uint16_t g, uint16_t b ) +{ + for( int iSample = 0; iSample < NTSC_NUM_SEQUENCES; iSample++ ) + { + g_aNTSCMonoMonitorCustom[ iSample ][ _B ] = (g_aNTSCMonoMonitor[ iSample ][_B] * b) >> 8; + g_aNTSCMonoMonitorCustom[ iSample ][ _G ] = (g_aNTSCMonoMonitor[ iSample ][_G] * g) >> 8; + g_aNTSCMonoMonitorCustom[ iSample ][ _R ] = (g_aNTSCMonoMonitor[ iSample ][_R] * r) >> 8; + g_aNTSCMonoMonitorCustom[ iSample ][ _A ] = 0xFF; + + g_aNTSCMonoTelevisionCustom[ iSample ][ _B ] = (g_aNTSCMonoTelevision[ iSample ][_B] * b) >> 8; + g_aNTSCMonoTelevisionCustom[ iSample ][ _G ] = (g_aNTSCMonoTelevision[ iSample ][_G] * g) >> 8; + g_aNTSCMonoTelevisionCustom[ iSample ][ _B ] = (g_aNTSCMonoTelevision[ iSample ][_R] * r) >> 8; + g_aNTSCMonoTelevisionCustom[ iSample ][ _A ] = 0xFF; + } +} + + //=========================================================================== void NTSC_SetVideoStyle() // (int v, int s) { int v = g_eVideoType; int s = g_uHalfScanLines; + uint8_t r, g, b; switch (v) { @@ -712,10 +738,35 @@ void NTSC_SetVideoStyle() // (int v, int s) break; // case VT_MONO_WHITE: //VT_MONO_MONITOR: //3: - case VT_MONO_AMBER: // RGB(0xFF,0x80,0x00) - case VT_MONO_GREEN: // RGB(0x00,0xC0,0x00) - case VT_MONO_WHITE: // RGB(0xFF,0xFF,0xFF) + case VT_MONO_AMBER: + r = 0xFF; + g = 0x80; + b = 0x00; + goto _mono; + + case VT_MONO_GREEN: + r = 0x00; + g = 0xC0; + b = 0x00; + goto _mono; + + case VT_MONO_WHITE: + r = 0xFF; + g = 0xFF; + b = 0xFF; + goto _mono; + case VT_MONO_HALFPIXEL_REAL: + // From WinGDI.h + // #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) + //#define GetRValue(rgb) (LOBYTE(rgb)) + //#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8)) + //#define GetBValue(rgb) (LOBYTE((rgb)>>16)) + r = (g_nMonochromeRGB >> 0) & 0xFF; + g = (g_nMonochromeRGB >> 8) & 0xFF; + b = (g_nMonochromeRGB >> 16) & 0xFF; +_mono: + updateMonochromeColor( r, g, b ); // Custom Monochrome color if (s) { ntscMonoPixel = ntscColorPixel = ntscMonoSinglePixel; } diff --git a/source/Video.cpp b/source/Video.cpp index 043e8634..6a7a941f 100644 --- a/source/Video.cpp +++ b/source/Video.cpp @@ -262,9 +262,9 @@ static bool g_bVideoUpdatedThisFrame = false; static LPBYTE framebufferaddr = (LPBYTE)0; static LONG g_nFrameBufferPitch = 0; -COLORREF monochrome = RGB(0xC0,0xC0,0xC0); -static BOOL rebuiltsource = 0; -static LPBYTE vidlastmem = NULL; +COLORREF g_nMonochromeRGB = RGB(0xC0,0xC0,0xC0); +static BOOL rebuiltsource = 0; +static LPBYTE vidlastmem = NULL; static UINT g_uVideoMode = VF_TEXT; @@ -324,7 +324,6 @@ static bool bVideoScannerNTSC = true; // NTSC video scanning (or PAL) void V_CreateIdentityPalette (); void V_CreateDIBSections (); - HBRUSH V_CreateCustomBrush (COLORREF nColor); /** Our BitBlit() / VRAM_Copy() @param dx Dst X @@ -379,6 +378,7 @@ void VideoInitialize () g_pFramebufferinfo->bmiHeader.biClrUsed = 0; NTSC_VideoCreateDIBSection(); +// VideoReinitialize(); // Can't call here since Config_Video_Load() hasn't been called yet } //=========================================================================== @@ -439,15 +439,15 @@ void V_CreateIdentityPalette () SETFRAMECOLOR(HGR_PINK, 0xFF,0x32,0xB5); // 0xD0,0x40,0xA0 -> 0xFF,0x32,0xB5 SETFRAMECOLOR( MONOCHROME_CUSTOM - , GetRValue(monochrome) - , GetGValue(monochrome) - , GetBValue(monochrome) + , GetRValue(g_nMonochromeRGB) + , GetGValue(g_nMonochromeRGB) + , GetBValue(g_nMonochromeRGB) ); SETFRAMECOLOR( MONOCHROME_CUSTOM_50 - , ((GetRValue(monochrome)/2) & 0xFF) - , ((GetGValue(monochrome)/2) & 0xFF) - , ((GetBValue(monochrome)/2) & 0xFF) + , ((GetRValue(g_nMonochromeRGB)/2) & 0xFF) + , ((GetGValue(g_nMonochromeRGB)/2) & 0xFF) + , ((GetBValue(g_nMonochromeRGB)/2) & 0xFF) ); SETFRAMECOLOR( MONOCHROME_AMBER , 0xFF,0x80,0x01); // Used for Monochrome Hi-Res graphics not text! @@ -620,57 +620,6 @@ struct BRUSHBMP BYTE bBits[64]; }; -HBRUSH V_CreateCustomBrush(COLORREF nColor) -{ - BRUSHBMP brbmp; - BYTE *pBytes; - int i; - //DWORD dwBits[6][2] = - //{ - // {0x000000ff,0x00000000}, // HS_HORIZONTAL 0 /* ----- */ - // {0x10101010,0x10101010}, // HS_VERTICAL 1 /* ||||| */ - // {0x01020408,0x10204080}, // HS_FDIAGONAL 2 /* \\\\\ */ - // {0x80402010,0x08040201}, // HS_BDIAGONAL 3 /* ///// */ - // {0x101010ff,0x10101010}, // HS_CROSS 4 /* +++++ */ - // {0x81422418,0x18244281}, // HS_DIAGCROSS 5 /* xxxxx */ - //}; - // if ((HatchStyle < 0) || (HatchStyle > 6)) - // return 0; - - int HatchStyle = 0; - DWORD dwBits[1][2] = - { -// {0xff00ff00,0xff00ff00} // every other scan line - {0xFFFFFFFF,0xFFFFFFFF} - }; - - memset (&brbmp, 0, sizeof (brbmp)); - - brbmp.bmi.biSize = sizeof (BITMAPINFOHEADER); - brbmp.bmi.biWidth = 8; - brbmp.bmi.biHeight = 8; - brbmp.bmi.biPlanes = 1; - brbmp.bmi.biBitCount = 1; - brbmp.bmi.biClrUsed = 2; - brbmp.bmi.biClrImportant = 2; - - // Initialize the palette of the bitmap. - brbmp.dwPal[0] = PALETTERGB(0x00,0x00,0x00); - brbmp.dwPal[1] = PALETTERGB( - (BYTE)((nColor >> 16) & 0xff), - (BYTE)((nColor >> 8) & 0xff), - (BYTE)((nColor >> 0) & 0xff)); - - // Write the hatch data to the bitmap. - pBytes = (BYTE *)&dwBits[HatchStyle]; - for (i = 0; i < 8; i++) - brbmp.bBits[i*4] = *pBytes++; - - // Return the handle of the brush created. - return CreateDIBPatternBrushPt (&brbmp, DIB_RGB_COLORS); -} - - //=========================================================================== static void CreateLookup_TextCommon(HDC hDstDC, DWORD rop) @@ -1043,12 +992,12 @@ void VideoChooseMonochromeColor () ZeroMemory(&cc,sizeof(CHOOSECOLOR)); cc.lStructSize = sizeof(CHOOSECOLOR); cc.hwndOwner = g_hFrameWindow; - cc.rgbResult = monochrome; + cc.rgbResult = g_nMonochromeRGB; cc.lpCustColors = customcolors + 1; cc.Flags = CC_RGBINIT | CC_SOLIDCOLOR; if (ChooseColor(&cc)) { - monochrome = cc.rgbResult; + g_nMonochromeRGB = cc.rgbResult; VideoReinitialize(); if ((g_nAppMode != MODE_LOGO) && (g_nAppMode != MODE_DEBUG)) { @@ -1933,7 +1882,7 @@ void Config_Load_Video() { REGLOAD(TEXT(REGVALUE_VIDEO_MODE ),&g_eVideoType); REGLOAD(TEXT(REGVALUE_VIDEO_HALF_SCAN_LINES),&g_uHalfScanLines); - REGLOAD(TEXT(REGVALUE_VIDEO_MONO_COLOR ),&monochrome); + REGLOAD(TEXT(REGVALUE_VIDEO_MONO_COLOR ),&g_nMonochromeRGB); if (g_eVideoType >= NUM_VIDEO_MODES) g_eVideoType = VT_COLOR_STANDARD; // Old default: VT_COLOR_TVEMU @@ -1943,7 +1892,7 @@ void Config_Save_Video() { REGSAVE(TEXT(REGVALUE_VIDEO_MODE ),g_eVideoType); REGSAVE(TEXT(REGVALUE_VIDEO_HALF_SCAN_LINES),g_uHalfScanLines); - REGSAVE(TEXT(REGVALUE_VIDEO_MONO_COLOR ),monochrome); + REGSAVE(TEXT(REGVALUE_VIDEO_MONO_COLOR ),g_nMonochromeRGB); } // ____________________________________________________________________ diff --git a/source/Video.h b/source/Video.h index 467cca14..ca75cc14 100644 --- a/source/Video.h +++ b/source/Video.h @@ -57,7 +57,7 @@ extern HBITMAP g_hLogoBitmap; -extern COLORREF monochrome; // saved +extern COLORREF g_nMonochromeRGB; // saved extern DWORD g_eVideoType; // saved extern DWORD g_uHalfScanLines; // saved extern uint8_t *g_pFramebufferbits;