Subversion Repositories Kolibri OS

Rev

Rev 1441 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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