Subversion Repositories Kolibri OS

Rev

Rev 5911 | Details | Compare with Previous | 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
 
1442 IgorA 49
; *** порядок вызова функций при загрузке тайлов ***
1441 IgorA 50
;load_tile
1464 IgorA 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 (верхняя картинка)
1441 IgorA 64
 
65
 
5911 IgorA 66
;передвигаем координату курсора вправо
1401 IgorA 67
align 4
5911 IgorA 68
CursorMoveRight:
6238 IgorA 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
1401 IgorA 89
 
5911 IgorA 90
;передвигаем координату курсора вниз
1401 IgorA 91
align 4
5911 IgorA 92
CursorMoveDown:
6238 IgorA 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
1401 IgorA 113
 
5911 IgorA 114
;перемещение метки вверх, по списку
1401 IgorA 115
align 4
5911 IgorA 116
but_met_up:
6238 IgorA 117
	stdcall dword[tl_node_move_up], tree2
118
	ret
1401 IgorA 119
 
5911 IgorA 120
;перемещение метки вниз, по списку?
1401 IgorA 121
align 4
5911 IgorA 122
but_met_dn:
6238 IgorA 123
	stdcall dword[tl_node_move_down], tree2
124
	ret
1401 IgorA 125
 
5911 IgorA 126
;меняем расширение для карты
1401 IgorA 127
align 4
5911 IgorA 128
fun_new_map_type:
6238 IgorA 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
1401 IgorA 137
 
138
;задаем расположение тайлов по сетке
139
align 4
5911 IgorA 140
proc tiles_init_grid uses eax ebx ecx edx edi, beg_tiles:dword, count:dword, cols:dword
6238 IgorA 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
1401 IgorA 158
endp
159
 
160
;сдвигаем сетку влево, вылезшие столбцы будут перекинуты на правую сторону
161
;функция нужна для оптимизации обращения к диску, при движении курсора мы двигаем
162
;тайлы в противоположную сторону, в результате координаты большинства тайлов не меняются
163
;а значит программа не будет перечитывать их заново, чем и достигается оптимизация
164
align 4
5911 IgorA 165
proc tiles_grid_move_left uses eax ebx ecx edx edi, beg_tiles:dword, count:dword, cols:dword
6238 IgorA 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
1401 IgorA 180
endp
181
 
182
;сдвигаем сетку вправо, вылезшие столбцы будут перекинуты на левую сторону
183
;делает тоже что и tiles_grid_move_left только двигает координаты в другую сторону
184
align 4
5911 IgorA 185
proc tiles_grid_move_right uses eax ebx ecx edx edi, beg_tiles:dword, count:dword, cols:dword
6238 IgorA 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
1401 IgorA 200
endp
201
 
202
align 4
5911 IgorA 203
proc tiles_grid_move_up uses eax ebx ecx edx edi, beg_tiles:dword, count:dword, rows:dword
6238 IgorA 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
1401 IgorA 218
endp
219
 
220
align 4
5911 IgorA 221
proc tiles_grid_move_down uses eax ebx ecx edx edi, beg_tiles:dword, count:dword, rows:dword
6238 IgorA 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
1401 IgorA 236
endp
237
 
238
align 4
5911 IgorA 239
proc array_tile_function uses ecx edi, beg_tiles:dword, count:dword, funct:dword
6238 IgorA 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
1401 IgorA 247
endp
248
 
249
align 4
250
draw_tiles:
251
pushad
6238 IgorA 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
1401 IgorA 257
 
6238 IgorA 258
	stdcall array_tile_function, tile_00,max_tiles_count,draw_tile
1401 IgorA 259
popad
6238 IgorA 260
	ret
1401 IgorA 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
6238 IgorA 269
pushad
270
	mov cx,dx
271
	shl ecx,16
272
	mov cx,word[height]
1401 IgorA 273
 
6238 IgorA 274
	shr edx,16
275
	mov bx,dx
276
	shl ebx,16
277
	mov bx,TILE_LEN_W
1401 IgorA 278
 
6238 IgorA 279
	mov edx,0xffffd0
280
	mcall SF_DRAW_RECT
281
popad
282
	ret
1401 IgorA 283
endp
284
 
6238 IgorA 285
;нарисовать один tile
1401 IgorA 286
align 4
287
proc draw_tile, tile:dword
6238 IgorA 288
pushad
289
	mov edi,[tile]
1401 IgorA 290
 
291
;*** set base point ***
6238 IgorA 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
1401 IgorA 299
;*** set base point ***
300
 
6238 IgorA 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
1401 IgorA 307
 
6238 IgorA 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-рамка
1401 IgorA 315
 
