From c6afc54a62ea448a7040044c21cadf86af7ed9f1 Mon Sep 17 00:00:00 2001 From: dgis Date: Thu, 2 May 2019 23:57:15 +0200 Subject: [PATCH] Update the Win32 layer from the Emu42 one and improve UI. --- ReadMe.txt | 3 +- app/build.gradle | 2 +- app/src/main/assets/ReadMe.txt | 2 +- app/src/main/cpp/emu-jni.c | 4 + app/src/main/cpp/win32-layer.c | 108 ++++++++++++++++-- app/src/main/cpp/win32-layer.h | 14 +++ .../emulator/forty/eight/MainActivity.java | 6 +- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/pref_general.xml | 3 +- 9 files changed, 124 insertions(+), 22 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 9674bb9..c84b8e2 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -56,7 +56,7 @@ NOT WORKING YET CHANGES -Version 1.4 (2019-04-xx) +Version 1.4 (2019-05-xx) - Add a RAM card generator for the port 2 of the HP48SX and HP48GX. - Add the possibility to hide the status and/or the navigation bars. @@ -134,7 +134,6 @@ TODO - Sometimes the "busy" annunciator gets stuck - Add KML script loading dependencies fallback to the inner ROM (and may be KML include?) - Add a separation between the pixels (Suggestion from Jaime Meza) -- Add a true fullscreen mode under the status bar and the bottom buttons - Improve the access to the menu - Change the logo following the template diff --git a/app/build.gradle b/app/build.gradle index 8d4115b..04058d3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { cmake { //abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64' //abiFilters 'x86_64' - version "3.10.2" + //version "3.10.2" } } } diff --git a/app/src/main/assets/ReadMe.txt b/app/src/main/assets/ReadMe.txt index 3d00114..62e2ebd 100644 --- a/app/src/main/assets/ReadMe.txt +++ b/app/src/main/assets/ReadMe.txt @@ -56,7 +56,7 @@ NOT WORKING YET CHANGES -Version 1.4 (2019-04-xx) +Version 1.4 (2019-05-xx) - Add a RAM card generator for the port 2 of the HP48SX and HP48GX. - Add the possibility to hide the status and/or the navigation bars. diff --git a/app/src/main/cpp/emu-jni.c b/app/src/main/cpp/emu-jni.c index 36614fb..edccd7f 100644 --- a/app/src/main/cpp/emu-jni.c +++ b/app/src/main/cpp/emu-jni.c @@ -18,6 +18,7 @@ static jobject viewToUpdate = NULL; static jobject mainActivity = NULL; jobject bitmapMainScreen; AndroidBitmapInfo androidBitmapInfo; +enum DialogBoxMode currentDialogBoxMode; enum ChooseKmlMode chooseCurrentKmlMode; TCHAR szChosenCurrentKml[MAX_PATH]; TCHAR szKmlLog[10240]; @@ -905,6 +906,9 @@ JNIEXPORT void JNICALL Java_org_emulator_forty_eight_NativeLib_onBackupSave(JNIE JNIEXPORT void JNICALL Java_org_emulator_forty_eight_NativeLib_onBackupRestore(JNIEnv *env, jobject thisz) { SwitchToState(SM_INVALID); RestoreBackup(); + if(hLcdDC && hLcdDC->selectedBitmap) { + hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight = -abs(hLcdDC->selectedBitmap->bitmapInfoHeader->biHeight); + } if (pbyRom) SwitchToState(SM_RUN); } diff --git a/app/src/main/cpp/win32-layer.c b/app/src/main/cpp/win32-layer.c index 289f920..0aa34f4 100644 --- a/app/src/main/cpp/win32-layer.c +++ b/app/src/main/cpp/win32-layer.c @@ -788,7 +788,18 @@ HGLOBAL WINAPI GlobalFree(HGLOBAL hMem) { BOOL GetOpenFileName(LPOPENFILENAME openFilename) { return FALSE; } + +TCHAR getSaveObjectFilenameResult[MAX_PATH]; BOOL GetSaveFileName(LPOPENFILENAME openFilename) { + if(openFilename) { + if(currentDialogBoxMode == DialogBoxMode_SET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_SET_USRPRG42) { + openFilename->nMaxFile = MAX_PATH; + openFilename->nFileExtension = 1; + openFilename->lpstrFile = getSaveObjectFilenameResult; + return TRUE; + } + } return FALSE; } @@ -797,14 +808,41 @@ HANDLE LoadImage(HINSTANCE hInst, LPCSTR name, UINT type, int cx, int cy, UINT f return NULL; } + +LPARAM itemData[MAX_ITEMDATA]; +TCHAR *itemString[MAX_ITEMDATA]; +int itemDataCount = 0; +int selItemDataIndex[MAX_ITEMDATA]; +int selItemDataCount = 0; +TCHAR labels[MAX_LABEL_SIZE]; + LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { //TODO + if(currentDialogBoxMode == DialogBoxMode_GET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_GET_USRPRG42 + || currentDialogBoxMode == DialogBoxMode_SET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_SET_USRPRG42) { + if (Msg == LB_ADDSTRING && itemDataCount < MAX_ITEMDATA) { + itemString[itemDataCount] = (TCHAR *)lParam; + return itemDataCount++; + } else if (Msg == LB_SETITEMDATA && wParam < MAX_ITEMDATA) { + itemData[wParam] = lParam; + } else if (Msg == LB_GETITEMDATA && wParam < MAX_ITEMDATA) { + return itemData[wParam]; + } else if (Msg == LB_GETCOUNT) { + return itemDataCount; + } else if (Msg == LB_GETSELCOUNT) { + return selItemDataCount; + } else if (Msg == LB_GETSEL && wParam < itemDataCount && wParam < MAX_ITEMDATA) { + return selItemDataIndex[wParam]; + } + } return NULL; } BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { //TODO if(hWnd == 0 && Msg == WM_COMMAND) { - int menuCommand = (wParam & 0xffff) - 40000; + int menuCommand = (int) ((wParam & 0xffff) - 40000); LOGD("Menu Item %d", menuCommand); sendMenuItemCommand(menuCommand); } @@ -1714,8 +1752,13 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc brushColor = hdcDest->selectedBrushColor->brushColor; } COLORREF backgroundColor = 0xFF000000; // 0xAABBGGRR - if(hdcDest->isBackgroundColorSet) { - brushColor = hdcDest->backgroundColor; + if(sourceBitCount > 1 && destinationBitCount == 1 && hdcSrc->isBackgroundColorSet) + { + backgroundColor = hdcSrc->backgroundColor; + } + else if(sourceBitCount == 1 && destinationBitCount > 1 && hdcDest->isBackgroundColorSet) + { + backgroundColor = hdcDest->backgroundColor; } int dst_maxx = xDest + wDest; @@ -1762,13 +1805,15 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc BYTE * sourcePixel = sourcePixelBase + ((UINT)src_curx >> (UINT)3); UINT bitNumber = (UINT) (src_curx % 8); if(*sourcePixel & ((UINT)1 << bitNumber)) { - sourceColorPointer[0] = 0; - sourceColorPointer[1] = 0; - sourceColorPointer[2] = 0; - } else { + // Monochrome 1=White sourceColorPointer[0] = 255; sourceColorPointer[1] = 255; sourceColorPointer[2] = 255; + } else { + // Monochrome 0=Black + sourceColorPointer[0] = 0; + sourceColorPointer[1] = 0; + sourceColorPointer[2] = 0; } sourceColorPointer[3] = 255; break; @@ -1833,10 +1878,10 @@ BOOL StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdc // black pixels on a white background. BYTE * destinationPixel = destinationPixelBase + (x >> 3); UINT bitNumber = x % 8; - if(brushColor == sourceColor) { - *destinationPixel |= (1 << bitNumber); + if(backgroundColor == sourceColor) { + *destinationPixel |= (1 << bitNumber); // 1 White } else { - *destinationPixel &= ~(1 << bitNumber); + *destinationPixel &= ~(1 << bitNumber); // 0 Black } break; } @@ -2013,6 +2058,12 @@ COLORREF GetPixel(HDC hdc, int x ,int y) { x -= hdc->windowOriginX; y -= hdc->windowOriginY; + if(!reverseHeight) { +// int YY = sourceHeight - y; +// y = YY; + y = sourceHeight - y; + } + HPALETTE palette = hdc->realizedPalette; if(!palette) palette = hdc->selectedPalette; @@ -2029,7 +2080,7 @@ COLORREF GetPixel(HDC hdc, int x ,int y) { COLORREF resultColor = CLR_INVALID; // 0xAABBGGRR if(x >= 0 && y >= 0 && x < sourceWidth && y < sourceHeight) { - BYTE * sourcePixel = pixelsSource + sourceStride * y + 4 * x; + BYTE * sourcePixel = pixelsSource + sourceStride * y; // -> ARGB_8888 switch (sourceBitCount) { @@ -2037,6 +2088,7 @@ COLORREF GetPixel(HDC hdc, int x ,int y) { //TODO break; case 4: { + sourcePixel += x >> 2; BYTE colorIndex = (x & 0x1 ? sourcePixel[0] & (BYTE)0x0F : sourcePixel[0] >> 4); if (palPalEntry) { resultColor = 0xFF000000 | RGB(palPalEntry[colorIndex].peRed, palPalEntry[colorIndex].peGreen, palPalEntry[colorIndex].peBlue); @@ -2046,6 +2098,7 @@ COLORREF GetPixel(HDC hdc, int x ,int y) { break; } case 8: { + sourcePixel += x; BYTE colorIndex = sourcePixel[0]; if (palPalEntry) { resultColor = 0xFF000000 | RGB(palPalEntry[colorIndex].peRed, palPalEntry[colorIndex].peGreen, palPalEntry[colorIndex].peBlue); @@ -2055,9 +2108,11 @@ COLORREF GetPixel(HDC hdc, int x ,int y) { break; } case 24: + sourcePixel += 3 * x; resultColor = 0xFF000000 | RGB(sourcePixel[2], sourcePixel[1], sourcePixel[0]); break; case 32: + sourcePixel += 4 * x; resultColor = 0xFF000000 | RGB(sourcePixel[2], sourcePixel[1], sourcePixel[0]); break; default: @@ -2301,6 +2356,13 @@ UINT IsDlgButtonChecked(HWND hDlg, int nIDButton) { } BOOL EndDialog(HWND hDlg, INT_PTR nResult) { //TODO + if(currentDialogBoxMode == DialogBoxMode_GET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_GET_USRPRG42 + || currentDialogBoxMode == DialogBoxMode_SET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_SET_USRPRG42) { + itemDataCount = 0; + selItemDataCount = 0; + } return 0; } HANDLE FindFirstFileA(LPCSTR lpFileName, LPWIN32_FIND_DATAA lpFindFileData) { @@ -2327,6 +2389,9 @@ PIDLIST_ABSOLUTE SHBrowseForFolderA(LPBROWSEINFOA lpbi) { //TODO return NULL; } +#ifndef IDD_USERCODE + #define IDD_USERCODE 121 +#endif INT_PTR DialogBoxParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) { //TODO if(lpTemplateName == MAKEINTRESOURCE(IDD_CHOOSEKML)) { @@ -2344,6 +2409,27 @@ INT_PTR DialogBoxParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndPar } } else if(lpTemplateName == MAKEINTRESOURCE(IDD_KMLLOG)) { lpDialogFunc(NULL, WM_INITDIALOG, 0, 0); + } else if(lpTemplateName == MAKEINTRESOURCE(IDD_USERCODE)) { + if(currentDialogBoxMode == DialogBoxMode_GET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_GET_USRPRG42) { + itemDataCount = 0; + selItemDataCount = 0; + lpDialogFunc(NULL, WM_INITDIALOG, 0, 0); + LPTSTR lpLabel = labels; + for(int i = 0; i < itemDataCount; i++) { + _tcscpy(lpLabel, itemString[i]); + lpLabel += _tcslen(itemString[i]) * sizeof(TCHAR); + *lpLabel = 9; // Separator (TAB) + lpLabel++; + } + *lpLabel = 0; // End of string + lpDialogFunc(NULL, WM_COMMAND, IDCANCEL, 0); + } else if(currentDialogBoxMode == DialogBoxMode_SET_USRPRG32 + || currentDialogBoxMode == DialogBoxMode_SET_USRPRG42) { + itemDataCount = 0; + lpDialogFunc(NULL, WM_INITDIALOG, 0, 0); + lpDialogFunc(NULL, WM_COMMAND, IDOK, 0); + } } return IDOK; } diff --git a/app/src/main/cpp/win32-layer.h b/app/src/main/cpp/win32-layer.h index 896a1bf..f15edd4 100644 --- a/app/src/main/cpp/win32-layer.h +++ b/app/src/main/cpp/win32-layer.h @@ -1231,6 +1231,20 @@ enum ChooseKmlMode { ChooseKmlMode_CHANGE_KML }; extern enum ChooseKmlMode chooseCurrentKmlMode; +enum DialogBoxMode { + DialogBoxMode_UNKNOWN, + DialogBoxMode_GET_USRPRG32, + DialogBoxMode_SET_USRPRG32, + DialogBoxMode_GET_USRPRG42, + DialogBoxMode_SET_USRPRG42 +}; +extern enum DialogBoxMode currentDialogBoxMode; +#define MAX_LABEL_SIZE 5000 +extern TCHAR labels[MAX_LABEL_SIZE]; +#define MAX_ITEMDATA 100 +extern int selItemDataIndex[MAX_ITEMDATA]; +extern int selItemDataCount; +extern TCHAR getSaveObjectFilenameResult[MAX_PATH]; BOOL getFirstKMLFilenameForType(BYTE chipsetType, TCHAR * firstKMLFilename, size_t firstKMLFilenameSize); void clipboardCopyText(const TCHAR * text); const TCHAR * clipboardPasteText(); diff --git a/app/src/main/java/org/emulator/forty/eight/MainActivity.java b/app/src/main/java/org/emulator/forty/eight/MainActivity.java index df1e8cf..bf719bd 100644 --- a/app/src/main/java/org/emulator/forty/eight/MainActivity.java +++ b/app/src/main/java/org/emulator/forty/eight/MainActivity.java @@ -781,11 +781,12 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On kmlScriptsForCurrentModel = kmlScripts; final int lastIndex = kmlScriptsForCurrentModel.size(); - final String[] kmlScriptTitles = new String[lastIndex + 2]; + final String[] kmlScriptTitles = new String[lastIndex + (lastIndex > 0 ? 2 : 1)]; for (int i = 0; i < kmlScriptsForCurrentModel.size(); i++) kmlScriptTitles[i] = kmlScriptsForCurrentModel.get(i).title; kmlScriptTitles[lastIndex] = getResources().getString(R.string.load_custom_kml); - kmlScriptTitles[lastIndex + 1] = getResources().getString(R.string.load_default_kml); + if(lastIndex > 0) + kmlScriptTitles[lastIndex + 1] = getResources().getString(R.string.load_default_kml); new AlertDialog.Builder(MainActivity.this) .setTitle(getResources().getString(R.string.pick_calculator)) .setItems(kmlScriptTitles, new DialogInterface.OnClickListener() { @@ -798,7 +799,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On // Reset to default KML folder SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean("settings_kml_default", true); - //editor.putString("settings_kml_folder", url); editor.apply(); updateFromPreferences("settings_kml", true); if(changeKML) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df7280a..8cd9c3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,8 +46,8 @@ Help About Emu48... - [Custom KML script...] - [Default KML script] + [Select a Custom KML script folder...] + [Default KML script folder] Pick a calculator Create RAM Card diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index fa4a4ea..a7a2226 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -1,5 +1,4 @@ - +