Subversion Repositories Kolibri OS

Rev

Rev 6175 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. use32
  2.         org 0x0
  3.         db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
  4.         dd 1,start,i_end,mem,stacktop,0,sys_path
  5.  
  6. include '../../../../programs/macros.inc'
  7. include '../../../../programs/proc32.inc'
  8. include '../../../../programs/KOSfuncs.inc'
  9. include '../../../../programs/load_img.inc'
  10. include '../trunk/str.inc'
  11.  
  12. vox_offs_tree_table equ 4
  13. vox_offs_data equ 12
  14. txt_buf rb 8
  15. include '../trunk/vox_rotate.inc'
  16.  
  17. @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
  18. caption db 'Voxel creator 19.02.16',0 ;подпись окна
  19.  
  20. BUF_STRUCT_SIZE equ 21
  21. buf2d_data equ dword[edi] ;данные буфера изображения
  22. buf2d_w equ dword[edi+8] ;ширина буфера
  23. buf2d_h equ dword[edi+12] ;высота буфера
  24. buf2d_l equ word[edi+4]
  25. buf2d_t equ word[edi+6] ;отступ сверху
  26. buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
  27. buf2d_color equ dword[edi+16] ;цвет фона буфера
  28. buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
  29.  
  30. vox_offs_tree_table equ 4
  31. vox_offs_data equ 12
  32.  
  33. run_file_70 FileInfoBlock
  34. vox_obj_size dd 0 ;размер воксельного объекта (для ускорения вставки)
  35. txt_space db ' ',0
  36. txt_pref db ' б ',0,' Кб',0,' Мб',0,' Гб',0 ;приставки: кило, мега, гига
  37. txt_f_size: db 'Размер: '
  38. .size: rb 16
  39.  
  40. fn_toolbar db 'toolbar.png',0
  41. IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
  42. image_data_toolbar dd 0
  43.  
  44. max_open_file_size equ 1024*1024 ;1 Mb
  45.  
  46. align 4
  47. start:
  48.         load_libraries l_libs_start,l_libs_end
  49.         ;проверка на сколько удачно загузилась библиотека
  50.         mov     ebp,lib_0
  51.         cmp     dword [ebp+ll_struc_size-4],0
  52.         jz      @f
  53.                 mcall SF_TERMINATE_PROCESS
  54.         @@:
  55.         mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
  56.         mcall SF_SET_EVENTS_MASK,0x27
  57.         stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
  58.  
  59.         stdcall [buf2d_create], buf_0 ;создание буфера
  60.         stdcall [buf2d_create], buf_0z
  61.         stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z
  62.  
  63.         load_image_file fn_toolbar, image_data_toolbar
  64.  
  65.         stdcall mem.Alloc,max_open_file_size
  66.         mov dword[open_file_vox],eax
  67.         stdcall mem.Alloc,max_open_file_size
  68.         mov dword[open_file_img],eax
  69.  
  70.         mcall SF_SYSTEM_GET,SSF_TIME_COUNT
  71.         mov [last_time],eax
  72.  
  73. align 4
  74. red_win:
  75.         call draw_window
  76.  
  77. align 4
  78. still:
  79.         mcall SF_SYSTEM_GET,SSF_TIME_COUNT
  80.         mov ebx,[last_time]
  81.         add ebx,10 ;задержка
  82.         cmp ebx,eax
  83.         jge @f
  84.                 mov ebx,eax
  85.         @@:
  86.         sub ebx,eax
  87.         mcall SF_WAIT_EVENT_TIMEOUT
  88.         cmp eax,0
  89.         je timer_funct
  90.  
  91.         cmp al,1
  92.         jz red_win
  93.         cmp al,2
  94.         jz key
  95.         cmp al,3
  96.         jz button
  97.  
  98.         jmp still
  99.  
  100. align 4
  101. timer_funct:
  102.         cmp byte[calc],0
  103.         je still
  104.  
  105.         pushad
  106.         mcall SF_SYSTEM_GET,SSF_TIME_COUNT
  107.         mov [last_time],eax
  108.  
  109.         ; скидываем указатели буферов buf_npl_p, buf_npl, buf_npl_n
  110.         mov edi,buf_npl_p
  111.         mov eax,buf2d_data
  112.         mov edi,buf_npl
  113.         mov ebx,buf2d_data
  114.         mov edi,buf_npl_n
  115.         mov ecx,buf2d_data
  116.         ; change buffer data pointers
  117.         mov buf2d_data,eax
  118.         mov edi,buf_npl_p
  119.         mov buf2d_data,ebx
  120.         mov edi,buf_npl
  121.         mov buf2d_data,ecx
  122.  
  123.         mov eax,[n_plane]
  124.         mov ebx,buf2d_w
  125.         dec ebx
  126.  
  127.         cmp ebx,eax
  128.         jg @f
  129.                 stdcall create_obj_from_plane,buf_npl,eax ;создаем завершающее сечение
  130.                 ;вывод конечного результата
  131.                 call draw_object
  132.                 mov byte[calc],0
  133.                 jmp .end_f
  134.         @@:
  135.  
  136.         inc eax
  137.         stdcall create_plane, buf_npl_n,eax
  138.  
  139.         ; создание воскельного сечения на основе буфера buf_npl
  140.         mov edi,buf_npl
  141.         mov edx,[bby_min] ;0
  142.         .cycle_0:
  143.         mov ecx,[btx_min] ;0
  144.         .cycle_1:
  145.                 stdcall [buf2d_get_pixel], edi,ecx,edx
  146.                 cmp eax,buf2d_color
  147.                 je @f
  148.                         mov esi,eax
  149.                         call need_node
  150.                         cmp eax,buf2d_color
  151.                         jne @f ;отсеиваем внутренние воксели, для оптимизации модели
  152.                         mov eax,ebx
  153.                         sub eax,edx
  154.                         stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\
  155.                                 eax,[k_scale],esi
  156.                 @@:
  157.                 inc ecx
  158.                 cmp ecx,ebx
  159.                 jle .cycle_1
  160.                 inc edx
  161.                 cmp edx,ebx
  162.                 jle .cycle_0
  163.  
  164.         stdcall [buf2d_draw], buf_npl
  165.         inc dword[n_plane] ;перемещаем плоскость сечения
  166.         call draw_pok
  167.         .end_f:
  168.         popad
  169.         jmp still
  170.  
  171. align 4
  172. proc create_plane, buf_img:dword, n_plane:dword
  173.         pushad
  174.         ; копируем лицевое изображение в буфер buf_img
  175.         ; bby_min - используем для оптимизации (если сверху изображение пустое)
  176.         mov eax,[bby_min]
  177.         mov esi,buf_i2
  178.         mov esi,[esi] ;buf2d_data
  179.         mov edi,[buf_img]
  180.         mov ecx,buf2d_w
  181.         imul eax,ecx
  182.         mov ebx,ecx
  183.         imul ecx,ebx
  184.         sub ecx,eax
  185.         lea ecx,[ecx+ecx*2]
  186.         mov edi,buf2d_data
  187.         lea eax,[eax+eax*2]
  188.         add edi,eax
  189.         add esi,eax
  190.         cld
  191.         rep movsb
  192.  
  193.         mov ecx,ebx
  194.         dec ebx
  195.         mov edi,buf_i0
  196.         .cycle_0:
  197.                 mov eax,ebx
  198.                 sub eax,[n_plane] ;eax - перевернутая координата n_plane
  199.                 stdcall [buf2d_get_pixel], edi,ecx,eax ;[n_plane]
  200.                 cmp eax,buf2d_color
  201.                 jne @f
  202.                         ;вычеркивание вертикальной линии из сечения buf_img
  203.                         stdcall [buf2d_line], [buf_img],ecx,[bby_min],ecx,ebx, buf2d_color
  204.                         jmp .end_1
  205.                 @@:
  206.                         mov edx,[bby_min] ;xor edx,edx
  207.                         mov esi,eax
  208.                         .cycle_1: ;цикл для наложения верхней текстуры
  209.                         stdcall [buf2d_get_pixel], [buf_img],ecx,edx
  210.                         cmp eax, buf2d_color
  211.                         je .end_0
  212.                                 stdcall [buf2d_set_pixel], [buf_img],ecx,edx, esi ;наложение верхней текстуры
  213.                                 jmp .end_1
  214.                         .end_0:
  215.                         inc edx
  216.                         cmp edx,ebx
  217.                         jle .cycle_1
  218.                 .end_1:
  219.                 loop .cycle_0
  220.  
  221.         ;горизонтальные линии на основе боковой грани
  222.         mov ecx,[bby_min]
  223.         mov edi,buf_i1
  224.         .cycle_2:
  225.                 stdcall [buf2d_get_pixel], edi,[n_plane],ecx
  226.                 cmp eax,buf2d_color
  227.                 jne @f
  228.                         ;вычеркивание горизонтальной линии из сечения buf_img
  229.                         stdcall [buf2d_line], [buf_img],[btx_min],ecx,[btx_max],ecx, buf2d_color
  230.                         jmp .end_3
  231.                 @@:
  232.                         mov edx,[btx_max] ;ebx
  233.                         mov esi,eax
  234.                         .cycle_3: ;цикл для наложения боковой текстуры
  235.                         stdcall [buf2d_get_pixel], [buf_img],edx,ecx
  236.                         cmp eax, buf2d_color
  237.                         je .end_2
  238.                                 stdcall [buf2d_set_pixel], [buf_img],edx,ecx, esi ;наложение боковой текстуры
  239.                                 jmp .end_3
  240.                         .end_2:
  241.                         dec edx
  242.                         cmp edx,[btx_min]
  243.                         jge .cycle_3
  244.                 .end_3:
  245.                 inc ecx
  246.                 cmp ecx,ebx
  247.                 jle .cycle_2
  248.         popad
  249.         ret
  250. endp
  251.  
  252. align 4
  253. proc create_obj_from_plane, buf_img:dword, n_plane:dword
  254. pushad
  255.         ; создание воскельного сечения на основе буфера buf_img
  256.         mov edi,[buf_img]
  257.         mov ebx,buf2d_w
  258.         dec ebx
  259.         mov edx,[bby_min] ;0
  260.         .cycle_0:
  261.         mov ecx,[btx_min] ;0
  262.         .cycle_1:
  263.                 stdcall [buf2d_get_pixel], edi,ecx,edx
  264.                 cmp eax,buf2d_color
  265.                 je @f
  266.                         mov esi,eax
  267.                         ;call need_node
  268.                         ;cmp eax,buf2d_color
  269.                         ;jne @f ;отсеиваем внутренние воксели, для оптимизации модели
  270.                         mov eax,ebx
  271.                         sub eax,edx
  272.                         stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\
  273.                                 eax,[k_scale],esi
  274.                 @@:
  275.                 inc ecx
  276.                 cmp ecx,ebx
  277.                 jle .cycle_1
  278.                 inc edx
  279.                 cmp edx,ebx
  280.                 jle .cycle_0
  281.         ret
  282. popad
  283. endp
  284.  
  285. ;description:
  286. ; функция проверяет нужно ли отсеивать воксель с координатами [n_plane],ecx,edx
  287. ;input:
  288. ; ebx = max size y - 1
  289. ;output:
  290. ; eax = buf2d_color if node need
  291. align 4
  292. need_node:
  293.         mov eax,buf2d_color
  294.         cmp ecx,[btx_min] ;0
  295.         jle .end_f
  296.         cmp ecx,[btx_max] ;0
  297.         jge .end_f
  298.         cmp edx,[bby_min] ;0
  299.         jle .end_f
  300.         cmp edx,ebx ;max-1
  301.         jge .end_f
  302.                 push ecx edx
  303.                 stdcall [buf2d_get_pixel], buf_npl_p,ecx,edx ;проверка предыдущего сечения
  304.                 cmp eax,buf2d_color
  305.                 je @f
  306.                 stdcall [buf2d_get_pixel], buf_npl_n,ecx,edx ;проверка последующего сечения
  307.                 cmp eax,buf2d_color
  308.                 je @f
  309.                 dec ecx
  310.                 stdcall [buf2d_get_pixel], edi,ecx,edx
  311.                 cmp eax,buf2d_color
  312.                 je @f
  313.                 add ecx,2
  314.                 stdcall [buf2d_get_pixel], edi,ecx,edx
  315.                 cmp eax,buf2d_color
  316.                 je @f
  317.                 dec ecx
  318.                 dec edx
  319.                 stdcall [buf2d_get_pixel], edi,ecx,edx
  320.                 cmp eax,buf2d_color
  321.                 je @f
  322.                 add edx,2
  323.                 stdcall [buf2d_get_pixel], edi,ecx,edx
  324.                 ;cmp eax,buf2d_color
  325.                 ;je @f
  326.                 @@:
  327.                 pop edx ecx
  328.         .end_f:
  329.         ret
  330.  
  331. align 4
  332. draw_window:
  333. pushad
  334.         mcall SF_REDRAW,SSF_BEGIN_DRAW
  335.  
  336.         ; *** рисование главного окна (выполняется 1 раз при запуске) ***
  337.         mov edx,[sc.work]
  338.         or  edx,(3 shl 24)+0x30000000
  339.         mcall SF_CREATE_WINDOW,(20 shl 16)+410,(20 shl 16)+520,,,caption
  340.  
  341.         ; *** создание кнопок на панель ***
  342.         mov esi,[sc.work_button]
  343.         mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3
  344.  
  345.         mov ebx,(30 shl 16)+20
  346.         mov edx,4
  347.         int 0x40
  348.  
  349.         mov ebx,(55 shl 16)+20
  350.         mov edx,5
  351.         int 0x40
  352.  
  353.         mov ebx,(85 shl 16)+20
  354.         mov edx,6
  355.         int 0x40
  356.  
  357.         add ebx,25 shl 16
  358.         mov edx,7
  359.         int 0x40
  360.  
  361.         add ebx,25 shl 16
  362.         mov edx,8
  363.         int 0x40
  364.  
  365.         add ebx,25 shl 16
  366.         mov edx,9
  367.         int 0x40
  368.  
  369.         add ebx,25 shl 16
  370.         mov edx,10
  371.         int 0x40
  372.  
  373.         add ebx,25 shl 16
  374.         mov edx,11
  375.         int 0x40
  376.  
  377.         add ebx,25 shl 16
  378.         mov edx,12
  379.         int 0x40
  380.  
  381.         ; *** рисование иконок на кнопках ***
  382.         mov edx,(7 shl 16)+7 ;icon new
  383.         mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16
  384.  
  385.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  386.         add edx,(25 shl 16) ;icon open
  387.         int 0x40
  388.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  389.         add edx,(25 shl 16) ;icon save
  390.         int 0x40
  391.  
  392.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  393.         add edx,(30 shl 16) ;
  394.         int 0x40
  395.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  396.         add edx,(25 shl 16) ;
  397.         int 0x40
  398.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  399.         add edx,(25 shl 16) ;
  400.         int 0x40
  401.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  402.         add edx,(25 shl 16) ;
  403.         int 0x40
  404.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  405.         add edx,(25 shl 16) ;
  406.         int 0x40
  407.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  408.         add edx,(25 shl 16) ;
  409.         int 0x40
  410.         add ebx,IMAGE_TOOLBAR_ICON_SIZE
  411.         add edx,(25 shl 16) ;
  412.         int 0x40
  413.  
  414.         call draw_buffers
  415.         call draw_pok
  416.  
  417.         mcall SF_REDRAW,SSF_END_DRAW
  418. popad
  419.         ret
  420.  
  421. align 4
  422. draw_buffers:
  423.         ; *** рисование буфера ***
  424.         stdcall [buf2d_draw], buf_0
  425.         stdcall [buf2d_draw], buf_i0
  426.         stdcall [buf2d_draw], buf_i1
  427.         stdcall [buf2d_draw], buf_i2
  428.         ret
  429.  
  430. align 4
  431. draw_pok:
  432.         ;обновление подписи размера файла
  433.         mov edi,txt_f_size.size
  434.         mov eax,dword[vox_obj_size]
  435.         mov ebx,txt_pref
  436.         .cycle:
  437.                 cmp eax,1024
  438.                 jl @f
  439.                 shr eax,10
  440.                 add ebx,4
  441.                 jmp .cycle
  442.         @@:
  443.  
  444.         stdcall convert_int_to_str, 16
  445.         stdcall str_cat, edi,ebx
  446.         stdcall str_cat, edi,txt_space ;завершающий пробел
  447.  
  448.         ;рисование текста
  449.         mov ecx,[sc.work_text]
  450.         or  ecx,0x80000000 or (1 shl 30)
  451.         mov edi,[sc.work] ;цвет фона окна
  452.         mcall SF_DRAW_TEXT,(275 shl 16)+7,,txt_f_size
  453.  
  454.         ret
  455.  
  456. align 4
  457. key:
  458.         mcall SF_GET_KEY
  459.         jmp still
  460.  
  461.  
  462. align 4
  463. button:
  464.         mcall SF_GET_BUTTON
  465.         cmp ah,3
  466.         jne @f
  467.                 call but_new_file
  468.         @@:
  469.         cmp ah,4
  470.         jne @f
  471.                 call but_open_file
  472.         @@:
  473.         cmp ah,5
  474.         jne @f
  475.                 call but_save_file
  476.         @@:
  477.         cmp ah,6
  478.         jne @f
  479.                 call but_1
  480.         @@:
  481.         cmp ah,7
  482.         jne @f
  483.                 call but_2
  484.         @@:
  485.         cmp ah,8
  486.         jne @f
  487.                 call but_3
  488.         @@:
  489.         cmp ah,9
  490.         jne @f
  491.                 stdcall but_run, 0
  492.         @@:
  493.         cmp ah,10
  494.         jne @f
  495.                 stdcall but_run, 1
  496.         @@:
  497.         cmp ah,11
  498.         jne @f
  499.                 call but_5
  500.         @@:
  501.         cmp ah,12
  502.         jne @f
  503.                 call but_rot_z
  504.         @@:
  505.         cmp ah,1
  506.         jne still
  507. .exit:
  508.         stdcall [buf2d_delete],buf_0
  509.         stdcall [buf2d_delete],buf_0z
  510.         stdcall [buf2d_vox_brush_delete],buf_vox
  511.         stdcall [buf2d_delete],buf_i0
  512.         stdcall [buf2d_delete],buf_i1
  513.         stdcall [buf2d_delete],buf_i2
  514.         stdcall [buf2d_delete],buf_npl_p
  515.         stdcall [buf2d_delete],buf_npl
  516.         stdcall [buf2d_delete],buf_npl_n
  517.         stdcall mem.Free,[image_data_toolbar]
  518.         stdcall mem.Free,[open_file_vox]
  519.         stdcall mem.Free,[open_file_img]
  520.         mcall SF_TERMINATE_PROCESS
  521.  
  522.  
  523. align 4
  524. vox_new_data:
  525.         db 2,0,0,0
  526.         db 000b,001b,010b,011b, 100b,101b,110b,111b ;default table
  527.         dd 0 ;null node
  528.  
  529. align 4
  530. proc but_new_file uses ecx edi esi
  531.         mov ecx,vox_offs_data+4
  532.         mov [vox_obj_size],ecx
  533.         mov esi,vox_new_data
  534.         mov edi,[open_file_vox]
  535.         cld
  536.         rep movsb
  537.         ret
  538. endp
  539.  
  540. align 4
  541. open_file_vox dd 0 ;указатель на память для открытия файлов
  542. open_file_img dd 0 ;указатель на память для открытия текстур
  543.  
  544. align 4
  545. but_open_file:
  546.         pushad
  547.         copy_path open_dialog_name,communication_area_default_path,file_name,0
  548.         mov [OpenDialog_data.type],0
  549.         stdcall [OpenDialog_Start],OpenDialog_data
  550.         cmp [OpenDialog_data.status],2
  551.         je .end_open_file
  552.         ;код при удачном открытии диалога
  553.  
  554.         mov [run_file_70.Function], SSF_READ_FILE
  555.         mov [run_file_70.Position], 0
  556.         mov [run_file_70.Flags], 0
  557.         mov [run_file_70.Count], dword max_open_file_size
  558.         m2m [run_file_70.Buffer],dword[open_file_vox]
  559.         mov byte[run_file_70+20], 0
  560.         mov dword[run_file_70.FileName], openfile_path
  561.         mcall SF_FILE,run_file_70
  562.         cmp ebx,0xffffffff
  563.         je .end_open_file
  564.                 ; проверка на правильность воксельного формата
  565.                 mov edi,[open_file_vox]
  566.                 add edi,vox_offs_tree_table
  567.                 xor bx,bx
  568.                 mov ecx,8
  569.                 cld
  570.                 @@:
  571.                         movzx ax,byte[edi]
  572.                         add bx,ax
  573.                         inc edi
  574.                         loop @b
  575.                 cmp bx,28 ;28=0+1+2+...+7
  576.                 jne .err_open
  577.  
  578.                 mcall SF_SET_CAPTION,1,openfile_path
  579.                 stdcall buf2d_vox_obj_get_size,[open_file_vox]
  580.                 mov [vox_obj_size],eax
  581.                 call draw_object
  582.                
  583.                 jmp .end_open_file
  584.         .err_open:
  585.                 call but_new_file
  586.                 stdcall [mb_create],msgbox_4,thread
  587.         .end_open_file:
  588.         popad
  589.         ret
  590.  
  591. align 4
  592. but_save_file:
  593.         pushad
  594.                 copy_path open_dialog_name,communication_area_default_path,file_name,0
  595.                 mov [OpenDialog_data.type],1
  596.                 stdcall [OpenDialog_Start],OpenDialog_data
  597.                 cmp [OpenDialog_data.status],2
  598.                 je .end_save_file
  599.                 ;код при удачном открытии диалога
  600.  
  601.                 mov eax,6 ;dword[v_zoom] ;задаем масштаб по умолчанию
  602.                 mov ebx,[open_file_vox]
  603.                 mov byte[ebx],al
  604.  
  605.                 stdcall buf2d_vox_obj_get_size, ebx
  606.                 mov dword[run_file_70.Count], eax ;размер файла
  607.                 mov [run_file_70.Function], SSF_CREATE_FILE
  608.                 mov [run_file_70.Position], 0
  609.                 mov [run_file_70.Flags], 0
  610.                 mov ebx, dword[open_file_vox]
  611.                 mov [run_file_70.Buffer], ebx
  612.                 mov byte[run_file_70+20], 0
  613.                 mov dword[run_file_70.FileName], openfile_path
  614.                 mcall SF_FILE,run_file_70
  615.                 cmp ebx,0xffffffff
  616.                 je .end_save_file
  617.  
  618.                 .end_save_file:
  619.         popad
  620.         ret
  621.  
  622. align 4
  623. but_1:
  624.         stdcall open_image_in_buf, buf_i0
  625.         ret
  626.  
  627. align 4
  628. but_2:
  629.         stdcall open_image_in_buf, buf_i1
  630.         call set_buf_tabs
  631.         ret
  632.  
  633. align 4
  634. but_3:
  635.         stdcall open_image_in_buf, buf_i2
  636.         call set_buf_tabs
  637.         ret
  638.  
  639. ;description:
  640. ; в зависимости от ширины 1-го буфера устанавливаем отступы для 2-го и 3-го буферов
  641. align 4
  642. set_buf_tabs:
  643. push eax ebx edi
  644.         mov edi,buf_i0
  645.         cmp buf2d_data,0
  646.         je @f
  647.                 movzx eax,buf2d_l
  648.                 mov ebx,buf2d_w
  649.                 cmp ebx,128
  650.                 jle .end_0
  651.                         mov ebx,128
  652.                 .end_0:
  653.                 mov edi,buf_i1
  654.                 mov buf2d_l,ax
  655.                 add buf2d_l,bx
  656.                 add buf2d_l,2
  657.                 shl ebx,1
  658.                 mov edi,buf_i2
  659.                 mov buf2d_l,ax
  660.                 add buf2d_l,bx
  661.                 add buf2d_l,4
  662.         @@:    
  663. pop edi ebx eax
  664.         ret
  665.  
  666. align 4
  667. get_scale:
  668. push eax edi
  669.         mov edi,buf_i0
  670.         mov eax,buf2d_w
  671.  
  672.         mov dword[k_scale],-1
  673.         .cycle_s:
  674.         cmp eax,0
  675.         je @f
  676.                 shr eax,1
  677.                 inc dword[k_scale]
  678.                 jmp .cycle_s
  679.         @@:
  680. pop edi eax
  681.         ret
  682.  
  683. align 4
  684. proc set_borders uses eax ebx ecx edx edi
  685.         mov ecx,dword[k_scale]
  686.         mov edx,1
  687.         shl edx,cl
  688.  
  689.         ;определяем минимальную координату y на лицевой грани
  690.         mov edi,buf_i2
  691.         mov dword[bby_min],0
  692.         xor ecx,ecx
  693.         .cycle_0:
  694.         xor ebx,ebx
  695.         .cycle_1:
  696.                 stdcall [buf2d_get_pixel],edi,ebx,ecx
  697.                 cmp eax,buf2d_color
  698.                 jne @f
  699.                 inc ebx
  700.                 cmp ebx,edx
  701.                 jl .cycle_1
  702.                 inc dword[bby_min]
  703.                 inc ecx
  704.                 cmp ecx,edx
  705.                 jl .cycle_0
  706.         @@:
  707.  
  708.         ;определяем минимальную координату x на лицевой грани
  709.         mov dword[btx_min],0
  710.         xor ebx,ebx
  711.         .cycle_2:
  712.         mov ecx,[bby_min]
  713.         .cycle_3:
  714.                 stdcall [buf2d_get_pixel],edi,ebx,ecx
  715.                 cmp eax,buf2d_color
  716.                 jne @f
  717.                 inc ecx
  718.                 cmp ecx,edx
  719.                 jl .cycle_3
  720.                 inc dword[btx_min]
  721.                 inc ebx
  722.                 cmp ebx,edx
  723.                 jl .cycle_2
  724.         @@:
  725.  
  726.         ;определяем максимальную координату x на лицевой грани
  727.         mov [btx_max],edx
  728.         dec dword[btx_max]
  729.         mov ebx,[btx_max]
  730.         .cycle_4:
  731.         mov ecx,[bby_min]
  732.         .cycle_5:
  733.                 stdcall [buf2d_get_pixel],edi,ebx,ecx
  734.                 cmp eax,buf2d_color
  735.                 jne @f
  736.                 inc ecx
  737.                 cmp ecx,edx
  738.                 jl .cycle_5
  739.                 dec dword[btx_max]
  740.                 dec ebx
  741.                 cmp ebx,[btx_min]
  742.                 jg .cycle_4
  743.         @@:
  744.        
  745.         ;stdcall [buf2d_line], edi, 0,[bby_min],50,[bby_min],255
  746.         ret
  747. endp
  748.  
  749. align 4
  750. btx_min dd 0 ;буфер верхний мин. x
  751. btx_max dd 0
  752. bty_min dd 0 ;буфер верхний мин. y
  753. bty_max dd 0
  754. ;bbx_min dd 0
  755. ;bbx_max dd 0
  756. bby_min dd 0 ;буфер боковой мин. y
  757. bby_max dd 0
  758. k_scale dd 0
  759. n_plane dd 0
  760.  
  761. calc db 0
  762.  
  763. ; создание вокселя в 3 этапа:
  764. ; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем)
  765. ; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем)
  766. ; 3) меняем цвет вокселя
  767. align 4
  768. proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
  769. coord_z:dword,k_scale:dword,color:dword
  770. pushad
  771. locals
  772.         p_node dd 0 ;родительский узел
  773. endl
  774.  
  775.         mov edi,[v_obj]
  776.         add edi,vox_offs_data
  777.         mov esi,[k_scale]
  778.         cmp esi,1
  779.         jl .change
  780.         ; *** (1) ***
  781.         .found:
  782.         stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
  783.         movzx bx,byte[edi+3]
  784.         mov [p_node],edi
  785.         add edi,4
  786.  
  787.         cmp eax,0
  788.         je .end_1
  789.         mov ecx,eax
  790.         cld
  791.         @@: ;цикл для пропуска предыдущих поддеревьев в узле
  792.                 bt bx,0 ;проверяем есть ли дочерние узлы
  793.                 jnc .end_0
  794.                         xor eax,eax
  795.                         stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
  796.                 .end_0:
  797.                 shr bx,1
  798.                 loop @b
  799.         .end_1:
  800.         bt bx,0
  801.         jnc .creat ;если поддерева не существует, переходим к созданию
  802.         dec esi
  803.         cmp esi,0
  804.         jg .found
  805.         jmp .change
  806.  
  807.         ; *** (2) ***
  808.         .creat:
  809.         mov edx,[color] ;меняем цвет
  810.         and edx,0xffffff ;для профилактики
  811.         mov ecx,esi
  812.         stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов
  813.         mov ebx,[p_node]
  814.         cld
  815.         @@:
  816.                 mov dword[edi],edx
  817.                 stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
  818.                 or byte[ebx+3],al
  819.  
  820.                 mov ebx,edi
  821.                 add edi,4
  822.                 dec esi
  823.                 loop @b
  824.         jmp .end_2
  825.  
  826.         ; *** (3) ***
  827.         .change:
  828.         mov eax,[color] ;меняем цвет
  829.         mov word[edi],ax
  830.         shr eax,16
  831.         mov byte[edi+2],al
  832.  
  833.         .end_2:
  834. popad
  835.         ret
  836. endp
  837.  
  838. ; сдвигает узлы для добавления новых узлов
  839. ;input:
  840. ; p_insert - позиция для вставки
  841. ; count - колличество вставляемых узлов
  842. align 4
  843. proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
  844.         mov esi,[v_obj]
  845.         ;stdcall buf2d_vox_obj_get_size,esi
  846.         add esi,[vox_obj_size] ;esi - указатель на конец файла
  847.         mov edi,[count]
  848.         shl edi,2
  849.         add [vox_obj_size],edi
  850.         add edi,esi ;edi - указатель на будущий конец файла
  851.         mov ecx,esi
  852.         sub ecx,[p_insert]
  853.         shr ecx,2 ;ecx - число циклов для копирования
  854.         sub esi,4 ;esi - указатель на последний узел
  855.         sub edi,4 ;edi - указатель на будущий последний узел
  856.         std
  857.         rep movsd ;сдвигаем память
  858.         ret
  859. endp
  860.  
  861. ;???
  862. ; определение позиции узла в дереве (от 0 до 7)
  863. align 4
  864. proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
  865. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  866.         mov ecx,[k_scale]
  867.         dec ecx
  868.         mov eax,[coord_x]
  869.         mov ebx,[coord_y]
  870.         mov edi,[coord_z]
  871.         cmp ecx,1
  872.         jl .end_0
  873.                 shr eax,cl
  874.                 shr ebx,cl
  875.                 shr edi,cl
  876.         .end_0:
  877.         and eax,1
  878.         bt ebx,0
  879.         jnc @f
  880.                 bts eax,1
  881.         @@:
  882.         bt edi,0
  883.         jnc @f
  884.                 bts eax,2
  885.         @@:
  886.  
  887.         mov edi,[v_obj]
  888.         add edi,vox_offs_tree_table
  889.         @@:
  890.                 cmp al,byte[edi]
  891.                 je @f
  892.                 inc edi
  893.                 jmp @b
  894.         @@:
  895.         sub edi,[v_obj]
  896.         sub edi,vox_offs_tree_table
  897.         mov eax,edi
  898.        
  899.         ret
  900. endp
  901.  
  902. ;???
  903. ;input:
  904. ; edi - указатель на данные воксельного объекта
  905. ;output:
  906. ; eax - eax + число узлов в данных вокс. объекта
  907. ; edi - указатель на смещенные данные вокс. объекта
  908. align 4
  909. proc vox_obj_rec0
  910.         inc eax
  911.         cmp byte[edi+3],0 ;смотрим есть ли поддеревья
  912.         je .sub_trees
  913.  
  914.                 ;рекурсивный перебор поддеревьев
  915.                 push ebx ecx
  916.                 mov bh,byte[edi+3]
  917.                 add edi,4
  918.                 mov bl,8
  919.                 .cycle:
  920.                         bt bx,8 ;тестируем только bh
  921.                         jnc .c_next
  922.                                 stdcall vox_obj_rec0
  923.                         .c_next:
  924.                         shr bh,1
  925.                         dec bl
  926.                         jnz .cycle
  927.                 pop ecx ebx
  928.  
  929.                 jmp .end_f
  930.         .sub_trees:
  931.                 add edi,4
  932.         .end_f:
  933.         ret
  934. endp
  935.  
  936. ;output:
  937. ; eax - 1,2,4,8,16, ... ,128
  938. align 4
  939. proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
  940. coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
  941.         mov ecx,[k_scale]
  942.         dec ecx
  943.         mov eax,[coord_x]
  944.         mov ebx,[coord_y]
  945.         mov edi,[coord_z]
  946.         cmp ecx,1
  947.         jl .end_0
  948.                 shr eax,cl
  949.                 shr ebx,cl
  950.                 shr edi,cl
  951.         .end_0:
  952.         and eax,1
  953.         bt ebx,0
  954.         jnc @f
  955.                 bts eax,1
  956.         @@:
  957.         bt edi,0
  958.         jnc @f
  959.                 bts eax,2
  960.         @@:
  961.  
  962.         mov ecx,[v_obj]
  963.         add ecx,vox_offs_tree_table
  964.         @@:
  965.                 cmp al,byte[ecx]
  966.                 je @f
  967.                 inc ecx
  968.                 jmp @b
  969.         @@:
  970.         mov eax,1 ;устанавливаем первоначальное значение бита
  971.         sub ecx,[v_obj]
  972.         sub ecx,vox_offs_tree_table
  973.         jz @f
  974.                 shl eax,cl ;сдвигаем бит
  975.         @@:
  976.        
  977.         ret
  978. endp
  979.  
  980. ;
  981. ;output:
  982. ; eax - размер в байтах занимаемый объектом v_obj
  983. align 4
  984. proc buf2d_vox_obj_get_size uses edi, v_obj:dword
  985.         mov edi,[v_obj]
  986.         add edi,vox_offs_data
  987.         xor eax,eax
  988.         stdcall vox_obj_rec0 ;eax - число узлов в объекте v_obj
  989.         shl eax,2
  990.         add eax,vox_offs_data
  991.         ret
  992. endp
  993.  
  994. ;input:
  995. ; mode_add - если не равно 0 тогда создание в режиме добавления вокселей
  996. align 4
  997. proc but_run uses eax ebx edi, mode_add:dword
  998.         ; проверка размеров изображений (текстур)
  999.         mov edi,buf_i0
  1000.         mov ebx,buf2d_h
  1001.         cmp ebx,2
  1002.         jle .err_size_t
  1003.         cmp buf2d_w,ebx
  1004.         jne .err_size_t
  1005.         ;
  1006.         mov edi,buf_i1
  1007.         cmp ebx,buf2d_h
  1008.         jne .err_size_tb
  1009.         mov ebx,buf2d_h
  1010.         cmp ebx,2
  1011.         jle .err_size_b
  1012.         cmp buf2d_w,ebx
  1013.         jne .err_size_b
  1014.  
  1015.                 cmp dword[vox_obj_size],vox_offs_data
  1016.                 jl .n_file ;если раньше не было открытых файлов
  1017.                 cmp dword[mode_add],0
  1018.                 jne @f
  1019.                 .n_file:
  1020.                         call but_new_file
  1021.                 @@:
  1022.  
  1023.                 mov edi,buf_i0
  1024.                 mov eax,buf2d_w
  1025.                 mov edi,buf_npl
  1026.                 cmp buf2d_data,0
  1027.                 jne @f
  1028.                         ; *** создаем буфера
  1029.                         m2m buf2d_w,eax
  1030.                         m2m buf2d_h,eax
  1031.                         stdcall [buf2d_create],edi
  1032.                         mov edi,buf_npl_p
  1033.                         m2m buf2d_w,eax
  1034.                         m2m buf2d_h,eax
  1035.                         stdcall [buf2d_create],edi
  1036.                         mov edi,buf_npl_n
  1037.                         m2m buf2d_w,eax
  1038.                         m2m buf2d_h,eax
  1039.                         stdcall [buf2d_create],edi
  1040.                         jmp .end_0
  1041.                 @@:
  1042.                         ; *** изменяем размеры буферов
  1043.                         stdcall [buf2d_resize], edi, eax,eax,1
  1044.                         mov edi,buf_npl_p
  1045.                         stdcall [buf2d_resize], edi, eax,eax,1
  1046.                         mov edi,buf_npl_n
  1047.                         stdcall [buf2d_resize], edi, eax,eax,1
  1048.                 .end_0:
  1049.                 mov dword[n_plane],1
  1050.                 mov byte[calc],1
  1051.                 call get_scale
  1052.                 call set_borders
  1053.  
  1054.                 stdcall create_plane,buf_npl,0
  1055.                 stdcall create_plane,buf_npl_n,1
  1056.                 stdcall create_obj_from_plane,buf_npl,0 ;создаем начальное сечение
  1057.  
  1058.                 jmp @f
  1059.         .err_size_t:
  1060.                 stdcall [mb_create],msgbox_0,thread
  1061.                 jmp @f
  1062.         .err_size_b:
  1063.                 stdcall [mb_create],msgbox_1,thread
  1064.                 jmp @f
  1065.         .err_size_tb:
  1066.                 stdcall [mb_create],msgbox_3,thread
  1067.                 ;jmp @f
  1068.         @@:
  1069.         ret
  1070. endp
  1071.  
  1072. align 4
  1073. but_5:
  1074.         cmp byte[calc],0
  1075.         je @f
  1076.                 call draw_object
  1077.                 mov byte[calc],0
  1078.         @@:
  1079.         ret
  1080.  
  1081. align 4
  1082. but_rot_z:
  1083.         stdcall vox_obj_rot_z, [open_file_vox]
  1084.         call draw_object
  1085.         ret
  1086.  
  1087. align 4
  1088. draw_object:
  1089.         ;вывод результата на экран
  1090.         stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
  1091.         stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер
  1092.         stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox,\
  1093.                 [open_file_vox], 0,0, 0, 6 ;[k_scale]
  1094.         stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
  1095.         ret
  1096.  
  1097. align 4
  1098. proc open_image_in_buf, buf:dword
  1099.         pushad
  1100.         copy_path open_dialog_name,communication_area_default_path,file_name,0
  1101.         mov [OpenDialog_data.type],0
  1102.         stdcall [OpenDialog_Start],OpenDialog_data
  1103.         cmp [OpenDialog_data.status],2
  1104.         je .end_open_file
  1105.  
  1106.         ;stdcall mem.Alloc, dword size ;выделяем память для изображения
  1107.         ;mov [buf],eax
  1108.  
  1109.         mov [run_file_70.Function], SSF_READ_FILE
  1110.         mov [run_file_70.Position], 0
  1111.         mov [run_file_70.Flags], 0
  1112.         mov [run_file_70.Count], dword max_open_file_size
  1113.         m2m [run_file_70.Buffer],dword[open_file_img]
  1114.         mov byte[run_file_70+20], 0
  1115.         mov [run_file_70.FileName], openfile_path
  1116.         mcall SF_FILE,run_file_70
  1117.         cmp ebx,0xffffffff
  1118.         je .end_0
  1119.                 ;определяем вид изображения
  1120.                 stdcall dword[img_decode], dword[open_file_img],ebx,0
  1121.                 or eax,eax
  1122.                 jz .end_0 ;если нарушен формат файла
  1123.                 mov ebx,eax
  1124.                 ;преобразуем изображение к формату rgb
  1125.                 stdcall dword[img_to_rgb2], ebx,dword[open_file_img]
  1126.  
  1127.                 mov edi,[buf]
  1128.                 cmp buf2d_data,0
  1129.                 jne @f
  1130.                         m2m buf2d_w,dword[ebx+4] ;+4 = image width
  1131.                         m2m buf2d_h,dword[ebx+8] ;+8 = image heihht
  1132.                         stdcall [buf2d_create_f_img], edi,[open_file_img]
  1133.                         jmp .end_1
  1134.                 @@:
  1135.                         mov ecx,dword[ebx+8]
  1136.                         stdcall [buf2d_resize], edi, [ebx+4],ecx,1 ;изменяем размеры буфера
  1137.                         imul ecx,[ebx+4]
  1138.                         lea ecx,[ecx+ecx*2]
  1139.                         mov edi,buf2d_data
  1140.                         mov esi,[open_file_img]
  1141.                         cld
  1142.                         rep movsb ;copy image
  1143.                 .end_1:
  1144.  
  1145.                 ;удаляем временный буфер в ebx
  1146.                 stdcall dword[img_destroy], ebx
  1147.         .end_0:
  1148.  
  1149.         call draw_buffers
  1150.         .end_open_file:
  1151.         popad
  1152.         ret
  1153. endp
  1154.  
  1155. msgbox_0:
  1156.         db 1,0
  1157.         db 'Внимание',0
  1158.         db 'Размер верхнего изображения не коректный',0
  1159.         db 'Закрыть',0
  1160.         db 0
  1161.  
  1162. msgbox_1:
  1163.         db 1,0
  1164.         db 'Внимание',0
  1165.         db 'Размер бокового изображения не коректный',0
  1166.         db 'Закрыть',0
  1167.         db 0
  1168.  
  1169. msgbox_2:
  1170.         db 1,0
  1171.         db 'Внимание',0
  1172.         db 'Размер переднего изображения не коректный',0
  1173.         db 'Закрыть',0
  1174.         db 0
  1175.  
  1176. msgbox_3:
  1177.         db 1,0
  1178.         db 'Внимание',0
  1179.         db 'Размеры верхнего и бокового изображений не совпадают',13,\
  1180.                 'Откройте изображения одинаковых размеров',0
  1181.         db 'Закрыть',0
  1182.         db 0
  1183.  
  1184. msgbox_4:
  1185.         db 1,0
  1186.         db 'Внимание',0
  1187.         db 'Открываемый файл содержит не воксельный формат',0
  1188.         db 'Закрыть',0
  1189.         db 0
  1190.  
  1191. ;данные для диалога открытия файлов
  1192. align 4
  1193. OpenDialog_data:
  1194. .type                   dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
  1195. .procinfo               dd procinfo     ;+4
  1196. .com_area_name          dd communication_area_name      ;+8
  1197. .com_area               dd 0    ;+12
  1198. .opendir_path           dd plugin_path  ;+16
  1199. .dir_default_path       dd default_dir ;+20
  1200. .start_path             dd file_name ;+24 путь к диалогу открытия файлов
  1201. .draw_window            dd draw_window  ;+28
  1202. .status                 dd 0    ;+32
  1203. .openfile_path          dd openfile_path        ;+36 путь к открываемому файлу
  1204. .filename_area          dd filename_area        ;+40
  1205. .filter_area            dd Filter
  1206. .x:
  1207. .x_size                 dw 420 ;+48 ; Window X size
  1208. .x_start                dw 10 ;+50 ; Window X position
  1209. .y:
  1210. .y_size                 dw 320 ;+52 ; Window y size
  1211. .y_start                dw 10 ;+54 ; Window Y position
  1212.  
  1213. default_dir db '/rd/1',0
  1214.  
  1215. communication_area_name:
  1216.         db 'FFFFFFFF_open_dialog',0
  1217. open_dialog_name:
  1218.         db 'opendial',0
  1219. communication_area_default_path:
  1220.         db '/rd/1/File managers/',0
  1221.  
  1222. Filter:
  1223. dd Filter.end - Filter ;.1
  1224. .1:
  1225. db 'PNG',0
  1226. db 'JPG',0
  1227. db 'JPEG',0
  1228. db 'BMP',0
  1229. db 'GIF',0
  1230. db 'VOX',0
  1231. .end:
  1232. db 0
  1233.  
  1234.  
  1235.  
  1236. head_f_i:
  1237. head_f_l db 'Системная ошибка',0
  1238.  
  1239. system_dir_0 db '/sys/lib/'
  1240. lib_name_0 db 'proc_lib.obj',0
  1241. err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
  1242. err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
  1243.  
  1244. system_dir_1 db '/sys/lib/'
  1245. lib_name_1 db 'libimg.obj',0
  1246. err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
  1247. err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
  1248.  
  1249. system_dir_2 db '/sys/lib/'
  1250. lib_name_2 db 'buf2d.obj',0
  1251. err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
  1252. err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
  1253.  
  1254. system_dir_3 db '/sys/lib/'
  1255. lib_name_3 db 'msgbox.obj',0
  1256. err_msg_found_lib_3 db 'Не найдена библиотека ',39,'msgbox.obj',39,0
  1257. err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'msgbox',39,0
  1258.  
  1259. l_libs_start:
  1260.         lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
  1261.                 err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
  1262.         lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
  1263.                 err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
  1264.         lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
  1265.                 err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i
  1266.         lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\
  1267.                 err_msg_found_lib_3,head_f_l,import_msgbox_lib,err_msg_import_3,head_f_i
  1268. l_libs_end:
  1269.  
  1270. align 4
  1271. import_libimg:
  1272.         dd alib_init1
  1273.         img_is_img  dd aimg_is_img
  1274.         img_info    dd aimg_info
  1275.         img_from_file dd aimg_from_file
  1276.         img_to_file dd aimg_to_file
  1277.         img_from_rgb dd aimg_from_rgb
  1278.         img_to_rgb  dd aimg_to_rgb
  1279.         img_to_rgb2 dd aimg_to_rgb2
  1280.         img_decode  dd aimg_decode
  1281.         img_encode  dd aimg_encode
  1282.         img_create  dd aimg_create
  1283.         img_destroy dd aimg_destroy
  1284.         img_destroy_layer dd aimg_destroy_layer
  1285.         img_count   dd aimg_count
  1286.         img_lock_bits dd aimg_lock_bits
  1287.         img_unlock_bits dd aimg_unlock_bits
  1288.         img_flip    dd aimg_flip
  1289.         img_flip_layer dd aimg_flip_layer
  1290.         img_rotate  dd aimg_rotate
  1291.         img_rotate_layer dd aimg_rotate_layer
  1292.         img_draw    dd aimg_draw
  1293.  
  1294.         dd 0,0
  1295.         alib_init1   db 'lib_init',0
  1296.         aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
  1297.         aimg_info    db 'img_info',0
  1298.         aimg_from_file db 'img_from_file',0
  1299.         aimg_to_file db 'img_to_file',0
  1300.         aimg_from_rgb db 'img_from_rgb',0
  1301.         aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
  1302.         aimg_to_rgb2 db 'img_to_rgb2',0
  1303.         aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
  1304.         aimg_encode  db 'img_encode',0
  1305.         aimg_create  db 'img_create',0
  1306.         aimg_destroy db 'img_destroy',0
  1307.         aimg_destroy_layer db 'img_destroy_layer',0
  1308.         aimg_count   db 'img_count',0
  1309.         aimg_lock_bits db 'img_lock_bits',0
  1310.         aimg_unlock_bits db 'img_unlock_bits',0
  1311.         aimg_flip    db 'img_flip',0
  1312.         aimg_flip_layer db 'img_flip_layer',0
  1313.         aimg_rotate  db 'img_rotate',0
  1314.         aimg_rotate_layer db 'img_rotate_layer',0
  1315.         aimg_draw    db 'img_draw',0
  1316.  
  1317. align 4
  1318. proclib_import: ;описание экспортируемых функций
  1319.         OpenDialog_Init dd aOpenDialog_Init
  1320.         OpenDialog_Start dd aOpenDialog_Start
  1321. dd 0,0
  1322.         aOpenDialog_Init db 'OpenDialog_init',0
  1323.         aOpenDialog_Start db 'OpenDialog_start',0
  1324.  
  1325. align 4
  1326. import_buf2d:
  1327.         init dd sz_init
  1328.         buf2d_create dd sz_buf2d_create
  1329.         buf2d_create_f_img dd sz_buf2d_create_f_img
  1330.         buf2d_clear dd sz_buf2d_clear
  1331.         buf2d_draw dd sz_buf2d_draw
  1332.         buf2d_delete dd sz_buf2d_delete
  1333.         buf2d_resize dd sz_buf2d_resize
  1334.         buf2d_line dd sz_buf2d_line
  1335.         buf2d_rect_by_size dd sz_buf2d_rect_by_size
  1336.         buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
  1337.         buf2d_circle dd sz_buf2d_circle
  1338.         buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
  1339.         buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
  1340.         buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
  1341.         buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
  1342.         buf2d_bit_blt dd sz_buf2d_bit_blt
  1343.         buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
  1344.         buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
  1345.         buf2d_curve_bezier dd sz_buf2d_curve_bezier
  1346.         buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
  1347.         buf2d_draw_text dd sz_buf2d_draw_text
  1348.         buf2d_crop_color dd sz_buf2d_crop_color
  1349.         buf2d_offset_h dd sz_buf2d_offset_h
  1350.         buf2d_flood_fill dd sz_buf2d_flood_fill
  1351.         buf2d_set_pixel dd sz_buf2d_set_pixel
  1352.         buf2d_get_pixel dd sz_buf2d_get_pixel
  1353.         buf2d_vox_brush_create dd sz_buf2d_vox_brush_create
  1354.         buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete
  1355.         buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g
  1356.         buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g
  1357.         buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g
  1358.         buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g
  1359.         buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled
  1360.         buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows
  1361.         buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl
  1362.         buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled
  1363.         dd 0,0
  1364.         sz_init db 'lib_init',0
  1365.         sz_buf2d_create db 'buf2d_create',0
  1366.         sz_buf2d_create_f_img db 'buf2d_create_f_img',0
  1367.         sz_buf2d_clear db 'buf2d_clear',0
  1368.         sz_buf2d_draw db 'buf2d_draw',0
  1369.         sz_buf2d_delete db 'buf2d_delete',0
  1370.         sz_buf2d_resize db 'buf2d_resize',0
  1371.         sz_buf2d_line db 'buf2d_line',0
  1372.         sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
  1373.         sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
  1374.         sz_buf2d_circle db 'buf2d_circle',0
  1375.         sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
  1376.         sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
  1377.         sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
  1378.         sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
  1379.         sz_buf2d_bit_blt db 'buf2d_bit_blt',0
  1380.         sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
  1381.         sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
  1382.         sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
  1383.         sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
  1384.         sz_buf2d_draw_text db 'buf2d_draw_text',0
  1385.         sz_buf2d_crop_color db 'buf2d_crop_color',0
  1386.         sz_buf2d_offset_h db 'buf2d_offset_h',0
  1387.         sz_buf2d_flood_fill db 'buf2d_flood_fill',0
  1388.         sz_buf2d_set_pixel db 'buf2d_set_pixel',0
  1389.         sz_buf2d_get_pixel db 'buf2d_get_pixel',0
  1390.         sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
  1391.         sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
  1392.         sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
  1393.         sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
  1394.         sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
  1395.         sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
  1396.         sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
  1397.         sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0
  1398.         sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0
  1399.         sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0
  1400.  
  1401. align 4
  1402. import_msgbox_lib:
  1403.         mb_create dd amb_create
  1404. ;       mb_reinit dd amb_reinit
  1405. ;       mb_setfunctions dd amb_setfunctions
  1406. dd 0,0
  1407.         amb_create db 'mb_create',0
  1408. ;       amb_reinit db 'mb_reinit',0
  1409. ;       amb_setfunctions db 'mb_setfunctions',0
  1410.  
  1411. mouse_dd dd 0x0
  1412. sc system_colors
  1413. last_time dd 0
  1414.  
  1415. align 16
  1416. procinfo process_information
  1417.  
  1418. align 4
  1419. buf_0: dd 0
  1420.         dw 5 ;+4 left
  1421.         dw 35 ;+6 top
  1422. .w: dd 6*64 ;+8 w
  1423. .h: dd 7*64 ;+12 h
  1424. .color: dd 0xffffff ;+16 color
  1425.         db 24 ;+20 bit in pixel
  1426.  
  1427. align 4
  1428. buf_0z: dd 0
  1429.         dw 5 ;+4 left
  1430.         dw 35 ;+6 top
  1431. .w: dd 6*64 ;+8 w
  1432. .h: dd 7*64 ;+12 h
  1433. .color: dd 0 ;+16 color
  1434.         db 32 ;+20 bit in pixel
  1435.  
  1436. align 4
  1437. buf_i0: dd 0
  1438.         dw 5 ;+4 left
  1439.         dw 35 ;+6 top
  1440. .w: dd 0 ;+8 w
  1441. .h: dd 0 ;+12 h
  1442. .color: dd 0 ;+16 color
  1443.         db 24 ;+20 bit in pixel
  1444.  
  1445. align 4
  1446. buf_i1: dd 0
  1447.         dw 105 ;+4 left
  1448.         dw 35 ;+6 top
  1449. .w: dd 0 ;+8 w
  1450. .h: dd 0 ;+12 h
  1451. .color: dd 0 ;+16 color
  1452.         db 24 ;+20 bit in pixel
  1453.  
  1454. align 4
  1455. buf_i2: dd 0
  1456.         dw 205 ;+4 left
  1457.         dw 35 ;+6 top
  1458. .w: dd 0 ;+8 w
  1459. .h: dd 0 ;+12 h
  1460. .color: dd 0 ;+16 color
  1461.         db 24 ;+20 bit in pixel
  1462.  
  1463. align 4
  1464. buf_npl_p: dd 0
  1465.         dw 0 ;+4 left
  1466.         dw 0 ;+6 top
  1467. .w: dd 0 ;+8 w
  1468. .h: dd 0 ;+12 h
  1469. .color: dd 0 ;+16 color
  1470.         db 24 ;+20 bit in pixel
  1471.  
  1472. align 4
  1473. buf_npl: dd 0
  1474.         dw 5 ;+4 left
  1475.         dw 35 ;+6 top
  1476. .w: dd 0 ;+8 w
  1477. .h: dd 0 ;+12 h
  1478. .color: dd 0 ;+16 color
  1479.         db 24 ;+20 bit in pixel
  1480.  
  1481. align 4
  1482. buf_npl_n: dd 0
  1483.         dw 0 ;+4 left
  1484.         dw 0 ;+6 top
  1485. .w: dd 0 ;+8 w
  1486. .h: dd 0 ;+12 h
  1487. .color: dd 0 ;+16 color
  1488.         db 24 ;+20 bit in pixel
  1489.  
  1490. ;данные для создания минимального единичного вокселя
  1491. align 4
  1492. vox_6_7_z:
  1493. dd 0,0,1,1,0,0,\
  1494.    0,2,2,2,2,0,\
  1495.    2,2,2,2,2,2,\
  1496.    2,3,2,2,3,2,\
  1497.    2,3,3,3,3,2,\
  1498.    0,3,3,3,3,0,\
  1499.    0,0,3,3,0,0
  1500.  
  1501. align 4
  1502. buf_vox:
  1503.         db 6,7,4,3 ;w,h,h_osn,n
  1504.         rb BUF_STRUCT_SIZE*(2+1)
  1505.  
  1506.  
  1507. align 16
  1508. i_end:
  1509.                 rb 2048
  1510.         thread:
  1511.                 rb 2048
  1512. stacktop:
  1513.         sys_path rb 1024
  1514.         file_name:
  1515.                 rb 1024 ;4096
  1516.         library_path rb 1024
  1517.         plugin_path rb 4096
  1518.         openfile_path rb 4096
  1519.         filename_area rb 256
  1520. mem:
  1521.