6238 IgorA 316
	cmp ecx,eax
317
	jle .end_f
1401 IgorA 318
 
6238 IgorA 319
	sub ecx,eax
320
	cmp ecx,TILE_LEN_H
321
	jle @f
322
		mov ecx,TILE_LEN_H
323
	@@:
1401 IgorA 324
 
6238 IgorA 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:
1401 IgorA 341
 
6238 IgorA 342
	cmp tile_drobn,0
343
	je .info ;если нет ни одной дробной картинки
1401 IgorA 344
 
6238 IgorA 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
	@@:
1401 IgorA 351
 
6238 IgorA 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
	@@:
1401 IgorA 367
 
6238 IgorA 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
	@@:
1401 IgorA 377
 
6238 IgorA 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
1401 IgorA 386
 
6238 IgorA 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 путь к файлу
1441 IgorA 395
;;;    mov dword[edx+RGB_TILE_SIZE_1N4],0 ;ставим нули, на случай если в строке с именем файла мусор
6238 IgorA 396
		stdcall [str_len],tile_rgb_icon,RGB_TILE_SIZE_1N4
397
		mov edi,eax
1401 IgorA 398
 
6238 IgorA 399
		mov eax,SF_DRAW_TEXT
400
		mov ecx,0xff
1401 IgorA 401
;or ecx,0x80000000
6238 IgorA 402
		mov esi,TILE_TEXT_MAX_LEN
1401 IgorA 403
 
6238 IgorA 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
1401 IgorA 419
endp
420
 
421
;увеличение масштаба
422
align 4
423
but_ZoomP:
6238 IgorA 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
1401 IgorA 432
 
433
;уменьшение масштаба
434
align 4
435
but_ZoomM:
6238 IgorA 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
1401 IgorA 444
 
5911 IgorA 445
;сохранение файла с метками
1401 IgorA 446
align 4
5911 IgorA 447
but_MetSave:
448
	stdcall dword[tl_save_mem], tree2,0,[bmp_icon],TREE_ICON_SYS16_BMP_SIZE
1401 IgorA 449
 
5911 IgorA 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 ;для записи в файл завершающего нуля
1401 IgorA 454
 
5911 IgorA 455
		m2m [run_file_70.Buffer], [bmp_icon]
6238 IgorA 456
		mov [run_file_70.Function], SSF_CREATE_FILE
5911 IgorA 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
6238 IgorA 462
		mcall SF_FILE,run_file_70
5911 IgorA 463
	pop edi ecx ebx eax
464
	jmp still
1401 IgorA 465
 
5911 IgorA 466
;считываем файл с метками
1401 IgorA 467
align 4
5911 IgorA 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
6238 IgorA 474
		mov [run_file_70.Function], SSF_READ_FILE
5911 IgorA 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]
6238 IgorA 481
		mcall SF_FILE,run_file_70
5911 IgorA 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
1401 IgorA 492
 
5911 IgorA 493
;добавление метки
1401 IgorA 494
align 4
5911 IgorA 495
but_MetAdd:
6238 IgorA 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
1401 IgorA 507
 
5911 IgorA 508
;переход к выбранной метке
1401 IgorA 509
align 4
5911 IgorA 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
1401 IgorA 522
 
6238 IgorA 523
;обновить карту
1401 IgorA 524
align 4
525
but_Refresh:
6238 IgorA 526
	call fun_new_map_type ;проверяем не поменялся ли тип просматриваемых файлов
1401 IgorA 527
 
6238 IgorA 528
	stdcall array_tile_function, tile_00,max_tiles_count,load_tile
529
	stdcall draw_tiles
530
	ret
1401 IgorA 531
 
532
align 4
5911 IgorA 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
1401 IgorA 540
endp
541
 
542
align 4
5911 IgorA 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
1401 IgorA 548
endp
549
 
550
 
5911 IgorA 551
;загружает тайлы, в определенной области
552
align 4
553
proc load_tile uses eax ebx ecx edi, tile:dword
1401 IgorA 554
  mov edi,dword[tile] ;копируем указатель на структуру тайла, что-бы работали константы
555
 
556
  stdcall mem_copy, map,edi, 9 ;копируем координаты курсора в структуру тайла
6238 IgorA 557
  movzx eax,tile_delta_x
1401 IgorA 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
1441 IgorA 591
  cmp tile_err_f,0
592
  je @f ;если удачно открыли текущий файл то остальные действия пропускаем
1442 IgorA 593
;  cmp tile_err_f,6
594
;  je @f
1401 IgorA 595
    mov tile_drobn,0
