From f485b2ef4cc67957583f836ade916d0893e57542 Mon Sep 17 00:00:00 2001 From: InvisibleUp Date: Wed, 1 Jul 2020 23:13:45 -0400 Subject: [PATCH] Rewrote video rendering code to leverage SDL Right now the program starts up and immediately exits. That naturally needs to be fixed. I'll do that soon. --- src/UI/COMOSGLU.c | 27 - src/UI/CONFIGM.c | 5 +- src/UI/CONTROLM.c | 1112 +--------------------------------------- src/UI/CONTROLM.h | 39 +- src/UI/SDL2/KEYBOARD.c | 5 +- src/UI/SDL2/OSGLUSD2.c | 24 +- src/UI/SDL2/VIDEO.c | 557 ++------------------ 7 files changed, 86 insertions(+), 1683 deletions(-) diff --git a/src/UI/COMOSGLU.c b/src/UI/COMOSGLU.c index 6921e31..6574bdc 100644 --- a/src/UI/COMOSGLU.c +++ b/src/UI/COMOSGLU.c @@ -495,33 +495,6 @@ GLOBALPROC ScreenChangedAll(void) ScreenChangedRight = vMacScreenWidth; } -GLOBALOSGLUPROC Screen_OutputFrame(uint8_t * screencurrentbuff) -{ - int16_t top; - int16_t left; - int16_t bottom; - int16_t right; - - if (! EmVideoDisable) { - if (ScreenFindChanges(screencurrentbuff, EmLagTime, - &top, &left, &bottom, &right)) - { - if (top < ScreenChangedTop) { - ScreenChangedTop = top; - } - if (bottom > ScreenChangedBottom) { - ScreenChangedBottom = bottom; - } - if (left < ScreenChangedLeft) { - ScreenChangedLeft = left; - } - if (right > ScreenChangedRight) { - ScreenChangedRight = right; - } - } - } -} - #if MayFullScreen GLOBALVAR uint16_t ViewHSize; GLOBALVAR uint16_t ViewVSize; diff --git a/src/UI/CONFIGM.c b/src/UI/CONFIGM.c index eb86726..a0e8064 100644 --- a/src/UI/CONFIGM.c +++ b/src/UI/CONFIGM.c @@ -5,7 +5,7 @@ * */ -#include // everything else is deprecated now +#include // everything else is deprecated now #include #include #include "CONFIGM.h" @@ -18,5 +18,6 @@ void ConfigMode_Tick() // Get the screen context and just draw something there for now SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); - SDL_RenderDrawRect(renderer, {.x = 16, .y = 16, .w = 128, .h = 128}); + const SDL_Rect rect = {.x = 16, .y = 16, .w = 128, .h = 128}; + SDL_RenderDrawRect(renderer, &rect); } diff --git a/src/UI/CONTROLM.c b/src/UI/CONTROLM.c index 21db3ce..db418ab 100644 --- a/src/UI/CONTROLM.c +++ b/src/UI/CONTROLM.c @@ -30,6 +30,8 @@ #include "UTIL/ENDIANAC.h" #include "UI/CONTROLM.h" +#include +#include "UI/SDL2/OSGLUSD2.h" /* Constants and globals */ @@ -57,1043 +59,7 @@ bool RequestInsertDisk = false; uint8_t RequestIthDisk = 0; bool ControlKeyPressed = false; -/* Cell drawing */ - -LOCALPROC DrawCell(unsigned int h, unsigned int v, int x) -{ -#if 1 - /* safety check */ - if ((h < ((long)vMacScreenWidth / 8 - 2)) - && (v < (vMacScreenHeight / 16 - 1))) -#endif - { - int i; - uint8_t * p0 = ((uint8_t *)CellData) + 16 * x; - - if (vMacScreenDepth > 0 && UseColorMode) { - uint8_t * p = CntrlDisplayBuff - + ((h + 1) << vMacScreenDepth) - + (v * 16 + 11) * vMacScreenByteWidth; - - for (i = 16; --i >= 0; ) { - int k; - uint32_t v; - uint8_t t0 = *p0; - uint8_t * p2 = p; - if (1 == vMacScreenDepth) { - for (k = 2; --k >= 0; ) { - *p2++ = (((t0) & 0x80) ? 0xC0 : 0x00) - | (((t0) & 0x40) ? 0x30 : 0x00) - | (((t0) & 0x20) ? 0x0C : 0x00) - | (((t0) & 0x10) ? 0x03 : 0x00); - /* black RRGGBBAA, white RRGGBBAA */ - t0 <<= 4; - } - } else if (2 == vMacScreenDepth) { - for (k = 4; --k >= 0; ) { - *p2++ = (((t0) & 0x40) ? 0x0F : 0x00) - | (((t0) & 0x80) ? 0xF0 : 0x00); - /* black RRGGBBAA, white RRGGBBAA */ - t0 <<= 2; - } - } else if (3 == vMacScreenDepth) { - for (k = 8; --k >= 0; ) { - *p2++ = ((t0 >> k) & 0x01) ? 0xFF : 0x00; - /* black RRGGBBAA, white RRGGBBAA */ - } - } else if (4 == vMacScreenDepth) { - for (k = 8; --k >= 0; ) { - v = ((t0 >> k) & 0x01) ? 0x0000 : 0x7FFF; - /* black RRGGBBAA, white RRGGBBAA */ - /* *((uint16_t *)p2)++ = v; need big endian, so : */ - *p2++ = v >> 8; - *p2++ = v; - } - } else if (5 == vMacScreenDepth) { - for (k = 8; --k >= 0; ) { - v = ((t0 >> k) & 0x01) ? 0x00000000 : 0x00FFFFFF; - /* black RRGGBBAA, white RRGGBBAA */ - /* *((uint32_t *)p2)++ = v; need big endian, so : */ - *p2++ = v >> 24; - *p2++ = v >> 16; - *p2++ = v >> 8; - *p2++ = v; - } - } - p += vMacScreenByteWidth; - p0 ++; - } - } else { - uint8_t * p = CntrlDisplayBuff + (h + 1) - + (v * 16 + 11) * vMacScreenMonoByteWidth; - - for (i = 16; --i >= 0; ) { - *p = *p0; - p += vMacScreenMonoByteWidth; - p0 ++; - } - } - } -} - -LOCALVAR int CurCellh0; -LOCALVAR int CurCellv0; - -LOCALPROC DrawCellsBeginLine(void) -{ - DrawCell(ControlBoxh0, CurCellv0, kCellMiddleLeft); - CurCellh0 = hStart; -} - -LOCALPROC DrawCellsEndLine(void) -{ - int i; - - for (i = CurCellh0; i < hLimit; ++i) { - DrawCell(i, CurCellv0, kCellSpace); - } - DrawCell(hLimit, CurCellv0, kCellMiddleRight); - CurCellv0++; -} - -LOCALPROC DrawCellsBottomLine(void) -{ - int i; - - DrawCell(ControlBoxh0 + 0, CurCellv0, kCellLowerLeft); - for (i = hStart; i < hLimit; ++i) { - DrawCell(i, CurCellv0, kCellLowerMiddle); - } - DrawCell(hLimit, CurCellv0, kCellLowerRight); -} - -LOCALPROC DrawCellAdvance(int x) -{ - DrawCell(CurCellh0, CurCellv0, x); - CurCellh0++; -} - -LOCALPROC DrawCellsBlankLine(void) -{ - DrawCellsBeginLine(); - DrawCellsEndLine(); -} - -LOCALPROC DrawCellsFromStr(char *s) -{ - uint8_t ps[ClStrMaxLength]; - uint8_t cs; - int L; - int i; - int j; - int w; - - ClStrFromSubstCStr(&L, ps, s); - - i = 0; - - while (i < L) { - cs = ps[i]; - i++; - if (CurCellh0 < hLimit) { - DrawCellAdvance(cs); - } else { - /* line is too wide, wrap */ - if (kCellSpace != cs) { - --i; /* back up one char, at least */ - - /* now try backing up to beginning of word */ - j = i; - w = CurCellh0 - hStart; - - while ((w > 0) && (j > 0) - && (ps[j - 1] != kCellSpace)) - { - --j; - --w; - } - if (w != 0) { - i = j; - CurCellh0 = hStart + w; - } - /* - else if w == 0, then have backed up to - beginning of line, so just let the word - be split. - */ - } - /* - else if cs == kCellSpace, just lose the space. - */ - DrawCellsEndLine(); - /* - draw white space over the part of - the word that have already drawn - */ - DrawCellsBeginLine(); - } - } -} - -LOCALPROC DrawCellsOneLineStr(char *s) -{ - DrawCellsBeginLine(); - DrawCellsFromStr(s); - DrawCellsEndLine(); -} - -LOCALPROC DrawCellsKeyCommand(char *k, char *s) -{ - DrawCellsBeginLine(); - DrawCellsFromStr(" "); - DrawCellsFromStr(k); - DrawCellsFromStr(" - "); - DrawCellsFromStr(s); - DrawCellsEndLine(); -} - -LOCALPROC DrawSpclMode0(char *Title, SpclModeBody Body) -{ - int i; - int k; - - CurCellv0 = ControlBoxv0 + 0; - DrawCell(ControlBoxh0 + 0, CurCellv0, kCellUpperLeft); - k = kCellIcon00; - for (i = hStart; i < hStart + 4; ++i) { - DrawCell(i, CurCellv0, k); - k++; - } - for (i = hStart + 4; i < hLimit; ++i) { - DrawCell(i, CurCellv0, kCellUpperMiddle); - } - DrawCell(hLimit, CurCellv0, kCellUpperRight); - ++CurCellv0; - - DrawCellsBeginLine(); - for (i = hStart; i < hStart + 4; ++i) { - DrawCellAdvance(k); - k++; - } - DrawCellAdvance(kCellSpace); - DrawCellsFromStr(Title); - DrawCellsEndLine(); - - DrawCellsBeginLine(); - for (i = hStart; i < hStart + 4; ++i) { - DrawCellAdvance(k); - k++; - } - for (i = hStart + 4; i < hLimit; ++i) { - DrawCellAdvance(kCellGraySep); - } - DrawCellsEndLine(); - - if (nullpr != Body) { - Body(); - } - - DrawCellsBottomLine(); -} - -#if WantAbnormalReports -LOCALPROC ClStrAppendHexNib(int *L0, uint8_t *r, uint8_t v) -{ - if (v < 10) { - ClStrAppendChar(L0, r, kCellDigit0 + v); - } else { - ClStrAppendChar(L0, r, kCellUpA + (v - 10)); - } -} - -LOCALPROC ClStrAppendHexByte(int *L0, uint8_t *r, uint8_t v) -{ - ClStrAppendHexNib(L0, r, (v >> 4) & 0x0F); - ClStrAppendHexNib(L0, r, v & 0x0F); -} - -LOCALPROC ClStrAppendHexWord(int *L0, uint8_t *r, uint16_t v) -{ - ClStrAppendHexByte(L0, r, (v >> 8) & 0xFF); - ClStrAppendHexByte(L0, r, v & 0xFF); -} - -LOCALPROC DrawCellsOneLineHexWord(uint16_t v) -{ - uint8_t ps[ClStrMaxLength]; - int L = 0; - int i; - - ClStrAppendHexWord(&L, ps, v); - - DrawCellsBeginLine(); - for (i = 0; i < L; ++i) { - DrawCellAdvance(ps[i]); - } - DrawCellsEndLine(); -} -#endif - -LOCALPROC DrawCellsMessageModeBody(void) -{ - DrawCellsOneLineStr(SavedBriefMsg); - DrawCellsBlankLine(); - DrawCellsOneLineStr(SavedLongMsg); -#if WantAbnormalReports - if (0 != SavedIDMsg) { - DrawCellsBlankLine(); - DrawCellsOneLineHexWord(SavedIDMsg); - } -#endif -} - -LOCALPROC DrawMessageMode(void) -{ - DrawSpclMode0(kStrModeMessage, DrawCellsMessageModeBody); -} - -void MacMsgDisplayOff(void) -{ - SpecialModeClr(SpclModeMessage); - SavedBriefMsg = nullpr; -#if WantAbnormalReports - SavedIDMsg = 0; -#endif - NeedWholeScreenDraw = true; -} - -void MacMsgDisplayOn(void) -{ - NeedWholeScreenDraw = true; - DisconnectKeyCodes1(kKeepMaskControl | kKeepMaskCapsLock); - /* command */ - SpecialModeSet(SpclModeMessage); -} - -LOCALPROC DoMessageModeKey(uint8_t key) -{ - if (MKC_C == key) { - MacMsgDisplayOff(); - } -} - -void MacMsgOverride(char *briefMsg, char *longMsg) -{ - if (MacMsgDisplayed) { - MacMsgDisplayOff(); - } - MacMsg(briefMsg, longMsg, false); -} - -#if NeedDoMoreCommandsMsg -void DoMoreCommandsMsg(void) -{ - MacMsgOverride(kStrMoreCommandsTitle, - kStrMoreCommandsMessage); -} -#endif - -#if NeedDoAboutMsg -void DoAboutMsg(void) -{ - MacMsgOverride(kStrAboutTitle, - kStrAboutMessage); -} -#endif - -LOCALPROC NoRomMsgDisplayOff(void) -{ - SpecialModeClr(SpclModeNoRom); - NeedWholeScreenDraw = true; -} - -LOCALPROC NoRomMsgDisplayOn(void) -{ - NeedWholeScreenDraw = true; - SpecialModeSet(SpclModeNoRom); -} - -LOCALPROC DrawCellsNoRomModeBody(void) -{ - DrawCellsOneLineStr(kStrNoROMMessage); -} - -LOCALPROC DrawNoRomMode(void) -{ - DrawSpclMode0(kStrNoROMTitle, DrawCellsNoRomModeBody); -} - -#if UseControlKeys - -LOCALVAR bool LastControlKey = false; -LOCALVAR int CurControlMode = 0; -LOCALVAR int ControlMessage = 0; - -enum { - kCntrlModeOff, - kCntrlModeBase, - kCntrlModeConfirmReset, - kCntrlModeConfirmInterrupt, - kCntrlModeConfirmQuit, - kCntrlModeSpeedControl, - - kNumCntrlModes -}; - -enum { - kCntrlMsgBaseStart, - kCntrlMsgMagnify, - kCntrlMsgFullScreen, - kCntrlMsgConfirmResetStart, - kCntrlMsgHaveReset, - kCntrlMsgResetCancelled, - kCntrlMsgConfirmInterruptStart, - kCntrlMsgHaveInterrupted, - kCntrlMsgInterruptCancelled, - kCntrlMsgConfirmQuitStart, - kCntrlMsgQuitCancelled, - kCntrlMsgEmCntrl, - kCntrlMsgSpeedControlStart, - kCntrlMsgNewSpeed, - kCntrlMsgNewStopped, - kCntrlMsgNewRunInBack, - kCntrlMsgAbout, - kCntrlMsgHelp, - kCntrlMsgOptionsStrCopied, - kNumCntrlMsgs -}; - -LOCALPROC DoEnterControlMode(void) -{ - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgBaseStart; - NeedWholeScreenDraw = true; - DisconnectKeyCodes1(kKeepMaskControl | kKeepMaskCapsLock); - SpecialModeSet(SpclModeControl); -} - -LOCALPROC DoLeaveControlMode(void) -{ - SpecialModeClr(SpclModeControl); - CurControlMode = kCntrlModeOff; - NeedWholeScreenDraw = true; -} - -LOCALPROC Keyboard_UpdateControlKey(bool down) -{ - if (down != LastControlKey) { - LastControlKey = down; - if (down) { - DoEnterControlMode(); - } else { - DoLeaveControlMode(); - } - } -} - -LOCALPROC SetSpeedValue(uint8_t i) -{ - SpeedValue = i; - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgNewSpeed; -} - -#if IncludeHostTextClipExchange -LOCALPROC HTCEexportSubstCStr(char *s) -{ - int i; - int L; - tPbuf j; -#ifdef PbufHaveLock - int n = ClStrSizeSubstCStr(s); - - if (mnvm_noErr == PbufNew(n, &j)) { - bool IsOk = false; - uint8_t * p = PbufLock(j); - - if (nullpr != p) { - L = 0; - ClStrAppendSubstCStr(&L, p, s); - - if (L == n) { - for (i = 0; i < n; ++i) { - p[i] = Cell2MacAsciiMap[p[i]]; - } - IsOk = true; - } - - PbufUnlock(j); - } - - if (IsOk) { - HTCEexport(j); - } else { - PbufDispose(j); - } - } -#else - uint8_t ps[ClStrMaxLength]; - - ClStrFromSubstCStr(&L, ps, s); - - for (i = 0; i < L; ++i) { - ps[i] = Cell2MacAsciiMap[ps[i]]; - } - - if (mnvm_noErr == PbufNew(L, &j)) { - PbufTransfer(ps, j, 0, L, true); - HTCEexport(j); - } -#endif -} -#endif - -#if IncludeHostTextClipExchange -LOCALPROC CopyOptionsStr(void) -{ - HTCEexportSubstCStr(kBldOpts); -} -#endif - -LOCALPROC DoControlModeKey(uint8_t key) -{ - switch (CurControlMode) { - case kCntrlModeBase: - switch (key) { - case MKC_K: - ControlKeyPressed = ! ControlKeyPressed; - ControlMessage = kCntrlMsgEmCntrl; - Keyboard_UpdateKeyMap1(MKC_UnMappedKey, - ControlKeyPressed); - break; - case MKC_S: - CurControlMode = kCntrlModeSpeedControl; - ControlMessage = kCntrlMsgSpeedControlStart; - break; - case MKC_I: - CurControlMode = kCntrlModeConfirmInterrupt; - ControlMessage = kCntrlMsgConfirmInterruptStart; - break; - case MKC_R: - if (! AnyDiskInserted()) { - WantMacReset = true; - ControlMessage = kCntrlMsgHaveReset; - } else { - CurControlMode = kCntrlModeConfirmReset; - ControlMessage = kCntrlMsgConfirmResetStart; - } - break; - case MKC_Q: - if (! AnyDiskInserted()) { - ForceMacOff = true; - } else { - CurControlMode = kCntrlModeConfirmQuit; - ControlMessage = kCntrlMsgConfirmQuitStart; - } - break; - case MKC_A: - ControlMessage = kCntrlMsgAbout; - break; - case MKC_H: - ControlMessage = kCntrlMsgHelp; - break; -#if NeedRequestInsertDisk - case MKC_O: - RequestInsertDisk = true; - break; -#endif - case MKC_M: - WantMagnify = ! WantMagnify; - ControlMessage = kCntrlMsgMagnify; - break; -#if 1 - case MKC_F: - ToggleWantFullScreen(); - ControlMessage = kCntrlMsgFullScreen; - break; -#endif -#if IncludeHostTextClipExchange - case MKC_P: - CopyOptionsStr(); - ControlMessage = kCntrlMsgOptionsStrCopied; - break; -#endif -#if NeedRequestIthDisk - case MKC_1: - RequestIthDisk = 1; - break; - case MKC_2: - RequestIthDisk = 2; - break; - case MKC_3: - RequestIthDisk = 3; - break; - case MKC_4: - RequestIthDisk = 4; - break; - case MKC_5: - RequestIthDisk = 5; - break; - case MKC_6: - RequestIthDisk = 6; - break; - case MKC_7: - RequestIthDisk = 7; - break; - case MKC_8: - RequestIthDisk = 8; - break; - case MKC_9: - RequestIthDisk = 9; - break; -#endif - } - break; - case kCntrlModeConfirmReset: - switch (key) { - case MKC_Y: - WantMacReset = true; - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgHaveReset; - break; - case MKC_R: - /* ignore, in case of repeat */ - break; - case MKC_N: - default: - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgResetCancelled; - break; - } - break; - case kCntrlModeConfirmInterrupt: - switch (key) { - case MKC_Y: - WantMacInterrupt = true; - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgHaveInterrupted; - break; - case MKC_I: - /* ignore, in case of repeat */ - break; - case MKC_N: - default: - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgInterruptCancelled; - break; - } - break; - case kCntrlModeConfirmQuit: - switch (key) { - case MKC_Y: - ForceMacOff = true; - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgBaseStart; - /* shouldn't see this message since quitting */ - break; - case MKC_Q: - /* ignore, in case of repeat */ - break; - case MKC_N: - default: - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgQuitCancelled; - break; - } - break; - case kCntrlModeSpeedControl: - switch (key) { - case MKC_E: - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgBaseStart; - break; - case MKC_B: - RunInBackground = ! RunInBackground; - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgNewRunInBack; - break; - case MKC_D: - if (ROM_loaded) { - SpeedStopped = ! SpeedStopped; - CurControlMode = kCntrlModeBase; - ControlMessage = kCntrlMsgNewStopped; - } - break; - case MKC_Z: - SetSpeedValue(0); - break; - case MKC_1: - SetSpeedValue(1); - break; - case MKC_2: - SetSpeedValue(2); - break; - case MKC_3: - SetSpeedValue(3); - break; - case MKC_4: - SetSpeedValue(4); - break; - case MKC_5: - SetSpeedValue(5); - break; - case MKC_A: - SetSpeedValue((uint8_t) -1); - break; - } - break; - } - NeedWholeScreenDraw = true; -} - -LOCALFUNC char * ControlMode2TitleStr(void) -{ - char *s; - - switch (CurControlMode) { - case kCntrlModeConfirmReset: - s = kStrModeConfirmReset; - break; - case kCntrlModeConfirmInterrupt: - s = kStrModeConfirmInterrupt; - break; - case kCntrlModeConfirmQuit: - s = kStrModeConfirmQuit; - break; - case kCntrlModeSpeedControl: - s = kStrModeSpeedControl; - break; - case kCntrlModeBase: - default: - if (kCntrlMsgHelp == ControlMessage) { - s = kStrModeControlHelp; - } else { - s = kStrModeControlBase; - } - break; - } - - return s; -} - -LOCALPROC DrawCellsControlModeBody(void) -{ - switch (ControlMessage) { - case kCntrlMsgAbout: - DrawCellsOneLineStr(kStrProgramInfo); - - DrawCellsBlankLine(); - - DrawCellsOneLineStr(kStrWorkOfMany); - DrawCellsOneLineStr(kMaintainerName); - DrawCellsOneLineStr(kStrForMoreInfo); - DrawCellsOneLineStr("^w"); - - DrawCellsBlankLine(); - - DrawCellsBeginLine(); - DrawCellsFromStr(kStrLicense); - DrawCellsFromStr(kStrDisclaimer); - DrawCellsEndLine(); - - break; - - case kCntrlMsgHelp: - DrawCellsOneLineStr(kStrHowToLeaveControl); - DrawCellsOneLineStr(kStrHowToPickACommand); - DrawCellsBlankLine(); - DrawCellsKeyCommand("A", kStrCmdAbout); -#if NeedRequestInsertDisk - DrawCellsKeyCommand("O", kStrCmdOpenDiskImage); -#endif - DrawCellsKeyCommand("Q", kStrCmdQuit); - DrawCellsKeyCommand("S", kStrCmdSpeedControl); - DrawCellsKeyCommand("M", kStrCmdMagnifyToggle); -#if 1 - DrawCellsKeyCommand("F", kStrCmdFullScrnToggle); -#endif - DrawCellsKeyCommand("K", kStrCmdCtrlKeyToggle); - DrawCellsKeyCommand("R", kStrCmdReset); - DrawCellsKeyCommand("I", kStrCmdInterrupt); - DrawCellsKeyCommand("P", kStrCmdCopyOptions); - DrawCellsKeyCommand("H", kStrCmdHelp); - break; - case kCntrlMsgSpeedControlStart: - DrawCellsOneLineStr(kStrCurrentSpeed); - DrawCellsKeyCommand("Z", "1x"); - DrawCellsKeyCommand("1", "2x"); - DrawCellsKeyCommand("2", "4x"); - DrawCellsKeyCommand("3", "8x"); - DrawCellsKeyCommand("4", "16x"); - DrawCellsKeyCommand("5", "32x"); - DrawCellsKeyCommand("A", kStrSpeedAllOut); - DrawCellsBlankLine(); - DrawCellsKeyCommand("D", kStrSpeedStopped); - DrawCellsKeyCommand("B", kStrSpeedBackToggle); - DrawCellsBlankLine(); - DrawCellsKeyCommand("E", kStrSpeedExit); - break; - case kCntrlMsgNewSpeed: - DrawCellsOneLineStr(kStrNewSpeed); - break; - case kCntrlMsgNewRunInBack: - DrawCellsOneLineStr(kStrNewRunInBack); - break; - case kCntrlMsgNewStopped: - DrawCellsOneLineStr(kStrNewStopped); - break; - case kCntrlMsgMagnify: - DrawCellsOneLineStr(kStrNewMagnify); - break; -#if 1 - case kCntrlMsgFullScreen: - DrawCellsOneLineStr(kStrNewFullScreen); - break; -#endif -#if IncludeHostTextClipExchange - case kCntrlMsgOptionsStrCopied: - DrawCellsOneLineStr(kStrHaveCopiedOptions); - break; -#endif - case kCntrlMsgConfirmResetStart: - DrawCellsOneLineStr(kStrConfirmReset); - DrawCellsBlankLine(); - DrawCellsKeyCommand("Y", kStrResetDo); - DrawCellsKeyCommand("N", kStrResetNo); - break; - case kCntrlMsgHaveReset: - DrawCellsOneLineStr(kStrHaveReset); - break; - case kCntrlMsgResetCancelled: - DrawCellsOneLineStr(kStrCancelledReset); - break; - case kCntrlMsgConfirmInterruptStart: - DrawCellsOneLineStr(kStrConfirmInterrupt); - DrawCellsBlankLine(); - DrawCellsKeyCommand("Y", kStrInterruptDo); - DrawCellsKeyCommand("N", kStrInterruptNo); - break; - case kCntrlMsgHaveInterrupted: - DrawCellsOneLineStr(kStrHaveInterrupted); - break; - case kCntrlMsgInterruptCancelled: - DrawCellsOneLineStr(kStrCancelledInterrupt); - break; - case kCntrlMsgConfirmQuitStart: - DrawCellsOneLineStr(kStrConfirmQuit); - DrawCellsBlankLine(); - DrawCellsKeyCommand("Y", kStrQuitDo); - DrawCellsKeyCommand("N", kStrQuitNo); - break; - case kCntrlMsgQuitCancelled: - DrawCellsOneLineStr(kStrCancelledQuit); - break; - case kCntrlMsgEmCntrl: - DrawCellsOneLineStr(kStrNewCntrlKey); - break; - case kCntrlMsgBaseStart: - default: - DrawCellsOneLineStr(kStrHowToLeaveControl); - break; - } -} - -LOCALPROC DrawControlMode(void) -{ - DrawSpclMode0(ControlMode2TitleStr(), DrawCellsControlModeBody); -} - -#endif /* UseControlKeys */ - -LOCALPROC DrawSpclMode(void) -{ -#if UseControlKeys - if (SpecialModeTst(SpclModeControl)) { - DrawControlMode(); - } else -#endif - if (SpecialModeTst(SpclModeMessage)) { - DrawMessageMode(); - } else - if (SpecialModeTst(SpclModeNoRom)) { - DrawNoRomMode(); - } else { - /* should not get here */ - } -} - -uint8_t * GetCurDrawBuff(void) -{ - uint8_t * p = screencomparebuff; - - if (0 != SpecialModes) { - MoveBytes( - (anyp)p, (anyp)CntrlDisplayBuff, - (vMacScreenDepth > 0 && UseColorMode) ? - vMacScreenNumBytes : - vMacScreenMonoNumBytes - ); - p = CntrlDisplayBuff; - - DrawSpclMode(); - } - - return p; -} - -#ifdef WantKeyboard_RemapMac -LOCALFUNC uint8_t Keyboard_RemapMac(uint8_t key) -{ - switch (key) { -#if MKC_formac_Control != MKC_Control - case MKC_Control: - key = MKC_formac_Control; - break; -#endif -#if MKC_formac_Command != MKC_Command - case MKC_Command: - key = MKC_formac_Command; - break; -#endif -#if MKC_formac_Option != MKC_Option - case MKC_Option: - key = MKC_formac_Option; - break; -#endif -#if MKC_formac_Shift != MKC_Shift - case MKC_Shift: - key = MKC_formac_Shift; - break; -#endif -#if MKC_formac_CapsLock != MKC_CapsLock - case MKC_CapsLock: - key = MKC_formac_CapsLock; - break; -#endif -#if MKC_formac_F1 != MKC_F1 - case MKC_F1: - key = MKC_formac_F1; - break; -#endif -#if MKC_formac_F2 != MKC_F2 - case MKC_F2: - key = MKC_formac_F2; - break; -#endif -#if MKC_formac_F3 != MKC_F3 - case MKC_F3: - key = MKC_formac_F3; - break; -#endif -#if MKC_formac_F4 != MKC_F4 - case MKC_F4: - key = MKC_formac_F4; - break; -#endif -#if MKC_formac_F5 != MKC_F5 - case MKC_F5: - key = MKC_formac_F5; - break; -#endif -#if MKC_formac_Escape != MKC_Escape - case MKC_Escape: - key = MKC_formac_Escape; - break; -#endif -#if MKC_formac_BackSlash != MKC_BackSlash - case MKC_BackSlash: - key = MKC_formac_BackSlash; - break; -#endif -#if MKC_formac_Slash != MKC_Slash - case MKC_Slash: - key = MKC_formac_Slash; - break; -#endif -#if MKC_formac_Grave != MKC_Grave - case MKC_Grave: - key = MKC_formac_Grave; - break; -#endif -#if MKC_formac_Enter != MKC_Enter - case MKC_Enter: - key = MKC_formac_Enter; - break; -#endif -#if MKC_formac_PageUp != MKC_PageUp - case MKC_PageUp: - key = MKC_formac_PageUp; - break; -#endif -#if MKC_formac_PageDown != MKC_PageDown - case MKC_PageDown: - key = MKC_formac_PageDown; - break; -#endif -#if MKC_formac_Home != MKC_Home - case MKC_Home: - key = MKC_formac_Home; - break; -#endif -#if MKC_formac_End != MKC_End - case MKC_End: - key = MKC_formac_End; - break; -#endif -#if MKC_formac_Help != MKC_Help - case MKC_Help: - key = MKC_formac_Help; - break; -#endif -#if MKC_formac_ForwardDel != MKC_ForwardDel - case MKC_ForwardDel: - key = MKC_formac_ForwardDel; - break; -#endif - default: - break; - } - - return key; -} -#endif /* WantKeyboard_RemapMac */ - -void Keyboard_UpdateKeyMap2(uint8_t key, bool down) -{ -#if UseControlKeys - if (MKC_CM == key) { - Keyboard_UpdateControlKey(down); - } else -#endif - if ((0 == SpecialModes) || (MKC_CapsLock == key)) { - /* pass through */ - Keyboard_UpdateKeyMap1(key, down); - } else { - if (down) { -#if UseControlKeys - if (SpecialModeTst(SpclModeControl)) { - DoControlModeKey(key); - } else -#endif - if (SpecialModeTst(SpclModeMessage)) { - DoMessageModeKey(key); - } else - { - } - } /* else if not down ignore */ - } -} - -void DisconnectKeyCodes2(void) -{ - DisconnectKeyCodes1(kKeepMaskControl | kKeepMaskCapsLock); -#if UseControlKeys - Keyboard_UpdateControlKey(false); -#endif -} - -#if CheckRomCheckSum -LOCALFUNC uint32_t Calc_Checksum(void) +static uint32_t Calc_Checksum(void) { long int i; uint32_t CheckSum = 0; @@ -1106,57 +72,42 @@ LOCALFUNC uint32_t Calc_Checksum(void) return CheckSum; } -#endif -#if CheckRomCheckSum && RomStartCheckSum +void MacMsgOverride(char *title, char *msg) +{ + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, msg, main_wind); +} + LOCALPROC WarnMsgCorruptedROM(void) { MacMsgOverride(kStrCorruptedROMTitle, kStrCorruptedROMMessage); } -#endif -#if CheckRomCheckSum LOCALPROC WarnMsgUnsupportedROM(void) { MacMsgOverride(kStrUnsupportedROMTitle, kStrUnsupportedROMMessage); } -#endif MacErr_t ROM_IsValid(void) { -#if CheckRomCheckSum - uint32_t CheckSum = Calc_Checksum(); + if(CheckRomCheckSum) { + uint32_t CheckSum = Calc_Checksum(); -#if RomStartCheckSum - if (CheckSum != do_get_mem_long(ROM)) { - WarnMsgCorruptedROM(); - return mnvm_miscErr; - } else -#endif -#ifdef kRomCheckSum1 - if (CheckSum == kRomCheckSum1) { - } else -#endif -#ifdef kRomCheckSum2 - if (CheckSum == kRomCheckSum2) { - } else -#endif -#ifdef kRomCheckSum3 - if (CheckSum == kRomCheckSum3) { - } else -#endif - { - WarnMsgUnsupportedROM(); - return mnvm_miscErr; + if (CheckSum != do_get_mem_long(ROM)) { + // Check against internal checksum + WarnMsgCorruptedROM(); + return mnvm_miscErr; + } else if (!( + CheckSum == kRomCheckSum1 || + CheckSum == kRomCheckSum2 || + CheckSum == kRomCheckSum3 + )) { + // Unsupported ROM + WarnMsgUnsupportedROM(); + return mnvm_miscErr; + } } - /* - Even if ROM is corrupt or unsupported, go ahead and - try to run anyway. It shouldn't do any harm. - [update: no, don't] - */ - -#endif /* CheckRomCheckSum */ ROM_loaded = true; SpeedStopped = false; @@ -1164,22 +115,9 @@ MacErr_t ROM_IsValid(void) return mnvm_noErr; } +// Loop for when there's nothing to do but tell the user they're missing a ROM +// TODO: Hijack this for config mode? bool WaitForRom(void) { - if (! ROM_loaded) { - NoRomMsgDisplayOn(); - - SpeedStopped = true; - do { - WaitForNextTick(); - - if (ForceMacOff) { - return false; - } - } while (SpeedStopped); - - NoRomMsgDisplayOff(); - } - return true; } diff --git a/src/UI/CONTROLM.h b/src/UI/CONTROLM.h index 3da7bb6..db009da 100644 --- a/src/UI/CONTROLM.h +++ b/src/UI/CONTROLM.h @@ -28,43 +28,8 @@ extern bool RunInBackground; extern bool SpeedStopped; extern bool WantFullScreen; -/* Macros and such */ - -enum { - SpclModeNoRom, - SpclModeMessage, - SpclModeControl, - kNumSpclModes -}; - -#define SpecialModeSet(i) SpecialModes |= (1 << (i)) -#define SpecialModeClr(i) SpecialModes &= ~ (1 << (i)) -#define SpecialModeTst(i) (0 != (SpecialModes & (1 << (i)))) - -#define MacMsgDisplayed SpecialModeTst(SpclModeMessage) - -/* Message display */ - -void MacMsgOverride(char *briefMsg, char *longMsg); -void MacMsgDisplayOff(void); -void MacMsgDisplayOn(void); - -#if NeedDoMoreCommandsMsg -void DoMoreCommandsMsg(void); -#endif -#if NeedDoAboutMsg -void DoAboutMsg(void); -#endif - -/* Screen drawing */ - -uint8_t * GetCurDrawBuff(void); - -/* Things that really don't belong here */ - -void Keyboard_UpdateKeyMap2(uint8_t key, bool down); -void DisconnectKeyCodes2(void); - +/* Public Functions */ +void MacMsgOverride(char *title, char *msg); MacErr_t ROM_IsValid(void); bool WaitForRom(void); diff --git a/src/UI/SDL2/KEYBOARD.c b/src/UI/SDL2/KEYBOARD.c index fabf634..1333ca4 100644 --- a/src/UI/SDL2/KEYBOARD.c +++ b/src/UI/SDL2/KEYBOARD.c @@ -163,7 +163,8 @@ void DoKeyCode(SDL_Keysym *r, bool down) { uint8_t v = SDLScan2MacKeyCode(r->scancode); if (MKC_None != v) { - Keyboard_UpdateKeyMap2(v, down); + // this probably breaks keyboard support + //Keyboard_UpdateKeyMap2(v, down); } } @@ -181,6 +182,6 @@ void ReconnectKeyCodes3(void) void DisconnectKeyCodes3(void) { - DisconnectKeyCodes2(); + //DisconnectKeyCodes2(); MouseButtonSet(false); } diff --git a/src/UI/SDL2/OSGLUSD2.c b/src/UI/SDL2/OSGLUSD2.c index 1dfb493..9fe5408 100644 --- a/src/UI/SDL2/OSGLUSD2.c +++ b/src/UI/SDL2/OSGLUSD2.c @@ -149,7 +149,7 @@ LOCALPROC HandleTheEvent(SDL_Event *event) case SDL_KEYUP: DoKeyCode(&event->key.keysym, false); break; - case SDL_MOUSEWHEEL: + /*case SDL_MOUSEWHEEL: if (event->wheel.x < 0) { Keyboard_UpdateKeyMap2(MKC_Left, true); Keyboard_UpdateKeyMap2(MKC_Left, false); @@ -164,7 +164,7 @@ LOCALPROC HandleTheEvent(SDL_Event *event) Keyboard_UpdateKeyMap2(MKC_Up, true); Keyboard_UpdateKeyMap2(MKC_Up, false); } - break; + break;*/ case SDL_DROPFILE: { char *s = event->drop.file; @@ -839,20 +839,12 @@ LOCALPROC CheckForSavedTasks(void) } } - if (CurSpeedStopped != (SpeedStopped || - (gBackgroundFlag && ! RunInBackground))) - { - CurSpeedStopped = ! CurSpeedStopped; - if (CurSpeedStopped) { - EnterSpeedStopped(); + // TODO: fix this + /*if (CurSpeedStopped != (SpeedStopped || + (gBackgroundFlag && ! RunInBackground))){ } else { LeaveSpeedStopped(); - } - } - - if ((nullpr != SavedBriefMsg) & ! MacMsgDisplayed) { - MacMsgDisplayOn(); - } + }*/ #if EnableRecreateW if (0 @@ -1095,10 +1087,6 @@ LOCALFUNC bool InitOSGLU(void) LOCALPROC UnInitOSGLU(void) { - if (MacMsgDisplayed) { - MacMsgDisplayOff(); - } - RestoreKeyRepeat(); #if MayFullScreen UngrabMachine(); diff --git a/src/UI/SDL2/VIDEO.c b/src/UI/SDL2/VIDEO.c index 1d2a3ad..512cb1f 100644 --- a/src/UI/SDL2/VIDEO.c +++ b/src/UI/SDL2/VIDEO.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "CNFGRAPI.h" #include "SYSDEPNS.h" #include "UTIL/ENDIANAC.h" @@ -29,524 +30,60 @@ SDL_PixelFormat *format = NULL; uint8_t * ScalingBuff = nullpr; uint8_t * CLUT_final; - /* - 256 possible values of one byte - 8 pixels per byte maximum (when black and white) - 4 bytes per destination pixel maximum - multiplied by WindowScale if 1 - */ -#define ScrnMapr_DoMap UpdateBWDepth3Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth4Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth5Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#if 1 && ! UseSDLscaling - -#define ScrnMapr_DoMap UpdateBWDepth3ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth4ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateBWDepth5ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth 0 -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#endif /* 1 && ! UseSDLscaling */ - - -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - -#define ScrnMapr_DoMap UpdateColorDepth3Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth4Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth5Copy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final - -#include "HW/SCREEN/SCRNMAPR.h" - -#if 1 && ! UseSDLscaling - -#define ScrnMapr_DoMap UpdateColorDepth3ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 3 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth4ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 4 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#define ScrnMapr_DoMap UpdateColorDepth5ScaledCopy -#define ScrnMapr_Src GetCurDrawBuff() -#define ScrnMapr_Dst ScalingBuff -#define ScrnMapr_SrcDepth vMacScreenDepth -#define ScrnMapr_DstDepth 5 -#define ScrnMapr_Map CLUT_final -#define ScrnMapr_Scale WindowScale - -#include "HW/SCREEN/SCRNMAPR.h" - -#endif /* 1 && ! UseSDLscaling */ - -#endif - - -LOCALPROC HaveChangedScreenBuff(uint16_t top, uint16_t left, - uint16_t bottom, uint16_t right) +// Set the display palette from the Macintosh's memory or w/e +static int SetPalette(SDL_Palette *palette, const SDL_Color *macColors, int ncolors) { - int i; - int j; - uint8_t *p; - Uint32 pixel; -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - Uint32 CLUT_pixel[CLUT_size]; -#endif - Uint32 BWLUT_pixel[2]; - uint32_t top2; - uint32_t left2; - uint32_t bottom2; - uint32_t right2; - void *pixels; - int pitch; - SDL_Rect src_rect; - SDL_Rect dst_rect; - int XDest; - int YDest; - int DestWidth; - int DestHeight; - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - if (top < ViewVStart) { - top = ViewVStart; - } - if (left < ViewHStart) { - left = ViewHStart; - } - if (bottom > ViewVStart + ViewVSize) { - bottom = ViewVStart + ViewVSize; - } - if (right > ViewHStart + ViewHSize) { - right = ViewHStart + ViewHSize; - } - - if ((top >= bottom) || (left >= right)) { - goto label_exit; - } - } -#endif - - XDest = left; - YDest = top; - DestWidth = (right - left); - DestHeight = (bottom - top); - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - XDest -= ViewHStart; - YDest -= ViewVStart; - } -#endif - -#if 1 - if (UseMagnify) { - XDest *= WindowScale; - YDest *= WindowScale; - DestWidth *= WindowScale; - DestHeight *= WindowScale; - } -#endif - -#if 1 - if (UseFullScreen) -#endif -#if MayFullScreen - { - XDest += hOffset; - YDest += vOffset; - } -#endif - - top2 = top; - left2 = left; - bottom2 = bottom; - right2 = right; - -#if 1 && ! UseSDLscaling - if (UseMagnify) { - top2 *= WindowScale; - left2 *= WindowScale; - bottom2 *= WindowScale; - right2 *= WindowScale; - } -#endif - - if (0 != SDL_LockTexture(texture, NULL, &pixels, &pitch)) { - return; - } - - { - - int bpp = format->BytesPerPixel; - uint32_t ExpectedPitch = vMacScreenWidth * bpp; - -#if 1 && ! UseSDLscaling - if (UseMagnify) { - ExpectedPitch *= WindowScale; - } -#endif - -#if 0 != vMacScreenDepth - if (UseColorMode) { -#if vMacScreenDepth < 4 - for (i = 0; i < CLUT_size; ++i) { - CLUT_pixel[i] = SDL_MapRGB(format, - CLUT_reds[i] >> 8, - CLUT_greens[i] >> 8, - CLUT_blues[i] >> 8); - } -#endif - } else -#endif - { - BWLUT_pixel[1] = SDL_MapRGB(format, 0, 0, 0); - /* black */ - BWLUT_pixel[0] = SDL_MapRGB(format, 255, 255, 255); - /* white */ - } - - if ((0 == ((bpp - 1) & bpp)) /* a power of 2 */ - && (pitch == ExpectedPitch) -#if (vMacScreenDepth > 3) - && ! UseColorMode -#endif - ) - { - int k; - Uint32 v; -#if 1 && ! UseSDLscaling - int a; -#endif - int PixPerByte = -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - UseColorMode ? (1 << (3 - vMacScreenDepth)) : -#endif - 8; - Uint8 *p4 = (Uint8 *)CLUT_final; - - for (i = 0; i < 256; ++i) { - for (k = PixPerByte; --k >= 0; ) { - -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - if (UseColorMode) { - v = CLUT_pixel[ -#if 3 == vMacScreenDepth - i -#else - (i >> (k << vMacScreenDepth)) - & (CLUT_size - 1) -#endif - ]; - } else -#endif - { - v = BWLUT_pixel[(i >> k) & 1]; - } - -#if 1 && ! UseSDLscaling - for (a = UseMagnify ? WindowScale : 1; --a >= 0; ) -#endif - { - switch (bpp) { - case 1: /* Assuming 8-bpp */ - *p4++ = v; - break; - case 2: /* Probably 15-bpp or 16-bpp */ - *(Uint16 *)p4 = v; - p4 += 2; - break; - case 4: /* Probably 32-bpp */ - *(Uint32 *)p4 = v; - p4 += 4; - break; - } - } - } - } - - ScalingBuff = (uint8_t *)pixels; - -#if (0 != vMacScreenDepth) && (vMacScreenDepth < 4) - if (UseColorMode) { -#if 1 && ! UseSDLscaling - if (UseMagnify) { - switch (bpp) { - case 1: - UpdateColorDepth3ScaledCopy( - top, left, bottom, right); - break; - case 2: - UpdateColorDepth4ScaledCopy( - top, left, bottom, right); - break; - case 4: - UpdateColorDepth5ScaledCopy( - top, left, bottom, right); - break; - } - } else -#endif - { - switch (bpp) { - case 1: - UpdateColorDepth3Copy(top, left, bottom, right); - break; - case 2: - UpdateColorDepth4Copy(top, left, bottom, right); - break; - case 4: - UpdateColorDepth5Copy(top, left, bottom, right); - break; - } - } - } else -#endif - { -#if 1 && ! UseSDLscaling - if (UseMagnify) { - switch (bpp) { - case 1: - UpdateBWDepth3ScaledCopy( - top, left, bottom, right); - break; - case 2: - UpdateBWDepth4ScaledCopy( - top, left, bottom, right); - break; - case 4: - UpdateBWDepth5ScaledCopy( - top, left, bottom, right); - break; - } - } else -#endif - { - switch (bpp) { - case 1: - UpdateBWDepth3Copy(top, left, bottom, right); - break; - case 2: - UpdateBWDepth4Copy(top, left, bottom, right); - break; - case 4: - UpdateBWDepth5Copy(top, left, bottom, right); - break; - } - } - } - - } else { - uint8_t *the_data = (uint8_t *)GetCurDrawBuff(); - - /* adapted from putpixel in SDL documentation */ - - for (i = top2; i < bottom2; ++i) { - for (j = left2; j < right2; ++j) { - int i0 = i; - int j0 = j; - Uint8 *bufp = (Uint8 *)pixels - + i * pitch + j * bpp; - -#if 1 && ! UseSDLscaling - if (UseMagnify) { - i0 /= WindowScale; - j0 /= WindowScale; - } -#endif - -#if 0 != vMacScreenDepth - if (UseColorMode) { -#if vMacScreenDepth < 4 - p = the_data + ((i0 * vMacScreenWidth + j0) - >> (3 - vMacScreenDepth)); - { - uint8_t k = (*p >> (((~ j0) - & ((1 << (3 - vMacScreenDepth)) - 1)) - << vMacScreenDepth)) - & (CLUT_size - 1); - pixel = CLUT_pixel[k]; - } -#elif 4 == vMacScreenDepth - p = the_data + ((i0 * vMacScreenWidth + j0) << 1); - { - uint16_t t0 = do_get_mem_word(p); - pixel = SDL_MapRGB(format, - ((t0 & 0x7C00) >> 7) - | ((t0 & 0x7000) >> 12), - ((t0 & 0x03E0) >> 2) - | ((t0 & 0x0380) >> 7), - ((t0 & 0x001F) << 3) - | ((t0 & 0x001C) >> 2)); - } -#elif 5 == vMacScreenDepth - p = the_data + ((i0 * vMacScreenWidth + j0) << 2); - pixel = SDL_MapRGB(format, - p[1], - p[2], - p[3]); -#endif - } else -#endif - { - p = the_data + ((i0 * vMacScreenWidth + j0) / 8); - pixel = BWLUT_pixel[(*p >> ((~ j0) & 0x7)) & 1]; - } - - switch (bpp) { - case 1: /* Assuming 8-bpp */ - *bufp = pixel; - break; - case 2: /* Probably 15-bpp or 16-bpp */ - *(Uint16 *)bufp = pixel; - break; - case 3: - /* Slow 24-bpp mode, usually not used */ - if (SDL_BYTEORDER == SDL_BIG_ENDIAN) { - bufp[0] = (pixel >> 16) & 0xff; - bufp[1] = (pixel >> 8) & 0xff; - bufp[2] = pixel & 0xff; - } else { - bufp[0] = pixel & 0xff; - bufp[1] = (pixel >> 8) & 0xff; - bufp[2] = (pixel >> 16) & 0xff; - } - break; - case 4: /* Probably 32-bpp */ - *(Uint32 *)bufp = pixel; - break; - } - } - } - } - - } - - SDL_UnlockTexture(texture); - - src_rect.x = left2; - src_rect.y = top2; - src_rect.w = right2 - left2; - src_rect.h = bottom2 - top2; - - dst_rect.x = XDest; - dst_rect.y = YDest; - dst_rect.w = DestWidth; - dst_rect.h = DestHeight; - - /* SDL_RenderClear(renderer); */ - SDL_RenderCopy(renderer, texture, &src_rect, &dst_rect); - SDL_RenderPresent(renderer); - -#if MayFullScreen -label_exit: - ; -#endif + return SDL_SetPaletteColors(palette, macColors, 0, ncolors); } -LOCALPROC DrawChangesAndClear(void) +// Get pixel format for a given screen depth +// Note: this is complete and total guesswork right now. Lol. +uint32_t GetPixFormatFromDepth(int depth) { - if (ScreenChangedBottom > ScreenChangedTop) { - HaveChangedScreenBuff(ScreenChangedTop, ScreenChangedLeft, - ScreenChangedBottom, ScreenChangedRight); - ScreenClearChanges(); + switch(depth) + { + case 1: + return SDL_PIXELFORMAT_INDEX1LSB; + case 4: + return SDL_PIXELFORMAT_INDEX4LSB; + case 8: + return SDL_PIXELFORMAT_INDEX8; + case 16: + return SDL_PIXELFORMAT_RGB332; + case 24: + return SDL_PIXELFORMAT_RGB24; + case 32: + return SDL_PIXELFORMAT_RGBA8888; + default: + return SDL_PIXELFORMAT_UNKNOWN; } } +// We aren't being smart about *what* to update, since if we use SDL2 properly +// the update operating is stunningly cheap. +GLOBALOSGLUPROC Screen_OutputFrame(uint8_t * src_ptr) +{ + if (EmVideoDisable) { return; } + + uint32_t src_format = GetPixFormatFromDepth(vMacScreenDepth); + + SDL_Surface *src = SDL_CreateRGBSurfaceWithFormatFrom( + src_ptr, + vMacScreenWidth, + vMacScreenHeight, + vMacScreenDepth, + vMacScreenByteWidth, + src_format + ); + + SDL_LockTexture(texture, NULL, NULL, NULL); + SDL_RenderCopy(renderer, texture, NULL, NULL); + SDL_UnlockTexture(texture); + SDL_RenderPresent(renderer); +} + GLOBALOSGLUPROC DoneWithDrawingForTick(void) { -#if EnableFSMouseMotion - if (HaveMouseMotion) { - AutoScrollScreen(); - } -#endif - DrawChangesAndClear(); + return; }