From 631a9bc086510d6241f3d59ecc9a77f642bc1a47 Mon Sep 17 00:00:00 2001 From: mpohoreski Date: Sun, 9 Jan 2011 04:42:46 +0000 Subject: [PATCH] Fixed disappearing text Massive code cleanup (re-organized so palette stuff is together.) --- AppleWin/source/Video.cpp | 419 ++++++++++++++++++++------------------ AppleWin/source/Video.h | 7 +- 2 files changed, 228 insertions(+), 198 deletions(-) diff --git a/AppleWin/source/Video.cpp b/AppleWin/source/Video.cpp index dbff135e..669b3e3d 100644 --- a/AppleWin/source/Video.cpp +++ b/AppleWin/source/Video.cpp @@ -108,7 +108,7 @@ enum Color_Palette_Index_e , HGR_PINK // MONOCHROME -// NOTE: 50% is assumed to come after 100% luminance !!! See: DrawMonoHires() +// NOTE: 50% is assumed to come after 100% luminance !!! See: DrawMonoHiResSource() // User customizable , MONOCHROME_CUSTOM // 100% luminance , MONOCHROME_CUSTOM_50 // 50% luminance @@ -148,9 +148,10 @@ enum Color_Palette_Index_e #define SETSOURCEPIXEL(x,y,c) g_aSourceStartofLine[(y)][(x)] = (c) -#define SETFRAMECOLOR(i,r,g,b) g_pFramebufferinfo->bmiColors[i].rgbRed = r; \ - g_pFramebufferinfo->bmiColors[i].rgbGreen = g; \ - g_pFramebufferinfo->bmiColors[i].rgbBlue = b; +#define SETFRAMECOLOR(i,r,g,b) g_pFramebufferinfo->bmiColors[i].rgbRed = r; \ + g_pFramebufferinfo->bmiColors[i].rgbGreen = g; \ + g_pFramebufferinfo->bmiColors[i].rgbBlue = b; \ + g_pFramebufferinfo->bmiColors[i].rgbReserved = PC_NOCOLLAPSE; #define HGR_MATRIX_YOFFSET 2 // For tv emulation g_nAppMode @@ -172,7 +173,9 @@ int const kVPresetLine = 256; // line when V state presets int const kVSyncLines = 4; // lines per VSync duration static BYTE celldirty[40][32]; -static COLORREF customcolors[NUM_COLOR_PALETTE]; // MONOCHROME is last custom color +// NUM_COLOR_PALETTE +static COLORREF customcolors[256]; // MONOCHROME is last custom color + static HBITMAP g_hDeviceBitmap; static HDC g_hDeviceDC; LPBYTE g_pFramebufferbits = NULL; // last drawn frame @@ -252,7 +255,7 @@ static bool bVideoScannerNTSC = true; // NTSC video scanning (or PAL) // The window title will be set to this. char *g_apVideoModeDesc[ NUM_VIDEO_MODES ] = { - "Custom" + "Custom" ,"Std." ,"Text" ,"TV" @@ -300,6 +303,11 @@ static bool bVideoScannerNTSC = true; // NTSC video scanning (or PAL) int GetMonochromeIndex(); + void V_CreateIdentityPalette (); + void V_CreateDIBSections (); + HBRUSH V_CreateCustomBrush (COLORREF nColor); + + /** Our BitBlit() / VRAM_Copy() @param dx Dst X @param dy Dst Y @@ -353,12 +361,102 @@ void CreateFrameOffsetTable (LPBYTE addr, LONG pitch) } //=========================================================================== -void CreateIdentityPalette () +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); + + // 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, + 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, + 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; + + // VideoReinitialize() ... except we set the frame buffer palette.... + V_CreateIdentityPalette(); + + //RGB() -> none + //PALETTERGB() -> PC_EXPLICIT + //??? RGB() -> PC_NOCOLLAPSE + for( int iColor = 0; iColor < NUM_COLOR_PALETTE; iColor++ ) + customcolors[ iColor ] = ((DWORD)PC_EXPLICIT << 24) | RGB( + g_pFramebufferinfo->bmiColors[iColor].rgbRed, + g_pFramebufferinfo->bmiColors[iColor].rgbGreen, + g_pFramebufferinfo->bmiColors[iColor].rgbBlue + ); + + // CREATE THE FRAME BUFFER DIB SECTION AND DEVICE CONTEXT, + // CREATE THE SOURCE IMAGE DIB SECTION AND DRAW INTO THE SOURCE BIT BUFFER + V_CreateDIBSections(); + + // RESET THE VIDEO MODE SWITCHES AND THE CHARACTER SET OFFSET + VideoResetState(); +} + +//=========================================================================== +int GetMonochromeIndex() +{ + int iMonochrome; + + switch (g_eVideoType) + { + case VT_MONO_CUSTOM: iMonochrome = MONOCHROME_CUSTOM; break; + case VT_MONO_AMBER : iMonochrome = MONOCHROME_AMBER ; break; + case VT_MONO_GREEN : iMonochrome = MONOCHROME_GREEN ; break; + case VT_MONO_WHITE : iMonochrome = WHITE ; break; + default : iMonochrome = MONOCHROME_CUSTOM; break; // caller will use MONOCHROME_CUSTOM MONOCHROME_CUSTOM_50 ! + } + + return iMonochrome; +} + +//=========================================================================== +void V_CreateIdentityPalette () { if (g_hPalette) { DeleteObject(g_hPalette); } + g_hPalette = (HPALETTE)0; + + SETFRAMECOLOR(BLACK, 0x00,0x00,0x00); + SETFRAMECOLOR(DARK_RED, 0x80,0x00,0x00); + SETFRAMECOLOR(DARK_GREEN, 0x00,0x80,0x00); + SETFRAMECOLOR(DARK_YELLOW, 0x80,0x80,0x00); + SETFRAMECOLOR(DARK_BLUE, 0x00,0x00,0x80); + SETFRAMECOLOR(DARK_MAGENTA,0x80,0x00,0x80); + SETFRAMECOLOR(DARK_CYAN, 0x00,0x80,0x80); + SETFRAMECOLOR(LIGHT_GRAY, 0xC0,0xC0,0xC0); + SETFRAMECOLOR(MONEY_GREEN, 0xC0,0xDC,0xC0); + SETFRAMECOLOR(SKY_BLUE, 0xA6,0xCA,0xF0); // SET FRAME BUFFER TABLE ENTRIES TO CUSTOM COLORS SETFRAMECOLOR(DEEP_RED, 0xD0,0x00,0x30); @@ -369,7 +467,7 @@ void CreateIdentityPalette () SETFRAMECOLOR(AQUA, 0x40,0xFF,0x90); SETFRAMECOLOR(HGR_BLACK, 0x00,0x00,0x00); // For tv emulation g_nAppMode - SETFRAMECOLOR(HGR_WHITE, 0xFF,0xFF,0xFE); + SETFRAMECOLOR(HGR_WHITE, 0xFF,0xFF,0xFE); // BUG: PALETTE COLLAPS! NOT white!? Win32 collapses the palette if you have duplicate colors! SETFRAMECOLOR(HGR_BLUE, 0x00,0x80,0xFF); SETFRAMECOLOR(HGR_RED, 0xF0,0x50,0x00); SETFRAMECOLOR(HGR_GREEN, 0x20,0xC0,0x00); @@ -384,25 +482,37 @@ void CreateIdentityPalette () SETFRAMECOLOR( MONOCHROME_CUSTOM , GetRValue(monochrome) , GetGValue(monochrome) - , GetBValue(monochrome) ); + , GetBValue(monochrome) + ); SETFRAMECOLOR( MONOCHROME_CUSTOM_50 - , GetRValue(monochrome)/2 - , GetGValue(monochrome)/2 - , GetBValue(monochrome)/2 ); + , ((GetRValue(monochrome)/2) & 0xFF) + , ((GetGValue(monochrome)/2) & 0xFF) + , ((GetBValue(monochrome)/2) & 0xFF) + ); - SETFRAMECOLOR( MONOCHROME_AMBER , 0xFF,0x80,0x00); -// SETFRAMECOLOR( MONOCHROME_AMBER_50, 0x80,0x40,0x00); - SETFRAMECOLOR( MONOCHROME_GREEN , 0x00,0xC0,0x00); -// SETFRAMECOLOR( MONOCHROME_GREEN_50, 0x00,0x60,0x00); - SETFRAMECOLOR( MONOCHROME_WHITE , 0xFF,0xFF,0xFF); -// SETFRAMECOLOR( MONOCHROME_WHITE_50, 0x80,0x80,0x80); + SETFRAMECOLOR( MONOCHROME_AMBER , 0xFF,0x80,0x00); // Used for Monochrome Hi-Res graphics not text! + SETFRAMECOLOR( MONOCHROME_GREEN , 0x00,0xC0,0x00); // Used for Monochrome Hi-Res graphics not text! + // BUG PALETTE COLLAPSE: WTF?? Soon as we set 0xFF,0xFF,0xFF we lose text colors?!?! + // Windows is collapsing the palette!!! + SETFRAMECOLOR( MONOCHROME_WHITE , 0xFE,0xFE,0xFE); // Used for Monochrome Hi-Res graphics not text! + + SETFRAMECOLOR(CREAM, 0xFF,0xFB,0xF0); // F6 + SETFRAMECOLOR(MEDIUM_GRAY, 0xA0,0xA0,0xA4); // F7 + SETFRAMECOLOR(DARK_GRAY, 0x80,0x80,0x80); // F8 + SETFRAMECOLOR(RED, 0xFF,0x00,0x00); // F9 + SETFRAMECOLOR(GREEN, 0x00,0xFF,0x00); // FA + SETFRAMECOLOR(YELLOW, 0xFF,0xFF,0x00); // FB + SETFRAMECOLOR(BLUE, 0x00,0x00,0xFF); // FC + SETFRAMECOLOR(MAGENTA, 0xFF,0x00,0xFF); // FD + SETFRAMECOLOR(CYAN, 0x00,0xFF,0xFF); // FE + SETFRAMECOLOR(WHITE, 0xFF,0xFF,0xFF); // FF // IF WE ARE IN A PALETTIZED VIDEO MODE, CREATE AN IDENTITY PALETTE HWND window = GetDesktopWindow(); HDC dc = GetDC(window); - int colors = GetDeviceCaps(dc,SIZEPALETTE); // 16/24/32bpp = 0 - int system = GetDeviceCaps(dc,NUMCOLORS); // 16/24/32bpp = -1 +unsigned int colors = GetDeviceCaps(dc,SIZEPALETTE); // 16/24/32bpp = 0 +unsigned int system = GetDeviceCaps(dc,NUMCOLORS); // 16/24/32bpp = -1 #if 0 // DD Full Screen Palette @@ -442,7 +552,8 @@ void CreateIdentityPalette () } #endif - if ((GetDeviceCaps(dc,RASTERCAPS) & RC_PALETTE) && (colors <= 256)) + int bRasterPalette = (GetDeviceCaps(dc,RASTERCAPS) & RC_PALETTE); + if (bRasterPalette && (colors <= 256)) { // GET THE PALETTE ENTRIES OF THE LOGO RGBQUAD aLogoPalette[256]; @@ -455,11 +566,13 @@ void CreateIdentityPalette () } // CREATE A PALETTE ENTRY ARRAY - LOGPALETTE *paldata = (LOGPALETTE *)VirtualAlloc(NULL, - sizeof(LOGPALETTE) - +256*sizeof(PALETTEENTRY), - MEM_COMMIT, - PAGE_READWRITE); + LOGPALETTE *paldata = (LOGPALETTE *)VirtualAlloc( + NULL, + sizeof(LOGPALETTE) + 256*sizeof(PALETTEENTRY), + MEM_COMMIT, + PAGE_READWRITE + ); + paldata->palVersion = 0x300; paldata->palNumEntries = colors; GetSystemPaletteEntries(dc,0,colors,paldata->palPalEntry); @@ -524,40 +637,55 @@ void CreateIdentityPalette () g_hPalette = CreatePalette(paldata); VirtualFree(paldata,0,MEM_RELEASE); } - else // OTHERWISE, FILL THE FRAME BUFFER TABLE WITH THE STANDARD WINDOWS COLORS - { - SETFRAMECOLOR(BLACK, 0x00,0x00,0x00); - SETFRAMECOLOR(DARK_RED, 0x80,0x00,0x00); - SETFRAMECOLOR(DARK_GREEN, 0x00,0x80,0x00); - SETFRAMECOLOR(DARK_YELLOW, 0x80,0x80,0x00); - SETFRAMECOLOR(DARK_BLUE, 0x00,0x00,0x80); - SETFRAMECOLOR(DARK_MAGENTA,0x80,0x00,0x80); - SETFRAMECOLOR(DARK_CYAN, 0x00,0x80,0x80); - SETFRAMECOLOR(LIGHT_GRAY, 0xC0,0xC0,0xC0); - SETFRAMECOLOR(MONEY_GREEN, 0xC0,0xDC,0xC0); - - SETFRAMECOLOR(SKY_BLUE, 0xA6,0xCA,0xF0); - SETFRAMECOLOR(CREAM, 0xFF,0xFB,0xF0); - SETFRAMECOLOR(MEDIUM_GRAY, 0xA0,0xA0,0xA4); - SETFRAMECOLOR(DARK_GRAY, 0x80,0x80,0x80); - SETFRAMECOLOR(RED, 0xFF,0x00,0x00); - SETFRAMECOLOR(GREEN, 0x00,0xFF,0x00); - SETFRAMECOLOR(YELLOW, 0xFF,0xFF,0x00); - SETFRAMECOLOR(BLUE, 0x00,0x00,0xFF); - SETFRAMECOLOR(MAGENTA, 0xFF,0x00,0xFF); - SETFRAMECOLOR(CYAN, 0x00,0xFF,0xFF); - SETFRAMECOLOR(WHITE, 0xFF,0xFF,0xFF); - - g_hPalette = (HPALETTE)0; - } ReleaseDC(window,dc); } //=========================================================================== -void CreateDIBSections () +void DrawMonoTextSource (HDC hDstDC) { + static HBITMAP hCharBitmap[4]; + HDC hSrcDC = CreateCompatibleDC(hDstDC); + hCharBitmap[0] = LoadBitmap(g_hInstance,TEXT("CHARSET40")); + hCharBitmap[1] = LoadBitmap(g_hInstance,TEXT("CHARSET82")); + hCharBitmap[2] = LoadBitmap(g_hInstance,TEXT("CHARSET8C")); // FIXME: Pravets 8M probably has the same charset as Pravets 8C + hCharBitmap[3] = LoadBitmap(g_hInstance,TEXT("CHARSET8C")); + + HBRUSH hBrush; + switch (g_eVideoType) + { +// case VT_MONO_AUTHENTIC: hBrush = CreateCustomBrush(RGB(0x00,0xC0,0x00)); break; + case VT_MONO_AMBER: hBrush = CreateSolidBrush(RGB(0xFF,0x80,0x00)); break; + case VT_MONO_GREEN: hBrush = CreateSolidBrush(RGB(0x00,0xC0,0x00)); break; + case VT_MONO_WHITE: hBrush = CreateSolidBrush(RGB(0xFF,0xFF,0xFF)); break; + default : hBrush = CreateSolidBrush(monochrome); break; + +// case VT_MONO_AMBER : hBrush = V_CreateCustomBrush(RGB(0xFF,0x80,0x00)); break; // Should (must?) match MONOCHROME_AMBER ! +// case VT_MONO_GREEN : hBrush = V_CreateCustomBrush(RGB(0x00,0xC0,0x00)); break; // SHould (must?) match MONOCHROME_GREEN ! +// case VT_MONO_WHITE : hBrush = V_CreateCustomBrush(RGB(0xFF,0xFF,0xFF)); break; // BUG: PALETTE COLLAPSE: Must NOT match MONOCHROME_WHITE ! +// case VT_MONO_CUSTOM: hBrush = V_CreateCustomBrush(monochrome); break; +// default : hBrush = V_CreateCustomBrush(monochrome); break; + } + + SelectObject(hSrcDC,hCharBitmap[g_nCharsetType]); + SelectObject(hDstDC,hBrush); + + // TODO: Update with APPLE_FONT_Y_ values + BitBlt( hDstDC,SRCOFFS_40COL ,0,256,512,hSrcDC,0, 0,MERGECOPY); + BitBlt( hDstDC,SRCOFFS_IIPLUS,0,256,256,hSrcDC,0,512,MERGECOPY); + StretchBlt(hDstDC,SRCOFFS_80COL ,0,128,512,hSrcDC,0, 0,256,512,MERGECOPY); + SelectObject(hDstDC,GetStockObject(NULL_BRUSH)); + + DeleteObject(hBrush); + DeleteDC(hSrcDC); + DeleteObject(hCharBitmap); +} + + +//=========================================================================== +void V_CreateDIBSections () +{ CopyMemory(g_pSourceHeader->bmiColors,g_pFramebufferinfo->bmiColors,256*sizeof(RGBQUAD)); // CREATE THE DEVICE CONTEXT @@ -573,7 +701,9 @@ void CreateDIBSections () if (g_hDeviceBitmap) DeleteObject(g_hDeviceBitmap); g_hDeviceBitmap = CreateDIBSection( - dc,g_pFramebufferinfo,DIB_RGB_COLORS, + dc, + g_pFramebufferinfo, + DIB_RGB_COLORS, (LPVOID *)&g_pFramebufferbits,0,0 ); SelectObject(g_hDeviceDC,g_hDeviceBitmap); @@ -583,8 +713,11 @@ void CreateDIBSections () ReleaseDC(window,dc); if (g_hSourceBitmap) DeleteObject(g_hSourceBitmap); + g_hSourceBitmap = CreateDIBSection( - sourcedc,g_pSourceHeader,DIB_RGB_COLORS, + sourcedc, + g_pSourceHeader, + DIB_RGB_COLORS, (LPVOID *)&g_pSourcePixels,0,0 ); SelectObject(sourcedc,g_hSourceBitmap); @@ -596,7 +729,8 @@ void CreateDIBSections () // DRAW THE SOURCE IMAGE INTO THE SOURCE BIT BUFFER ZeroMemory(g_pSourcePixels,SRCOFFS_TOTAL*512); - if (g_eVideoType < VT_MONO_AMBER) // First monochrome mode + // First monochrome mode is seperate from others + if ((g_eVideoType >= VT_COLOR_STANDARD) && (g_eVideoType <= VT_COLOR_HALF_SHIFT_DIM)) { DrawTextSource(sourcedc); DrawLoResSource(); @@ -613,18 +747,19 @@ void CreateDIBSections () DrawMonoTextSource(sourcedc); DrawMonoLoResSource(); - switch(g_eVideoType) + switch (g_eVideoType) { case VT_MONO_AMBER : // intentional fall-thru case VT_MONO_GREEN : // intentional fall-thru case VT_MONO_WHITE : DrawMonoHiResSource() ; break; + case VT_MONO_CUSTOM : DrawMonoHiResSource(); ; break; case VT_MONO_HALFPIXEL_REAL : CreateColorLookup_MonoHiResHalfPixel_Real() ; break; case VT_MONO_HALFPIXEL_COLORIZE: CreateColorLookup_MonoHiResHalfPixel_Colorize(); break; case VT_MONO_HALFPIXEL_75 : CreateColorLookup_MonoHiResHalfPixel_75() ; break; case VT_MONO_HALFPIXEL_95 : CreateColorLookup_MonoHiResHalfPixel_95() ; break; case VT_MONO_HALFPIXEL_EMBOSS : CreateColorLookup_MonoHiResHalfPixel_Emboss() ; break; case VT_MONO_HALFPIXEL_FAKE : CreateColorLookup_MonoHiResHalfPixel_Fake() ; break; - default: DrawMonoHiResSource(); + default: DrawMonoHiResSource(); break; } DrawMonoDHiResSource(); } @@ -990,22 +1125,6 @@ void DrawLoResSource () { } -//=========================================================================== -int GetMonochromeIndex() -{ - int iMonochrome; - - switch (g_eVideoType) - { - case VT_MONO_AMBER: iMonochrome = MONOCHROME_AMBER ; break; - case VT_MONO_GREEN: iMonochrome = MONOCHROME_GREEN ; break; - case VT_MONO_WHITE: iMonochrome = MONOCHROME_WHITE ; break; - default : iMonochrome = MONOCHROME_CUSTOM; break; - } - - return iMonochrome; -} - //=========================================================================== void DrawMonoDHiResSource () { @@ -1047,10 +1166,10 @@ void DrawMonoHiResSource () #if 1 for (int column = 0; column < 512; column += 16) { - for (int y = 0; y < 512; y += 2) + for (int y = 0; y < 512; y += 2) // optimization: Byte=0..FF, Row=Byte*2 { - unsigned val = (y >> 1); - for (int x = 0; x < 16; x += 2) + unsigned val = (y >> 1); // iByte = (y / 2) + for (int x = 0; x < 16; x += 2) // 8 pixels { BYTE colorval = (val & 1) ? iMonochrome : BLACK; val >>= 1; @@ -1701,7 +1820,7 @@ struct BRUSHBMP BYTE bBits[64]; }; -HBRUSH CreateCustomBrush(COLORREF nColor) +HBRUSH V_CreateCustomBrush(COLORREF nColor) { BRUSHBMP brbmp; BYTE *pBytes; @@ -1721,7 +1840,8 @@ HBRUSH CreateCustomBrush(COLORREF nColor) int HatchStyle = 0; DWORD dwBits[1][2] = { - {0xff00ff00,0xff00ff00} +// {0xff00ff00,0xff00ff00} // every other scan line + {0xFFFFFFFF,0xFFFFFFFF} }; memset (&brbmp, 0, sizeof (brbmp)); @@ -1751,40 +1871,6 @@ HBRUSH CreateCustomBrush(COLORREF nColor) } -//=========================================================================== -void DrawMonoTextSource (HDC hDstDC) -{ - static HBITMAP hCharBitmap[4]; - HDC hSrcDC = CreateCompatibleDC(hDstDC); - - hCharBitmap[0] = LoadBitmap(g_hInstance,TEXT("CHARSET40")); - hCharBitmap[1] = LoadBitmap(g_hInstance,TEXT("CHARSET82")); - hCharBitmap[2] = LoadBitmap(g_hInstance,TEXT("CHARSET8C")); // FIXME: Pravets 8M probably has the same charset as Pravets 8C - hCharBitmap[3] = LoadBitmap(g_hInstance,TEXT("CHARSET8C")); - - HBRUSH hBrush; - switch (g_eVideoType) - { - case VT_MONO_AMBER: hBrush = CreateSolidBrush(RGB(0xFF,0x80,0x00)); break; - case VT_MONO_GREEN: hBrush = CreateSolidBrush(RGB(0x00,0xC0,0x00)); break; - case VT_MONO_WHITE: hBrush = CreateSolidBrush(RGB(0xFF,0xFF,0xFF)); break; -// case VT_MONO_AUTHENTIC: hBrush = CreateCustomBrush(RGB(0x00,0xC0,0x00)); break; - default : hBrush = CreateSolidBrush(monochrome); break; - } - - SelectObject(hSrcDC,hCharBitmap[g_nCharsetType]); - SelectObject(hDstDC,hBrush); - - // TODO: Update with APPLE_FONT_Y_ values - BitBlt(hDstDC,SRCOFFS_40COL,0,256,512,hSrcDC,0,0,MERGECOPY); - BitBlt(hDstDC,SRCOFFS_IIPLUS,0,256,256,hSrcDC,0,512,MERGECOPY); - StretchBlt(hDstDC,SRCOFFS_80COL,0,128,512,hSrcDC,0,0,256,512,MERGECOPY); - SelectObject(hDstDC,GetStockObject(NULL_BRUSH)); - DeleteObject(hBrush); - DeleteDC(hSrcDC); - DeleteObject(hCharBitmap); -} - //=========================================================================== void DrawTextSource (HDC dc) { @@ -2419,7 +2505,7 @@ void VideoBenchmark () { } //=========================================================================== -BYTE __stdcall VideoCheckMode (WORD, WORD address, BYTE, BYTE, ULONG uExecutedCycles) +BYTE VideoCheckMode (WORD, WORD address, BYTE, BYTE, ULONG uExecutedCycles) { address &= 0xFF; if (address == 0x7F) @@ -2498,7 +2584,7 @@ void VideoCheckPage (BOOL force) { */ -BYTE __stdcall VideoCheckVbl (WORD, WORD, BYTE, BYTE, ULONG uExecutedCycles) +BYTE VideoCheckVbl (WORD, WORD, BYTE, BYTE, ULONG uExecutedCycles) { bool bVblBar = false; VideoGetScannerAddress(&bVblBar, uExecutedCycles); @@ -2508,22 +2594,25 @@ BYTE __stdcall VideoCheckVbl (WORD, WORD, BYTE, BYTE, ULONG uExecutedCycles) } //=========================================================================== -void VideoChooseColor () { - CHOOSECOLOR cc; - ZeroMemory(&cc,sizeof(CHOOSECOLOR)); - cc.lStructSize = sizeof(CHOOSECOLOR); - cc.hwndOwner = g_hFrameWindow; - cc.rgbResult = monochrome; - cc.lpCustColors = customcolors; - cc.Flags = CC_RGBINIT | CC_SOLIDCOLOR; - if (ChooseColor(&cc)) { - monochrome = cc.rgbResult; - VideoReinitialize(); - if ((g_nAppMode != MODE_LOGO) && (g_nAppMode != MODE_DEBUG)) - VideoRedrawScreen(); - - Config_Save_Video(); - } +void VideoChooseColor () +{ + CHOOSECOLOR cc; + ZeroMemory(&cc,sizeof(CHOOSECOLOR)); + cc.lStructSize = sizeof(CHOOSECOLOR); + cc.hwndOwner = g_hFrameWindow; + cc.rgbResult = monochrome; + cc.lpCustColors = customcolors + 1; + cc.Flags = CC_RGBINIT | CC_SOLIDCOLOR; + if (ChooseColor(&cc)) + { + monochrome = cc.rgbResult; + VideoReinitialize(); + if ((g_nAppMode != MODE_LOGO) && (g_nAppMode != MODE_DEBUG)) + { + VideoRedrawScreen(); + } + Config_Save_Video(); + } } //=========================================================================== @@ -2649,66 +2738,6 @@ BOOL VideoHasRefreshed () { return result; } -//=========================================================================== -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); - - // 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, - 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, - 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(); - - // 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 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(); -} - //=========================================================================== void VideoRealizePalette(HDC dc) { @@ -2874,7 +2903,7 @@ void _Video_RedrawScreen( VideoUpdateFuncPtr_t pfUpdate, bool bMixed ) } } -#if 0 +#if 1 // New simpified code: // . Oliver Schmidt gets a flickering mouse cursor with this code if (hFrameDC && anydirty) @@ -2983,8 +3012,8 @@ void _Video_RedrawScreen( VideoUpdateFuncPtr_t pfUpdate, bool bMixed ) //=========================================================================== void VideoReinitialize () { - CreateIdentityPalette(); - CreateDIBSections(); + V_CreateIdentityPalette(); + V_CreateDIBSections(); } @@ -3005,7 +3034,7 @@ void VideoResetState () //=========================================================================== -BYTE __stdcall VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles) +BYTE VideoSetMode (WORD, WORD address, BYTE write, BYTE, ULONG uExecutedCycles) { address &= 0xFF; DWORD oldpage2 = SW_PAGE2; diff --git a/AppleWin/source/Video.h b/AppleWin/source/Video.h index 12089a20..a9927da4 100644 --- a/AppleWin/source/Video.h +++ b/AppleWin/source/Video.h @@ -123,6 +123,7 @@ enum VideoScreenShot_e }; void Video_TakeScreenShot( int iScreenShotType ); -BYTE __stdcall VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); -BYTE __stdcall VideoCheckVbl (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); -BYTE __stdcall VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); +// Win32/MSVC: __stdcall +BYTE VideoCheckMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); +BYTE VideoCheckVbl (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles); +BYTE VideoSetMode (WORD pc, WORD addr, BYTE bWrite, BYTE d, ULONG uExecutedCycles);