3175 IgorA 596
    bt dword[ch2.flags],1 ;проверяем опцию 'брать снизу'
1401 IgorA 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
 
1441 IgorA 606
    cmp tile_err_f,0
607
    jne .no_tile_00 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 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
 
1441 IgorA 622
    cmp tile_err_f,0
623
    jne .no_tile_01 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 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
 
1441 IgorA 642
    cmp tile_err_f,0
643
    jne .no_tile_10 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 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
 
1441 IgorA 661
    cmp tile_err_f,0
662
    jne .no_tile_11 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 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
 
6238 IgorA 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
1401 IgorA 692
 
6238 IgorA 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
	@@:
1401 IgorA 704
 
6238 IgorA 705
	ret
1401 IgorA 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
1441 IgorA 719
  cmp tile_err_f,0
720
  jne @f ;если неудачно открыли то не растягиваем изображение
1401 IgorA 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
 
6238 IgorA 754
  mov [run_file_70.Function], SSF_READ_FILE
1464 IgorA 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
6238 IgorA 761
  mcall SF_FILE,run_file_70
1401 IgorA 762
  mov edi,[tile]
1441 IgorA 763
;  cmp ebx,0xffffffff
764
;  je .no_load
1442 IgorA 765
  cmp al,6 ;ошибка 6 - когда файл закончился раньше чем буфер
766
  jne @f
767
    xor al,al ;нам эта ошибка не страшна, потому ставим код равным 0, как при обычном открытии
768
  @@:
769
  mov tile_err_f,al
770
  cmp al,0
1441 IgorA 771
  jne .no_load
1401 IgorA 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
1442 IgorA 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 ;копируем путь к файлу при ошибочном открытии
1401 IgorA 791
  @@:
792
  popad
793
  ret
794
endp
795
 
796
;функция генерирует часть пути к файлу в виде: \z?\?\x?\?\y?
797
align 4
5911 IgorA 798
proc get_tile_path uses eax ecx edi esi, tile:dword
6238 IgorA 799
	mov ecx,300
800
	mov edi,txt_tile_path
801
	@@:
802
		mov byte[edi],0 ;чистим строку
803
		inc edi
804
		loop @b
1401 IgorA 805
 
6238 IgorA 806
	mov esi,[tile] ;берем указатель
1401 IgorA 807
 
6238 IgorA 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
1401 IgorA 815
 
6238 IgorA 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
1401 IgorA 821
 
6238 IgorA 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
1401 IgorA 829
 
6238 IgorA 830
	mov eax,[esi] ;coord_x
1401 IgorA 831
cmp eax,ecx
832
jge .out_of_rang ;coord_x больше допустимого значения при заданном масштабе
6238 IgorA 833
	shr eax,10
834
	stdcall convert_int_to_str, 300
1401 IgorA 835
 
6238 IgorA 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
1401 IgorA 844
 
6238 IgorA 845
	mov eax,[esi] ;coord_x
846
	stdcall convert_int_to_str, 300
1401 IgorA 847
 
6238 IgorA 848
	@@:
849
		inc edi
850
		cmp byte[edi],'0'
851
		jl @f
852
		cmp byte[edi],'9'
853
		jg @f
854
		jmp @b
855
	@@:
1401 IgorA 856
 
6238 IgorA 857
	;coord y
858
	mov byte[edi],'/'
859
	inc edi
1401 IgorA 860
 
6238 IgorA 861
	mov eax,[esi+4] ;coord_y
1401 IgorA 862
cmp eax,ecx
863
jge .out_of_rang ;coord_y больше допустимого значения при заданном масштабе
6238 IgorA 864
	shr eax,10
865
	stdcall convert_int_to_str, 300
1401 IgorA 866
 
6238 IgorA 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
1401 IgorA 875
 
6238 IgorA 876
	mov eax,[esi+4] ;coord_y]
877
	stdcall convert_int_to_str, 300
1401 IgorA 878
 
879
.out_of_rang:
6238 IgorA 880
	call get_all_path
881
	ret
1401 IgorA 882
endp
883
 
884
align 4
885
get_all_path: ;функция для собирания полного пути из всех кусков
6238 IgorA 886
	mov ecx,[edit1.text]
887
	add ecx,[edit1.size]
888
	dec ecx
1401 IgorA 889
 
6238 IgorA 890
	stdcall [str_copy], file_name,4096-1, [edit1.text],[edit1.max]
1401 IgorA 891
 
6238 IgorA 892
	cmp byte[ecx],'/'
893
	je @f
894
		stdcall [str_catchar],file_name,4096-1, dword '/'
895
	@@:
1401 IgorA 896
 
6238 IgorA 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