From 78508e4e7e82045da5cc60db87429a4d7b27a694 Mon Sep 17 00:00:00 2001 From: freebipman Date: Sun, 23 Aug 2020 10:32:42 +1000 Subject: [PATCH] CHG: Add "read_elf_res_by_id" functionality --- src/BipEmulator.Host/FunctionNames.cs | 1 + src/BipEmulator.Host/MainForm.cs | 47 +++++++++++++++++++++++---- src/BipEmulator.Proxy/ProxyLib.cpp | 16 ++++++++- src/BipEmulator.Proxy/libbip.h | 7 +++- 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/src/BipEmulator.Host/FunctionNames.cs b/src/BipEmulator.Host/FunctionNames.cs index 38e2ce4..01ea0b7 100644 --- a/src/BipEmulator.Host/FunctionNames.cs +++ b/src/BipEmulator.Host/FunctionNames.cs @@ -19,6 +19,7 @@ public const string LOG_PRINTF = "log_printf"; public const string REG_MENU = "reg_menu"; public const string REPAINT_SCREEN_LINES = "repaint_screen_lines"; + public const string READ_ELF_RES_BY_ID = "read_elf_res_by_id"; public const string SET_BG_COLOR = "set_bg_color"; public const string SET_FG_COLOR = "set_fg_color"; public const string SET_UPDATE_PERIOD = "set_update_period"; diff --git a/src/BipEmulator.Host/MainForm.cs b/src/BipEmulator.Host/MainForm.cs index 616c47c..78917d0 100644 --- a/src/BipEmulator.Host/MainForm.cs +++ b/src/BipEmulator.Host/MainForm.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.Globalization; using System.IO; using System.IO.MemoryMappedFiles; +using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; @@ -191,16 +192,27 @@ namespace BipEmulator.Host return 0; case FunctionNames.GET_RES_PARAMS: - var res = GetUserResImage((int)args[2]); - if (res == null) - return -1; + { + var res = GetUserResImage((int)args[2]); + if (res == null) + return -1; - var bmp = res.Bitmap; + var bmp = res.Bitmap; - var param = new ResParam { Width=(short)bmp.Width, Height=(short)bmp.Height }; - CopyStructToUnmanagedMemory(param, (IntPtr)args[3]); - return 0; + var param = new ResParam { Width = (short)bmp.Width, Height = (short)bmp.Height }; + CopyStructToUnmanagedMemory(param, (IntPtr)args[3]); + return 0; + } + case FunctionNames.READ_ELF_RES_BY_ID: + { + // only own resources + if ((int)args[1] != -1) + return -1; + var data = GetUserResData(/*resId*/(int)args[2],/*offset*/(int)args[3], (int)args[5]/*len*/); + Marshal.Copy(data, 0, (IntPtr)args[4], data.Length); + return 0; + } case FunctionNames.SHOW_BIG_DIGITS: ShowBigDigit((int)args[1], args[2].ToString(), (int)args[3], (int)args[4], (int)args[5]); break; @@ -390,6 +402,27 @@ namespace BipEmulator.Host Marshal.FreeHGlobal(pnt); } + private byte[] GetUserResData(int resId, int offset, int len) + { + try + { + if (_userResFile == null) + { + _userResFile = ResFile.Load(tbUserResFile.Text); + var data = new byte[len]; + if (offset + len > _userResFile.Resources[resId].Length) + return null; + Buffer.BlockCopy(_userResFile.Resources[resId], 0, data, 0, len); + return data; + } + } + catch + { + Debug.WriteLine("Exception GetUserResData"); + } + return null; + } + private ResImage GetUserResImage(int resId) { try diff --git a/src/BipEmulator.Proxy/ProxyLib.cpp b/src/BipEmulator.Proxy/ProxyLib.cpp index 94a1ef4..1e592e2 100644 --- a/src/BipEmulator.Proxy/ProxyLib.cpp +++ b/src/BipEmulator.Proxy/ProxyLib.cpp @@ -221,6 +221,16 @@ namespace BipEmulatorProxy return -1; } + static int CallbackInt(String^ fName, int p0, int p1, int p2, void* p3, int p4) + { + if (CallbackFunc != nullptr) + { + array^ arr = gcnew array(6) { fName, p0, p1, p2, gcnew IntPtr(p3), p4 }; + return safe_cast(CallbackFunc(arr)); + } + return -1; + } + static int CallbackInt(String^ fName, int p0, int p1, int p2, int p3) { if (CallbackFunc != nullptr) @@ -394,7 +404,6 @@ int get_text_height() return BipEmulatorProxy::ProxyLib::CallbackInt("get_text_height"); } - int get_res_params(int index_listed, int res_id, struct res_params_* res_params) { return BipEmulatorProxy::ProxyLib::CallbackInt("get_res_params", index_listed, res_id, (void*)res_params); @@ -540,6 +549,11 @@ int ElfWriteSettings(int index_listed, void* buffer, int offset, int len) return 0; } +int read_elf_res_by_id(int index_listed, int res_id, int offset, void* buffer, int len) +{ + return BipEmulatorProxy::ProxyLib::CallbackInt("read_elf_res_by_id", index_listed, res_id, offset, buffer, len); +} + void _srand(unsigned int seed) { srand(seed); diff --git a/src/BipEmulator.Proxy/libbip.h b/src/BipEmulator.Proxy/libbip.h index ac2beec..a5e1571 100644 --- a/src/BipEmulator.Proxy/libbip.h +++ b/src/BipEmulator.Proxy/libbip.h @@ -65,7 +65,7 @@ struct gesture_ { #define GESTURE_SWIPE_UP 2 // свайп снизу вверх #define GESTURE_SWIPE_DOWN 3 // свайп сверху вниз #define GESTURE_SWIPE_LEFT 4 // свайп справа налево -#define GESTURE_SWIPE_RIGHT 5 // свайп слева направо +#define GESTURE_SWIPE_RIGHT 5 // свайп слева направо // вид анимации для функции show_menu_animate #define ANIMATE_LEFT 0 // анимация перехода экрана справа налево @@ -129,6 +129,9 @@ struct res_params_ { short height; // высота в рх }; +#define INDEX_MAIN_RES ((int)0xFFFF0000) +#define ELF_INDEX_SELF ((int)0xFFFFFFFF) + // структуры данных датчика сердца // 1.1.5.12, 1.1.5.36 typedef struct { @@ -258,6 +261,8 @@ void draw_filled_rect_bg(int from_x, int from_y, int to_x, int to_y); int ElfReadSettings(int index_listed, void* buffer, int offset, int len); // запись секции настроек конкретного эльфа int ElfWriteSettings(int index_listed, void* buffer, int offset, int len); +// чтение данных ресурсов (стандартных и приложения) начиная с offset длиной len по его номеру res_id +int read_elf_res_by_id(int index_listed, int res_id, int offset, void* buffer, int len); // отображение графического ресурса по его номеру void show_res_by_id(int res_ID, int pos_x, int pos_y); // отображает на экране графический ресурс конкретного эльфа, содержащийся в секции .elf.resources