Subversion Repositories Kolibri OS

Rev

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