diff --git a/data/Tupfile.lua b/data/Tupfile.lua index a1cd367991..96a9cc30ea 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -16,9 +16,6 @@ img_files = { {"CONFIG.INC", PROGS .. "/config.inc"}, {"STRUCT.INC", PROGS .. "/struct.inc"}, {"TOOLBAR.PNG", PROGS .. "/cmm/txtread/toolbar.png"}, - {"DEVELOP/TE_ICON.PNG", PROGS .. "/other/t_edit/te_icon.png"}, - {"DEVELOP/TL_NOD_16.PNG", PROGS .. "/other/t_edit/tl_nod_16.png"}, - {"DEVELOP/TL_SYS_16.PNG", PROGS .. "/media/log_el/trunk/tl_sys_16.png"}, {"DEVELOP/T_EDIT.INI", PROGS .. "/other/t_edit/t_edit.ini"}, {"FB2READ", "common/fb2read"}, {"File Managers/Z_ICONS.PNG", PROGS .. "/fs/opendial/z_icons.png"}, diff --git a/programs/load_img.inc b/programs/load_img.inc index 43ac9660c3..24de8c93ff 100644 --- a/programs/load_img.inc +++ b/programs/load_img.inc @@ -1,6 +1,7 @@ ; -; Макрос для загрузки изображений чрез функции библиотеки libimg. -; Действия которые делает макрос load_image_file: +; Макросы для декодирования изображений чрез функции библиотеки libimg. +; +; (1) макрос load_image_file: ; ; Проверяет размер полученного файла с изображением. ; Выделяет под него память и загружает туда файл. @@ -13,6 +14,15 @@ ; В использующей программе должна быть подключена библиотека libimg, ; объявлена переменная file_name размером около 4096 байт, ; а также структура run_file_70 типа FileInfoBlock. +; +; (2) макрос include_image_file: +; +; Внедряет изображение в файл программы. +; Определяет размер памяти необходимой для распаковки изображения. +; Выделяет память, и распаковывает изображение из форматов jpg, png, ... +; в формат rgb который можно выводить на экран через сист. функцию. +; При необходимости можно также получить размеры внедренного изображения для +; их дальнейшего использования в программе. ; подключение некоторых необходимых файлов: include 'dll.inc' @@ -45,84 +55,130 @@ local .err_open local .end_open if path eqtype '' ;проверяем задан ли строкой параметр path - local .path_str - jmp @f - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 + local .path_str + jmp @f + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0 else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой end if - mov dword[buf],0 + mov dword[buf],0 - mov [run_file_70.Function], SSF_GET_INFO - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], 0 - mov dword[run_file_70.Buffer], open_b - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 - or eax,eax - jnz .err_open + mov [run_file_70.Function], SSF_GET_INFO + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], 0 + mov dword[run_file_70.Buffer], open_b + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mcall SF_FILE,run_file_70 + or eax,eax + jnz .err_open - mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах - stdcall mem.Alloc,ecx ;выделяем память для изображения - mov [buf],eax - mov [run_file_70.Function], SSF_READ_FILE - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], ecx - mov [run_file_70.Buffer], eax - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mcall SF_FILE,run_file_70 ;загружаем файл изображения + mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах + stdcall mem.Alloc,ecx ;выделяем память для изображения + mov [buf],eax + mov [run_file_70.Function], SSF_READ_FILE + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], ecx + mov [run_file_70.Buffer], eax + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mcall SF_FILE,run_file_70 ;загружаем файл изображения test eax,eax jnz .err_open - cmp ebx,0xffffffff - je .end_open - ;определяем вид изображения и пишем его параметры - stdcall [img_decode], [buf],ebx,0 - mov ebx,eax - ;определяем размер декодированного изображения - mov ecx,[eax+4] ;+4 = image width + cmp ebx,0xffffffff + je .end_open + ;определяем вид изображения и пишем его параметры + stdcall [img_decode], [buf],ebx,0 + mov ebx,eax + ;определяем размер декодированного изображения + mov ecx,[eax+4] ;+4 = image width if img_w eq else - mov dword[img_w],ecx + mov dword[img_w],ecx end if if img_h eq - imul ecx,[eax+8] ;+8 = image height + imul ecx,[eax+8] ;+8 = image height else - mov eax,[eax+8] ;+8 = image height - mov dword[img_h],eax - imul ecx,eax + mov eax,[eax+8] ;+8 = image height + mov dword[img_h],eax + imul ecx,eax end if if bytes_p_p eq - imul ecx,3 ;need for r,g,b + imul ecx,3 ;need for r,g,b else - imul ecx,bytes_p_p + imul ecx,bytes_p_p end if - stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера - mov [buf],eax - stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb - stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения + stdcall mem.ReAlloc,[buf],ecx ;изменяем размер для буфера + mov [buf],eax + stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb + stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения jmp .end_open - .err_open: - add al,'0' - mov byte[txt_err_img_file.n],al + .err_open: + add al,'0' + mov byte[txt_err_img_file.n],al if path eqtype '' - mov eax,dword[.path_str] - mov dword[txt_err_img_file.f],eax - mov eax,dword[.path_str+4] + mov eax,dword[.path_str] + mov dword[txt_err_img_file.f],eax + mov eax,dword[.path_str+4] else - mov eax,dword[path] - mov dword[txt_err_img_file.f],eax - mov eax,dword[path+4] + mov eax,dword[path] + mov dword[txt_err_img_file.f],eax + mov eax,dword[path+4] end if - mov dword[txt_err_img_file.f+4],eax - mov byte[txt_err_img_file.f+7],0 - notify_window_run txt_err_img_file - .end_open: + mov dword[txt_err_img_file.f+4],eax + mov byte[txt_err_img_file.f+7],0 + notify_window_run txt_err_img_file + .end_open: } + + + +; path - имя включаемого файла +; buf - переменная куда будет записан указатель на изображение в формате rgb +; img_w, img_h - переменные куда будут записаны размеры изображения, +; не обязательные параметры +; bytes_p_p - сколько байт памяти брать на пиксель, не обязательный параметр +; если не указан берется 3. Минимальное значение должно быть не меньше 3. +macro include_image_file path, buf, img_w, img_h, bytes_p_p +{ +local .beg_file +local .end_file + +jmp .end_file +align 4 +.beg_file: + file path +.end_file: + + ;определяем вид изображения и пишем его параметры + stdcall [img_decode], .beg_file,.end_file-.beg_file,0 + mov ebx,eax + ;определяем размер декодированного изображения + mov ecx,[eax+4] ;+4 = image width +if img_w eq +else + mov dword[img_w],ecx +end if +if img_h eq + imul ecx,[eax+8] ;+8 = image height +else + mov eax,[eax+8] ;+8 = image height + mov dword[img_h],eax + imul ecx,eax +end if +if bytes_p_p eq + imul ecx,3 ;need for r,g,b +else + imul ecx,bytes_p_p +end if + stdcall mem.Alloc,ecx ;изменяем размер для буфера + mov [buf],eax + stdcall [img_to_rgb2], ebx,[buf] ;преобразуем изображение к формату rgb + stdcall [img_destroy], ebx ;удаляем временный буфер с параметрами изображения +} \ No newline at end of file diff --git a/programs/other/t_edit/build_en.bat b/programs/other/t_edit/build_en.bat index 7ce8a43a5e..f03710e15b 100644 --- a/programs/other/t_edit/build_en.bat +++ b/programs/other/t_edit/build_en.bat @@ -1,8 +1,5 @@ if not exist bin mkdir bin -if not exist bin\tl_sys_16.png @copy ..\..\media\log_el\trunk\tl_sys_16.png bin\tl_sys_16.png -if not exist bin\tl_nod_16.png @copy tl_nod_16.png bin\tl_nod_16.png if not exist bin\msgbox.obj @copy msgbox.obj bin\msgbox.obj -if not exist bin\te_icon.png @copy te_icon.png bin\te_icon.png if not exist bin\info mkdir bin\info if not exist bin\box_lib.obj @fasm.exe -m 16384 ..\..\develop\libraries\box_lib\trunk\box_lib.asm bin\box_lib.obj diff --git a/programs/other/t_edit/build_ru.bat b/programs/other/t_edit/build_ru.bat index ddbb21feba..809be881b2 100644 --- a/programs/other/t_edit/build_ru.bat +++ b/programs/other/t_edit/build_ru.bat @@ -1,8 +1,5 @@ if not exist bin mkdir bin -if not exist bin\tl_sys_16.png @copy ..\..\media\log_el\trunk\tl_sys_16.png bin\tl_sys_16.png -if not exist bin\tl_nod_16.png @copy tl_nod_16.png bin\tl_nod_16.png if not exist bin\msgbox.obj @copy msgbox.obj bin\msgbox.obj -if not exist bin\te_icon.png @copy te_icon.png bin\te_icon.png if not exist bin\info mkdir bin\info if not exist bin\box_lib.obj @fasm.exe -m 16384 ..\..\develop\libraries\box_lib\trunk\box_lib.asm bin\box_lib.obj diff --git a/programs/other/t_edit/t_edit.asm b/programs/other/t_edit/t_edit.asm index 3806319da4..6b578df514 100644 --- a/programs/other/t_edit/t_edit.asm +++ b/programs/other/t_edit/t_edit.asm @@ -1,7 +1,7 @@ ;Огромная благодарность всем, кто помогал: кодом/советом/дизайном ... use32 - org 0x0 + org 0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт dd 1, start, i_end, mem, stacktop, file_name, sys_path @@ -144,18 +144,18 @@ mov ebp,lib0 stdcall [ksubmenu_add], [main_menu], eax ; init toolbar file - load_image_file 'te_icon.png', bmp_icon,,,6 ;6 для серых кнопок + include_image_file 'te_icon.png', bmp_icon,,,6 ;6 для серых кнопок mov eax,[bmp_icon] add eax,TOOLBAR_ICONS_SIZE stdcall img_to_gray, [bmp_icon],eax,(TOOLBAR_ICONS_SIZE)/3 ;--------------------------------------------------------------------- -; читаем файл с курсорами и линиями - load_image_file 'tl_sys_16.png', icon_tl_sys +; внедряем файл с курсорами и линиями + include_image_file '..\..\media\log_el\trunk\tl_sys_16.png', icon_tl_sys mov eax,dword[icon_tl_sys] mov dword[tree1.data_img_sys],eax ;--------------------------------------------------------------------- -; читаем файл с иконками узлов - load_image_file 'tl_nod_16.png', icon_tl_sys +; внедряем файл с иконками узлов + include_image_file 'tl_nod_16.png', icon_tl_sys mov eax,dword[icon_tl_sys] mov dword[tree1.data_img],eax ;------------------------------------------------------------------------------