Subversion Repositories Kolibri OS

Rev

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

  1. TILE_LEN          equ 256
  2. TILE_LEN_W        equ TILE_LEN
  3. TILE_LEN_H        equ TILE_LEN
  4. RGB_TILE_SIZE_1N4 equ (TILE_LEN*TILE_LEN*3/4) ;1/4 часть памяти картинки
  5. RGB_TILE_SIZE_1N2 equ (TILE_LEN*TILE_LEN*3/2) ;1/2 часть памяти картинки
  6. RGB_TILE_SIZE     equ TILE_LEN*TILE_LEN*3     ;размер 1-й картинки
  7. TREE_ICON_SYS16_BMP_SIZE equ 256*3*11+54 ;размер bmp файла с системными иконками
  8. TREE_ICON_NOD16_BMP_SIZE equ 256*3* 1+54
  9. TILE_TEXT_MAX_LEN equ 40 ;максимальная длинна текста для вывода имени файла
  10.  
  11. FRACT_TILE_00 equ 1 ;дробный файл, 1/4 - верхний левый угол
  12. FRACT_TILE_01 equ 2 ;дробный файл, 1/4 - нижний левый угол
  13. FRACT_TILE_10 equ 4 ;дробный файл, 1/4 - верхний правый угол
  14. FRACT_TILE_11 equ 8 ;дробный файл, 1/4 - нижний правый угол
  15. FRACT_TILE_ALL equ 15 ;15=1+2+4+8
  16. FRACT_TILE_BIT00 equ 0
  17. FRACT_TILE_BIT01 equ 1
  18. FRACT_TILE_BIT10 equ 2
  19. FRACT_TILE_BIT11 equ 3
  20.  
  21. ;флаги, нужные при растягивании:
  22. SCALE_0BIT_USE equ 8
  23. SCALE_1BIT_USE equ 9
  24. SCALE_0_USE equ 0x100 ;флаг открытия картинки текущего уровня
  25. SCALE_1_USE equ 0x200 ;флаг открытия картинки высшего уровня (будет растягиватся в проприсовке)
  26.  
  27. met_fr_opn db 0 ;флаг открытия файла с метками
  28.  
  29. size_tile_struc equ 32 ;размер структуры тайла
  30. max_tiles_cols  equ 4 ;максимальное число тайлов по ширине окна
  31. max_tiles_rows  equ 3 ;максимальное число тайлов по высоте окна
  32. max_tiles_count equ (max_tiles_cols*max_tiles_rows) ;максимальное число тайлов в программе
  33.  
  34. tile_coord_x    equ dword[edi] ;координата x (как параметр для загрузки)
  35. tile_coord_y    equ dword[edi+ 4] ;координата y (как параметр для загрузки)
  36. tile_zoom       equ  byte[edi+ 8] ;масштаб загружаемого тайла
  37. tile_err_f      equ  byte[edi+ 9] ;код ошибки при открытии изображения
  38. tile_drobn      equ  word[edi+10] ;поле для сохранения результатов открытия дробных картинок
  39. tile_offs_l_load equ 12 ;offset params last load tile
  40. tile_key_coord_x equ dword[edi+12] ;координата x (как ключ последней загрузки)
  41. tile_key_coord_y equ dword[edi+16] ;координата y (как ключ последней загрузки)
  42. tile_key_path_len equ  byte[edi+21] ;длинна текста в поле Cache
  43. tile_rgb_icon   equ dword[edi+22] ;указатель на буфер для хранения основной или растянутой картинки
  44. tile_drobn_icon equ dword[edi+26] ;указатель на буфер для хранения 4-х дробных картинок
  45. tile_delta_x    equ  byte[edi+30] ;сдвиг тайла относительно курсора по оси x
  46. tile_delta_y    equ  byte[edi+31] ;сдвиг тайла относительно курсора по оси y
  47.  
  48.  
  49. ; *** порядок вызова функций при загрузке тайлов ***
  50. ;load_tile
  51. ;       get_tile_path
  52. ;       load_new_tile (текущая картинка)
  53. ;       get_tile_path
  54. ;       load_new_tile (нижняя картинка)
  55. ;       get_tile_path
  56. ;       load_new_tile (нижняя картинка)
  57. ;       get_tile_path
  58. ;       load_new_tile (нижняя картинка)
  59. ;       get_tile_path
  60. ;       load_new_tile (нижняя картинка)
  61. ;       get_parent_tiles (циклический просмотр родительских тайлов)
  62. ;               get_tile_path
  63. ;               load_new_tile (верхняя картинка)
  64.  
  65.  
  66. ;???
  67. align 4
  68. CursorMoveRight: ;передвигаем координату курсора вправо
  69.   push ebx ecx
  70.   xor ebx,ebx
  71.   xor ecx,ecx
  72.   mov cl,byte[map.zoom]
  73.   dec ecx
  74.   cmp cx,0
  75.   jle .no_move ;при 0-м масштабе не двигаемся
  76.   @@:
  77.     rol ebx,1
  78.     or ebx,1 ;накапливаем максимальную координату, при даном масштабе
  79.     loop @b
  80.   cmp dword[map.coord_x],ebx
  81.   jge .no_move ;если координата крайняя, не двигаемся
  82.     inc dword[map.coord_x]
  83.     ;сдвигаем сетку тайлов влево, что-бы часть тайлов совпали и пришлось меньше загружать новых
  84.     stdcall tiles_grid_move_left, tile_00,max_tiles_count,max_tiles_cols
  85.     call but_Refresh
  86.   .no_move:
  87.   pop ecx ebx
  88.   ret
  89.  
  90. ;???
  91. align 4
  92. CursorMoveDown: ;передвигаем координату курсора вниз
  93.   push ebx ecx
  94.   xor ebx,ebx
  95.   xor ecx,ecx
  96.   mov cl,byte[map.zoom]
  97.   dec ecx
  98.   cmp cx,0
  99.   jle .no_move ;при 0-м масштабе не двигаемся
  100.   @@:
  101.     rol ebx,1
  102.     or ebx,1 ;накапливаем максимальную координату, при даном масштабе
  103.     loop @b
  104.   cmp dword[map.coord_y],ebx
  105.   jge .no_move ;если координата крайняя, не двигаемся
  106.     inc dword[map.coord_y]
  107.     ;сдвигаем сетку тайлов вверх
  108.     stdcall tiles_grid_move_up, tile_00,max_tiles_count,max_tiles_rows
  109.     call but_Refresh
  110.   .no_move:
  111.   pop ecx ebx
  112.   ret
  113.  
  114. ;???
  115. align 4
  116. but_met_up: ;перемещение метки вверх, по списку
  117.   stdcall dword[tl_node_move_up], tree2
  118.   ret
  119.  
  120. ;???
  121. align 4
  122. but_met_dn: ;перемещение метки вниз, по списку
  123.   stdcall dword[tl_node_move_down], tree2
  124.   ret
  125.  
  126. ;???
  127. align 4
  128. fun_new_map_type: ;меняем расширение для карты
  129.   push eax
  130.     stdcall dword[tl_node_get_data], tree1
  131.     pop eax
  132.     cmp eax,0
  133.     je @f
  134.       mov dword[txt_tile_type],eax
  135.     @@:
  136.   pop eax
  137.   ret
  138.  
  139. ;задаем расположение тайлов по сетке
  140. align 4
  141. proc tiles_init_grid, beg_tiles:dword, count:dword, cols:dword
  142.   push eax ebx ecx edx edi
  143.   xor eax,eax
  144.   xor ebx,ebx
  145.   mov edi,[beg_tiles]
  146.   mov ecx,[count]
  147.   mov edx,[cols]
  148.   @@:
  149.     mov tile_delta_x,al
  150.     mov tile_delta_y,bl
  151.     add edi,size_tile_struc
  152.     inc ax
  153.     cmp eax,edx
  154.     jl .old_lin
  155.       xor eax,eax
  156.       inc bx
  157.     .old_lin:
  158.     loop @b
  159.   pop edi edx ecx ebx eax
  160.   ret
  161. endp
  162.  
  163. ;сдвигаем сетку влево, вылезшие столбцы будут перекинуты на правую сторону
  164. ;функция нужна для оптимизации обращения к диску, при движении курсора мы двигаем
  165. ;тайлы в противоположную сторону, в результате координаты большинства тайлов не меняются
  166. ;а значит программа не будет перечитывать их заново, чем и достигается оптимизация
  167. align 4
  168. proc tiles_grid_move_left, beg_tiles:dword, count:dword, cols:dword
  169.   push eax ebx ecx edx edi
  170.   xor eax,eax
  171.   xor ebx,ebx
  172.   mov edi,[beg_tiles]
  173.   mov ecx,[count]
  174.   mov edx,[cols]
  175.   @@:
  176.     cmp tile_delta_x,0
  177.     jne .no_jump
  178.       add tile_delta_x,dl ;если столбец = 0, то добавляем 'cols' что-бы не вылазил влево
  179.     .no_jump:
  180.     dec tile_delta_x
  181.     add edi,size_tile_struc
  182.     loop @b
  183.   pop edi edx ecx ebx eax
  184.   ret
  185. endp
  186.  
  187. ;сдвигаем сетку вправо, вылезшие столбцы будут перекинуты на левую сторону
  188. ;делает тоже что и tiles_grid_move_left только двигает координаты в другую сторону
  189. align 4
  190. proc tiles_grid_move_right, beg_tiles:dword, count:dword, cols:dword
  191.   push eax ebx ecx edx edi
  192.   xor eax,eax
  193.   xor ebx,ebx
  194.   mov edi,[beg_tiles]
  195.   mov ecx,[count]
  196.   mov edx,[cols]
  197.   @@:
  198.     inc tile_delta_x
  199.     cmp tile_delta_x,dl
  200.     jl .no_jump
  201.       mov tile_delta_x,0 ;если столбец = 'cols', то ставим ему 0 что-бы не вылазил вправо
  202.     .no_jump:
  203.     add edi,size_tile_struc
  204.     loop @b
  205.   pop edi edx ecx ebx eax
  206.   ret
  207. endp
  208.  
  209. align 4
  210. proc tiles_grid_move_up, beg_tiles:dword, count:dword, rows:dword
  211.   push eax ebx ecx edx edi
  212.   xor eax,eax
  213.   xor ebx,ebx
  214.   mov edi,[beg_tiles]
  215.   mov ecx,[count]
  216.   mov edx,[rows]
  217.   @@:
  218.     cmp tile_delta_y,0
  219.     jne .no_jump
  220.       add tile_delta_y,dl ;если строка = 0, то добавляем 'rows' что-бы не вылазила вниз
  221.     .no_jump:
  222.     dec tile_delta_y
  223.     add edi,size_tile_struc
  224.     loop @b
  225.   pop edi edx ecx ebx eax
  226.   ret
  227. endp
  228.  
  229. align 4
  230. proc tiles_grid_move_down, beg_tiles:dword, count:dword, rows:dword
  231.   push eax ebx ecx edx edi
  232.   xor eax,eax
  233.   xor ebx,ebx
  234.   mov edi,[beg_tiles]
  235.   mov ecx,[count]
  236.   mov edx,[rows]
  237.   @@:
  238.     inc tile_delta_y
  239.     cmp tile_delta_y,dl
  240.     jl .no_jump
  241.       mov tile_delta_y,0 ;если строка = 'rows', то ставим ей 0 что-бы не вылазила вверх
  242.     .no_jump:
  243.     add edi,size_tile_struc
  244.     loop @b
  245.   pop edi edx ecx ebx eax
  246.   ret
  247. endp
  248.  
  249. align 4
  250. proc array_tile_function, beg_tiles:dword, count:dword, funct:dword
  251.   push ecx edi
  252.   mov edi,[beg_tiles]
  253.   mov ecx,[count]
  254.   @@:
  255.     stdcall [funct],edi
  256.     add edi,size_tile_struc
  257.     loop @b
  258.   pop edi ecx
  259.   ret
  260. endp
  261.  
  262. align 4
  263. draw_tiles:
  264. pushad
  265.   mov eax,47
  266.   mov ebx,0x20000
  267.   xor ecx,ecx
  268.   mov cl,byte[map.zoom]
  269.   mov edx,128*65536+13
  270.   mov esi,[sc.work_text]
  271.   or  esi,0x40000000
  272.   mov edi,[sc.work]
  273.   int 0x40
  274.  
  275.   stdcall array_tile_function, tile_00,max_tiles_count,draw_tile
  276. popad
  277.   ret
  278.  
  279. ; edi - pointer tile struct
  280. ;output:
  281. ; eax - 7
  282. ; edx - coordinates to tile draw
  283.  
  284. align 4
  285. proc tile_clear_area, height:dword
  286.   pushad
  287.     mov eax,13 ;draw rect
  288.  
  289.     mov cx,dx
  290.     shl ecx,16
  291.     mov cx,word[height]
  292.  
  293.     shr edx,16
  294.     mov bx,dx
  295.     shl ebx,16
  296.     mov bx,TILE_LEN_W
  297.  
  298.     mov edx,0xffffd0
  299.     int 0x40
  300.   popad
  301.   ret
  302. endp
  303.  
  304. ;???
  305. align 4
  306. proc draw_tile, tile:dword
  307.   pushad
  308.   mov edi,[tile]
  309.  
  310. ;*** set base point ***
  311.   mov edx,5*65536+35
  312.   xor eax,eax
  313.   mov al,tile_delta_y
  314.   shl ax,8 ;*256
  315.   add edx,eax
  316.   xor eax,eax
  317.   mov al,tile_delta_x
  318.   shl eax,8+16
  319.   add edx,eax
  320. ;*** set base point ***
  321.  
  322.   mov ebx,dword[procinfo.box.width] ;проверяем влазит ли картинка по оси x
  323.   sub ebx,min_window_w-5 ;5 - отступ слева для 1-й картинки
  324.   shl ebx,16
  325.   mov bx,dx ;нижняя координата пока не учитывается, потому делаем их равными
  326.   cmp edx,ebx
  327.   jg .end_f
  328.  
  329.   ;проверяем влазит ли картинка по оси y
  330.   mcall 48,4 ;eax = высота скина
  331.   mov ecx,dword[procinfo.box.height]
  332.   mov ebx,edx
  333.   and ebx,0xffff ;ebx = координата 'y' для вывода тайла
  334.   add eax,ebx
  335.   add eax,5+5 ;5-рамка
  336.  
  337.   cmp ecx,eax
  338.   jle .end_f
  339.  
  340.   sub ecx,eax
  341.   cmp ecx,TILE_LEN_H
  342.   jle @f
  343.     mov ecx,TILE_LEN_H
  344.   @@:
  345.  
  346.   mov eax,7
  347.   bt tile_drobn,SCALE_0BIT_USE
  348.   jc .draw
  349.   bt tile_drobn,SCALE_1BIT_USE
  350.   jc .draw
  351.   jmp @f
  352.     .draw:
  353.     mov ebx,tile_rgb_icon
  354.     or ecx,TILE_LEN_W*65536 ;задание ширины для целой картинки
  355.     int 0x40 ;вывод на экран целой или увеличиной картинки
  356.     jmp .end_clear_tile
  357.   @@:
  358.     cmp tile_drobn,FRACT_TILE_ALL
  359.     je .end_clear_tile
  360.       stdcall tile_clear_area, ecx ;чистка области тайла
  361.   .end_clear_tile:
  362.  
  363.     cmp tile_drobn,0
  364.     je .info ;если нет ни одной дробной картинки
  365.  
  366. mov si,cx ;si - высота нижней дробной картинки
  367. sub si,TILE_LEN_H/2 ;si - высота нижней дробной картинки
  368. cmp cx,TILE_LEN_H/2
  369. jl @f
  370.   mov cx,TILE_LEN_H/2 ;задание высоты для верхней дробной картинки
  371. @@:
  372.  
  373.     and ecx,0xffff ;стирание старой ширины
  374.     or ecx,(TILE_LEN_W/2)*65536 ;задание ширины для дробной картинки
  375.     mov ebx,tile_drobn_icon
  376.     bt tile_drobn,FRACT_TILE_BIT00
  377.     jae @f
  378.       int 0x40
  379.     @@:
  380.     add dx,TILE_LEN_H/2
  381.     add ebx,RGB_TILE_SIZE_1N4
  382.     bt tile_drobn,FRACT_TILE_BIT01
  383.     jae @f
  384.       xchg cx,si
  385.       int 0x40
  386.       xchg cx,si
  387.     @@:
  388.  
  389.     sub dx,TILE_LEN_H/2
  390.     ror edx,16
  391.     add dx,TILE_LEN_W/2
  392.     ror edx,16
  393.     add ebx,RGB_TILE_SIZE_1N4
  394.     bt tile_drobn,FRACT_TILE_BIT10
  395.     jae @f
  396.       int 0x40
  397.     @@:
  398.  
  399.     add dx,TILE_LEN_H/2
  400.     add ebx,RGB_TILE_SIZE_1N4
  401.     bt tile_drobn,FRACT_TILE_BIT11
  402.     jae @f
  403.       xchg cx,si
  404.       int 0x40
  405.     @@:
  406.  
  407.     jmp .end_f
  408.   .info: ;вывод информации, при не удачном открытии картинок
  409.  
  410. ;;;jmp .end_f ;test
  411.   bt tile_drobn,SCALE_0BIT_USE
  412.   jc .end_f
  413.   bt tile_drobn,SCALE_1BIT_USE
  414.   jc .end_f
  415.  
  416.     mov ebx,edx
  417.     add ebx,0x30003
  418.     mov edx,tile_rgb_icon ;при неудачном открытии в tile_rgb_icon путь к файлу
  419. ;;;    mov dword[edx+RGB_TILE_SIZE_1N4],0 ;ставим нули, на случай если в строке с именем файла мусор
  420.     stdcall [str_len],tile_rgb_icon,RGB_TILE_SIZE_1N4
  421.     mov edi,eax
  422.  
  423.     mov eax,4 ;draw text
  424.     mov ecx,0xff
  425. ;or ecx,0x80000000
  426.     mov esi,TILE_TEXT_MAX_LEN
  427.  
  428.     @@:
  429.       cmp edi,TILE_TEXT_MAX_LEN
  430.       jg .no_line_last
  431.         mov esi,edi
  432.         int 0x40
  433.         jmp .end_f
  434.       .no_line_last:
  435.       int 0x40
  436.       add edx,esi
  437.       sub edi,esi
  438.       add ebx,10 ;опускаемся на нижнюю строку
  439.       jmp @b
  440.   .end_f:
  441.   popad
  442.   ret
  443. endp
  444.  
  445. ;увеличение масштаба
  446. align 4
  447. but_ZoomP:
  448.   cmp byte[map.zoom],24
  449.   jge @f
  450.     inc byte[map.zoom]
  451.     shl dword[map.coord_x],1
  452.     shl dword[map.coord_y],1
  453.     call but_Refresh
  454.   @@:
  455.   ret
  456.  
  457. ;уменьшение масштаба
  458. align 4
  459. but_ZoomM:
  460.   cmp byte[map.zoom],1
  461.   jle @f
  462.     dec byte[map.zoom]
  463.     shr dword[map.coord_x],1
  464.     shr dword[map.coord_y],1
  465.     call but_Refresh
  466.   @@:
  467.   ret
  468.  
  469. ;???
  470. align 4
  471. but_MetSave: ;сохранение файла с метками
  472.   stdcall dword[tl_save_mem], TREE_ICON_SYS16_BMP_SIZE,[bmp_icon],0,tree2
  473.  
  474.   push eax ebx ecx edi
  475.     copy_path fn_metki,sys_path,file_name,0x0
  476.  
  477.     stdcall dword[tl_get_mem_size], [bmp_icon],tree2
  478.     pop ecx
  479.     inc ecx ;для записи в файл завершающего нуля
  480.  
  481.     mov eax,70
  482.     m2m [run_file_70.Buffer], [bmp_icon]
  483.     mov [run_file_70.Function], 2
  484.     mov [run_file_70.Position], 0
  485.     mov [run_file_70.Flags], 0
  486.     mov [run_file_70.Count], ecx
  487.     mov byte[run_file_70+20], 0
  488.     mov [run_file_70.FileName], file_name
  489.     mov ebx,run_file_70
  490.     int 0x40
  491.   pop edi ecx ebx eax
  492.   jmp still
  493.  
  494. ;???
  495. align 4
  496. but_MetLoad: ;считываем файл с метками
  497.   cmp byte[met_fr_opn],0
  498.   jne .end_f
  499.   pushad
  500.     mov byte[met_fr_opn],1
  501.     copy_path fn_metki,sys_path,file_name,0x0
  502.     mov eax,70 ;load icon file
  503.     mov [run_file_70.Function], 0
  504.     mov [run_file_70.Position], 0
  505.     mov [run_file_70.Flags], 0
  506.     mov [run_file_70.Count], TREE_ICON_SYS16_BMP_SIZE
  507.     mov byte[run_file_70+20], 0
  508.     mov [run_file_70.FileName], file_name
  509.     m2m [run_file_70.Buffer], [bmp_icon]
  510.     mov eax,70
  511.     mov ebx,run_file_70
  512.     int 0x40
  513.     cmp ebx,0xffffffff
  514.     je @f
  515.       stdcall [tl_load_mem], TREE_ICON_SYS16_BMP_SIZE,dword[bmp_icon],0,tree2
  516.       stdcall [tl_cur_beg], tree2 ;?
  517.       stdcall [tl_draw], tree2 ;?
  518.       pop eax
  519.     @@:
  520.     mov byte[file_name],0 ;clear file name
  521.   popad
  522.   .end_f:
  523.   ret
  524.  
  525. ;???
  526. align 4
  527. but_MetAdd: ;добавление метки
  528.   push eax
  529.     mov eax,dword[bmp_icon]
  530.     m2m dword[eax],  dword[map.coord_x]
  531.     m2m dword[eax+4],dword[map.coord_y]
  532.     m2m  word[eax+8], word[map.zoom]
  533.     add eax,12
  534.     stdcall dword[str_copy], eax,30,dword[edit2.text],30
  535.     stdcall dword[tl_node_add], dword[bmp_icon], 0, tree2
  536.     stdcall dword[tl_draw], tree2
  537.   pop eax
  538.   jmp still
  539.  
  540. ;???
  541. align 4
  542. fun_goto_met: ;переход к выбранной метке
  543.   push eax
  544.   stdcall dword[tl_node_get_data], tree2
  545.   pop eax
  546.   cmp eax,0
  547.   je @f ;курсор не стоит на метке
  548.     m2m dword[map.coord_x],dword[eax]
  549.     m2m dword[map.coord_y],dword[eax+4]
  550.     m2m word[map.zoom],word[eax+8]
  551.     call but_Refresh
  552.   @@:
  553.   pop eax
  554.   ret
  555.  
  556. ;???
  557. align 4
  558. but_Refresh:
  559.   call fun_new_map_type ;проверяем не поменялся ли тип просматриваемых файлов
  560.  
  561.   stdcall array_tile_function, tile_00,max_tiles_count,load_tile
  562.   stdcall draw_tiles
  563.   ret
  564.  
  565. align 4
  566. proc tile_init, tile:dword
  567.   push eax edi
  568.     mov edi,[tile]
  569.  
  570.     push dword RGB_TILE_SIZE+300
  571.     call mem.Alloc
  572.     mov tile_rgb_icon,eax
  573.  
  574.     push dword RGB_TILE_SIZE
  575.     call mem.Alloc
  576.     mov tile_drobn_icon,eax
  577.   pop edi eax
  578.   ret
  579. endp
  580.  
  581. align 4
  582. proc tile_destroy, tile:dword
  583.   push edi
  584.     mov edi,[tile]
  585.     push tile_rgb_icon
  586.     call mem.Free
  587.     push tile_drobn_icon
  588.     call mem.Free
  589.   pop edi
  590.   ret
  591. endp
  592.  
  593.  
  594. ;???
  595. align 4 ;загружает тайлы, в определенной области
  596. proc load_tile, tile:dword
  597.   push eax ebx ecx edi
  598.   mov edi,dword[tile] ;копируем указатель на структуру тайла, что-бы работали константы
  599.  
  600.   stdcall mem_copy, map,edi, 9 ;копируем координаты курсора в структуру тайла
  601.   xor eax,eax
  602.   mov al,tile_delta_x
  603.   add tile_coord_x,eax ;сдвигаем координаты тайла, относительно курсора
  604.   mov al,tile_delta_y
  605.   add tile_coord_y,eax
  606.   stdcall get_tile_path,edi    ;берем путь к тайлу
  607.  
  608. ;***
  609.   ; проверка координат последней загруженной картинки
  610.   mov eax,edi
  611.   mov ecx,9
  612.   @@:
  613.     mov bl,byte[eax+tile_offs_l_load]
  614.     cmp byte[eax],bl
  615.     jne .st_load
  616.     inc eax
  617.     loop @b
  618.   mov ebx,dword[edit1.size];проверяем также тип карт, который был ранее загружен
  619.   cmp tile_key_path_len,bl ;при изменении типа карты нужно также перечитывать файлы
  620.   jne .st_load
  621.  
  622.   jmp @f    ;если координаты совпали то уже не загружаем
  623.   .st_load: ;start load tile
  624.  
  625.   ; установка новых координат для последней загруженной картинки
  626.   mov eax,edi
  627.   add eax,tile_offs_l_load
  628.   stdcall mem_copy, edi,eax,9
  629.   mov ebx,dword[edit1.size]
  630.   mov tile_key_path_len,bl
  631. ;***
  632.  
  633.   ;mov tile_drobn,0
  634.   mov tile_drobn,SCALE_0_USE ;ставим флаг открытия картинки текущего уровня
  635.   stdcall load_new_tile,edi
  636.   cmp tile_err_f,0
  637.   je @f ;если удачно открыли текущий файл то остальные действия пропускаем
  638. ;  cmp tile_err_f,6
  639. ;  je @f
  640.     mov tile_drobn,0
  641.     mov eax,ch2 ;проверяем опцию 'брать снизу'
  642.     bt dword[eax+32],1 ;ch_flags equ [edi+32] ;флаги
  643.     jae .opt_drobn_false
  644.  
  645.     ;если файл не найден, попадаем сюда
  646.     inc tile_zoom
  647.     shl tile_coord_y,1
  648.     shl tile_coord_x,1
  649.     stdcall get_tile_path,edi
  650.     stdcall load_new_tile,edi
  651.  
  652.     cmp tile_err_f,0
  653.     jne .no_tile_00 ;если неудачно открыли то не уменьшаем изображение
  654.       or tile_drobn,FRACT_TILE_00
  655. ; 1 сжатие картинки по высоте
  656.       stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
  657. ; 2 сжатие картинки по ширине
  658.       stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
  659. ; 3 копирование 1-й картинки в резервный буфер
  660.       stdcall mem_copy, tile_rgb_icon, tile_drobn_icon, RGB_TILE_SIZE_1N4
  661.     .no_tile_00:
  662.  
  663.     ;если файл не найден, попадаем сюда
  664.     inc tile_coord_y
  665.     stdcall get_tile_path,edi
  666.     stdcall load_new_tile,edi
  667.  
  668.     cmp tile_err_f,0
  669.     jne .no_tile_01 ;если неудачно открыли то не уменьшаем изображение
  670. ;      mov byte[map.drobn],0
  671.       or tile_drobn,FRACT_TILE_01
  672. ; 1 сжатие картинки по высоте
  673.       stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
  674. ; 2 сжатие картинки по ширине
  675.       stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
  676. ; 3 копирование 2-й картинки в резервный буфер
  677.       mov eax,tile_drobn_icon
  678.       add eax,RGB_TILE_SIZE_1N4 ; сдвиг картинки вниз (т. к. она нижняя)
  679.       stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4
  680.     .no_tile_01:
  681.  
  682.     ;если файл не найден, попадаем сюда
  683.     dec tile_coord_y
  684.     inc tile_coord_x
  685.     stdcall get_tile_path,edi
  686.     stdcall load_new_tile,edi
  687.  
  688.     cmp tile_err_f,0
  689.     jne .no_tile_10 ;если неудачно открыли то не уменьшаем изображение
  690. ;      mov byte[map.drobn],0
  691.       or tile_drobn,FRACT_TILE_10
  692. ; 1 сжатие картинки по высоте
  693.       stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
  694. ; 2 сжатие картинки по ширине
  695.       stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
  696. ; 3 копирование 3-й картинки в резервный буфер
  697.       mov eax,tile_drobn_icon
  698.       add eax,RGB_TILE_SIZE_1N2 ; сдвиг картинки вниз (т. к. она нижняя)
  699.       stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4
  700.     .no_tile_10:
  701.  
  702.     ;если файл не найден, попадаем сюда
  703.     inc tile_coord_y
  704.     stdcall get_tile_path,edi
  705.     stdcall load_new_tile,edi
  706.  
  707.     cmp tile_err_f,0
  708.     jne .no_tile_11 ;если неудачно открыли то не уменьшаем изображение
  709. ;      mov byte[map.drobn],0
  710.       or tile_drobn,FRACT_TILE_11
  711. ; 1 сжатие картинки по высоте
  712.       stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
  713. ; 2 сжатие картинки по ширине
  714.       stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
  715. ; 3 сдвиг картинки вниз без копирования (т. к. она нижняя)
  716.       stdcall img_rgb_hoffs, tile_rgb_icon, TILE_LEN*TILE_LEN/4, TILE_LEN/2, TILE_LEN*3/2
  717.  
  718.       ;копируем последнюю дробную картинку в буфер drobn_icon
  719.       ;в котором уже были сформированы 3 другие
  720.       mov eax,tile_drobn_icon
  721.       add eax,RGB_TILE_SIZE_1N4*3
  722.       stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4
  723.     .no_tile_11:
  724.   .opt_drobn_false:
  725.  
  726.  
  727.   mov eax,ch1 ;проверяем опцию 'брать сверху'
  728.   bt dword[eax+32],1 ;ch_flags equ [edi+32] ;флаги
  729.   jae @f
  730.   cmp tile_drobn,FRACT_TILE_ALL ;если собрана вся картинка, то сверху уже не берем
  731.   je @f
  732.     ;не знаем была-ли включена опция 'брать снизу', для которой изменялись координаты
  733.     ;потому опять копируем координаты курсора в структуру тайла
  734.     stdcall mem_copy, map,edi, 9
  735.     xor eax,eax
  736.     mov al,tile_delta_x
  737.     add tile_coord_x,eax ;сдвигаем координаты тайла, относительно курсора
  738.     mov al,tile_delta_y
  739.     add tile_coord_y,eax
  740.  
  741.     xor ecx,ecx
  742.     .zoom:
  743.       cmp tile_zoom,0
  744.       je @f ;просматривается самая верхняя картинка, выходим
  745.       call get_parent_tiles ;циклический просмотр родительских тайлов
  746.       bt tile_drobn,SCALE_1BIT_USE
  747.       jc @f
  748.       cmp ecx,5 ;5 - ограничение на степень растягивания картинки
  749.       je @f
  750.       jmp .zoom
  751.     @@:
  752.  
  753.   pop edi ecx ebx eax
  754.   ret
  755. endp
  756.  
  757. ;output:
  758. ;ecx - if not file = count parent levels else = 0
  759. align 4
  760. proc get_parent_tiles
  761.   dec tile_zoom
  762.   shr tile_coord_y,1
  763.   shr tile_coord_x,1
  764.   inc ecx
  765.  
  766.   stdcall get_tile_path,edi ;берем путь к тайлу
  767.   stdcall load_new_tile,edi
  768.   cmp tile_err_f,0
  769.   jne @f ;если неудачно открыли то не растягиваем изображение
  770.     or tile_drobn,SCALE_1_USE
  771.     mov ebx,ecx
  772.   .zoom_cycle:
  773.     xor eax,eax
  774.     dec ebx
  775.     bt tile_key_coord_y,ebx
  776.     jae .scale_bot_l
  777.       add eax,RGB_TILE_SIZE_1N2
  778.     .scale_bot_l:
  779.     bt tile_key_coord_x,ebx
  780.     jae .scale_rig_l
  781.       add eax,TILE_LEN_W*3/2
  782.     .scale_rig_l:
  783.     cmp eax,0
  784.     je .scale_top_left
  785.       add eax,tile_rgb_icon
  786.       stdcall mem_copy, eax, tile_rgb_icon, RGB_TILE_SIZE_1N2
  787.     .scale_top_left:
  788.  
  789.     ;растягивание верхней картинки
  790.     stdcall img_rgb_wcrop, tile_rgb_icon,TILE_LEN_W,TILE_LEN_W/2,TILE_LEN_H ;отрезаем лишнее
  791.     stdcall img_rgb_wmul2, tile_rgb_icon,RGB_TILE_SIZE_1N4/3 ;растигиваем по ширине
  792.     stdcall img_rgb_hmul2, tile_rgb_icon,RGB_TILE_SIZE_1N2/3,TILE_LEN_W ;растягиваем по высоте
  793.   loop .zoom_cycle
  794.   @@:
  795.   ret
  796. endp
  797.  
  798. ;tile - указатель на структуру тайла
  799. align 4 ;загружает определенный тайл
  800. proc load_new_tile, tile:dword
  801.   pushad
  802.  
  803.   mov eax,70 ;load icon file
  804.   mov [run_file_70.Function], 0
  805.   mov [run_file_70.Position], 0
  806.   mov [run_file_70.Flags], 0
  807.   mov [run_file_70.Count], RGB_TILE_SIZE+300 ;+54
  808.   m2m [run_file_70.Buffer], [bmp_icon]
  809.   mov byte[run_file_70+20], 0
  810.   mov [run_file_70.FileName], file_name
  811.   mov ebx,run_file_70
  812.   int 0x40
  813.   mov edi,[tile]
  814. ;  cmp ebx,0xffffffff
  815. ;  je .no_load
  816.   cmp al,6 ;ошибка 6 - когда файл закончился раньше чем буфер
  817.   jne @f
  818.     xor al,al ;нам эта ошибка не страшна, потому ставим код равным 0, как при обычном открытии
  819.   @@:
  820.   mov tile_err_f,al
  821.   cmp al,0
  822.   jne .no_load
  823.  
  824.   stdcall dword[img_decode], dword[bmp_icon],ebx,0
  825.   mov dword[data_icon],eax
  826.   stdcall dword[img_to_rgb2], dword[data_icon],tile_rgb_icon
  827.   stdcall dword[img_destroy], dword[data_icon]
  828.     jmp @f
  829.   .no_load:
  830.  
  831.   mov al,byte[map.zoom]
  832.   cmp tile_zoom,al
  833.   jne @f
  834.     mov eax,tile_rgb_icon
  835.     mov bl,tile_err_f
  836.     add bl,'0' ;bl - код ошибки открытия
  837.     mov byte[eax],bl
  838.     inc eax
  839.     mov byte[eax],' '
  840.     inc eax
  841.     stdcall mem_copy, file_name,eax,250 ;копируем путь к файлу при ошибочном открытии
  842.   @@:
  843.   popad
  844.   ret
  845. endp
  846.  
  847. ;функция генерирует часть пути к файлу в виде: \z?\?\x?\?\y?
  848. align 4
  849. proc get_tile_path, tile:dword
  850.   push eax ecx edi esi
  851.     mov ecx,300
  852.     mov edi,txt_tile_path
  853.     @@:
  854.       mov byte[edi],0 ;чистим строку
  855.       inc edi
  856.       loop @b
  857.  
  858.     mov esi,dword[tile] ;берем указатель
  859.  
  860.     mov ecx,0x80000000 ;rol 0x80000000,1 = 1
  861.     xor eax,eax
  862.     mov al,byte[esi+8] ;+8 = zoom
  863.     .calc_coord:
  864.       rol ecx,1 ;ecx = maximum coord
  865.       dec ax
  866.       cmp ax,0
  867.       jg .calc_coord
  868.  
  869.     mov byte[txt_tile_path],'z'
  870.     mov edi,txt_tile_path
  871.     inc edi
  872.     xor eax,eax
  873.     mov al,byte[esi+8] ;+8 = zoom
  874.     call tl_convert_to_str
  875.  
  876.     inc edi
  877.     cmp byte[esi+8],9 ;+8 = zoom
  878.     jle @f
  879.       inc edi
  880.     @@:
  881.     mov byte[edi],'/'
  882.     inc edi
  883.  
  884.     mov eax,[esi] ;coord_x
  885. cmp eax,ecx
  886. jge .out_of_rang ;coord_x больше допустимого значения при заданном масштабе
  887.     shr eax,10
  888.     call tl_convert_to_str
  889.  
  890.     @@:
  891.       inc edi
  892.       cmp byte[edi],'0'
  893.       jge @b
  894.     mov byte[edi],'/'
  895.     inc edi
  896.     mov byte[edi],'x'
  897.     inc edi
  898.  
  899.     mov eax,[esi] ;coord_x
  900.     call tl_convert_to_str
  901.  
  902.     @@:
  903.       inc edi
  904.       cmp byte[edi],'0'
  905.       jl @f
  906.       cmp byte[edi],'9'
  907.       jg @f
  908.       jmp @b
  909.     @@:
  910.  
  911.     ;coord y
  912.     mov byte[edi],'/'
  913.     inc edi
  914.  
  915.     mov eax,[esi+4] ;coord_y
  916. cmp eax,ecx
  917. jge .out_of_rang ;coord_y больше допустимого значения при заданном масштабе
  918.     shr eax,10
  919.     call tl_convert_to_str
  920.  
  921.     @@:
  922.       inc edi
  923.       cmp byte[edi],'0'
  924.       jge @b
  925.     mov byte[edi],'/'
  926.     inc edi
  927.     mov byte[edi],'y'
  928.     inc edi
  929.  
  930.     mov eax,[esi+4] ;coord_y]
  931.     call tl_convert_to_str
  932.  
  933. .out_of_rang:
  934.     call get_all_path
  935.   pop esi edi ecx eax
  936.   ret
  937. endp
  938.  
  939. align 4
  940. get_all_path: ;функция для собирания полного пути из всех кусков
  941.   mov ecx,dword[edit1.text]
  942.   add ecx,dword[edit1.size]
  943.   dec ecx
  944.  
  945.   stdcall [str_copy], file_name,4096-1, dword[edit1.text],dword[edit1.max]
  946.  
  947.   cmp byte[ecx],'/'
  948.   je @f
  949.     stdcall [str_catchar],file_name,4096-1, dword '/'
  950.   @@:
  951.  
  952.   stdcall [str_cat], file_name,4096-1, txt_tile_path,300
  953.   stdcall [str_cat], file_name,4096-1, dword [txt_tile_type],10
  954. ret
  955.