From e05b57a95ec260b650e0bbad7e4b73d612386d51 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 25 Apr 2026 09:20:05 +0000 Subject: [PATCH] develop/libraries: Post-SVN tidy (#436) - Move source code from `trunk` into root directory for each library. - Update build files and ASM include paths. Add SPDX license header where appropriate. - Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden. (Work towards #75, point 3) Reviewed-on: https://git.kolibrios.org/KolibriOS/kolibrios/pulls/436 Reviewed-by: Burer Reviewed-by: Ivan B <1+dunkaist@noreply.localhost> Reviewed-by: Mikhail Frolov Co-authored-by: Andrew Co-committed-by: Andrew --- data/Tupfile.lua | 4 +- programs/develop/ktcc/source/readme_kos32.txt | 96 +- .../libraries/buf2d/{trunk => }/Tupfile.lua | 0 .../libraries/buf2d/{trunk => }/about.htm | 0 .../libraries/buf2d/{trunk => }/buf2d.asm | 6400 +++++++++-------- .../libraries/buf2d/{trunk => }/build.bat | 0 .../buf2d/{trunk => }/examples/Tupfile.lua | 0 .../buf2d/{trunk => }/examples/build.bat | 4 +- .../{trunk => }/examples/e0_dr_lines.asm | 284 +- .../buf2d/{trunk => }/examples/e1_scaling.asm | 344 +- .../buf2d/{trunk => }/examples/e2_images.asm | 622 +- .../buf2d/{trunk => }/examples/e3_text.asm | 622 +- .../buf2d/{trunk => }/examples/e4_graf_ed.asm | 361 +- .../{trunk => }/examples/e5_lines_sm.asm | 369 +- .../buf2d/{trunk => }/examples/e6_vox_1g.asm | 443 +- .../buf2d/{trunk => }/examples/e7_vox_3g.asm | 484 +- .../buf2d/{trunk => }/examples/e8_filters.asm | 580 +- .../buf2d/{trunk => }/examples/foto.jpg | Bin .../buf2d/{trunk => }/examples/img0.png | Bin .../buf2d/{trunk => }/examples/img1.png | Bin .../libraries/buf2d/{trunk => }/fun_draw.inc | 0 .../libraries/buf2d/{trunk => }/fun_voxel.inc | 0 .../crypt_des/{trunk => }/Tupfile.lua | 0 .../libraries/crypt_des/{trunk => }/about.htm | 0 .../crypt_des/{trunk => }/crypt_des.asm | 926 +-- .../libraries/crypt_des/example/build.bat | 2 +- .../libraries/crypt_des/{trunk => }/run.bat | 0 .../libraries/exif/{trunk => }/Tupfile.lua | 0 .../libraries/exif/{trunk => }/about.htm | 0 .../libraries/exif/{trunk => }/build.bat | 0 .../develop/libraries/exif/examples/build.bat | 2 +- .../libraries/exif/{trunk => }/exif.asm | 3479 ++++----- .../fontslib/{trunk => }/Tupfile.lua | 0 .../libraries/fontslib/{trunk => }/build.bat | 0 .../libraries/fontslib/{trunk => }/font_.asm | 0 .../fontslib/{trunk => }/font_8x16.fon | Bin .../fontslib/{trunk => }/font_ex.asm | 8 +- .../fontslib/{trunk => }/fonts_lib.asm | 888 +-- .../libraries/fontslib/{trunk => }/readme.txt | 0 .../libraries/framework/{trunk => }/config.mk | 0 .../libraries/framework/{trunk => }/gpl3.txt | 0 .../framework/{trunk => }/include/defs.h | 0 .../framework/{trunk => }/include/heap.h | 0 .../framework/{trunk => }/include/ipc.h | 0 .../framework/{trunk => }/include/kolibri.h | 0 .../framework/{trunk => }/include/malloc.h | 0 .../framework/{trunk => }/include/stdlib.h | 0 .../framework/{trunk => }/kolibri/kolibri.c | 0 .../framework/{trunk => }/kolibri/makefile | 0 .../framework/{trunk => }/libIPC/ipc.c | 0 .../framework/{trunk => }/libIPC/ipc.txt | 0 .../framework/{trunk => }/libIPC/makefile | 0 .../{trunk => }/libconfig/find_str.asm | 0 .../{trunk => }/libconfig/libconfig.asm | 0 .../{trunk => }/libconfig/libini_p.asm | 0 .../{trunk => }/libconfig/libini_p.inc | 0 .../framework/{trunk => }/stdlib/heap.c | 0 .../framework/{trunk => }/stdlib/makefile | 0 .../framework/{trunk => }/stdlib/malloc.c | 0 .../framework/{trunk => }/stdlib/stdlib.c | 0 .../libraries/libs-dev/libimg/gif/gif.asm | 2 +- .../proc_lib/{trunk => }/Tupfile.lua | 0 .../libraries/proc_lib/{trunk => }/build.sh | 0 .../proc_lib/{trunk => }/colrdial.mac | 0 .../proc_lib/{trunk => }/opendial.mac | 0 .../proc_lib/{trunk => }/proc_lib.asm | 145 +- .../libraries/proc_lib/{trunk => }/run.bat | 0 .../truetype/{trunk => }/compile.bat | 0 .../libraries/truetype/{trunk => }/glue.h | 0 .../truetype/{trunk => }/history.txt | 0 .../truetype/{trunk => }/stb_truetype.h | 0 .../libraries/truetype/{trunk => }/truetype.c | 0 .../libraries/utils/{trunk => }/Tupfile.lua | 0 .../libraries/utils/{trunk => }/_atof.inc | 0 .../libraries/utils/{trunk => }/_ftoa.inc | 0 .../libraries/utils/{trunk => }/_rand.inc | 0 .../libraries/utils/{trunk => }/build.bat | 0 .../utils/{trunk => }/example/demo.asm | 0 .../libraries/utils/{trunk => }/utils.asm | 130 +- .../vector/{trunk => }/example_logo.asm | 0 .../libraries/vector/{trunk => }/vectors.asm | 0 programs/system/kobra/Makefile | 4 +- 82 files changed, 8137 insertions(+), 8062 deletions(-) rename programs/develop/libraries/buf2d/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/buf2d/{trunk => }/about.htm (100%) rename programs/develop/libraries/buf2d/{trunk => }/buf2d.asm (95%) rename programs/develop/libraries/buf2d/{trunk => }/build.bat (100%) rename programs/develop/libraries/buf2d/{trunk => }/examples/Tupfile.lua (100%) rename programs/develop/libraries/buf2d/{trunk => }/examples/build.bat (79%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e0_dr_lines.asm (91%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e1_scaling.asm (92%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e2_images.asm (94%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e3_text.asm (94%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e4_graf_ed.asm (92%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e5_lines_sm.asm (92%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e6_vox_1g.asm (92%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e7_vox_3g.asm (92%) rename programs/develop/libraries/buf2d/{trunk => }/examples/e8_filters.asm (93%) rename programs/develop/libraries/buf2d/{trunk => }/examples/foto.jpg (100%) rename programs/develop/libraries/buf2d/{trunk => }/examples/img0.png (100%) rename programs/develop/libraries/buf2d/{trunk => }/examples/img1.png (100%) rename programs/develop/libraries/buf2d/{trunk => }/fun_draw.inc (100%) rename programs/develop/libraries/buf2d/{trunk => }/fun_voxel.inc (100%) rename programs/develop/libraries/crypt_des/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/crypt_des/{trunk => }/about.htm (100%) rename programs/develop/libraries/crypt_des/{trunk => }/crypt_des.asm (94%) rename programs/develop/libraries/crypt_des/{trunk => }/run.bat (100%) rename programs/develop/libraries/exif/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/exif/{trunk => }/about.htm (100%) rename programs/develop/libraries/exif/{trunk => }/build.bat (100%) rename programs/develop/libraries/exif/{trunk => }/exif.asm (95%) rename programs/develop/libraries/fontslib/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/fontslib/{trunk => }/build.bat (100%) rename programs/develop/libraries/fontslib/{trunk => }/font_.asm (100%) rename programs/develop/libraries/fontslib/{trunk => }/font_8x16.fon (100%) rename programs/develop/libraries/fontslib/{trunk => }/font_ex.asm (97%) rename programs/develop/libraries/fontslib/{trunk => }/fonts_lib.asm (92%) rename programs/develop/libraries/fontslib/{trunk => }/readme.txt (100%) rename programs/develop/libraries/framework/{trunk => }/config.mk (100%) rename programs/develop/libraries/framework/{trunk => }/gpl3.txt (100%) rename programs/develop/libraries/framework/{trunk => }/include/defs.h (100%) rename programs/develop/libraries/framework/{trunk => }/include/heap.h (100%) rename programs/develop/libraries/framework/{trunk => }/include/ipc.h (100%) rename programs/develop/libraries/framework/{trunk => }/include/kolibri.h (100%) rename programs/develop/libraries/framework/{trunk => }/include/malloc.h (100%) rename programs/develop/libraries/framework/{trunk => }/include/stdlib.h (100%) rename programs/develop/libraries/framework/{trunk => }/kolibri/kolibri.c (100%) rename programs/develop/libraries/framework/{trunk => }/kolibri/makefile (100%) rename programs/develop/libraries/framework/{trunk => }/libIPC/ipc.c (100%) rename programs/develop/libraries/framework/{trunk => }/libIPC/ipc.txt (100%) rename programs/develop/libraries/framework/{trunk => }/libIPC/makefile (100%) rename programs/develop/libraries/framework/{trunk => }/libconfig/find_str.asm (100%) rename programs/develop/libraries/framework/{trunk => }/libconfig/libconfig.asm (100%) rename programs/develop/libraries/framework/{trunk => }/libconfig/libini_p.asm (100%) rename programs/develop/libraries/framework/{trunk => }/libconfig/libini_p.inc (100%) rename programs/develop/libraries/framework/{trunk => }/stdlib/heap.c (100%) rename programs/develop/libraries/framework/{trunk => }/stdlib/makefile (100%) rename programs/develop/libraries/framework/{trunk => }/stdlib/malloc.c (100%) rename programs/develop/libraries/framework/{trunk => }/stdlib/stdlib.c (100%) rename programs/develop/libraries/proc_lib/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/proc_lib/{trunk => }/build.sh (100%) rename programs/develop/libraries/proc_lib/{trunk => }/colrdial.mac (100%) rename programs/develop/libraries/proc_lib/{trunk => }/opendial.mac (100%) rename programs/develop/libraries/proc_lib/{trunk => }/proc_lib.asm (92%) rename programs/develop/libraries/proc_lib/{trunk => }/run.bat (100%) rename programs/develop/libraries/truetype/{trunk => }/compile.bat (100%) rename programs/develop/libraries/truetype/{trunk => }/glue.h (100%) rename programs/develop/libraries/truetype/{trunk => }/history.txt (100%) rename programs/develop/libraries/truetype/{trunk => }/stb_truetype.h (100%) rename programs/develop/libraries/truetype/{trunk => }/truetype.c (100%) rename programs/develop/libraries/utils/{trunk => }/Tupfile.lua (100%) rename programs/develop/libraries/utils/{trunk => }/_atof.inc (100%) rename programs/develop/libraries/utils/{trunk => }/_ftoa.inc (100%) rename programs/develop/libraries/utils/{trunk => }/_rand.inc (100%) rename programs/develop/libraries/utils/{trunk => }/build.bat (100%) rename programs/develop/libraries/utils/{trunk => }/example/demo.asm (100%) rename programs/develop/libraries/utils/{trunk => }/utils.asm (96%) rename programs/develop/libraries/vector/{trunk => }/example_logo.asm (100%) rename programs/develop/libraries/vector/{trunk => }/vectors.asm (100%) diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 21e0ff7fe..fd3afb2d1 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -509,7 +509,7 @@ tup.append_table(img_files, { {"GAMES/C4", VAR_PROGS .. "/games/c4/c4"}, {"LIB/ARCHIVER.OBJ", VAR_PROGS .. "/fs/kfar/kfar_arc/kfar_arc.obj"}, {"LIB/BOX_LIB.OBJ", VAR_PROGS .. "/develop/libraries/box_lib/box_lib.obj"}, - {"LIB/BUF2D.OBJ", VAR_PROGS .. "/develop/libraries/buf2d/trunk/buf2d.obj"}, + {"LIB/BUF2D.OBJ", VAR_PROGS .. "/develop/libraries/buf2d/buf2d.obj"}, {"LIB/CONSOLE.OBJ", VAR_PROGS .. "/develop/libraries/console_coff/console.obj"}, {"LIB/CNV_PNG.OBJ", VAR_PROGS .. "/media/zsea/plugins/png/cnv_png.obj"}, {"LIB/DLL.OBJ", VAR_PROGS .. "/develop/libraries/dll/dll.obj"}, @@ -521,7 +521,7 @@ tup.append_table(img_files, { {"LIB/LIBIO.OBJ", VAR_PROGS .. "/develop/libraries/libs-dev/libio/libio.obj"}, {"LIB/MSGBOX.OBJ", VAR_PROGS .. "/develop/libraries/msgbox/msgbox.obj"}, {"LIB/NETWORK.OBJ", VAR_PROGS .. "/develop/libraries/network/network.obj"}, - {"LIB/PROC_LIB.OBJ", VAR_PROGS .. "/develop/libraries/proc_lib/trunk/proc_lib.obj"}, + {"LIB/PROC_LIB.OBJ", VAR_PROGS .. "/develop/libraries/proc_lib/proc_lib.obj"}, {"LIB/RASTERWORKS.OBJ", VAR_PROGS .. "/develop/libraries/fontRasterWorks_unicode/RasterWorks.obj"}, {"LIB/SORT.OBJ", VAR_PROGS .. "/develop/libraries/sorter/sort.obj"}, {"LIB/TINYGL.OBJ", VAR_PROGS .. "/develop/libraries/TinyGL/asm_fork/tinygl.obj"}, diff --git a/programs/develop/ktcc/source/readme_kos32.txt b/programs/develop/ktcc/source/readme_kos32.txt index 06b810fd7..d17c5d3d6 100644 --- a/programs/develop/ktcc/source/readme_kos32.txt +++ b/programs/develop/ktcc/source/readme_kos32.txt @@ -1,49 +1,47 @@ -Siemargl port comments - -Used github branch https://github.com/TinyCC/tinycc -It have a vesion 0.9.26 with heads up to 0.9.27 - see ChangeLog - -Kolibri version specifics -errata/changelog - moved to trunk/readme.txt - --added TCC_TARGET_MEOS as needed --leading_underscore by default is 0 (can use -f[no-]leading-underscore), -otherwise (error) underscoring all symbols, not only cdecl --added message in tccmeos.c about missed symbols when linking KOS executable --start.o added automatically, when -nostdlib not used --to use standard ktcc lib must add -lck at commandline --default search paths are ./include ./lib from executable (under KOS need to - use -Bpath_to_ktcc and put start.o in current dir) --when config.h is ready, compiler can be easy builded as [kos32-]gcc tcc.c libtcc.c - see also makefile.kos32 --impossible using with mingw-gcc compiled lib, incompatible library format: - .o is PE-format from gcc but ELF from tcc, may be linux-gcc does it ok --__fastcall incompatible with other compilers. now stack freed by caller. - must fix i386-gen.c@490,572 (fixed in other branch https://github.com/mirror/tinycc) - - --using __attribute__((packed)) see test82. need naming struct twice as in kos32sys1.h --using __attribute__ ((alias xxx)) restricted only for non "static inline" functions --erroneous or "non TCC" member using in nested structs or unions can lead to compiler internal error --bench timing coarse (0s or 1s), no usec in newlib gettimeofday. OK - -Tests status: -asmtest + -abitest not tested (embedding compiler) -libtcctest not tested (embedding compiler) -boundtest ----- alloca removed from tcc libtcc.c:945 (really not worked) -tcctest most test ok, some problems with long double -vla_test.c + - -pp/* + (minor comment error in 13.s) - -tests2/* : see below - -// errata -skippin' tests -test76 fail dollars in identifiers -test34 fail (array assignment not supported) -test73 fail compile (no stdint.h), printfloat, ARM specific -test46 no stdin - removed funtionality read from console, but file ops works - - +Siemargl port comments + +Used github branch https://github.com/TinyCC/tinycc +It have a vesion 0.9.26 with heads up to 0.9.27 - see ChangeLog + +Kolibri version specifics +errata/changelog - moved to readme + +-added TCC_TARGET_MEOS as needed +-leading_underscore by default is 0 (can use -f[no-]leading-underscore), +otherwise (error) underscoring all symbols, not only cdecl +-added message in tccmeos.c about missed symbols when linking KOS executable +-start.o added automatically, when -nostdlib not used +-to use standard ktcc lib must add -lck at commandline +-default search paths are ./include ./lib from executable (under KOS need to + use -Bpath_to_ktcc and put start.o in current dir) +-when config.h is ready, compiler can be easy builded as [kos32-]gcc tcc.c libtcc.c + see also makefile.kos32 +-impossible using with mingw-gcc compiled lib, incompatible library format: + .o is PE-format from gcc but ELF from tcc, may be linux-gcc does it ok +-__fastcall incompatible with other compilers. now stack freed by caller. + must fix i386-gen.c@490,572 (fixed in other branch https://github.com/mirror/tinycc) + + +-using __attribute__((packed)) see test82. need naming struct twice as in kos32sys1.h +-using __attribute__ ((alias xxx)) restricted only for non "static inline" functions +-erroneous or "non TCC" member using in nested structs or unions can lead to compiler internal error +-bench timing coarse (0s or 1s), no usec in newlib gettimeofday. OK + +Tests status: +asmtest + +abitest not tested (embedding compiler) +libtcctest not tested (embedding compiler) +boundtest ----- alloca removed from tcc libtcc.c:945 (really not worked) +tcctest most test ok, some problems with long double +vla_test.c + + +pp/* + (minor comment error in 13.s) + +tests2/* : see below + +// errata +skippin' tests +test76 fail dollars in identifiers +test34 fail (array assignment not supported) +test73 fail compile (no stdint.h), printfloat, ARM specific +test46 no stdin - removed funtionality read from console, but file ops works diff --git a/programs/develop/libraries/buf2d/trunk/Tupfile.lua b/programs/develop/libraries/buf2d/Tupfile.lua similarity index 100% rename from programs/develop/libraries/buf2d/trunk/Tupfile.lua rename to programs/develop/libraries/buf2d/Tupfile.lua diff --git a/programs/develop/libraries/buf2d/trunk/about.htm b/programs/develop/libraries/buf2d/about.htm similarity index 100% rename from programs/develop/libraries/buf2d/trunk/about.htm rename to programs/develop/libraries/buf2d/about.htm diff --git a/programs/develop/libraries/buf2d/trunk/buf2d.asm b/programs/develop/libraries/buf2d/buf2d.asm similarity index 95% rename from programs/develop/libraries/buf2d/trunk/buf2d.asm rename to programs/develop/libraries/buf2d/buf2d.asm index 6cce87ab1..2934bc4f2 100644 --- a/programs/develop/libraries/buf2d/trunk/buf2d.asm +++ b/programs/develop/libraries/buf2d/buf2d.asm @@ -1,3197 +1,3203 @@ -format MS COFF -public EXPORTS -section '.flat' code readable align 16 - -include '../../../../macros.inc' -include '../../../../proc32.inc' - -;----------------------------------------------------------------------------- -mem.alloc dd ? ;функция для выделения памяти -mem.free dd ? ;функция для освобождения памяти -mem.realloc dd ? ;функция для перераспределения памяти -dll.load dd ? - -BUF_STRUCT_SIZE equ 21 -buf2d_data equ dword[edi] ;данные буфера изображения -buf2d_w equ dword[edi+8] ;ширина буфера -buf2d_h equ dword[edi+12] ;высота буфера -buf2d_l equ word[edi+4] -buf2d_t equ word[edi+6] ;отступ сверху -buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера -buf2d_color equ dword[edi+16] ;цвет фона буфера -buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения - -struct buf_2d_header - img_data dd ? - left dw ? ;+4 left - top dw ? ;+6 top - size_x dd ? ;+8 w - size_y dd ? ;+12 h - color dd ? ;+16 color - bit_pp db ? ;+21 bit in pixel -ends - -macro swap v1, v2 { - push v1 - push v2 - pop v1 - pop v2 -} - -;флаги, для функции обрезания буфера -BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху -BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева -BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу -BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа -BUF2D_BIT_OPT_CROP_TOP equ 0 -BUF2D_BIT_OPT_CROP_LEFT equ 1 -BUF2D_BIT_OPT_CROP_BOTTOM equ 2 -BUF2D_BIT_OPT_CROP_RIGHT equ 3 - -;input: -; eax = указатель на функцию выделения памяти -; ebx = ... освобождения памяти -; ecx = ... перераспределения памяти -; edx = ... загрузки библиотеки (пока не используется) -align 16 -lib_init: - mov dword[mem.alloc], eax - mov dword[mem.free], ebx - mov dword[mem.realloc], ecx - mov dword[dll.load], edx - ret - -include 'fun_draw.inc' ;функции рисования в буфере - -;создание буфера -align 4 -proc buf_create, buf_struc:dword - pushad - mov edi,dword[buf_struc] - mov ecx,buf2d_w - mov ebx,buf2d_h - imul ecx,ebx - cmp buf2d_bits,24 - jne @f - lea ecx,[ecx+ecx*2] ; 24 bit = 3 - ;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К - @@: - cmp buf2d_bits,32 - jne @f - shl ecx,2 ; 32 bit = 4 - @@: - invoke mem.alloc,ecx - mov buf2d_data,eax - - stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом - popad - ret -endp - -;создание буфера на основе изображения rgb -align 4 -proc buf_create_f_img, buf_struc:dword, rgb_data:dword - pushad - mov edi,dword[buf_struc] - mov ecx,buf2d_w - cmp ecx,1 - jl .error - mov ebx,buf2d_h - cmp ebx,1 - jl .error - imul ecx,ebx - cmp buf2d_bits,24 - jne @f - lea ecx,[ecx+ecx*2] ; 24 bit = 3 - @@: - cmp buf2d_bits,32 - jne @f - shl ecx,2 ; 32 bit = 4 - @@: - invoke mem.alloc,ecx - mov buf2d_data,eax - - cmp buf2d_bits,24 - jne @f - cld - mov esi,[rgb_data] - or esi,esi - jz @f - mov edi,eax ;eax=buf2d_data - rep movsb ;копируем биты изображения в буфер - jmp .end_create - @@: - stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом - jmp .end_create - .error: - stdcall print_err,sz_buf2d_create_f_img,txt_err_size_0 - .end_create: - popad - ret -endp - -;функция для обрезания буферов 8 и 24 битных, по заданому цвету. -;параметр opt задается комбинацией констант: -; BUF2D_OPT_CROP_TOP - обрезка сверху -; BUF2D_OPT_CROP_LEFT - обрезка слева -; BUF2D_OPT_CROP_BOTTOM - обрезка снизу -; BUF2D_OPT_CROP_RIGHT - обрезка справа -align 4 -proc buf_crop_color, buf_struc:dword, color:dword, opt:dword -locals - crop_r dd ? -endl - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,24 - jne .24end_f - - bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM - jae .24no_crop_bottom - mov eax,dword[color] - mov edx,eax ;ax = colors - r,g - shr edx,16 ;dl = color - b - mov ecx,buf2d_h - cmp ecx,1 - jle .24no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель - mov ebx,buf2d_w - imul ecx,ebx - lea esi,[ecx+ecx*2] ;esi=3*ecx - add esi,buf2d_data - cld - @@: - sub esi,3 - cmp word[esi],ax - jne @f - cmp byte[esi+2],dl - jne @f - loop @b - @@: - lea ebx,[ebx+ebx*2] - xor edx,edx - mov eax,buf2d_h - imul eax,ebx - add eax,buf2d_data ;eax - указатель на конец буфера изображения - @@: - add esi,ebx - cmp esi,eax - jge @f - inc edx ;вычисляем число полных строк для обрезания - loop @b - @@: - cmp edx,0 - je .24no_crop_bottom - cmp edx,buf2d_h - jge .24no_crop_bottom ;что-бы не получить пустой буфер - sub buf2d_h,edx ;уменьшаем высоту буфера - mov ecx,buf2d_h - imul ecx,ebx ;ecx = новый размер изображения - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - .24no_crop_bottom: - - bt dword[opt],BUF2D_BIT_OPT_CROP_TOP - jae .24no_crop_top - mov eax,dword[color] - mov edx,eax ;ax = colors - r,g - shr edx,16 ;dl = color - b - mov esi,buf2d_data - mov ecx,buf2d_h - cmp ecx,1 - jle .24no_crop_top ;проверяем на случай если высота буфера 1 пиксель - dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей - mov ebx,buf2d_w - imul ecx,ebx - cld - @@: - cmp word[esi],ax - jne @f - cmp byte[esi+2],dl - jne @f - add esi,3 - loop @b - @@: - lea ebx,[ebx+ebx*2] - xor edx,edx - @@: - sub esi,ebx - cmp esi,buf2d_data - jl @f - inc edx ;вычисляем число полных строк для обрезания - loop @b - @@: - cmp edx,0 - je .24no_crop_top - xor eax,eax - sub eax,edx - mov ebx,buf2d_h - sub ebx,edx - stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0) - sub buf2d_h,edx ;уменьшаем высоту буфера - mov ecx,buf2d_h - add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк - mov ebx,buf2d_w - imul ecx,ebx - lea ecx,[ecx+ecx*2] - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - .24no_crop_top: - - bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT - jae .24no_crop_right - mov eax,dword[color] - mov edx,eax ;ax = colors - r,g - shr edx,16 ;dl = color - b - mov ebx,buf2d_w - cmp ebx,1 - jle .24no_crop_right ;на случай если ширина буфера 1 пиксель - lea ebx,[ebx+ebx*2] - mov esi,ebx - imul esi,buf2d_h - add esi,buf2d_data ;esi - указатель на конец буфера изображения - mov dword[crop_r],0 - cld - .24found_beg_right: - sub esi,3 ;двигаемся на 1-ну колонку влево - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - cmp word[esi],ax - jne .24found_right - cmp byte[esi+2],dl - jne .24found_right - sub esi,ebx ;прыгаем на верхнюю строку - loop @b - inc dword[crop_r] - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp dword[crop_r],ecx - jge .24found_right - - sub esi,3 ;двигаемся на 1-ну колонку влево - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - add esi,ebx ;прыгаем на нижнюю строку - cmp word[esi],ax - jne .24found_right - cmp byte[esi+2],dl - jne .24found_right - loop @b - inc dword[crop_r] - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp dword[crop_r],ecx - jl .24found_beg_right - - .24found_right: - cmp dword[crop_r],0 - je .24no_crop_right - mov ecx,buf2d_w - sub ecx,dword[crop_r] - stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру - mov buf2d_w,ecx ;ставим новую ширину для буфера - mov ebx,buf2d_h - imul ecx,ebx - lea ecx,[ecx+ecx*2] - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - .24no_crop_right: - - bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT - jae .24no_crop_left - mov eax,dword[color] - mov edx,eax ;ax = colors - r,g - shr edx,16 ;dl = color - b - mov ebx,buf2d_w - cmp ebx,1 - jle .24no_crop_left ;на случай если ширина буфера 1 пиксель - lea ebx,[ebx+ebx*2] - mov esi,buf2d_data ;esi - указатель на начоло буфера изображения - mov dword[crop_r],0 - cld - .24found_beg_left: - - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - cmp word[esi],ax - jne .24found_left - cmp byte[esi+2],dl - jne .24found_left - add esi,ebx ;прыгаем на нижнюю строку - loop @b - inc dword[crop_r] - add esi,3 ;двигаемся на 1-ну колонку вправо - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp dword[crop_r],ecx - jge .24found_left - - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - sub esi,ebx ;прыгаем на верхнюю строку - cmp word[esi],ax - jne .24found_left - cmp byte[esi+2],dl - jne .24found_left - loop @b - inc dword[crop_r] - add esi,3 ;двигаемся на 1-ну колонку вправо - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp dword[crop_r],ecx - jl .24found_beg_left - - .24found_left: - cmp dword[crop_r],0 - je .24no_crop_left - mov ecx,buf2d_w - sub ecx,dword[crop_r] - stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру - mov buf2d_w,ecx ;ставим новую ширину для буфера - mov ebx,buf2d_h - imul ecx,ebx - lea ecx,[ecx+ecx*2] - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - mov eax,dword[crop_r] - add buf2d_l,ax - .24no_crop_left: - - .24end_f: - - - cmp buf2d_bits,8 - jne .8end_f - - bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM - jae .8no_crop_bottom - mov eax,dword[color] - mov esi,buf2d_data - mov ecx,buf2d_h - cmp ecx,1 - jle .8no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель - mov ebx,buf2d_w - imul ecx,ebx - mov esi,ecx - add esi,buf2d_data - cld - @@: - dec esi - cmp byte[esi],al - jne @f - loop @b - @@: - xor edx,edx - mov eax,buf2d_h - imul eax,ebx - add eax,buf2d_data ;eax - указатель на конец буфера изображения - @@: - add esi,ebx - cmp esi,eax - jge @f - inc edx - loop @b - @@: - cmp edx,0 - je .8no_crop_bottom - cmp edx,buf2d_h - jge .8no_crop_bottom ;что-бы не получить пустой буфер - sub buf2d_h,edx ;уменьшаем высоту буфера - mov ecx,buf2d_h - imul ecx,ebx ;ecx = новый размер изображения - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - .8no_crop_bottom: - - bt dword[opt],BUF2D_BIT_OPT_CROP_TOP - jae .8no_crop_top - mov eax,dword[color] - mov esi,buf2d_data - mov ecx,buf2d_h - cmp ecx,1 - jle .8no_crop_top ;проверяем на случай если высота буфера 1 пиксель - dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей - mov ebx,buf2d_w - imul ecx,ebx - cld - @@: - cmp byte[esi],al - jne @f - inc esi - loop @b - @@: - xor edx,edx - @@: - sub esi,ebx - cmp esi,buf2d_data - jl @f - inc edx - loop @b - @@: - cmp edx,0 - je .8no_crop_top - xor eax,eax - sub eax,edx - mov ebx,buf2d_h - sub ebx,edx - stdcall buf_offset_h, edi, eax, edx, ebx - mov ecx,buf2d_h - sub ecx,edx - mov buf2d_h,ecx ;уменьшаем высоту буфера - add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк - mov ebx,buf2d_w - imul ecx,ebx - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - .8no_crop_top: - - bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT - jae .8no_crop_right - mov eax,dword[color] - mov ebx,buf2d_w - cmp ebx,1 - jle .8no_crop_right ;на случай если ширина буфера 1 пиксель - mov esi,ebx - imul esi,buf2d_h - add esi,buf2d_data ;esi - указатель на конец буфера изображения - xor edx,edx - cld - - .8found_beg: - dec esi ;двигаемся на 1-ну колонку влево - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - cmp byte[esi],al - jne .8found - sub esi,ebx ;прыгаем на верхнюю строку - loop @b - inc edx - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp edx,ecx - jge .8found - - dec esi ;двигаемся на 1-ну колонку влево - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - add esi,ebx ;прыгаем на нижнюю строку - cmp byte[esi],al - jne .8found - loop @b - inc edx - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp edx,ecx - jl .8found_beg - - .8found: - cmp edx,0 - je .8no_crop_right - mov ecx,buf2d_w - sub ecx,edx - stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру - mov buf2d_w,ecx ;ставим новую ширину для буфера - mov ebx,buf2d_h - imul ecx,ebx - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - .8no_crop_right: - - bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT - jae .8no_crop_left - mov eax,dword[color] - mov ebx,buf2d_w - cmp ebx,1 - jle .8no_crop_left ;на случай если ширина буфера 1 пиксель - mov esi,buf2d_data ;esi - указатель на начоло буфера изображения - mov edx,0 - cld - .8found_beg_left: - - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - cmp word[esi],ax - jne .8found_left - add esi,ebx ;прыгаем на нижнюю строку - loop @b - inc edx - inc esi ;двигаемся на 1-ну колонку вправо - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp edx,ecx - jge .8found_left - - mov ecx,buf2d_h ;восстановление ecx для нового цикла - @@: - sub esi,ebx ;прыгаем на верхнюю строку - cmp word[esi],ax - jne .8found_left - loop @b - inc edx - inc esi ;двигаемся на 1-ну колонку вправо - - mov ecx,buf2d_w - dec ecx ;1 колонка на запас - cmp edx,ecx - jl .8found_beg_left - - .8found_left: - cmp edx,0 - je .8no_crop_left - mov ecx,buf2d_w - sub ecx,edx - stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру - mov buf2d_w,ecx ;ставим новую ширину для буфера - mov ebx,buf2d_h - imul ecx,ebx - invoke mem.realloc,buf2d_data,ecx - mov buf2d_data,eax ;на случай если изменился указатель на данные - mov eax,edx - add buf2d_l,ax - .8no_crop_left: - - .8end_f: - - popad - ret -endp - -;обрезаем цветное изображение с правой стороны -;input: -;data_rgb - pointer to rgb data -;size_w_old - width img in pixels -;size_w_new - new width img in pixels -;size_h - height img in pixels -align 4 -proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword - pushad - mov eax, dword[size_w_old] - lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb) - mov ebx, dword[size_w_new] - lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb) - mov edx, dword[size_h] - mov edi, dword[data_rgb] ;edi - получает данные - mov esi, edi - add edi, ebx - add esi, eax - cld - @@: - dec edx ;уменьшаем счетчик оставшихся строк на 1 - cmp edx,0 - jle @f - mov ecx, ebx - rep movsb ;перенос (копирование) строки пикселей - add esi,eax ;переход на новую строчку изображения - sub esi,ebx - jmp @b - @@: - popad - ret -endp - -;обрезаем серое изображение с правой стороны -;input: -;data_gray - pointer to gray data -;size_w_old - width img in pixels -;size_w_new - new width img in pixels -;size_h - height img in pixels -align 4 -proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword - pushad - mov eax, dword[size_w_old] - mov ebx, dword[size_w_new] - mov edx, dword[size_h] - mov edi, dword[data_gray] ;edi - получает данные - mov esi, edi - add edi, ebx - add esi, eax - cld - @@: - dec edx ;уменьшаем счетчик оставшихся строк на 1 - cmp edx,0 - jle @f - mov ecx, ebx - rep movsb ;перенос (копирование) строки пикселей - add esi,eax ;переход на новую строчку изображения - sub esi,ebx - jmp @b - @@: - popad - ret -endp - -;обрезаем цветное изображение с левой стороны -;input: -;data_rgb - pointer to rgb data -;size_w_old - width img in pixels -;size_w_new - new width img in pixels -;size_h - height img in pixels -align 4 -proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword - pushad - mov edi,dword[data_rgb] - mov esi,edi - mov eax,dword[size_w_old] - mov ebx,dword[size_w_new] - cmp eax,ebx - jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) - lea eax,[eax+eax*2] - lea ebx,[ebx+ebx*2] - sub eax,ebx - mov edx,dword[size_h] ;высота изображения - cld - @@: - add esi,eax - mov ecx,ebx - rep movsb - dec edx - cmp edx,0 - jg @b - .end_f: - popad - ret -endp - -;обрезаем серое изображение с левой стороны -;input: -;data_gray - pointer to gray data -;size_w_old - width img in pixels -;size_w_new - new width img in pixels -;size_h - height img in pixels -align 4 -proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword - pushad - mov edi,dword[data_gray] - mov esi,edi - mov eax,dword[size_w_old] - mov ebx,dword[size_w_new] - cmp eax,ebx - jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) - sub eax,ebx - mov edx,dword[size_h] ;высота изображения - cld - @@: - add esi,eax - mov ecx,ebx - rep movsb - dec edx - cmp edx,0 - jg @b - .end_f: - popad - ret -endp - -;hoffs - колличество пикселей на котрые поднимается/опускается изображение -;img_t - высота, с которой начинается двигающаяся часть изображения -align 4 -proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,24 - jne .end_move_24 - - mov eax,[hoffs] - cmp eax,0 - je .end_move_24 - mov ebx,buf2d_w - mov edx,dword[img_t] - mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных - cmp ecx,buf2d_h - jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения - imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных - lea ecx,[ecx+ecx*2] - imul ebx,edx - lea ebx,[ebx+ebx*2] - mov esi,buf2d_data - add esi,ebx - - add edx,eax ;edx = img_t+hoffs (hoffs<0) - mov ebx,buf2d_w - imul ebx,edx - lea ebx,[ebx+ebx*2] - mov edi,buf2d_data ;позиция, куда будет двигаться изображение - add edi,ebx - - cmp eax,0 - jg .move_down_24 - ;двигаем изображение вверх - cld - rep movsb - jmp .end_f - .move_down_24: - ;двигаем изображение вниз - add esi,ecx - dec esi - add edi,ecx - dec edi - std - rep movsb - jmp .end_f - .end_move_24: - -;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b - - cmp buf2d_bits,8 - jne .end_move_8 - - mov eax,[hoffs] - cmp eax,0 - je .end_move_8 - ;двигаем изображение вверх - mov ebx,buf2d_w - mov edx,dword[img_t] - mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных - cmp ecx,buf2d_h - jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения - imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных - imul ebx,edx - mov esi,buf2d_data - add esi,ebx - - add edx,eax ;edx = img_t+hoffs (hoffs<0) - mov ebx,buf2d_w - imul ebx,edx - mov edi,buf2d_data ;позиция, куда будет двигаться изображение - add edi,ebx - - cmp eax,0 - jg .move_down_8 - cld - rep movsb - jmp .end_f - .move_down_8: - ;двигаем изображение вниз - add esi,ecx - dec esi - add edi,ecx - dec edi - std - rep movsb - jmp .end_f - .end_move_8: - - .end_f: - popad - ret -endp - -align 4 -proc buf_delete, buf_struc:dword - push eax edi - mov edi,dword[buf_struc] - invoke mem.free,buf2d_data - pop edi eax - ret -endp - -;input: -; new_w - новая ширина (если 0 то не меняется) -; new_h - новая высота (если 0 то не меняется) -; options - параметры изменения буфера (1 - изменять размер буфера, -; 2 - изменять изображение в буфере, 3 - изменять буфер и изображение) -align 4 -proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword, options:dword - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,8 - jne .8bit - bt dword[options],1 ;сжатие изобр. - jnc @f - ;... - @@: - bt dword[options],0 ;измен. буфер - jnc .end_f - ;... - jmp .end_f - .8bit: - cmp buf2d_bits,24 - jne .24bit - bt dword[options],1 ;сжатие изобр. - jnc .24_end_r - mov eax,dword[new_w] - cmp eax,1 - jl @f - cmp eax,buf2d_w - jge @f - ;сжатие по ширине - stdcall img_rgb24_wresize, buf2d_data,buf2d_w,buf2d_h,eax - jmp .24_r_h - @@: - mov eax,buf2d_w - .24_r_h: ;eax - ширина буфера или ширина сжатого изображения - mov ebx,dword[new_h] - cmp ebx,1 - jl @f - cmp ebx,buf2d_h - jge @f - ;сжатие по высоте - stdcall img_rgb24_hresize, buf2d_data,eax,buf2d_h,ebx - @@: - .24_end_r: - bt dword[options],0 ;измен. буфер - jnc .end_f - mov eax,dword[new_w] - cmp eax,1 - jl @f - mov buf2d_w,eax - @@: - mov ecx,buf2d_w - mov eax,dword[new_h] - cmp eax,1 - jl @f - mov buf2d_h,eax - @@: - mov ebx,buf2d_h - imul ecx,ebx - lea ecx,[ecx+ecx*2] ; 24 bit = 3 - invoke mem.realloc,buf2d_data,ecx ;изменяем память занимаемую буфером - mov buf2d_data,eax ;на случай если изменился указатель на данные - .24bit: - .end_f: - popad - ret -endp - -align 4 -rot_table: ;таблица для указания на подфункции для поворотов - dd buf_rotate.8b90,buf_rotate.24b90,buf_rotate.32b90,\ - buf_rotate.8b180,buf_rotate.24b180,buf_rotate.32b180 - -;поворот изображения на 90 или 180 градусов -align 4 -proc buf_rotate, buf_struc:dword, angle:dword -locals - n_data dd ? - dec_h dd ? ;число байт, для уменьшения координаты y -endl - pushad - mov edi,[buf_struc] - mov ebx,buf2d_w - mov ecx,buf2d_h - - lea eax,[rot_table] - cmp dword[angle],90 ;проверка угла поворота - je .beg_0 - cmp dword[angle],180 - jne @f - add eax,12 - jmp .beg_0 - @@: - jmp .end_f - .beg_0: ;проверка битности буфера - cmp buf2d_bits,8 - jne @f - jmp dword[eax] - @@: - cmp buf2d_bits,24 - jne @f - add eax,4 - jmp dword[eax] - @@: - cmp buf2d_bits,32 - jne @f - add eax,8 - jmp dword[eax] - @@: - jmp .end_f - - .8b90: ;поворот 8 битного буфера на 90 градусов - mov edx,ecx ;edx - buf_h - imul ecx,ebx - invoke mem.alloc,ecx ;выделяем временную память - cmp eax,0 - je .end_f - mov [n_data],eax - mov [dec_h],ecx - inc dword[dec_h] - - ;copy buf --> mem - mov edi,[buf_struc] - mov esi,buf2d_data - mov edi,eax ;[n_data] - dec edx ;коректируем edx на 1 байт, для компенсации сдвига в movsb - add edi,edx - xor eax,eax - cld - .cycle_0: - movsb - add edi,edx - inc eax - cmp eax,ebx - jl @f - xor eax,eax - sub edi,[dec_h] - @@: - loop .cycle_0 - - ;change buf_w <---> buf_h - mov esi,[n_data] - mov edi,[buf_struc] - mov edi,buf2d_data - mov ecx,ebx - inc edx ;исправляем скоректированный edx - imul ecx,edx - ;copy buf <-- mem - ;cld - rep movsb - invoke mem.free,[n_data] - jmp .change_w_h - .24b90: ;поворот 24 битного буфера на 90 градусов - mov esi,ecx - imul esi,ebx - lea ecx,[ecx+ecx*2] - mov edx,ecx ;edx - buf_h * 3 - imul ecx,ebx - invoke mem.alloc,ecx ;выделяем временную память - cmp eax,0 - je .end_f - mov [n_data],eax - mov [dec_h],ecx - add dword[dec_h],3 - - ;copy buf --> mem - - mov edi,[buf_struc] - mov ecx,esi - mov esi,buf2d_data - mov edi,eax ;[n_data] - sub edx,3 ;коректируем edx на 3 байта, для компенсации сдвига - add edi,edx - xor eax,eax - cld - .cycle_1: - movsw - movsb - add edi,edx - inc eax - cmp eax,ebx - jl @f - xor eax,eax - sub edi,[dec_h] - @@: - loop .cycle_1 - - ;copy buf <-- mem - mov esi,[n_data] - mov edi,[buf_struc] - mov edi,buf2d_data - mov ecx,ebx - add edx,3 ;исправляем скоректированный edx - imul ecx,edx - ;cld - rep movsb - invoke mem.free,[n_data] - jmp .change_w_h - .32b90: ;поворот 32 битного буфера на 90 градусов - shl ecx,2 - mov edx,ecx ;edx - buf_h * 4 - imul ecx,ebx - invoke mem.alloc,ecx ;выделяем временную память - cmp eax,0 - je .end_f - mov [n_data],eax - mov [dec_h],ecx - add dword[dec_h],4 - - ;copy buf --> mem - mov edi,[buf_struc] - shr ecx,2 - mov esi,buf2d_data - mov edi,eax ;[n_data] - sub edx,4 ;коректируем edx на 4 байта, для компенсации сдвига в movsd - add edi,edx - xor eax,eax - cld - .cycle_2: - movsd - add edi,edx - inc eax - cmp eax,ebx - jl @f - xor eax,eax - sub edi,[dec_h] - @@: - loop .cycle_2 - - ;copy buf <-- mem - mov esi,[n_data] - mov edi,[buf_struc] - mov edi,buf2d_data - mov ecx,ebx - add edx,4 ;исправляем скоректированный edx - imul ecx,edx - shr ecx,2 - ;cld - rep movsd - invoke mem.free,[n_data] - ;jmp .change_w_h - .change_w_h: ;change buf_w <---> buf_h - mov edi,[buf_struc] - mov eax,buf2d_w - mov ebx,buf2d_h - mov buf2d_h,eax - mov buf2d_w,ebx - jmp .end_f - .8b180: ;поворот 8 битного буфера на 180 градусов - mov edi,buf2d_data - mov esi,edi - imul ecx,ebx - add esi,ecx - dec esi - shr ecx,1 ;ecx - число пикселей буфера : 2 - std - @@: - lodsb - mov ah,byte[edi] - mov byte[esi+1],ah - mov byte[edi],al - inc edi - loop @b - jmp .end_f - .24b180: ;поворот 24 битного буфера на 180 градусов - mov esi,buf2d_data - mov edi,esi - imul ecx,ebx - mov eax,ecx - lea ecx,[ecx+ecx*2] - add edi,ecx - sub edi,3 - shr eax,1 - mov ecx,eax ;ecx - число пикселей буфера : 2 - cld - @@: - lodsw - mov edx,eax - lodsb - mov bx,word[edi] - mov word[esi-3],bx - mov bl,byte[edi+2] - mov byte[esi-1],bl - mov byte[edi+2],al - mov word[edi],dx - sub edi,3 - loop @b - jmp .end_f - .32b180: ;поворот 32 битного буфера на 180 градусов - mov edi,buf2d_data - mov esi,edi - imul ecx,ebx - shl ecx,2 - add esi,ecx - sub esi,4 - shr ecx,3 ;ecx - число пикселей буфера : 2 - std - @@: - lodsd - mov ebx,dword[edi] - mov dword[esi+4],ebx - mov dword[edi],eax - add edi,4 - loop @b - ;jmp .end_f - - .end_f: - popad - ret -endp - -align 4 -proc buf_flip_h, buf_struc:dword -pushad - mov edi,[buf_struc] - cmp buf2d_bits,24 - jne .end_24 - mov esi,buf2d_data - mov eax,buf2d_w - mov ecx,eax - shr ecx,1 - dec eax - lea eax,[eax+eax*2] - mov ebx,buf2d_h - mov edi,esi - add esi,eax - add eax,3 - cld - .cycle_24: - push ecx edi esi -align 4 - @@: - ;swap word[edi] <-> word[esi] - mov dx,[edi] - movsw - mov [esi-2],dx - ;swap byte[edi] <-> byte[esi] - mov dl,[edi] - movsb - mov [esi-1],dl - sub esi,6 - loop @b - pop esi edi ecx - add edi,eax - add esi,eax - dec ebx - or ebx,ebx - jnz .cycle_24 - jmp .end_32 - .end_24: - cmp buf2d_bits,32 - jne .end_32 - mov esi,buf2d_data - mov eax,buf2d_w - dec eax - shl eax,2 - mov ebx,buf2d_h - mov edi,esi - add esi,eax - add eax,4 - cld - .cycle_32: - mov ecx,eax - shr ecx,3 - push edi esi -align 4 - @@: - ;swap dword[edi] <-> dword[esi] - mov edx,[edi] - movsd - mov [esi-4],edx - sub esi,8 - loop @b - pop esi edi - add edi,eax - add esi,eax - dec ebx - or ebx,ebx - jnz .cycle_32 - .end_32: -popad - ret -endp - -;отразить по вертикали (верх и низ меняются местами) -align 4 -proc buf_flip_v, buf_struc:dword -locals - line_pix dd ? ;кол. пикселей в линии буфера - line_2byte dd ? ;кол. байт в линии буфера * 2 -endl - pushad - mov edi,[buf_struc] - cmp buf2d_bits,24 - jne .end_24 - mov edx,buf2d_w - mov [line_pix],edx - mov ebx,buf2d_h - lea edx,[edx+edx*2] - mov esi,edx - imul esi,ebx - sub esi,edx - add esi,buf2d_data ;указатель на нижнюю линию - shr ebx,1 ;кол. линейных циклов - shl edx,1 - mov [line_2byte],edx - mov edi,buf2d_data - xchg edi,esi - cld - .flip_24: - cmp ebx,0 - jle .end_32 ;здесь выход из функции (потому .end_24 не подходит) - mov ecx,[line_pix] -align 4 - @@: - lodsw - mov dx,word[edi] - mov word[esi-2],dx - stosw - lodsb - mov ah,byte[edi] - mov byte[esi-1],ah - stosb - loop @b - sub edi,[line_2byte] - dec ebx - jmp .flip_24 - .end_24: - cmp buf2d_bits,32 - jne .end_32 - mov edx,buf2d_w - mov [line_pix],edx - mov ebx,buf2d_h - shl edx,2 - mov esi,edx - imul esi,ebx - sub esi,edx - add esi,buf2d_data ;указатель на нижнюю линию - shr ebx,1 ;кол. линейных циклов - shl edx,1 - mov [line_2byte],edx - mov edi,buf2d_data - xchg edi,esi - cld - .flip_32: - cmp ebx,0 - jle .end_32 - mov ecx,[line_pix] -align 4 - @@: - lodsd - mov edx,dword[edi] - mov dword[esi-4],edx - stosd - loop @b - sub edi,[line_2byte] - dec ebx - jmp .flip_32 - .end_32: - popad - ret -endp - -;description: -; сжатие изображения по ширине в 2 раза (размеры буфера не меняются) -align 4 -proc buf_img_wdiv2, buf_struc:dword - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,8 - jne @f - mov eax,buf2d_w - mov ecx,buf2d_h - imul ecx,eax - stdcall img_8b_wdiv2, buf2d_data,ecx - @@: - cmp buf2d_bits,24 - jne @f - mov eax,buf2d_w - mov ecx,buf2d_h - imul ecx,eax - stdcall img_rgb24_wdiv2, buf2d_data,ecx - @@: - cmp buf2d_bits,32 - jne @f - mov eax,buf2d_w - mov ecx,buf2d_h - imul ecx,eax - stdcall img_rgba32_wdiv2, buf2d_data,ecx - @@: - popad - ret -endp - -;input: -;data_8b - pointer to rgb data -;size - count img pixels (size img data / 3(rgb) ) -align 4 -proc img_8b_wdiv2 data_8b:dword, size:dword - mov eax,dword[data_8b] - mov ecx,dword[size] ;ecx = size - cld - @@: ;затемнение цвета пикселей - shr byte[eax],1 - inc eax - loop @b - - mov eax,dword[data_8b] - mov ecx,dword[size] ;ecx = size - shr ecx,1 - @@: ;сложение цветов пикселей - mov bl,byte[eax+1] ;копируем цвет соседнего пикселя - add byte[eax],bl - add eax,2 - loop @b - - mov eax,dword[data_8b] - inc eax - mov ebx,eax - inc ebx - mov ecx,dword[size] ;ecx = size - shr ecx,1 - dec ecx ;лишний пиксель - @@: ;поджатие пикселей - mov dl,byte[ebx] - mov byte[eax],dl - - inc eax - add ebx,2 - loop @b - ret -endp - -;input: -;data_rgb - pointer to rgb data -;size - count img pixels (size img data / 3(rgb) ) -align 4 -proc img_rgb24_wdiv2 data_rgb:dword, size:dword - mov eax,dword[data_rgb] - mov ecx,dword[size] ;ecx = size - lea ecx,[ecx+ecx*2] - cld - @@: ;затемнение цвета пикселей - shr byte[eax],1 - inc eax - loop @b - - mov eax,dword[data_rgb] - mov ecx,dword[size] ;ecx = size - shr ecx,1 - @@: ;сложение цветов пикселей - mov bx,word[eax+3] ;копируем цвет соседнего пикселя - add word[eax],bx - mov bl,byte[eax+5] ;копируем цвет соседнего пикселя - add byte[eax+2],bl - add eax,6 ;=2*3 - loop @b - - mov eax,dword[data_rgb] - add eax,3 - mov ebx,eax - add ebx,3 - mov ecx,dword[size] ;ecx = size - shr ecx,1 - dec ecx ;лишний пиксель - @@: ;поджатие пикселей - mov edx,dword[ebx] - mov word[eax],dx - shr edx,16 - mov byte[eax+2],dl - - add eax,3 - add ebx,6 - loop @b - ret -endp - -;input: -;data_rgba - pointer to rgba data -;size - count img pixels (size img data / 4(rgba) ) -align 4 -proc img_rgba32_wdiv2 data_rgba:dword, size:dword - mov eax,dword[data_rgba] - - mov eax,dword[data_rgba] - mov ebx,eax - add ebx,4 - mov ecx,dword[size] ;ecx = size - shr ecx,1 - @@: ;смешивание цветов пикселей - call combine_colors_1 - mov [eax],edx - add eax,8 ;=2*4 - add ebx,8 - loop @b - - mov eax,dword[data_rgba] - add eax,4 - mov ebx,eax - add ebx,4 - mov ecx,dword[size] ;ecx = size - shr ecx,1 - dec ecx ;лишний пиксель - @@: ;поджатие пикселей - mov edx,dword[ebx] - mov dword[eax],edx - - add eax,4 - add ebx,8 - loop @b - ret -endp - -;description: -; сжатие изображения по высоте в 2 раза (высота буфера не меняется) -align 4 -proc buf_img_hdiv2, buf_struc:dword - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,8 - jne @f - mov eax,buf2d_w - mov ecx,buf2d_h - imul ecx,eax - stdcall img_8b_hdiv2, buf2d_data,ecx,eax - jmp .end_f ;edi портится в функции, потому использование buf2d_bits опасно - @@: - cmp buf2d_bits,24 - jne @f - mov eax,buf2d_w - mov ecx,buf2d_h - imul ecx,eax - stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax - jmp .end_f - @@: - cmp buf2d_bits,32 - jne @f - mov eax,buf2d_w - mov ecx,buf2d_h - imul ecx,eax - shl eax,2 - stdcall img_rgba32_hdiv2, buf2d_data,ecx,eax - ;jmp .end_f - @@: - .end_f: - popad - ret -endp - -;input: -;data_8b - pointer to 8 bit data -;size - count img pixels (size img data) -;size_w - width img in pixels -align 4 -proc img_8b_hdiv2, data_8b:dword, size:dword, size_w:dword - - mov eax,dword[data_8b] ;eax = - mov ecx,dword[size] - cld - @@: ;затемнение цвета пикселей - shr byte[eax],1 - inc eax - loop @b - - mov eax,dword[data_8b] ;eax = - mov esi,dword[size_w] - mov ebx,esi - add ebx,eax - mov ecx,dword[size] ;ecx = size - shr ecx,1 - xor edi,edi - @@: ;сложение цветов пикселей - mov dl,byte[ebx] ;копируем цвет нижнего пикселя - add byte[eax],dl - - inc eax - inc ebx - inc edi - cmp edi,dword[size_w] - jl .old_line - add eax,esi - add ebx,esi - xor edi,edi - .old_line: - loop @b - - - mov eax,dword[data_8b] ;eax = - add eax,esi ;esi = width*3(rgb) - mov ebx,eax - add ebx,esi - mov ecx,dword[size] ;ecx = size - shr ecx,1 - sub ecx,dword[size_w] ;лишняя строка пикселей - xor edi,edi - @@: ;поджатие пикселей - mov dl,byte[ebx] ;копируем цвет нижнего пикселя - mov byte[eax],dl - - inc eax - inc ebx - inc edi - cmp edi,dword[size_w] - jl .old_line_2 - add ebx,esi - xor edi,edi - .old_line_2: - loop @b - ret -endp - -;input: -;data_rgb - pointer to rgb data -;size - count img pixels (size img data / 3(rgb) ) -;size_w - width img in pixels -align 4 -proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword - - mov eax,dword[data_rgb] ;eax = - mov ecx,dword[size] ;ecx = size - lea ecx,[ecx+ecx*2] - cld - @@: ;затемнение цвета пикселей - shr byte[eax],1 - inc eax - loop @b - - mov eax,dword[data_rgb] ;eax = - mov esi,dword[size_w] - lea esi,[esi+esi*2] ;esi = width*3(rgb) - mov ebx,esi - add ebx,eax - mov ecx,dword[size] ;ecx = size - shr ecx,1 - xor edi,edi - @@: ;сложение цветов пикселей - mov dx,word[ebx] ;копируем цвет нижнего пикселя - add word[eax],dx - mov dl,byte[ebx+2] ;копируем цвет нижнего пикселя - add byte[eax+2],dl - - add eax,3 - add ebx,3 - inc edi - cmp edi,dword[size_w] - jl .old_line - add eax,esi - add ebx,esi - xor edi,edi - .old_line: - loop @b - - mov eax,dword[data_rgb] ;eax = - add eax,esi ;esi = width*3(rgb) - mov ebx,eax - add ebx,esi - mov ecx,dword[size] ;ecx = size - shr ecx,1 - sub ecx,dword[size_w] ;лишняя строка пикселей - xor edi,edi - @@: ;поджатие пикселей - mov edx,dword[ebx] ;копируем цвет нижнего пикселя - mov word[eax],dx - shr edx,16 - mov byte[eax+2],dl - - add eax,3 - add ebx,3 - inc edi - cmp edi,dword[size_w] - jl .old_line_2 - add ebx,esi - xor edi,edi - .old_line_2: - loop @b - ret -endp - -;input: -;data_rgba - pointer to rgba data -;size - count img pixels (size img data / 4(rgba) ) -;size_w_b - width img in bytes -align 4 -proc img_rgba32_hdiv2, data_rgba:dword, size:dword, size_w_b:dword - - mov eax,dword[data_rgba] ;eax = - mov ebx,dword[size_w_b] - add ebx,eax - mov ecx,dword[size] ;ecx = size - shr ecx,1 - xor edi,edi - @@: ;смешивание цветов пикселей - call combine_colors_1 - mov dword[eax],edx - - add eax,4 - add ebx,4 - add edi,4 - cmp edi,dword[size_w_b] - jl .old_line - add eax,dword[size_w_b] - add ebx,dword[size_w_b] - xor edi,edi - .old_line: - loop @b - - mov eax,dword[data_rgba] ;eax = - mov ebx,dword[size_w_b] - add eax,ebx - add ebx,eax - mov ecx,dword[size] ;ecx = size - shl ecx,1 - sub ecx,dword[size_w_b] ;лишняя строка пикселей - shr ecx,2 - xor edi,edi - @@: ;поджатие пикселей - mov edx,dword[ebx] ;копируем цвет нижнего пикселя - mov dword[eax],edx - - add eax,4 - add ebx,4 - add edi,4 - cmp edi,dword[size_w_b] - jl .old_line_2 - add ebx,dword[size_w_b] - xor edi,edi - .old_line_2: - loop @b - ret -endp - -;input: -; eax - указатель на 32-битный цвет -; ebx - указатель на 32-битный цвет -;output: -; edx - 32-битный цвет смешанный с учетом прозрачности -;destroy: -; esi -align 4 -proc combine_colors_1 uses ecx edi -locals - c_blye dd ? - c_green dd ? - c_red dd ? -endl - movzx edi,byte[eax+3] - cmp edi,255 - je .c0z - movzx esi,byte[ebx+3] - cmp esi,255 - je .c1z - cmp edi,esi - je .c0_c1 - - ;переворачиваем значения прозрачностей - neg edi - add edi,256 - neg esi - add esi,256 - - movzx ecx,byte[eax] - imul ecx,edi - mov [c_blye],ecx - movzx ecx,byte[ebx] - imul ecx,esi - add [c_blye],ecx - - movzx ecx,byte[eax+1] - imul ecx,edi - mov [c_green],ecx - movzx ecx,byte[ebx+1] - imul ecx,esi - add [c_green],ecx - - movzx ecx,byte[eax+2] - imul ecx,edi - mov [c_red],ecx - movzx ecx,byte[ebx+2] - imul ecx,esi - add [c_red],ecx - -push eax ebx - xor ebx,ebx - mov eax,[c_red] - xor edx,edx - mov ecx,edi - add ecx,esi - div ecx - mov bl,al - shl ebx,16 - mov eax,[c_green] - xor edx,edx - div ecx - mov bh,al - mov eax,[c_blye] - xor edx,edx - div ecx - mov bl,al - - shr ecx,1 - ;переворачиваем значения прозрачности - neg ecx - add ecx,256 - - shl ecx,24 - add ebx,ecx - mov edx,ebx -pop ebx eax - - jmp .end_f - .c0_c1: ;если прозрачности обоих цветов совпадают - mov edx,[eax] - shr edx,1 - and edx,011111110111111101111111b - mov esi,[ebx] - shr esi,1 - and esi,011111110111111101111111b - add edx,esi - ror edi,8 ;перемещаем значение прозрачности в старший байт edi - or edx,edi - jmp .end_f - .c0z: ;если цвет в eax прозрачный - mov edx,[ebx] - movzx edi,byte[ebx+3] - jmp @f - .c1z: ;если цвет в ebx прозрачный - mov edx,[eax] - @@: - add edi,255 ;делаем цвет на половину прозрачным - shr edi,1 - cmp edi,255 - jle @f - mov edi,255 ;максимальная прозрачность не более 255 - @@: - shl edi,24 - and edx,0xffffff ;снимаем старую прозрачность - add edx,edi - .end_f: - ret -endp - -;description: -; сжатие изображения по ширине (размеры буфера не меняются) -;input: -; data_rgb - pointer to rgb data -; size_w - width img in pixels -; size_h - height img in pixels -; size_w_new - new width img in pixels -align 16 -proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword -locals - pr dd 0 - pg dd 0 - pb dd 0 - img_n dd ? ;указатель на данные нового изображения - lines dd ? -endl -pushad -;eax - delta for inp. img -;ebx - delta for outp. img -;esi - pointer to data_rgb - mov esi,[data_rgb] - mov [img_n],esi - mov eax,[size_h] - mov [lines],eax -align 4 - .cycyle_0: - mov eax,[size_w_new] - mov ecx,[size_w] - mov ebx,ecx -align 4 - .cycyle_1: - cmp eax,ebx - jg .else_0 - ;копируемый пиксель максимально влияет на результат - ;накапливаем rgb для интерполяции пикселей - mov edx,[size_w_new] - movzx edi,byte[esi] - imul edi,edx - add [pb],edi - movzx edi,byte[esi+1] - imul edi,edx - add [pg],edi - movzx edi,byte[esi+2] - imul edi,edx - add [pr],edi - cmp eax,ebx - je .d2_add - jmp .if_0_end - .else_0: - ;копируемый пиксель попадет на границу пикселей - mov edx,ebx - sub edx,eax - add edx,[size_w_new] - movzx edi,byte[esi] - imul edi,edx - add [pb],edi - movzx edi,byte[esi+1] - imul edi,edx - add [pg],edi - movzx edi,byte[esi+2] - imul edi,edx - add [pr],edi - ;сохраняем готовое rgb - .d2_add: - push eax - mov edi,[img_n] - mov eax,[pb] - xor edx,edx - div dword[size_w] ;eax /= [size_w] - stosb - mov eax,[pg] - xor edx,edx - div dword[size_w] ;eax /= [size_w] - stosb - mov eax,[pr] - xor edx,edx - div dword[size_w] ;eax /= [size_w] - stosb - pop eax - add dword[img_n],3 ;next pixel - ;обновляем rgb для нового пикселя - mov edx,eax - sub edx,ebx - movzx edi,byte[esi] - imul edi,edx - mov [pb],edi - movzx edi,byte[esi+1] - imul edi,edx - mov [pg],edi - movzx edi,byte[esi+2] - imul edi,edx - mov [pr],edi - add ebx,[size_w] - .if_0_end: - add eax,[size_w_new] - add esi,3 ;next pixel - dec ecx - jnz .cycyle_1 - dec dword[lines] - jnz .cycyle_0 -popad - ret -endp - -;description: -; сжатие изображения по высоте (размеры буфера не меняются) -;input: -; data_rgb - pointer to rgb data -; size_w - width img in pixels -; size_h - height img in pixels -; size_h_new - new height img in pixels -align 16 -proc img_rgb24_hresize, data_rgb:dword, size_w:dword, size_h:dword, size_h_new:dword -locals - pr dd 0 - pg dd 0 - pb dd 0 - img_n dd ? ;указатель на данные нового изображения - cols dd ? - lin_b dd ? ;размер линии изображения в байтах - data_n dd ? ;указатель на данные для нового столбца пикселей -endl -pushad -;eax - delta for inp. img -;ebx - delta for outp. img -;esi - pointer to data_rgb - mov esi,[data_rgb] - mov [data_n],esi - mov eax,[size_w] - mov [cols],eax - lea eax,[eax+eax*2] - mov [lin_b],eax -align 4 - .cycyle_0: - mov eax,[size_h_new] - mov ecx,[size_h] - mov ebx,ecx - mov esi,[data_n] - mov [img_n],esi - add dword[data_n],3 ;переход на следующий столбец пикселей -align 4 - .cycyle_1: - cmp eax,ebx - jg .else_0 - ;копируемый пиксель максимально влияет на результат - ;накапливаем rgb для интерполяции пикселей - mov edx,[size_h_new] - movzx edi,byte[esi] - imul edi,edx - add [pb],edi - movzx edi,byte[esi+1] - imul edi,edx - add [pg],edi - movzx edi,byte[esi+2] - imul edi,edx - add [pr],edi - cmp eax,ebx - je .d2_add - jmp .if_0_end - .else_0: - ;копируемый пиксель попадет на границу пикселей - mov edx,ebx - sub edx,eax - add edx,[size_h_new] - movzx edi,byte[esi] - imul edi,edx - add [pb],edi - movzx edi,byte[esi+1] - imul edi,edx - add [pg],edi - movzx edi,byte[esi+2] - imul edi,edx - add [pr],edi - ;сохраняем готовое rgb - .d2_add: - push eax - mov edi,[img_n] - mov eax,[pb] - xor edx,edx - div dword[size_h] ;eax /= [size_h] - stosb - mov eax,[pg] - xor edx,edx - div dword[size_h] ;eax /= [size_h] - stosb - mov eax,[pr] - xor edx,edx - div dword[size_h] ;eax /= [size_h] - stosb - pop eax - mov edx,[lin_b] - add dword[img_n],edx ;next pixel - ;обновляем rgb для нового пикселя - mov edx,eax - sub edx,ebx - movzx edi,byte[esi] - imul edi,edx - mov [pb],edi - movzx edi,byte[esi+1] - imul edi,edx - mov [pg],edi - movzx edi,byte[esi+2] - imul edi,edx - mov [pr],edi - add ebx,[size_h] - .if_0_end: - add eax,[size_h_new] - add esi,[lin_b] ;next pixel - dec ecx - jnz .cycyle_1 - dec dword[cols] - jnz .cycyle_0 -popad - ret -endp - -;преобразование буфера из 24-битного в 8-битный -; spectr - определяет какой спектр брать при преобразовании 0-синий, 1-зеленый, 2-красный -align 4 -proc buf_conv_24_to_8, buf_struc:dword, spectr:dword - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,24 - jne .error0 - mov eax,buf2d_w - cmp eax,1 - jl .error1 - mov ecx,buf2d_h - cmp ecx,1 - jl .error1 - imul ecx,eax - mov esi,ecx - ;ebx - память из которой копируется - ;edx - память куда копируется - mov edx,buf2d_data - mov ebx,edx - cmp [spectr],3 - jge @f - add ebx,[spectr] - @@: - mov al,byte[ebx] - mov byte[edx],al - add ebx,3 - inc edx - loop @b - mov buf2d_bits,8 - invoke mem.realloc,buf2d_data,esi ;уменьшаем память занимаемую буфером - jmp .end_conv - .error0: - stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b - jmp .end_conv - .error1: - stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_size_0 - .end_conv: - popad - ret -endp - -;преобразование буфера из 24-битного в 32-битный -align 4 -proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword - pushad - mov edi,dword[buf_struc] - cmp buf2d_bits,24 - jne .error1 - mov ecx,buf2d_w - mov ebx,buf2d_h - imul ebx,ecx - mov ecx,ebx ;ecx = size 8 b - shl ebx,2 ;ebx = size 32 b - invoke mem.realloc,buf2d_data,ebx ;увеличиваем память занимаемую буфером - mov buf2d_data,eax ;на случай если изменился указатель на данные - mov buf2d_bits,32 - mov edx,ebx ;edx = size 32 b - sub ebx,ecx ;ebx = size 24 b - mov eax,ecx - ;eax - размер 8 битных данных - ;ebx - размер 24 битных данных - ;edx - размер 32 битных данных - add ebx,buf2d_data - add edx,buf2d_data - mov edi,dword[buf_str8] - cmp buf2d_bits,8 - jne .error2 - add eax,buf2d_data - mov edi,edx - ;eax - указатель на конец 8 битных данных - ;ebx - указатель на конец 24 битных данных - ;edi - указатель на конец 32 битных данных - @@: - sub edi,4 ;отнимаем в начале цикла, - sub ebx,3 ; потому, что указатели стоят - dec eax ; за пределами буферов - mov edx,dword[ebx] - mov dword[edi],edx - mov dl,byte[eax] - mov byte[edi+3],dl - loop @b - - jmp .end_conv - .error1: - stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b - jmp .end_conv - .error2: - stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b - .end_conv: - popad - ret -endp - -;функция копирует изображение из буфера buf_source (24b|32b) в buf_destination (24b) -; указываются координаты вставки буфера buf_source относительно buf_destination -; прозрачность при копировании не учитывается -align 4 -proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword - locals - lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер) - endl - pushad - - mov edi,[buf_source] - cmp buf2d_bits,24 - je .sou24 - cmp buf2d_bits,32 - je .sou32 - jmp .copy_end ;формат буфера не поодерживается - - .sou24: ;в источнике 24 битная картинка - mov eax,buf2d_w - mov edx,buf2d_h ;высота копируемой картинки - mov esi,buf2d_data ;данные копируемой картинки - - mov edi,[buf_destination] - cmp buf2d_bits,24 - jne .copy_end ;формат буфера не поодерживается - mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки) - cmp ebx,buf2d_w ;проверяем влазит ли изображение по ширине - jge .copy_end ;если изображение полностью вылазит за правую сторону - mov ebx,buf2d_h ;ebx - высота основного буфера - mov ecx,[coord_y] - cmp ecx,0 - jge @f - ;если координата coord_y<0 (1-я настройка) - add edx,ecx ;уменьшаем высоту копируемой картинки - cmp edx,0 - jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) - neg ecx - imul ecx,eax - lea ecx,[ecx+ecx*2] ;по 3 байта на пиксель - add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части - xor ecx,ecx ;обнуляем координату coord_y - @@: - cmp ecx,ebx - jge .copy_end ;если координата 'y' больше высоты буфера - add ecx,edx ;ecx - нижняя координата копируемой картинки - cmp ecx,ebx - jle @f - sub ecx,ebx - sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу - @@: - mov ebx,buf2d_w - mov ecx,[coord_y] ;ecx используем для временных целей - cmp ecx,0 - jg .end_otr_c_y_24 - ;если координата coord_y<=0 (2-я настройка) - mov ecx,[coord_x] - jmp @f - .end_otr_c_y_24: - imul ecx,ebx - add ecx,[coord_x] - @@: - lea ecx,[ecx+ecx*2] - add ecx,buf2d_data - sub ebx,eax - mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - - mov dword[lost_bytes],0 - mov ecx,[coord_x] - cmp ecx,0 - jge @f - neg ecx - cmp eax,ecx ;eax - ширина копируемой картинки - jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - lea ecx,[ecx+ecx*2] - mov [lost_bytes],ecx - add esi,ecx - add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - xor ecx,ecx - @@: - cmp ecx,ebx - jle @f - sub ecx,ebx - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - lea ecx,[ecx+ecx*2] ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону - add [lost_bytes],ecx - @@: - - lea eax,[eax+eax*2] ;колличество байт в 1-й строке копируемой картинки - lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки - - cld - cmp [lost_bytes],0 - jg .copy_1 - .copy_0: ;простое копирование - mov ecx,eax - rep movsb - add edi,ebx - dec edx - cmp edx,0 - jg .copy_0 - jmp .copy_end - .copy_1: ;не простое копирование (картинка вылазит за правую сторону) - mov ecx,eax - rep movsb - add edi,ebx - add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу - dec edx - cmp edx,0 - jg .copy_1 - jmp .copy_end - - .sou32: ;в источнике 32 битная картинка - mov eax,buf2d_w - mov edx,buf2d_h ;высота копируемой картинки - mov esi,buf2d_data ;данные копируемой картинки - - mov edi,[buf_destination] - cmp buf2d_bits,24 - jne .copy_end ;формат буфера не поодерживается - mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки) - cmp ebx,buf2d_w ;проверяем влазит ли изображение по ширине - jge .copy_end ;если изображение полностью вылазит за правую сторону - mov ebx,buf2d_h ;ebx - высота основного буфера - mov ecx,[coord_y] - cmp ecx,0 - jge @f - ;если координата coord_y<0 (1-я настройка) - add edx,ecx ;уменьшаем высоту копируемой картинки - cmp edx,0 - jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) - neg ecx - imul ecx,eax - shl ecx,2 ;по 4 байта на пиксель - add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части - xor ecx,ecx ;обнуляем координату coord_y - @@: - cmp ecx,ebx - jge .copy_end ;если координата 'y' больше высоты буфера - add ecx,edx ;ecx - нижняя координата копируемой картинки - cmp ecx,ebx - jle @f - sub ecx,ebx - sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу - @@: - mov ebx,buf2d_w - ;mov ecx,ebx ;ecx используем для временных целей - ;imul ecx,[coord_y] - ;add ecx,[coord_x] - mov ecx,[coord_y] ;ecx используем для временных целей - cmp ecx,0 - jg .end_otr_c_y_32 - ;если координата coord_y<=0 (2-я настройка) - mov ecx,[coord_x] - jmp @f - .end_otr_c_y_32: - imul ecx,ebx - add ecx,[coord_x] - @@: - lea ecx,[ecx+ecx*2] - add ecx,buf2d_data - sub ebx,eax - mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - - mov dword[lost_bytes],0 - mov ecx,[coord_x] - cmp ecx,0 - jge @f - neg ecx - cmp eax,ecx ;eax - ширина копируемой картинки - jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - shl ecx,2 - mov [lost_bytes],ecx - add esi,ecx - add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - xor ecx,ecx - @@: - cmp ecx,ebx - jle @f - sub ecx,ebx - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - shl ecx,2 ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону - add [lost_bytes],ecx - @@: - - ;eax - колличество пикселей в 1-й строке копируемой картинки - lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки - - cld - cmp [lost_bytes],0 - jg .copy_3 - .copy_2: ;простое копирование - mov ecx,eax - @@: - movsw - movsb - inc esi - loop @b - add edi,ebx - dec edx - cmp edx,0 - jg .copy_2 - jmp .copy_end - .copy_3: ;не простое копирование (картинка вылазит за правую сторону) - mov ecx,eax - @@: - movsw - movsb - inc esi - loop @b - add edi,ebx - add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу - dec edx - cmp edx,0 - jg .copy_3 - - .copy_end: - popad - ret -endp - -;input: -; esi = pointer to color1 + transparent (32b) -; edi = pointer to background color2 (24b) -;output: -; [edi] = combine color (24b) -align 4 -combine_colors_0: - push ax cx - movzx cx,byte[esi+3] ;pro - cmp cx,255 - je .end_f - or cx,cx - jnz @f - mov ax,[esi] - mov [edi],ax - mov al,[esi+2] - mov [edi+2],al - jmp .end_f -align 4 - @@: - inc cx - push bx dx - mov bx,0x0100 ;---get transparent--- - sub bx,cx ;256-pro - ;---blye--- - movzx ax,byte[esi] - imul ax,bx - movzx dx,byte[edi] - imul dx,cx - add ax,dx - mov byte[edi],ah - ;---green--- - movzx ax,byte[esi+1] - imul ax,bx - movzx dx,byte[edi+1] - imul dx,cx - add ax,dx - mov byte[edi+1],ah - ;---red--- - movzx ax,byte[esi+2] - imul ax,bx - movzx dx,byte[edi+2] - imul dx,cx - add ax,dx - mov byte[edi+2],ah - pop dx bx -.end_f: - pop cx ax - ret - -;функция копирует изображение из буфера buf_source (32b) в buf_destination (24b) -; указываются координаты вставки буфера buf_source относительно buf_destination -; при копировании учитывается прозрачность -align 4 -proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword - locals - lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер) - endl - pushad - - mov edi,[buf_source] - cmp buf2d_bits,32 - jne .copy_end ;формат буфера не поодерживается - mov eax,buf2d_w - mov edx,buf2d_h ;высота копируемой картинки - mov esi,buf2d_data ;данные копируемой картинки - - mov edi,[buf_destination] - cmp buf2d_bits,24 - jne .copy_end ;формат буфера не поодерживается - mov ebx,buf2d_h ;ebx - высота основного буфера - mov ecx,[coord_y] - cmp ecx,0 - jge @f - ;если координата coord_y<0 (1-я настройка) - add edx,ecx ;уменьшаем высоту копируемой картинки - cmp edx,0 - jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) - neg ecx - imul ecx,eax - shl ecx,2 ;по 4 байта на пиксель - add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части - xor ecx,ecx ;обнуляем координату coord_y - @@: - cmp ecx,ebx - jge .copy_end ;если координата 'y' больше высоты буфера - add ecx,edx ;ecx - нижняя координата копируемой картинки - cmp ecx,ebx - jle @f - sub ecx,ebx - sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу - @@: - mov ebx,buf2d_w - mov ecx,ebx ;ecx используем для временных целей - cmp [coord_y],0 - jg .end_otr_c_y - ;если координата coord_y<=0 (2-я настройка) - mov ecx,[coord_x] - jmp @f - .end_otr_c_y: - imul ecx,[coord_y] - add ecx,[coord_x] - @@: - lea ecx,[ecx+ecx*2] - add ecx,buf2d_data - sub ebx,eax - mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - - mov dword[lost_bytes],0 - mov ecx,[coord_x] - cmp ecx,0 - jge @f - neg ecx - cmp eax,ecx ;eax - ширина копируемой картинки - jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - shl ecx,2 - mov [lost_bytes],ecx - add esi,ecx - shr ecx,2 - lea ecx,[ecx+ecx*2] - add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - xor ecx,ecx - @@: - cmp ecx,ebx - jle @f - sub ecx,ebx - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - shl ecx,2 ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону - add [lost_bytes],ecx - @@: - - lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки - - cld - cmp [lost_bytes],0 - jg .copy_1 - .copy_0: ;простое копирование - mov ecx,eax - @@: - call combine_colors_0 - add edi,3 - add esi,4 - loop @b - add edi,ebx - dec edx - cmp edx,0 - jg .copy_0 - jmp .copy_end - .copy_1: ;не простое копирование (картинка вылазит за правую сторону) - mov ecx,eax - @@: - call combine_colors_0 - add edi,3 - add esi,4 - loop @b - add edi,ebx - add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу - dec edx - cmp edx,0 - jg .copy_1 - - .copy_end: - popad - ret -endp - -;input: -; ebx - color1 (24b) -; esi = pointer to transparent (8b) -; edi = pointer to background color2 (24b) -;output: -; [edi] = combine color (24b) -align 4 -combine_colors_2: - push ebx cx - movzx cx,byte[esi] ;pro - cmp cx,255 - je .end_f - or cx,cx - jnz @f - mov [edi],bx - shr ebx,16 - mov [edi+2],bl - jmp .end_f -align 4 - @@: - inc cx - push ax dx si - mov si,0x0100 ;---get transparent--- - sub si,cx ;256-pro - - ;---blye--- - movzx ax,bl - shr ebx,8 - imul ax,si - movzx dx,byte[edi] - imul dx,cx - add ax,dx - mov byte[edi],ah - ;---green--- - movzx ax,bl - shr ebx,8 - imul ax,si - movzx dx,byte[edi+1] - imul dx,cx - add ax,dx - mov byte[edi+1],ah - ;---red--- - movzx ax,bl - imul ax,si - movzx dx,byte[edi+2] - imul dx,cx - add ax,dx - mov byte[edi+2],ah - pop si dx ax -.end_f: - pop cx ebx - ret - -;функция копирует изображение из буфера buf_source (8b) в buf_destination (24b) -; указываются координаты вставки буфера buf_source относительно buf_destination -align 4 -proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword - locals - lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер) - dest_w_bytes dd ? ;колличество байт в буфере приемнике по ширине - ширина вставляемой картинки - endl - pushad - - mov edi,[buf_source] - cmp buf2d_bits,8 - jne .error1 ;формат буфера не поодерживается - mov eax,buf2d_w ;ширина копируемой картинки - mov edx,buf2d_h ;высота копируемой картинки - mov esi,buf2d_data ;данные копируемой картинки - - mov edi,[buf_destination] - cmp buf2d_bits,24 - jne .error2 ;формат буфера не поодерживается - mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки) - cmp ebx,buf2d_w ;проверяем влазит ли изображение по ширине - jge .copy_end ;если изображение полностью вылазит за правую сторону - mov ebx,buf2d_h ;ebx - высота основного буфера - mov ecx,[coord_y] - cmp ecx,0 - jge @f - ;если координата coord_y<0 (1-я настройка) - add edx,ecx ;уменьшаем высоту копируемой картинки - cmp edx,0 - jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) - neg ecx - imul ecx,eax - add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части - xor ecx,ecx ;обнуляем координату coord_y - @@: - cmp ecx,ebx - jge .copy_end ;если координата 'y' больше высоты буфера - add ecx,edx ;ecx - нижняя координата копируемой картинки - cmp ecx,ebx - jle @f - sub ecx,ebx - sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу - @@: - mov ebx,buf2d_w - mov ecx,[coord_y] ;ecx используем для временных целей - cmp ecx,0 - jg .end_otr_c_y - ;если координата coord_y<=0 (2-я настройка) - mov ecx,[coord_x] - jmp @f - .end_otr_c_y: - imul ecx,ebx - add ecx,[coord_x] - @@: - lea ecx,[ecx+ecx*2] - add ecx,buf2d_data ;buf2d_data данные основного буфера - sub ebx,eax ;ebx - ширина основного буфера минус ширина рисуемого буфера - mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - - mov dword[lost_bytes],0 - mov ecx,[coord_x] - cmp ecx,0 - jge @f - neg ecx - cmp eax,ecx ;eax - ширина копируемой картинки - jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - mov [lost_bytes],ecx - add esi,ecx - lea ecx,[ecx+ecx*2] - add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование - xor ecx,ecx - @@: - cmp ecx,ebx - jle @f - sub ecx,ebx - sub eax,ecx ;укорачиваем копируемую строку - add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера - ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону - add [lost_bytes],ecx - @@: - - lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки - mov [dest_w_bytes],ebx - mov ebx,[color] - - cld - cmp dword[lost_bytes],0 - jg .copy_1 - .copy_0: ;простое копирование - mov ecx,eax - @@: - call combine_colors_2 - add edi,3 - inc esi - loop @b - add edi,[dest_w_bytes] - dec edx - cmp edx,0 - jg .copy_0 - jmp .copy_end - .copy_1: ;не простое копирование (картинка вылазит за левую и/или правую сторону) - mov ecx,eax - @@: - call combine_colors_2 - add edi,3 - inc esi - loop @b - add edi,[dest_w_bytes] - add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу - dec edx - cmp edx,0 - jg .copy_1 - - jmp .copy_end - .error1: - stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b - jmp .copy_end - .error2: - stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b - .copy_end: - popad - ret -endp - -align 4 -proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки - pushad - mov eax,63 - mov ebx,1 - - mov esi,[fun] - @@: - mov cl,byte[esi] - int 0x40 - inc esi - cmp byte[esi],0 - jne @b - mov cl,':' - int 0x40 - mov cl,' ' - int 0x40 - mov esi,[mes] - @@: - mov cl,byte[esi] - int 0x40 - inc esi - cmp byte[esi],0 - jne @b - popad - ret -endp - -;фильтр -align 4 -proc buf_filter_dither, buffer:dword, algor:dword - pushad - mov edi,[buffer] - cmp buf2d_bits,24 - jne .error - mov edx,buf2d_w - mov esi,buf2d_h - mov edi,buf2d_data -;edi - pointer to 24bit bitmap -;edx - x size -;esi - y size - lea edx,[edx+edx*2] - imul esi,edx - - ;определяем какой алгоритм использовать - cmp dword[algor],0 - jne @f - call dither_0 - jmp .dither_end - @@: - cmp dword[algor],1 - jne @f - call dither_1 - jmp .dither_end - @@: - cmp dword[algor],2 - jne @f - call dither_2 - jmp .dither_end - @@: - cmp dword[algor],3 - jne @f - call dither_3 - jmp .dither_end - @@: - call dither_4 - jmp .dither_end - .error: - stdcall print_err,sz_buf2d_filter_dither,txt_err_n24b - .dither_end: - popad - ret -endp - -align 16 -dither_0: ; Sierra Filter Lite algorithm -newp_0: ; Dithering cycle - xor ebx,ebx ; At first threshold - movzx ecx,byte[edi] - cmp cl,255 - je newp_0.next - test cl,cl - jz newp_0.next - jns @f - dec ebx - sub ecx,255 -@@: - mov [edi],bl ; putpixel - - sar ecx,1 ; error/2 - ;adc ecx,0 ; round to integer - - movzx eax,byte[edi+3] ; pixel (x+1;y) - add eax,ecx ; add error/2 to (x+1;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok -@@: - cmp eax,255 - jle .ok - or al,255 -.ok: - mov [edi+3],al ; putpixel - - sar ecx,1 ; error/4 - adc ecx,0 ; round to integer - - movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) - add eax,ecx ; add error/4 to (x-1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok1 -@@: - cmp eax,255 - jle .ok1 - or al,255 -.ok1: - mov [edi+edx-3],al ; putpixel - - movzx eax,byte[edi+edx] ; pixel (x;y+1) - add eax,ecx ; add error/4 to (x;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok2 -@@: - cmp eax,255 - jle .ok2 - or al,255 -.ok2: - mov [edi+edx],al ; putpixel - -.next: - inc edi - dec esi - jnz newp_0 - ret - -align 16 -dither_1: ; Floyd-Steinberg algorithm -newp_1: ; Dithering cycle - xor ebx,ebx ; At first threshold - movzx ecx,byte[edi] - cmp cl,255 - je newp_1.next - test cl,cl - jz newp_1.next - jns @f - dec ebx - sub ecx,255 -@@: - mov [edi],bl ; putpixel - - sar ecx,4 ; error/16 - adc ecx,0 ; round to integer - mov ebx,ecx - - movzx eax,byte[edi+edx+3] ; pixel (x+1;y+1) - add eax,ecx ; add error/16 to (x+1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok -@@: - cmp eax,255 - jle .ok - or al,255 -.ok: - mov [edi+edx+3],al ;putpixel - - imul ecx,3 - movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) - add eax,ecx ; add 3*error/16 to (x-1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok1 -@@: - cmp eax,255 - jle .ok1 - or al,255 -.ok1: - mov [edi+edx-3],al ;putpixel - - mov ecx,ebx - imul ecx,5 - movzx eax,byte[edi+edx] ; pixel (x;y+1) - add eax,ecx ; add 5*error/16 to (x;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok2 -@@: - cmp eax,255 - jle .ok2 - or al,255 -.ok2: - mov [edi+edx],al ;putpixel - - mov ecx,ebx - imul ecx,7 - movzx eax,byte[edi+3] ; pixel (x+1;y) - add eax,ecx ; add 7*error/16 to (x+1;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok3 -@@: - cmp eax,255 - jle .ok3 - or al,255 -.ok3: - mov [edi+3],al ;putpixel - -.next: - inc edi - dec esi - jnz newp_1 - ret - -align 16 -dither_2: ; Burkes algorithm -newp_2: ; Dithering cycle - xor ebx,ebx ; At first threshold - movsx ecx,byte[edi] - cmp cl,255 - je newp_2.next - test cl,cl - jz newp_2.next - jns @f - dec ebx -@@: - mov [edi],bl ; putpixel - - sar ecx,2 ; error/4 - adc ecx,0 ; round to integer - - movzx eax,byte[edi+3] ; pixel (x+1;y) - add eax,ecx ; add error/4 to (x+1;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok -@@: - cmp eax,255 - jle .ok - or al,255 -.ok: - mov [edi+3],al ; putpixel - - movzx eax,byte[edi+edx] ; pixel (x;y+1) - add eax,ecx ; add error/4 to (x;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok1 -@@: - cmp eax,255 - jle .ok1 - or al,255 -.ok1: - mov [edi+edx],al ; putpixel - - sar ecx,1 ; error/8 - adc ecx,0 ; round to integer - - movzx eax,byte[edi+6] ; pixel (x+2;y) - add eax,ecx ; add error/8 to (x+2;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok2 -@@: - cmp eax,255 - jle .ok2 - or al,255 -.ok2: - mov [edi+6],al ; putpixel - - movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) - add eax,ecx ; add error/8 to (x-1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok3 -@@: - cmp eax,255 - jle .ok3 - or al,255 -.ok3: - mov [edi+edx-3],al ; putpixel - - movzx eax,byte[edi+edx+3] ; pixel (x+1;y+1) - add eax,ecx ; add error/8 to (x+1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok4 -@@: - cmp eax,255 - jle .ok4 - or al,255 -.ok4: - mov [edi+edx+3],al ; putpixel - - sar ecx,1 ; error/16 - ;adc ecx,0 ; round to integer - - movzx eax,byte[edi+edx-6] ; pixel (x-2;y+1) - add eax,ecx ; add error/16 to (x-2;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok5 -@@: - cmp eax,255 - jle .ok5 - or al,255 -.ok5: - mov [edi+edx-6],al ; putpixel - - movzx eax,byte[edi+edx+6] ; pixel (x+2;y+1) - add eax,ecx ; add error/16 to (x+2;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok6 -@@: - cmp eax,255 - jle .ok6 - or al,255 -.ok6: - mov [edi+edx+6],al ; putpixel - -.next: - inc edi - dec esi - jnz newp_2 - ret - - -align 16 -dither_3: ; Heavyiron_mod algorithm - newp_3: ; Dithering cycle - xor ebx,ebx ; At first threshold - movzx ecx,byte[edi] - cmp cl,255 - je .next - test cl,cl - jz .next - jns @f - dec ebx - sub ecx,255 - @@: - mov [edi],bl ; putpixel - - sar ecx,2 ; error/4 - - movzx eax,byte[edi+3] ; pixel (x+1;y) - add eax,ecx ; add error/4 to (x+1;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok - @@: - cmp eax,255 - jle .ok - or al,255 - .ok: - mov [edi+3],al ; putpixel - - movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) - add eax,ecx ; add error/4 to (x-1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok1 - @@: - cmp eax,255 - jle .ok1 - or al,255 - .ok1: - mov [edi+edx-3],al ; putpixel - - movzx eax,byte[edi+edx] ; pixel (x;y+1) - add eax,ecx ; add error/4 to (x;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok2 - @@: - cmp eax,255 - jle .ok2 - or al,255 - .ok2: - mov [edi+edx],al ; putpixel - - .next: - inc edi - dec esi - jnz newp_3 - ret - -align 16 -dither_4: ; Atkinson algorithm - newp_4: ; Dithering cycle - - xor ebx,ebx ; At first threshold - movsx ecx,byte[edi] - cmp cl,255 - je .next - test cl,cl - jz .next - jns @f - dec ebx - @@: - mov [edi],bl ; putpixel - - sar ecx,3 ; error/8 - - movzx eax,byte[edi+3] ; pixel (x+1;y) - add eax,ecx ; add error/8 to (x+1;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok - @@: - cmp eax,255 - jle .ok - or al,255 - .ok: - mov [edi+3],al ; putpixel - - movzx eax,byte[edi+edx] ; pixel (x;y+1) - add eax,ecx ; add error/8 to (x;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok1 - @@: - cmp eax,255 - jle .ok1 - or al,255 - .ok1: - mov [edi+edx],al ; putpixel - - movzx eax,byte[edi+6] ; pixel (x+2;y) - add eax,ecx ; add error/8 to (x+2;y) - jge @f ; check_overflow - xor eax,eax - jmp .ok2 - @@: - cmp eax,255 - jle .ok2 - or al,255 - .ok2: - mov [edi+6],al ; putpixel - - movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) - add eax,ecx ; add error/8 to (x-1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok3 - @@: - cmp eax,255 - jle .ok3 - or al,255 - .ok3: - mov [edi+edx-3],al ; putpixel - - movzx eax,byte[edi+edx+3] ; pixel (x+1;y+1) - add eax,ecx ; add error/8 to (x+1;y+1) - jge @f ; check_overflow - xor eax,eax - jmp .ok4 - @@: - cmp eax,255 - jle .ok4 - or al,255 - .ok4: - mov [edi+edx+3],al ; putpixel - - - movzx eax,byte[edi+edx+edx] ; pixel (x;y+2) - add eax,ecx ; add error/8 to (x;y+2) - jge @f ; check_overflow - xor eax,eax - jmp .ok5 - @@: - cmp eax,255 - jle .ok5 - or al,255 - .ok5: - mov [edi+edx+edx],al ; putpixel - - .next: - inc edi - dec esi - jnz newp_4 - ret - - - -include 'fun_voxel.inc' ;функции для работы с воксельной графикой - -txt_err_size_0 db 'image size < 1 pixel',13,10,0 -txt_err_n8b db 'need buffer 8 bit',13,10,0 -txt_err_n24b db 'need buffer 24 bit',13,10,0 -txt_err_n32b db 'need buffer 32 bit',13,10,0 -txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0 - -align 16 -EXPORTS: - dd sz_lib_init, lib_init - dd sz_buf2d_create, buf_create - dd sz_buf2d_create_f_img, buf_create_f_img - dd sz_buf2d_clear, buf_clear - dd sz_buf2d_draw, buf_draw_buf - dd sz_buf2d_delete, buf_delete - dd sz_buf2d_resize, buf_resize - dd sz_buf2d_rotate, buf_rotate - dd sz_buf2d_line, buf_line_brs - dd sz_buf2d_line_sm, buf_line_brs_sm - dd sz_buf2d_rect_by_size, buf_rect_by_size - dd sz_buf2d_filled_rect_by_size, buf_filled_rect_by_size - dd sz_buf2d_circle, buf_circle - dd sz_buf2d_img_hdiv2, buf_img_hdiv2 - dd sz_buf2d_img_wdiv2, buf_img_wdiv2 - dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8 - dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32 - dd sz_buf2d_bit_blt, buf_bit_blt - dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp - dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha - dd sz_buf2d_curve_bezier, buf_curve_bezier - dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix - dd sz_buf2d_draw_text, buf_draw_text - dd sz_buf2d_crop_color, buf_crop_color - dd sz_buf2d_offset_h, buf_offset_h - dd sz_buf2d_flood_fill, buf_flood_fill - dd sz_buf2d_set_pixel, buf_set_pixel - dd sz_buf2d_get_pixel, buf_get_pixel - dd sz_buf2d_flip_h, buf_flip_h - dd sz_buf2d_flip_v, buf_flip_v - dd sz_buf2d_filter_dither, buf_filter_dither - dd sz_buf2d_vox_brush_create, vox_brush_create - dd sz_buf2d_vox_brush_delete, vox_brush_delete - dd sz_buf2d_vox_obj_get_img_w_3g, buf_vox_obj_get_img_w_3g - dd sz_buf2d_vox_obj_get_img_h_3g, buf_vox_obj_get_img_h_3g - dd sz_buf2d_vox_obj_draw_1g, buf_vox_obj_draw_1g - dd sz_buf2d_vox_obj_draw_3g, buf_vox_obj_draw_3g - dd sz_buf2d_vox_obj_draw_3g_scaled, buf_vox_obj_draw_3g_scaled - dd sz_buf2d_vox_obj_draw_pl, buf_vox_obj_draw_pl - dd sz_buf2d_vox_obj_draw_pl_scaled, buf_vox_obj_draw_pl_scaled - dd sz_buf2d_vox_obj_draw_3g_shadows, buf_vox_obj_draw_3g_shadows - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 ;очистка буфера указанным цветом - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_resize db 'buf2d_resize',0 - sz_buf2d_rotate db 'buf2d_rotate',0 - sz_buf2d_line db 'buf2d_line',0 ;рисование линии - sz_buf2d_line_sm db 'buf2d_line_sm',0 ;рисование сглаженной линии - sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;рисование рамки прямоугольника, 2-я координата задана по размеру - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 ;рисование залитого прямоугольника, 2-я координата задана по размеру - sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;сжатие изображения по высоте в 2 раза (размер буфера не меняется) - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;сжатие изображения по ширине в 2 раза (размер буфера не меняется) - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - sz_buf2d_flood_fill db 'buf2d_flood_fill',0 - sz_buf2d_set_pixel db 'buf2d_set_pixel',0 - sz_buf2d_get_pixel db 'buf2d_get_pixel',0 - sz_buf2d_flip_h db 'buf2d_flip_h',0 - sz_buf2d_flip_v db 'buf2d_flip_v',0 - sz_buf2d_filter_dither db 'buf2d_filter_dither',0 - sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 - sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 - sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 - sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 - sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 - sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 - sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 - sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 - sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 - sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +format MS COFF +public EXPORTS +section '.flat' code readable align 16 + +include '../../../macros.inc' +include '../../../proc32.inc' + +;----------------------------------------------------------------------------- +mem.alloc dd ? ;функция для выделения памяти +mem.free dd ? ;функция для освобождения памяти +mem.realloc dd ? ;функция для перераспределения памяти +dll.load dd ? + +BUF_STRUCT_SIZE equ 21 +buf2d_data equ dword[edi] ;данные буфера изображения +buf2d_w equ dword[edi+8] ;ширина буфера +buf2d_h equ dword[edi+12] ;высота буфера +buf2d_l equ word[edi+4] +buf2d_t equ word[edi+6] ;отступ сверху +buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения + +struct buf_2d_header + img_data dd ? + left dw ? ;+4 left + top dw ? ;+6 top + size_x dd ? ;+8 w + size_y dd ? ;+12 h + color dd ? ;+16 color + bit_pp db ? ;+21 bit in pixel +ends + +macro swap v1, v2 { + push v1 + push v2 + pop v1 + pop v2 +} + +;флаги, для функции обрезания буфера +BUF2D_OPT_CROP_TOP equ 1 ;обрезка сверху +BUF2D_OPT_CROP_LEFT equ 2 ;обрезка слева +BUF2D_OPT_CROP_BOTTOM equ 4 ;обрезка снизу +BUF2D_OPT_CROP_RIGHT equ 8 ;обрезка справа +BUF2D_BIT_OPT_CROP_TOP equ 0 +BUF2D_BIT_OPT_CROP_LEFT equ 1 +BUF2D_BIT_OPT_CROP_BOTTOM equ 2 +BUF2D_BIT_OPT_CROP_RIGHT equ 3 + +;input: +; eax = указатель на функцию выделения памяти +; ebx = ... освобождения памяти +; ecx = ... перераспределения памяти +; edx = ... загрузки библиотеки (пока не используется) +align 16 +lib_init: + mov dword[mem.alloc], eax + mov dword[mem.free], ebx + mov dword[mem.realloc], ecx + mov dword[dll.load], edx + ret + +include 'fun_draw.inc' ;функции рисования в буфере + +;создание буфера +align 4 +proc buf_create, buf_struc:dword + pushad + mov edi,dword[buf_struc] + mov ecx,buf2d_w + mov ebx,buf2d_h + imul ecx,ebx + cmp buf2d_bits,24 + jne @f + lea ecx,[ecx+ecx*2] ; 24 bit = 3 + ;;;inc ecx ;запасной байт в конце буфера, что-бы не глючили некоторые функции на изображениях кратных 4К + @@: + cmp buf2d_bits,32 + jne @f + shl ecx,2 ; 32 bit = 4 + @@: + invoke mem.alloc,ecx + mov buf2d_data,eax + + stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом + popad + ret +endp + +;создание буфера на основе изображения rgb +align 4 +proc buf_create_f_img, buf_struc:dword, rgb_data:dword + pushad + mov edi,dword[buf_struc] + mov ecx,buf2d_w + cmp ecx,1 + jl .error + mov ebx,buf2d_h + cmp ebx,1 + jl .error + imul ecx,ebx + cmp buf2d_bits,24 + jne @f + lea ecx,[ecx+ecx*2] ; 24 bit = 3 + @@: + cmp buf2d_bits,32 + jne @f + shl ecx,2 ; 32 bit = 4 + @@: + invoke mem.alloc,ecx + mov buf2d_data,eax + + cmp buf2d_bits,24 + jne @f + cld + mov esi,[rgb_data] + or esi,esi + jz @f + mov edi,eax ;eax=buf2d_data + rep movsb ;копируем биты изображения в буфер + jmp .end_create + @@: + stdcall buf_clear,edi,buf2d_color ;очистка буфера фоновым цветом + jmp .end_create + .error: + stdcall print_err,sz_buf2d_create_f_img,txt_err_size_0 + .end_create: + popad + ret +endp + +;функция для обрезания буферов 8 и 24 битных, по заданому цвету. +;параметр opt задается комбинацией констант: +; BUF2D_OPT_CROP_TOP - обрезка сверху +; BUF2D_OPT_CROP_LEFT - обрезка слева +; BUF2D_OPT_CROP_BOTTOM - обрезка снизу +; BUF2D_OPT_CROP_RIGHT - обрезка справа +align 4 +proc buf_crop_color, buf_struc:dword, color:dword, opt:dword +locals + crop_r dd ? +endl + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .24end_f + + bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM + jae .24no_crop_bottom + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov ecx,buf2d_h + cmp ecx,1 + jle .24no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель + mov ebx,buf2d_w + imul ecx,ebx + lea esi,[ecx+ecx*2] ;esi=3*ecx + add esi,buf2d_data + cld + @@: + sub esi,3 + cmp word[esi],ax + jne @f + cmp byte[esi+2],dl + jne @f + loop @b + @@: + lea ebx,[ebx+ebx*2] + xor edx,edx + mov eax,buf2d_h + imul eax,ebx + add eax,buf2d_data ;eax - указатель на конец буфера изображения + @@: + add esi,ebx + cmp esi,eax + jge @f + inc edx ;вычисляем число полных строк для обрезания + loop @b + @@: + cmp edx,0 + je .24no_crop_bottom + cmp edx,buf2d_h + jge .24no_crop_bottom ;что-бы не получить пустой буфер + sub buf2d_h,edx ;уменьшаем высоту буфера + mov ecx,buf2d_h + imul ecx,ebx ;ecx = новый размер изображения + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .24no_crop_bottom: + + bt dword[opt],BUF2D_BIT_OPT_CROP_TOP + jae .24no_crop_top + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov esi,buf2d_data + mov ecx,buf2d_h + cmp ecx,1 + jle .24no_crop_top ;проверяем на случай если высота буфера 1 пиксель + dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей + mov ebx,buf2d_w + imul ecx,ebx + cld + @@: + cmp word[esi],ax + jne @f + cmp byte[esi+2],dl + jne @f + add esi,3 + loop @b + @@: + lea ebx,[ebx+ebx*2] + xor edx,edx + @@: + sub esi,ebx + cmp esi,buf2d_data + jl @f + inc edx ;вычисляем число полных строк для обрезания + loop @b + @@: + cmp edx,0 + je .24no_crop_top + xor eax,eax + sub eax,edx + mov ebx,buf2d_h + sub ebx,edx + stdcall buf_offset_h, edi, eax, edx, ebx ;сдвигаем изображение в буфере вверх (eax<0) + sub buf2d_h,edx ;уменьшаем высоту буфера + mov ecx,buf2d_h + add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк + mov ebx,buf2d_w + imul ecx,ebx + lea ecx,[ecx+ecx*2] + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .24no_crop_top: + + bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT + jae .24no_crop_right + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov ebx,buf2d_w + cmp ebx,1 + jle .24no_crop_right ;на случай если ширина буфера 1 пиксель + lea ebx,[ebx+ebx*2] + mov esi,ebx + imul esi,buf2d_h + add esi,buf2d_data ;esi - указатель на конец буфера изображения + mov dword[crop_r],0 + cld + .24found_beg_right: + sub esi,3 ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp word[esi],ax + jne .24found_right + cmp byte[esi+2],dl + jne .24found_right + sub esi,ebx ;прыгаем на верхнюю строку + loop @b + inc dword[crop_r] + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jge .24found_right + + sub esi,3 ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + add esi,ebx ;прыгаем на нижнюю строку + cmp word[esi],ax + jne .24found_right + cmp byte[esi+2],dl + jne .24found_right + loop @b + inc dword[crop_r] + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jl .24found_beg_right + + .24found_right: + cmp dword[crop_r],0 + je .24no_crop_right + mov ecx,buf2d_w + sub ecx,dword[crop_r] + stdcall img_rgb_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + mov buf2d_w,ecx ;ставим новую ширину для буфера + mov ebx,buf2d_h + imul ecx,ebx + lea ecx,[ecx+ecx*2] + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .24no_crop_right: + + bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT + jae .24no_crop_left + mov eax,dword[color] + mov edx,eax ;ax = colors - r,g + shr edx,16 ;dl = color - b + mov ebx,buf2d_w + cmp ebx,1 + jle .24no_crop_left ;на случай если ширина буфера 1 пиксель + lea ebx,[ebx+ebx*2] + mov esi,buf2d_data ;esi - указатель на начоло буфера изображения + mov dword[crop_r],0 + cld + .24found_beg_left: + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp word[esi],ax + jne .24found_left + cmp byte[esi+2],dl + jne .24found_left + add esi,ebx ;прыгаем на нижнюю строку + loop @b + inc dword[crop_r] + add esi,3 ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jge .24found_left + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + sub esi,ebx ;прыгаем на верхнюю строку + cmp word[esi],ax + jne .24found_left + cmp byte[esi+2],dl + jne .24found_left + loop @b + inc dword[crop_r] + add esi,3 ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp dword[crop_r],ecx + jl .24found_beg_left + + .24found_left: + cmp dword[crop_r],0 + je .24no_crop_left + mov ecx,buf2d_w + sub ecx,dword[crop_r] + stdcall img_rgb_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + mov buf2d_w,ecx ;ставим новую ширину для буфера + mov ebx,buf2d_h + imul ecx,ebx + lea ecx,[ecx+ecx*2] + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + mov eax,dword[crop_r] + add buf2d_l,ax + .24no_crop_left: + + .24end_f: + + + cmp buf2d_bits,8 + jne .8end_f + + bt dword[opt],BUF2D_BIT_OPT_CROP_BOTTOM + jae .8no_crop_bottom + mov eax,dword[color] + mov esi,buf2d_data + mov ecx,buf2d_h + cmp ecx,1 + jle .8no_crop_bottom ;проверяем на случай если высота буфера 1 пиксель + mov ebx,buf2d_w + imul ecx,ebx + mov esi,ecx + add esi,buf2d_data + cld + @@: + dec esi + cmp byte[esi],al + jne @f + loop @b + @@: + xor edx,edx + mov eax,buf2d_h + imul eax,ebx + add eax,buf2d_data ;eax - указатель на конец буфера изображения + @@: + add esi,ebx + cmp esi,eax + jge @f + inc edx + loop @b + @@: + cmp edx,0 + je .8no_crop_bottom + cmp edx,buf2d_h + jge .8no_crop_bottom ;что-бы не получить пустой буфер + sub buf2d_h,edx ;уменьшаем высоту буфера + mov ecx,buf2d_h + imul ecx,ebx ;ecx = новый размер изображения + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .8no_crop_bottom: + + bt dword[opt],BUF2D_BIT_OPT_CROP_TOP + jae .8no_crop_top + mov eax,dword[color] + mov esi,buf2d_data + mov ecx,buf2d_h + cmp ecx,1 + jle .8no_crop_top ;проверяем на случай если высота буфера 1 пиксель + dec ecx ;при обрезании должна остаться минимум 1-на строка пикселей + mov ebx,buf2d_w + imul ecx,ebx + cld + @@: + cmp byte[esi],al + jne @f + inc esi + loop @b + @@: + xor edx,edx + @@: + sub esi,ebx + cmp esi,buf2d_data + jl @f + inc edx + loop @b + @@: + cmp edx,0 + je .8no_crop_top + xor eax,eax + sub eax,edx + mov ebx,buf2d_h + sub ebx,edx + stdcall buf_offset_h, edi, eax, edx, ebx + mov ecx,buf2d_h + sub ecx,edx + mov buf2d_h,ecx ;уменьшаем высоту буфера + add buf2d_t,dx ;сдвигаем отступ вниз, на число обрезанных строк + mov ebx,buf2d_w + imul ecx,ebx + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .8no_crop_top: + + bt dword[opt],BUF2D_BIT_OPT_CROP_RIGHT + jae .8no_crop_right + mov eax,dword[color] + mov ebx,buf2d_w + cmp ebx,1 + jle .8no_crop_right ;на случай если ширина буфера 1 пиксель + mov esi,ebx + imul esi,buf2d_h + add esi,buf2d_data ;esi - указатель на конец буфера изображения + xor edx,edx + cld + + .8found_beg: + dec esi ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp byte[esi],al + jne .8found + sub esi,ebx ;прыгаем на верхнюю строку + loop @b + inc edx + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jge .8found + + dec esi ;двигаемся на 1-ну колонку влево + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + add esi,ebx ;прыгаем на нижнюю строку + cmp byte[esi],al + jne .8found + loop @b + inc edx + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jl .8found_beg + + .8found: + cmp edx,0 + je .8no_crop_right + mov ecx,buf2d_w + sub ecx,edx + stdcall img_gray_crop_r, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + mov buf2d_w,ecx ;ставим новую ширину для буфера + mov ebx,buf2d_h + imul ecx,ebx + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + .8no_crop_right: + + bt dword[opt],BUF2D_BIT_OPT_CROP_LEFT + jae .8no_crop_left + mov eax,dword[color] + mov ebx,buf2d_w + cmp ebx,1 + jle .8no_crop_left ;на случай если ширина буфера 1 пиксель + mov esi,buf2d_data ;esi - указатель на начоло буфера изображения + mov edx,0 + cld + .8found_beg_left: + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + cmp word[esi],ax + jne .8found_left + add esi,ebx ;прыгаем на нижнюю строку + loop @b + inc edx + inc esi ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jge .8found_left + + mov ecx,buf2d_h ;восстановление ecx для нового цикла + @@: + sub esi,ebx ;прыгаем на верхнюю строку + cmp word[esi],ax + jne .8found_left + loop @b + inc edx + inc esi ;двигаемся на 1-ну колонку вправо + + mov ecx,buf2d_w + dec ecx ;1 колонка на запас + cmp edx,ecx + jl .8found_beg_left + + .8found_left: + cmp edx,0 + je .8no_crop_left + mov ecx,buf2d_w + sub ecx,edx + stdcall img_gray_crop_l, buf2d_data, buf2d_w, ecx, buf2d_h ;обрезаем буфер, по новому размеру + mov buf2d_w,ecx ;ставим новую ширину для буфера + mov ebx,buf2d_h + imul ecx,ebx + invoke mem.realloc,buf2d_data,ecx + mov buf2d_data,eax ;на случай если изменился указатель на данные + mov eax,edx + add buf2d_l,ax + .8no_crop_left: + + .8end_f: + + popad + ret +endp + +;обрезаем цветное изображение с правой стороны +;input: +;data_rgb - pointer to rgb data +;size_w_old - width img in pixels +;size_w_new - new width img in pixels +;size_h - height img in pixels +align 4 +proc img_rgb_crop_r, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword + pushad + mov eax, dword[size_w_old] + lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb) + mov ebx, dword[size_w_new] + lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb) + mov edx, dword[size_h] + mov edi, dword[data_rgb] ;edi - получает данные + mov esi, edi + add edi, ebx + add esi, eax + cld + @@: + dec edx ;уменьшаем счетчик оставшихся строк на 1 + cmp edx,0 + jle @f + mov ecx, ebx + rep movsb ;перенос (копирование) строки пикселей + add esi,eax ;переход на новую строчку изображения + sub esi,ebx + jmp @b + @@: + popad + ret +endp + +;обрезаем серое изображение с правой стороны +;input: +;data_gray - pointer to gray data +;size_w_old - width img in pixels +;size_w_new - new width img in pixels +;size_h - height img in pixels +align 4 +proc img_gray_crop_r, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword + pushad + mov eax, dword[size_w_old] + mov ebx, dword[size_w_new] + mov edx, dword[size_h] + mov edi, dword[data_gray] ;edi - получает данные + mov esi, edi + add edi, ebx + add esi, eax + cld + @@: + dec edx ;уменьшаем счетчик оставшихся строк на 1 + cmp edx,0 + jle @f + mov ecx, ebx + rep movsb ;перенос (копирование) строки пикселей + add esi,eax ;переход на новую строчку изображения + sub esi,ebx + jmp @b + @@: + popad + ret +endp + +;обрезаем цветное изображение с левой стороны +;input: +;data_rgb - pointer to rgb data +;size_w_old - width img in pixels +;size_w_new - new width img in pixels +;size_h - height img in pixels +align 4 +proc img_rgb_crop_l, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword + pushad + mov edi,dword[data_rgb] + mov esi,edi + mov eax,dword[size_w_old] + mov ebx,dword[size_w_new] + cmp eax,ebx + jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) + lea eax,[eax+eax*2] + lea ebx,[ebx+ebx*2] + sub eax,ebx + mov edx,dword[size_h] ;высота изображения + cld + @@: + add esi,eax + mov ecx,ebx + rep movsb + dec edx + cmp edx,0 + jg @b + .end_f: + popad + ret +endp + +;обрезаем серое изображение с левой стороны +;input: +;data_gray - pointer to gray data +;size_w_old - width img in pixels +;size_w_new - new width img in pixels +;size_h - height img in pixels +align 4 +proc img_gray_crop_l, data_gray:dword, size_w_old:dword, size_w_new:dword, size_h:dword + pushad + mov edi,dword[data_gray] + mov esi,edi + mov eax,dword[size_w_old] + mov ebx,dword[size_w_new] + cmp eax,ebx + jle .end_f ;старый размер изображения не может быть меньше нового (при условии обрезания картинки) + sub eax,ebx + mov edx,dword[size_h] ;высота изображения + cld + @@: + add esi,eax + mov ecx,ebx + rep movsb + dec edx + cmp edx,0 + jg @b + .end_f: + popad + ret +endp + +;hoffs - колличество пикселей на котрые поднимается/опускается изображение +;img_t - высота, с которой начинается двигающаяся часть изображения +align 4 +proc buf_offset_h, buf_struc:dword, hoffs:dword, img_t:dword, img_h:dword ;сдвигает изображение по высоте + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .end_move_24 + + mov eax,[hoffs] + cmp eax,0 + je .end_move_24 + mov ebx,buf2d_w + mov edx,dword[img_t] + mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных + cmp ecx,buf2d_h + jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения + imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных + lea ecx,[ecx+ecx*2] + imul ebx,edx + lea ebx,[ebx+ebx*2] + mov esi,buf2d_data + add esi,ebx + + add edx,eax ;edx = img_t+hoffs (hoffs<0) + mov ebx,buf2d_w + imul ebx,edx + lea ebx,[ebx+ebx*2] + mov edi,buf2d_data ;позиция, куда будет двигаться изображение + add edi,ebx + + cmp eax,0 + jg .move_down_24 + ;двигаем изображение вверх + cld + rep movsb + jmp .end_f + .move_down_24: + ;двигаем изображение вниз + add esi,ecx + dec esi + add edi,ecx + dec edi + std + rep movsb + jmp .end_f + .end_move_24: + +;stdcall print_err,sz_buf2d_offset_h,txt_err_n24b + + cmp buf2d_bits,8 + jne .end_move_8 + + mov eax,[hoffs] + cmp eax,0 + je .end_move_8 + ;двигаем изображение вверх + mov ebx,buf2d_w + mov edx,dword[img_t] + mov ecx,dword[img_h] ;ecx - высота сдвигаемых данных + cmp ecx,buf2d_h + jge .end_f ;ошибочное условие, высота изображения меньше чем высота сдвигаемого изображения + imul ecx,ebx ;ecx - колличество пикселей в сдвигаемых данных + imul ebx,edx + mov esi,buf2d_data + add esi,ebx + + add edx,eax ;edx = img_t+hoffs (hoffs<0) + mov ebx,buf2d_w + imul ebx,edx + mov edi,buf2d_data ;позиция, куда будет двигаться изображение + add edi,ebx + + cmp eax,0 + jg .move_down_8 + cld + rep movsb + jmp .end_f + .move_down_8: + ;двигаем изображение вниз + add esi,ecx + dec esi + add edi,ecx + dec edi + std + rep movsb + jmp .end_f + .end_move_8: + + .end_f: + popad + ret +endp + +align 4 +proc buf_delete, buf_struc:dword + push eax edi + mov edi,dword[buf_struc] + invoke mem.free,buf2d_data + pop edi eax + ret +endp + +;input: +; new_w - новая ширина (если 0 то не меняется) +; new_h - новая высота (если 0 то не меняется) +; options - параметры изменения буфера (1 - изменять размер буфера, +; 2 - изменять изображение в буфере, 3 - изменять буфер и изображение) +align 4 +proc buf_resize, buf_struc:dword, new_w:dword, new_h:dword, options:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,8 + jne .8bit + bt dword[options],1 ;сжатие изобр. + jnc @f + ;... + @@: + bt dword[options],0 ;измен. буфер + jnc .end_f + ;... + jmp .end_f + .8bit: + cmp buf2d_bits,24 + jne .24bit + bt dword[options],1 ;сжатие изобр. + jnc .24_end_r + mov eax,dword[new_w] + cmp eax,1 + jl @f + cmp eax,buf2d_w + jge @f + ;сжатие по ширине + stdcall img_rgb24_wresize, buf2d_data,buf2d_w,buf2d_h,eax + jmp .24_r_h + @@: + mov eax,buf2d_w + .24_r_h: ;eax - ширина буфера или ширина сжатого изображения + mov ebx,dword[new_h] + cmp ebx,1 + jl @f + cmp ebx,buf2d_h + jge @f + ;сжатие по высоте + stdcall img_rgb24_hresize, buf2d_data,eax,buf2d_h,ebx + @@: + .24_end_r: + bt dword[options],0 ;измен. буфер + jnc .end_f + mov eax,dword[new_w] + cmp eax,1 + jl @f + mov buf2d_w,eax + @@: + mov ecx,buf2d_w + mov eax,dword[new_h] + cmp eax,1 + jl @f + mov buf2d_h,eax + @@: + mov ebx,buf2d_h + imul ecx,ebx + lea ecx,[ecx+ecx*2] ; 24 bit = 3 + invoke mem.realloc,buf2d_data,ecx ;изменяем память занимаемую буфером + mov buf2d_data,eax ;на случай если изменился указатель на данные + .24bit: + .end_f: + popad + ret +endp + +align 4 +rot_table: ;таблица для указания на подфункции для поворотов + dd buf_rotate.8b90,buf_rotate.24b90,buf_rotate.32b90,\ + buf_rotate.8b180,buf_rotate.24b180,buf_rotate.32b180 + +;поворот изображения на 90 или 180 градусов +align 4 +proc buf_rotate, buf_struc:dword, angle:dword +locals + n_data dd ? + dec_h dd ? ;число байт, для уменьшения координаты y +endl + pushad + mov edi,[buf_struc] + mov ebx,buf2d_w + mov ecx,buf2d_h + + lea eax,[rot_table] + cmp dword[angle],90 ;проверка угла поворота + je .beg_0 + cmp dword[angle],180 + jne @f + add eax,12 + jmp .beg_0 + @@: + jmp .end_f + .beg_0: ;проверка битности буфера + cmp buf2d_bits,8 + jne @f + jmp dword[eax] + @@: + cmp buf2d_bits,24 + jne @f + add eax,4 + jmp dword[eax] + @@: + cmp buf2d_bits,32 + jne @f + add eax,8 + jmp dword[eax] + @@: + jmp .end_f + + .8b90: ;поворот 8 битного буфера на 90 градусов + mov edx,ecx ;edx - buf_h + imul ecx,ebx + invoke mem.alloc,ecx ;выделяем временную память + cmp eax,0 + je .end_f + mov [n_data],eax + mov [dec_h],ecx + inc dword[dec_h] + + ;copy buf --> mem + mov edi,[buf_struc] + mov esi,buf2d_data + mov edi,eax ;[n_data] + dec edx ;коректируем edx на 1 байт, для компенсации сдвига в movsb + add edi,edx + xor eax,eax + cld + .cycle_0: + movsb + add edi,edx + inc eax + cmp eax,ebx + jl @f + xor eax,eax + sub edi,[dec_h] + @@: + loop .cycle_0 + + ;change buf_w <---> buf_h + mov esi,[n_data] + mov edi,[buf_struc] + mov edi,buf2d_data + mov ecx,ebx + inc edx ;исправляем скоректированный edx + imul ecx,edx + ;copy buf <-- mem + ;cld + rep movsb + invoke mem.free,[n_data] + jmp .change_w_h + .24b90: ;поворот 24 битного буфера на 90 градусов + mov esi,ecx + imul esi,ebx + lea ecx,[ecx+ecx*2] + mov edx,ecx ;edx - buf_h * 3 + imul ecx,ebx + invoke mem.alloc,ecx ;выделяем временную память + cmp eax,0 + je .end_f + mov [n_data],eax + mov [dec_h],ecx + add dword[dec_h],3 + + ;copy buf --> mem + + mov edi,[buf_struc] + mov ecx,esi + mov esi,buf2d_data + mov edi,eax ;[n_data] + sub edx,3 ;коректируем edx на 3 байта, для компенсации сдвига + add edi,edx + xor eax,eax + cld + .cycle_1: + movsw + movsb + add edi,edx + inc eax + cmp eax,ebx + jl @f + xor eax,eax + sub edi,[dec_h] + @@: + loop .cycle_1 + + ;copy buf <-- mem + mov esi,[n_data] + mov edi,[buf_struc] + mov edi,buf2d_data + mov ecx,ebx + add edx,3 ;исправляем скоректированный edx + imul ecx,edx + ;cld + rep movsb + invoke mem.free,[n_data] + jmp .change_w_h + .32b90: ;поворот 32 битного буфера на 90 градусов + shl ecx,2 + mov edx,ecx ;edx - buf_h * 4 + imul ecx,ebx + invoke mem.alloc,ecx ;выделяем временную память + cmp eax,0 + je .end_f + mov [n_data],eax + mov [dec_h],ecx + add dword[dec_h],4 + + ;copy buf --> mem + mov edi,[buf_struc] + shr ecx,2 + mov esi,buf2d_data + mov edi,eax ;[n_data] + sub edx,4 ;коректируем edx на 4 байта, для компенсации сдвига в movsd + add edi,edx + xor eax,eax + cld + .cycle_2: + movsd + add edi,edx + inc eax + cmp eax,ebx + jl @f + xor eax,eax + sub edi,[dec_h] + @@: + loop .cycle_2 + + ;copy buf <-- mem + mov esi,[n_data] + mov edi,[buf_struc] + mov edi,buf2d_data + mov ecx,ebx + add edx,4 ;исправляем скоректированный edx + imul ecx,edx + shr ecx,2 + ;cld + rep movsd + invoke mem.free,[n_data] + ;jmp .change_w_h + .change_w_h: ;change buf_w <---> buf_h + mov edi,[buf_struc] + mov eax,buf2d_w + mov ebx,buf2d_h + mov buf2d_h,eax + mov buf2d_w,ebx + jmp .end_f + .8b180: ;поворот 8 битного буфера на 180 градусов + mov edi,buf2d_data + mov esi,edi + imul ecx,ebx + add esi,ecx + dec esi + shr ecx,1 ;ecx - число пикселей буфера : 2 + std + @@: + lodsb + mov ah,byte[edi] + mov byte[esi+1],ah + mov byte[edi],al + inc edi + loop @b + jmp .end_f + .24b180: ;поворот 24 битного буфера на 180 градусов + mov esi,buf2d_data + mov edi,esi + imul ecx,ebx + mov eax,ecx + lea ecx,[ecx+ecx*2] + add edi,ecx + sub edi,3 + shr eax,1 + mov ecx,eax ;ecx - число пикселей буфера : 2 + cld + @@: + lodsw + mov edx,eax + lodsb + mov bx,word[edi] + mov word[esi-3],bx + mov bl,byte[edi+2] + mov byte[esi-1],bl + mov byte[edi+2],al + mov word[edi],dx + sub edi,3 + loop @b + jmp .end_f + .32b180: ;поворот 32 битного буфера на 180 градусов + mov edi,buf2d_data + mov esi,edi + imul ecx,ebx + shl ecx,2 + add esi,ecx + sub esi,4 + shr ecx,3 ;ecx - число пикселей буфера : 2 + std + @@: + lodsd + mov ebx,dword[edi] + mov dword[esi+4],ebx + mov dword[edi],eax + add edi,4 + loop @b + ;jmp .end_f + + .end_f: + popad + ret +endp + +align 4 +proc buf_flip_h, buf_struc:dword +pushad + mov edi,[buf_struc] + cmp buf2d_bits,24 + jne .end_24 + mov esi,buf2d_data + mov eax,buf2d_w + mov ecx,eax + shr ecx,1 + dec eax + lea eax,[eax+eax*2] + mov ebx,buf2d_h + mov edi,esi + add esi,eax + add eax,3 + cld + .cycle_24: + push ecx edi esi +align 4 + @@: + ;swap word[edi] <-> word[esi] + mov dx,[edi] + movsw + mov [esi-2],dx + ;swap byte[edi] <-> byte[esi] + mov dl,[edi] + movsb + mov [esi-1],dl + sub esi,6 + loop @b + pop esi edi ecx + add edi,eax + add esi,eax + dec ebx + or ebx,ebx + jnz .cycle_24 + jmp .end_32 + .end_24: + cmp buf2d_bits,32 + jne .end_32 + mov esi,buf2d_data + mov eax,buf2d_w + dec eax + shl eax,2 + mov ebx,buf2d_h + mov edi,esi + add esi,eax + add eax,4 + cld + .cycle_32: + mov ecx,eax + shr ecx,3 + push edi esi +align 4 + @@: + ;swap dword[edi] <-> dword[esi] + mov edx,[edi] + movsd + mov [esi-4],edx + sub esi,8 + loop @b + pop esi edi + add edi,eax + add esi,eax + dec ebx + or ebx,ebx + jnz .cycle_32 + .end_32: +popad + ret +endp + +;отразить по вертикали (верх и низ меняются местами) +align 4 +proc buf_flip_v, buf_struc:dword +locals + line_pix dd ? ;кол. пикселей в линии буфера + line_2byte dd ? ;кол. байт в линии буфера * 2 +endl + pushad + mov edi,[buf_struc] + cmp buf2d_bits,24 + jne .end_24 + mov edx,buf2d_w + mov [line_pix],edx + mov ebx,buf2d_h + lea edx,[edx+edx*2] + mov esi,edx + imul esi,ebx + sub esi,edx + add esi,buf2d_data ;указатель на нижнюю линию + shr ebx,1 ;кол. линейных циклов + shl edx,1 + mov [line_2byte],edx + mov edi,buf2d_data + xchg edi,esi + cld + .flip_24: + cmp ebx,0 + jle .end_32 ;здесь выход из функции (потому .end_24 не подходит) + mov ecx,[line_pix] +align 4 + @@: + lodsw + mov dx,word[edi] + mov word[esi-2],dx + stosw + lodsb + mov ah,byte[edi] + mov byte[esi-1],ah + stosb + loop @b + sub edi,[line_2byte] + dec ebx + jmp .flip_24 + .end_24: + cmp buf2d_bits,32 + jne .end_32 + mov edx,buf2d_w + mov [line_pix],edx + mov ebx,buf2d_h + shl edx,2 + mov esi,edx + imul esi,ebx + sub esi,edx + add esi,buf2d_data ;указатель на нижнюю линию + shr ebx,1 ;кол. линейных циклов + shl edx,1 + mov [line_2byte],edx + mov edi,buf2d_data + xchg edi,esi + cld + .flip_32: + cmp ebx,0 + jle .end_32 + mov ecx,[line_pix] +align 4 + @@: + lodsd + mov edx,dword[edi] + mov dword[esi-4],edx + stosd + loop @b + sub edi,[line_2byte] + dec ebx + jmp .flip_32 + .end_32: + popad + ret +endp + +;description: +; сжатие изображения по ширине в 2 раза (размеры буфера не меняются) +align 4 +proc buf_img_wdiv2, buf_struc:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,8 + jne @f + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + stdcall img_8b_wdiv2, buf2d_data,ecx + @@: + cmp buf2d_bits,24 + jne @f + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + stdcall img_rgb24_wdiv2, buf2d_data,ecx + @@: + cmp buf2d_bits,32 + jne @f + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + stdcall img_rgba32_wdiv2, buf2d_data,ecx + @@: + popad + ret +endp + +;input: +;data_8b - pointer to rgb data +;size - count img pixels (size img data / 3(rgb) ) +align 4 +proc img_8b_wdiv2 data_8b:dword, size:dword + mov eax,dword[data_8b] + mov ecx,dword[size] ;ecx = size + cld + @@: ;затемнение цвета пикселей + shr byte[eax],1 + inc eax + loop @b + + mov eax,dword[data_8b] + mov ecx,dword[size] ;ecx = size + shr ecx,1 + @@: ;сложение цветов пикселей + mov bl,byte[eax+1] ;копируем цвет соседнего пикселя + add byte[eax],bl + add eax,2 + loop @b + + mov eax,dword[data_8b] + inc eax + mov ebx,eax + inc ebx + mov ecx,dword[size] ;ecx = size + shr ecx,1 + dec ecx ;лишний пиксель + @@: ;поджатие пикселей + mov dl,byte[ebx] + mov byte[eax],dl + + inc eax + add ebx,2 + loop @b + ret +endp + +;input: +;data_rgb - pointer to rgb data +;size - count img pixels (size img data / 3(rgb) ) +align 4 +proc img_rgb24_wdiv2 data_rgb:dword, size:dword + mov eax,dword[data_rgb] + mov ecx,dword[size] ;ecx = size + lea ecx,[ecx+ecx*2] + cld + @@: ;затемнение цвета пикселей + shr byte[eax],1 + inc eax + loop @b + + mov eax,dword[data_rgb] + mov ecx,dword[size] ;ecx = size + shr ecx,1 + @@: ;сложение цветов пикселей + mov bx,word[eax+3] ;копируем цвет соседнего пикселя + add word[eax],bx + mov bl,byte[eax+5] ;копируем цвет соседнего пикселя + add byte[eax+2],bl + add eax,6 ;=2*3 + loop @b + + mov eax,dword[data_rgb] + add eax,3 + mov ebx,eax + add ebx,3 + mov ecx,dword[size] ;ecx = size + shr ecx,1 + dec ecx ;лишний пиксель + @@: ;поджатие пикселей + mov edx,dword[ebx] + mov word[eax],dx + shr edx,16 + mov byte[eax+2],dl + + add eax,3 + add ebx,6 + loop @b + ret +endp + +;input: +;data_rgba - pointer to rgba data +;size - count img pixels (size img data / 4(rgba) ) +align 4 +proc img_rgba32_wdiv2 data_rgba:dword, size:dword + mov eax,dword[data_rgba] + + mov eax,dword[data_rgba] + mov ebx,eax + add ebx,4 + mov ecx,dword[size] ;ecx = size + shr ecx,1 + @@: ;смешивание цветов пикселей + call combine_colors_1 + mov [eax],edx + add eax,8 ;=2*4 + add ebx,8 + loop @b + + mov eax,dword[data_rgba] + add eax,4 + mov ebx,eax + add ebx,4 + mov ecx,dword[size] ;ecx = size + shr ecx,1 + dec ecx ;лишний пиксель + @@: ;поджатие пикселей + mov edx,dword[ebx] + mov dword[eax],edx + + add eax,4 + add ebx,8 + loop @b + ret +endp + +;description: +; сжатие изображения по высоте в 2 раза (высота буфера не меняется) +align 4 +proc buf_img_hdiv2, buf_struc:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,8 + jne @f + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + stdcall img_8b_hdiv2, buf2d_data,ecx,eax + jmp .end_f ;edi портится в функции, потому использование buf2d_bits опасно + @@: + cmp buf2d_bits,24 + jne @f + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + stdcall img_rgb24_hdiv2, buf2d_data,ecx,eax + jmp .end_f + @@: + cmp buf2d_bits,32 + jne @f + mov eax,buf2d_w + mov ecx,buf2d_h + imul ecx,eax + shl eax,2 + stdcall img_rgba32_hdiv2, buf2d_data,ecx,eax + ;jmp .end_f + @@: + .end_f: + popad + ret +endp + +;input: +;data_8b - pointer to 8 bit data +;size - count img pixels (size img data) +;size_w - width img in pixels +align 4 +proc img_8b_hdiv2, data_8b:dword, size:dword, size_w:dword + + mov eax,dword[data_8b] ;eax = + mov ecx,dword[size] + cld + @@: ;затемнение цвета пикселей + shr byte[eax],1 + inc eax + loop @b + + mov eax,dword[data_8b] ;eax = + mov esi,dword[size_w] + mov ebx,esi + add ebx,eax + mov ecx,dword[size] ;ecx = size + shr ecx,1 + xor edi,edi + @@: ;сложение цветов пикселей + mov dl,byte[ebx] ;копируем цвет нижнего пикселя + add byte[eax],dl + + inc eax + inc ebx + inc edi + cmp edi,dword[size_w] + jl .old_line + add eax,esi + add ebx,esi + xor edi,edi + .old_line: + loop @b + + + mov eax,dword[data_8b] ;eax = + add eax,esi ;esi = width*3(rgb) + mov ebx,eax + add ebx,esi + mov ecx,dword[size] ;ecx = size + shr ecx,1 + sub ecx,dword[size_w] ;лишняя строка пикселей + xor edi,edi + @@: ;поджатие пикселей + mov dl,byte[ebx] ;копируем цвет нижнего пикселя + mov byte[eax],dl + + inc eax + inc ebx + inc edi + cmp edi,dword[size_w] + jl .old_line_2 + add ebx,esi + xor edi,edi + .old_line_2: + loop @b + ret +endp + +;input: +;data_rgb - pointer to rgb data +;size - count img pixels (size img data / 3(rgb) ) +;size_w - width img in pixels +align 4 +proc img_rgb24_hdiv2, data_rgb:dword, size:dword, size_w:dword + + mov eax,dword[data_rgb] ;eax = + mov ecx,dword[size] ;ecx = size + lea ecx,[ecx+ecx*2] + cld + @@: ;затемнение цвета пикселей + shr byte[eax],1 + inc eax + loop @b + + mov eax,dword[data_rgb] ;eax = + mov esi,dword[size_w] + lea esi,[esi+esi*2] ;esi = width*3(rgb) + mov ebx,esi + add ebx,eax + mov ecx,dword[size] ;ecx = size + shr ecx,1 + xor edi,edi + @@: ;сложение цветов пикселей + mov dx,word[ebx] ;копируем цвет нижнего пикселя + add word[eax],dx + mov dl,byte[ebx+2] ;копируем цвет нижнего пикселя + add byte[eax+2],dl + + add eax,3 + add ebx,3 + inc edi + cmp edi,dword[size_w] + jl .old_line + add eax,esi + add ebx,esi + xor edi,edi + .old_line: + loop @b + + mov eax,dword[data_rgb] ;eax = + add eax,esi ;esi = width*3(rgb) + mov ebx,eax + add ebx,esi + mov ecx,dword[size] ;ecx = size + shr ecx,1 + sub ecx,dword[size_w] ;лишняя строка пикселей + xor edi,edi + @@: ;поджатие пикселей + mov edx,dword[ebx] ;копируем цвет нижнего пикселя + mov word[eax],dx + shr edx,16 + mov byte[eax+2],dl + + add eax,3 + add ebx,3 + inc edi + cmp edi,dword[size_w] + jl .old_line_2 + add ebx,esi + xor edi,edi + .old_line_2: + loop @b + ret +endp + +;input: +;data_rgba - pointer to rgba data +;size - count img pixels (size img data / 4(rgba) ) +;size_w_b - width img in bytes +align 4 +proc img_rgba32_hdiv2, data_rgba:dword, size:dword, size_w_b:dword + + mov eax,dword[data_rgba] ;eax = + mov ebx,dword[size_w_b] + add ebx,eax + mov ecx,dword[size] ;ecx = size + shr ecx,1 + xor edi,edi + @@: ;смешивание цветов пикселей + call combine_colors_1 + mov dword[eax],edx + + add eax,4 + add ebx,4 + add edi,4 + cmp edi,dword[size_w_b] + jl .old_line + add eax,dword[size_w_b] + add ebx,dword[size_w_b] + xor edi,edi + .old_line: + loop @b + + mov eax,dword[data_rgba] ;eax = + mov ebx,dword[size_w_b] + add eax,ebx + add ebx,eax + mov ecx,dword[size] ;ecx = size + shl ecx,1 + sub ecx,dword[size_w_b] ;лишняя строка пикселей + shr ecx,2 + xor edi,edi + @@: ;поджатие пикселей + mov edx,dword[ebx] ;копируем цвет нижнего пикселя + mov dword[eax],edx + + add eax,4 + add ebx,4 + add edi,4 + cmp edi,dword[size_w_b] + jl .old_line_2 + add ebx,dword[size_w_b] + xor edi,edi + .old_line_2: + loop @b + ret +endp + +;input: +; eax - указатель на 32-битный цвет +; ebx - указатель на 32-битный цвет +;output: +; edx - 32-битный цвет смешанный с учетом прозрачности +;destroy: +; esi +align 4 +proc combine_colors_1 uses ecx edi +locals + c_blye dd ? + c_green dd ? + c_red dd ? +endl + movzx edi,byte[eax+3] + cmp edi,255 + je .c0z + movzx esi,byte[ebx+3] + cmp esi,255 + je .c1z + cmp edi,esi + je .c0_c1 + + ;переворачиваем значения прозрачностей + neg edi + add edi,256 + neg esi + add esi,256 + + movzx ecx,byte[eax] + imul ecx,edi + mov [c_blye],ecx + movzx ecx,byte[ebx] + imul ecx,esi + add [c_blye],ecx + + movzx ecx,byte[eax+1] + imul ecx,edi + mov [c_green],ecx + movzx ecx,byte[ebx+1] + imul ecx,esi + add [c_green],ecx + + movzx ecx,byte[eax+2] + imul ecx,edi + mov [c_red],ecx + movzx ecx,byte[ebx+2] + imul ecx,esi + add [c_red],ecx + +push eax ebx + xor ebx,ebx + mov eax,[c_red] + xor edx,edx + mov ecx,edi + add ecx,esi + div ecx + mov bl,al + shl ebx,16 + mov eax,[c_green] + xor edx,edx + div ecx + mov bh,al + mov eax,[c_blye] + xor edx,edx + div ecx + mov bl,al + + shr ecx,1 + ;переворачиваем значения прозрачности + neg ecx + add ecx,256 + + shl ecx,24 + add ebx,ecx + mov edx,ebx +pop ebx eax + + jmp .end_f + .c0_c1: ;если прозрачности обоих цветов совпадают + mov edx,[eax] + shr edx,1 + and edx,011111110111111101111111b + mov esi,[ebx] + shr esi,1 + and esi,011111110111111101111111b + add edx,esi + ror edi,8 ;перемещаем значение прозрачности в старший байт edi + or edx,edi + jmp .end_f + .c0z: ;если цвет в eax прозрачный + mov edx,[ebx] + movzx edi,byte[ebx+3] + jmp @f + .c1z: ;если цвет в ebx прозрачный + mov edx,[eax] + @@: + add edi,255 ;делаем цвет на половину прозрачным + shr edi,1 + cmp edi,255 + jle @f + mov edi,255 ;максимальная прозрачность не более 255 + @@: + shl edi,24 + and edx,0xffffff ;снимаем старую прозрачность + add edx,edi + .end_f: + ret +endp + +;description: +; сжатие изображения по ширине (размеры буфера не меняются) +;input: +; data_rgb - pointer to rgb data +; size_w - width img in pixels +; size_h - height img in pixels +; size_w_new - new width img in pixels +align 16 +proc img_rgb24_wresize, data_rgb:dword, size_w:dword, size_h:dword, size_w_new:dword +locals + pr dd 0 + pg dd 0 + pb dd 0 + img_n dd ? ;указатель на данные нового изображения + lines dd ? +endl +pushad +;eax - delta for inp. img +;ebx - delta for outp. img +;esi - pointer to data_rgb + mov esi,[data_rgb] + mov [img_n],esi + mov eax,[size_h] + mov [lines],eax +align 4 + .cycyle_0: + mov eax,[size_w_new] + mov ecx,[size_w] + mov ebx,ecx +align 4 + .cycyle_1: + cmp eax,ebx + jg .else_0 + ;копируемый пиксель максимально влияет на результат + ;накапливаем rgb для интерполяции пикселей + mov edx,[size_w_new] + movzx edi,byte[esi] + imul edi,edx + add [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + add [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + add [pr],edi + cmp eax,ebx + je .d2_add + jmp .if_0_end + .else_0: + ;копируемый пиксель попадет на границу пикселей + mov edx,ebx + sub edx,eax + add edx,[size_w_new] + movzx edi,byte[esi] + imul edi,edx + add [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + add [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + add [pr],edi + ;сохраняем готовое rgb + .d2_add: + push eax + mov edi,[img_n] + mov eax,[pb] + xor edx,edx + div dword[size_w] ;eax /= [size_w] + stosb + mov eax,[pg] + xor edx,edx + div dword[size_w] ;eax /= [size_w] + stosb + mov eax,[pr] + xor edx,edx + div dword[size_w] ;eax /= [size_w] + stosb + pop eax + add dword[img_n],3 ;next pixel + ;обновляем rgb для нового пикселя + mov edx,eax + sub edx,ebx + movzx edi,byte[esi] + imul edi,edx + mov [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + mov [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + mov [pr],edi + add ebx,[size_w] + .if_0_end: + add eax,[size_w_new] + add esi,3 ;next pixel + dec ecx + jnz .cycyle_1 + dec dword[lines] + jnz .cycyle_0 +popad + ret +endp + +;description: +; сжатие изображения по высоте (размеры буфера не меняются) +;input: +; data_rgb - pointer to rgb data +; size_w - width img in pixels +; size_h - height img in pixels +; size_h_new - new height img in pixels +align 16 +proc img_rgb24_hresize, data_rgb:dword, size_w:dword, size_h:dword, size_h_new:dword +locals + pr dd 0 + pg dd 0 + pb dd 0 + img_n dd ? ;указатель на данные нового изображения + cols dd ? + lin_b dd ? ;размер линии изображения в байтах + data_n dd ? ;указатель на данные для нового столбца пикселей +endl +pushad +;eax - delta for inp. img +;ebx - delta for outp. img +;esi - pointer to data_rgb + mov esi,[data_rgb] + mov [data_n],esi + mov eax,[size_w] + mov [cols],eax + lea eax,[eax+eax*2] + mov [lin_b],eax +align 4 + .cycyle_0: + mov eax,[size_h_new] + mov ecx,[size_h] + mov ebx,ecx + mov esi,[data_n] + mov [img_n],esi + add dword[data_n],3 ;переход на следующий столбец пикселей +align 4 + .cycyle_1: + cmp eax,ebx + jg .else_0 + ;копируемый пиксель максимально влияет на результат + ;накапливаем rgb для интерполяции пикселей + mov edx,[size_h_new] + movzx edi,byte[esi] + imul edi,edx + add [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + add [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + add [pr],edi + cmp eax,ebx + je .d2_add + jmp .if_0_end + .else_0: + ;копируемый пиксель попадет на границу пикселей + mov edx,ebx + sub edx,eax + add edx,[size_h_new] + movzx edi,byte[esi] + imul edi,edx + add [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + add [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + add [pr],edi + ;сохраняем готовое rgb + .d2_add: + push eax + mov edi,[img_n] + mov eax,[pb] + xor edx,edx + div dword[size_h] ;eax /= [size_h] + stosb + mov eax,[pg] + xor edx,edx + div dword[size_h] ;eax /= [size_h] + stosb + mov eax,[pr] + xor edx,edx + div dword[size_h] ;eax /= [size_h] + stosb + pop eax + mov edx,[lin_b] + add dword[img_n],edx ;next pixel + ;обновляем rgb для нового пикселя + mov edx,eax + sub edx,ebx + movzx edi,byte[esi] + imul edi,edx + mov [pb],edi + movzx edi,byte[esi+1] + imul edi,edx + mov [pg],edi + movzx edi,byte[esi+2] + imul edi,edx + mov [pr],edi + add ebx,[size_h] + .if_0_end: + add eax,[size_h_new] + add esi,[lin_b] ;next pixel + dec ecx + jnz .cycyle_1 + dec dword[cols] + jnz .cycyle_0 +popad + ret +endp + +;преобразование буфера из 24-битного в 8-битный +; spectr - определяет какой спектр брать при преобразовании 0-синий, 1-зеленый, 2-красный +align 4 +proc buf_conv_24_to_8, buf_struc:dword, spectr:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .error0 + mov eax,buf2d_w + cmp eax,1 + jl .error1 + mov ecx,buf2d_h + cmp ecx,1 + jl .error1 + imul ecx,eax + mov esi,ecx + ;ebx - память из которой копируется + ;edx - память куда копируется + mov edx,buf2d_data + mov ebx,edx + cmp [spectr],3 + jge @f + add ebx,[spectr] + @@: + mov al,byte[ebx] + mov byte[edx],al + add ebx,3 + inc edx + loop @b + mov buf2d_bits,8 + invoke mem.realloc,buf2d_data,esi ;уменьшаем память занимаемую буфером + jmp .end_conv + .error0: + stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_n24b + jmp .end_conv + .error1: + stdcall print_err,sz_buf2d_conv_24_to_8,txt_err_size_0 + .end_conv: + popad + ret +endp + +;преобразование буфера из 24-битного в 32-битный +align 4 +proc buf_conv_24_to_32, buf_struc:dword, buf_str8:dword + pushad + mov edi,dword[buf_struc] + cmp buf2d_bits,24 + jne .error1 + mov ecx,buf2d_w + mov ebx,buf2d_h + imul ebx,ecx + mov ecx,ebx ;ecx = size 8 b + shl ebx,2 ;ebx = size 32 b + invoke mem.realloc,buf2d_data,ebx ;увеличиваем память занимаемую буфером + mov buf2d_data,eax ;на случай если изменился указатель на данные + mov buf2d_bits,32 + mov edx,ebx ;edx = size 32 b + sub ebx,ecx ;ebx = size 24 b + mov eax,ecx + ;eax - размер 8 битных данных + ;ebx - размер 24 битных данных + ;edx - размер 32 битных данных + add ebx,buf2d_data + add edx,buf2d_data + mov edi,dword[buf_str8] + cmp buf2d_bits,8 + jne .error2 + add eax,buf2d_data + mov edi,edx + ;eax - указатель на конец 8 битных данных + ;ebx - указатель на конец 24 битных данных + ;edi - указатель на конец 32 битных данных + @@: + sub edi,4 ;отнимаем в начале цикла, + sub ebx,3 ; потому, что указатели стоят + dec eax ; за пределами буферов + mov edx,dword[ebx] + mov dword[edi],edx + mov dl,byte[eax] + mov byte[edi+3],dl + loop @b + + jmp .end_conv + .error1: + stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n24b + jmp .end_conv + .error2: + stdcall print_err,sz_buf2d_conv_24_to_32,txt_err_n8b + .end_conv: + popad + ret +endp + +;функция копирует изображение из буфера buf_source (24b|32b) в buf_destination (24b) +; указываются координаты вставки буфера buf_source относительно buf_destination +; прозрачность при копировании не учитывается +align 4 +proc buf_bit_blt, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword + locals + lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер) + endl + pushad + + mov edi,[buf_source] + cmp buf2d_bits,24 + je .sou24 + cmp buf2d_bits,32 + je .sou32 + jmp .copy_end ;формат буфера не поодерживается + + .sou24: ;в источнике 24 битная картинка + mov eax,buf2d_w + mov edx,buf2d_h ;высота копируемой картинки + mov esi,buf2d_data ;данные копируемой картинки + + mov edi,[buf_destination] + cmp buf2d_bits,24 + jne .copy_end ;формат буфера не поодерживается + mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки) + cmp ebx,buf2d_w ;проверяем влазит ли изображение по ширине + jge .copy_end ;если изображение полностью вылазит за правую сторону + mov ebx,buf2d_h ;ebx - высота основного буфера + mov ecx,[coord_y] + cmp ecx,0 + jge @f + ;если координата coord_y<0 (1-я настройка) + add edx,ecx ;уменьшаем высоту копируемой картинки + cmp edx,0 + jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) + neg ecx + imul ecx,eax + lea ecx,[ecx+ecx*2] ;по 3 байта на пиксель + add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части + xor ecx,ecx ;обнуляем координату coord_y + @@: + cmp ecx,ebx + jge .copy_end ;если координата 'y' больше высоты буфера + add ecx,edx ;ecx - нижняя координата копируемой картинки + cmp ecx,ebx + jle @f + sub ecx,ebx + sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу + @@: + mov ebx,buf2d_w + mov ecx,[coord_y] ;ecx используем для временных целей + cmp ecx,0 + jg .end_otr_c_y_24 + ;если координата coord_y<=0 (2-я настройка) + mov ecx,[coord_x] + jmp @f + .end_otr_c_y_24: + imul ecx,ebx + add ecx,[coord_x] + @@: + lea ecx,[ecx+ecx*2] + add ecx,buf2d_data + sub ebx,eax + mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + + mov dword[lost_bytes],0 + mov ecx,[coord_x] + cmp ecx,0 + jge @f + neg ecx + cmp eax,ecx ;eax - ширина копируемой картинки + jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + lea ecx,[ecx+ecx*2] + mov [lost_bytes],ecx + add esi,ecx + add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + xor ecx,ecx + @@: + cmp ecx,ebx + jle @f + sub ecx,ebx + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + lea ecx,[ecx+ecx*2] ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону + add [lost_bytes],ecx + @@: + + lea eax,[eax+eax*2] ;колличество байт в 1-й строке копируемой картинки + lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки + + cld + cmp [lost_bytes],0 + jg .copy_1 + .copy_0: ;простое копирование + mov ecx,eax + rep movsb + add edi,ebx + dec edx + cmp edx,0 + jg .copy_0 + jmp .copy_end + .copy_1: ;не простое копирование (картинка вылазит за правую сторону) + mov ecx,eax + rep movsb + add edi,ebx + add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу + dec edx + cmp edx,0 + jg .copy_1 + jmp .copy_end + + .sou32: ;в источнике 32 битная картинка + mov eax,buf2d_w + mov edx,buf2d_h ;высота копируемой картинки + mov esi,buf2d_data ;данные копируемой картинки + + mov edi,[buf_destination] + cmp buf2d_bits,24 + jne .copy_end ;формат буфера не поодерживается + mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки) + cmp ebx,buf2d_w ;проверяем влазит ли изображение по ширине + jge .copy_end ;если изображение полностью вылазит за правую сторону + mov ebx,buf2d_h ;ebx - высота основного буфера + mov ecx,[coord_y] + cmp ecx,0 + jge @f + ;если координата coord_y<0 (1-я настройка) + add edx,ecx ;уменьшаем высоту копируемой картинки + cmp edx,0 + jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) + neg ecx + imul ecx,eax + shl ecx,2 ;по 4 байта на пиксель + add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части + xor ecx,ecx ;обнуляем координату coord_y + @@: + cmp ecx,ebx + jge .copy_end ;если координата 'y' больше высоты буфера + add ecx,edx ;ecx - нижняя координата копируемой картинки + cmp ecx,ebx + jle @f + sub ecx,ebx + sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу + @@: + mov ebx,buf2d_w + ;mov ecx,ebx ;ecx используем для временных целей + ;imul ecx,[coord_y] + ;add ecx,[coord_x] + mov ecx,[coord_y] ;ecx используем для временных целей + cmp ecx,0 + jg .end_otr_c_y_32 + ;если координата coord_y<=0 (2-я настройка) + mov ecx,[coord_x] + jmp @f + .end_otr_c_y_32: + imul ecx,ebx + add ecx,[coord_x] + @@: + lea ecx,[ecx+ecx*2] + add ecx,buf2d_data + sub ebx,eax + mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + + mov dword[lost_bytes],0 + mov ecx,[coord_x] + cmp ecx,0 + jge @f + neg ecx + cmp eax,ecx ;eax - ширина копируемой картинки + jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + shl ecx,2 + mov [lost_bytes],ecx + add esi,ecx + add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + xor ecx,ecx + @@: + cmp ecx,ebx + jle @f + sub ecx,ebx + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + shl ecx,2 ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону + add [lost_bytes],ecx + @@: + + ;eax - колличество пикселей в 1-й строке копируемой картинки + lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки + + cld + cmp [lost_bytes],0 + jg .copy_3 + .copy_2: ;простое копирование + mov ecx,eax + @@: + movsw + movsb + inc esi + loop @b + add edi,ebx + dec edx + cmp edx,0 + jg .copy_2 + jmp .copy_end + .copy_3: ;не простое копирование (картинка вылазит за правую сторону) + mov ecx,eax + @@: + movsw + movsb + inc esi + loop @b + add edi,ebx + add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу + dec edx + cmp edx,0 + jg .copy_3 + + .copy_end: + popad + ret +endp + +;input: +; esi = pointer to color1 + transparent (32b) +; edi = pointer to background color2 (24b) +;output: +; [edi] = combine color (24b) +align 4 +combine_colors_0: + push ax cx + movzx cx,byte[esi+3] ;pro + cmp cx,255 + je .end_f + or cx,cx + jnz @f + mov ax,[esi] + mov [edi],ax + mov al,[esi+2] + mov [edi+2],al + jmp .end_f +align 4 + @@: + inc cx + push bx dx + mov bx,0x0100 ;---get transparent--- + sub bx,cx ;256-pro + ;---blye--- + movzx ax,byte[esi] + imul ax,bx + movzx dx,byte[edi] + imul dx,cx + add ax,dx + mov byte[edi],ah + ;---green--- + movzx ax,byte[esi+1] + imul ax,bx + movzx dx,byte[edi+1] + imul dx,cx + add ax,dx + mov byte[edi+1],ah + ;---red--- + movzx ax,byte[esi+2] + imul ax,bx + movzx dx,byte[edi+2] + imul dx,cx + add ax,dx + mov byte[edi+2],ah + pop dx bx +.end_f: + pop cx ax + ret + +;функция копирует изображение из буфера buf_source (32b) в buf_destination (24b) +; указываются координаты вставки буфера buf_source относительно buf_destination +; при копировании учитывается прозрачность +align 4 +proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword + locals + lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер) + endl + pushad + + mov edi,[buf_source] + cmp buf2d_bits,32 + jne .copy_end ;формат буфера не поодерживается + mov eax,buf2d_w + mov edx,buf2d_h ;высота копируемой картинки + mov esi,buf2d_data ;данные копируемой картинки + + mov edi,[buf_destination] + cmp buf2d_bits,24 + jne .copy_end ;формат буфера не поодерживается + mov ebx,buf2d_h ;ebx - высота основного буфера + mov ecx,[coord_y] + cmp ecx,0 + jge @f + ;если координата coord_y<0 (1-я настройка) + add edx,ecx ;уменьшаем высоту копируемой картинки + cmp edx,0 + jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) + neg ecx + imul ecx,eax + shl ecx,2 ;по 4 байта на пиксель + add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части + xor ecx,ecx ;обнуляем координату coord_y + @@: + cmp ecx,ebx + jge .copy_end ;если координата 'y' больше высоты буфера + add ecx,edx ;ecx - нижняя координата копируемой картинки + cmp ecx,ebx + jle @f + sub ecx,ebx + sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу + @@: + mov ebx,buf2d_w + mov ecx,ebx ;ecx используем для временных целей + cmp [coord_y],0 + jg .end_otr_c_y + ;если координата coord_y<=0 (2-я настройка) + mov ecx,[coord_x] + jmp @f + .end_otr_c_y: + imul ecx,[coord_y] + add ecx,[coord_x] + @@: + lea ecx,[ecx+ecx*2] + add ecx,buf2d_data + sub ebx,eax + mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + + mov dword[lost_bytes],0 + mov ecx,[coord_x] + cmp ecx,0 + jge @f + neg ecx + cmp eax,ecx ;eax - ширина копируемой картинки + jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + shl ecx,2 + mov [lost_bytes],ecx + add esi,ecx + shr ecx,2 + lea ecx,[ecx+ecx*2] + add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + xor ecx,ecx + @@: + cmp ecx,ebx + jle @f + sub ecx,ebx + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + shl ecx,2 ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону + add [lost_bytes],ecx + @@: + + lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки + + cld + cmp [lost_bytes],0 + jg .copy_1 + .copy_0: ;простое копирование + mov ecx,eax + @@: + call combine_colors_0 + add edi,3 + add esi,4 + loop @b + add edi,ebx + dec edx + cmp edx,0 + jg .copy_0 + jmp .copy_end + .copy_1: ;не простое копирование (картинка вылазит за правую сторону) + mov ecx,eax + @@: + call combine_colors_0 + add edi,3 + add esi,4 + loop @b + add edi,ebx + add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу + dec edx + cmp edx,0 + jg .copy_1 + + .copy_end: + popad + ret +endp + +;input: +; ebx - color1 (24b) +; esi = pointer to transparent (8b) +; edi = pointer to background color2 (24b) +;output: +; [edi] = combine color (24b) +align 4 +combine_colors_2: + push ebx cx + movzx cx,byte[esi] ;pro + cmp cx,255 + je .end_f + or cx,cx + jnz @f + mov [edi],bx + shr ebx,16 + mov [edi+2],bl + jmp .end_f +align 4 + @@: + inc cx + push ax dx si + mov si,0x0100 ;---get transparent--- + sub si,cx ;256-pro + + ;---blye--- + movzx ax,bl + shr ebx,8 + imul ax,si + movzx dx,byte[edi] + imul dx,cx + add ax,dx + mov byte[edi],ah + ;---green--- + movzx ax,bl + shr ebx,8 + imul ax,si + movzx dx,byte[edi+1] + imul dx,cx + add ax,dx + mov byte[edi+1],ah + ;---red--- + movzx ax,bl + imul ax,si + movzx dx,byte[edi+2] + imul dx,cx + add ax,dx + mov byte[edi+2],ah + pop si dx ax +.end_f: + pop cx ebx + ret + +;функция копирует изображение из буфера buf_source (8b) в buf_destination (24b) +; указываются координаты вставки буфера buf_source относительно buf_destination +align 4 +proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword + locals + lost_bytes dd ? ;число потерянных байтов в строке копируемого изображеня (тех что не влазят в буфер) + dest_w_bytes dd ? ;колличество байт в буфере приемнике по ширине - ширина вставляемой картинки + endl + pushad + + mov edi,[buf_source] + cmp buf2d_bits,8 + jne .error1 ;формат буфера не поодерживается + mov eax,buf2d_w ;ширина копируемой картинки + mov edx,buf2d_h ;высота копируемой картинки + mov esi,buf2d_data ;данные копируемой картинки + + mov edi,[buf_destination] + cmp buf2d_bits,24 + jne .error2 ;формат буфера не поодерживается + mov ebx,[coord_x] ;в ebx временно ставим отступ изображения (для проверки) + cmp ebx,buf2d_w ;проверяем влазит ли изображение по ширине + jge .copy_end ;если изображение полностью вылазит за правую сторону + mov ebx,buf2d_h ;ebx - высота основного буфера + mov ecx,[coord_y] + cmp ecx,0 + jge @f + ;если координата coord_y<0 (1-я настройка) + add edx,ecx ;уменьшаем высоту копируемой картинки + cmp edx,0 + jle .copy_end ;если копируемое изображение находится полностью над верхней границей буфера (coord_y<0 и |coord_y|>buf_source.h) + neg ecx + imul ecx,eax + add esi,ecx ;сдвигаем указатель с копируемыми данными, с учетом пропушеной части + xor ecx,ecx ;обнуляем координату coord_y + @@: + cmp ecx,ebx + jge .copy_end ;если координата 'y' больше высоты буфера + add ecx,edx ;ecx - нижняя координата копируемой картинки + cmp ecx,ebx + jle @f + sub ecx,ebx + sub edx,ecx ;уменьшаем высоту копируемой картинки, в случе когда она вылазит за нижнюю границу + @@: + mov ebx,buf2d_w + mov ecx,[coord_y] ;ecx используем для временных целей + cmp ecx,0 + jg .end_otr_c_y + ;если координата coord_y<=0 (2-я настройка) + mov ecx,[coord_x] + jmp @f + .end_otr_c_y: + imul ecx,ebx + add ecx,[coord_x] + @@: + lea ecx,[ecx+ecx*2] + add ecx,buf2d_data ;buf2d_data данные основного буфера + sub ebx,eax ;ebx - ширина основного буфера минус ширина рисуемого буфера + mov edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + + mov dword[lost_bytes],0 + mov ecx,[coord_x] + cmp ecx,0 + jge @f + neg ecx + cmp eax,ecx ;eax - ширина копируемой картинки + jle .copy_end ;если копируемое изображение находится полностью за левой границей буфера (coord_x<0 и |coord_x|>buf_source.w) + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + mov [lost_bytes],ecx + add esi,ecx + lea ecx,[ecx+ecx*2] + add edi,ecx ;edi указатель на данные буфера, куда будет производится копирование + xor ecx,ecx + @@: + cmp ecx,ebx + jle @f + sub ecx,ebx + sub eax,ecx ;укорачиваем копируемую строку + add ebx,ecx ;удлинняем строку для сдвига главной картинки буфера + ;ecx - число пикселей в 1-й строке картинки, которые вылазят за правую сторону + add [lost_bytes],ecx + @@: + + lea ebx,[ebx+ebx*2] ;колличество байт в 1-й строке буфера минус число байт в 1-й строке копируемой картинки + mov [dest_w_bytes],ebx + mov ebx,[color] + + cld + cmp dword[lost_bytes],0 + jg .copy_1 + .copy_0: ;простое копирование + mov ecx,eax + @@: + call combine_colors_2 + add edi,3 + inc esi + loop @b + add edi,[dest_w_bytes] + dec edx + cmp edx,0 + jg .copy_0 + jmp .copy_end + .copy_1: ;не простое копирование (картинка вылазит за левую и/или правую сторону) + mov ecx,eax + @@: + call combine_colors_2 + add edi,3 + inc esi + loop @b + add edi,[dest_w_bytes] + add esi,[lost_bytes] ;добавляем байты, которые вылазят за правую границу + dec edx + cmp edx,0 + jg .copy_1 + + jmp .copy_end + .error1: + stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n8b + jmp .copy_end + .error2: + stdcall print_err,sz_buf2d_bit_blt_alpha,txt_err_n24b + .copy_end: + popad + ret +endp + +align 4 +proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки + pushad + mov eax,63 + mov ebx,1 + + mov esi,[fun] + @@: + mov cl,byte[esi] + int 0x40 + inc esi + cmp byte[esi],0 + jne @b + mov cl,':' + int 0x40 + mov cl,' ' + int 0x40 + mov esi,[mes] + @@: + mov cl,byte[esi] + int 0x40 + inc esi + cmp byte[esi],0 + jne @b + popad + ret +endp + +;фильтр +align 4 +proc buf_filter_dither, buffer:dword, algor:dword + pushad + mov edi,[buffer] + cmp buf2d_bits,24 + jne .error + mov edx,buf2d_w + mov esi,buf2d_h + mov edi,buf2d_data +;edi - pointer to 24bit bitmap +;edx - x size +;esi - y size + lea edx,[edx+edx*2] + imul esi,edx + + ;определяем какой алгоритм использовать + cmp dword[algor],0 + jne @f + call dither_0 + jmp .dither_end + @@: + cmp dword[algor],1 + jne @f + call dither_1 + jmp .dither_end + @@: + cmp dword[algor],2 + jne @f + call dither_2 + jmp .dither_end + @@: + cmp dword[algor],3 + jne @f + call dither_3 + jmp .dither_end + @@: + call dither_4 + jmp .dither_end + .error: + stdcall print_err,sz_buf2d_filter_dither,txt_err_n24b + .dither_end: + popad + ret +endp + +align 16 +dither_0: ; Sierra Filter Lite algorithm +newp_0: ; Dithering cycle + xor ebx,ebx ; At first threshold + movzx ecx,byte[edi] + cmp cl,255 + je newp_0.next + test cl,cl + jz newp_0.next + jns @f + dec ebx + sub ecx,255 +@@: + mov [edi],bl ; putpixel + + sar ecx,1 ; error/2 + ;adc ecx,0 ; round to integer + + movzx eax,byte[edi+3] ; pixel (x+1;y) + add eax,ecx ; add error/2 to (x+1;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok +@@: + cmp eax,255 + jle .ok + or al,255 +.ok: + mov [edi+3],al ; putpixel + + sar ecx,1 ; error/4 + adc ecx,0 ; round to integer + + movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) + add eax,ecx ; add error/4 to (x-1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok1 +@@: + cmp eax,255 + jle .ok1 + or al,255 +.ok1: + mov [edi+edx-3],al ; putpixel + + movzx eax,byte[edi+edx] ; pixel (x;y+1) + add eax,ecx ; add error/4 to (x;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok2 +@@: + cmp eax,255 + jle .ok2 + or al,255 +.ok2: + mov [edi+edx],al ; putpixel + +.next: + inc edi + dec esi + jnz newp_0 + ret + +align 16 +dither_1: ; Floyd-Steinberg algorithm +newp_1: ; Dithering cycle + xor ebx,ebx ; At first threshold + movzx ecx,byte[edi] + cmp cl,255 + je newp_1.next + test cl,cl + jz newp_1.next + jns @f + dec ebx + sub ecx,255 +@@: + mov [edi],bl ; putpixel + + sar ecx,4 ; error/16 + adc ecx,0 ; round to integer + mov ebx,ecx + + movzx eax,byte[edi+edx+3] ; pixel (x+1;y+1) + add eax,ecx ; add error/16 to (x+1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok +@@: + cmp eax,255 + jle .ok + or al,255 +.ok: + mov [edi+edx+3],al ;putpixel + + imul ecx,3 + movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) + add eax,ecx ; add 3*error/16 to (x-1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok1 +@@: + cmp eax,255 + jle .ok1 + or al,255 +.ok1: + mov [edi+edx-3],al ;putpixel + + mov ecx,ebx + imul ecx,5 + movzx eax,byte[edi+edx] ; pixel (x;y+1) + add eax,ecx ; add 5*error/16 to (x;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok2 +@@: + cmp eax,255 + jle .ok2 + or al,255 +.ok2: + mov [edi+edx],al ;putpixel + + mov ecx,ebx + imul ecx,7 + movzx eax,byte[edi+3] ; pixel (x+1;y) + add eax,ecx ; add 7*error/16 to (x+1;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok3 +@@: + cmp eax,255 + jle .ok3 + or al,255 +.ok3: + mov [edi+3],al ;putpixel + +.next: + inc edi + dec esi + jnz newp_1 + ret + +align 16 +dither_2: ; Burkes algorithm +newp_2: ; Dithering cycle + xor ebx,ebx ; At first threshold + movsx ecx,byte[edi] + cmp cl,255 + je newp_2.next + test cl,cl + jz newp_2.next + jns @f + dec ebx +@@: + mov [edi],bl ; putpixel + + sar ecx,2 ; error/4 + adc ecx,0 ; round to integer + + movzx eax,byte[edi+3] ; pixel (x+1;y) + add eax,ecx ; add error/4 to (x+1;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok +@@: + cmp eax,255 + jle .ok + or al,255 +.ok: + mov [edi+3],al ; putpixel + + movzx eax,byte[edi+edx] ; pixel (x;y+1) + add eax,ecx ; add error/4 to (x;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok1 +@@: + cmp eax,255 + jle .ok1 + or al,255 +.ok1: + mov [edi+edx],al ; putpixel + + sar ecx,1 ; error/8 + adc ecx,0 ; round to integer + + movzx eax,byte[edi+6] ; pixel (x+2;y) + add eax,ecx ; add error/8 to (x+2;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok2 +@@: + cmp eax,255 + jle .ok2 + or al,255 +.ok2: + mov [edi+6],al ; putpixel + + movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) + add eax,ecx ; add error/8 to (x-1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok3 +@@: + cmp eax,255 + jle .ok3 + or al,255 +.ok3: + mov [edi+edx-3],al ; putpixel + + movzx eax,byte[edi+edx+3] ; pixel (x+1;y+1) + add eax,ecx ; add error/8 to (x+1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok4 +@@: + cmp eax,255 + jle .ok4 + or al,255 +.ok4: + mov [edi+edx+3],al ; putpixel + + sar ecx,1 ; error/16 + ;adc ecx,0 ; round to integer + + movzx eax,byte[edi+edx-6] ; pixel (x-2;y+1) + add eax,ecx ; add error/16 to (x-2;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok5 +@@: + cmp eax,255 + jle .ok5 + or al,255 +.ok5: + mov [edi+edx-6],al ; putpixel + + movzx eax,byte[edi+edx+6] ; pixel (x+2;y+1) + add eax,ecx ; add error/16 to (x+2;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok6 +@@: + cmp eax,255 + jle .ok6 + or al,255 +.ok6: + mov [edi+edx+6],al ; putpixel + +.next: + inc edi + dec esi + jnz newp_2 + ret + + +align 16 +dither_3: ; Heavyiron_mod algorithm + newp_3: ; Dithering cycle + xor ebx,ebx ; At first threshold + movzx ecx,byte[edi] + cmp cl,255 + je .next + test cl,cl + jz .next + jns @f + dec ebx + sub ecx,255 + @@: + mov [edi],bl ; putpixel + + sar ecx,2 ; error/4 + + movzx eax,byte[edi+3] ; pixel (x+1;y) + add eax,ecx ; add error/4 to (x+1;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok + @@: + cmp eax,255 + jle .ok + or al,255 + .ok: + mov [edi+3],al ; putpixel + + movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) + add eax,ecx ; add error/4 to (x-1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok1 + @@: + cmp eax,255 + jle .ok1 + or al,255 + .ok1: + mov [edi+edx-3],al ; putpixel + + movzx eax,byte[edi+edx] ; pixel (x;y+1) + add eax,ecx ; add error/4 to (x;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok2 + @@: + cmp eax,255 + jle .ok2 + or al,255 + .ok2: + mov [edi+edx],al ; putpixel + + .next: + inc edi + dec esi + jnz newp_3 + ret + +align 16 +dither_4: ; Atkinson algorithm + newp_4: ; Dithering cycle + + xor ebx,ebx ; At first threshold + movsx ecx,byte[edi] + cmp cl,255 + je .next + test cl,cl + jz .next + jns @f + dec ebx + @@: + mov [edi],bl ; putpixel + + sar ecx,3 ; error/8 + + movzx eax,byte[edi+3] ; pixel (x+1;y) + add eax,ecx ; add error/8 to (x+1;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok + @@: + cmp eax,255 + jle .ok + or al,255 + .ok: + mov [edi+3],al ; putpixel + + movzx eax,byte[edi+edx] ; pixel (x;y+1) + add eax,ecx ; add error/8 to (x;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok1 + @@: + cmp eax,255 + jle .ok1 + or al,255 + .ok1: + mov [edi+edx],al ; putpixel + + movzx eax,byte[edi+6] ; pixel (x+2;y) + add eax,ecx ; add error/8 to (x+2;y) + jge @f ; check_overflow + xor eax,eax + jmp .ok2 + @@: + cmp eax,255 + jle .ok2 + or al,255 + .ok2: + mov [edi+6],al ; putpixel + + movzx eax,byte[edi+edx-3] ; pixel (x-1;y+1) + add eax,ecx ; add error/8 to (x-1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok3 + @@: + cmp eax,255 + jle .ok3 + or al,255 + .ok3: + mov [edi+edx-3],al ; putpixel + + movzx eax,byte[edi+edx+3] ; pixel (x+1;y+1) + add eax,ecx ; add error/8 to (x+1;y+1) + jge @f ; check_overflow + xor eax,eax + jmp .ok4 + @@: + cmp eax,255 + jle .ok4 + or al,255 + .ok4: + mov [edi+edx+3],al ; putpixel + + + movzx eax,byte[edi+edx+edx] ; pixel (x;y+2) + add eax,ecx ; add error/8 to (x;y+2) + jge @f ; check_overflow + xor eax,eax + jmp .ok5 + @@: + cmp eax,255 + jle .ok5 + or al,255 + .ok5: + mov [edi+edx+edx],al ; putpixel + + .next: + inc edi + dec esi + jnz newp_4 + ret + + + +include 'fun_voxel.inc' ;функции для работы с воксельной графикой + +txt_err_size_0 db 'image size < 1 pixel',13,10,0 +txt_err_n8b db 'need buffer 8 bit',13,10,0 +txt_err_n24b db 'need buffer 24 bit',13,10,0 +txt_err_n32b db 'need buffer 32 bit',13,10,0 +txt_err_n8_24b db 'need buffer 8 or 24 bit',13,10,0 + +align 16 +EXPORTS: + dd sz_lib_init, lib_init + dd sz_buf2d_create, buf_create + dd sz_buf2d_create_f_img, buf_create_f_img + dd sz_buf2d_clear, buf_clear + dd sz_buf2d_draw, buf_draw_buf + dd sz_buf2d_delete, buf_delete + dd sz_buf2d_resize, buf_resize + dd sz_buf2d_rotate, buf_rotate + dd sz_buf2d_line, buf_line_brs + dd sz_buf2d_line_sm, buf_line_brs_sm + dd sz_buf2d_rect_by_size, buf_rect_by_size + dd sz_buf2d_filled_rect_by_size, buf_filled_rect_by_size + dd sz_buf2d_circle, buf_circle + dd sz_buf2d_img_hdiv2, buf_img_hdiv2 + dd sz_buf2d_img_wdiv2, buf_img_wdiv2 + dd sz_buf2d_conv_24_to_8, buf_conv_24_to_8 + dd sz_buf2d_conv_24_to_32, buf_conv_24_to_32 + dd sz_buf2d_bit_blt, buf_bit_blt + dd sz_buf2d_bit_blt_transp, buf_bit_blt_transp + dd sz_buf2d_bit_blt_alpha, buf_bit_blt_alpha + dd sz_buf2d_curve_bezier, buf_curve_bezier + dd sz_buf2d_convert_text_matrix, buf_convert_text_matrix + dd sz_buf2d_draw_text, buf_draw_text + dd sz_buf2d_crop_color, buf_crop_color + dd sz_buf2d_offset_h, buf_offset_h + dd sz_buf2d_flood_fill, buf_flood_fill + dd sz_buf2d_set_pixel, buf_set_pixel + dd sz_buf2d_get_pixel, buf_get_pixel + dd sz_buf2d_flip_h, buf_flip_h + dd sz_buf2d_flip_v, buf_flip_v + dd sz_buf2d_filter_dither, buf_filter_dither + dd sz_buf2d_vox_brush_create, vox_brush_create + dd sz_buf2d_vox_brush_delete, vox_brush_delete + dd sz_buf2d_vox_obj_get_img_w_3g, buf_vox_obj_get_img_w_3g + dd sz_buf2d_vox_obj_get_img_h_3g, buf_vox_obj_get_img_h_3g + dd sz_buf2d_vox_obj_draw_1g, buf_vox_obj_draw_1g + dd sz_buf2d_vox_obj_draw_3g, buf_vox_obj_draw_3g + dd sz_buf2d_vox_obj_draw_3g_scaled, buf_vox_obj_draw_3g_scaled + dd sz_buf2d_vox_obj_draw_pl, buf_vox_obj_draw_pl + dd sz_buf2d_vox_obj_draw_pl_scaled, buf_vox_obj_draw_pl_scaled + dd sz_buf2d_vox_obj_draw_3g_shadows, buf_vox_obj_draw_3g_shadows + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 ;очистка буфера указанным цветом + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_rotate db 'buf2d_rotate',0 + sz_buf2d_line db 'buf2d_line',0 ;рисование линии + sz_buf2d_line_sm db 'buf2d_line_sm',0 ;рисование сглаженной линии + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 ;рисование рамки прямоугольника, 2-я координата задана по размеру + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 ;рисование залитого прямоугольника, 2-я координата задана по размеру + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 ;сжатие изображения по высоте в 2 раза (размер буфера не меняется) + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 ;сжатие изображения по ширине в 2 раза (размер буфера не меняется) + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + sz_buf2d_get_pixel db 'buf2d_get_pixel',0 + sz_buf2d_flip_h db 'buf2d_flip_h',0 + sz_buf2d_flip_v db 'buf2d_flip_v',0 + sz_buf2d_filter_dither db 'buf2d_filter_dither',0 + sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 + sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 + sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 diff --git a/programs/develop/libraries/buf2d/trunk/build.bat b/programs/develop/libraries/buf2d/build.bat similarity index 100% rename from programs/develop/libraries/buf2d/trunk/build.bat rename to programs/develop/libraries/buf2d/build.bat diff --git a/programs/develop/libraries/buf2d/trunk/examples/Tupfile.lua b/programs/develop/libraries/buf2d/examples/Tupfile.lua similarity index 100% rename from programs/develop/libraries/buf2d/trunk/examples/Tupfile.lua rename to programs/develop/libraries/buf2d/examples/Tupfile.lua diff --git a/programs/develop/libraries/buf2d/trunk/examples/build.bat b/programs/develop/libraries/buf2d/examples/build.bat similarity index 79% rename from programs/develop/libraries/buf2d/trunk/examples/build.bat rename to programs/develop/libraries/buf2d/examples/build.bat index d96a21fb6..942c5adf3 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/build.bat +++ b/programs/develop/libraries/buf2d/examples/build.bat @@ -1,10 +1,10 @@ if not exist bin mkdir bin -if not exist bin\font8x9.bmp @copy ..\..\..\..\..\fs\kfar\font8x9.bmp bin\font8x9.bmp +if not exist bin\font8x9.bmp @copy ..\..\..\..\fs\kfar\font8x9.bmp bin\font8x9.bmp @copy foto.jpg bin\foto.jpg @copy img0.png bin\img0.png @copy img1.png bin\img1.png -if not exist bin\vaz2106.vox @copy ..\..\..\..\..\media\voxel_editor\trunk\vaz2106.vox bin\vaz2106.vox +if not exist bin\vaz2106.vox @copy ..\..\..\..\media\voxel_editor\vaz2106.vox bin\vaz2106.vox @fasm.exe -m 16384 e0_dr_lines.asm bin\e0_dr_lines.kex @fasm.exe -m 16384 e1_scaling.asm bin\e1_scaling.kex diff --git a/programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm b/programs/develop/libraries/buf2d/examples/e0_dr_lines.asm similarity index 91% rename from programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm rename to programs/develop/libraries/buf2d/examples/e0_dr_lines.asm index fbb0a04c2..74ddd089f 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e0_dr_lines.asm +++ b/programs/develop/libraries/buf2d/examples/e0_dr_lines.asm @@ -1,139 +1,145 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../KOSfuncs.inc' -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load - -align 4 -start: - load_library lib0_name, library_path, system_path, import_buf2d_lib - cmp eax,-1 - jz button.exit - - mcall SF_SET_EVENTS_MASK, 0x27 - stdcall [buf2d_create], buf_0 ;создаем буфер - stdcall [buf2d_line], buf_0, 110, 20, 125, 90, 0xffff00 ;рисуем линию - stdcall [buf2d_line], buf_0, 60, 120, 110, 20, 0xd000 ;рисуем линию - stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff - stdcall [buf2d_circle], buf_0, 125, 90, 30, 0xffffff ;рисуем окружность - stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000 ;рисуем окружность - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - cmp al,1 ;изменилось положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - jmp still - -align 4 -draw_window: - pushad - mcall SF_REDRAW, SSF_BEGIN_DRAW - - ;mov edx,0x32000000 - mov edx,0x33000000 - mcall SF_CREATE_WINDOW, (50 shl 16)+330,(30 shl 16)+275,,,caption - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW, SSF_END_DRAW - popad - ret - -align 4 -key: - mcall SF_GET_KEY - - cmp ah,27 ;Esc - je button.exit - - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - mcall SF_TERMINATE_PROCESS - -caption db 'Test buf2d library, [Esc] - exit',0 - -;-------------------------------------------------- -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_line dd sz_buf2d_line - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 20 ;+4 left - dw 10 ;+6 top - dd 160 ;+8 w - dd 128 ;+12 h - dd 0x80 ;+16 color - db 24 ;+20 bit in pixel - -;-------------------------------------------------- -system_path db '/sys/lib/' -lib0_name db 'buf2d.obj',0 -;-------------------------------------------------- - -i_end: ;конец кода - rb 1024 -stacktop: -cur_dir_path rb 4096 -library_path rb 4096 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../KOSfuncs.inc' +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +align 4 +start: + load_library lib0_name, library_path, system_path, import_buf2d_lib + cmp eax,-1 + jz button.exit + + mcall SF_SET_EVENTS_MASK, 0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_line], buf_0, 110, 20, 125, 90, 0xffff00 ;рисуем линию + stdcall [buf2d_line], buf_0, 60, 120, 110, 20, 0xd000 ;рисуем линию + stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff + stdcall [buf2d_circle], buf_0, 125, 90, 30, 0xffffff ;рисуем окружность + stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000 ;рисуем окружность + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW, SSF_BEGIN_DRAW + + ;mov edx,0x32000000 + mov edx,0x33000000 + mcall SF_CREATE_WINDOW, (50 shl 16)+330,(30 shl 16)+275,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW, SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + mcall SF_TERMINATE_PROCESS + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 10 ;+6 top + dd 160 ;+8 w + dd 128 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +lib0_name db 'buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;конец кода + rb 1024 +stacktop: +cur_dir_path rb 4096 +library_path rb 4096 +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm b/programs/develop/libraries/buf2d/examples/e1_scaling.asm similarity index 92% rename from programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm rename to programs/develop/libraries/buf2d/examples/e1_scaling.asm index d6868b73d..44ddd18ed 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e1_scaling.asm +++ b/programs/develop/libraries/buf2d/examples/e1_scaling.asm @@ -1,169 +1,175 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../KOSfuncs.inc' -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../dll.inc' -include '../../../../../load_lib.mac' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load - -align 4 -start: - load_library lib0_name, library_path, system_path, import_buf2d_lib - cmp eax,-1 - jz button.exit - - mcall SF_SET_EVENTS_MASK, 0x27 - stdcall [buf2d_create], buf_0 ;создаем буфер - stdcall [buf2d_line], buf_0, 110, 20, 125, 90, 0xffff00 ;рисуем линию - stdcall [buf2d_line], buf_0, 60, 120, 110, 20, 0xd000 ;рисуем линию - stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff - stdcall [buf2d_circle], buf_0, 125, 90, 30, 0xffffff ;рисуем окружность - stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000 ;рисуем окружность - - stdcall [buf2d_img_hdiv2], buf_0 ;сжимаем изображение в буфере по высоте в 2 раза - stdcall [buf2d_img_wdiv2], buf_0 ;сжимаем изображение в буфере по ширине в 2 раза - stdcall [buf2d_create_f_img], buf_1,[buf_0] ;создаем маленький буфер buf_1, на основе сжатого изображения из buf_0 - - ;если бы использовалась функция buf2d_create, тогда биты изображения - ;пришлось бы копировать следущими строками: - ;movzx ecx,word[buf_1.size_x] - ;movzx eax,word[buf_1.size_y] - ;imul ecx,eax - ;imul ecx,3 ;ecx - колличество байт в маленьком буфере - ;stdcall mem_copy, dword[buf_0],dword[buf_1],ecx - - stdcall [buf2d_clear], buf_0,0xffffff - stdcall [buf2d_bit_blt], buf_0, 15,10, buf_1 - stdcall [buf2d_bit_blt], buf_0, 110,65, buf_1 - - stdcall [buf2d_conv_24_to_8], buf_1 - ;stdcall [buf2d_bit_blt_alpha], buf_0, 1,1, buf_1,0xff8080 ;рисуем контуры изображения на фотографии - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - cmp al,1 ;изм. положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - jmp still - -align 4 -draw_window: - pushad - mcall SF_REDRAW, SSF_BEGIN_DRAW - - ;mov edx,0x32000000 - mov edx,0x33000000 - mcall SF_CREATE_WINDOW, (50 shl 16)+330,(30 shl 16)+275,,,caption - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW, SSF_END_DRAW - popad - ret - -align 4 -key: - mcall SF_GET_KEY - - cmp ah,27 ;Esc - je button.exit - - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - stdcall [buf2d_delete],buf_1 ;удаляем буфер - mcall SF_TERMINATE_PROCESS - -caption db 'Test buf2d library, [Esc] - exit',0 - -;-------------------------------------------------- -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_line dd sz_buf2d_line - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 20 ;+4 left - dw 10 ;+6 top - dd 160 ;+8 w - dd 128 ;+12 h - dd 0x80 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dw 10 ;+4 left - dw 10 ;+6 top -.size_x: dd 80 ;+8 w -.size_y: dd 64 ;+12 h - dd 0x80 ;+16 color - db 24 ;+20 bit in pixel - -;-------------------------------------------------- -system_path db '/sys/lib/' -lib0_name db 'buf2d.obj',0 -;-------------------------------------------------- - -i_end: ;конец кода - rb 1024 -stacktop: -cur_dir_path rb 4096 -library_path rb 4096 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../KOSfuncs.inc' +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../dll.inc' +include '../../../../load_lib.mac' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +align 4 +start: + load_library lib0_name, library_path, system_path, import_buf2d_lib + cmp eax,-1 + jz button.exit + + mcall SF_SET_EVENTS_MASK, 0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_line], buf_0, 110, 20, 125, 90, 0xffff00 ;рисуем линию + stdcall [buf2d_line], buf_0, 60, 120, 110, 20, 0xd000 ;рисуем линию + stdcall [buf2d_curve_bezier], buf_0, (10 shl 16)+20,(110 shl 16)+10,(50 shl 16)+90, dword 0xff + stdcall [buf2d_circle], buf_0, 125, 90, 30, 0xffffff ;рисуем окружность + stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000 ;рисуем окружность + + stdcall [buf2d_img_hdiv2], buf_0 ;сжимаем изображение в буфере по высоте в 2 раза + stdcall [buf2d_img_wdiv2], buf_0 ;сжимаем изображение в буфере по ширине в 2 раза + stdcall [buf2d_create_f_img], buf_1,[buf_0] ;создаем маленький буфер buf_1, на основе сжатого изображения из buf_0 + + ;если бы использовалась функция buf2d_create, тогда биты изображения + ;пришлось бы копировать следущими строками: + ;movzx ecx,word[buf_1.size_x] + ;movzx eax,word[buf_1.size_y] + ;imul ecx,eax + ;imul ecx,3 ;ecx - колличество байт в маленьком буфере + ;stdcall mem_copy, dword[buf_0],dword[buf_1],ecx + + stdcall [buf2d_clear], buf_0,0xffffff + stdcall [buf2d_bit_blt], buf_0, 15,10, buf_1 + stdcall [buf2d_bit_blt], buf_0, 110,65, buf_1 + + stdcall [buf2d_conv_24_to_8], buf_1 + ;stdcall [buf2d_bit_blt_alpha], buf_0, 1,1, buf_1,0xff8080 ;рисуем контуры изображения на фотографии + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 ;изм. положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW, SSF_BEGIN_DRAW + + ;mov edx,0x32000000 + mov edx,0x33000000 + mcall SF_CREATE_WINDOW, (50 shl 16)+330,(30 shl 16)+275,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW, SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + mcall SF_TERMINATE_PROCESS + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 10 ;+6 top + dd 160 ;+8 w + dd 128 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 10 ;+4 left + dw 10 ;+6 top +.size_x: dd 80 ;+8 w +.size_y: dd 64 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +lib0_name db 'buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;конец кода + rb 1024 +stacktop: +cur_dir_path rb 4096 +library_path rb 4096 +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e2_images.asm b/programs/develop/libraries/buf2d/examples/e2_images.asm similarity index 94% rename from programs/develop/libraries/buf2d/trunk/examples/e2_images.asm rename to programs/develop/libraries/buf2d/examples/e2_images.asm index fd24e0cd6..556f10f94 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e2_images.asm +++ b/programs/develop/libraries/buf2d/examples/e2_images.asm @@ -1,308 +1,314 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../KOSfuncs.inc' -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - -IMAGE_FILE0_SIZE equ 640*480*3 ;размер файла с изображением 640 x 480 -IMAGE_FILE1_SIZE equ 200*186*3 ;размер файла с изображением 200 x 100 -fn_foto db 'foto.jpg',0 - -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0x0 - else - copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой - end if - - stdcall mem.Alloc, dword size ;выделяем память для изображения - mov [buf],eax - - mov eax,70 ;70-я функция работа с файлами - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], [buf] - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall [img_decode], [buf],ebx,0 - mov [image_data],eax - ;преобразуем изображение к формату rgb - stdcall [img_to_rgb2], [image_data],[buf] - ;удаляем временный буфер image_data - stdcall [img_destroy], [image_data] - @@: -} - -align 4 -start: - load_libraries l_libs_start,load_lib_end - - ;проверка на сколько удачно загузилась наша либа - mov ebp,lib0 - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall -1 ;exit not correct - @@: - mov ebp,lib1 - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall -1 ;exit not correct - @@: - - mcall 40,0x27 - mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета - - load_image_file fn_foto, image_data_foto,IMAGE_FILE0_SIZE - stdcall [buf2d_create_f_img], buf_0,[image_data_foto] ;создаем буфер - stdcall mem.Free,[image_data_foto] ;освобождаем память - - load_image_file 'img0.png',image_data_gray,IMAGE_FILE1_SIZE - stdcall [buf2d_create_f_img], buf_1,[image_data_gray] ;создаем буфер - stdcall mem.Free,[image_data_gray] ;освобождаем память - - load_image_file 'img1.png',image_data_rgb, IMAGE_FILE1_SIZE - stdcall [buf2d_create_f_img], buf_2,[image_data_rgb] ;создаем буфер - stdcall mem.Free,[image_data_rgb] ;освобождаем память - - stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8бит - stdcall [buf2d_conv_24_to_32],buf_2,buf_1 ;делаем буфер rgba 32бит - - stdcall [buf2d_bit_blt], buf_0, 10,170, buf_2 ;рисуем изображение на фотографии - stdcall [buf2d_bit_blt_transp], buf_0, 210,270, buf_2 ;рисуем прозрачное изображение на фотографии - stdcall [buf2d_bit_blt_alpha], buf_0, 410,170, buf_1,0xff8080 ;рисуем контуры изображения на фотографии - -align 4 -red_win: - call draw_window - -align 4 -still: ;главный цикл - mcall 10 - - cmp al,0x1 ;изменилось положение окна - jz red_win - cmp al,0x2 - jz key - cmp al,0x3 - jz button - - jmp still - -align 4 -key: - push eax ebx - mcall 2 -;... - pop ebx eax - jmp still - - -align 4 -draw_window: - pushad - mcall 12,1 - - mov edx,[sc.work] - or edx,0x33000000 - mcall 0,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна - - stdcall [buf2d_draw], buf_0 - - mcall 12,2 - popad - ret - - -system_dir0 db '/sys/lib/' -name_buf2d db 'buf2d.obj',0 - -system_dir1 db '/sys/lib/' -name_libimg db 'libimg.obj',0 - -;library structures -l_libs_start: - lib0 l_libs name_buf2d, file_name, system_dir0, import_buf2d_lib - lib1 l_libs name_libimg, file_name, system_dir1, import_libimg -load_lib_end: - -align 4 -button: - mcall 17 ;получить код нажатой кнопки - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - stdcall [buf2d_delete],buf_1 ;удаляем буфер - stdcall [buf2d_delete],buf_2 ;удаляем буфер - mcall -1 ;выход из программы - -image_data dd 0 ;память для преобразования картинки функциями libimg -image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit -image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb -image_data_foto dd 0 - -run_file_70 FileInfoBlock -caption db 'Draw images 13.09.11',0 ;подпись окна -sc system_colors ;системные цвета - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 5 ;+6 top - dd 640 ;+8 w - dd 480 ;+12 h - dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dw 25 ;+4 left - dw 25 ;+6 top - dd 200 ;+8 w - dd 186 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_2: - dd 0 ;указатель на буфер изображения - dw 235 ;+4 left - dw 25 ;+6 top - dd 200 ;+8 w - dd 186 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -import_libimg: - dd alib_init1 - img_is_img dd aimg_is_img - img_info dd aimg_info - img_from_file dd aimg_from_file - img_to_file dd aimg_to_file - img_from_rgb dd aimg_from_rgb - img_to_rgb dd aimg_to_rgb - img_to_rgb2 dd aimg_to_rgb2 - img_decode dd aimg_decode - img_encode dd aimg_encode - img_create dd aimg_create - img_destroy dd aimg_destroy - img_destroy_layer dd aimg_destroy_layer - img_count dd aimg_count - img_lock_bits dd aimg_lock_bits - img_unlock_bits dd aimg_unlock_bits - img_flip dd aimg_flip - img_flip_layer dd aimg_flip_layer - img_rotate dd aimg_rotate - img_rotate_layer dd aimg_rotate_layer - img_draw dd aimg_draw - - dd 0,0 - alib_init1 db 'lib_init',0 - aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение - aimg_info db 'img_info',0 - aimg_from_file db 'img_from_file',0 - aimg_to_file db 'img_to_file',0 - aimg_from_rgb db 'img_from_rgb',0 - aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB - aimg_to_rgb2 db 'img_to_rgb2',0 - aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных - aimg_encode db 'img_encode',0 - aimg_create db 'img_create',0 - aimg_destroy db 'img_destroy',0 - aimg_destroy_layer db 'img_destroy_layer',0 - aimg_count db 'img_count',0 - aimg_lock_bits db 'img_lock_bits',0 - aimg_unlock_bits db 'img_unlock_bits',0 - aimg_flip db 'img_flip',0 - aimg_flip_layer db 'img_flip_layer',0 - aimg_rotate db 'img_rotate',0 - aimg_rotate_layer db 'img_rotate_layer',0 - aimg_draw db 'img_draw',0 - -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_line dd sz_buf2d_line - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - -i_end: - rb 1024 -stacktop: - cur_dir_path rb 4096 - file_name: - rb 4096 - plugin_path: - rb 4096 - openfile_path: - rb 4096 - filename_area: - rb 256 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../KOSfuncs.inc' +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +IMAGE_FILE0_SIZE equ 640*480*3 ;размер файла с изображением 640 x 480 +IMAGE_FILE1_SIZE equ 200*186*3 ;размер файла с изображением 200 x 100 +fn_foto db 'foto.jpg',0 + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall [img_decode], [buf],ebx,0 + mov [image_data],eax + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2], [image_data],[buf] + ;удаляем временный буфер image_data + stdcall [img_destroy], [image_data] + @@: +} + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась наша либа + mov ebp,lib0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mov ebp,lib1 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + + mcall 40,0x27 + mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета + + load_image_file fn_foto, image_data_foto,IMAGE_FILE0_SIZE + stdcall [buf2d_create_f_img], buf_0,[image_data_foto] ;создаем буфер + stdcall mem.Free,[image_data_foto] ;освобождаем память + + load_image_file 'img0.png',image_data_gray,IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_1,[image_data_gray] ;создаем буфер + stdcall mem.Free,[image_data_gray] ;освобождаем память + + load_image_file 'img1.png',image_data_rgb, IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_2,[image_data_rgb] ;создаем буфер + stdcall mem.Free,[image_data_rgb] ;освобождаем память + + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8бит + stdcall [buf2d_conv_24_to_32],buf_2,buf_1 ;делаем буфер rgba 32бит + + stdcall [buf2d_bit_blt], buf_0, 10,170, buf_2 ;рисуем изображение на фотографии + stdcall [buf2d_bit_blt_transp], buf_0, 210,270, buf_2 ;рисуем прозрачное изображение на фотографии + stdcall [buf2d_bit_blt_alpha], buf_0, 410,170, buf_1,0xff8080 ;рисуем контуры изображения на фотографии + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + mcall 10 + + cmp al,0x1 ;изменилось положение окна + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + + jmp still + +align 4 +key: + push eax ebx + mcall 2 +;... + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,[sc.work] + or edx,0x33000000 + mcall 0,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + + +system_dir0 db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 + +system_dir1 db '/sys/lib/' +name_libimg db 'libimg.obj',0 + +;library structures +l_libs_start: + lib0 l_libs name_buf2d, file_name, system_dir0, import_buf2d_lib + lib1 l_libs name_libimg, file_name, system_dir1, import_libimg +load_lib_end: + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + stdcall [buf2d_delete],buf_2 ;удаляем буфер + mcall -1 ;выход из программы + +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit +image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb +image_data_foto dd 0 + +run_file_70 FileInfoBlock +caption db 'Draw images 13.09.11',0 ;подпись окна +sc system_colors ;системные цвета + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 5 ;+6 top + dd 640 ;+8 w + dd 480 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_2: + dd 0 ;указатель на буфер изображения + dw 235 ;+4 left + dw 25 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +i_end: + rb 1024 +stacktop: + cur_dir_path rb 4096 + file_name: + rb 4096 + plugin_path: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e3_text.asm b/programs/develop/libraries/buf2d/examples/e3_text.asm similarity index 94% rename from programs/develop/libraries/buf2d/trunk/examples/e3_text.asm rename to programs/develop/libraries/buf2d/examples/e3_text.asm index 5aeac7b20..e455a25f6 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e3_text.asm +++ b/programs/develop/libraries/buf2d/examples/e3_text.asm @@ -1,308 +1,314 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../KOSfuncs.inc' -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - -IMAGE_FILE1_SIZE equ 128*144*3 ;размер файла с изображением 128 x 144 - -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0x0 - else - copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой - end if - - stdcall mem.Alloc, dword size ;выделяем память для изображения - mov [buf],eax - - mov eax,70 ;70-я функция работа с файлами - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], [buf] - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall [img_decode], [buf],ebx,0 - mov [image_data],eax - ;преобразуем изображение к формату rgb - stdcall [img_to_rgb2], [image_data],[buf] - ;удаляем временный буфер image_data - stdcall [img_destroy], [image_data] - @@: -} - -align 4 -start: - load_libraries l_libs_start,load_lib_end - - ;проверка на сколько удачно загузилась наша либа - mov ebp,lib0 - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall -1 ;exit not correct - @@: - mov ebp,lib1 - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall -1 ;exit not correct - @@: - - mcall 40,0x27 - mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета - - stdcall [buf2d_create], buf_0 ;создаем буфер - - load_image_file 'font8x9.bmp', image_data_foto,IMAGE_FILE1_SIZE - stdcall [buf2d_create_f_img], buf_1,[image_data_foto] ;создаем буфер - stdcall mem.Free,[image_data_foto] ;освобождаем память - - stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит - stdcall [buf2d_bit_blt_alpha], buf_0, 70,10, buf_1,0x20d020 ;рисуем исходную текстовую матрицу 16*16 - stdcall [buf2d_convert_text_matrix], buf_1 - stdcall [buf2d_bit_blt_alpha], buf_0, 10,10, buf_1,0xff8080 ;рисуем преобразованную текстовую матрицу 1*256 - stdcall [buf2d_draw_text], buf_0, buf_1,some_text,70,170,0x4040ff ;рисуем строку с текстом - -align 4 -red_win: - call draw_window - -align 4 -still: ;главный цикл - mcall 10 - - cmp al,0x1 ;изменилось положение окна - jz red_win - cmp al,0x2 - jz key - cmp al,0x3 - jz button - - jmp still - -align 4 -key: - push eax ebx - mcall 2 -;... - pop ebx eax - jmp still - - -align 4 -draw_window: - pushad - mcall 12,1 - - mov edx,[sc.work] - or edx,0x33000000 - mcall 0,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна - - stdcall [buf2d_draw], buf_0 - - mcall 12,2 - popad - ret - - -system_dir0 db '/sys/lib/' -name_buf2d db 'buf2d.obj',0 - -system_dir1 db '/sys/lib/' -name_libimg db 'libimg.obj',0 - -;library structures -l_libs_start: - lib0 l_libs name_buf2d, file_name, system_dir0, import_buf2d_lib - lib1 l_libs name_libimg, file_name, system_dir1, import_libimg -load_lib_end: - -align 4 -button: - mcall 17 ;получить код нажатой кнопки - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - stdcall [buf2d_delete],buf_1 ;удаляем буфер - mcall -1 ;выход из программы - -image_data dd 0 ;память для преобразования картинки функциями libimg -image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit -image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb -image_data_foto dd 0 - -run_file_70 FileInfoBlock -caption db 'Draw text 13.09.11',0 ;подпись окна -sc system_colors ;системные цвета - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 5 ;+6 top - dd 640 ;+8 w - dd 480 ;+12 h - dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dw 25 ;+4 left - dw 25 ;+6 top - dd 128 ;+8 w - dd 144 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -some_text db 'Пример вывода теста в буфер, возможен вывод:',13,13 -db ' * в несколько строк',13 -db ' * можно задавать цвет текста',13,13 -db 'Сегодня 13 сентября 2011.',0 - -align 4 -import_libimg: - dd alib_init1 - img_is_img dd aimg_is_img - img_info dd aimg_info - img_from_file dd aimg_from_file - img_to_file dd aimg_to_file - img_from_rgb dd aimg_from_rgb - img_to_rgb dd aimg_to_rgb - img_to_rgb2 dd aimg_to_rgb2 - img_decode dd aimg_decode - img_encode dd aimg_encode - img_create dd aimg_create - img_destroy dd aimg_destroy - img_destroy_layer dd aimg_destroy_layer - img_count dd aimg_count - img_lock_bits dd aimg_lock_bits - img_unlock_bits dd aimg_unlock_bits - img_flip dd aimg_flip - img_flip_layer dd aimg_flip_layer - img_rotate dd aimg_rotate - img_rotate_layer dd aimg_rotate_layer - img_draw dd aimg_draw - - dd 0,0 - alib_init1 db 'lib_init',0 - aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение - aimg_info db 'img_info',0 - aimg_from_file db 'img_from_file',0 - aimg_to_file db 'img_to_file',0 - aimg_from_rgb db 'img_from_rgb',0 - aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB - aimg_to_rgb2 db 'img_to_rgb2',0 - aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных - aimg_encode db 'img_encode',0 - aimg_create db 'img_create',0 - aimg_destroy db 'img_destroy',0 - aimg_destroy_layer db 'img_destroy_layer',0 - aimg_count db 'img_count',0 - aimg_lock_bits db 'img_lock_bits',0 - aimg_unlock_bits db 'img_unlock_bits',0 - aimg_flip db 'img_flip',0 - aimg_flip_layer db 'img_flip_layer',0 - aimg_rotate db 'img_rotate',0 - aimg_rotate_layer db 'img_rotate_layer',0 - aimg_draw db 'img_draw',0 - -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_resize dd sz_buf2d_resize - buf2d_line dd sz_buf2d_line - buf2d_rect_by_size dd sz_buf2d_rect_by_size - buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - buf2d_crop_color dd sz_buf2d_crop_color - buf2d_offset_h dd sz_buf2d_offset_h - buf2d_flood_fill dd sz_buf2d_flood_fill - buf2d_set_pixel dd sz_buf2d_set_pixel - - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_resize db 'buf2d_resize',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - sz_buf2d_circle db 'buf2d_circle',0 - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - sz_buf2d_flood_fill db 'buf2d_flood_fill',0 - sz_buf2d_set_pixel db 'buf2d_set_pixel',0 - -i_end: - rb 1024 -stacktop: - cur_dir_path rb 4096 - file_name: - rb 4096 - plugin_path: - rb 4096 - openfile_path: - rb 4096 - filename_area: - rb 256 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../KOSfuncs.inc' +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +IMAGE_FILE1_SIZE equ 128*144*3 ;размер файла с изображением 128 x 144 + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0x0 + else + copy_path path,[32],file_name,0x0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall [img_decode], [buf],ebx,0 + mov [image_data],eax + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2], [image_data],[buf] + ;удаляем временный буфер image_data + stdcall [img_destroy], [image_data] + @@: +} + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась наша либа + mov ebp,lib0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + mov ebp,lib1 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall -1 ;exit not correct + @@: + + mcall 40,0x27 + mcall 48,3,sc,sizeof.system_colors ;получаем системные цвета + + stdcall [buf2d_create], buf_0 ;создаем буфер + + load_image_file 'font8x9.bmp', image_data_foto,IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_1,[image_data_foto] ;создаем буфер + stdcall mem.Free,[image_data_foto] ;освобождаем память + + stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит + stdcall [buf2d_bit_blt_alpha], buf_0, 70,10, buf_1,0x20d020 ;рисуем исходную текстовую матрицу 16*16 + stdcall [buf2d_convert_text_matrix], buf_1 + stdcall [buf2d_bit_blt_alpha], buf_0, 10,10, buf_1,0xff8080 ;рисуем преобразованную текстовую матрицу 1*256 + stdcall [buf2d_draw_text], buf_0, buf_1,some_text,70,170,0x4040ff ;рисуем строку с текстом + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + mcall 10 + + cmp al,0x1 ;изменилось положение окна + jz red_win + cmp al,0x2 + jz key + cmp al,0x3 + jz button + + jmp still + +align 4 +key: + push eax ebx + mcall 2 +;... + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall 12,1 + + mov edx,[sc.work] + or edx,0x33000000 + mcall 0,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна + + stdcall [buf2d_draw], buf_0 + + mcall 12,2 + popad + ret + + +system_dir0 db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 + +system_dir1 db '/sys/lib/' +name_libimg db 'libimg.obj',0 + +;library structures +l_libs_start: + lib0 l_libs name_buf2d, file_name, system_dir0, import_buf2d_lib + lib1 l_libs name_libimg, file_name, system_dir1, import_libimg +load_lib_end: + +align 4 +button: + mcall 17 ;получить код нажатой кнопки + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + mcall -1 ;выход из программы + +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit +image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb +image_data_foto dd 0 + +run_file_70 FileInfoBlock +caption db 'Draw text 13.09.11',0 ;подпись окна +sc system_colors ;системные цвета + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 5 ;+6 top + dd 640 ;+8 w + dd 480 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 25 ;+4 left + dw 25 ;+6 top + dd 128 ;+8 w + dd 144 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +some_text db 'Пример вывода теста в буфер, возможен вывод:',13,13 +db ' * в несколько строк',13 +db ' * можно задавать цвет текста',13,13 +db 'Сегодня 13 сентября 2011.',0 + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +i_end: + rb 1024 +stacktop: + cur_dir_path rb 4096 + file_name: + rb 4096 + plugin_path: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm b/programs/develop/libraries/buf2d/examples/e4_graf_ed.asm similarity index 92% rename from programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm rename to programs/develop/libraries/buf2d/examples/e4_graf_ed.asm index ffc56dccd..a4b160e38 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e4_graf_ed.asm +++ b/programs/develop/libraries/buf2d/examples/e4_graf_ed.asm @@ -1,178 +1,183 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../KOSfuncs.inc' -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load - -buf2d_l equ word[edi+4] ;юЄёЄєя ёыхтр -buf2d_t equ word[edi+6] ;юЄёЄєя ётхЁїє - -align 4 -start: - load_library lib0_name, library_path, system_path, import_buf2d_lib - cmp eax,-1 - jz button.exit - - mcall SF_SET_EVENTS_MASK, 0x27 - mcall SF_STYLE_SETTINGS, SSF_GET_COLORS,sc,sizeof.system_colors ;яюыєўрхь ёшёЄхьэ√х ЎтхЄр - stdcall [buf2d_create], buf_0 ;ёючфрхь сєЇхЁ - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - cmp al,1 ;шчь. яюыюцхэшх юъэр - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 - jz mouse - jmp still - -align 4 -draw_window: - pushad - mcall SF_REDRAW, SSF_BEGIN_DRAW - - mov edx,[sc.work] - or edx,0x33000000 - mcall SF_CREATE_WINDOW, (50 shl 16)+500,(30 shl 16)+370,,,caption - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW, SSF_END_DRAW - popad - ret - -align 4 -key: - mcall SF_GET_KEY -; cmp ah,27 ;Esc -; je button.exit - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;єфры хь сєЇхЁ - mcall SF_TERMINATE_PROCESS - -align 4 -mouse: - ;юсЁрсрЄ√трхь юъэю ЁхфръЄюЁр - mcall SF_MOUSE_GET, SSF_BUTTON ;get mouse buttons - cmp al,1 - jne @f - mcall SF_MOUSE_GET, SSF_WINDOW_POSITION ;get mouse coords - mov ebx,eax - shr ebx,16 ;т eax ъююЁфшэрЄр ьш°ш яю юёш 'x' - and eax,0xffff ;т eax ъююЁфшэрЄр ьш°ш яю юёш 'y' - mov edi,buf_0 - sub ax,buf2d_t ;ёфтшурхь ъююЁфшэрЄ√ єўшЄ√тр  ёьх∙хэшх сєЇхЁр - sub bx,buf2d_l - - ;Ёшёютрэшх яЁш эрцрЄшш - ;stdcall [buf2d_circle], edi, ebx, eax, 20, 0xff0000 ;Ёшёєхь юъЁєцэюёЄ№ - ;stdcall [buf2d_flood_fill], edi, ebx, eax, 0, 0xff,0xff0000 ;чрыштър ЎтхЄюь - sub eax,5 - sub ebx,5 - stdcall [buf2d_filled_rect_by_size], edi, ebx,eax, 10,10, 0xff0000 ;Ёшёєхь яЁ ьюєуюы№эшъ - stdcall [buf2d_draw], edi ;юсэюты хь ¤ъЁрэ - @@: - jmp still - -caption db 'Press left mouse button',0 -sc system_colors ;ёшёЄхьэ√х ЎтхЄр - -;-------------------------------------------------- -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_resize dd sz_buf2d_resize - buf2d_line dd sz_buf2d_line - buf2d_rect_by_size dd sz_buf2d_rect_by_size - buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - buf2d_crop_color dd sz_buf2d_crop_color - buf2d_offset_h dd sz_buf2d_offset_h - buf2d_flood_fill dd sz_buf2d_flood_fill - buf2d_set_pixel dd sz_buf2d_set_pixel - - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_resize db 'buf2d_resize',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - sz_buf2d_circle db 'buf2d_circle',0 - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - sz_buf2d_crop_color db 'buf2d_crop_color',0 - sz_buf2d_offset_h db 'buf2d_offset_h',0 - sz_buf2d_flood_fill db 'buf2d_flood_fill',0 - sz_buf2d_set_pixel db 'buf2d_set_pixel',0 - -align 4 -buf_0: - dd 0 ;єърчрЄхы№ эр сєЇхЁ шчюсЁрцхэш  - dw 5 ;+4 left - dw 5 ;+6 top - dd 480 ;+8 w - dd 320 ;+12 h -.color: dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -;-------------------------------------------------- -system_path db '/sys/lib/' -lib0_name db 'buf2d.obj',0 -;-------------------------------------------------- - -i_end: ;ъюэхЎ ъюфр - rb 2*4096 -stacktop: - cur_dir_path rb 4096 - library_path rb 4096 -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../KOSfuncs.inc' +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +buf2d_l equ word[edi+4] ;юЄёЄєя ёыхтр +buf2d_t equ word[edi+6] ;юЄёЄєя ётхЁїє + +align 4 +start: + load_library lib0_name, library_path, system_path, import_buf2d_lib + cmp eax,-1 + jz button.exit + + mcall SF_SET_EVENTS_MASK, 0x27 + mcall SF_STYLE_SETTINGS, SSF_GET_COLORS,sc,sizeof.system_colors ;яюыєўрхь ёшёЄхьэ√х ЎтхЄр + stdcall [buf2d_create], buf_0 ;ёючфрхь сєЇхЁ + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 ;шчь. яюыюцхэшх юъэр + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jz mouse + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW, SSF_BEGIN_DRAW + + mov edx,[sc.work] + or edx,0x33000000 + mcall SF_CREATE_WINDOW, (50 shl 16)+500,(30 shl 16)+370,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW, SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY +; cmp ah,27 ;Esc +; je button.exit + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;єфры хь сєЇхЁ + mcall SF_TERMINATE_PROCESS + +align 4 +mouse: + ;юсЁрсрЄ√трхь юъэю ЁхфръЄюЁр + mcall SF_MOUSE_GET, SSF_BUTTON ;get mouse buttons + cmp al,1 + jne @f + mcall SF_MOUSE_GET, SSF_WINDOW_POSITION ;get mouse coords + mov ebx,eax + shr ebx,16 ;т eax ъююЁфшэрЄр ьш°ш яю юёш 'x' + and eax,0xffff ;т eax ъююЁфшэрЄр ьш°ш яю юёш 'y' + mov edi,buf_0 + sub ax,buf2d_t ;ёфтшурхь ъююЁфшэрЄ√ єўшЄ√тр  ёьх∙хэшх сєЇхЁр + sub bx,buf2d_l + + ;Ёшёютрэшх яЁш эрцрЄшш + ;stdcall [buf2d_circle], edi, ebx, eax, 20, 0xff0000 ;Ёшёєхь юъЁєцэюёЄ№ + ;stdcall [buf2d_flood_fill], edi, ebx, eax, 0, 0xff,0xff0000 ;чрыштър ЎтхЄюь + sub eax,5 + sub ebx,5 + stdcall [buf2d_filled_rect_by_size], edi, ebx,eax, 10,10, 0xff0000 ;Ёшёєхь яЁ ьюєуюы№эшъ + stdcall [buf2d_draw], edi ;юсэюты хь ¤ъЁрэ + @@: + jmp still + +caption db 'Press left mouse button',0 +sc system_colors ;ёшёЄхьэ√х ЎтхЄр + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_resize dd sz_buf2d_resize + buf2d_line dd sz_buf2d_line + buf2d_rect_by_size dd sz_buf2d_rect_by_size + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + buf2d_crop_color dd sz_buf2d_crop_color + buf2d_offset_h dd sz_buf2d_offset_h + buf2d_flood_fill dd sz_buf2d_flood_fill + buf2d_set_pixel dd sz_buf2d_set_pixel + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_resize db 'buf2d_resize',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + sz_buf2d_crop_color db 'buf2d_crop_color',0 + sz_buf2d_offset_h db 'buf2d_offset_h',0 + sz_buf2d_flood_fill db 'buf2d_flood_fill',0 + sz_buf2d_set_pixel db 'buf2d_set_pixel',0 + +align 4 +buf_0: + dd 0 ;єърчрЄхы№ эр сєЇхЁ шчюсЁрцхэш  + dw 5 ;+4 left + dw 5 ;+6 top + dd 480 ;+8 w + dd 320 ;+12 h +.color: dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +lib0_name db 'buf2d.obj',0 +;-------------------------------------------------- + +i_end: ;ъюэхЎ ъюфр + rb 2*4096 +stacktop: + cur_dir_path rb 4096 + library_path rb 4096 +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e5_lines_sm.asm b/programs/develop/libraries/buf2d/examples/e5_lines_sm.asm similarity index 92% rename from programs/develop/libraries/buf2d/trunk/examples/e5_lines_sm.asm rename to programs/develop/libraries/buf2d/examples/e5_lines_sm.asm index 5e06ba086..9ac6d2e2e 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e5_lines_sm.asm +++ b/programs/develop/libraries/buf2d/examples/e5_lines_sm.asm @@ -1,182 +1,187 @@ -use32 - org 0 - db 'MENUET01' - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../KOSfuncs.inc' -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load - -buf2d_l equ word[edi+4] ;отступ слева -buf2d_t equ word[edi+6] ;отступ сверху -buf2d_w equ dword[edi+8] -buf2d_h equ dword[edi+12] -buf2d_color equ dword[edi+16] ;цвет фона буфера - -align 4 -start: - load_library lib0_name, library_path, system_path, import_buf2d_lib - cmp eax,-1 - jz button.exit - - mcall SF_SET_EVENTS_MASK,0xC0000027 - stdcall [buf2d_create], buf_0 ;создаем буфер - ;рисуем первоначальный кадр - stdcall [buf2d_filled_rect_by_size], buf_0, 100-50,70-25, 100,50, 0xffffff ;рисуем прямоугольник - stdcall [buf2d_line], buf_0, 10,10, 100,75, 0xff0000 ;рисуем простую линию - stdcall [buf2d_line_sm], buf_0, 100,75, 190,140, 0xff0000 ;рисуем сглаженную линию - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - cmp al,1 ;изменилось положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - cmp al,6 - jz mouse - jmp still - -align 4 -draw_window: - pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - ;mov edx,0x32000000 - mov edx,0x33000000 - mcall SF_CREATE_WINDOW,(50 shl 16)+330,(30 shl 16)+275,,,caption - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW - popad - ret - -align 4 -key: - mcall SF_GET_KEY - - cmp ah,27 ;Esc - je button.exit - - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - mcall SF_TERMINATE_PROCESS - -align 4 -mouse: - ;обрабатываем окно редактора - mcall SF_MOUSE_GET,SSF_BUTTON - cmp al,1 - jne @f - mcall SF_MOUSE_GET,SSF_WINDOW_POSITION - mov ebx,eax - shr ebx,16 ;в eax координата миши по оси 'x' - and eax,0xffff ;в eax координата миши по оси 'y' - mov edi,buf_0 - sub ax,buf2d_t ;сдвигаем координаты учитывая смещение буфера - cmp eax,buf2d_h - jge @f - sub bx,buf2d_l - cmp ebx,buf2d_w - jge @f - - ;рисование при нажатии - stdcall [buf2d_clear], edi, buf2d_color ;очищаем экран от предыдущих рисований - stdcall [buf2d_filled_rect_by_size], edi, 100-50,70-25, 100,50, 0xffffff ;рисуем прямоугольник - - stdcall [buf2d_line], edi, 10,10, ebx,eax, 0xff0000 ;рисуем простую линию - stdcall [buf2d_line_sm], edi, 190,140, ebx,eax, 0xff0000 ;рисуем сглаженную линию - stdcall [buf2d_draw], edi ;обновляем экран - @@: - jmp still - -caption db 'Press left mouse button, [Esc] - exit',0 - -;-------------------------------------------------- -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_line dd sz_buf2d_line - buf2d_line_sm dd sz_buf2d_line_sm - buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size - buf2d_circle dd sz_buf2d_circle - buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 - buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 - buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 - buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 - buf2d_bit_blt dd sz_buf2d_bit_blt - buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp - buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha - buf2d_curve_bezier dd sz_buf2d_curve_bezier - buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix - buf2d_draw_text dd sz_buf2d_draw_text - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_line db 'buf2d_line',0 - sz_buf2d_line_sm db 'buf2d_line_sm',0 - sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 - sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности - sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 - sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 - sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 - sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 - sz_buf2d_bit_blt db 'buf2d_bit_blt',0 - sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 - sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 - sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 - sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 - sz_buf2d_draw_text db 'buf2d_draw_text',0 - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 20 ;+4 left - dw 10 ;+6 top - dd 200 ;+8 w - dd 150 ;+12 h - dd 0x80 ;+16 color - db 24 ;+20 bit in pixel - -;-------------------------------------------------- -system_path db '/sys/lib/' -lib0_name db 'buf2d.obj',0 -;-------------------------------------------------- - -align 16 -i_end: ;конец кода - rb 1024 -stacktop: -cur_dir_path: - rb 4096 -library_path: - rb 4096 -mem: - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../KOSfuncs.inc' +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +buf2d_l equ word[edi+4] ;отступ слева +buf2d_t equ word[edi+6] ;отступ сверху +buf2d_w equ dword[edi+8] +buf2d_h equ dword[edi+12] +buf2d_color equ dword[edi+16] ;цвет фона буфера + +align 4 +start: + load_library lib0_name, library_path, system_path, import_buf2d_lib + cmp eax,-1 + jz button.exit + + mcall SF_SET_EVENTS_MASK,0xC0000027 + stdcall [buf2d_create], buf_0 ;создаем буфер + ;рисуем первоначальный кадр + stdcall [buf2d_filled_rect_by_size], buf_0, 100-50,70-25, 100,50, 0xffffff ;рисуем прямоугольник + stdcall [buf2d_line], buf_0, 10,10, 100,75, 0xff0000 ;рисуем простую линию + stdcall [buf2d_line_sm], buf_0, 100,75, 190,140, 0xff0000 ;рисуем сглаженную линию + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + cmp al,6 + jz mouse + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + ;mov edx,0x32000000 + mov edx,0x33000000 + mcall SF_CREATE_WINDOW,(50 shl 16)+330,(30 shl 16)+275,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + mcall SF_TERMINATE_PROCESS + +align 4 +mouse: + ;обрабатываем окно редактора + mcall SF_MOUSE_GET,SSF_BUTTON + cmp al,1 + jne @f + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION + mov ebx,eax + shr ebx,16 ;в eax координата миши по оси 'x' + and eax,0xffff ;в eax координата миши по оси 'y' + mov edi,buf_0 + sub ax,buf2d_t ;сдвигаем координаты учитывая смещение буфера + cmp eax,buf2d_h + jge @f + sub bx,buf2d_l + cmp ebx,buf2d_w + jge @f + + ;рисование при нажатии + stdcall [buf2d_clear], edi, buf2d_color ;очищаем экран от предыдущих рисований + stdcall [buf2d_filled_rect_by_size], edi, 100-50,70-25, 100,50, 0xffffff ;рисуем прямоугольник + + stdcall [buf2d_line], edi, 10,10, ebx,eax, 0xff0000 ;рисуем простую линию + stdcall [buf2d_line_sm], edi, 190,140, ebx,eax, 0xff0000 ;рисуем сглаженную линию + stdcall [buf2d_draw], edi ;обновляем экран + @@: + jmp still + +caption db 'Press left mouse button, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_line dd sz_buf2d_line + buf2d_line_sm dd sz_buf2d_line_sm + buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size + buf2d_circle dd sz_buf2d_circle + buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2 + buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2 + buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8 + buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32 + buf2d_bit_blt dd sz_buf2d_bit_blt + buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp + buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha + buf2d_curve_bezier dd sz_buf2d_curve_bezier + buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix + buf2d_draw_text dd sz_buf2d_draw_text + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_line db 'buf2d_line',0 + sz_buf2d_line_sm db 'buf2d_line_sm',0 + sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0 + sz_buf2d_circle db 'buf2d_circle',0 ;рисование окружности + sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0 + sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0 + sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0 + sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0 + sz_buf2d_bit_blt db 'buf2d_bit_blt',0 + sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0 + sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0 + sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0 + sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0 + sz_buf2d_draw_text db 'buf2d_draw_text',0 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 10 ;+6 top + dd 200 ;+8 w + dd 150 ;+12 h + dd 0x80 ;+16 color + db 24 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +lib0_name db 'buf2d.obj',0 +;-------------------------------------------------- + +align 16 +i_end: ;конец кода + rb 1024 +stacktop: +cur_dir_path: + rb 4096 +library_path: + rb 4096 +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm b/programs/develop/libraries/buf2d/examples/e6_vox_1g.asm similarity index 92% rename from programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm rename to programs/develop/libraries/buf2d/examples/e6_vox_1g.asm index 1be31471a..da8fa1412 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e6_vox_1g.asm +++ b/programs/develop/libraries/buf2d/examples/e6_vox_1g.asm @@ -1,219 +1,224 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../KOSfuncs.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - -max_open_file_size equ 64*1024 ;64 Kb - -align 4 -open_file_vox dd 0 ;указатель на область для открытия файлов -run_file_70 FileInfoBlock -f_name db 'vaz2106.vox',0 - -vox_offs_tree_table equ 4 - -;поворот объекта на 90 градусов -;x0y0 - x1y0 -;x1y0 - x1y1 -;x0y1 - x0y0 -;x1y1 - x0y1 -align 4 -proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword - mov ebx,[v_obj] - add ebx,vox_offs_tree_table - mov ecx,2 - cld - @@: - mov eax,dword[ebx] - mov byte[ebx+1],al - mov byte[ebx+3],ah - shr eax,16 - mov byte[ebx],al - mov byte[ebx+2],ah - add ebx,4 - loop @b - ret -endp - - - -align 4 -start: - load_library name_buf2d, library_path, system_path, import_buf2d_lib - cmp eax,-1 - jz button.exit - - mcall SF_SET_EVENTS_MASK,0x27 - stdcall [buf2d_create], buf_0 ;создаем буфер - stdcall [buf2d_create], buf_z - - stdcall mem.Alloc,max_open_file_size - mov dword[open_file_vox],eax - - copy_path f_name,[32],file_name,0 - - mov eax,70 ;70-я функция работа с файлами - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], max_open_file_size - m2m [run_file_70.Buffer], [open_file_vox] - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем воксельный объект - - stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 0,0, 7 - stdcall vox_obj_rot_z, [open_file_vox] - stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 128,0, 7 - stdcall vox_obj_rot_z, [open_file_vox] - stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 0,128, 7 - stdcall vox_obj_rot_z, [open_file_vox] - stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 128,128, 7 - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - cmp al,1 ;изменилось положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - jmp still - -align 4 -draw_window: - pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - mov edx,0x33000000 - mcall SF_CREATE_WINDOW,(50 shl 16)+330,(30 shl 16)+295,,,caption - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW,SSF_END_DRAW - popad - ret - -align 4 -key: - mcall SF_GET_KEY - - cmp ah,27 ;Esc - je button.exit - - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - stdcall [buf2d_delete],buf_z - stdcall mem.Free,[open_file_vox] - mcall SF_TERMINATE_PROCESS - -caption db 'Test buf2d library, [Esc] - exit',0 - -;-------------------------------------------------- -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - - ;воксельные функции: - ;buf2d_vox_brush_create dd sz_buf2d_vox_brush_create - ;buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete - buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g - ;buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g - ;buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g - ;buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g - ;buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled - ;buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows - ;buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl - ;buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled - - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - - ;воксельные функции: - ;sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 - ;sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 - sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 - ;sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 - ;sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 - ;sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 - ;sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 - ;sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 - ;sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 - ;sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 20 ;+4 left - dw 5 ;+6 top - dd 256 ;+8 w - dd 256 ;+12 h - dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_z: - dd 0 ;указатель на буфер изображения - dw 20 ;+4 left - dw 5 ;+6 top - dd 256 ;+8 w - dd 256 ;+12 h - dd 0 ;+16 color - db 32 ;+20 bit in pixel - -;-------------------------------------------------- -system_path db '/sys/lib/' -name_buf2d db 'buf2d.obj',0 -;-------------------------------------------------- - -align 16 -i_end: ;конец кода -file_name: - rb 4096 -cur_dir_path: - rb 4096 -library_path: - rb 4096 - rb 1024 -stacktop: -mem: - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +max_open_file_size equ 64*1024 ;64 Kb + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов +run_file_70 FileInfoBlock +f_name db 'vaz2106.vox',0 + +vox_offs_tree_table equ 4 + +;поворот объекта на 90 градусов +;x0y0 - x1y0 +;x1y0 - x1y1 +;x0y1 - x0y0 +;x1y1 - x0y1 +align 4 +proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword + mov ebx,[v_obj] + add ebx,vox_offs_tree_table + mov ecx,2 + cld + @@: + mov eax,dword[ebx] + mov byte[ebx+1],al + mov byte[ebx+3],ah + shr eax,16 + mov byte[ebx],al + mov byte[ebx+2],ah + add ebx,4 + loop @b + ret +endp + + + +align 4 +start: + load_library name_buf2d, library_path, system_path, import_buf2d_lib + cmp eax,-1 + jz button.exit + + mcall SF_SET_EVENTS_MASK,0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_create], buf_z + + stdcall mem.Alloc,max_open_file_size + mov dword[open_file_vox],eax + + copy_path f_name,[32],file_name,0 + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], max_open_file_size + m2m [run_file_70.Buffer], [open_file_vox] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем воксельный объект + + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 0,0, 7 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 128,0, 7 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 0,128, 7 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_1g], buf_0, buf_z, [open_file_vox], 128,128, 7 + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + mov edx,0x33000000 + mcall SF_CREATE_WINDOW,(50 shl 16)+330,(30 shl 16)+295,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW,SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_z + stdcall mem.Free,[open_file_vox] + mcall SF_TERMINATE_PROCESS + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + + ;воксельные функции: + ;buf2d_vox_brush_create dd sz_buf2d_vox_brush_create + ;buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g + ;buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g + ;buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g + ;buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g + ;buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled + ;buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows + ;buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl + ;buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + + ;воксельные функции: + ;sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 + ;sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 + ;sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + ;sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + ;sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + ;sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + ;sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 + ;sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + ;sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 5 ;+6 top + dd 256 ;+8 w + dd 256 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_z: + dd 0 ;указатель на буфер изображения + dw 20 ;+4 left + dw 5 ;+6 top + dd 256 ;+8 w + dd 256 ;+12 h + dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;-------------------------------------------------- +system_path db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 +;-------------------------------------------------- + +align 16 +i_end: ;конец кода +file_name: + rb 4096 +cur_dir_path: + rb 4096 +library_path: + rb 4096 + rb 1024 +stacktop: +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm b/programs/develop/libraries/buf2d/examples/e7_vox_3g.asm similarity index 92% rename from programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm rename to programs/develop/libraries/buf2d/examples/e7_vox_3g.asm index d4001a282..3c978abb8 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e7_vox_3g.asm +++ b/programs/develop/libraries/buf2d/examples/e7_vox_3g.asm @@ -1,240 +1,244 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1,start,i_end,mem,stacktop,0,cur_dir_path - -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../KOSfuncs.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - -max_open_file_size equ 64*1024 ;64 Kb - -align 4 -open_file_vox dd 0 ;указатель на область для открытия файлов -run_file_70 FileInfoBlock -f_name db 'vaz2106.vox',0 - -BUF_STRUCT_SIZE equ 21 -vox_offs_tree_table equ 4 - -;поворот объекта на 90 градусов -;x0y0 - x1y0 -;x1y0 - x1y1 -;x0y1 - x0y0 -;x1y1 - x0y1 -align 4 -proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword - mov ebx,[v_obj] - add ebx,vox_offs_tree_table - mov ecx,2 - cld - @@: - mov eax,dword[ebx] - mov byte[ebx+1],al - mov byte[ebx+3],ah - shr eax,16 - mov byte[ebx],al - mov byte[ebx+2],ah - add ebx,4 - loop @b - ret -endp - - - -align 4 -start: - load_library name_buf2d, library_path, system_path, import_buf2d_lib - cmp eax,-1 - jz button.exit - - mcall SF_SET_EVENTS_MASK, 0x27 - stdcall [buf2d_create], buf_0 ;создаем буфер - stdcall [buf2d_create], buf_z - stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z ;создаем воксельную кисть - - stdcall mem.Alloc,max_open_file_size - mov [open_file_vox],eax - - copy_path f_name,[32],file_name,0 - - mov eax,SF_FILE - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov dword[run_file_70.Count], max_open_file_size - m2m [run_file_70.Buffer], [open_file_vox] - mov byte[run_file_70+20], 0 - mov dword[run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем воксельный объект - - stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox,\ - [open_file_vox], 0,0, 0, 6 ;рисуем воксельный объект - stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_z, buf_vox,\ - 0,0, 0, 6, 3 ;рисуем тени - - stdcall vox_obj_rot_z, [open_file_vox] ;поворачиваем - stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 0,0, 0, 5 - stdcall vox_obj_rot_z, [open_file_vox] - stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 100,0, 0, 5 - stdcall vox_obj_rot_z, [open_file_vox] - stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 200,0, 0, 5 - -align 4 -red_win: - call draw_window - -align 4 -still: - mcall SF_WAIT_EVENT - cmp al,1 ;изменилось положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - jmp still - -align 4 -draw_window: - pushad - mcall SF_REDRAW, SSF_BEGIN_DRAW - - mov edx,0x33000000 - mcall SF_CREATE_WINDOW, (50 shl 16)+410,(30 shl 16)+480,,,caption - - stdcall [buf2d_draw], buf_0 - - mcall SF_REDRAW, SSF_END_DRAW - popad - ret - -align 4 -key: - mcall SF_GET_KEY - - cmp ah,27 ;Esc - je button.exit - - jmp still - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - stdcall [buf2d_delete],buf_z - stdcall [buf2d_vox_brush_delete],buf_vox - stdcall mem.Free,[open_file_vox] - mcall SF_TERMINATE_PROCESS - -caption db 'Test buf2d library, [Esc] - exit',0 - -;-------------------------------------------------- -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - - ;воксельные функции: - buf2d_vox_brush_create dd sz_buf2d_vox_brush_create - buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete - ;buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g - ;buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g - ;buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g - buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g - ;buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled - buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows - ;buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl - ;buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled - - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - - ;воксельные функции: - sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 - sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 - ;sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 - ;sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 - ;sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 - sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 - ;sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 - sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 - ;sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 - ;sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 - -align 4 -buf_0: ;буфер основного изображения - dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 3 ;+6 top - dd 6*64 ;+8 w - dd 7*64 ;+12 h - dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_z: ;буфер глубины - dd 0 ;указатель на буфер изображения - dw 0 ;+4 left - dw 0 ;+6 top - dd 6*64 ;+8 w - dd 7*64 ;+12 h - dd 0 ;+16 color - db 32 ;+20 bit in pixel - -;данные для создания минимального единичного вокселя -align 4 -vox_6_7_z: -dd 0,0,1,1,0,0,\ - 0,2,2,2,2,0,\ - 2,2,2,2,2,2,\ - 2,3,2,2,3,2,\ - 2,3,3,3,3,2,\ - 0,3,3,3,3,0,\ - 0,0,3,3,0,0 - -align 4 -buf_vox: - db 6,7,4,3 ;w,h,h_osn,n - rb BUF_STRUCT_SIZE*(2+1) - -;-------------------------------------------------- -system_path db '/sys/lib/' -name_buf2d db 'buf2d.obj',0 -;-------------------------------------------------- - -align 16 -i_end: ;конец кода -file_name rb 4096 -cur_dir_path rb 4096 -library_path rb 4096 - rb 1024 -stacktop: -mem: - - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 1,start,i_end,mem,stacktop,0,cur_dir_path + +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, 0 ;dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +max_open_file_size equ 64*1024 ;64 Kb + +align 4 +open_file_vox dd 0 ;указатель на область для открытия файлов +run_file_70 FileInfoBlock +f_name db 'vaz2106.vox',0 + +BUF_STRUCT_SIZE equ 21 +vox_offs_tree_table equ 4 + +;поворот объекта на 90 градусов +;x0y0 - x1y0 +;x1y0 - x1y1 +;x0y1 - x0y0 +;x1y1 - x0y1 +align 4 +proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword + mov ebx,[v_obj] + add ebx,vox_offs_tree_table + mov ecx,2 + cld + @@: + mov eax,dword[ebx] + mov byte[ebx+1],al + mov byte[ebx+3],ah + shr eax,16 + mov byte[ebx],al + mov byte[ebx+2],ah + add ebx,4 + loop @b + ret +endp + + + +align 4 +start: + load_library name_buf2d, library_path, system_path, import_buf2d_lib + cmp eax,-1 + jz button.exit + + mcall SF_SET_EVENTS_MASK, 0x27 + stdcall [buf2d_create], buf_0 ;создаем буфер + stdcall [buf2d_create], buf_z + stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z ;создаем воксельную кисть + + stdcall mem.Alloc,max_open_file_size + mov [open_file_vox],eax + + copy_path f_name,[32],file_name,0 + + mov eax,SF_FILE + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov dword[run_file_70.Count], max_open_file_size + m2m [run_file_70.Buffer], [open_file_vox] + mov byte[run_file_70+20], 0 + mov dword[run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем воксельный объект + + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox,\ + [open_file_vox], 0,0, 0, 6 ;рисуем воксельный объект + stdcall [buf2d_vox_obj_draw_3g_shadows], buf_0, buf_z, buf_vox,\ + 0,0, 0, 6, 3 ;рисуем тени + + stdcall vox_obj_rot_z, [open_file_vox] ;поворачиваем + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 0,0, 0, 5 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 100,0, 0, 5 + stdcall vox_obj_rot_z, [open_file_vox] + stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_z, buf_vox, [open_file_vox], 200,0, 0, 5 + +align 4 +red_win: + call draw_window + +align 4 +still: + mcall SF_WAIT_EVENT + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + jmp still + +align 4 +draw_window: + pushad + mcall SF_REDRAW, SSF_BEGIN_DRAW + + mov edx,0x33000000 + mcall SF_CREATE_WINDOW, (50 shl 16)+410,(30 shl 16)+480,,,caption + + stdcall [buf2d_draw], buf_0 + + mcall SF_REDRAW, SSF_END_DRAW + popad + ret + +align 4 +key: + mcall SF_GET_KEY + + cmp ah,27 ;Esc + je button.exit + + jmp still + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_z + stdcall [buf2d_vox_brush_delete],buf_vox + stdcall mem.Free,[open_file_vox] + mcall SF_TERMINATE_PROCESS + +caption db 'Test buf2d library, [Esc] - exit',0 + +;-------------------------------------------------- +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + + ;воксельные функции: + buf2d_vox_brush_create dd sz_buf2d_vox_brush_create + buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete + ;buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g + ;buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g + ;buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g + buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g + ;buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled + buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows + ;buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl + ;buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled + + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + + ;воксельные функции: + sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0 + sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0 + ;sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0 + ;sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0 + ;sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0 + sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0 + ;sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0 + sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0 + ;sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0 + ;sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0 + +align 4 +buf_0: ;буфер основного изображения + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 3 ;+6 top + dd 6*64 ;+8 w + dd 7*64 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_z: ;буфер глубины + dd 0 ;указатель на буфер изображения + dw 0 ;+4 left + dw 0 ;+6 top + dd 6*64 ;+8 w + dd 7*64 ;+12 h + dd 0 ;+16 color + db 32 ;+20 bit in pixel + +;данные для создания минимального единичного вокселя +align 4 +vox_6_7_z: +dd 0,0,1,1,0,0,\ + 0,2,2,2,2,0,\ + 2,2,2,2,2,2,\ + 2,3,2,2,3,2,\ + 2,3,3,3,3,2,\ + 0,3,3,3,3,0,\ + 0,0,3,3,0,0 + +align 4 +buf_vox: + db 6,7,4,3 ;w,h,h_osn,n + rb BUF_STRUCT_SIZE*(2+1) + +;-------------------------------------------------- +system_path db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 +;-------------------------------------------------- + +align 16 +i_end: ;конец кода +file_name rb 4096 +cur_dir_path rb 4096 +library_path rb 4096 + rb 1024 +stacktop: +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/e8_filters.asm b/programs/develop/libraries/buf2d/examples/e8_filters.asm similarity index 93% rename from programs/develop/libraries/buf2d/trunk/examples/e8_filters.asm rename to programs/develop/libraries/buf2d/examples/e8_filters.asm index 1d29d5629..1a3d11379 100644 --- a/programs/develop/libraries/buf2d/trunk/examples/e8_filters.asm +++ b/programs/develop/libraries/buf2d/examples/e8_filters.asm @@ -1,287 +1,293 @@ -use32 - org 0 - db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт - dd 1,start,i_end,mem,stacktop,0,sys_path - -include '../../../../../macros.inc' -include '../../../../../proc32.inc' -include '../../../../../KOSfuncs.inc' -include '../../../../../load_lib.mac' -include '../../../../../dll.inc' - -@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load - -struct FileInfoBlock - Function dd ? - Position dd ? - Flags dd ? - Count dd ? - Buffer dd ? - db ? - FileName dd ? -ends - -IMAGE_FILE1_SIZE equ 200*186*3 ;размер файла с изображением 200 x 100 - -BUF_STRUCT_SIZE equ 21 -buf2d_data equ dword[edi] ;данные буфера изображения -buf2d_w equ dword[edi+8] ;ширина буфера -buf2d_h equ dword[edi+12] ;высота буфера -buf2d_l equ word[edi+4] -buf2d_t equ word[edi+6] ;отступ сверху -buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера -buf2d_color equ dword[edi+16] ;цвет фона буфера -buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения -vox_offs_tree_table equ 4 - -macro load_image_file path,buf,size { ;макрос для загрузки изображений - ;path - может быть переменной или строковым параметром - if path eqtype '' ;проверяем задан ли строкой параметр path - jmp @f - local .path_str - .path_str db path ;формируем локальную переменную - db 0 - @@: - ;32 - стандартный адрес по которому должен быть буфер с системным путем - copy_path .path_str,[32],file_name,0 - else - copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой - end if - - stdcall mem.Alloc, dword size ;выделяем память для изображения - mov [buf],eax - - mov eax,70 ;70-я функция работа с файлами - mov [run_file_70.Function], 0 - mov [run_file_70.Position], 0 - mov [run_file_70.Flags], 0 - mov [run_file_70.Count], dword size - m2m [run_file_70.Buffer], [buf] - mov byte[run_file_70+20], 0 - mov [run_file_70.FileName], file_name - mov ebx,run_file_70 - int 0x40 ;загружаем файл изображения - cmp ebx,0xffffffff - je @f - ;определяем вид изображения и переводим его во временный буфер image_data - stdcall [img_decode], [buf],ebx,0 - mov [image_data],eax - ;преобразуем изображение к формату rgb - stdcall [img_to_rgb2], [image_data],[buf] - ;удаляем временный буфер image_data - stdcall [img_destroy], [image_data] - @@: -} - -align 4 -start: - load_libraries l_libs_start,load_lib_end - - ;проверка на сколько удачно загузилась наша либа - mov ebp,lib0 - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall SF_TERMINATE_PROCESS - @@: - mov ebp,lib1 - cmp dword [ebp+ll_struc_size-4],0 - jz @f - mcall SF_TERMINATE_PROCESS - @@: - - mcall SF_SET_EVENTS_MASK,0x27 - mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors ;получаем системные цвета - - load_image_file 'img1.png',image_data_rgb, IMAGE_FILE1_SIZE - stdcall [buf2d_create_f_img], buf_0,[image_data_rgb] ;создаем буфер - stdcall [buf2d_create_f_img], buf_1,[image_data_rgb] ;создаем буфер - stdcall [buf2d_create_f_img], buf_2,[image_data_rgb] ;создаем буфер - stdcall mem.Free,[image_data_rgb] ;освобождаем память - - stdcall [buf2d_filter_dither], buf_1,2 - stdcall [buf2d_filter_dither], buf_2,3 - -align 4 -red_win: - call draw_window - -align 4 -still: ;главный цикл - mcall SF_WAIT_EVENT - - cmp al,1 ;изменилось положение окна - jz red_win - cmp al,2 - jz key - cmp al,3 - jz button - - jmp still - -align 4 -key: - push eax ebx - mcall SF_GET_KEY -;... - pop ebx eax - jmp still - - -align 4 -draw_window: - pushad - mcall SF_REDRAW,SSF_BEGIN_DRAW - - mov edx,[sc.work] - or edx,0x33000000 - mcall SF_CREATE_WINDOW,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна - - stdcall [buf2d_draw], buf_0 - stdcall [buf2d_draw], buf_1 - stdcall [buf2d_draw], buf_2 - - mcall SF_REDRAW,SSF_END_DRAW - popad - ret - -system_dir0 db '/sys/lib/' -name_buf2d db 'buf2d.obj',0 - -system_dir1 db '/sys/lib/' -name_libimg db 'libimg.obj',0 - -;library structures -l_libs_start: - lib0 l_libs name_buf2d, file_name, system_dir0, import_buf2d_lib - lib1 l_libs name_libimg, file_name, system_dir1, import_libimg -load_lib_end: - -align 4 -button: - mcall SF_GET_BUTTON - cmp ah,1 - jne still -.exit: - stdcall [buf2d_delete],buf_0 ;удаляем буфер - stdcall [buf2d_delete],buf_1 ;удаляем буфер - stdcall [buf2d_delete],buf_2 ;удаляем буфер - mcall SF_TERMINATE_PROCESS - -image_data dd 0 ;память для преобразования картинки функциями libimg -image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit -image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb -image_data_foto dd 0 - -run_file_70 FileInfoBlock -caption db 'Draw images 28.11.20',0 ;подпись окна -sc system_colors ;системные цвета - -align 4 -buf_0: - dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 5 ;+6 top - dd 200 ;+8 w - dd 186 ;+12 h - dd 0xffffff ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_1: - dd 0 ;указатель на буфер изображения - dw 5 ;+4 left - dw 200 ;+6 top - dd 200 ;+8 w - dd 186 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -buf_2: - dd 0 ;указатель на буфер изображения - dw 210 ;+4 left - dw 200 ;+6 top - dd 200 ;+8 w - dd 186 ;+12 h - dd 0 ;+16 color - db 24 ;+20 bit in pixel - -align 4 -import_libimg: - dd alib_init1 - img_is_img dd aimg_is_img - img_info dd aimg_info - img_from_file dd aimg_from_file - img_to_file dd aimg_to_file - img_from_rgb dd aimg_from_rgb - img_to_rgb dd aimg_to_rgb - img_to_rgb2 dd aimg_to_rgb2 - img_decode dd aimg_decode - img_encode dd aimg_encode - img_create dd aimg_create - img_destroy dd aimg_destroy - img_destroy_layer dd aimg_destroy_layer - img_count dd aimg_count - img_lock_bits dd aimg_lock_bits - img_unlock_bits dd aimg_unlock_bits - img_flip dd aimg_flip - img_flip_layer dd aimg_flip_layer - img_rotate dd aimg_rotate - img_rotate_layer dd aimg_rotate_layer - img_draw dd aimg_draw - - dd 0,0 - alib_init1 db 'lib_init',0 - aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение - aimg_info db 'img_info',0 - aimg_from_file db 'img_from_file',0 - aimg_to_file db 'img_to_file',0 - aimg_from_rgb db 'img_from_rgb',0 - aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB - aimg_to_rgb2 db 'img_to_rgb2',0 - aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных - aimg_encode db 'img_encode',0 - aimg_create db 'img_create',0 - aimg_destroy db 'img_destroy',0 - aimg_destroy_layer db 'img_destroy_layer',0 - aimg_count db 'img_count',0 - aimg_lock_bits db 'img_lock_bits',0 - aimg_unlock_bits db 'img_unlock_bits',0 - aimg_flip db 'img_flip',0 - aimg_flip_layer db 'img_flip_layer',0 - aimg_rotate db 'img_rotate',0 - aimg_rotate_layer db 'img_rotate_layer',0 - aimg_draw db 'img_draw',0 - -align 4 -import_buf2d_lib: - dd sz_lib_init - buf2d_create dd sz_buf2d_create - buf2d_create_f_img dd sz_buf2d_create_f_img - buf2d_clear dd sz_buf2d_clear - buf2d_draw dd sz_buf2d_draw - buf2d_delete dd sz_buf2d_delete - buf2d_filter_dither dd sz_buf2d_filter_dither - dd 0,0 - sz_lib_init db 'lib_init',0 - sz_buf2d_create db 'buf2d_create',0 - sz_buf2d_create_f_img db 'buf2d_create_f_img',0 - sz_buf2d_clear db 'buf2d_clear',0 - sz_buf2d_draw db 'buf2d_draw',0 - sz_buf2d_delete db 'buf2d_delete',0 - sz_buf2d_filter_dither db 'buf2d_filter_dither',0 - -align 16 -i_end: - sys_path rb 4096 - file_name: - rb 4096 - plugin_path: - rb 4096 - openfile_path: - rb 4096 - filename_area: - rb 256 - rb 1024 -stacktop: -mem: +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +use32 + org 0 + db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт + dd 1,start,i_end,mem,stacktop,0,sys_path + +include '../../../../macros.inc' +include '../../../../proc32.inc' +include '../../../../KOSfuncs.inc' +include '../../../../load_lib.mac' +include '../../../../dll.inc' + +@use_library mem.Alloc,mem.Free,mem.ReAlloc, dll.Load + +struct FileInfoBlock + Function dd ? + Position dd ? + Flags dd ? + Count dd ? + Buffer dd ? + db ? + FileName dd ? +ends + +IMAGE_FILE1_SIZE equ 200*186*3 ;размер файла с изображением 200 x 100 + +BUF_STRUCT_SIZE equ 21 +buf2d_data equ dword[edi] ;данные буфера изображения +buf2d_w equ dword[edi+8] ;ширина буфера +buf2d_h equ dword[edi+12] ;высота буфера +buf2d_l equ word[edi+4] +buf2d_t equ word[edi+6] ;отступ сверху +buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера +buf2d_color equ dword[edi+16] ;цвет фона буфера +buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения +vox_offs_tree_table equ 4 + +macro load_image_file path,buf,size { ;макрос для загрузки изображений + ;path - может быть переменной или строковым параметром + if path eqtype '' ;проверяем задан ли строкой параметр path + jmp @f + local .path_str + .path_str db path ;формируем локальную переменную + db 0 + @@: + ;32 - стандартный адрес по которому должен быть буфер с системным путем + copy_path .path_str,[32],file_name,0 + else + copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой + end if + + stdcall mem.Alloc, dword size ;выделяем память для изображения + mov [buf],eax + + mov eax,70 ;70-я функция работа с файлами + mov [run_file_70.Function], 0 + mov [run_file_70.Position], 0 + mov [run_file_70.Flags], 0 + mov [run_file_70.Count], dword size + m2m [run_file_70.Buffer], [buf] + mov byte[run_file_70+20], 0 + mov [run_file_70.FileName], file_name + mov ebx,run_file_70 + int 0x40 ;загружаем файл изображения + cmp ebx,0xffffffff + je @f + ;определяем вид изображения и переводим его во временный буфер image_data + stdcall [img_decode], [buf],ebx,0 + mov [image_data],eax + ;преобразуем изображение к формату rgb + stdcall [img_to_rgb2], [image_data],[buf] + ;удаляем временный буфер image_data + stdcall [img_destroy], [image_data] + @@: +} + +align 4 +start: + load_libraries l_libs_start,load_lib_end + + ;проверка на сколько удачно загузилась наша либа + mov ebp,lib0 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall SF_TERMINATE_PROCESS + @@: + mov ebp,lib1 + cmp dword [ebp+ll_struc_size-4],0 + jz @f + mcall SF_TERMINATE_PROCESS + @@: + + mcall SF_SET_EVENTS_MASK,0x27 + mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors ;получаем системные цвета + + load_image_file 'img1.png',image_data_rgb, IMAGE_FILE1_SIZE + stdcall [buf2d_create_f_img], buf_0,[image_data_rgb] ;создаем буфер + stdcall [buf2d_create_f_img], buf_1,[image_data_rgb] ;создаем буфер + stdcall [buf2d_create_f_img], buf_2,[image_data_rgb] ;создаем буфер + stdcall mem.Free,[image_data_rgb] ;освобождаем память + + stdcall [buf2d_filter_dither], buf_1,2 + stdcall [buf2d_filter_dither], buf_2,3 + +align 4 +red_win: + call draw_window + +align 4 +still: ;главный цикл + mcall SF_WAIT_EVENT + + cmp al,1 ;изменилось положение окна + jz red_win + cmp al,2 + jz key + cmp al,3 + jz button + + jmp still + +align 4 +key: + push eax ebx + mcall SF_GET_KEY +;... + pop ebx eax + jmp still + + +align 4 +draw_window: + pushad + mcall SF_REDRAW,SSF_BEGIN_DRAW + + mov edx,[sc.work] + or edx,0x33000000 + mcall SF_CREATE_WINDOW,(20 shl 16)+670,(20 shl 16)+520,,,caption ;создание окна + + stdcall [buf2d_draw], buf_0 + stdcall [buf2d_draw], buf_1 + stdcall [buf2d_draw], buf_2 + + mcall SF_REDRAW,SSF_END_DRAW + popad + ret + +system_dir0 db '/sys/lib/' +name_buf2d db 'buf2d.obj',0 + +system_dir1 db '/sys/lib/' +name_libimg db 'libimg.obj',0 + +;library structures +l_libs_start: + lib0 l_libs name_buf2d, file_name, system_dir0, import_buf2d_lib + lib1 l_libs name_libimg, file_name, system_dir1, import_libimg +load_lib_end: + +align 4 +button: + mcall SF_GET_BUTTON + cmp ah,1 + jne still +.exit: + stdcall [buf2d_delete],buf_0 ;удаляем буфер + stdcall [buf2d_delete],buf_1 ;удаляем буфер + stdcall [buf2d_delete],buf_2 ;удаляем буфер + mcall SF_TERMINATE_PROCESS + +image_data dd 0 ;память для преобразования картинки функциями libimg +image_data_gray dd 0 ;память с преобразованным изображением в формате 8-bit +image_data_rgb dd 0 ;память с преобразованным изображением в формате rgb +image_data_foto dd 0 + +run_file_70 FileInfoBlock +caption db 'Draw images 28.11.20',0 ;подпись окна +sc system_colors ;системные цвета + +align 4 +buf_0: + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 5 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0xffffff ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_1: + dd 0 ;указатель на буфер изображения + dw 5 ;+4 left + dw 200 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +buf_2: + dd 0 ;указатель на буфер изображения + dw 210 ;+4 left + dw 200 ;+6 top + dd 200 ;+8 w + dd 186 ;+12 h + dd 0 ;+16 color + db 24 ;+20 bit in pixel + +align 4 +import_libimg: + dd alib_init1 + img_is_img dd aimg_is_img + img_info dd aimg_info + img_from_file dd aimg_from_file + img_to_file dd aimg_to_file + img_from_rgb dd aimg_from_rgb + img_to_rgb dd aimg_to_rgb + img_to_rgb2 dd aimg_to_rgb2 + img_decode dd aimg_decode + img_encode dd aimg_encode + img_create dd aimg_create + img_destroy dd aimg_destroy + img_destroy_layer dd aimg_destroy_layer + img_count dd aimg_count + img_lock_bits dd aimg_lock_bits + img_unlock_bits dd aimg_unlock_bits + img_flip dd aimg_flip + img_flip_layer dd aimg_flip_layer + img_rotate dd aimg_rotate + img_rotate_layer dd aimg_rotate_layer + img_draw dd aimg_draw + + dd 0,0 + alib_init1 db 'lib_init',0 + aimg_is_img db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение + aimg_info db 'img_info',0 + aimg_from_file db 'img_from_file',0 + aimg_to_file db 'img_to_file',0 + aimg_from_rgb db 'img_from_rgb',0 + aimg_to_rgb db 'img_to_rgb',0 ;преобразование изображения в данные RGB + aimg_to_rgb2 db 'img_to_rgb2',0 + aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных + aimg_encode db 'img_encode',0 + aimg_create db 'img_create',0 + aimg_destroy db 'img_destroy',0 + aimg_destroy_layer db 'img_destroy_layer',0 + aimg_count db 'img_count',0 + aimg_lock_bits db 'img_lock_bits',0 + aimg_unlock_bits db 'img_unlock_bits',0 + aimg_flip db 'img_flip',0 + aimg_flip_layer db 'img_flip_layer',0 + aimg_rotate db 'img_rotate',0 + aimg_rotate_layer db 'img_rotate_layer',0 + aimg_draw db 'img_draw',0 + +align 4 +import_buf2d_lib: + dd sz_lib_init + buf2d_create dd sz_buf2d_create + buf2d_create_f_img dd sz_buf2d_create_f_img + buf2d_clear dd sz_buf2d_clear + buf2d_draw dd sz_buf2d_draw + buf2d_delete dd sz_buf2d_delete + buf2d_filter_dither dd sz_buf2d_filter_dither + dd 0,0 + sz_lib_init db 'lib_init',0 + sz_buf2d_create db 'buf2d_create',0 + sz_buf2d_create_f_img db 'buf2d_create_f_img',0 + sz_buf2d_clear db 'buf2d_clear',0 + sz_buf2d_draw db 'buf2d_draw',0 + sz_buf2d_delete db 'buf2d_delete',0 + sz_buf2d_filter_dither db 'buf2d_filter_dither',0 + +align 16 +i_end: + sys_path rb 4096 + file_name: + rb 4096 + plugin_path: + rb 4096 + openfile_path: + rb 4096 + filename_area: + rb 256 + rb 1024 +stacktop: +mem: diff --git a/programs/develop/libraries/buf2d/trunk/examples/foto.jpg b/programs/develop/libraries/buf2d/examples/foto.jpg similarity index 100% rename from programs/develop/libraries/buf2d/trunk/examples/foto.jpg rename to programs/develop/libraries/buf2d/examples/foto.jpg diff --git a/programs/develop/libraries/buf2d/trunk/examples/img0.png b/programs/develop/libraries/buf2d/examples/img0.png similarity index 100% rename from programs/develop/libraries/buf2d/trunk/examples/img0.png rename to programs/develop/libraries/buf2d/examples/img0.png diff --git a/programs/develop/libraries/buf2d/trunk/examples/img1.png b/programs/develop/libraries/buf2d/examples/img1.png similarity index 100% rename from programs/develop/libraries/buf2d/trunk/examples/img1.png rename to programs/develop/libraries/buf2d/examples/img1.png diff --git a/programs/develop/libraries/buf2d/trunk/fun_draw.inc b/programs/develop/libraries/buf2d/fun_draw.inc similarity index 100% rename from programs/develop/libraries/buf2d/trunk/fun_draw.inc rename to programs/develop/libraries/buf2d/fun_draw.inc diff --git a/programs/develop/libraries/buf2d/trunk/fun_voxel.inc b/programs/develop/libraries/buf2d/fun_voxel.inc similarity index 100% rename from programs/develop/libraries/buf2d/trunk/fun_voxel.inc rename to programs/develop/libraries/buf2d/fun_voxel.inc diff --git a/programs/develop/libraries/crypt_des/trunk/Tupfile.lua b/programs/develop/libraries/crypt_des/Tupfile.lua similarity index 100% rename from programs/develop/libraries/crypt_des/trunk/Tupfile.lua rename to programs/develop/libraries/crypt_des/Tupfile.lua diff --git a/programs/develop/libraries/crypt_des/trunk/about.htm b/programs/develop/libraries/crypt_des/about.htm similarity index 100% rename from programs/develop/libraries/crypt_des/trunk/about.htm rename to programs/develop/libraries/crypt_des/about.htm diff --git a/programs/develop/libraries/crypt_des/trunk/crypt_des.asm b/programs/develop/libraries/crypt_des/crypt_des.asm similarity index 94% rename from programs/develop/libraries/crypt_des/trunk/crypt_des.asm rename to programs/develop/libraries/crypt_des/crypt_des.asm index 366c0692f..f71ea9947 100644 --- a/programs/develop/libraries/crypt_des/trunk/crypt_des.asm +++ b/programs/develop/libraries/crypt_des/crypt_des.asm @@ -1,460 +1,466 @@ -; -; сшсышюЄхър фы  °шЇЁютрэш  яю рыуюЁшЄьє DES -; - -format MS COFF -public EXPORTS -section '.flat' code readable align 16 - -include '../../../../macros.inc' -include '../../../../proc32.inc' - -;description: -; ЇєэъЎш  °шЇЁютрэш  Їрщыют -;input: -; key - тїюфэющ ъы■ў 64 сшЄ -; mem_keys - ярь Є№ фы  ЇюЁьшЁютрэш  ъы■ўхщ (ЁрчьхЁ 120 срщЄ) -; block - єърчрЄхы№ эр яхЁт√щ °шЇЁєхь√щ 8 срщЄэ√щ сыюъ -; b_count - ўшёыю сыюъют фы  °шЇЁютрэш  -align 4 -proc des_encryption, key:dword, mem_keys:dword, block:dword, b_count:dword -locals - n dd ? ;яхЁхьхээр  Ўшъыр -endl -pushad - stdcall encryption_key, [key],[mem_keys] - - ;эрўры№эр  яхЁхёЄрэютър ip - mov ecx,[b_count] - cmp ecx,1 - jl .end_funct - mov edi,[block] - cld - @@: - mov esi,[mem_keys] - add esi,112 - stdcall fun_convert_bits, edi, esi, oper_ip, 64 - movsd - movsd - loop @b - - mov ecx,[b_count] - mov esi,[block] - ;cld - .cycle_3: - mov dword[n],0 - .funct_f: - mov edi,[mem_keys] - add edi,112 - ;яхЁхёЄрты хь сыюъ R0(32) яю ьрЄЁшЎх e - stdcall fun_convert_bits, esi, edi, oper_e, 48 - - ;edi - R0~e (48 сшЄ) - ;esi - L0R0 (64 сшЄр) - stdcall fun_r0xorki_si, edi,[mem_keys],[n] - - ;edi - (R0~e xor ki)~Si (32 сшЄр) - ;яхЁхёЄрэютър p - mov eax,edi - add eax,4 - stdcall fun_convert_bits, edi, eax, oper_p, 32 - - ;яш°хь R0 т L0, ш (L0 xor (R0~e xor ki)~Si) т R0 - mov edx,dword[esi+4] - mov ebx,dword[esi] - xor edx,dword[eax] - mov dword[esi],edx - mov dword[esi+4],ebx - - inc dword[n] - cmp dword[n],16 - jl .funct_f - - add esi,8 ;яхЁхїюф эр ёыхфє■∙шщ 64 сшЄэ√щ °шЇЁєхь√щ сыюъ - loop .cycle_3 - - ;ъюэхўэр  яхЁхёЄрэютър ip_inv - mov ecx,[b_count] - mov edi,[block] - ;cld - @@: - mov esi,[mem_keys] - add esi,112 - stdcall fun_convert_bits, edi, esi, oper_ip_inv, 64 - movsd - movsd - loop @b - - .end_funct: -popad - ret -endp - -;description: -; ЇєэъЎш  Ёрё°шЇЁютрэш  Їрщыют -;input: -; key - тїюфэющ ъы■ў 64 сшЄ -; mem_keys - ярь Є№ фы  ЇюЁьшЁютрэш  ъы■ўхщ (ЁрчьхЁ 120 срщЄ) -; block - єърчрЄхы№ эр яхЁт√щ Ёрё°шЇЁют√трхь√щ 8 срщЄэ√щ сыюъ -; b_count - ўшёыю сыюъют фы  Ёрё°шЇЁютрэш  -align 4 -proc des_decryption, key:dword, mem_keys:dword, block:dword, b_count:dword -locals - n dd ? ;яхЁхьхээр  Ўшъыр -endl -pushad - stdcall encryption_key, [key],[mem_keys] - - ;эрўры№эр  яхЁхёЄрэютър ip - mov ecx,[b_count] - cmp ecx,1 - jl .end_funct - mov edi,[block] - cld - @@: - mov esi,[mem_keys] - add esi,112 - stdcall fun_convert_bits, edi, esi, oper_ip, 64 - movsd - movsd - loop @b - - mov ecx,[b_count] - mov esi,[block] - ;cld - .cycle_3: - mov dword[n],16 - .funct_f: - dec dword[n] - mov edi,[mem_keys] - add edi,112 - ;яхЁхёЄрты хь сыюъ L0(32) яю ьрЄЁшЎх e - add esi,4 - stdcall fun_convert_bits, esi, edi, oper_e, 48 - sub esi,4 - - ;edi - L0~e (48 сшЄ) - ;esi - L0R0 (64 сшЄр) - stdcall fun_r0xorki_si, edi,[mem_keys],[n] - - ;edi - (L0~e xor ki)~Si (32 сшЄр) - ;яхЁхёЄрэютър p - mov eax,edi - add eax,4 - stdcall fun_convert_bits, edi, eax, oper_p, 32 - - ;яш°хь L0 т R0, ш (R0 xor (L0~e xor ki)~Si) т L0 - mov edx,dword[esi] - mov ebx,dword[esi+4] - xor edx,dword[eax] - mov dword[esi+4],edx - mov dword[esi],ebx - - cmp dword[n],0 - jg .funct_f - - add esi,8 ;яхЁхїюф эр ёыхфє■∙шщ 64 сшЄэ√щ °шЇЁєхь√щ сыюъ - loop .cycle_3 - - ;ъюэхўэр  яхЁхёЄрэютър ip_inv - mov ecx,[b_count] - mov edi,[block] - ;cld - @@: - mov esi,[mem_keys] - add esi,112 - stdcall fun_convert_bits, edi, esi, oper_ip_inv, 64 - movsd - movsd - loop @b - - .end_funct: -popad - ret -endp - -;description: -; яхЁхёЄрэютър сшЄют яю єър∙рээющ ьрЄЁшЎх -;input: -; m_inp - ярь Є№ ё шёїюфэ√ьш фрээ√ьш -; m_out - ярь Є№ фы  яЁхюсЁрчютрээ√ї фрээ√ї -; c_tbl - ЄрсышЎр фы  яхЁхёЄрэютъш -; tbl_s - ЁрчьхЁ ЄрсышЎ√ фы  яхЁхёЄрэютъш -align 4 -proc fun_convert_bits, m_inp:dword, m_out:dword, c_tbl:dword, tbl_s:dword -pushad - mov esi,[m_inp] - mov edi,[m_out] - mov eax,[c_tbl] - mov ecx,[tbl_s] - xor edx,edx - mov dword[edi],edx - cmp ecx,32 - jle @f - mov dword[edi+4],edx - @@: - inc edx - - cld - .cycle_0: - movzx ebx,byte[eax] - btr ebx,5 - jc .tbl_h - - bt dword[esi],ebx - jnc @f - or dword[edi],edx - @@: - jmp @f - .tbl_h: - bt dword[esi+4],ebx - jnc @f - or dword[edi],edx - @@: - - rol edx,1 - jnc @f - add edi,4 - @@: - inc eax - loop .cycle_0 -popad - ret -endp - -;description: -; ёыюцхэшх R0(48) xor Ki(48) ш 8 яЁхюсЁрчютрэшщ яю Si -;intput: -; data_r0 - R0 (48 сшЄ) -; data_key - єърчрЄхы№ эр ьрёёшт ъы■ўхщ (яю 48 сшЄ) -; n - эюьхЁ ъы■ўр т ьрёёштх -;output: -; data_r0 - (R0 xor Ki)~Si (32 сшЄр) -align 4 -proc fun_r0xorki_si, data_r0:dword, data_key:dword, n:dword -pushad - mov edi,[data_r0] - mov eax,[n] - imul eax,7 ;56 сшЄ - ЁрёёЄю эшх ьхцфє ъы■ўрьш (ёрьш ъы■ўш 48 сшЄ) - add eax,[data_key] - - mov ebx,dword[eax] - xor dword[edi],ebx - mov ebx,dword[eax+4] ;mov bx,word[eax+4] - xor dword[edi+4],ebx ;xor word[edi+4],bx - - ;edi - єърчрЄхы№ эр чэрўхэшх R0 xor Ki - mov eax,dword[edi] - mov ebx,dword[edi+4] - ;bx:eax - 48 сшЄ чэрўхэшх R0 xor Ki - lea esi,[oper_s] ;т√сшЁрхь ЄрсышЎє S0 - mov ecx,8 - .cycle_0: - mov dl,al - and edx,31 - shr dl,1 - jnc @f - bts edx,4 - @@: - bt eax,5 - jnc @f - bts edx,5 - @@: - add edx,esi - mov dl,byte[edx] ;dl - 4 сшЄэюх чэрўхэшх яюыєўхээюх шч Si - - bt ecx,0 - jc @f - ;1) ecx - ўхЄэ√щ - mov byte[edi],dl - jmp .next - @@: - ;2) ecx - эх ўхЄэ√щ - shl dl,4 - or byte[edi],dl - inc edi - .next: - - shr eax,6 - ror ebx,6 - mov edx,ebx - and edx,0xfc000000 - or eax,edx - ;шыш 6 Ёрч: shr ebx,1 rcr eax,1 - add esi,64 ;яхЁхїюфшь эр ёыхфє■∙є■ ЄрсышЎє Si - loop .cycle_0 -popad - ret -endp - -;description: -; яЁюЎхфєЁр ЇюЁьшЁютрэш  ъы■ўхщ фы  °шЇЁютрэш  -;intput: -; key - тїюфэющ ъы■ў 64 сшЄ -; key_b - 16 яЁхюсЁрчютрээ√ї ъы■ўхщ яю 48 сшЄ -; ЁрчьхЁ ярь Єш key_b фюыцхэ с√Є№ эх ьхэ№°х 120 срщЄ -align 4 -proc encryption_key, key:dword, key_b:dword -pushad - mov esi,[key] - mov edi,[key_b] - - ;яхЁхёЄрты хь тїюфэющ ъы■ў яю ьрЄЁшЎх - stdcall fun_convert_bits, esi, edi, oper_b, 56 - - ;т ebx эрїюфшь C0 - mov ebx,dword[edi] - and ebx,0xfffffff - ;т edx эрїюфшь D0 - mov edx,dword[edi+3] - shr edx,4 - - ;эрїюфшь 16 яюфъы■ўхщ, фышээющ яю 56 сшЄ - ;;;mov edi,[key_b] - lea esi,[oper_r] - .cycle_1: - mov cl,byte[esi] - cmp cl,0 - je .cycle_end - shl ebx,cl - btr ebx,28 - jnc @f - or ebx,1 - @@: - btr ebx,29 - jnc @f - or ebx,2 - @@: - shl edx,cl - btr edx,28 - jnc @f - or edx,1 - @@: - btr edx,29 - jnc @f - or edx,2 - @@: - - mov dword[edi+3],0 - mov dword[edi],ebx - shl edx,4 - or dword[edi+3],edx - add edi,7 - shr edx,4 - inc esi - - jmp .cycle_1 - .cycle_end: - - ;ёцрЄшх ъы■ўхщ ё 56 фю 48 сшЄ - mov edi,[key_b] - mov esi,edi - add esi,112 ;112 - рфЁхё чр яЁхфхырьш 16*7 - - mov ecx,16 - cld - @@: - stdcall fun_convert_bits, edi, esi, oper_c, 48 - movsd - movsw - mov byte[edi],0 ;юсЁхчрхь 7-щ срщЄ - inc edi - sub esi,6 - loop @b - -popad - ret -endp - -align 4 -oper_ip db 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,\ -61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7,\ -56,48,40,32,24,16, 8, 0,58,50,42,34,26,18,10, 2,\ -60,52,44,36,28,20,12, 4,62,54,46,38,30,22,14, 6 - -align 4 -oper_ip_inv db 39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,\ -37, 5,45,13,53,21,61,29,36, 4,44,12,52,20,60,28,\ -35, 3,43,11,51,19,59,27,34, 2,42,10,50,18,58,26,\ -33, 1,41, 9,49,17,57,25,32, 0,40, 8,48,16,56,24 - -align 4 -oper_e db 31,0,1,2,3,4,\ - 3, 4, 5, 6, 7, 8,\ - 7, 8, 9,10,11,12,\ -11,12,13,14,15,16,\ -15,16,17,18,19,20,\ -19,20,21,22,23,24,\ -23,24,25,26,27,28,\ -27,28,29,30,31, 0 - -align 4 -oper_b db 56,48,40,32,24,16,8,\ - 0,57,49,41,33,25,17,\ - 9, 1,58,50,42,34,26,\ -18,10, 2,59,51,43,35,\ -62,54,46,38,30,22,14,\ - 6,61,53,45,37,29,21,\ -13, 5,60,52,44,36,28,\ -20,12, 4,27,19,11, 3 - -oper_r db 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,0 - -align 4 -oper_c db 13,16,10,23,0,4,\ - 2,27,14, 5,20, 9,\ -22,18,11, 3,25, 7,\ -15, 6,26,19,12, 1,\ -40,51,30,36,46,54,\ -29,39,50,44,32,47,\ -43,48,38,55,33,52,\ -45,41,49,35,28,31 - -align 4 -oper_s db 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,\ - 0,15, 7, 4,14, 2,13,1,10,6,12,11,9,5,3,8,\ - 4, 1,14, 8,13, 6,2,11,15,12,9,7,3,10,5,0,\ -15,12, 8, 2, 4, 9,1,7,5,11,3,14,10,0,6,13,\ -15, 1, 8,14, 6,11,3,4,9,7,2,13,12,0,5,10,\ - 3,13, 4, 7,15, 2,8,14,12,0,1,10,6,9,11,5,\ - 0,14, 7,11,10, 4,13,1,5,8,12,6,9,3,2,15,\ -13, 8,10, 1, 3,15,4,2,11,6,7,12,0,5,14,9,\ -10, 0, 9,14, 6, 3,15,5,1,13,12,7,11,4,2,8,\ -13, 7, 0, 9, 3, 4,6,10,2,8,5,14,12,11,15,1,\ -13, 6, 4, 9, 8,15,3,0,11,1,2,12,5,10,14,7,\ - 1,10,13, 0, 6, 9,8,7,4,15,14,3,11,5,2,12,\ - 7,13,14, 3, 0, 6,9,10,1,2,8,5,11,12,4,15,\ -13, 8,11, 5, 6,15,0,3,4,7,2,12,1,10,14,9,\ -10, 6, 9, 0,12,11,7,13,15,1,3,14,5,2,8,4,\ - 3,15, 0, 6,10, 1,13,8,9,4,5,11,12,7,2,14,\ - 2,12, 4, 1, 7,10,11,6,8,5,3,15,13,0,14,9,\ -14,11, 2,12, 4, 7,13,1,5,0,15,10,3,9,8,6,\ - 4, 2, 1,11,10,13,7,8,15,9,12,5,6,3,0,14,\ -11, 8,12, 7, 1,14,2,13,6,15,0,9,10,4,5,3,\ -12, 1,10,15, 9, 2,6,8,0,13,3,4,14,7,5,11,\ -10,15, 4, 2, 7,12,9,5,6,1,13,14,0,11,3,8,\ - 9,14,15, 5, 2, 8,12,3,7,0,4,10,1,13,11,6,\ - 4, 3, 2,12, 9, 5,15,10,11,14,1,7,6,0,8,13,\ - 4,11, 2,14,15, 0,8,13,3,12,9,7,5,10,6,1,\ -13, 0,11, 7, 4, 9,1,10,14,3,5,12,2,15,8,6,\ - 1, 4,11,13,12, 3,7,14,10,15,6,8,0,5,9,2,\ - 6,11,13, 8, 1, 4,10,7,9,5,0,15,14,2,3,12,\ -13, 2, 8, 4, 6,15,11,1,10,9,3,14,5,0,12,7,\ - 1,15,13, 8,10, 3,7,4,12,5,6,11,0,14,9,2,\ - 7,11, 4, 1, 9,12,14,2,0,6,10,13,15,3,5,8,\ - 2, 1,14, 7, 4,10,8,13,15,12,9,0,3,5,6,11 - -align 4 -oper_p db 15,6,19,20,28,11,27,16,\ - 0,14,22,25, 4,17,30, 9,\ - 1, 7,23,13,31,26, 2, 8,\ -18,12,29, 5,21,10, 3,24 - - -align 16 -EXPORTS: - dd sz_des_encryption, des_encryption - dd sz_des_decryption, des_decryption - dd 0,0 - sz_des_encryption db 'des_encryption',0 - sz_des_decryption db 'des_decryption',0 +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + + +; +; сшсышюЄхър фы  °шЇЁютрэш  яю рыуюЁшЄьє DES +; + +format MS COFF +public EXPORTS +section '.flat' code readable align 16 + +include '../../../macros.inc' +include '../../../proc32.inc' + +;description: +; ЇєэъЎш  °шЇЁютрэш  Їрщыют +;input: +; key - тїюфэющ ъы■ў 64 сшЄ +; mem_keys - ярь Є№ фы  ЇюЁьшЁютрэш  ъы■ўхщ (ЁрчьхЁ 120 срщЄ) +; block - єърчрЄхы№ эр яхЁт√щ °шЇЁєхь√щ 8 срщЄэ√щ сыюъ +; b_count - ўшёыю сыюъют фы  °шЇЁютрэш  +align 4 +proc des_encryption, key:dword, mem_keys:dword, block:dword, b_count:dword +locals + n dd ? ;яхЁхьхээр  Ўшъыр +endl +pushad + stdcall encryption_key, [key],[mem_keys] + + ;эрўры№эр  яхЁхёЄрэютър ip + mov ecx,[b_count] + cmp ecx,1 + jl .end_funct + mov edi,[block] + cld + @@: + mov esi,[mem_keys] + add esi,112 + stdcall fun_convert_bits, edi, esi, oper_ip, 64 + movsd + movsd + loop @b + + mov ecx,[b_count] + mov esi,[block] + ;cld + .cycle_3: + mov dword[n],0 + .funct_f: + mov edi,[mem_keys] + add edi,112 + ;яхЁхёЄрты хь сыюъ R0(32) яю ьрЄЁшЎх e + stdcall fun_convert_bits, esi, edi, oper_e, 48 + + ;edi - R0~e (48 сшЄ) + ;esi - L0R0 (64 сшЄр) + stdcall fun_r0xorki_si, edi,[mem_keys],[n] + + ;edi - (R0~e xor ki)~Si (32 сшЄр) + ;яхЁхёЄрэютър p + mov eax,edi + add eax,4 + stdcall fun_convert_bits, edi, eax, oper_p, 32 + + ;яш°хь R0 т L0, ш (L0 xor (R0~e xor ki)~Si) т R0 + mov edx,dword[esi+4] + mov ebx,dword[esi] + xor edx,dword[eax] + mov dword[esi],edx + mov dword[esi+4],ebx + + inc dword[n] + cmp dword[n],16 + jl .funct_f + + add esi,8 ;яхЁхїюф эр ёыхфє■∙шщ 64 сшЄэ√щ °шЇЁєхь√щ сыюъ + loop .cycle_3 + + ;ъюэхўэр  яхЁхёЄрэютър ip_inv + mov ecx,[b_count] + mov edi,[block] + ;cld + @@: + mov esi,[mem_keys] + add esi,112 + stdcall fun_convert_bits, edi, esi, oper_ip_inv, 64 + movsd + movsd + loop @b + + .end_funct: +popad + ret +endp + +;description: +; ЇєэъЎш  Ёрё°шЇЁютрэш  Їрщыют +;input: +; key - тїюфэющ ъы■ў 64 сшЄ +; mem_keys - ярь Є№ фы  ЇюЁьшЁютрэш  ъы■ўхщ (ЁрчьхЁ 120 срщЄ) +; block - єърчрЄхы№ эр яхЁт√щ Ёрё°шЇЁют√трхь√щ 8 срщЄэ√щ сыюъ +; b_count - ўшёыю сыюъют фы  Ёрё°шЇЁютрэш  +align 4 +proc des_decryption, key:dword, mem_keys:dword, block:dword, b_count:dword +locals + n dd ? ;яхЁхьхээр  Ўшъыр +endl +pushad + stdcall encryption_key, [key],[mem_keys] + + ;эрўры№эр  яхЁхёЄрэютър ip + mov ecx,[b_count] + cmp ecx,1 + jl .end_funct + mov edi,[block] + cld + @@: + mov esi,[mem_keys] + add esi,112 + stdcall fun_convert_bits, edi, esi, oper_ip, 64 + movsd + movsd + loop @b + + mov ecx,[b_count] + mov esi,[block] + ;cld + .cycle_3: + mov dword[n],16 + .funct_f: + dec dword[n] + mov edi,[mem_keys] + add edi,112 + ;яхЁхёЄрты хь сыюъ L0(32) яю ьрЄЁшЎх e + add esi,4 + stdcall fun_convert_bits, esi, edi, oper_e, 48 + sub esi,4 + + ;edi - L0~e (48 сшЄ) + ;esi - L0R0 (64 сшЄр) + stdcall fun_r0xorki_si, edi,[mem_keys],[n] + + ;edi - (L0~e xor ki)~Si (32 сшЄр) + ;яхЁхёЄрэютър p + mov eax,edi + add eax,4 + stdcall fun_convert_bits, edi, eax, oper_p, 32 + + ;яш°хь L0 т R0, ш (R0 xor (L0~e xor ki)~Si) т L0 + mov edx,dword[esi] + mov ebx,dword[esi+4] + xor edx,dword[eax] + mov dword[esi+4],edx + mov dword[esi],ebx + + cmp dword[n],0 + jg .funct_f + + add esi,8 ;яхЁхїюф эр ёыхфє■∙шщ 64 сшЄэ√щ °шЇЁєхь√щ сыюъ + loop .cycle_3 + + ;ъюэхўэр  яхЁхёЄрэютър ip_inv + mov ecx,[b_count] + mov edi,[block] + ;cld + @@: + mov esi,[mem_keys] + add esi,112 + stdcall fun_convert_bits, edi, esi, oper_ip_inv, 64 + movsd + movsd + loop @b + + .end_funct: +popad + ret +endp + +;description: +; яхЁхёЄрэютър сшЄют яю єър∙рээющ ьрЄЁшЎх +;input: +; m_inp - ярь Є№ ё шёїюфэ√ьш фрээ√ьш +; m_out - ярь Є№ фы  яЁхюсЁрчютрээ√ї фрээ√ї +; c_tbl - ЄрсышЎр фы  яхЁхёЄрэютъш +; tbl_s - ЁрчьхЁ ЄрсышЎ√ фы  яхЁхёЄрэютъш +align 4 +proc fun_convert_bits, m_inp:dword, m_out:dword, c_tbl:dword, tbl_s:dword +pushad + mov esi,[m_inp] + mov edi,[m_out] + mov eax,[c_tbl] + mov ecx,[tbl_s] + xor edx,edx + mov dword[edi],edx + cmp ecx,32 + jle @f + mov dword[edi+4],edx + @@: + inc edx + + cld + .cycle_0: + movzx ebx,byte[eax] + btr ebx,5 + jc .tbl_h + + bt dword[esi],ebx + jnc @f + or dword[edi],edx + @@: + jmp @f + .tbl_h: + bt dword[esi+4],ebx + jnc @f + or dword[edi],edx + @@: + + rol edx,1 + jnc @f + add edi,4 + @@: + inc eax + loop .cycle_0 +popad + ret +endp + +;description: +; ёыюцхэшх R0(48) xor Ki(48) ш 8 яЁхюсЁрчютрэшщ яю Si +;intput: +; data_r0 - R0 (48 сшЄ) +; data_key - єърчрЄхы№ эр ьрёёшт ъы■ўхщ (яю 48 сшЄ) +; n - эюьхЁ ъы■ўр т ьрёёштх +;output: +; data_r0 - (R0 xor Ki)~Si (32 сшЄр) +align 4 +proc fun_r0xorki_si, data_r0:dword, data_key:dword, n:dword +pushad + mov edi,[data_r0] + mov eax,[n] + imul eax,7 ;56 сшЄ - ЁрёёЄю эшх ьхцфє ъы■ўрьш (ёрьш ъы■ўш 48 сшЄ) + add eax,[data_key] + + mov ebx,dword[eax] + xor dword[edi],ebx + mov ebx,dword[eax+4] ;mov bx,word[eax+4] + xor dword[edi+4],ebx ;xor word[edi+4],bx + + ;edi - єърчрЄхы№ эр чэрўхэшх R0 xor Ki + mov eax,dword[edi] + mov ebx,dword[edi+4] + ;bx:eax - 48 сшЄ чэрўхэшх R0 xor Ki + lea esi,[oper_s] ;т√сшЁрхь ЄрсышЎє S0 + mov ecx,8 + .cycle_0: + mov dl,al + and edx,31 + shr dl,1 + jnc @f + bts edx,4 + @@: + bt eax,5 + jnc @f + bts edx,5 + @@: + add edx,esi + mov dl,byte[edx] ;dl - 4 сшЄэюх чэрўхэшх яюыєўхээюх шч Si + + bt ecx,0 + jc @f + ;1) ecx - ўхЄэ√щ + mov byte[edi],dl + jmp .next + @@: + ;2) ecx - эх ўхЄэ√щ + shl dl,4 + or byte[edi],dl + inc edi + .next: + + shr eax,6 + ror ebx,6 + mov edx,ebx + and edx,0xfc000000 + or eax,edx + ;шыш 6 Ёрч: shr ebx,1 rcr eax,1 + add esi,64 ;яхЁхїюфшь эр ёыхфє■∙є■ ЄрсышЎє Si + loop .cycle_0 +popad + ret +endp + +;description: +; яЁюЎхфєЁр ЇюЁьшЁютрэш  ъы■ўхщ фы  °шЇЁютрэш  +;intput: +; key - тїюфэющ ъы■ў 64 сшЄ +; key_b - 16 яЁхюсЁрчютрээ√ї ъы■ўхщ яю 48 сшЄ +; ЁрчьхЁ ярь Єш key_b фюыцхэ с√Є№ эх ьхэ№°х 120 срщЄ +align 4 +proc encryption_key, key:dword, key_b:dword +pushad + mov esi,[key] + mov edi,[key_b] + + ;яхЁхёЄрты хь тїюфэющ ъы■ў яю ьрЄЁшЎх + stdcall fun_convert_bits, esi, edi, oper_b, 56 + + ;т ebx эрїюфшь C0 + mov ebx,dword[edi] + and ebx,0xfffffff + ;т edx эрїюфшь D0 + mov edx,dword[edi+3] + shr edx,4 + + ;эрїюфшь 16 яюфъы■ўхщ, фышээющ яю 56 сшЄ + ;;;mov edi,[key_b] + lea esi,[oper_r] + .cycle_1: + mov cl,byte[esi] + cmp cl,0 + je .cycle_end + shl ebx,cl + btr ebx,28 + jnc @f + or ebx,1 + @@: + btr ebx,29 + jnc @f + or ebx,2 + @@: + shl edx,cl + btr edx,28 + jnc @f + or edx,1 + @@: + btr edx,29 + jnc @f + or edx,2 + @@: + + mov dword[edi+3],0 + mov dword[edi],ebx + shl edx,4 + or dword[edi+3],edx + add edi,7 + shr edx,4 + inc esi + + jmp .cycle_1 + .cycle_end: + + ;ёцрЄшх ъы■ўхщ ё 56 фю 48 сшЄ + mov edi,[key_b] + mov esi,edi + add esi,112 ;112 - рфЁхё чр яЁхфхырьш 16*7 + + mov ecx,16 + cld + @@: + stdcall fun_convert_bits, edi, esi, oper_c, 48 + movsd + movsw + mov byte[edi],0 ;юсЁхчрхь 7-щ срщЄ + inc edi + sub esi,6 + loop @b + +popad + ret +endp + +align 4 +oper_ip db 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,\ +61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7,\ +56,48,40,32,24,16, 8, 0,58,50,42,34,26,18,10, 2,\ +60,52,44,36,28,20,12, 4,62,54,46,38,30,22,14, 6 + +align 4 +oper_ip_inv db 39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,\ +37, 5,45,13,53,21,61,29,36, 4,44,12,52,20,60,28,\ +35, 3,43,11,51,19,59,27,34, 2,42,10,50,18,58,26,\ +33, 1,41, 9,49,17,57,25,32, 0,40, 8,48,16,56,24 + +align 4 +oper_e db 31,0,1,2,3,4,\ + 3, 4, 5, 6, 7, 8,\ + 7, 8, 9,10,11,12,\ +11,12,13,14,15,16,\ +15,16,17,18,19,20,\ +19,20,21,22,23,24,\ +23,24,25,26,27,28,\ +27,28,29,30,31, 0 + +align 4 +oper_b db 56,48,40,32,24,16,8,\ + 0,57,49,41,33,25,17,\ + 9, 1,58,50,42,34,26,\ +18,10, 2,59,51,43,35,\ +62,54,46,38,30,22,14,\ + 6,61,53,45,37,29,21,\ +13, 5,60,52,44,36,28,\ +20,12, 4,27,19,11, 3 + +oper_r db 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,0 + +align 4 +oper_c db 13,16,10,23,0,4,\ + 2,27,14, 5,20, 9,\ +22,18,11, 3,25, 7,\ +15, 6,26,19,12, 1,\ +40,51,30,36,46,54,\ +29,39,50,44,32,47,\ +43,48,38,55,33,52,\ +45,41,49,35,28,31 + +align 4 +oper_s db 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,\ + 0,15, 7, 4,14, 2,13,1,10,6,12,11,9,5,3,8,\ + 4, 1,14, 8,13, 6,2,11,15,12,9,7,3,10,5,0,\ +15,12, 8, 2, 4, 9,1,7,5,11,3,14,10,0,6,13,\ +15, 1, 8,14, 6,11,3,4,9,7,2,13,12,0,5,10,\ + 3,13, 4, 7,15, 2,8,14,12,0,1,10,6,9,11,5,\ + 0,14, 7,11,10, 4,13,1,5,8,12,6,9,3,2,15,\ +13, 8,10, 1, 3,15,4,2,11,6,7,12,0,5,14,9,\ +10, 0, 9,14, 6, 3,15,5,1,13,12,7,11,4,2,8,\ +13, 7, 0, 9, 3, 4,6,10,2,8,5,14,12,11,15,1,\ +13, 6, 4, 9, 8,15,3,0,11,1,2,12,5,10,14,7,\ + 1,10,13, 0, 6, 9,8,7,4,15,14,3,11,5,2,12,\ + 7,13,14, 3, 0, 6,9,10,1,2,8,5,11,12,4,15,\ +13, 8,11, 5, 6,15,0,3,4,7,2,12,1,10,14,9,\ +10, 6, 9, 0,12,11,7,13,15,1,3,14,5,2,8,4,\ + 3,15, 0, 6,10, 1,13,8,9,4,5,11,12,7,2,14,\ + 2,12, 4, 1, 7,10,11,6,8,5,3,15,13,0,14,9,\ +14,11, 2,12, 4, 7,13,1,5,0,15,10,3,9,8,6,\ + 4, 2, 1,11,10,13,7,8,15,9,12,5,6,3,0,14,\ +11, 8,12, 7, 1,14,2,13,6,15,0,9,10,4,5,3,\ +12, 1,10,15, 9, 2,6,8,0,13,3,4,14,7,5,11,\ +10,15, 4, 2, 7,12,9,5,6,1,13,14,0,11,3,8,\ + 9,14,15, 5, 2, 8,12,3,7,0,4,10,1,13,11,6,\ + 4, 3, 2,12, 9, 5,15,10,11,14,1,7,6,0,8,13,\ + 4,11, 2,14,15, 0,8,13,3,12,9,7,5,10,6,1,\ +13, 0,11, 7, 4, 9,1,10,14,3,5,12,2,15,8,6,\ + 1, 4,11,13,12, 3,7,14,10,15,6,8,0,5,9,2,\ + 6,11,13, 8, 1, 4,10,7,9,5,0,15,14,2,3,12,\ +13, 2, 8, 4, 6,15,11,1,10,9,3,14,5,0,12,7,\ + 1,15,13, 8,10, 3,7,4,12,5,6,11,0,14,9,2,\ + 7,11, 4, 1, 9,12,14,2,0,6,10,13,15,3,5,8,\ + 2, 1,14, 7, 4,10,8,13,15,12,9,0,3,5,6,11 + +align 4 +oper_p db 15,6,19,20,28,11,27,16,\ + 0,14,22,25, 4,17,30, 9,\ + 1, 7,23,13,31,26, 2, 8,\ +18,12,29, 5,21,10, 3,24 + + +align 16 +EXPORTS: + dd sz_des_encryption, des_encryption + dd sz_des_decryption, des_decryption + dd 0,0 + sz_des_encryption db 'des_encryption',0 + sz_des_decryption db 'des_decryption',0 diff --git a/programs/develop/libraries/crypt_des/example/build.bat b/programs/develop/libraries/crypt_des/example/build.bat index 4b66e3aa5..fa0a289eb 100644 --- a/programs/develop/libraries/crypt_des/example/build.bat +++ b/programs/develop/libraries/crypt_des/example/build.bat @@ -3,6 +3,6 @@ if not exist bin mkdir bin @kpack bin\crypt_files.kex if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png if not exist bin\font8x9.bmp @copy ..\..\..\..\fs\kfar\font8x9.bmp bin\font8x9.bmp -@fasm.exe -m 16384 ..\trunk\crypt_des.asm bin\crypt_des.obj +@fasm.exe -m 16384 ..\crypt_des.asm bin\crypt_des.obj @kpack bin\crypt_des.obj pause diff --git a/programs/develop/libraries/crypt_des/trunk/run.bat b/programs/develop/libraries/crypt_des/run.bat similarity index 100% rename from programs/develop/libraries/crypt_des/trunk/run.bat rename to programs/develop/libraries/crypt_des/run.bat diff --git a/programs/develop/libraries/exif/trunk/Tupfile.lua b/programs/develop/libraries/exif/Tupfile.lua similarity index 100% rename from programs/develop/libraries/exif/trunk/Tupfile.lua rename to programs/develop/libraries/exif/Tupfile.lua diff --git a/programs/develop/libraries/exif/trunk/about.htm b/programs/develop/libraries/exif/about.htm similarity index 100% rename from programs/develop/libraries/exif/trunk/about.htm rename to programs/develop/libraries/exif/about.htm diff --git a/programs/develop/libraries/exif/trunk/build.bat b/programs/develop/libraries/exif/build.bat similarity index 100% rename from programs/develop/libraries/exif/trunk/build.bat rename to programs/develop/libraries/exif/build.bat diff --git a/programs/develop/libraries/exif/examples/build.bat b/programs/develop/libraries/exif/examples/build.bat index 7a031437b..70fab4f16 100644 --- a/programs/develop/libraries/exif/examples/build.bat +++ b/programs/develop/libraries/exif/examples/build.bat @@ -3,6 +3,6 @@ if not exist bin mkdir bin @kpack bin\viev_exif.kex if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png if not exist bin\font8x9.bmp @copy ..\..\..\..\fs\kfar\font8x9.bmp bin\font8x9.bmp -@fasm.exe -m 16384 ..\trunk\exif.asm bin\exif.obj +@fasm.exe -m 16384 ..\exif.asm bin\exif.obj @kpack bin\exif.obj pause diff --git a/programs/develop/libraries/exif/trunk/exif.asm b/programs/develop/libraries/exif/exif.asm similarity index 95% rename from programs/develop/libraries/exif/trunk/exif.asm rename to programs/develop/libraries/exif/exif.asm index 450dd9f33..24b53f18f 100644 --- a/programs/develop/libraries/exif/trunk/exif.asm +++ b/programs/develop/libraries/exif/exif.asm @@ -1,1737 +1,1742 @@ -format MS COFF -public EXPORTS -section '.flat' code readable align 16 - -include '../../../../macros.inc' -include '../../../../proc32.inc' - - - -;--------- -offs_m_or_i equ 8 ;смещение параметра 'MM' или 'II' (Motorola, Intel) -offs_id_gr equ 10 ;смещение id group -offs_id_gr_mak equ 12 ;смещение id group производителя -offs_tag_0 equ 2 ;смещение 0-го тега -tag_size equ 12 ;размер структуры тега -;форматы данных -tag_format_ui1b equ 1 ;unsigned integer 1 byte -tag_format_text equ 2 ;ascii string -tag_format_ui2b equ 3 ;unsigned integer 2 byte -tag_format_ui4b equ 4 ;unsigned integer 4 byte -tag_format_urb equ 5 ;unsigned integer 4/4 byte -tag_format_si1b equ 6 ;signed integer 1 byte -tag_format_undef equ 7 ;undefined -tag_format_si2b equ 8 ;signed integer 2 byte -tag_format_si4b equ 9 ;signed integer 4 byte -tag_format_srb equ 10 ;signed integer 4/4 byte -tag_format_f4b equ 11 ;float 4 byte -tag_format_f8b equ 12 ;float 8 byte - -align 4 -txt_dp db ': ',0 -txt_zap db ', ',0 -txt_div db '/',0 - -;заголовок таблиц с группами тегов -align 4 -exif_tag_numbers: -dd 0, gr_0 ;группа app1 -dd 0x8769, gr_8769 ;Exif offset -dd 0xa005, gr_a005 ;Interop offset -dd 0x8825, gr_8825 ;GPS info - -;групы app2 (здесь у каждого производителя камер свой формат тегов) -dw 0x927c ;app2 для Nikon -db 'Ni' -dd gr_927c_Ni - -dw 0x927c ;app2 для Panasonic -db 'Pa' -dd gr_927c_Pa - -dw 0x927c ;app2 для Canon -db 'Ca' -dd gr_927c_Ca - -dw 0x927c ;app2 для Samsung -db 'Sa' -dd gr_927c_Sa -.end: - -align 4 -gr_0: -db 0x00,0x0b,'Processing software',0 -db 0x00,0xfe,'Subfile type',0 -db 0x00,0xff,'OldSubfile type',0 -db 0x01,0x00,'Image width',0 -db 0x01,0x01,'Image height',0 -db 0x01,0x02,'Bits per sample',0 -db 0x01,0x03,'Compression',0 -db 0x01,0x06,'Photometric interpretation',0 -db 0x01,0x07,'Thresholding',0 -db 0x01,0x08,'Cell width',0 -db 0x01,0x09,'Cell length',0 -db 0x01,0x0a,'Fill order',0 -db 0x01,0x0d,'Document name',0 -db 0x01,0x0e,'Image description',0 -db 0x01,0x0f,'Manufacturer of digicam',0 -db 0x01,0x10,'Model',0 -db 0x01,0x11,'Strip offsets',0 -db 0x01,0x12,'Orientation',0 -db 0x01,0x15,'Samples per pixel',0 -db 0x01,0x16,'Rows per strip',0 -db 0x01,0x17,'Strip byte counts',0 -db 0x01,0x18,'Min sample value',0 -db 0x01,0x19,'Max sample value',0 -db 0x01,0x1a,'X resolution',0 -db 0x01,0x1b,'Y resolution',0 -db 0x01,0x1c,'Planar configuration',0 -db 0x01,0x1d,'Page name',0 -db 0x01,0x1e,'X position',0 -db 0x01,0x1f,'Y position',0 -db 0x01,0x20,'Free offsets',0 -db 0x01,0x21,'Free byte counts',0 -db 0x01,0x22,'Gray response unit',0 -db 0x01,0x23,'Gray response curve',0 -db 0x01,0x24,'T4 options',0 -db 0x01,0x25,'T6 options',0 -db 0x01,0x28,'Resolution unit',0 -db 0x01,0x29,'Page number',0 -db 0x01,0x2c,'Color response unit',0 -db 0x01,0x2d,'Transfer function',0 -db 0x01,0x31,'Software',0 -db 0x01,0x32,'Modify date',0 -db 0x01,0x3b,'Artist',0 -db 0x01,0x3c,'Host computer',0 -db 0x01,0x3d,'Predictor',0 -db 0x01,0x3e,'White point',0 -db 0x01,0x3f,'Primary chromaticities',0 -db 0x01,0x40,'Color map',0 -db 0x01,0x41,'Halftone hints',0 -db 0x01,0x42,'Tile width',0 -db 0x01,0x43,'Tile length',0 -db 0x01,0x44,'Tile offsets',0 -db 0x01,0x45,'Tile byte counts',0 -db 0x01,0x46,'Bad fax lines',0 -db 0x01,0x47,'Clean fax data',0 -db 0x01,0x48,'Consecutive bad fax lines',0 -db 0x01,0x4a,'Sub IFDs',0 -db 0x01,0x4c,'Ink set',0 -db 0x01,0x4d,'Ink names',0 -db 0x01,0x4e,'Numberof inks',0 -db 0x01,0x50,'Dot range',0 -db 0x01,0x51,'Target printer',0 -db 0x01,0x52,'Extra samples',0 -db 0x01,0x53,'Sample format',0 -db 0x01,0x54,'SMin sample value',0 -db 0x01,0x55,'SMax sample value',0 -db 0x01,0x56,'Transfer range',0 -db 0x01,0x57,'Clip path',0 -db 0x01,0x58,'X clip path units',0 -db 0x01,0x59,'Y clip path units',0 -db 0x01,0x5a,'Indexed',0 -db 0x01,0x5b,'JPEG tables',0 -db 0x01,0x5f,'OPIProxy',0 -db 0x01,0x90,'Global parameters IFD',0 -db 0x01,0x91,'Profile type',0 -db 0x01,0x92,'Fax profile',0 -db 0x01,0x93,'Coding methods',0 -db 0x01,0x94,'Version year',0 -db 0x01,0x95,'Mode number',0 -db 0x01,0xb1,'Decode',0 -db 0x01,0xb2,'Default image color',0 -db 0x01,0xb3,'T82 options',0 -db 0x01,0xb5,'JPEG tables',0 ;уже было ? -db 0x02,0x00,'JPEG proc',0 -db 0x02,0x01,'Thumbnail offset',0 -db 0x02,0x02,'Thumbnail length',0 -db 0x02,0x03,'JPEG restart interval',0 -db 0x02,0x05,'JPEG lossless predictors',0 -db 0x02,0x06,'JPEG point transforms',0 -db 0x02,0x07,'JPEG QTables',0 -db 0x02,0x08,'JPEG DCTables',0 -db 0x02,0x09,'JPEG ACTables',0 -db 0x02,0x11,'YCbCrCoefficients',0 -db 0x02,0x12,'YCbCrSubSampling',0 -db 0x02,0x13,'YCbCrPositioning',0 -db 0x02,0x14,'Reference black white',0 -db 0x02,0x2f,'Strip row counts',0 -db 0x03,0xe7,'USPTO Miscellaneous',0 -db 0x47,0x46,'Rating',0 -db 0x47,0x47,'XP_DIP_XML',0 -db 0x47,0x48,'Stitch info',0 -db 0x47,0x49,'Rating percent',0 -db 0x80,0x0d,'Image ID',0 -db 0x80,0xa3,'Wang tag 1',0 -db 0x80,0xa4,'Wang annotation',0 -db 0x80,0xa5,'Wang tag 3',0 -db 0x80,0xa6,'Wang tag 4',0 -db 0x80,0xe3,'Matteing',0 -db 0x80,0xe4,'Data type',0 -db 0x80,0xe5,'Image depth',0 -db 0x80,0xe6,'Tile depth',0 -db 0x82,0x7d,'Model 2',0 -db 0x82,0x8d,'CFA repeat pattern dim',0 -db 0x82,0x8e,'CFA pattern 2',0 -db 0x82,0x8f,'Battery level',0 -db 0x82,0x90,'Kodak IFD',0 -db 0x82,0x98,'Copyright',0 -db 0x82,0xa5,'MD file tag',0 -db 0x82,0xa6,'MD scale pixel',0 -db 0x82,0xa7,'MD color table',0 -db 0x82,0xa8,'MD lab name',0 -db 0x82,0xa9,'MD sample info',0 -db 0x82,0xaa,'MD prep date',0 -db 0x82,0xab,'MD prep time',0 -db 0x82,0xac,'MD file units',0 -db 0x83,0x0e,'Pixel scale',0 -db 0x83,0x35,'Advent scale',0 -db 0x83,0x36,'Advent revision',0 -db 0x83,0x5c,'UIC1 tag',0 -db 0x83,0x5d,'UIC2 tag',0 -db 0x83,0x5e,'UIC3 tag',0 -db 0x83,0x5f,'UIC4 tag',0 -db 0x83,0xbb,'IPTC-NAA',0 -db 0x84,0x7e,'Intergraph packet data',0 -db 0x84,0x7f,'Intergraph flag registers',0 -db 0x84,0x80,'Intergraph matrix',0 -db 0x84,0x81,'INGR reserved',0 -db 0x84,0x82,'Model tie point',0 -db 0x84,0xe0,'Site',0 -db 0x84,0xe1,'Color sequence',0 -db 0x84,0xe2,'IT8 header',0 -db 0x84,0xe3,'Raster padding',0 -db 0x84,0xe4,'Bits per run length',0 -db 0x84,0xe5,'Bits per extended run length',0 -db 0x84,0xe6,'Color table',0 -db 0x84,0xe7,'Image color indicator',0 -db 0x84,0xe8,'Background color indicator',0 -db 0x84,0xe9,'Image color value',0 -db 0x84,0xea,'Background color value',0 -db 0x84,0xeb,'Pixel intensity range',0 -db 0x84,0xec,'Transparency indicator',0 -db 0x84,0xed,'Color characterization',0 -db 0x84,0xee,'HCUsage',0 -db 0x84,0xef,'Trap indicator',0 -db 0x84,0xf0,'CMYK equivalent',0 -db 0x85,0x46,'SEM info',0 -db 0x85,0x68,'AFCP_IPTC',0 -db 0x85,0xb8,'Pixel magic JBIG options',0 -db 0x85,0xd8,'Model transform',0 -db 0x86,0x02,'WB_GRGB levels',0 -db 0x86,0x06,'Leaf data',0 -db 0x86,0x49,'Photoshop settings',0 -db 0x87,0x69,'Exif offset',0 -db 0x87,0x73,'ICC_Profile',0 -db 0x87,0x7f,'TIFF_FX extensions',0 -db 0x87,0x80,'Multi profiles',0 -db 0x87,0x81,'Shared data',0 -db 0x87,0x82,'T88 options',0 -db 0x87,0xac,'Image layer',0 -db 0x87,0xaf,'Geo tiff directory',0 -db 0x87,0xb0,'Geo tiff double params',0 -db 0x87,0xb1,'Geo tiff ascii params',0 -db 0x88,0x25,'GPS info',0 -db 0x88,0x28,'Opto-Electric conv factor',0 -db 0x88,0x29,'Interlace',0 -db 0x88,0x5c,'Fax recv params',0 -db 0x88,0x5d,'Fax sub address',0 -db 0x88,0x5e,'Fax recv time',0 -db 0x88,0x8a,'Leaf sub IFD',0 -db 0x92,0x0b,'Flash energy',0 -db 0x92,0x0c,'Spatial frequency response',0 -db 0x92,0x0d,'Noise',0 -db 0x92,0x0e,'Focal plane X resolution',0 -db 0x92,0x0f,'Focal plane Y resolution',0 -db 0x92,0x10,'Focal plane resolution unit',0 -db 0x92,0x15,'Exposure index',0 -db 0x92,0x16,'TIFF-EP standard ID',0 -db 0x92,0x17,'Sensing method',0 -db 0x92,0x3a,'CIP3 data file',0 -db 0x92,0x3b,'CIP3 sheet',0 -db 0x92,0x3c,'CIP3 side',0 -db 0x92,0x3f,'Sto nits',0 -db 0x93,0x2f,'MS document text',0 -db 0x93,0x30,'MS property set storage',0 -db 0x93,0x31,'MS document text position',0 -db 0x93,0x5c,'Image source data',0 -db 0x9c,0x9b,'XP title',0 -db 0x9c,0x9c,'XP comment',0 -db 0x9c,0x9d,'XP author',0 -db 0x9c,0x9e,'XP keywords',0 -db 0x9c,0x9f,'XP subject',0 -db 0xa2,0x0c,'Spatial frequency fesponse',0 -db 0xa2,0x0d,'Noise',0 -db 0xa2,0x11,'Image number',0 -db 0xa2,0x12,'Security classification',0 -db 0xa2,0x13,'Image history',0 -db 0xa2,0x16,'TIFF-EP standard ID',0 -db 0xa4,0x80,'GDAL metadata',0 -db 0xa4,0x81,'GDAL no data',0 -db 0xaf,0xc0,'Expand software',0 -db 0xaf,0xc1,'Expand lens',0 -db 0xaf,0xc2,'Expand film',0 -db 0xaf,0xc3,'Expand filterLens',0 -db 0xaf,0xc4,'Expand scanner',0 -db 0xaf,0xc5,'Expand flash lamp',0 -db 0xbc,0x01,'Pixel format',0 -db 0xbc,0x02,'Transformation',0 -db 0xbc,0x03,'Uncompressed',0 -db 0xbc,0x04,'Image type',0 -db 0xbc,0x80,'Image width',0 -db 0xbc,0x81,'Image height',0 -db 0xbc,0x82,'Width resolution',0 -db 0xbc,0x83,'Height resolution',0 -db 0xbc,0xc0,'Image offset',0 -db 0xbc,0xc1,'Image byte count',0 -db 0xbc,0xc2,'Alpha offset',0 -db 0xbc,0xc3,'Alpha byte count',0 -db 0xbc,0xc4,'Image data discard',0 -db 0xbc,0xc5,'Alpha data discard',0 -db 0xc4,0x27,'Oce scanjob desc',0 -db 0xc4,0x28,'Oce application selector',0 -db 0xc4,0x29,'Oce ID number',0 -db 0xc4,0x2a,'Oce image logic',0 -db 0xc4,0x4f,'Annotations',0 -db 0xc4,0xa5,'Print IM',0 -db 0xc5,0x73,'Original file name',0 -db 0xc5,0x80,'USPTO original content type',0 -db 0xc6,0x12,'DNG version',0 -db 0xc6,0x13,'DNG backward version',0 -db 0xc6,0x14,'Unique camera model',0 -db 0xc6,0x15,'Localized camera model',0 -db 0xc6,0x16,'CFA plane color',0 -db 0xc6,0x17,'CFA layout',0 -db 0xc6,0x18,'Linearization table',0 -db 0xc6,0x19,'Black level repeat dim',0 -db 0xc6,0x1a,'Black level',0 -db 0xc6,0x1b,'Black level delta H',0 -db 0xc6,0x1c,'Black level delta V',0 -db 0xc6,0x1d,'White level',0 -db 0xc6,0x1e,'Default scale',0 -db 0xc6,0x1f,'Default crop origin',0 -db 0xc6,0x20,'Default crop size',0 -db 0xc6,0x21,'Color matrix 1',0 -db 0xc6,0x22,'Color matrix 2',0 -db 0xc6,0x23,'Camera calibration 1',0 -db 0xc6,0x24,'Camera calibration 2',0 -db 0xc6,0x25,'Reduction matrix 1',0 -db 0xc6,0x26,'Reduction matrix 2',0 -db 0xc6,0x27,'Analog balance',0 -db 0xc6,0x28,'As shot neutral',0 -db 0xc6,0x29,'As shot white XY',0 -db 0xc6,0x2a,'BaselineExposure',0 -db 0xc6,0x2b,'BaselineNoise',0 -db 0xc6,0x2c,'BaselineSharpness',0 -db 0xc6,0x2d,'BayerGreenSplit',0 -db 0xc6,0x2e,'Linear response limit',0 -db 0xc6,0x2f,'Camera serial number',0 -db 0xc6,0x30,'DNG lens info',0 -db 0xc6,0x31,'Chroma blur radius',0 -db 0xc6,0x32,'Anti alias strength',0 -db 0xc6,0x33,'Shadow scale',0 -db 0xc6,0x34,'SR2 private',0 -db 0xc6,0x35,'Maker note safety',0 -db 0xc6,0x40,'Raw image segmentation',0 -db 0xc6,0x5a,'Calibration illuminant 1',0 -db 0xc6,0x5b,'Calibration illuminant 2',0 -db 0xc6,0x5c,'Best quality scale',0 -db 0xc6,0x5d,'Raw data unique ID',0 -db 0xc6,0x60,'Alias layer metadata',0 -db 0xc6,0x8b,'Original raw file name',0 -db 0xc6,0x8c,'Original raw file data',0 -db 0xc6,0x8d,'Active area',0 -db 0xc6,0x8e,'Masked areas',0 -db 0xc6,0x8f,'AsShot ICC profile',0 -db 0xc6,0x90,'AsShot pre profile matrix',0 -db 0xc6,0x91,'Current ICC profile',0 -db 0xc6,0x92,'Current pre profile matrix',0 -db 0xc6,0xbf,'Colorimetric reference',0 -db 0xc6,0xd2,'Panasonic title',0 -db 0xc6,0xd3,'Panasonic title 2',0 -db 0xc6,0xf3,'Camera calibration sig',0 -db 0xc6,0xf4,'Profile calibration sig',0 -db 0xc6,0xf5,'Profile IFD',0 -db 0xc6,0xf6,'AsShot profile name',0 -db 0xc6,0xf7,'Noise reduction applied',0 -db 0xc6,0xf8,'Profile name',0 -db 0xc6,0xf9,'Profile hue sat map dims',0 -db 0xc6,0xfa,'Profile hue sat map data 1',0 -db 0xc6,0xfb,'Profile hue sat map data 2',0 -db 0xc6,0xfc,'Profile tone curve',0 -db 0xc6,0xfd,'Profile embed policy',0 -db 0xc6,0xfe,'Profile copyright',0 -db 0xc7,0x14,'Forward matrix 1',0 -db 0xc7,0x15,'Forward matrix 2',0 -db 0xc7,0x16,'Preview application name',0 -db 0xc7,0x17,'Preview application version',0 -db 0xc7,0x18,'Preview settings name',0 -db 0xc7,0x19,'Preview settings digest',0 -db 0xc7,0x1a,'Preview color space',0 -db 0xc7,0x1b,'Preview date time',0 -db 0xc7,0x1c,'Raw image digest',0 -db 0xc7,0x1d,'Original raw file digest',0 -db 0xc7,0x1e,'Sub tile block size',0 -db 0xc7,0x1f,'Row interleave factor',0 -db 0xc7,0x25,'Profile look table dims',0 -db 0xc7,0x26,'Profile look table data',0 -db 0xc7,0x40,'Opcode list 1',0 -db 0xc7,0x41,'Opcode list 2',0 -db 0xc7,0x4e,'Opcode list 3',0 -db 0xc7,0x61,'Noise profile',0 -db 0xc7,0x63,'Time codes',0 -db 0xc7,0x64,'Frame rate',0 -db 0xc7,0x72,'TStop',0 -db 0xc7,0x89,'Reel name',0 -db 0xc7,0x91,'Original default final size',0 -db 0xc7,0x92,'Original best quality size',0 -db 0xc7,0x93,'Original default crop size',0 -db 0xc7,0xa1,'Camera label',0 -db 0xc7,0xa3,'Profile hue sat map encoding',0 -db 0xc7,0xa4,'Profile look table encoding',0 -db 0xc7,0xa5,'Baseline exposure offset',0 -db 0xc7,0xa6,'Default black render',0 -db 0xc7,0xa7,'New raw image digest',0 -db 0xc7,0xa8,'Raw to preview gain',0 -db 0xc7,0xb5,'Default user crop',0 -db 0xfe,0x00,'KDC_IFD',0 - -dd 0 - -align 4 -gr_8769: -db 0x02,0xbc,'Application notes',0 -db 0x82,0x9a,'Exposure time',0 -db 0x82,0x9d,'F number',0 -db 0x88,0x22,'Exposure program',0 -db 0x88,0x24,'Spectral sensitivity',0 -db 0x88,0x27,'ISO',0 -db 0x88,0x2a,'Time zone offset',0 -db 0x88,0x2b,'Self timer mode',0 -db 0x88,0x30,'Sensitivity type',0 -db 0x88,0x31,'Standard output sensitivity',0 -db 0x88,0x32,'Recommended exposure index',0 -db 0x88,0x33,'ISO speed',0 -db 0x88,0x34,'ISO speed latitude yyy',0 -db 0x88,0x35,'ISO speed latitude zzz',0 -db 0x90,0x00,'Exif version',0 -db 0x90,0x03,'Date time original',0 -db 0x90,0x04,'Create date',0 -db 0x91,0x01,'Components configuration',0 -db 0x91,0x02,'Compressed bits per pixel',0 -db 0x92,0x01,'Shutter speed value',0 -db 0x92,0x02,'Aperture value',0 -db 0x92,0x03,'Brightness value',0 -db 0x92,0x04,'Exposure compensation',0 -db 0x92,0x05,'Max aperture value',0 -db 0x92,0x06,'Subject distance',0 -db 0x92,0x07,'Metering mode',0 -db 0x92,0x08,'Light source',0 -db 0x92,0x09,'Flash',0 -db 0x92,0x0a,'Focal length',0 -db 0x92,0x11,'Image number',0 -db 0x92,0x12,'Security classification',0 -db 0x92,0x13,'Image history',0 -db 0x92,0x14,'Subject area',0 -db 0x92,0x7c,'Maker note',0 -db 0x92,0x86,'User comment',0 -db 0x92,0x90,'Sub sec time',0 -db 0x92,0x91,'Sub sec time original',0 -db 0x92,0x92,'Sub sec time digitized',0 -db 0xa0,0x00,'Flashpix version',0 -db 0xa0,0x01,'Color space',0 -db 0xa0,0x02,'Exif image width',0 -db 0xa0,0x03,'Exif image height',0 -db 0xa0,0x04,'Related sound file',0 -db 0xa0,0x05,'Interop offset',0 -db 0xa2,0x0b,'Flash energy',0 -db 0xa2,0x0e,'Focal plane X resolution',0 -db 0xa2,0x0f,'Focal plane Y resolution',0 -db 0xa2,0x10,'Focal plane resolution unit',0 -db 0xa2,0x14,'Subject location',0 -db 0xa2,0x15,'Exposure index',0 -db 0xa2,0x17,'Sensing method',0 -db 0xa3,0x00,'File source',0 -db 0xa3,0x01,'Scene type',0 -db 0xa3,0x02,'CFA pattern',0 -db 0xa4,0x01,'Custom rendered',0 -db 0xa4,0x02,'Exposure mode',0 -db 0xa4,0x03,'White balance',0 -db 0xa4,0x04,'Digital zoom ratio',0 -db 0xa4,0x05,'Focal length in 35mm format',0 -db 0xa4,0x06,'Scene capture type',0 -db 0xa4,0x07,'Gain control',0 -db 0xa4,0x08,'Contrast',0 -db 0xa4,0x09,'Saturation',0 -db 0xa4,0x0a,'Sharpness',0 -db 0xa4,0x0b,'Device setting description',0 -db 0xa4,0x0c,'Subject distance range',0 -db 0xa4,0x20,'Image unique ID',0 -db 0xa4,0x30,'Owner name',0 -db 0xa4,0x31,'Serial number',0 -db 0xa4,0x32,'Lens info',0 -db 0xa4,0x33,'Lens make',0 -db 0xa4,0x34,'Lens model',0 -db 0xa4,0x35,'Lens serial number',0 -db 0xa5,0x00,'Gamma',0 -db 0xea,0x1c,'Padding',0 -db 0xea,0x1d,'Offset schema',0 -db 0xfd,0xe8,'Owner name',0 -db 0xfd,0xe9,'Serial number',0 -db 0xfd,0xea,'Lens',0 -db 0xfe,0x4c,'Raw file',0 -db 0xfe,0x4d,'Converter',0 -db 0xfe,0x4e,'White balance',0 -db 0xfe,0x51,'Exposure',0 -db 0xfe,0x52,'Shadows',0 -db 0xfe,0x53,'Brightness',0 -db 0xfe,0x54,'Contrast',0 -db 0xfe,0x55,'Saturation',0 -db 0xfe,0x56,'Sharpness',0 -db 0xfe,0x57,'Smoothness',0 -db 0xfe,0x58,'Moire filter',0 - -dd 0 - -align 4 -gr_a005: -db 0x00,0x01,'Interop index',0 -db 0x00,0x02,'Interop version',0 -db 0x10,0x00,'Related image file format',0 -db 0x10,0x01,'Related image width',0 -db 0x10,0x02,'Related image height',0 -dd 0 - -align 4 -gr_8825: -db 0x00,0x00,'GPS version ID',0 -db 0x00,0x01,'GPS latitude ref',0 -db 0x00,0x02,'GPS latitude',0 -db 0x00,0x03,'GPS longitude ref',0 -db 0x00,0x04,'GPS longitude',0 -db 0x00,0x05,'GPS altitude ref',0 -db 0x00,0x06,'GPS altitude',0 -db 0x00,0x07,'GPS time stamp',0 -db 0x00,0x08,'GPS satellites',0 -db 0x00,0x09,'GPS status',0 -db 0x00,0x0a,'GPS measuremode',0 -db 0x00,0x0b,'GPS dop',0 -db 0x00,0x0c,'GPS speed ref',0 -db 0x00,0x0d,'GPS speed',0 -db 0x00,0x0e,'GPS track ref',0 -db 0x00,0x0f,'GPS track',0 -db 0x00,0x10,'GPS img direction ref',0 -db 0x00,0x11,'GPS img direction',0 -db 0x00,0x12,'GPS map datum',0 -db 0x00,0x13,'GPS dest latitude ref',0 -db 0x00,0x14,'GPS dest latitude',0 -db 0x00,0x15,'GPS dest longitude ref',0 -db 0x00,0x16,'GPS dest longitude',0 -db 0x00,0x17,'GPS dest bearing ref',0 -db 0x00,0x18,'GPS dest bearing',0 -db 0x00,0x19,'GPS dest distance ref',0 -db 0x00,0x1a,'GPS dest distance',0 -db 0x00,0x1b,'GPS processing method',0 -db 0x00,0x1c,'GPS area information',0 -db 0x00,0x1d,'GPS date stamp',0 -db 0x00,0x1e,'GPS differential',0 -db 0x00,0x1f,'GPS h positioning error',0 - -dd 0 - -;данные app2 для Nikon -align 4 -gr_927c_Ni: -db 0x00,0x01,'MakerNoteVersion',0 -db 0x00,0x02,'ISO',0 -db 0x00,0x03,'ColorMode',0 -db 0x00,0x04,'Quality',0 -db 0x00,0x05,'WhiteBalance',0 -db 0x00,0x06,'Sharpness',0 -db 0x00,0x07,'FocusMode',0 -db 0x00,0x08,'FlashSetting',0 -db 0x00,0x09,'FlashType',0 -db 0x00,0x0b,'WhiteBalanceFineTune',0 -db 0x00,0x0c,'WB_RBLevels',0 -db 0x00,0x0d,'ProgramShift',0 -db 0x00,0x0e,'ExposureDifference',0 -db 0x00,0x0f,'ISOSelection',0 -db 0x00,0x10,'DataDump',0 -db 0x00,0x11,'PreviewIFD',0 -db 0x00,0x12,'FlashExposureComp',0 -db 0x00,0x13,'ISOSetting',0 -db 0x00,0x14,'ColorBalanceA ',0 -db 0x00,0x16,'ImageBoundary',0 -db 0x00,0x17,'ExternalFlashExposureComp',0 -db 0x00,0x18,'FlashExposureBracketValue',0 -db 0x00,0x19,'ExposureBracketValue',0 -db 0x00,0x1a,'ImageProcessing',0 -db 0x00,0x1b,'CropHiSpeed',0 -db 0x00,0x1c,'ExposureTuning',0 -db 0x00,0x1d,'SerialNumber',0 -db 0x00,0x1e,'ColorSpace',0 -db 0x00,0x1f,'VRInfo',0 -db 0x00,0x20,'ImageAuthentication',0 -db 0x00,0x21,'FaceDetect',0 -db 0x00,0x22,'ActiveD-Lighting',0 -db 0x00,0x23,'PictureControlData',0 -db 0x00,0x24,'WorldTime',0 -db 0x00,0x25,'ISOInfo',0 -db 0x00,0x2a,'VignetteControl',0 -db 0x00,0x2b,'DistortInfo',0 -db 0x00,0x2c,'UnknownInfo',0 -db 0x00,0x32,'UnknownInfo2',0 -db 0x00,0x35,'HDRInfo',0 -db 0x00,0x39,'LocationInfo',0 -db 0x00,0x3d,'BlackLevel',0 -db 0x00,0x80,'ImageAdjustment',0 -db 0x00,0x81,'ToneComp',0 -db 0x00,0x82,'AuxiliaryLens',0 -db 0x00,0x83,'LensType',0 -db 0x00,0x84,'Lens',0 -db 0x00,0x85,'ManualFocusDistance',0 -db 0x00,0x86,'DigitalZoom',0 -db 0x00,0x87,'FlashMode',0 -db 0x00,0x88,'AFInfo',0 -db 0x00,0x89,'ShootingMode',0 -db 0x00,0x8b,'LensFStops',0 -db 0x00,0x8c,'ContrastCurve',0 -db 0x00,0x8d,'ColorHue',0 -db 0x00,0x8f,'SceneMode',0 -db 0x00,0x90,'LightSource',0 -db 0x00,0x91,'ShotInfo',0 -db 0x00,0x92,'HueAdjustment',0 -db 0x00,0x93,'NEFCompression',0 -db 0x00,0x94,'Saturation',0 -db 0x00,0x95,'NoiseReduction',0 -db 0x00,0x96,'NEFLinearizationTable',0 -db 0x00,0x97,'ColorBalance',0 -db 0x00,0x98,'LensData',0 -db 0x00,0x99,'RawImageCenter',0 -db 0x00,0x9a,'SensorPixelSize',0 -db 0x00,0x9c,'SceneAssist',0 -db 0x00,0x9e,'RetouchHistory',0 -db 0x00,0xa0,'SerialNumber',0 -db 0x00,0xa2,'ImageDataSize',0 -db 0x00,0xa5,'ImageCount',0 -db 0x00,0xa6,'DeletedImageCount',0 -db 0x00,0xa7,'ShutterCount',0 -db 0x00,0xa8,'FlashInfo',0 -db 0x00,0xa9,'ImageOptimization',0 -db 0x00,0xaa,'Saturation',0 -db 0x00,0xab,'VariProgram',0 -db 0x00,0xac,'ImageStabilization',0 -db 0x00,0xad,'AFResponse',0 -db 0x00,0xb0,'MultiExposure',0 -db 0x00,0xb1,'HighISONoiseReduction',0 -db 0x00,0xb3,'ToningEffect',0 -db 0x00,0xb6,'PowerUpTime',0 -db 0x00,0xb7,'AFInfo2',0 -db 0x00,0xb8,'FileInfo',0 -db 0x00,0xb9,'AFTune',0 -db 0x00,0xbd,'PictureControlData',0 -db 0x00,0xc3,'BarometerInfo',0 -db 0x0e,0x00,'PrintIM',0 -db 0x0e,0x01,'NikonCaptureData',0 -db 0x0e,0x09,'NikonCaptureVersion',0 -db 0x0e,0x0e,'NikonCaptureOffsets',0 -db 0x0e,0x10,'NikonScanIFD',0 -db 0x0e,0x13,'NikonCaptureEditVersions ',0 -db 0x0e,0x1d,'NikonICCProfile',0 -db 0x0e,0x1e,'NikonCaptureOutput',0 -db 0x0e,0x22,'NEFBitDepth',0 - -dd 0 - -;данные app2 для Panasonic -align 4 -gr_927c_Pa: -db 0x00,0x01,'ImageQuality',0 -db 0x00,0x02,'FirmwareVersion',0 -db 0x00,0x03,'WhiteBalance',0 -db 0x00,0x07,'FocusMode',0 -db 0x00,0x0f,'AFAreaMode',0 -db 0x00,0x1a,'ImageStabilization',0 -db 0x00,0x1c,'MacroMode',0 -db 0x00,0x1f,'ShootingMode',0 -db 0x00,0x20,'Audio',0 -db 0x00,0x21,'DataDump',0 -db 0x00,0x23,'WhiteBalanceBias',0 -db 0x00,0x24,'FlashBias',0 -db 0x00,0x25,'InternalSerialNumber',0 -db 0x00,0x26,'PanasonicExifVersion',0 -db 0x00,0x28,'ColorEffect',0 -db 0x00,0x29,'TimeSincePowerOn',0 -db 0x00,0x2a,'BurstMode',0 -db 0x00,0x2b,'SequenceNumber',0 -db 0x00,0x2c,'ContrastMode',0 -db 0x00,0x2d,'NoiseReduction',0 -db 0x00,0x2e,'SelfTimer',0 -db 0x00,0x30,'Rotation',0 -db 0x00,0x31,'AFAssistLamp',0 -db 0x00,0x32,'ColorMode',0 -db 0x00,0x33,'BabyAge',0 -db 0x00,0x34,'OpticalZoomMode',0 -db 0x00,0x35,'ConversionLens',0 -db 0x00,0x36,'TravelDay',0 -db 0x00,0x39,'Contrast',0 -db 0x00,0x3a,'WorldTimeLocation',0 -db 0x00,0x3b,'TextStamp',0 -db 0x00,0x3c,'ProgramISO',0 -db 0x00,0x3d,'AdvancedSceneType',0 -db 0x00,0x3f,'FacesDetected',0 -db 0x00,0x40,'Saturation',0 -db 0x00,0x41,'Sharpness',0 -db 0x00,0x42,'FilmMode',0 -db 0x00,0x44,'ColorTempKelvin',0 -db 0x00,0x45,'BracketSettings',0 -db 0x00,0x46,'WBShiftAB',0 -db 0x00,0x47,'WBShiftGM',0 -db 0x00,0x48,'FlashCurtain',0 -db 0x00,0x49,'LongExposureNoiseReduction',0 -db 0x00,0x4b,'PanasonicImageWidth',0 -db 0x00,0x4c,'PanasonicImageHeight',0 -db 0x00,0x4d,'AFPointPosition',0 -db 0x00,0x51,'LensType',0 -db 0x00,0x52,'LensSerialNumber',0 -db 0x00,0x53,'AccessoryType',0 -db 0x00,0x54,'AccessorySerialNumber',0 -db 0x00,0x59,'Transform',0 -db 0x00,0x5d,'IntelligentExposure',0 -db 0x00,0x60,'LensFirmwareVersion',0 -db 0x00,0x61,'FaceRecInfo',0 -db 0x00,0x62,'FlashWarning',0 -db 0x00,0x63,'RecognizedFaceFlags',0 -db 0x00,0x65,'Title',0 -db 0x00,0x66,'BabyName',0 -db 0x00,0x67,'Location',0 -db 0x00,0x69,'Country',0 -db 0x00,0x6b,'State',0 -db 0x00,0x6d,'City',0 -db 0x00,0x6f,'Landmark',0 -db 0x00,0x70,'IntelligentResolution',0 -db 0x00,0x77,'BurstSpeed',0 -db 0x00,0x79,'IntelligentD-Range',0 -db 0x00,0x7c,'ClearRetouch',0 -db 0x00,0x86,'ManometerPressure',0 -db 0x00,0x89,'PhotoStyle',0 -db 0x00,0x8a,'ShadingCompensation',0 -db 0x00,0x8c,'AccelerometerZ',0 -db 0x00,0x8d,'AccelerometerX',0 -db 0x00,0x8e,'AccelerometerY',0 -db 0x00,0x8f,'CameraOrientation',0 -db 0x00,0x90,'RollAngle',0 -db 0x00,0x91,'PitchAngle',0 -db 0x00,0x93,'SweepPanoramaDirection',0 -db 0x00,0x94,'SweepPanoramaFieldOfView',0 -db 0x00,0x96,'TimerRecording',0 -db 0x00,0x9d,'InternalNDFilter',0 -db 0x00,0x9e,'HDR',0 -db 0x00,0x9f,'ShutterType',0 -db 0x00,0xa3,'ClearRetouchValue',0 -db 0x00,0xab,'TouchAE',0 -db 0x0e,0x00,'PrintIM',0 -db 0x80,0x00,'MakerNoteVersion',0 -db 0x80,0x01,'SceneMode',0 -db 0x80,0x04,'WBRedLevel',0 -db 0x80,0x05,'WBGreenLevel',0 -db 0x80,0x06,'WBBlueLevel',0 -db 0x80,0x07,'FlashFired',0 -db 0x80,0x08,'TextStamp',0 -db 0x80,0x09,'TextStamp',0 -db 0x80,0x10,'BabyAge',0 -db 0x80,0x12,'Transform',0 - -dd 0 - -;данные app2 для Canon -align 4 -gr_927c_Ca: -db 0x00,0x01,'CanonCameraSettings',0 -db 0x00,0x02,'CanonFocalLength',0 -db 0x00,0x03,'CanonFlashInfo?',0 -db 0x00,0x04,'CanonShotInfo',0 -db 0x00,0x05,'CanonPanorama',0 -db 0x00,0x06,'CanonImageType',0 -db 0x00,0x07,'CanonFirmwareVersion',0 -db 0x00,0x08,'FileNumber',0 -db 0x00,0x09,'OwnerName',0 -db 0x00,0x0a,'UnknownD30',0 -db 0x00,0x0c,'SerialNumber',0 -db 0x00,0x0d,'CanonCameraInfo',0 -db 0x00,0x0e,'CanonFileLength',0 -db 0x00,0x0f,'CustomFunctions',0 -db 0x00,0x10,'CanonModelID',0 -db 0x00,0x11,'MovieInfo',0 -db 0x00,0x12,'CanonAFInfo',0 -db 0x00,0x13,'ThumbnailImageValidArea',0 -db 0x00,0x15,'SerialNumberFormat',0 -db 0x00,0x1a,'SuperMacro',0 -db 0x00,0x1c,'DateStampMode',0 -db 0x00,0x1d,'MyColors',0 -db 0x00,0x1e,'FirmwareRevision',0 -db 0x00,0x23,'Categories',0 -db 0x00,0x24,'FaceDetect1',0 -db 0x00,0x25,'FaceDetect2',0 -db 0x00,0x26,'CanonAFInfo2',0 -db 0x00,0x27,'ContrastInfo',0 -db 0x00,0x28,'ImageUniqueID',0 -db 0x00,0x2f,'FaceDetect3',0 -db 0x00,0x35,'TimeInfo',0 -db 0x00,0x81,'RawDataOffset',0 -db 0x00,0x83,'OriginalDecisionDataOffset',0 -db 0x00,0x90,'CustomFunctions1D',0 -db 0x00,0x91,'PersonalFunctions',0 -db 0x00,0x92,'PersonalFunctionValues',0 -db 0x00,0x93,'CanonFileInfo',0 -db 0x00,0x94,'AFPointsInFocus1D',0 -db 0x00,0x95,'LensModel',0 -db 0x00,0x96,'SerialInfo ',0 -db 0x00,0x97,'DustRemovalData',0 -db 0x00,0x98,'CropInfo',0 -db 0x00,0x99,'CustomFunctions2',0 -db 0x00,0x9a,'AspectInfo',0 -db 0x00,0xa0,'ProcessingInfo',0 -db 0x00,0xa1,'ToneCurveTable',0 -db 0x00,0xa2,'SharpnessTable',0 -db 0x00,0xa3,'SharpnessFreqTable',0 -db 0x00,0xa4,'WhiteBalanceTable',0 -db 0x00,0xa9,'ColorBalance',0 -db 0x00,0xaa,'MeasuredColor',0 -db 0x00,0xae,'ColorTemperature',0 -db 0x00,0xb0,'CanonFlags',0 -db 0x00,0xb1,'ModifiedInfo',0 -db 0x00,0xb2,'ToneCurveMatching',0 -db 0x00,0xb3,'WhiteBalanceMatching',0 -db 0x00,0xb4,'ColorSpace',0 -db 0x00,0xb6,'PreviewImageInfo',0 -db 0x00,0xd0,'VRDOffset',0 -db 0x00,0xe0,'SensorInfo',0 -db 0x40,0x01,'ColorData',0 -db 0x40,0x02,'CRWParam?',0 -db 0x40,0x03,'ColorInfo',0 -db 0x40,0x05,'Flavor?',0 -db 0x40,0x08,'BlackLevel?',0 -db 0x40,0x10,'CustomPictureStyleFileName',0 -db 0x40,0x13,'AFMicroAdj',0 -db 0x40,0x15,'VignettingCorr ',0 -db 0x40,0x16,'VignettingCorr2',0 -db 0x40,0x18,'LightingOpt',0 -db 0x40,0x19,'LensInfo',0 -db 0x40,0x20,'AmbienceInfo',0 -db 0x40,0x24,'FilterInfo',0 - -dd 0 - -;данные app2 для Samsung -align 4 -gr_927c_Sa: -db 0x00,0x01,'MakerNoteVersion',0 -db 0x00,0x02,'DeviceType',0 -db 0x00,0x03,'SamsungModelID',0 -db 0x00,0x21,'PictureWizard',0 -db 0x00,0x30,'LocalLocationName',0 -db 0x00,0x31,'LocationName',0 -db 0x00,0x35,'PreviewIFD',0 -db 0x00,0x43,'CameraTemperature',0 -db 0x00,0x45,'RawCompressionMode',0 -db 0x01,0x00,'FaceDetect',0 -db 0x01,0x20,'FaceRecognition',0 -db 0x01,0x23,'FaceName',0 -db 0xa0,0x01,'FirmwareName',0 -db 0xa0,0x03,'LensType',0 -db 0xa0,0x04,'LensFirmware',0 -db 0xa0,0x05,'InternalLensSerialNumber',0 -db 0xa0,0x10,'SensorAreas',0 -db 0xa0,0x11,'ColorSpace',0 -db 0xa0,0x12,'SmartRange',0 -db 0xa0,0x13,'ExposureCompensation',0 -db 0xa0,0x14,'ISO',0 -db 0xa0,0x18,'ExposureTime',0 -db 0xa0,0x19,'FNumber',0 -db 0xa0,0x1a,'FocalLengthIn35mmFormat',0 -db 0xa0,0x20,'EncryptionKey',0 -db 0xa0,0x21,'WB_RGGBLevelsUncorrected',0 -db 0xa0,0x22,'WB_RGGBLevelsAuto',0 -db 0xa0,0x23,'WB_RGGBLevelsIlluminator1',0 -db 0xa0,0x24,'WB_RGGBLevelsIlluminator2',0 -db 0xa0,0x28,'WB_RGGBLevelsBlack',0 -db 0xa0,0x30,'ColorMatrix',0 -db 0xa0,0x31,'ColorMatrixSRGB',0 -db 0xa0,0x32,'ColorMatrixAdobeRGB',0 -db 0xa0,0x33,'CbCrMatrixDefault',0 -db 0xa0,0x34,'CbCrMatrix',0 -db 0xa0,0x35,'CbCrGainDefault',0 -db 0xa0,0x36,'CbCrGain',0 -db 0xa0,0x40,'ToneCurveSRGBDefault',0 -db 0xa0,0x41,'ToneCurveAdobeRGBDefault',0 -db 0xa0,0x42,'ToneCurveSRGB',0 -db 0xa0,0x43,'ToneCurveAdobeRGB',0 -db 0xa0,0x48,'RawData?',0 -db 0xa0,0x50,'Distortion?',0 -db 0xa0,0x51,'ChromaticAberration?',0 -db 0xa0,0x52,'Vignetting?',0 -db 0xa0,0x53,'VignettingCorrection?',0 -db 0xa0,0x54,'VignettingSetting?',0 - -dd 0 - -;input: -; bof - указатель на начало файла -; app1 - указатель для заполнения exif.app1 -;output: -; app1 - указатель на начало exif.app1 (или 0 если не найдено или формат файла не поддерживается) -align 4 -proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword - mov eax,[bof] - mov edi,[app1] - - ;файл в формате jpg? - cmp word[eax],0xd8ff - jne .no_exif - add eax,2 - - ;файл содержит exif.app0? - cmp word[eax],0xe0ff - jne @f - add eax,2 - movzx ebx,word[eax] - ror bx,8 ;всегда ли так надо? - add eax,ebx - @@: - - ;файл содержит exif.app1? - cmp word[eax],0xe1ff - jne .no_exif - - xor ebx,ebx - cmp word[eax+10],'II' - je @f - inc ebx ;if 'MM' edx=1 - @@: - mov word[edi+offs_m_or_i],bx ;способ выравнивания чисел - mov dword[edi+offs_id_gr],0 ;id групы и производителя, который всегда 0 для app1 - add eax,18 - mov [edi],eax - sub eax,8 - mov [edi+4],eax - - jmp @f - .no_exif: - mov dword[edi],0 - @@: - ret -endp - -;input: -; app1 - указатель на начало exif.app1 -; num - порядковый номер тега (начинается с 1) -; txt - указатель на текст, куда будет записано значение -; t_max - максимальный размер текста -;output: -; txt - заполняется текстом в виде "параметр: значение", если не найдено то пустая строка -align 4 -proc exif_get_tag, app1:dword, num:dword, txt:dword, t_max:dword -pushad - mov eax,[app1] - mov edi,[txt] - mov ecx,[num] - - xor edx,edx - mov byte[edi],dl - cmp [eax],edx - je .end_f ;если не найден указатель на начало exif.app1 - cmp ecx,edx - jle .end_f ;если порядковый номер тега <= 0 - - movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 - - ;проверяем число тегов - mov eax,[eax] - movzx ebx,word[eax] - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp ecx,ebx - jg .end_f ;если номер тега больше чем их есть в файле - - ;переходим на заданный тег - dec ecx - imul ecx,tag_size - add eax,offs_tag_0 - add eax,ecx - - stdcall read_tag_value,[app1],[t_max] - - .end_f: -popad - ret -endp - -;input: -; app1 - указатель на начало exif.app1 -; id - идентификатор тега значение которого нужно найти -; txt - указатель на текст, куда будет записано значение -; t_max - максимальный размер текста -;output: -; txt - заполняется текстом в виде "параметр: значение", если не найдено то пустая строка -align 4 -proc exif_get_tag_id, app1:dword, id:dword, txt:dword, t_max:dword -pushad - mov eax,[app1] - mov edi,[txt] - - xor edx,edx - mov byte[edi],dl - cmp [eax],edx - je .end_f ;если не найден указатель на начало exif.app1 - - mov ebx,[id] - movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 - bt edx,0 - jnc @f - ror bx,8 - @@: - - ;берем число тегов - mov eax,[eax] - movzx ecx,word[eax] - bt edx,0 - jnc @f - ror cx,8 - @@: - ;в ecx - число тегов - - ;ищем заданный тег - add eax,offs_tag_0 - .cycle_0: - cmp word[eax],bx ;word[eax+0] - код тега - je @f - add eax,tag_size - loop .cycle_0 - jmp .end_f - @@: - stdcall read_tag_value,[app1],[t_max] - .end_f: -popad - ret -endp - -;input: -; app1 - указатель на exif.app1 или на exif.app1.child -; child - указатель для заполнения начала дочерних тегов exif.app1.child -; c_tag - тег для которого делается поиск дочерних -;output: -; child - указатель на начало дочерних тегов -align 4 -proc exif_get_child, app1:dword, child:dword , c_tag:dword -pushad - mov eax,[app1] - mov edi,[child] - - xor edx,edx - cmp [eax],edx - je .no_found ;если не найден указатель на начало exif.app1 - - movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 - - ;начало поиска - mov ebx,[c_tag] - bt edx,0 - jnc @f - ror bx,8 - @@: - - ;проверяем число тегов - mov eax,[eax] - movzx ecx,word[eax] - bt edx,0 - jnc @f - ror cx,8 - @@: - cmp ecx,1 - jl .no_found ;если число тегов <1 - - ;переходим на 1-й тег - add eax,offs_tag_0 - @@: - cmp word[eax],bx - je @f - add eax,tag_size - loop @b - jmp .no_found ;если не найдено - @@: ;если найдено - mov ebx,dword[eax+8] - bt edx,0 - jnc @f - bswap ebx - @@: - mov eax,[app1] - add ebx,[eax+4] - mov dword[edi],ebx - m2m dword[edi+4],dword[eax+4] - ror edx,16 - mov dx,word[c_tag] - ror edx,16 - mov dword[edi+offs_m_or_i],edx - m2m word[edi+offs_id_gr_mak],word[eax+offs_id_gr_mak] - - jmp .end_f - .no_found: - mov dword[edi],0 - .end_f: -popad - ret -endp - -;output: -; app2 - указатель на начало exif.app2 (или 0 если не найдено или формат файла не поддерживается) -align 4 -proc exif_get_app2, app1:dword, app2:dword -pushad - mov edi,[app2] - mov eax,[app1] - xor edx,edx - cmp [eax],edx - je .no_suport ;если не найден указатель на начало exif.app1 - - movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 - - ;начало поиска производителя камеры - mov ebx,0x010f - bt edx,0 - jnc @f - ror bx,8 - @@: - - ;проверяем число тегов - mov eax,[eax] - movzx ecx,word[eax] - bt edx,0 - jnc @f - ror cx,8 - @@: - cmp ecx,1 - jl .no_suport ;если число тегов <1 - - ;переходим на 1-й тег - add eax,offs_tag_0 - @@: - cmp word[eax],bx - je @f - add eax,tag_size - loop @b - jmp .no_suport ;если не найдено - @@: ;если найдено - mov ebx,dword[eax+4] - bt edx,0 - jnc @f - bswap ebx - @@: - cmp ebx,4 - jle .no_suport ;название производителя меньше 4 символов, не поддержиавается - - mov ebx,dword[eax+8] - bt edx,0 - jnc @f - bswap ebx - @@: - - ;проверка поддерживаемых производителей - mov eax,[app1] - add ebx,[eax+4] - cmp dword[ebx],'Cano' - je .suport - cmp dword[ebx],'NIKO' - je .suport - cmp dword[ebx],'Pana' - je .suport - cmp dword[ebx],'SAMS' - je .suport - cmp dword[ebx],'sams' - je .suport - - ;все остальные не поддерживаются - jmp .no_suport - - .suport: - ;находим тег 0x8769 (расширенные данные по Exif) - stdcall exif_get_child, eax,edi,0x8769 - cmp dword[edi],0 - je .no_suport - ;находим тег 0x927c (данные Maker по камере) - stdcall exif_get_child, edi,edi, 0x927c - cmp dword[edi],0 - je .no_suport - - cmp dword[ebx],'NIKO' - jne @f - ;for Nikon - add dword[edi],18 - mov eax,dword[edi] - sub eax,8 - mov dword[edi+4],eax - mov word[edi+offs_id_gr_mak],'Ni' - jmp .end_f - @@: - cmp dword[ebx],'Pana' - jne @f - ;for Panasonic - add dword[edi],12 - mov word[edi+offs_id_gr_mak],'Pa' - jmp .end_f - @@: - cmp dword[ebx],'Cano' - jne @f - ;for Canon - mov word[edi+offs_id_gr_mak],'Ca' - jmp .end_f - @@: - - cmp dword[ebx],'SAMS' - je @f - cmp dword[ebx],'sams' - je @f - jmp .end_f - @@: - ;for Samsung - mov word[edi+offs_id_gr_mak],'Sa' - jmp .end_f - @@: - - .no_suport: - mov dword[edi],0 - .end_f: -popad - ret -endp - -;description: -; вспомогательная функция для чтения назначений тегов -;input: -; eax - указатель начала тега -; edi - указатель на память для записи текстовой строки -align 4 -proc read_tag_value, app1:dword, t_max:dword - push exif_tag_numbers - pop esi - - ;поиск таблицы для группы тегов - mov ebx,[app1] - mov ebx,dword[ebx+offs_id_gr] ;берем идентификатор группы тегов - @@: - cmp dword[esi],ebx - je .set_table - add esi,8 - cmp esi,exif_tag_numbers.end - jge .tag_unknown ;тег не опознан (не найдена таблица группы тегов) - jmp @b - .set_table: - mov esi,dword[esi+4] ;установка адреса таблицы в esi - - ;поиск названия тега в таблице - .next_tag: - mov bx,word[esi] - cmp bx,0 - jne @f - cmp dword[esi],0 - jne @f - jmp .tag_unknown ;тег не опознан (в группе не найден тег) - @@: - bt edx,0 - jc @f - ror bx,8 - @@: - cmp word[eax],bx - je .found - inc esi - @@: - inc esi - cmp byte[esi],0 - jne @b - inc esi - jmp .next_tag - .found: - - ;копируем строку с названием тега - add esi,2 - stdcall str_n_cat,edi,esi,[t_max] - - jmp .start_read - .tag_unknown: - ;если тег не найден ставим его код вместо названия - movzx ebx,word[eax] - bt edx,0 - jnc @f - ror bx,8 - @@: - stdcall hex_in_str, edi, ebx,4 - mov byte[edi+4],0 - .start_read: - - ;читаем информацию в теге - mov bx,tag_format_ui1b - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_01 - stdcall str_n_cat,edi,txt_dp,[t_max] - call get_tag_data_size - cmp ebx,4 - jg .over4b_01 - cmp ebx,1 - je @f - or edx,2 ;array data - mov ecx,dword[eax+8] - mov dh,bl - @@: - ;если 1 одно байтовое число - movzx ebx,byte[eax+8] - stdcall str_len,edi - add edi,eax - mov eax,ebx - stdcall convert_int_to_str, [t_max] - bt edx,1 - jnc .end_f - @@: - ;если от 2 до 4 одно байтовых чисел - dec dh - cmp dh,0 - je .end_f - shr ecx,8 - stdcall str_n_cat,edi,txt_zap,[t_max] - stdcall str_len,edi - add edi,eax - movzx eax,cl - stdcall convert_int_to_str, [t_max] - jmp @b - .over4b_01: - ;... - jmp .end_f - .tag_01: - - mov bx,tag_format_text - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_02 - stdcall str_n_cat,edi,txt_dp,[t_max] - call get_tag_data_size ;проверяем длинну строки - cmp ebx,4 - jg @f - ;если строка помещается в 4 символа - mov esi,eax - add esi,8 - stdcall str_n_cat,edi,esi,[t_max] - jmp .end_f - ;если строка не помещается в 4 символа - @@: - mov esi,dword[eax+8] - bt edx,0 - jnc @f - bswap esi - @@: - mov eax,[app1] - mov eax,[eax+4] - add esi,eax - stdcall str_n_cat,edi,esi,[t_max] - jmp .end_f - .tag_02: - - mov bx,tag_format_ui2b - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_03 - stdcall str_n_cat,edi,txt_dp,[t_max] - call get_tag_data_size - cmp ebx,2 - jg .over4b_03 - jne @f - ;если два 2 байтовых числа - or edx,2 ;array data - movzx ecx,word[eax+10] - bt edx,0 - jnc @f - ror cx,8 - @@: - ;если одно 2 байтовое число - movzx ebx,word[eax+8] - bt edx,0 - jnc @f - ror bx,8 - @@: - stdcall str_len,edi - add edi,eax - mov eax,ebx - stdcall convert_int_to_str, [t_max] - bt edx,1 ;array ? - jnc .end_f - ;добавляем 2-е число - stdcall str_n_cat,edi,txt_zap,[t_max] - stdcall str_len,edi - add edi,eax - mov eax,ecx - stdcall convert_int_to_str, [t_max] - jmp .end_f - .over4b_03: - mov ecx,[t_max] - mov esi,dword[eax+8] - bt edx,0 - jnc @f - bswap esi - @@: - mov eax,[app1] - mov eax,[eax+4] - add esi,eax - - ;берем число - .array_03: - stdcall str_len,edi - cmp ecx,eax - jle .end_f ;если не хватило строки - add edi,eax - sub ecx,eax - movzx eax,word[esi] - bt edx,0 - jnc @f - ror ax,8 - @@: - stdcall convert_int_to_str,ecx - - dec ebx - cmp ebx,0 - je .end_f - - ;добавляем запятую - stdcall str_n_cat,edi,txt_zap,ecx - add esi,2 - jmp .array_03 - .tag_03: - - mov bx,tag_format_ui4b - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_04 - stdcall str_n_cat,edi,txt_dp,[t_max] - call get_tag_data_size - cmp ebx,1 - jg .over4b_04 - ;если одно 4 байтовое число - mov ebx,dword[eax+8] - bt edx,0 - jnc @f - bswap ebx - @@: - stdcall str_len,edi - add edi,eax - mov eax,ebx - stdcall convert_int_to_str, [t_max] - .over4b_04: - ;... - jmp .end_f - .tag_04: - - mov bx,tag_format_urb - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_05 - stdcall str_n_cat,edi,txt_dp,[t_max] - ;call get_tag_data_size - ;cmp ebx,1 - ;jg .over4b_05 - mov ebx,dword[eax+8] - bt edx,0 - jnc @f - bswap ebx - @@: - stdcall str_len,edi - add edi,eax - mov eax,[app1] - mov eax,[eax+4] - add ebx,eax - mov eax,[ebx] - bt edx,0 - jnc @f - bswap eax - @@: - stdcall convert_int_to_str, [t_max] ;ставим 1-е число - stdcall str_n_cat,edi,txt_div,[t_max] ;ставим знак деления - stdcall str_len,edi - add edi,eax - mov eax,[ebx+4] - bt edx,0 - jnc @f - bswap eax - @@: - stdcall convert_int_to_str, [t_max] ;ставим 2-е число - ;.over4b_05: - ;... - jmp .end_f - .tag_05: - - mov bx,tag_format_si2b - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_08 - stdcall str_n_cat,edi,txt_dp,[t_max] - call get_tag_data_size - cmp ebx,2 - jg .over4b_08 - jne @f - ;если два 2 байтовых числа - or edx,2 ;array data - movzx ecx,word[eax+10] - bt edx,0 - jnc @f - ror cx,8 - @@: - ;если одно 2 байтовое число - movzx ebx,word[eax+8] - bt edx,0 - jnc @f - ror bx,8 - @@: - stdcall str_len,edi - add edi,eax - bt bx,15 - jnc @f - mov byte[edi],'-' - inc edi - neg bx - inc bx - @@: - mov eax,ebx - stdcall convert_int_to_str, [t_max] - bt edx,1 ;array ? - jnc .end_f - ;добавляем 2-е число - stdcall str_n_cat,edi,txt_zap,[t_max] - stdcall str_len,edi - add edi,eax - bt bx,15 - jnc @f - mov byte[edi],'-' - inc edi - neg bx - inc bx - @@: - mov eax,ecx - stdcall convert_int_to_str, [t_max] - jmp .end_f - .over4b_08: - mov ecx,[t_max] - mov esi,dword[eax+8] - bt edx,0 - jnc @f - bswap esi - @@: - mov eax,[app1] - mov eax,[eax+4] - add esi,eax - - ;берем число - .array_08: - stdcall str_len,edi - cmp ecx,eax - jle .end_f ;если не хватило строки - add edi,eax - sub ecx,eax - movzx eax,word[esi] - bt edx,0 - jnc @f - ror ax,8 - @@: - ;смотрим на знак +|- - bt ax,15 - jnc @f - mov byte[edi],'-' - inc edi - neg ax - inc ax - @@: - stdcall convert_int_to_str,ecx - - dec ebx - cmp ebx,0 - je .end_f - - ;добавляем запятую - stdcall str_n_cat,edi,txt_zap,ecx - add esi,2 - jmp .array_08 - .tag_08: - - mov bx,tag_format_si4b - bt edx,0 - jnc @f - ror bx,8 - @@: - cmp word[eax+2],bx - jne .tag_09 - stdcall str_n_cat,edi,txt_dp,[t_max] - call get_tag_data_size - cmp ebx,1 - jg .over4b_09 - ;если одно 4 байтовое число - mov ebx,dword[eax+8] - bt edx,0 - jnc @f - bswap ebx - @@: - stdcall str_len,edi - add edi,eax - bt ebx,31 - jnc @f - mov byte[edi],'-' - inc edi - neg ebx - inc ebx - @@: - mov eax,ebx - stdcall convert_int_to_str, [t_max] - .over4b_09: - ;... - jmp .end_f - .tag_09: - - .end_f: - ret -endp - -;input: -; eax - tag pointer -; edx - 1 if 'MM', 0 if 'II' -;output: -; ebx - data size -align 4 -get_tag_data_size: - mov ebx,dword[eax+4] - bt edx,0 - jnc @f - bswap ebx - @@: - ret - -align 4 -proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword - mov esi,dword[str2] - mov ecx,dword[n] - mov edi,dword[str1] - stdcall str_len,edi - add edi,eax - cld - repne movsb - mov byte[edi],0 - ret -endp - -;output: -; eax = strlen -align 4 -proc str_len, str1:dword - mov eax,[str1] - @@: - cmp byte[eax],0 - je @f - inc eax - jmp @b - @@: - sub eax,[str1] - ret -endp - -align 4 -proc hex_in_str, buf:dword,val:dword,zif:dword - pushad - mov edi,dword[buf] - mov ecx,dword[zif] - add edi,ecx - dec edi - mov ebx,dword[val] - - .cycle: - mov al,bl - and al,0xf - cmp al,10 - jl @f - add al,'a'-'0'-10 - @@: - add al,'0' - mov byte[edi],al - dec edi - shr ebx,4 - loop .cycle - - popad - ret -endp - -;input: -; eax - число -; edi - буфер для строки -; len - длинна буфера -;output: -align 4 -proc convert_int_to_str, len:dword -pushad - mov esi,[len] - add esi,edi - dec esi - call .str -popad - ret -endp - -align 4 -.str: - mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число - ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной - cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax - jb @f - xor edx,edx ;очистить edx - div ecx ;разделить - остаток в edx - push edx ;положить в стек - call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx - pop eax - @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) - cmp edi,esi - jge @f - or al,0x30 ;данная команда короче чем две выше - stosb ;записать элемент из регистра al в ячеку памяти es:edi - mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор - @@: - ret ;пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться - - - -align 16 -EXPORTS: - dd sz_exif_get_app1, exif_get_app1 - dd sz_exif_get_app2, exif_get_app2 - dd sz_exif_get_tag, exif_get_tag - dd sz_exif_get_tag_id, exif_get_tag_id - dd sz_exif_get_child, exif_get_child - dd 0,0 - sz_exif_get_app1 db 'exif_get_app1',0 - sz_exif_get_app2 db 'exif_get_app2',0 - sz_exif_get_tag db 'exif_get_tag',0 - sz_exif_get_tag_id db 'exif_get_tag_id',0 - sz_exif_get_child db 'exif_get_child',0 - +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page 866 - Cyrillic + + +format MS COFF +public EXPORTS +section '.flat' code readable align 16 + +include '../../../macros.inc' +include '../../../proc32.inc' + + + +;--------- +offs_m_or_i equ 8 ;смещение параметра 'MM' или 'II' (Motorola, Intel) +offs_id_gr equ 10 ;смещение id group +offs_id_gr_mak equ 12 ;смещение id group производителя +offs_tag_0 equ 2 ;смещение 0-го тега +tag_size equ 12 ;размер структуры тега +;форматы данных +tag_format_ui1b equ 1 ;unsigned integer 1 byte +tag_format_text equ 2 ;ascii string +tag_format_ui2b equ 3 ;unsigned integer 2 byte +tag_format_ui4b equ 4 ;unsigned integer 4 byte +tag_format_urb equ 5 ;unsigned integer 4/4 byte +tag_format_si1b equ 6 ;signed integer 1 byte +tag_format_undef equ 7 ;undefined +tag_format_si2b equ 8 ;signed integer 2 byte +tag_format_si4b equ 9 ;signed integer 4 byte +tag_format_srb equ 10 ;signed integer 4/4 byte +tag_format_f4b equ 11 ;float 4 byte +tag_format_f8b equ 12 ;float 8 byte + +align 4 +txt_dp db ': ',0 +txt_zap db ', ',0 +txt_div db '/',0 + +;заголовок таблиц с группами тегов +align 4 +exif_tag_numbers: +dd 0, gr_0 ;группа app1 +dd 0x8769, gr_8769 ;Exif offset +dd 0xa005, gr_a005 ;Interop offset +dd 0x8825, gr_8825 ;GPS info + +;групы app2 (здесь у каждого производителя камер свой формат тегов) +dw 0x927c ;app2 для Nikon +db 'Ni' +dd gr_927c_Ni + +dw 0x927c ;app2 для Panasonic +db 'Pa' +dd gr_927c_Pa + +dw 0x927c ;app2 для Canon +db 'Ca' +dd gr_927c_Ca + +dw 0x927c ;app2 для Samsung +db 'Sa' +dd gr_927c_Sa +.end: + +align 4 +gr_0: +db 0x00,0x0b,'Processing software',0 +db 0x00,0xfe,'Subfile type',0 +db 0x00,0xff,'OldSubfile type',0 +db 0x01,0x00,'Image width',0 +db 0x01,0x01,'Image height',0 +db 0x01,0x02,'Bits per sample',0 +db 0x01,0x03,'Compression',0 +db 0x01,0x06,'Photometric interpretation',0 +db 0x01,0x07,'Thresholding',0 +db 0x01,0x08,'Cell width',0 +db 0x01,0x09,'Cell length',0 +db 0x01,0x0a,'Fill order',0 +db 0x01,0x0d,'Document name',0 +db 0x01,0x0e,'Image description',0 +db 0x01,0x0f,'Manufacturer of digicam',0 +db 0x01,0x10,'Model',0 +db 0x01,0x11,'Strip offsets',0 +db 0x01,0x12,'Orientation',0 +db 0x01,0x15,'Samples per pixel',0 +db 0x01,0x16,'Rows per strip',0 +db 0x01,0x17,'Strip byte counts',0 +db 0x01,0x18,'Min sample value',0 +db 0x01,0x19,'Max sample value',0 +db 0x01,0x1a,'X resolution',0 +db 0x01,0x1b,'Y resolution',0 +db 0x01,0x1c,'Planar configuration',0 +db 0x01,0x1d,'Page name',0 +db 0x01,0x1e,'X position',0 +db 0x01,0x1f,'Y position',0 +db 0x01,0x20,'Free offsets',0 +db 0x01,0x21,'Free byte counts',0 +db 0x01,0x22,'Gray response unit',0 +db 0x01,0x23,'Gray response curve',0 +db 0x01,0x24,'T4 options',0 +db 0x01,0x25,'T6 options',0 +db 0x01,0x28,'Resolution unit',0 +db 0x01,0x29,'Page number',0 +db 0x01,0x2c,'Color response unit',0 +db 0x01,0x2d,'Transfer function',0 +db 0x01,0x31,'Software',0 +db 0x01,0x32,'Modify date',0 +db 0x01,0x3b,'Artist',0 +db 0x01,0x3c,'Host computer',0 +db 0x01,0x3d,'Predictor',0 +db 0x01,0x3e,'White point',0 +db 0x01,0x3f,'Primary chromaticities',0 +db 0x01,0x40,'Color map',0 +db 0x01,0x41,'Halftone hints',0 +db 0x01,0x42,'Tile width',0 +db 0x01,0x43,'Tile length',0 +db 0x01,0x44,'Tile offsets',0 +db 0x01,0x45,'Tile byte counts',0 +db 0x01,0x46,'Bad fax lines',0 +db 0x01,0x47,'Clean fax data',0 +db 0x01,0x48,'Consecutive bad fax lines',0 +db 0x01,0x4a,'Sub IFDs',0 +db 0x01,0x4c,'Ink set',0 +db 0x01,0x4d,'Ink names',0 +db 0x01,0x4e,'Numberof inks',0 +db 0x01,0x50,'Dot range',0 +db 0x01,0x51,'Target printer',0 +db 0x01,0x52,'Extra samples',0 +db 0x01,0x53,'Sample format',0 +db 0x01,0x54,'SMin sample value',0 +db 0x01,0x55,'SMax sample value',0 +db 0x01,0x56,'Transfer range',0 +db 0x01,0x57,'Clip path',0 +db 0x01,0x58,'X clip path units',0 +db 0x01,0x59,'Y clip path units',0 +db 0x01,0x5a,'Indexed',0 +db 0x01,0x5b,'JPEG tables',0 +db 0x01,0x5f,'OPIProxy',0 +db 0x01,0x90,'Global parameters IFD',0 +db 0x01,0x91,'Profile type',0 +db 0x01,0x92,'Fax profile',0 +db 0x01,0x93,'Coding methods',0 +db 0x01,0x94,'Version year',0 +db 0x01,0x95,'Mode number',0 +db 0x01,0xb1,'Decode',0 +db 0x01,0xb2,'Default image color',0 +db 0x01,0xb3,'T82 options',0 +db 0x01,0xb5,'JPEG tables',0 ;уже было ? +db 0x02,0x00,'JPEG proc',0 +db 0x02,0x01,'Thumbnail offset',0 +db 0x02,0x02,'Thumbnail length',0 +db 0x02,0x03,'JPEG restart interval',0 +db 0x02,0x05,'JPEG lossless predictors',0 +db 0x02,0x06,'JPEG point transforms',0 +db 0x02,0x07,'JPEG QTables',0 +db 0x02,0x08,'JPEG DCTables',0 +db 0x02,0x09,'JPEG ACTables',0 +db 0x02,0x11,'YCbCrCoefficients',0 +db 0x02,0x12,'YCbCrSubSampling',0 +db 0x02,0x13,'YCbCrPositioning',0 +db 0x02,0x14,'Reference black white',0 +db 0x02,0x2f,'Strip row counts',0 +db 0x03,0xe7,'USPTO Miscellaneous',0 +db 0x47,0x46,'Rating',0 +db 0x47,0x47,'XP_DIP_XML',0 +db 0x47,0x48,'Stitch info',0 +db 0x47,0x49,'Rating percent',0 +db 0x80,0x0d,'Image ID',0 +db 0x80,0xa3,'Wang tag 1',0 +db 0x80,0xa4,'Wang annotation',0 +db 0x80,0xa5,'Wang tag 3',0 +db 0x80,0xa6,'Wang tag 4',0 +db 0x80,0xe3,'Matteing',0 +db 0x80,0xe4,'Data type',0 +db 0x80,0xe5,'Image depth',0 +db 0x80,0xe6,'Tile depth',0 +db 0x82,0x7d,'Model 2',0 +db 0x82,0x8d,'CFA repeat pattern dim',0 +db 0x82,0x8e,'CFA pattern 2',0 +db 0x82,0x8f,'Battery level',0 +db 0x82,0x90,'Kodak IFD',0 +db 0x82,0x98,'Copyright',0 +db 0x82,0xa5,'MD file tag',0 +db 0x82,0xa6,'MD scale pixel',0 +db 0x82,0xa7,'MD color table',0 +db 0x82,0xa8,'MD lab name',0 +db 0x82,0xa9,'MD sample info',0 +db 0x82,0xaa,'MD prep date',0 +db 0x82,0xab,'MD prep time',0 +db 0x82,0xac,'MD file units',0 +db 0x83,0x0e,'Pixel scale',0 +db 0x83,0x35,'Advent scale',0 +db 0x83,0x36,'Advent revision',0 +db 0x83,0x5c,'UIC1 tag',0 +db 0x83,0x5d,'UIC2 tag',0 +db 0x83,0x5e,'UIC3 tag',0 +db 0x83,0x5f,'UIC4 tag',0 +db 0x83,0xbb,'IPTC-NAA',0 +db 0x84,0x7e,'Intergraph packet data',0 +db 0x84,0x7f,'Intergraph flag registers',0 +db 0x84,0x80,'Intergraph matrix',0 +db 0x84,0x81,'INGR reserved',0 +db 0x84,0x82,'Model tie point',0 +db 0x84,0xe0,'Site',0 +db 0x84,0xe1,'Color sequence',0 +db 0x84,0xe2,'IT8 header',0 +db 0x84,0xe3,'Raster padding',0 +db 0x84,0xe4,'Bits per run length',0 +db 0x84,0xe5,'Bits per extended run length',0 +db 0x84,0xe6,'Color table',0 +db 0x84,0xe7,'Image color indicator',0 +db 0x84,0xe8,'Background color indicator',0 +db 0x84,0xe9,'Image color value',0 +db 0x84,0xea,'Background color value',0 +db 0x84,0xeb,'Pixel intensity range',0 +db 0x84,0xec,'Transparency indicator',0 +db 0x84,0xed,'Color characterization',0 +db 0x84,0xee,'HCUsage',0 +db 0x84,0xef,'Trap indicator',0 +db 0x84,0xf0,'CMYK equivalent',0 +db 0x85,0x46,'SEM info',0 +db 0x85,0x68,'AFCP_IPTC',0 +db 0x85,0xb8,'Pixel magic JBIG options',0 +db 0x85,0xd8,'Model transform',0 +db 0x86,0x02,'WB_GRGB levels',0 +db 0x86,0x06,'Leaf data',0 +db 0x86,0x49,'Photoshop settings',0 +db 0x87,0x69,'Exif offset',0 +db 0x87,0x73,'ICC_Profile',0 +db 0x87,0x7f,'TIFF_FX extensions',0 +db 0x87,0x80,'Multi profiles',0 +db 0x87,0x81,'Shared data',0 +db 0x87,0x82,'T88 options',0 +db 0x87,0xac,'Image layer',0 +db 0x87,0xaf,'Geo tiff directory',0 +db 0x87,0xb0,'Geo tiff double params',0 +db 0x87,0xb1,'Geo tiff ascii params',0 +db 0x88,0x25,'GPS info',0 +db 0x88,0x28,'Opto-Electric conv factor',0 +db 0x88,0x29,'Interlace',0 +db 0x88,0x5c,'Fax recv params',0 +db 0x88,0x5d,'Fax sub address',0 +db 0x88,0x5e,'Fax recv time',0 +db 0x88,0x8a,'Leaf sub IFD',0 +db 0x92,0x0b,'Flash energy',0 +db 0x92,0x0c,'Spatial frequency response',0 +db 0x92,0x0d,'Noise',0 +db 0x92,0x0e,'Focal plane X resolution',0 +db 0x92,0x0f,'Focal plane Y resolution',0 +db 0x92,0x10,'Focal plane resolution unit',0 +db 0x92,0x15,'Exposure index',0 +db 0x92,0x16,'TIFF-EP standard ID',0 +db 0x92,0x17,'Sensing method',0 +db 0x92,0x3a,'CIP3 data file',0 +db 0x92,0x3b,'CIP3 sheet',0 +db 0x92,0x3c,'CIP3 side',0 +db 0x92,0x3f,'Sto nits',0 +db 0x93,0x2f,'MS document text',0 +db 0x93,0x30,'MS property set storage',0 +db 0x93,0x31,'MS document text position',0 +db 0x93,0x5c,'Image source data',0 +db 0x9c,0x9b,'XP title',0 +db 0x9c,0x9c,'XP comment',0 +db 0x9c,0x9d,'XP author',0 +db 0x9c,0x9e,'XP keywords',0 +db 0x9c,0x9f,'XP subject',0 +db 0xa2,0x0c,'Spatial frequency fesponse',0 +db 0xa2,0x0d,'Noise',0 +db 0xa2,0x11,'Image number',0 +db 0xa2,0x12,'Security classification',0 +db 0xa2,0x13,'Image history',0 +db 0xa2,0x16,'TIFF-EP standard ID',0 +db 0xa4,0x80,'GDAL metadata',0 +db 0xa4,0x81,'GDAL no data',0 +db 0xaf,0xc0,'Expand software',0 +db 0xaf,0xc1,'Expand lens',0 +db 0xaf,0xc2,'Expand film',0 +db 0xaf,0xc3,'Expand filterLens',0 +db 0xaf,0xc4,'Expand scanner',0 +db 0xaf,0xc5,'Expand flash lamp',0 +db 0xbc,0x01,'Pixel format',0 +db 0xbc,0x02,'Transformation',0 +db 0xbc,0x03,'Uncompressed',0 +db 0xbc,0x04,'Image type',0 +db 0xbc,0x80,'Image width',0 +db 0xbc,0x81,'Image height',0 +db 0xbc,0x82,'Width resolution',0 +db 0xbc,0x83,'Height resolution',0 +db 0xbc,0xc0,'Image offset',0 +db 0xbc,0xc1,'Image byte count',0 +db 0xbc,0xc2,'Alpha offset',0 +db 0xbc,0xc3,'Alpha byte count',0 +db 0xbc,0xc4,'Image data discard',0 +db 0xbc,0xc5,'Alpha data discard',0 +db 0xc4,0x27,'Oce scanjob desc',0 +db 0xc4,0x28,'Oce application selector',0 +db 0xc4,0x29,'Oce ID number',0 +db 0xc4,0x2a,'Oce image logic',0 +db 0xc4,0x4f,'Annotations',0 +db 0xc4,0xa5,'Print IM',0 +db 0xc5,0x73,'Original file name',0 +db 0xc5,0x80,'USPTO original content type',0 +db 0xc6,0x12,'DNG version',0 +db 0xc6,0x13,'DNG backward version',0 +db 0xc6,0x14,'Unique camera model',0 +db 0xc6,0x15,'Localized camera model',0 +db 0xc6,0x16,'CFA plane color',0 +db 0xc6,0x17,'CFA layout',0 +db 0xc6,0x18,'Linearization table',0 +db 0xc6,0x19,'Black level repeat dim',0 +db 0xc6,0x1a,'Black level',0 +db 0xc6,0x1b,'Black level delta H',0 +db 0xc6,0x1c,'Black level delta V',0 +db 0xc6,0x1d,'White level',0 +db 0xc6,0x1e,'Default scale',0 +db 0xc6,0x1f,'Default crop origin',0 +db 0xc6,0x20,'Default crop size',0 +db 0xc6,0x21,'Color matrix 1',0 +db 0xc6,0x22,'Color matrix 2',0 +db 0xc6,0x23,'Camera calibration 1',0 +db 0xc6,0x24,'Camera calibration 2',0 +db 0xc6,0x25,'Reduction matrix 1',0 +db 0xc6,0x26,'Reduction matrix 2',0 +db 0xc6,0x27,'Analog balance',0 +db 0xc6,0x28,'As shot neutral',0 +db 0xc6,0x29,'As shot white XY',0 +db 0xc6,0x2a,'BaselineExposure',0 +db 0xc6,0x2b,'BaselineNoise',0 +db 0xc6,0x2c,'BaselineSharpness',0 +db 0xc6,0x2d,'BayerGreenSplit',0 +db 0xc6,0x2e,'Linear response limit',0 +db 0xc6,0x2f,'Camera serial number',0 +db 0xc6,0x30,'DNG lens info',0 +db 0xc6,0x31,'Chroma blur radius',0 +db 0xc6,0x32,'Anti alias strength',0 +db 0xc6,0x33,'Shadow scale',0 +db 0xc6,0x34,'SR2 private',0 +db 0xc6,0x35,'Maker note safety',0 +db 0xc6,0x40,'Raw image segmentation',0 +db 0xc6,0x5a,'Calibration illuminant 1',0 +db 0xc6,0x5b,'Calibration illuminant 2',0 +db 0xc6,0x5c,'Best quality scale',0 +db 0xc6,0x5d,'Raw data unique ID',0 +db 0xc6,0x60,'Alias layer metadata',0 +db 0xc6,0x8b,'Original raw file name',0 +db 0xc6,0x8c,'Original raw file data',0 +db 0xc6,0x8d,'Active area',0 +db 0xc6,0x8e,'Masked areas',0 +db 0xc6,0x8f,'AsShot ICC profile',0 +db 0xc6,0x90,'AsShot pre profile matrix',0 +db 0xc6,0x91,'Current ICC profile',0 +db 0xc6,0x92,'Current pre profile matrix',0 +db 0xc6,0xbf,'Colorimetric reference',0 +db 0xc6,0xd2,'Panasonic title',0 +db 0xc6,0xd3,'Panasonic title 2',0 +db 0xc6,0xf3,'Camera calibration sig',0 +db 0xc6,0xf4,'Profile calibration sig',0 +db 0xc6,0xf5,'Profile IFD',0 +db 0xc6,0xf6,'AsShot profile name',0 +db 0xc6,0xf7,'Noise reduction applied',0 +db 0xc6,0xf8,'Profile name',0 +db 0xc6,0xf9,'Profile hue sat map dims',0 +db 0xc6,0xfa,'Profile hue sat map data 1',0 +db 0xc6,0xfb,'Profile hue sat map data 2',0 +db 0xc6,0xfc,'Profile tone curve',0 +db 0xc6,0xfd,'Profile embed policy',0 +db 0xc6,0xfe,'Profile copyright',0 +db 0xc7,0x14,'Forward matrix 1',0 +db 0xc7,0x15,'Forward matrix 2',0 +db 0xc7,0x16,'Preview application name',0 +db 0xc7,0x17,'Preview application version',0 +db 0xc7,0x18,'Preview settings name',0 +db 0xc7,0x19,'Preview settings digest',0 +db 0xc7,0x1a,'Preview color space',0 +db 0xc7,0x1b,'Preview date time',0 +db 0xc7,0x1c,'Raw image digest',0 +db 0xc7,0x1d,'Original raw file digest',0 +db 0xc7,0x1e,'Sub tile block size',0 +db 0xc7,0x1f,'Row interleave factor',0 +db 0xc7,0x25,'Profile look table dims',0 +db 0xc7,0x26,'Profile look table data',0 +db 0xc7,0x40,'Opcode list 1',0 +db 0xc7,0x41,'Opcode list 2',0 +db 0xc7,0x4e,'Opcode list 3',0 +db 0xc7,0x61,'Noise profile',0 +db 0xc7,0x63,'Time codes',0 +db 0xc7,0x64,'Frame rate',0 +db 0xc7,0x72,'TStop',0 +db 0xc7,0x89,'Reel name',0 +db 0xc7,0x91,'Original default final size',0 +db 0xc7,0x92,'Original best quality size',0 +db 0xc7,0x93,'Original default crop size',0 +db 0xc7,0xa1,'Camera label',0 +db 0xc7,0xa3,'Profile hue sat map encoding',0 +db 0xc7,0xa4,'Profile look table encoding',0 +db 0xc7,0xa5,'Baseline exposure offset',0 +db 0xc7,0xa6,'Default black render',0 +db 0xc7,0xa7,'New raw image digest',0 +db 0xc7,0xa8,'Raw to preview gain',0 +db 0xc7,0xb5,'Default user crop',0 +db 0xfe,0x00,'KDC_IFD',0 + +dd 0 + +align 4 +gr_8769: +db 0x02,0xbc,'Application notes',0 +db 0x82,0x9a,'Exposure time',0 +db 0x82,0x9d,'F number',0 +db 0x88,0x22,'Exposure program',0 +db 0x88,0x24,'Spectral sensitivity',0 +db 0x88,0x27,'ISO',0 +db 0x88,0x2a,'Time zone offset',0 +db 0x88,0x2b,'Self timer mode',0 +db 0x88,0x30,'Sensitivity type',0 +db 0x88,0x31,'Standard output sensitivity',0 +db 0x88,0x32,'Recommended exposure index',0 +db 0x88,0x33,'ISO speed',0 +db 0x88,0x34,'ISO speed latitude yyy',0 +db 0x88,0x35,'ISO speed latitude zzz',0 +db 0x90,0x00,'Exif version',0 +db 0x90,0x03,'Date time original',0 +db 0x90,0x04,'Create date',0 +db 0x91,0x01,'Components configuration',0 +db 0x91,0x02,'Compressed bits per pixel',0 +db 0x92,0x01,'Shutter speed value',0 +db 0x92,0x02,'Aperture value',0 +db 0x92,0x03,'Brightness value',0 +db 0x92,0x04,'Exposure compensation',0 +db 0x92,0x05,'Max aperture value',0 +db 0x92,0x06,'Subject distance',0 +db 0x92,0x07,'Metering mode',0 +db 0x92,0x08,'Light source',0 +db 0x92,0x09,'Flash',0 +db 0x92,0x0a,'Focal length',0 +db 0x92,0x11,'Image number',0 +db 0x92,0x12,'Security classification',0 +db 0x92,0x13,'Image history',0 +db 0x92,0x14,'Subject area',0 +db 0x92,0x7c,'Maker note',0 +db 0x92,0x86,'User comment',0 +db 0x92,0x90,'Sub sec time',0 +db 0x92,0x91,'Sub sec time original',0 +db 0x92,0x92,'Sub sec time digitized',0 +db 0xa0,0x00,'Flashpix version',0 +db 0xa0,0x01,'Color space',0 +db 0xa0,0x02,'Exif image width',0 +db 0xa0,0x03,'Exif image height',0 +db 0xa0,0x04,'Related sound file',0 +db 0xa0,0x05,'Interop offset',0 +db 0xa2,0x0b,'Flash energy',0 +db 0xa2,0x0e,'Focal plane X resolution',0 +db 0xa2,0x0f,'Focal plane Y resolution',0 +db 0xa2,0x10,'Focal plane resolution unit',0 +db 0xa2,0x14,'Subject location',0 +db 0xa2,0x15,'Exposure index',0 +db 0xa2,0x17,'Sensing method',0 +db 0xa3,0x00,'File source',0 +db 0xa3,0x01,'Scene type',0 +db 0xa3,0x02,'CFA pattern',0 +db 0xa4,0x01,'Custom rendered',0 +db 0xa4,0x02,'Exposure mode',0 +db 0xa4,0x03,'White balance',0 +db 0xa4,0x04,'Digital zoom ratio',0 +db 0xa4,0x05,'Focal length in 35mm format',0 +db 0xa4,0x06,'Scene capture type',0 +db 0xa4,0x07,'Gain control',0 +db 0xa4,0x08,'Contrast',0 +db 0xa4,0x09,'Saturation',0 +db 0xa4,0x0a,'Sharpness',0 +db 0xa4,0x0b,'Device setting description',0 +db 0xa4,0x0c,'Subject distance range',0 +db 0xa4,0x20,'Image unique ID',0 +db 0xa4,0x30,'Owner name',0 +db 0xa4,0x31,'Serial number',0 +db 0xa4,0x32,'Lens info',0 +db 0xa4,0x33,'Lens make',0 +db 0xa4,0x34,'Lens model',0 +db 0xa4,0x35,'Lens serial number',0 +db 0xa5,0x00,'Gamma',0 +db 0xea,0x1c,'Padding',0 +db 0xea,0x1d,'Offset schema',0 +db 0xfd,0xe8,'Owner name',0 +db 0xfd,0xe9,'Serial number',0 +db 0xfd,0xea,'Lens',0 +db 0xfe,0x4c,'Raw file',0 +db 0xfe,0x4d,'Converter',0 +db 0xfe,0x4e,'White balance',0 +db 0xfe,0x51,'Exposure',0 +db 0xfe,0x52,'Shadows',0 +db 0xfe,0x53,'Brightness',0 +db 0xfe,0x54,'Contrast',0 +db 0xfe,0x55,'Saturation',0 +db 0xfe,0x56,'Sharpness',0 +db 0xfe,0x57,'Smoothness',0 +db 0xfe,0x58,'Moire filter',0 + +dd 0 + +align 4 +gr_a005: +db 0x00,0x01,'Interop index',0 +db 0x00,0x02,'Interop version',0 +db 0x10,0x00,'Related image file format',0 +db 0x10,0x01,'Related image width',0 +db 0x10,0x02,'Related image height',0 +dd 0 + +align 4 +gr_8825: +db 0x00,0x00,'GPS version ID',0 +db 0x00,0x01,'GPS latitude ref',0 +db 0x00,0x02,'GPS latitude',0 +db 0x00,0x03,'GPS longitude ref',0 +db 0x00,0x04,'GPS longitude',0 +db 0x00,0x05,'GPS altitude ref',0 +db 0x00,0x06,'GPS altitude',0 +db 0x00,0x07,'GPS time stamp',0 +db 0x00,0x08,'GPS satellites',0 +db 0x00,0x09,'GPS status',0 +db 0x00,0x0a,'GPS measuremode',0 +db 0x00,0x0b,'GPS dop',0 +db 0x00,0x0c,'GPS speed ref',0 +db 0x00,0x0d,'GPS speed',0 +db 0x00,0x0e,'GPS track ref',0 +db 0x00,0x0f,'GPS track',0 +db 0x00,0x10,'GPS img direction ref',0 +db 0x00,0x11,'GPS img direction',0 +db 0x00,0x12,'GPS map datum',0 +db 0x00,0x13,'GPS dest latitude ref',0 +db 0x00,0x14,'GPS dest latitude',0 +db 0x00,0x15,'GPS dest longitude ref',0 +db 0x00,0x16,'GPS dest longitude',0 +db 0x00,0x17,'GPS dest bearing ref',0 +db 0x00,0x18,'GPS dest bearing',0 +db 0x00,0x19,'GPS dest distance ref',0 +db 0x00,0x1a,'GPS dest distance',0 +db 0x00,0x1b,'GPS processing method',0 +db 0x00,0x1c,'GPS area information',0 +db 0x00,0x1d,'GPS date stamp',0 +db 0x00,0x1e,'GPS differential',0 +db 0x00,0x1f,'GPS h positioning error',0 + +dd 0 + +;данные app2 для Nikon +align 4 +gr_927c_Ni: +db 0x00,0x01,'MakerNoteVersion',0 +db 0x00,0x02,'ISO',0 +db 0x00,0x03,'ColorMode',0 +db 0x00,0x04,'Quality',0 +db 0x00,0x05,'WhiteBalance',0 +db 0x00,0x06,'Sharpness',0 +db 0x00,0x07,'FocusMode',0 +db 0x00,0x08,'FlashSetting',0 +db 0x00,0x09,'FlashType',0 +db 0x00,0x0b,'WhiteBalanceFineTune',0 +db 0x00,0x0c,'WB_RBLevels',0 +db 0x00,0x0d,'ProgramShift',0 +db 0x00,0x0e,'ExposureDifference',0 +db 0x00,0x0f,'ISOSelection',0 +db 0x00,0x10,'DataDump',0 +db 0x00,0x11,'PreviewIFD',0 +db 0x00,0x12,'FlashExposureComp',0 +db 0x00,0x13,'ISOSetting',0 +db 0x00,0x14,'ColorBalanceA ',0 +db 0x00,0x16,'ImageBoundary',0 +db 0x00,0x17,'ExternalFlashExposureComp',0 +db 0x00,0x18,'FlashExposureBracketValue',0 +db 0x00,0x19,'ExposureBracketValue',0 +db 0x00,0x1a,'ImageProcessing',0 +db 0x00,0x1b,'CropHiSpeed',0 +db 0x00,0x1c,'ExposureTuning',0 +db 0x00,0x1d,'SerialNumber',0 +db 0x00,0x1e,'ColorSpace',0 +db 0x00,0x1f,'VRInfo',0 +db 0x00,0x20,'ImageAuthentication',0 +db 0x00,0x21,'FaceDetect',0 +db 0x00,0x22,'ActiveD-Lighting',0 +db 0x00,0x23,'PictureControlData',0 +db 0x00,0x24,'WorldTime',0 +db 0x00,0x25,'ISOInfo',0 +db 0x00,0x2a,'VignetteControl',0 +db 0x00,0x2b,'DistortInfo',0 +db 0x00,0x2c,'UnknownInfo',0 +db 0x00,0x32,'UnknownInfo2',0 +db 0x00,0x35,'HDRInfo',0 +db 0x00,0x39,'LocationInfo',0 +db 0x00,0x3d,'BlackLevel',0 +db 0x00,0x80,'ImageAdjustment',0 +db 0x00,0x81,'ToneComp',0 +db 0x00,0x82,'AuxiliaryLens',0 +db 0x00,0x83,'LensType',0 +db 0x00,0x84,'Lens',0 +db 0x00,0x85,'ManualFocusDistance',0 +db 0x00,0x86,'DigitalZoom',0 +db 0x00,0x87,'FlashMode',0 +db 0x00,0x88,'AFInfo',0 +db 0x00,0x89,'ShootingMode',0 +db 0x00,0x8b,'LensFStops',0 +db 0x00,0x8c,'ContrastCurve',0 +db 0x00,0x8d,'ColorHue',0 +db 0x00,0x8f,'SceneMode',0 +db 0x00,0x90,'LightSource',0 +db 0x00,0x91,'ShotInfo',0 +db 0x00,0x92,'HueAdjustment',0 +db 0x00,0x93,'NEFCompression',0 +db 0x00,0x94,'Saturation',0 +db 0x00,0x95,'NoiseReduction',0 +db 0x00,0x96,'NEFLinearizationTable',0 +db 0x00,0x97,'ColorBalance',0 +db 0x00,0x98,'LensData',0 +db 0x00,0x99,'RawImageCenter',0 +db 0x00,0x9a,'SensorPixelSize',0 +db 0x00,0x9c,'SceneAssist',0 +db 0x00,0x9e,'RetouchHistory',0 +db 0x00,0xa0,'SerialNumber',0 +db 0x00,0xa2,'ImageDataSize',0 +db 0x00,0xa5,'ImageCount',0 +db 0x00,0xa6,'DeletedImageCount',0 +db 0x00,0xa7,'ShutterCount',0 +db 0x00,0xa8,'FlashInfo',0 +db 0x00,0xa9,'ImageOptimization',0 +db 0x00,0xaa,'Saturation',0 +db 0x00,0xab,'VariProgram',0 +db 0x00,0xac,'ImageStabilization',0 +db 0x00,0xad,'AFResponse',0 +db 0x00,0xb0,'MultiExposure',0 +db 0x00,0xb1,'HighISONoiseReduction',0 +db 0x00,0xb3,'ToningEffect',0 +db 0x00,0xb6,'PowerUpTime',0 +db 0x00,0xb7,'AFInfo2',0 +db 0x00,0xb8,'FileInfo',0 +db 0x00,0xb9,'AFTune',0 +db 0x00,0xbd,'PictureControlData',0 +db 0x00,0xc3,'BarometerInfo',0 +db 0x0e,0x00,'PrintIM',0 +db 0x0e,0x01,'NikonCaptureData',0 +db 0x0e,0x09,'NikonCaptureVersion',0 +db 0x0e,0x0e,'NikonCaptureOffsets',0 +db 0x0e,0x10,'NikonScanIFD',0 +db 0x0e,0x13,'NikonCaptureEditVersions ',0 +db 0x0e,0x1d,'NikonICCProfile',0 +db 0x0e,0x1e,'NikonCaptureOutput',0 +db 0x0e,0x22,'NEFBitDepth',0 + +dd 0 + +;данные app2 для Panasonic +align 4 +gr_927c_Pa: +db 0x00,0x01,'ImageQuality',0 +db 0x00,0x02,'FirmwareVersion',0 +db 0x00,0x03,'WhiteBalance',0 +db 0x00,0x07,'FocusMode',0 +db 0x00,0x0f,'AFAreaMode',0 +db 0x00,0x1a,'ImageStabilization',0 +db 0x00,0x1c,'MacroMode',0 +db 0x00,0x1f,'ShootingMode',0 +db 0x00,0x20,'Audio',0 +db 0x00,0x21,'DataDump',0 +db 0x00,0x23,'WhiteBalanceBias',0 +db 0x00,0x24,'FlashBias',0 +db 0x00,0x25,'InternalSerialNumber',0 +db 0x00,0x26,'PanasonicExifVersion',0 +db 0x00,0x28,'ColorEffect',0 +db 0x00,0x29,'TimeSincePowerOn',0 +db 0x00,0x2a,'BurstMode',0 +db 0x00,0x2b,'SequenceNumber',0 +db 0x00,0x2c,'ContrastMode',0 +db 0x00,0x2d,'NoiseReduction',0 +db 0x00,0x2e,'SelfTimer',0 +db 0x00,0x30,'Rotation',0 +db 0x00,0x31,'AFAssistLamp',0 +db 0x00,0x32,'ColorMode',0 +db 0x00,0x33,'BabyAge',0 +db 0x00,0x34,'OpticalZoomMode',0 +db 0x00,0x35,'ConversionLens',0 +db 0x00,0x36,'TravelDay',0 +db 0x00,0x39,'Contrast',0 +db 0x00,0x3a,'WorldTimeLocation',0 +db 0x00,0x3b,'TextStamp',0 +db 0x00,0x3c,'ProgramISO',0 +db 0x00,0x3d,'AdvancedSceneType',0 +db 0x00,0x3f,'FacesDetected',0 +db 0x00,0x40,'Saturation',0 +db 0x00,0x41,'Sharpness',0 +db 0x00,0x42,'FilmMode',0 +db 0x00,0x44,'ColorTempKelvin',0 +db 0x00,0x45,'BracketSettings',0 +db 0x00,0x46,'WBShiftAB',0 +db 0x00,0x47,'WBShiftGM',0 +db 0x00,0x48,'FlashCurtain',0 +db 0x00,0x49,'LongExposureNoiseReduction',0 +db 0x00,0x4b,'PanasonicImageWidth',0 +db 0x00,0x4c,'PanasonicImageHeight',0 +db 0x00,0x4d,'AFPointPosition',0 +db 0x00,0x51,'LensType',0 +db 0x00,0x52,'LensSerialNumber',0 +db 0x00,0x53,'AccessoryType',0 +db 0x00,0x54,'AccessorySerialNumber',0 +db 0x00,0x59,'Transform',0 +db 0x00,0x5d,'IntelligentExposure',0 +db 0x00,0x60,'LensFirmwareVersion',0 +db 0x00,0x61,'FaceRecInfo',0 +db 0x00,0x62,'FlashWarning',0 +db 0x00,0x63,'RecognizedFaceFlags',0 +db 0x00,0x65,'Title',0 +db 0x00,0x66,'BabyName',0 +db 0x00,0x67,'Location',0 +db 0x00,0x69,'Country',0 +db 0x00,0x6b,'State',0 +db 0x00,0x6d,'City',0 +db 0x00,0x6f,'Landmark',0 +db 0x00,0x70,'IntelligentResolution',0 +db 0x00,0x77,'BurstSpeed',0 +db 0x00,0x79,'IntelligentD-Range',0 +db 0x00,0x7c,'ClearRetouch',0 +db 0x00,0x86,'ManometerPressure',0 +db 0x00,0x89,'PhotoStyle',0 +db 0x00,0x8a,'ShadingCompensation',0 +db 0x00,0x8c,'AccelerometerZ',0 +db 0x00,0x8d,'AccelerometerX',0 +db 0x00,0x8e,'AccelerometerY',0 +db 0x00,0x8f,'CameraOrientation',0 +db 0x00,0x90,'RollAngle',0 +db 0x00,0x91,'PitchAngle',0 +db 0x00,0x93,'SweepPanoramaDirection',0 +db 0x00,0x94,'SweepPanoramaFieldOfView',0 +db 0x00,0x96,'TimerRecording',0 +db 0x00,0x9d,'InternalNDFilter',0 +db 0x00,0x9e,'HDR',0 +db 0x00,0x9f,'ShutterType',0 +db 0x00,0xa3,'ClearRetouchValue',0 +db 0x00,0xab,'TouchAE',0 +db 0x0e,0x00,'PrintIM',0 +db 0x80,0x00,'MakerNoteVersion',0 +db 0x80,0x01,'SceneMode',0 +db 0x80,0x04,'WBRedLevel',0 +db 0x80,0x05,'WBGreenLevel',0 +db 0x80,0x06,'WBBlueLevel',0 +db 0x80,0x07,'FlashFired',0 +db 0x80,0x08,'TextStamp',0 +db 0x80,0x09,'TextStamp',0 +db 0x80,0x10,'BabyAge',0 +db 0x80,0x12,'Transform',0 + +dd 0 + +;данные app2 для Canon +align 4 +gr_927c_Ca: +db 0x00,0x01,'CanonCameraSettings',0 +db 0x00,0x02,'CanonFocalLength',0 +db 0x00,0x03,'CanonFlashInfo?',0 +db 0x00,0x04,'CanonShotInfo',0 +db 0x00,0x05,'CanonPanorama',0 +db 0x00,0x06,'CanonImageType',0 +db 0x00,0x07,'CanonFirmwareVersion',0 +db 0x00,0x08,'FileNumber',0 +db 0x00,0x09,'OwnerName',0 +db 0x00,0x0a,'UnknownD30',0 +db 0x00,0x0c,'SerialNumber',0 +db 0x00,0x0d,'CanonCameraInfo',0 +db 0x00,0x0e,'CanonFileLength',0 +db 0x00,0x0f,'CustomFunctions',0 +db 0x00,0x10,'CanonModelID',0 +db 0x00,0x11,'MovieInfo',0 +db 0x00,0x12,'CanonAFInfo',0 +db 0x00,0x13,'ThumbnailImageValidArea',0 +db 0x00,0x15,'SerialNumberFormat',0 +db 0x00,0x1a,'SuperMacro',0 +db 0x00,0x1c,'DateStampMode',0 +db 0x00,0x1d,'MyColors',0 +db 0x00,0x1e,'FirmwareRevision',0 +db 0x00,0x23,'Categories',0 +db 0x00,0x24,'FaceDetect1',0 +db 0x00,0x25,'FaceDetect2',0 +db 0x00,0x26,'CanonAFInfo2',0 +db 0x00,0x27,'ContrastInfo',0 +db 0x00,0x28,'ImageUniqueID',0 +db 0x00,0x2f,'FaceDetect3',0 +db 0x00,0x35,'TimeInfo',0 +db 0x00,0x81,'RawDataOffset',0 +db 0x00,0x83,'OriginalDecisionDataOffset',0 +db 0x00,0x90,'CustomFunctions1D',0 +db 0x00,0x91,'PersonalFunctions',0 +db 0x00,0x92,'PersonalFunctionValues',0 +db 0x00,0x93,'CanonFileInfo',0 +db 0x00,0x94,'AFPointsInFocus1D',0 +db 0x00,0x95,'LensModel',0 +db 0x00,0x96,'SerialInfo ',0 +db 0x00,0x97,'DustRemovalData',0 +db 0x00,0x98,'CropInfo',0 +db 0x00,0x99,'CustomFunctions2',0 +db 0x00,0x9a,'AspectInfo',0 +db 0x00,0xa0,'ProcessingInfo',0 +db 0x00,0xa1,'ToneCurveTable',0 +db 0x00,0xa2,'SharpnessTable',0 +db 0x00,0xa3,'SharpnessFreqTable',0 +db 0x00,0xa4,'WhiteBalanceTable',0 +db 0x00,0xa9,'ColorBalance',0 +db 0x00,0xaa,'MeasuredColor',0 +db 0x00,0xae,'ColorTemperature',0 +db 0x00,0xb0,'CanonFlags',0 +db 0x00,0xb1,'ModifiedInfo',0 +db 0x00,0xb2,'ToneCurveMatching',0 +db 0x00,0xb3,'WhiteBalanceMatching',0 +db 0x00,0xb4,'ColorSpace',0 +db 0x00,0xb6,'PreviewImageInfo',0 +db 0x00,0xd0,'VRDOffset',0 +db 0x00,0xe0,'SensorInfo',0 +db 0x40,0x01,'ColorData',0 +db 0x40,0x02,'CRWParam?',0 +db 0x40,0x03,'ColorInfo',0 +db 0x40,0x05,'Flavor?',0 +db 0x40,0x08,'BlackLevel?',0 +db 0x40,0x10,'CustomPictureStyleFileName',0 +db 0x40,0x13,'AFMicroAdj',0 +db 0x40,0x15,'VignettingCorr ',0 +db 0x40,0x16,'VignettingCorr2',0 +db 0x40,0x18,'LightingOpt',0 +db 0x40,0x19,'LensInfo',0 +db 0x40,0x20,'AmbienceInfo',0 +db 0x40,0x24,'FilterInfo',0 + +dd 0 + +;данные app2 для Samsung +align 4 +gr_927c_Sa: +db 0x00,0x01,'MakerNoteVersion',0 +db 0x00,0x02,'DeviceType',0 +db 0x00,0x03,'SamsungModelID',0 +db 0x00,0x21,'PictureWizard',0 +db 0x00,0x30,'LocalLocationName',0 +db 0x00,0x31,'LocationName',0 +db 0x00,0x35,'PreviewIFD',0 +db 0x00,0x43,'CameraTemperature',0 +db 0x00,0x45,'RawCompressionMode',0 +db 0x01,0x00,'FaceDetect',0 +db 0x01,0x20,'FaceRecognition',0 +db 0x01,0x23,'FaceName',0 +db 0xa0,0x01,'FirmwareName',0 +db 0xa0,0x03,'LensType',0 +db 0xa0,0x04,'LensFirmware',0 +db 0xa0,0x05,'InternalLensSerialNumber',0 +db 0xa0,0x10,'SensorAreas',0 +db 0xa0,0x11,'ColorSpace',0 +db 0xa0,0x12,'SmartRange',0 +db 0xa0,0x13,'ExposureCompensation',0 +db 0xa0,0x14,'ISO',0 +db 0xa0,0x18,'ExposureTime',0 +db 0xa0,0x19,'FNumber',0 +db 0xa0,0x1a,'FocalLengthIn35mmFormat',0 +db 0xa0,0x20,'EncryptionKey',0 +db 0xa0,0x21,'WB_RGGBLevelsUncorrected',0 +db 0xa0,0x22,'WB_RGGBLevelsAuto',0 +db 0xa0,0x23,'WB_RGGBLevelsIlluminator1',0 +db 0xa0,0x24,'WB_RGGBLevelsIlluminator2',0 +db 0xa0,0x28,'WB_RGGBLevelsBlack',0 +db 0xa0,0x30,'ColorMatrix',0 +db 0xa0,0x31,'ColorMatrixSRGB',0 +db 0xa0,0x32,'ColorMatrixAdobeRGB',0 +db 0xa0,0x33,'CbCrMatrixDefault',0 +db 0xa0,0x34,'CbCrMatrix',0 +db 0xa0,0x35,'CbCrGainDefault',0 +db 0xa0,0x36,'CbCrGain',0 +db 0xa0,0x40,'ToneCurveSRGBDefault',0 +db 0xa0,0x41,'ToneCurveAdobeRGBDefault',0 +db 0xa0,0x42,'ToneCurveSRGB',0 +db 0xa0,0x43,'ToneCurveAdobeRGB',0 +db 0xa0,0x48,'RawData?',0 +db 0xa0,0x50,'Distortion?',0 +db 0xa0,0x51,'ChromaticAberration?',0 +db 0xa0,0x52,'Vignetting?',0 +db 0xa0,0x53,'VignettingCorrection?',0 +db 0xa0,0x54,'VignettingSetting?',0 + +dd 0 + +;input: +; bof - указатель на начало файла +; app1 - указатель для заполнения exif.app1 +;output: +; app1 - указатель на начало exif.app1 (или 0 если не найдено или формат файла не поддерживается) +align 4 +proc exif_get_app1 uses eax ebx edi, bof:dword, app1:dword + mov eax,[bof] + mov edi,[app1] + + ;файл в формате jpg? + cmp word[eax],0xd8ff + jne .no_exif + add eax,2 + + ;файл содержит exif.app0? + cmp word[eax],0xe0ff + jne @f + add eax,2 + movzx ebx,word[eax] + ror bx,8 ;всегда ли так надо? + add eax,ebx + @@: + + ;файл содержит exif.app1? + cmp word[eax],0xe1ff + jne .no_exif + + xor ebx,ebx + cmp word[eax+10],'II' + je @f + inc ebx ;if 'MM' edx=1 + @@: + mov word[edi+offs_m_or_i],bx ;способ выравнивания чисел + mov dword[edi+offs_id_gr],0 ;id групы и производителя, который всегда 0 для app1 + add eax,18 + mov [edi],eax + sub eax,8 + mov [edi+4],eax + + jmp @f + .no_exif: + mov dword[edi],0 + @@: + ret +endp + +;input: +; app1 - указатель на начало exif.app1 +; num - порядковый номер тега (начинается с 1) +; txt - указатель на текст, куда будет записано значение +; t_max - максимальный размер текста +;output: +; txt - заполняется текстом в виде "параметр: значение", если не найдено то пустая строка +align 4 +proc exif_get_tag, app1:dword, num:dword, txt:dword, t_max:dword +pushad + mov eax,[app1] + mov edi,[txt] + mov ecx,[num] + + xor edx,edx + mov byte[edi],dl + cmp [eax],edx + je .end_f ;если не найден указатель на начало exif.app1 + cmp ecx,edx + jle .end_f ;если порядковый номер тега <= 0 + + movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 + + ;проверяем число тегов + mov eax,[eax] + movzx ebx,word[eax] + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp ecx,ebx + jg .end_f ;если номер тега больше чем их есть в файле + + ;переходим на заданный тег + dec ecx + imul ecx,tag_size + add eax,offs_tag_0 + add eax,ecx + + stdcall read_tag_value,[app1],[t_max] + + .end_f: +popad + ret +endp + +;input: +; app1 - указатель на начало exif.app1 +; id - идентификатор тега значение которого нужно найти +; txt - указатель на текст, куда будет записано значение +; t_max - максимальный размер текста +;output: +; txt - заполняется текстом в виде "параметр: значение", если не найдено то пустая строка +align 4 +proc exif_get_tag_id, app1:dword, id:dword, txt:dword, t_max:dword +pushad + mov eax,[app1] + mov edi,[txt] + + xor edx,edx + mov byte[edi],dl + cmp [eax],edx + je .end_f ;если не найден указатель на начало exif.app1 + + mov ebx,[id] + movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 + bt edx,0 + jnc @f + ror bx,8 + @@: + + ;берем число тегов + mov eax,[eax] + movzx ecx,word[eax] + bt edx,0 + jnc @f + ror cx,8 + @@: + ;в ecx - число тегов + + ;ищем заданный тег + add eax,offs_tag_0 + .cycle_0: + cmp word[eax],bx ;word[eax+0] - код тега + je @f + add eax,tag_size + loop .cycle_0 + jmp .end_f + @@: + stdcall read_tag_value,[app1],[t_max] + .end_f: +popad + ret +endp + +;input: +; app1 - указатель на exif.app1 или на exif.app1.child +; child - указатель для заполнения начала дочерних тегов exif.app1.child +; c_tag - тег для которого делается поиск дочерних +;output: +; child - указатель на начало дочерних тегов +align 4 +proc exif_get_child, app1:dword, child:dword , c_tag:dword +pushad + mov eax,[app1] + mov edi,[child] + + xor edx,edx + cmp [eax],edx + je .no_found ;если не найден указатель на начало exif.app1 + + movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 + + ;начало поиска + mov ebx,[c_tag] + bt edx,0 + jnc @f + ror bx,8 + @@: + + ;проверяем число тегов + mov eax,[eax] + movzx ecx,word[eax] + bt edx,0 + jnc @f + ror cx,8 + @@: + cmp ecx,1 + jl .no_found ;если число тегов <1 + + ;переходим на 1-й тег + add eax,offs_tag_0 + @@: + cmp word[eax],bx + je @f + add eax,tag_size + loop @b + jmp .no_found ;если не найдено + @@: ;если найдено + mov ebx,dword[eax+8] + bt edx,0 + jnc @f + bswap ebx + @@: + mov eax,[app1] + add ebx,[eax+4] + mov dword[edi],ebx + m2m dword[edi+4],dword[eax+4] + ror edx,16 + mov dx,word[c_tag] + ror edx,16 + mov dword[edi+offs_m_or_i],edx + m2m word[edi+offs_id_gr_mak],word[eax+offs_id_gr_mak] + + jmp .end_f + .no_found: + mov dword[edi],0 + .end_f: +popad + ret +endp + +;output: +; app2 - указатель на начало exif.app2 (или 0 если не найдено или формат файла не поддерживается) +align 4 +proc exif_get_app2, app1:dword, app2:dword +pushad + mov edi,[app2] + mov eax,[app1] + xor edx,edx + cmp [eax],edx + je .no_suport ;если не найден указатель на начало exif.app1 + + movzx edx,word[eax+offs_m_or_i] ;if 'MM' edx=1 + + ;начало поиска производителя камеры + mov ebx,0x010f + bt edx,0 + jnc @f + ror bx,8 + @@: + + ;проверяем число тегов + mov eax,[eax] + movzx ecx,word[eax] + bt edx,0 + jnc @f + ror cx,8 + @@: + cmp ecx,1 + jl .no_suport ;если число тегов <1 + + ;переходим на 1-й тег + add eax,offs_tag_0 + @@: + cmp word[eax],bx + je @f + add eax,tag_size + loop @b + jmp .no_suport ;если не найдено + @@: ;если найдено + mov ebx,dword[eax+4] + bt edx,0 + jnc @f + bswap ebx + @@: + cmp ebx,4 + jle .no_suport ;название производителя меньше 4 символов, не поддержиавается + + mov ebx,dword[eax+8] + bt edx,0 + jnc @f + bswap ebx + @@: + + ;проверка поддерживаемых производителей + mov eax,[app1] + add ebx,[eax+4] + cmp dword[ebx],'Cano' + je .suport + cmp dword[ebx],'NIKO' + je .suport + cmp dword[ebx],'Pana' + je .suport + cmp dword[ebx],'SAMS' + je .suport + cmp dword[ebx],'sams' + je .suport + + ;все остальные не поддерживаются + jmp .no_suport + + .suport: + ;находим тег 0x8769 (расширенные данные по Exif) + stdcall exif_get_child, eax,edi,0x8769 + cmp dword[edi],0 + je .no_suport + ;находим тег 0x927c (данные Maker по камере) + stdcall exif_get_child, edi,edi, 0x927c + cmp dword[edi],0 + je .no_suport + + cmp dword[ebx],'NIKO' + jne @f + ;for Nikon + add dword[edi],18 + mov eax,dword[edi] + sub eax,8 + mov dword[edi+4],eax + mov word[edi+offs_id_gr_mak],'Ni' + jmp .end_f + @@: + cmp dword[ebx],'Pana' + jne @f + ;for Panasonic + add dword[edi],12 + mov word[edi+offs_id_gr_mak],'Pa' + jmp .end_f + @@: + cmp dword[ebx],'Cano' + jne @f + ;for Canon + mov word[edi+offs_id_gr_mak],'Ca' + jmp .end_f + @@: + + cmp dword[ebx],'SAMS' + je @f + cmp dword[ebx],'sams' + je @f + jmp .end_f + @@: + ;for Samsung + mov word[edi+offs_id_gr_mak],'Sa' + jmp .end_f + @@: + + .no_suport: + mov dword[edi],0 + .end_f: +popad + ret +endp + +;description: +; вспомогательная функция для чтения назначений тегов +;input: +; eax - указатель начала тега +; edi - указатель на память для записи текстовой строки +align 4 +proc read_tag_value, app1:dword, t_max:dword + push exif_tag_numbers + pop esi + + ;поиск таблицы для группы тегов + mov ebx,[app1] + mov ebx,dword[ebx+offs_id_gr] ;берем идентификатор группы тегов + @@: + cmp dword[esi],ebx + je .set_table + add esi,8 + cmp esi,exif_tag_numbers.end + jge .tag_unknown ;тег не опознан (не найдена таблица группы тегов) + jmp @b + .set_table: + mov esi,dword[esi+4] ;установка адреса таблицы в esi + + ;поиск названия тега в таблице + .next_tag: + mov bx,word[esi] + cmp bx,0 + jne @f + cmp dword[esi],0 + jne @f + jmp .tag_unknown ;тег не опознан (в группе не найден тег) + @@: + bt edx,0 + jc @f + ror bx,8 + @@: + cmp word[eax],bx + je .found + inc esi + @@: + inc esi + cmp byte[esi],0 + jne @b + inc esi + jmp .next_tag + .found: + + ;копируем строку с названием тега + add esi,2 + stdcall str_n_cat,edi,esi,[t_max] + + jmp .start_read + .tag_unknown: + ;если тег не найден ставим его код вместо названия + movzx ebx,word[eax] + bt edx,0 + jnc @f + ror bx,8 + @@: + stdcall hex_in_str, edi, ebx,4 + mov byte[edi+4],0 + .start_read: + + ;читаем информацию в теге + mov bx,tag_format_ui1b + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_01 + stdcall str_n_cat,edi,txt_dp,[t_max] + call get_tag_data_size + cmp ebx,4 + jg .over4b_01 + cmp ebx,1 + je @f + or edx,2 ;array data + mov ecx,dword[eax+8] + mov dh,bl + @@: + ;если 1 одно байтовое число + movzx ebx,byte[eax+8] + stdcall str_len,edi + add edi,eax + mov eax,ebx + stdcall convert_int_to_str, [t_max] + bt edx,1 + jnc .end_f + @@: + ;если от 2 до 4 одно байтовых чисел + dec dh + cmp dh,0 + je .end_f + shr ecx,8 + stdcall str_n_cat,edi,txt_zap,[t_max] + stdcall str_len,edi + add edi,eax + movzx eax,cl + stdcall convert_int_to_str, [t_max] + jmp @b + .over4b_01: + ;... + jmp .end_f + .tag_01: + + mov bx,tag_format_text + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_02 + stdcall str_n_cat,edi,txt_dp,[t_max] + call get_tag_data_size ;проверяем длинну строки + cmp ebx,4 + jg @f + ;если строка помещается в 4 символа + mov esi,eax + add esi,8 + stdcall str_n_cat,edi,esi,[t_max] + jmp .end_f + ;если строка не помещается в 4 символа + @@: + mov esi,dword[eax+8] + bt edx,0 + jnc @f + bswap esi + @@: + mov eax,[app1] + mov eax,[eax+4] + add esi,eax + stdcall str_n_cat,edi,esi,[t_max] + jmp .end_f + .tag_02: + + mov bx,tag_format_ui2b + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_03 + stdcall str_n_cat,edi,txt_dp,[t_max] + call get_tag_data_size + cmp ebx,2 + jg .over4b_03 + jne @f + ;если два 2 байтовых числа + or edx,2 ;array data + movzx ecx,word[eax+10] + bt edx,0 + jnc @f + ror cx,8 + @@: + ;если одно 2 байтовое число + movzx ebx,word[eax+8] + bt edx,0 + jnc @f + ror bx,8 + @@: + stdcall str_len,edi + add edi,eax + mov eax,ebx + stdcall convert_int_to_str, [t_max] + bt edx,1 ;array ? + jnc .end_f + ;добавляем 2-е число + stdcall str_n_cat,edi,txt_zap,[t_max] + stdcall str_len,edi + add edi,eax + mov eax,ecx + stdcall convert_int_to_str, [t_max] + jmp .end_f + .over4b_03: + mov ecx,[t_max] + mov esi,dword[eax+8] + bt edx,0 + jnc @f + bswap esi + @@: + mov eax,[app1] + mov eax,[eax+4] + add esi,eax + + ;берем число + .array_03: + stdcall str_len,edi + cmp ecx,eax + jle .end_f ;если не хватило строки + add edi,eax + sub ecx,eax + movzx eax,word[esi] + bt edx,0 + jnc @f + ror ax,8 + @@: + stdcall convert_int_to_str,ecx + + dec ebx + cmp ebx,0 + je .end_f + + ;добавляем запятую + stdcall str_n_cat,edi,txt_zap,ecx + add esi,2 + jmp .array_03 + .tag_03: + + mov bx,tag_format_ui4b + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_04 + stdcall str_n_cat,edi,txt_dp,[t_max] + call get_tag_data_size + cmp ebx,1 + jg .over4b_04 + ;если одно 4 байтовое число + mov ebx,dword[eax+8] + bt edx,0 + jnc @f + bswap ebx + @@: + stdcall str_len,edi + add edi,eax + mov eax,ebx + stdcall convert_int_to_str, [t_max] + .over4b_04: + ;... + jmp .end_f + .tag_04: + + mov bx,tag_format_urb + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_05 + stdcall str_n_cat,edi,txt_dp,[t_max] + ;call get_tag_data_size + ;cmp ebx,1 + ;jg .over4b_05 + mov ebx,dword[eax+8] + bt edx,0 + jnc @f + bswap ebx + @@: + stdcall str_len,edi + add edi,eax + mov eax,[app1] + mov eax,[eax+4] + add ebx,eax + mov eax,[ebx] + bt edx,0 + jnc @f + bswap eax + @@: + stdcall convert_int_to_str, [t_max] ;ставим 1-е число + stdcall str_n_cat,edi,txt_div,[t_max] ;ставим знак деления + stdcall str_len,edi + add edi,eax + mov eax,[ebx+4] + bt edx,0 + jnc @f + bswap eax + @@: + stdcall convert_int_to_str, [t_max] ;ставим 2-е число + ;.over4b_05: + ;... + jmp .end_f + .tag_05: + + mov bx,tag_format_si2b + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_08 + stdcall str_n_cat,edi,txt_dp,[t_max] + call get_tag_data_size + cmp ebx,2 + jg .over4b_08 + jne @f + ;если два 2 байтовых числа + or edx,2 ;array data + movzx ecx,word[eax+10] + bt edx,0 + jnc @f + ror cx,8 + @@: + ;если одно 2 байтовое число + movzx ebx,word[eax+8] + bt edx,0 + jnc @f + ror bx,8 + @@: + stdcall str_len,edi + add edi,eax + bt bx,15 + jnc @f + mov byte[edi],'-' + inc edi + neg bx + inc bx + @@: + mov eax,ebx + stdcall convert_int_to_str, [t_max] + bt edx,1 ;array ? + jnc .end_f + ;добавляем 2-е число + stdcall str_n_cat,edi,txt_zap,[t_max] + stdcall str_len,edi + add edi,eax + bt bx,15 + jnc @f + mov byte[edi],'-' + inc edi + neg bx + inc bx + @@: + mov eax,ecx + stdcall convert_int_to_str, [t_max] + jmp .end_f + .over4b_08: + mov ecx,[t_max] + mov esi,dword[eax+8] + bt edx,0 + jnc @f + bswap esi + @@: + mov eax,[app1] + mov eax,[eax+4] + add esi,eax + + ;берем число + .array_08: + stdcall str_len,edi + cmp ecx,eax + jle .end_f ;если не хватило строки + add edi,eax + sub ecx,eax + movzx eax,word[esi] + bt edx,0 + jnc @f + ror ax,8 + @@: + ;смотрим на знак +|- + bt ax,15 + jnc @f + mov byte[edi],'-' + inc edi + neg ax + inc ax + @@: + stdcall convert_int_to_str,ecx + + dec ebx + cmp ebx,0 + je .end_f + + ;добавляем запятую + stdcall str_n_cat,edi,txt_zap,ecx + add esi,2 + jmp .array_08 + .tag_08: + + mov bx,tag_format_si4b + bt edx,0 + jnc @f + ror bx,8 + @@: + cmp word[eax+2],bx + jne .tag_09 + stdcall str_n_cat,edi,txt_dp,[t_max] + call get_tag_data_size + cmp ebx,1 + jg .over4b_09 + ;если одно 4 байтовое число + mov ebx,dword[eax+8] + bt edx,0 + jnc @f + bswap ebx + @@: + stdcall str_len,edi + add edi,eax + bt ebx,31 + jnc @f + mov byte[edi],'-' + inc edi + neg ebx + inc ebx + @@: + mov eax,ebx + stdcall convert_int_to_str, [t_max] + .over4b_09: + ;... + jmp .end_f + .tag_09: + + .end_f: + ret +endp + +;input: +; eax - tag pointer +; edx - 1 if 'MM', 0 if 'II' +;output: +; ebx - data size +align 4 +get_tag_data_size: + mov ebx,dword[eax+4] + bt edx,0 + jnc @f + bswap ebx + @@: + ret + +align 4 +proc str_n_cat uses eax ecx edi esi, str1:dword, str2:dword, n:dword + mov esi,dword[str2] + mov ecx,dword[n] + mov edi,dword[str1] + stdcall str_len,edi + add edi,eax + cld + repne movsb + mov byte[edi],0 + ret +endp + +;output: +; eax = strlen +align 4 +proc str_len, str1:dword + mov eax,[str1] + @@: + cmp byte[eax],0 + je @f + inc eax + jmp @b + @@: + sub eax,[str1] + ret +endp + +align 4 +proc hex_in_str, buf:dword,val:dword,zif:dword + pushad + mov edi,dword[buf] + mov ecx,dword[zif] + add edi,ecx + dec edi + mov ebx,dword[val] + + .cycle: + mov al,bl + and al,0xf + cmp al,10 + jl @f + add al,'a'-'0'-10 + @@: + add al,'0' + mov byte[edi],al + dec edi + shr ebx,4 + loop .cycle + + popad + ret +endp + +;input: +; eax - число +; edi - буфер для строки +; len - длинна буфера +;output: +align 4 +proc convert_int_to_str, len:dword +pushad + mov esi,[len] + add esi,edi + dec esi + call .str +popad + ret +endp + +align 4 +.str: + mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число + ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax + jb @f + xor edx,edx ;очистить edx + div ecx ;разделить - остаток в edx + push edx ;положить в стек + call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx + pop eax + @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) + cmp edi,esi + jge @f + or al,0x30 ;данная команда короче чем две выше + stosb ;записать элемент из регистра al в ячеку памяти es:edi + mov byte[edi],0 ;в конец строки ставим 0, что-бы не вылазил мусор + @@: + ret ;пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться + + + +align 16 +EXPORTS: + dd sz_exif_get_app1, exif_get_app1 + dd sz_exif_get_app2, exif_get_app2 + dd sz_exif_get_tag, exif_get_tag + dd sz_exif_get_tag_id, exif_get_tag_id + dd sz_exif_get_child, exif_get_child + dd 0,0 + sz_exif_get_app1 db 'exif_get_app1',0 + sz_exif_get_app2 db 'exif_get_app2',0 + sz_exif_get_tag db 'exif_get_tag',0 + sz_exif_get_tag_id db 'exif_get_tag_id',0 + sz_exif_get_child db 'exif_get_child',0 diff --git a/programs/develop/libraries/fontslib/trunk/Tupfile.lua b/programs/develop/libraries/fontslib/Tupfile.lua similarity index 100% rename from programs/develop/libraries/fontslib/trunk/Tupfile.lua rename to programs/develop/libraries/fontslib/Tupfile.lua diff --git a/programs/develop/libraries/fontslib/trunk/build.bat b/programs/develop/libraries/fontslib/build.bat similarity index 100% rename from programs/develop/libraries/fontslib/trunk/build.bat rename to programs/develop/libraries/fontslib/build.bat diff --git a/programs/develop/libraries/fontslib/trunk/font_.asm b/programs/develop/libraries/fontslib/font_.asm similarity index 100% rename from programs/develop/libraries/fontslib/trunk/font_.asm rename to programs/develop/libraries/fontslib/font_.asm diff --git a/programs/develop/libraries/fontslib/trunk/font_8x16.fon b/programs/develop/libraries/fontslib/font_8x16.fon similarity index 100% rename from programs/develop/libraries/fontslib/trunk/font_8x16.fon rename to programs/develop/libraries/fontslib/font_8x16.fon diff --git a/programs/develop/libraries/fontslib/trunk/font_ex.asm b/programs/develop/libraries/fontslib/font_ex.asm similarity index 97% rename from programs/develop/libraries/fontslib/trunk/font_ex.asm rename to programs/develop/libraries/fontslib/font_ex.asm index 98853e172..227a9fda3 100644 --- a/programs/develop/libraries/fontslib/trunk/font_ex.asm +++ b/programs/develop/libraries/fontslib/font_ex.asm @@ -42,10 +42,10 @@ use32 ; dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше dd 0x0 ; указатель на строку с параметрами. dd way_of_ini -include '../../../../macros.inc' -include '../../../../KOSfuncs.inc' -include '../../../../load_lib.mac' -include '../../box_lib/box_lib.mac' +include '../../../macros.inc' +include '../../../KOSfuncs.inc' +include '../../../load_lib.mac' +include '../box_lib/box_lib.mac' @use_library ;use load lib macros start: ;universal load library/librarys diff --git a/programs/develop/libraries/fontslib/trunk/fonts_lib.asm b/programs/develop/libraries/fontslib/fonts_lib.asm similarity index 92% rename from programs/develop/libraries/fontslib/trunk/fonts_lib.asm rename to programs/develop/libraries/fontslib/fonts_lib.asm index 73dd572a7..e8fdd8207 100644 --- a/programs/develop/libraries/fontslib/trunk/fonts_lib.asm +++ b/programs/develop/libraries/fontslib/fonts_lib.asm @@ -1,441 +1,447 @@ -; Copyright (c) 2009, -; All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions are met: -; * Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; * Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; * Neither the name of the nor the -; names of its contributors may be used to endorse or promote products -; derived from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''AS IS'' AND ANY -; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -;***************************************************************************** - -;;;;;;;;;;;;;;;;;; - -format MS COFF - -public EXPORTS - -section '.flat' code readable align 16 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Get info about -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -include '../../../../macros.inc' -align 4 -initialization_font: -; esp+0 = dd back -; чряюыэ хь ьрёёшт - ёЄЁєъЄє фы  яюыєўхэш  ъюы-тр Їрщыют - -pushad - xor eax,eax - inc eax - mov [number_function],eax -;structure is completed - mov eax,70 - mov ebx,dword struct_f_info - mcall -;IF ERROR FT then exit - test eax,eax - jnz .exit -;IF ERROR folder is not found then exit - test ebx,ebx - mov eax,ebx - jnz .exit - -;Get quantity files - mov eax,[buffer_32.quantity_files] - imul eax,304 - add eax,32 ; ?? - push eax ;save eax т eax ЁрчьхЁ эєцэющ эрь ярь Єш т срщЄрї -;init memory - mov eax,68 - mov ebx,11 - mcall - test eax,eax - jz .exit - inc ebx ;т√фхышЄ№ сыюъ т ecx срщЄ - - pop ecx - mov eax,68 - mcall - mov dword [fulder_array_point],eax ;save point for memory's fulder -;т eax єърчрЄхы№ эр сыюъ - mov [buffer_read_d],eax ;point to new array - mov eax,[buffer_32.quantity_files] - mov [read_block],eax -;get in buffer info of files and sub dir current dir - mov eax,70 - mov ebx,dword struct_f_info - mcall -;яюыєўшыш шэЇюЁьрЎш■ ю Їрщырї. - mov ebp, dword [buffer_read_d] ;point to structure - mov ecx, dword [ebp+4] ;ъюы-тю сыюъют ┴─┬╩ - mov dword [save_ecx],ecx - add ebp, 32 ;ёьх∙рхьё  фю ┴─┬╩ - mov dword [save_ebp],ebp - cld ;єёЄрэютър Їырур эряЁртыхэш  -align 4 -.start_loop: - push ecx - lea edi,[ebp+0x28] ;т edi єърчрЄхы№ эр эрўрыю шьхэш. - xor eax,eax - mov ecx,263 - repne scasb ;эрщфхь ъюэхЎ ёЄЁюъш -;;;;;;;;;;;;;;;;;;;;;;; - sub edi,5 ;.ksf,0 - lea esi,[name_font] - mov eax,dword[edi] - or eax,0x20202000 ; ёфхырхь Ёрё°шЁхэшх ёЄЁюўэ√ьш сєътрьш. - cmp eax,dword[esi] - jnz @f - -;;;;;;;; єЁр ¤Єю эр° Їрщы Є.х. эр° °ЁшЇЄ ь√ эр°ыш эєцэ√щ Їрщышъ )) -;ЄхяхЁ№ эєцэю Єюўэю єсхфшЄ№ё  ўЄю ¤Єю эр° ш Єюы№ъю эр° Їрщышъ -;чруЁєчшь чруюыютюъ Їрщыр ш єчэрхь хую ЁрчьхЁ уышЇр. - - call alloc_mem ; т√фхышь ючє ётюшї яхЁхьхээ√ї -; ёхщўрё эрь эєцэю ёЇюЁьшЁютрЄ№ шь  Їрщыр ё яюыэ√ь яєЄхь - mov eax,dword [alloc_memory_point] - lea edi,dword [eax+4] - lea esi,[name_fulder] - mov ecx,name_fuld_end - rep movsb ;яхЁхэюёшь яєЄ№ - mov al,'/' - stosb - lea esi,[ebp+0x28] ;т esi єърчрЄхы№ эр эрўрыю шьхэш. -align 4 -.loop_b: - lodsb - stosb - test al,al - jnz .loop_b - -; mov edi,name_of_file ; [ebp+0x28] ;т edi єърчрЄхы№ эр эрўрыю шьхэш. -;get in buffer info above own file - xor eax,eax - mov dword [number_function],eax - mov dword [index_start_block],eax ;яючшЎш  т Їрщых фы  ўЄхэш  фрээ√ї - mov dword [flags_],eax ;ёЄрЁ°р  яючшЎш  фы  ўЄхэш  фрээ√ї - mov dword [read_block],8 ;ёъюы№ъю срщЄ ўшЄрЄ№ эрь эєцэю 8 срщЄ - mov dword [buffer_read_d],file_buffer ; єърчрЄхы№ эр сєЇхЁ ъєфр сєфєЄ чряшёрэ√ фрээ√х - - mov eax,dword [alloc_memory_point] - lea edi,dword [eax+4] - mov dword [offset_to_string],edi - - mov eax,70 - mov ebx,dword struct_f_info - mcall -;;;;;;;;;;;;;;;; яЁютхЁшь ЇюЁьрЄ чруюыютър - mov eax,ebx - mov eax,dword [file_buffer] - mov ebx,dword [type_fnt] - cmp eax,ebx - jnz @f - -;;;;;;; юЄышўэю ёхщўрё яЁютхЁшыш ўЄю чруюыютюъ шьхээю ЄюЄ ъюЄюЁ√щ эрь эєцхэ -; ёхщўрё эєцэю яхЁхЁрёяЁхфхышЄ№ сыюъш Є.х. яю ьхЁх эрїюцфхэш  сєфхь яхЁхэюёшЄ№ сыюъш -; т эрўрыю сєЇхЁр - - mov dword [save_point_nt],ebp - pop ecx - xor eax,eax - jmp .exit - -align 4 -@@: pop ecx - add ebp,304 - dec ecx - jnz .start_loop -; loop .start_loop - or eax,-1 -;;;;;;;; яЁю°ышё№ - тёх шэЄхЁхёє∙■∙шх °ЁшЇЄ√ яхЁхьхёЄшыш т эрўрыю сыюър. - -align 4 -.exit: mov dword [esp+28],eax -popad -ret - - -align 4 -get_font: -; яюшёъ т ьрёёштх °ЁшЇЄр яЁш ёютярфхэшш єcыютшщ чруЁєчър °ЁшЇЄр -; esp+4 = dd width font shl 16 +hight font -; esp+0 = dd back -;pop eax -; pop dword [font_x_y] -;push eax -pushad - mov eax,dword [esp+32+4] - mov dword [font_x_y],eax - xor eax,eax - mov dword [number_function],eax - mov dword [index_start_block],eax ;яючшЎш  т Їрщых фы  ўЄхэш  фрээ√ї - mov dword [flags_],eax ;ёЄрЁ°р  яючшЎш  фы  ўЄхэш  фрээ√ї - mov dword [read_block],8 ;ёъюы№ъю срщЄ ўшЄрЄ№ эрь эєцэю 8 срщЄ - mov dword [buffer_read_d],file_buffer ; єърчрЄхы№ эр сєЇхЁ ъєфр сєфєЄ чряшёрэ√ фрээ√х - - mov eax,dword [alloc_memory_point] - lea edi,dword [eax+4] - mov dword [offset_to_string],edi - - - mov eax,70 - mov ebx,dword struct_f_info - mcall -;;;;;;;;;;;;;;;; яЁютхЁшь ЇюЁьрЄ чруюыютър - mov eax,ebx - mov eax,dword [file_buffer] - mov ebx,dword [type_fnt] - cmp eax,ebx - - mov ecx,dword [file_buffer.font_size] - mov edx,dword [font_x_y] - cmp ecx,edx - - mov ecx, 4096;dword [ebp+32] ;ЁрчьхЁ Їрщыр фю 4294967296 срщЄ Є.х. 4 ├с - - mov dword [read_block],ecx - mov eax,68 - mov ebx,12 - mcall - - mov dword [font_array_point],eax ;save point to array - mov dword [buffer_read_d],eax - -;load font - mov ebx,dword struct_f_info - mov eax,70 - mcall - test eax,eax - jnz .exit - - lea eax,[buffer_read_d] - mov eax,dword [eax] - mov ebx,dword [eax+8] - add eax,ebx -; add eax,dword [eax+8] -; add eax,dword [buffer_read_d] - mov dword [font_array_data],eax - xor eax,eax - jmp .ok - -;here error file system -align 4 -.exit: - or eax,-1 -align 4 -.ok: mov dword [esp+28],eax ;тхЁэхь ю°шсъє - popad - ret 4 - - -; яюшёъ т√тюф ёЄюЁюўъш яю ёшьтюы№эю ёЇюЁшЁютрээюую °ЁшЇЄюь ЄхъёЄр -; esp+12= dd x shl 16 + y x- ъююЁфшэрЄр яю ╒, y - ъююЁфшэрЄр яю Y -; esp+8 = dd point to color of background and font -; esp+4 = dd point to ASCIIZ -; esp+0 = dd back -align 4 -font_draw_on_string: -pushad - - mov esi,dword [esp+4+32] ;ASCIIZ - mov edx,dword [esp+12+32] ; x shl 16 +y - mov ecx,dword [font_x_y] ;ЁрчьхЁ уышЇр x shl 16 +y - mov edi,dword [esp+8+32] ;єърчрЄхы№ эр ярышЄЁє шч ЎтхЄр ш Їюэр - xor ebp,ebp ;ёь 65 ЇєэъЎш■ )) - cld -align 4 -@@: ;pushad - xor eax,eax - lodsb - test al,al - jz .return - shl eax,4 ;єьэюцрхь эр 16 Є.ъ. ¤Єю т√ёюЄр уышЇр - - mov ebx,dword [font_array_data] ; ЄєЄ Ёрёяюыюур■Єё  уышЇ√ ёшьтюыют - add ebx,eax - push esi - mov esi,1 - mov eax,65 - mcall - pop esi - add edx,8 shl 16 ;ёыхфє■∙шщ ёшьтюы °шЁшэр ёшьтюыр = 8 Єюўърь - jmp @b - -align 4 -.return: -popad -ret 12 - - -align 4 -; esp+4 = dd point to color of background and font -show_all_glif: -pushad - - mov edx,10 shl 16+20 ;dword [esp+12+32] ; x shl 16 +y - mov ecx,128 shl 16 +256;dword [font_x_y] ;ЁрчьхЁ уышЇр x shl 16 +y - mov edi,dword [esp+4+32] ;єърчрЄхы№ эр ярышЄЁє шч ЎтхЄр ш Їюэр - xor ebp,ebp ;ёь 65 ЇєэъЎш■ )) - -align 4 -@@: - mov ebx,dword [font_array_data] ; ЄєЄ Ёрёяюыюур■Єё  уышЇ√ ёшьтюыют - mov esi,1 - mov eax,65 - mcall -popad -ret 4 - - - - - - -align 4 -free_fulder_info: -;юётюсюфшЄ№ ярь Є№ т√фхыхэє■ фы  яюыєўхэш  сыюъют ┴─┬╩ -pushad - mov ecx, dword [fulder_array_point] - mov eax,68 - mov ebx,13 - mcall - test eax,eax -; jnz @f - mov dword [esp+28],eax ;тхЁэхь ю°шсъє -;align 4 -;@@: -popad - ret -align 4 -free_font: -;юётюсюфшЄ№ ярь Є№ т√фхыхэє■ фы  яюыєўхэш  сыюъют ┴─┬╩ -pushad - mov ecx, dword [font_array_point] - mov eax,68 - mov ebx,13 - mcall - test eax,eax -; jnz @f - mov dword [esp+28],eax ;тхЁэхь ю°шсъє -;align 4 -;@@: -popad - ret - -align 4 -; alloc mem get 4 Kb for own data -alloc_mem: - pushad - mov eax, dword [alloc_memory_point] - test eax,eax - jnz .mem_allocating - mov eax,68 - mov ebx,12 - mov ecx,4096 - mcall - mov dword [alloc_memory_point],eax ; яЁш яхЁтюь тїюцфхэшш т√фхы хь 4 ъс ╬╟╙ ш ёюїЁрэ хь єърчрЄхы№ - mov dword [eax],-1 - popad - ret -align 4 -.mem_allocating: - mov ebp, dword [eax] - mov eax,ebp - cmp eax, -1 - jnz .mem_allocating - - mov eax,68 - mov ebx,12 - mov ecx,4096 - mcall - mov dword [ebp],eax ; яЁш яхЁтюь тїюцфхэшш т√фхы хь 4 ъс ╬╟╙ ш ёюїЁрэ хь єърчрЄхы№ - mov dword [ebp],-1 - popad - ret - -align 16 -EXPORTS: - - dd sz_initialization_font, initialization_font - dd sz_get_font, get_font - dd sz_free_fulder_info, free_fulder_info - dd sz_free_font, free_font - dd sz_font_draw_on_string, font_draw_on_string - dd sz_show_all_glif, show_all_glif -; dd szVersion_ch, 0x00000001 -; dd sz_option_box_draw, option_box_draw -; dd sz_option_box_mouse, option_box_mouse - dd szVersion_fn, 0x00000001 - dd 0,0 - -sz_initialization_font db 'initialization_font',0 -sz_get_font db 'get_font',0 -sz_free_fulder_info db 'free_fulder_info',0 -sz_free_font db 'free_font',0 -sz_font_draw_on_string db 'font_draw_on_string',0 -sz_show_all_glif db 'show_all_glif',0 -;sz_check_box_mouse db 'check_box_mouse',0 -;szVersion_ch db 'version_ch',0 -;sz_option_box_draw db 'option_box_draw',0 -;sz_option_box_mouse db 'option_box_mouse',0 -szVersion_fn db 'version_fn',0 - -;;;;;;;;;;; -;;Data -;;;;;;;;;;; -align 4 -;buffer_font file 'font_8x16.fon' ;°ЁшЇЄ ъюЄюЁ√ь сєфхь т√тюфшЄ№ raw ЇюЁьрЄ 1bpp -save_ecx dd 0x0 -;buffer_font file 'font01.ksf' ;°ЁшЇЄ ъюЄюЁ√ь сєфхь т√тюфшЄ№ raw ЇюЁьрЄ 1bpp -alloc_memory_point dd 0x0 ; point to mem block in RAM 4096-4 -;ёЄЁєъЄєЁр Єрър  т эрўрых т√фхыхэюую сыюър Ёрчьх∙рхЄё  єърчрЄхы№ эр фЁєующ т√фхыыэ√щ сыюъ т 4096-4, хёыш ¤Єю сыюъ яюёыхфэшщ, Єю dd -1 -font_x_y dd 0x0 -fulder_array_point dd 0x0 -font_array_point dd 0x0 -font_array_data dd 0x0 ; Ёхры№э√х фрээ√х Є.х. ьрЄЁшЎр °ЁшЇЄр -save_ebp dd 0x0 -save_point_nt dd 0x0 -name_fulder db '/sys/FONTS',0 -name_fuld_end= ($-name_fulder) -1 -name_font db '.ksf',0 -type_fnt db 'kf01' - - - -align 16 -struct_f_info: -number_function dd 0x0 -index_start_block dd 0x0 -flags_ dd 0x0 -read_block dd 0x0 -buffer_read_d dd buffer_32 -free_byte db 0x0 -offset_to_string dd name_fulder - -align 16 -file_buffer: -.type_fnt dd 0x0 -.font_size dd 0x0 - -align 16 -buffer_32: -.head dd ? -.quantity_block dd ? -.quantity_files dd ? - rb 20 +; SPDX-License-Identifier: NOASSERTION +; + +; Text encoded with Code Page Windows 1251 - Cyrillic + + +; Copyright (c) 2009, +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions are met: +; * Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; * Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; * Neither the name of the nor the +; names of its contributors may be used to endorse or promote products +; derived from this software without specific prior written permission. +; +; THIS SOFTWARE IS PROVIDED BY Alexey Teplov nickname ''AS IS'' AND ANY +; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +; DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;***************************************************************************** + +;;;;;;;;;;;;;;;;;; + +format MS COFF + +public EXPORTS + +section '.flat' code readable align 16 +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Get info about +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +include '../../../macros.inc' +align 4 +initialization_font: +; esp+0 = dd back +; чряюыэ хь ьрёёшт - ёЄЁєъЄє фы  яюыєўхэш  ъюы-тр Їрщыют + +pushad + xor eax,eax + inc eax + mov [number_function],eax +;structure is completed + mov eax,70 + mov ebx,dword struct_f_info + mcall +;IF ERROR FT then exit + test eax,eax + jnz .exit +;IF ERROR folder is not found then exit + test ebx,ebx + mov eax,ebx + jnz .exit + +;Get quantity files + mov eax,[buffer_32.quantity_files] + imul eax,304 + add eax,32 ; ?? + push eax ;save eax т eax ЁрчьхЁ эєцэющ эрь ярь Єш т срщЄрї +;init memory + mov eax,68 + mov ebx,11 + mcall + test eax,eax + jz .exit + inc ebx ;т√фхышЄ№ сыюъ т ecx срщЄ + + pop ecx + mov eax,68 + mcall + mov dword [fulder_array_point],eax ;save point for memory's fulder +;т eax єърчрЄхы№ эр сыюъ + mov [buffer_read_d],eax ;point to new array + mov eax,[buffer_32.quantity_files] + mov [read_block],eax +;get in buffer info of files and sub dir current dir + mov eax,70 + mov ebx,dword struct_f_info + mcall +;яюыєўшыш шэЇюЁьрЎш■ ю Їрщырї. + mov ebp, dword [buffer_read_d] ;point to structure + mov ecx, dword [ebp+4] ;ъюы-тю сыюъют ┴─┬╩ + mov dword [save_ecx],ecx + add ebp, 32 ;ёьх∙рхьё  фю ┴─┬╩ + mov dword [save_ebp],ebp + cld ;єёЄрэютър Їырур эряЁртыхэш  +align 4 +.start_loop: + push ecx + lea edi,[ebp+0x28] ;т edi єърчрЄхы№ эр эрўрыю шьхэш. + xor eax,eax + mov ecx,263 + repne scasb ;эрщфхь ъюэхЎ ёЄЁюъш +;;;;;;;;;;;;;;;;;;;;;;; + sub edi,5 ;.ksf,0 + lea esi,[name_font] + mov eax,dword[edi] + or eax,0x20202000 ; ёфхырхь Ёрё°шЁхэшх ёЄЁюўэ√ьш сєътрьш. + cmp eax,dword[esi] + jnz @f + +;;;;;;;; єЁр ¤Єю эр° Їрщы Є.х. эр° °ЁшЇЄ ь√ эр°ыш эєцэ√щ Їрщышъ )) +;ЄхяхЁ№ эєцэю Єюўэю єсхфшЄ№ё  ўЄю ¤Єю эр° ш Єюы№ъю эр° Їрщышъ +;чруЁєчшь чруюыютюъ Їрщыр ш єчэрхь хую ЁрчьхЁ уышЇр. + + call alloc_mem ; т√фхышь ючє ётюшї яхЁхьхээ√ї +; ёхщўрё эрь эєцэю ёЇюЁьшЁютрЄ№ шь  Їрщыр ё яюыэ√ь яєЄхь + mov eax,dword [alloc_memory_point] + lea edi,dword [eax+4] + lea esi,[name_fulder] + mov ecx,name_fuld_end + rep movsb ;яхЁхэюёшь яєЄ№ + mov al,'/' + stosb + lea esi,[ebp+0x28] ;т esi єърчрЄхы№ эр эрўрыю шьхэш. +align 4 +.loop_b: + lodsb + stosb + test al,al + jnz .loop_b + +; mov edi,name_of_file ; [ebp+0x28] ;т edi єърчрЄхы№ эр эрўрыю шьхэш. +;get in buffer info above own file + xor eax,eax + mov dword [number_function],eax + mov dword [index_start_block],eax ;яючшЎш  т Їрщых фы  ўЄхэш  фрээ√ї + mov dword [flags_],eax ;ёЄрЁ°р  яючшЎш  фы  ўЄхэш  фрээ√ї + mov dword [read_block],8 ;ёъюы№ъю срщЄ ўшЄрЄ№ эрь эєцэю 8 срщЄ + mov dword [buffer_read_d],file_buffer ; єърчрЄхы№ эр сєЇхЁ ъєфр сєфєЄ чряшёрэ√ фрээ√х + + mov eax,dword [alloc_memory_point] + lea edi,dword [eax+4] + mov dword [offset_to_string],edi + + mov eax,70 + mov ebx,dword struct_f_info + mcall +;;;;;;;;;;;;;;;; яЁютхЁшь ЇюЁьрЄ чруюыютър + mov eax,ebx + mov eax,dword [file_buffer] + mov ebx,dword [type_fnt] + cmp eax,ebx + jnz @f + +;;;;;;; юЄышўэю ёхщўрё яЁютхЁшыш ўЄю чруюыютюъ шьхээю ЄюЄ ъюЄюЁ√щ эрь эєцхэ +; ёхщўрё эєцэю яхЁхЁрёяЁхфхышЄ№ сыюъш Є.х. яю ьхЁх эрїюцфхэш  сєфхь яхЁхэюёшЄ№ сыюъш +; т эрўрыю сєЇхЁр + + mov dword [save_point_nt],ebp + pop ecx + xor eax,eax + jmp .exit + +align 4 +@@: pop ecx + add ebp,304 + dec ecx + jnz .start_loop +; loop .start_loop + or eax,-1 +;;;;;;;; яЁю°ышё№ - тёх шэЄхЁхёє∙■∙шх °ЁшЇЄ√ яхЁхьхёЄшыш т эрўрыю сыюър. + +align 4 +.exit: mov dword [esp+28],eax +popad +ret + + +align 4 +get_font: +; яюшёъ т ьрёёштх °ЁшЇЄр яЁш ёютярфхэшш єcыютшщ чруЁєчър °ЁшЇЄр +; esp+4 = dd width font shl 16 +hight font +; esp+0 = dd back +;pop eax +; pop dword [font_x_y] +;push eax +pushad + mov eax,dword [esp+32+4] + mov dword [font_x_y],eax + xor eax,eax + mov dword [number_function],eax + mov dword [index_start_block],eax ;яючшЎш  т Їрщых фы  ўЄхэш  фрээ√ї + mov dword [flags_],eax ;ёЄрЁ°р  яючшЎш  фы  ўЄхэш  фрээ√ї + mov dword [read_block],8 ;ёъюы№ъю срщЄ ўшЄрЄ№ эрь эєцэю 8 срщЄ + mov dword [buffer_read_d],file_buffer ; єърчрЄхы№ эр сєЇхЁ ъєфр сєфєЄ чряшёрэ√ фрээ√х + + mov eax,dword [alloc_memory_point] + lea edi,dword [eax+4] + mov dword [offset_to_string],edi + + + mov eax,70 + mov ebx,dword struct_f_info + mcall +;;;;;;;;;;;;;;;; яЁютхЁшь ЇюЁьрЄ чруюыютър + mov eax,ebx + mov eax,dword [file_buffer] + mov ebx,dword [type_fnt] + cmp eax,ebx + + mov ecx,dword [file_buffer.font_size] + mov edx,dword [font_x_y] + cmp ecx,edx + + mov ecx, 4096;dword [ebp+32] ;ЁрчьхЁ Їрщыр фю 4294967296 срщЄ Є.х. 4 ├с + + mov dword [read_block],ecx + mov eax,68 + mov ebx,12 + mcall + + mov dword [font_array_point],eax ;save point to array + mov dword [buffer_read_d],eax + +;load font + mov ebx,dword struct_f_info + mov eax,70 + mcall + test eax,eax + jnz .exit + + lea eax,[buffer_read_d] + mov eax,dword [eax] + mov ebx,dword [eax+8] + add eax,ebx +; add eax,dword [eax+8] +; add eax,dword [buffer_read_d] + mov dword [font_array_data],eax + xor eax,eax + jmp .ok + +;here error file system +align 4 +.exit: + or eax,-1 +align 4 +.ok: mov dword [esp+28],eax ;тхЁэхь ю°шсъє + popad + ret 4 + + +; яюшёъ т√тюф ёЄюЁюўъш яю ёшьтюы№эю ёЇюЁшЁютрээюую °ЁшЇЄюь ЄхъёЄр +; esp+12= dd x shl 16 + y x- ъююЁфшэрЄр яю ╒, y - ъююЁфшэрЄр яю Y +; esp+8 = dd point to color of background and font +; esp+4 = dd point to ASCIIZ +; esp+0 = dd back +align 4 +font_draw_on_string: +pushad + + mov esi,dword [esp+4+32] ;ASCIIZ + mov edx,dword [esp+12+32] ; x shl 16 +y + mov ecx,dword [font_x_y] ;ЁрчьхЁ уышЇр x shl 16 +y + mov edi,dword [esp+8+32] ;єърчрЄхы№ эр ярышЄЁє шч ЎтхЄр ш Їюэр + xor ebp,ebp ;ёь 65 ЇєэъЎш■ )) + cld +align 4 +@@: ;pushad + xor eax,eax + lodsb + test al,al + jz .return + shl eax,4 ;єьэюцрхь эр 16 Є.ъ. ¤Єю т√ёюЄр уышЇр + + mov ebx,dword [font_array_data] ; ЄєЄ Ёрёяюыюур■Єё  уышЇ√ ёшьтюыют + add ebx,eax + push esi + mov esi,1 + mov eax,65 + mcall + pop esi + add edx,8 shl 16 ;ёыхфє■∙шщ ёшьтюы °шЁшэр ёшьтюыр = 8 Єюўърь + jmp @b + +align 4 +.return: +popad +ret 12 + + +align 4 +; esp+4 = dd point to color of background and font +show_all_glif: +pushad + + mov edx,10 shl 16+20 ;dword [esp+12+32] ; x shl 16 +y + mov ecx,128 shl 16 +256;dword [font_x_y] ;ЁрчьхЁ уышЇр x shl 16 +y + mov edi,dword [esp+4+32] ;єърчрЄхы№ эр ярышЄЁє шч ЎтхЄр ш Їюэр + xor ebp,ebp ;ёь 65 ЇєэъЎш■ )) + +align 4 +@@: + mov ebx,dword [font_array_data] ; ЄєЄ Ёрёяюыюур■Єё  уышЇ√ ёшьтюыют + mov esi,1 + mov eax,65 + mcall +popad +ret 4 + + + + + + +align 4 +free_fulder_info: +;юётюсюфшЄ№ ярь Є№ т√фхыхэє■ фы  яюыєўхэш  сыюъют ┴─┬╩ +pushad + mov ecx, dword [fulder_array_point] + mov eax,68 + mov ebx,13 + mcall + test eax,eax +; jnz @f + mov dword [esp+28],eax ;тхЁэхь ю°шсъє +;align 4 +;@@: +popad + ret +align 4 +free_font: +;юётюсюфшЄ№ ярь Є№ т√фхыхэє■ фы  яюыєўхэш  сыюъют ┴─┬╩ +pushad + mov ecx, dword [font_array_point] + mov eax,68 + mov ebx,13 + mcall + test eax,eax +; jnz @f + mov dword [esp+28],eax ;тхЁэхь ю°шсъє +;align 4 +;@@: +popad + ret + +align 4 +; alloc mem get 4 Kb for own data +alloc_mem: + pushad + mov eax, dword [alloc_memory_point] + test eax,eax + jnz .mem_allocating + mov eax,68 + mov ebx,12 + mov ecx,4096 + mcall + mov dword [alloc_memory_point],eax ; яЁш яхЁтюь тїюцфхэшш т√фхы хь 4 ъс ╬╟╙ ш ёюїЁрэ хь єърчрЄхы№ + mov dword [eax],-1 + popad + ret +align 4 +.mem_allocating: + mov ebp, dword [eax] + mov eax,ebp + cmp eax, -1 + jnz .mem_allocating + + mov eax,68 + mov ebx,12 + mov ecx,4096 + mcall + mov dword [ebp],eax ; яЁш яхЁтюь тїюцфхэшш т√фхы хь 4 ъс ╬╟╙ ш ёюїЁрэ хь єърчрЄхы№ + mov dword [ebp],-1 + popad + ret + +align 16 +EXPORTS: + + dd sz_initialization_font, initialization_font + dd sz_get_font, get_font + dd sz_free_fulder_info, free_fulder_info + dd sz_free_font, free_font + dd sz_font_draw_on_string, font_draw_on_string + dd sz_show_all_glif, show_all_glif +; dd szVersion_ch, 0x00000001 +; dd sz_option_box_draw, option_box_draw +; dd sz_option_box_mouse, option_box_mouse + dd szVersion_fn, 0x00000001 + dd 0,0 + +sz_initialization_font db 'initialization_font',0 +sz_get_font db 'get_font',0 +sz_free_fulder_info db 'free_fulder_info',0 +sz_free_font db 'free_font',0 +sz_font_draw_on_string db 'font_draw_on_string',0 +sz_show_all_glif db 'show_all_glif',0 +;sz_check_box_mouse db 'check_box_mouse',0 +;szVersion_ch db 'version_ch',0 +;sz_option_box_draw db 'option_box_draw',0 +;sz_option_box_mouse db 'option_box_mouse',0 +szVersion_fn db 'version_fn',0 + +;;;;;;;;;;; +;;Data +;;;;;;;;;;; +align 4 +;buffer_font file 'font_8x16.fon' ;°ЁшЇЄ ъюЄюЁ√ь сєфхь т√тюфшЄ№ raw ЇюЁьрЄ 1bpp +save_ecx dd 0x0 +;buffer_font file 'font01.ksf' ;°ЁшЇЄ ъюЄюЁ√ь сєфхь т√тюфшЄ№ raw ЇюЁьрЄ 1bpp +alloc_memory_point dd 0x0 ; point to mem block in RAM 4096-4 +;ёЄЁєъЄєЁр Єрър  т эрўрых т√фхыхэюую сыюър Ёрчьх∙рхЄё  єърчрЄхы№ эр фЁєующ т√фхыыэ√щ сыюъ т 4096-4, хёыш ¤Єю сыюъ яюёыхфэшщ, Єю dd -1 +font_x_y dd 0x0 +fulder_array_point dd 0x0 +font_array_point dd 0x0 +font_array_data dd 0x0 ; Ёхры№э√х фрээ√х Є.х. ьрЄЁшЎр °ЁшЇЄр +save_ebp dd 0x0 +save_point_nt dd 0x0 +name_fulder db '/sys/FONTS',0 +name_fuld_end= ($-name_fulder) -1 +name_font db '.ksf',0 +type_fnt db 'kf01' + + + +align 16 +struct_f_info: +number_function dd 0x0 +index_start_block dd 0x0 +flags_ dd 0x0 +read_block dd 0x0 +buffer_read_d dd buffer_32 +free_byte db 0x0 +offset_to_string dd name_fulder + +align 16 +file_buffer: +.type_fnt dd 0x0 +.font_size dd 0x0 + +align 16 +buffer_32: +.head dd ? +.quantity_block dd ? +.quantity_files dd ? + rb 20 diff --git a/programs/develop/libraries/fontslib/trunk/readme.txt b/programs/develop/libraries/fontslib/readme.txt similarity index 100% rename from programs/develop/libraries/fontslib/trunk/readme.txt rename to programs/develop/libraries/fontslib/readme.txt diff --git a/programs/develop/libraries/framework/trunk/config.mk b/programs/develop/libraries/framework/config.mk similarity index 100% rename from programs/develop/libraries/framework/trunk/config.mk rename to programs/develop/libraries/framework/config.mk diff --git a/programs/develop/libraries/framework/trunk/gpl3.txt b/programs/develop/libraries/framework/gpl3.txt similarity index 100% rename from programs/develop/libraries/framework/trunk/gpl3.txt rename to programs/develop/libraries/framework/gpl3.txt diff --git a/programs/develop/libraries/framework/trunk/include/defs.h b/programs/develop/libraries/framework/include/defs.h similarity index 100% rename from programs/develop/libraries/framework/trunk/include/defs.h rename to programs/develop/libraries/framework/include/defs.h diff --git a/programs/develop/libraries/framework/trunk/include/heap.h b/programs/develop/libraries/framework/include/heap.h similarity index 100% rename from programs/develop/libraries/framework/trunk/include/heap.h rename to programs/develop/libraries/framework/include/heap.h diff --git a/programs/develop/libraries/framework/trunk/include/ipc.h b/programs/develop/libraries/framework/include/ipc.h similarity index 100% rename from programs/develop/libraries/framework/trunk/include/ipc.h rename to programs/develop/libraries/framework/include/ipc.h diff --git a/programs/develop/libraries/framework/trunk/include/kolibri.h b/programs/develop/libraries/framework/include/kolibri.h similarity index 100% rename from programs/develop/libraries/framework/trunk/include/kolibri.h rename to programs/develop/libraries/framework/include/kolibri.h diff --git a/programs/develop/libraries/framework/trunk/include/malloc.h b/programs/develop/libraries/framework/include/malloc.h similarity index 100% rename from programs/develop/libraries/framework/trunk/include/malloc.h rename to programs/develop/libraries/framework/include/malloc.h diff --git a/programs/develop/libraries/framework/trunk/include/stdlib.h b/programs/develop/libraries/framework/include/stdlib.h similarity index 100% rename from programs/develop/libraries/framework/trunk/include/stdlib.h rename to programs/develop/libraries/framework/include/stdlib.h diff --git a/programs/develop/libraries/framework/trunk/kolibri/kolibri.c b/programs/develop/libraries/framework/kolibri/kolibri.c similarity index 100% rename from programs/develop/libraries/framework/trunk/kolibri/kolibri.c rename to programs/develop/libraries/framework/kolibri/kolibri.c diff --git a/programs/develop/libraries/framework/trunk/kolibri/makefile b/programs/develop/libraries/framework/kolibri/makefile similarity index 100% rename from programs/develop/libraries/framework/trunk/kolibri/makefile rename to programs/develop/libraries/framework/kolibri/makefile diff --git a/programs/develop/libraries/framework/trunk/libIPC/ipc.c b/programs/develop/libraries/framework/libIPC/ipc.c similarity index 100% rename from programs/develop/libraries/framework/trunk/libIPC/ipc.c rename to programs/develop/libraries/framework/libIPC/ipc.c diff --git a/programs/develop/libraries/framework/trunk/libIPC/ipc.txt b/programs/develop/libraries/framework/libIPC/ipc.txt similarity index 100% rename from programs/develop/libraries/framework/trunk/libIPC/ipc.txt rename to programs/develop/libraries/framework/libIPC/ipc.txt diff --git a/programs/develop/libraries/framework/trunk/libIPC/makefile b/programs/develop/libraries/framework/libIPC/makefile similarity index 100% rename from programs/develop/libraries/framework/trunk/libIPC/makefile rename to programs/develop/libraries/framework/libIPC/makefile diff --git a/programs/develop/libraries/framework/trunk/libconfig/find_str.asm b/programs/develop/libraries/framework/libconfig/find_str.asm similarity index 100% rename from programs/develop/libraries/framework/trunk/libconfig/find_str.asm rename to programs/develop/libraries/framework/libconfig/find_str.asm diff --git a/programs/develop/libraries/framework/trunk/libconfig/libconfig.asm b/programs/develop/libraries/framework/libconfig/libconfig.asm similarity index 100% rename from programs/develop/libraries/framework/trunk/libconfig/libconfig.asm rename to programs/develop/libraries/framework/libconfig/libconfig.asm diff --git a/programs/develop/libraries/framework/trunk/libconfig/libini_p.asm b/programs/develop/libraries/framework/libconfig/libini_p.asm similarity index 100% rename from programs/develop/libraries/framework/trunk/libconfig/libini_p.asm rename to programs/develop/libraries/framework/libconfig/libini_p.asm diff --git a/programs/develop/libraries/framework/trunk/libconfig/libini_p.inc b/programs/develop/libraries/framework/libconfig/libini_p.inc similarity index 100% rename from programs/develop/libraries/framework/trunk/libconfig/libini_p.inc rename to programs/develop/libraries/framework/libconfig/libini_p.inc diff --git a/programs/develop/libraries/framework/trunk/stdlib/heap.c b/programs/develop/libraries/framework/stdlib/heap.c similarity index 100% rename from programs/develop/libraries/framework/trunk/stdlib/heap.c rename to programs/develop/libraries/framework/stdlib/heap.c diff --git a/programs/develop/libraries/framework/trunk/stdlib/makefile b/programs/develop/libraries/framework/stdlib/makefile similarity index 100% rename from programs/develop/libraries/framework/trunk/stdlib/makefile rename to programs/develop/libraries/framework/stdlib/makefile diff --git a/programs/develop/libraries/framework/trunk/stdlib/malloc.c b/programs/develop/libraries/framework/stdlib/malloc.c similarity index 100% rename from programs/develop/libraries/framework/trunk/stdlib/malloc.c rename to programs/develop/libraries/framework/stdlib/malloc.c diff --git a/programs/develop/libraries/framework/trunk/stdlib/stdlib.c b/programs/develop/libraries/framework/stdlib/stdlib.c similarity index 100% rename from programs/develop/libraries/framework/trunk/stdlib/stdlib.c rename to programs/develop/libraries/framework/stdlib/stdlib.c diff --git a/programs/develop/libraries/libs-dev/libimg/gif/gif.asm b/programs/develop/libraries/libs-dev/libimg/gif/gif.asm index 37dc6407d..e167e3961 100644 --- a/programs/develop/libraries/libs-dev/libimg/gif/gif.asm +++ b/programs/develop/libraries/libs-dev/libimg/gif/gif.asm @@ -22,7 +22,7 @@ ;; References: ;; ;; 1. GIF LITE v3.0 (2004-2007) ;; ;; by Willow and Diamond ;; -;; svn://kolibrios.org/programs/media/gifview/trunk/gif_lite.inc ;; +;; /programs/other/outdated/gifview/gif_lite.inc ;; ;; 2. "GIF File Format Summary" ;; ;; from "Encyclopedia of Graphics File Formats" by O'Reilly ;; ;; http://www.fileformat.info/format/gif/ ;; diff --git a/programs/develop/libraries/proc_lib/trunk/Tupfile.lua b/programs/develop/libraries/proc_lib/Tupfile.lua similarity index 100% rename from programs/develop/libraries/proc_lib/trunk/Tupfile.lua rename to programs/develop/libraries/proc_lib/Tupfile.lua diff --git a/programs/develop/libraries/proc_lib/trunk/build.sh b/programs/develop/libraries/proc_lib/build.sh similarity index 100% rename from programs/develop/libraries/proc_lib/trunk/build.sh rename to programs/develop/libraries/proc_lib/build.sh diff --git a/programs/develop/libraries/proc_lib/trunk/colrdial.mac b/programs/develop/libraries/proc_lib/colrdial.mac similarity index 100% rename from programs/develop/libraries/proc_lib/trunk/colrdial.mac rename to programs/develop/libraries/proc_lib/colrdial.mac diff --git a/programs/develop/libraries/proc_lib/trunk/opendial.mac b/programs/develop/libraries/proc_lib/opendial.mac similarity index 100% rename from programs/develop/libraries/proc_lib/trunk/opendial.mac rename to programs/develop/libraries/proc_lib/opendial.mac diff --git a/programs/develop/libraries/proc_lib/trunk/proc_lib.asm b/programs/develop/libraries/proc_lib/proc_lib.asm similarity index 92% rename from programs/develop/libraries/proc_lib/trunk/proc_lib.asm rename to programs/develop/libraries/proc_lib/proc_lib.asm index 0d76e5cb8..62499cf35 100644 --- a/programs/develop/libraries/proc_lib/trunk/proc_lib.asm +++ b/programs/develop/libraries/proc_lib/proc_lib.asm @@ -1,71 +1,74 @@ -;***************************************************************************** -; Proc_Lib - library for common procedures -; -; Authors: -; Marat Zakiyanov aka Mario79, aka Mario -;***************************************************************************** - -format MS COFF - -public EXPORTS - -section '.flat' code readable align 16 -include '../../../../macros.inc' -;include '../../../../proc32.inc' -include '../../../../KOSfuncs.inc' -include 'opendial.mac' -include 'colrdial.mac' -;include 'debug.inc' -;----------------------------------------------------------------------------- - -;-------------------------------------------------- -; Open Dialog -;-------------------------------------------------- -align 16 -use_OpenDialog - -;-------------------------------------------------- -; Color Dialog -;-------------------------------------------------- -align 16 -use_ColorDialog - -;-------------------------------------------------- -align 16 -lib_init: - xor eax, eax - ret - -;-------------------------------------------------- -align 16 -EXPORTS: - - -dd sz_init, lib_init -dd sz_version, 0x00000001 - -dd sz_OpenDialog_init, OpenDialog.init -dd sz_OpenDialog_start, OpenDialog.start -dd sz_OpenDialog_set_file_name, OpenDialog.set_file_name -dd sz_OpenDialog_set_file_ext, OpenDialog.set_file_ext -dd szVersion_OpenDialog, 0x00010001 - -dd sz_ColorDialog_init, ColorDialog.init -dd sz_ColorDialog_start, ColorDialog.start -dd szVersion_ColorDialog, 0x00010001 - -dd 0,0 -;----------------------------------------------------------------------------- -sz_init db 'lib_init',0 -sz_version db 'version',0 - -sz_OpenDialog_init db 'OpenDialog_init',0 -sz_OpenDialog_start db 'OpenDialog_start',0 -sz_OpenDialog_set_file_name db 'OpenDialog_set_file_name',0 -sz_OpenDialog_set_file_ext db 'OpenDialog_set_file_ext',0 -szVersion_OpenDialog db 'Version_OpenDialog',0 - -sz_ColorDialog_init db 'ColorDialog_init',0 -sz_ColorDialog_start db 'ColorDialog_start',0 -szVersion_ColorDialog db 'Version_ColorDialog',0 -;----------------------------------------------------------------------------- +; SPDX-License-Identifier: NOASSERTION +; + +;***************************************************************************** +; Proc_Lib - library for common procedures +; +; Authors: +; Marat Zakiyanov aka Mario79, aka Mario +;***************************************************************************** + +format MS COFF + +public EXPORTS + +section '.flat' code readable align 16 +include '../../../macros.inc' +;include '../../../proc32.inc' +include '../../../KOSfuncs.inc' +include 'opendial.mac' +include 'colrdial.mac' +;include 'debug.inc' +;----------------------------------------------------------------------------- + +;-------------------------------------------------- +; Open Dialog +;-------------------------------------------------- +align 16 +use_OpenDialog + +;-------------------------------------------------- +; Color Dialog +;-------------------------------------------------- +align 16 +use_ColorDialog + +;-------------------------------------------------- +align 16 +lib_init: + xor eax, eax + ret + +;-------------------------------------------------- +align 16 +EXPORTS: + + +dd sz_init, lib_init +dd sz_version, 0x00000001 + +dd sz_OpenDialog_init, OpenDialog.init +dd sz_OpenDialog_start, OpenDialog.start +dd sz_OpenDialog_set_file_name, OpenDialog.set_file_name +dd sz_OpenDialog_set_file_ext, OpenDialog.set_file_ext +dd szVersion_OpenDialog, 0x00010001 + +dd sz_ColorDialog_init, ColorDialog.init +dd sz_ColorDialog_start, ColorDialog.start +dd szVersion_ColorDialog, 0x00010001 + +dd 0,0 +;----------------------------------------------------------------------------- +sz_init db 'lib_init',0 +sz_version db 'version',0 + +sz_OpenDialog_init db 'OpenDialog_init',0 +sz_OpenDialog_start db 'OpenDialog_start',0 +sz_OpenDialog_set_file_name db 'OpenDialog_set_file_name',0 +sz_OpenDialog_set_file_ext db 'OpenDialog_set_file_ext',0 +szVersion_OpenDialog db 'Version_OpenDialog',0 + +sz_ColorDialog_init db 'ColorDialog_init',0 +sz_ColorDialog_start db 'ColorDialog_start',0 +szVersion_ColorDialog db 'Version_ColorDialog',0 +;----------------------------------------------------------------------------- diff --git a/programs/develop/libraries/proc_lib/trunk/run.bat b/programs/develop/libraries/proc_lib/run.bat similarity index 100% rename from programs/develop/libraries/proc_lib/trunk/run.bat rename to programs/develop/libraries/proc_lib/run.bat diff --git a/programs/develop/libraries/truetype/trunk/compile.bat b/programs/develop/libraries/truetype/compile.bat similarity index 100% rename from programs/develop/libraries/truetype/trunk/compile.bat rename to programs/develop/libraries/truetype/compile.bat diff --git a/programs/develop/libraries/truetype/trunk/glue.h b/programs/develop/libraries/truetype/glue.h similarity index 100% rename from programs/develop/libraries/truetype/trunk/glue.h rename to programs/develop/libraries/truetype/glue.h diff --git a/programs/develop/libraries/truetype/trunk/history.txt b/programs/develop/libraries/truetype/history.txt similarity index 100% rename from programs/develop/libraries/truetype/trunk/history.txt rename to programs/develop/libraries/truetype/history.txt diff --git a/programs/develop/libraries/truetype/trunk/stb_truetype.h b/programs/develop/libraries/truetype/stb_truetype.h similarity index 100% rename from programs/develop/libraries/truetype/trunk/stb_truetype.h rename to programs/develop/libraries/truetype/stb_truetype.h diff --git a/programs/develop/libraries/truetype/trunk/truetype.c b/programs/develop/libraries/truetype/truetype.c similarity index 100% rename from programs/develop/libraries/truetype/trunk/truetype.c rename to programs/develop/libraries/truetype/truetype.c diff --git a/programs/develop/libraries/utils/trunk/Tupfile.lua b/programs/develop/libraries/utils/Tupfile.lua similarity index 100% rename from programs/develop/libraries/utils/trunk/Tupfile.lua rename to programs/develop/libraries/utils/Tupfile.lua diff --git a/programs/develop/libraries/utils/trunk/_atof.inc b/programs/develop/libraries/utils/_atof.inc similarity index 100% rename from programs/develop/libraries/utils/trunk/_atof.inc rename to programs/develop/libraries/utils/_atof.inc diff --git a/programs/develop/libraries/utils/trunk/_ftoa.inc b/programs/develop/libraries/utils/_ftoa.inc similarity index 100% rename from programs/develop/libraries/utils/trunk/_ftoa.inc rename to programs/develop/libraries/utils/_ftoa.inc diff --git a/programs/develop/libraries/utils/trunk/_rand.inc b/programs/develop/libraries/utils/_rand.inc similarity index 100% rename from programs/develop/libraries/utils/trunk/_rand.inc rename to programs/develop/libraries/utils/_rand.inc diff --git a/programs/develop/libraries/utils/trunk/build.bat b/programs/develop/libraries/utils/build.bat similarity index 100% rename from programs/develop/libraries/utils/trunk/build.bat rename to programs/develop/libraries/utils/build.bat diff --git a/programs/develop/libraries/utils/trunk/example/demo.asm b/programs/develop/libraries/utils/example/demo.asm similarity index 100% rename from programs/develop/libraries/utils/trunk/example/demo.asm rename to programs/develop/libraries/utils/example/demo.asm diff --git a/programs/develop/libraries/utils/trunk/utils.asm b/programs/develop/libraries/utils/utils.asm similarity index 96% rename from programs/develop/libraries/utils/trunk/utils.asm rename to programs/develop/libraries/utils/utils.asm index 831392c57..bd9068e9f 100644 --- a/programs/develop/libraries/utils/trunk/utils.asm +++ b/programs/develop/libraries/utils/utils.asm @@ -1,64 +1,66 @@ -;-----------------------------------------------------------------------------+ -; Library "utils" (c) Sergei Steshin (Akyltist) | -;-----------------------------------------------------------------------------+ -; Charset:DOS-866 Font:Courier New Size:9pt | -; compiler: FASM 1.69.31 | -; version: 0.1.0 | -; last update: 31/03/2014 | -; e-mail: dr.steshin@gmail.com | -; license: BSD | -;-----------------------------------------------------------------------------+ - -format MS COFF - -public EXPORTS - -section '.flat' code readable writable align 16 - -include '../../../../proc32.inc' -include '_ftoa.inc' -include '_atof.inc' -include '_rand.inc' - - -;-----------------------------------------------------------------------------+ -; float to ascii string | -;-----------------------------------------------------------------------------+ -ftoa: ; - mov ebx, dword [esp+4] ; out string - mov eax, dword [esp+8] ; in value - stdcall FloatToString,eax,ebx ; - ret 8 ; - - -;-----------------------------------------------------------------------------+ -; ascii string to float | -;-----------------------------------------------------------------------------+ -atof: ; - mov ebx, dword [esp+4] ; out <- value - mov eax, dword [esp+8] ; in -> string - stdcall string2float,eax,ebx ; - ret 8 ; - - -;-----------------------------------------------------------------------------+ -; returns a random integer in the range [ 0...99999 ] | -;-----------------------------------------------------------------------------+ -random: ; - call _random ; out <- eax random - ret ; - -;=============================================================================; -align 16 -EXPORTS: - dd szFtoa , ftoa - dd szAtof , atof - dd szRandom , random - dd 0 , 0 - - szFtoa db 'ftoa' ,0 - szAtof db 'atof' ,0 - szRandom db 'random' ,0 - -section '.data' data readable writable align 16 - +; SPDX-License-Identifier: NOASSERTION +; + +;-----------------------------------------------------------------------------+ +; Library "utils" (c) Sergei Steshin (Akyltist) | +;-----------------------------------------------------------------------------+ +; Charset:DOS-866 Font:Courier New Size:9pt | +; compiler: FASM 1.69.31 | +; version: 0.1.0 | +; last update: 31/03/2014 | +; e-mail: dr.steshin@gmail.com | +; license: BSD | +;-----------------------------------------------------------------------------+ + +format MS COFF + +public EXPORTS + +section '.flat' code readable writable align 16 + +include '../../../proc32.inc' +include '_ftoa.inc' +include '_atof.inc' +include '_rand.inc' + + +;-----------------------------------------------------------------------------+ +; float to ascii string | +;-----------------------------------------------------------------------------+ +ftoa: ; + mov ebx, dword [esp+4] ; out string + mov eax, dword [esp+8] ; in value + stdcall FloatToString,eax,ebx ; + ret 8 ; + + +;-----------------------------------------------------------------------------+ +; ascii string to float | +;-----------------------------------------------------------------------------+ +atof: ; + mov ebx, dword [esp+4] ; out <- value + mov eax, dword [esp+8] ; in -> string + stdcall string2float,eax,ebx ; + ret 8 ; + + +;-----------------------------------------------------------------------------+ +; returns a random integer in the range [ 0...99999 ] | +;-----------------------------------------------------------------------------+ +random: ; + call _random ; out <- eax random + ret ; + +;=============================================================================; +align 16 +EXPORTS: + dd szFtoa , ftoa + dd szAtof , atof + dd szRandom , random + dd 0 , 0 + + szFtoa db 'ftoa' ,0 + szAtof db 'atof' ,0 + szRandom db 'random' ,0 + +section '.data' data readable writable align 16 diff --git a/programs/develop/libraries/vector/trunk/example_logo.asm b/programs/develop/libraries/vector/example_logo.asm similarity index 100% rename from programs/develop/libraries/vector/trunk/example_logo.asm rename to programs/develop/libraries/vector/example_logo.asm diff --git a/programs/develop/libraries/vector/trunk/vectors.asm b/programs/develop/libraries/vector/vectors.asm similarity index 100% rename from programs/develop/libraries/vector/trunk/vectors.asm rename to programs/develop/libraries/vector/vectors.asm diff --git a/programs/system/kobra/Makefile b/programs/system/kobra/Makefile index f6a9e4e83..4b1f34578 100644 --- a/programs/system/kobra/Makefile +++ b/programs/system/kobra/Makefile @@ -1,6 +1,6 @@ -ROOT=../../develop/libraries/framework/trunk +ROOT=../../develop/libraries/framework -include ../../develop/libraries/framework/trunk/config.mk +include ../../develop/libraries/framework/config.mk # Note that kobra_st.o MUST be first and kobra.o last. OBJECTS=kobra_st.o $(ROOT)/stdlib/heap.o $(ROOT)/stdlib/malloc.o $(ROOT)/stdlib/stdlib.o $(ROOT)/kolibri/kolibri.o $(ROOT)/libIPC/ipc.o kobra.o