Subversion Repositories Kolibri OS

Rev

Rev 3175 | Go to most recent revision | 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:
1401 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
89
 
5911 IgorA 90
;передвигаем координату курсора вниз
1401 IgorA 91
align 4
5911 IgorA 92
CursorMoveDown:
1401 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
113
 
5911 IgorA 114
;перемещение метки вверх, по списку
1401 IgorA 115
align 4
5911 IgorA 116
but_met_up:
1401 IgorA 117
  stdcall dword[tl_node_move_up], tree2
118
  ret
119
 
5911 IgorA 120
;перемещение метки вниз, по списку?
1401 IgorA 121
align 4
5911 IgorA 122
but_met_dn:
1401 IgorA 123
  stdcall dword[tl_node_move_down], tree2
124
  ret
125
 
5911 IgorA 126
;меняем расширение для карты
1401 IgorA 127
align 4
5911 IgorA 128
fun_new_map_type:
1401 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
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
1401 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
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
1401 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
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
1401 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
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
1401 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
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
1401 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
236
endp
237
 
238
align 4
5911 IgorA 239
proc array_tile_function uses ecx edi, beg_tiles:dword, count:dword, funct:dword
1401 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
247
endp
248
 
249
align 4
250
draw_tiles:
251
pushad
5911 IgorA 252
  movzx ecx,byte[map.zoom]
1401 IgorA 253
  mov esi,[sc.work_text]
254
  or  esi,0x40000000
255
  mov edi,[sc.work]
5911 IgorA 256
  mcall 47,0x20000,, (128 shl 16)+13
1401 IgorA 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
 
1441 IgorA 393
;;;jmp .end_f ;test
1401 IgorA 394
  bt tile_drobn,SCALE_0BIT_USE
395
  jc .end_f
396
  bt tile_drobn,SCALE_1BIT_USE
397
  jc .end_f
398
 
399
    mov ebx,edx
400
    add ebx,0x30003
401
    mov edx,tile_rgb_icon ;при неудачном открытии в tile_rgb_icon путь к файлу
1441 IgorA 402
;;;    mov dword[edx+RGB_TILE_SIZE_1N4],0 ;ставим нули, на случай если в строке с именем файла мусор
1401 IgorA 403
    stdcall [str_len],tile_rgb_icon,RGB_TILE_SIZE_1N4
404
    mov edi,eax
405
 
406
    mov eax,4 ;draw text
407
    mov ecx,0xff
408
;or ecx,0x80000000
409
    mov esi,TILE_TEXT_MAX_LEN
410
 
411
    @@:
412
      cmp edi,TILE_TEXT_MAX_LEN
413
      jg .no_line_last
414
	mov esi,edi
415
	int 0x40
416
	jmp .end_f
417
      .no_line_last:
418
      int 0x40
419
      add edx,esi
420
      sub edi,esi
421
      add ebx,10 ;опускаемся на нижнюю строку
422
      jmp @b
423
  .end_f:
424
  popad
425
  ret
426
endp
427
 
428
;увеличение масштаба
429
align 4
430
but_ZoomP:
431
  cmp byte[map.zoom],24
432
  jge @f
433
    inc byte[map.zoom]
434
    shl dword[map.coord_x],1
435
    shl dword[map.coord_y],1
436
    call but_Refresh
437
  @@:
438
  ret
439
 
440
;уменьшение масштаба
441
align 4
442
but_ZoomM:
443
  cmp byte[map.zoom],1
444
  jle @f
445
    dec byte[map.zoom]
446
    shr dword[map.coord_x],1
447
    shr dword[map.coord_y],1
448
    call but_Refresh
449
  @@:
450
  ret
451
 
5911 IgorA 452
;сохранение файла с метками
1401 IgorA 453
align 4
5911 IgorA 454
but_MetSave:
455
	stdcall dword[tl_save_mem], tree2,0,[bmp_icon],TREE_ICON_SYS16_BMP_SIZE
1401 IgorA 456
 
5911 IgorA 457
	copy_path fn_metki,sys_path,file_name,0
458
	push eax ebx ecx edi
459
		stdcall dword[tl_get_mem_size], tree2,[bmp_icon]
460
		inc eax ;для записи в файл завершающего нуля
1401 IgorA 461
 
5911 IgorA 462
		m2m [run_file_70.Buffer], [bmp_icon]
463
		mov [run_file_70.Function], 2
464
		mov [run_file_70.Position], 0
465
		mov [run_file_70.Flags], 0
466
		mov [run_file_70.Count], eax
467
		mov byte[run_file_70+20], 0
468
		mov [run_file_70.FileName], file_name
469
		mcall 70,run_file_70
470
	pop edi ecx ebx eax
471
	jmp still
1401 IgorA 472
 
5911 IgorA 473
;считываем файл с метками
1401 IgorA 474
align 4
5911 IgorA 475
but_MetLoad:
476
	cmp byte[met_fr_opn],0
477
	jne .end_f
478
	copy_path fn_metki,sys_path,file_name,0
479
	pushad
480
		mov byte[met_fr_opn],1
481
		mov [run_file_70.Function], 0
482
		mov [run_file_70.Position], 0
483
		mov [run_file_70.Flags], 0
484
		mov [run_file_70.Count], TREE_ICON_SYS16_BMP_SIZE
485
		mov byte[run_file_70+20], 0
486
		mov [run_file_70.FileName], file_name
487
		m2m [run_file_70.Buffer], [bmp_icon]
488
		mcall 70,run_file_70
489
		cmp ebx,0xffffffff
490
		je @f
491
			stdcall [tl_load_mem], tree2,0,[bmp_icon],TREE_ICON_SYS16_BMP_SIZE
492
			stdcall [tl_cur_beg], tree2
493
			stdcall [tl_draw], tree2
494
		@@:
495
		mov byte[file_name],0 ;clear file name
496
	popad
497
	.end_f:
498
	ret
1401 IgorA 499
 
5911 IgorA 500
;добавление метки
1401 IgorA 501
align 4
5911 IgorA 502
but_MetAdd:
1401 IgorA 503
  push eax
504
    mov eax,dword[bmp_icon]
505
    m2m dword[eax],  dword[map.coord_x]
506
    m2m dword[eax+4],dword[map.coord_y]
507
    m2m  word[eax+8], word[map.zoom]
508
    add eax,12
509
    stdcall dword[str_copy], eax,30,dword[edit2.text],30
5911 IgorA 510
    stdcall dword[tl_node_add], tree2, 0, dword[bmp_icon]
1401 IgorA 511
    stdcall dword[tl_draw], tree2
512
  pop eax
513
  jmp still
514
 
5911 IgorA 515
;переход к выбранной метке
1401 IgorA 516
align 4
5911 IgorA 517
fun_goto_met:
518
	push eax
519
	stdcall dword[tl_node_get_data], tree2
520
	cmp eax,0
521
	je @f ;курсор не стоит на метке
522
		m2m dword[map.coord_x],dword[eax]
523
		m2m dword[map.coord_y],dword[eax+4]
524
		m2m word[map.zoom],word[eax+8]
525
		call but_Refresh
526
	@@:
527
	pop eax
528
	ret
1401 IgorA 529
 
530
;???
531
align 4
532
but_Refresh:
533
  call fun_new_map_type ;проверяем не поменялся ли тип просматриваемых файлов
534
 
535
  stdcall array_tile_function, tile_00,max_tiles_count,load_tile
536
  stdcall draw_tiles
537
  ret
538
 
539
align 4
5911 IgorA 540
proc tile_init uses eax edi, tile:dword
541
	mov edi,[tile]
542
	stdcall mem.Alloc, RGB_TILE_SIZE+300
543
	mov tile_rgb_icon,eax
544
	stdcall mem.Alloc, RGB_TILE_SIZE
545
	mov tile_drobn_icon,eax
546
	ret
1401 IgorA 547
endp
548
 
549
align 4
5911 IgorA 550
proc tile_destroy uses edi, tile:dword
551
	mov edi,[tile]
552
	stdcall mem.Free,tile_rgb_icon
553
	stdcall mem.Free,tile_drobn_icon
554
	ret
1401 IgorA 555
endp
556
 
557
 
5911 IgorA 558
;загружает тайлы, в определенной области
559
align 4
560
proc load_tile uses eax ebx ecx edi, tile:dword
1401 IgorA 561
  mov edi,dword[tile] ;копируем указатель на структуру тайла, что-бы работали константы
562
 
563
  stdcall mem_copy, map,edi, 9 ;копируем координаты курсора в структуру тайла
564
  xor eax,eax
565
  mov al,tile_delta_x
566
  add tile_coord_x,eax ;сдвигаем координаты тайла, относительно курсора
567
  mov al,tile_delta_y
568
  add tile_coord_y,eax
569
  stdcall get_tile_path,edi    ;берем путь к тайлу
570
 
571
;***
572
  ; проверка координат последней загруженной картинки
573
  mov eax,edi
574
  mov ecx,9
575
  @@:
576
    mov bl,byte[eax+tile_offs_l_load]
577
    cmp byte[eax],bl
578
    jne .st_load
579
    inc eax
580
    loop @b
581
  mov ebx,dword[edit1.size];проверяем также тип карт, который был ранее загружен
582
  cmp tile_key_path_len,bl ;при изменении типа карты нужно также перечитывать файлы
583
  jne .st_load
584
 
585
  jmp @f    ;если координаты совпали то уже не загружаем
586
  .st_load: ;start load tile
587
 
588
  ; установка новых координат для последней загруженной картинки
589
  mov eax,edi
590
  add eax,tile_offs_l_load
591
  stdcall mem_copy, edi,eax,9
592
  mov ebx,dword[edit1.size]
593
  mov tile_key_path_len,bl
594
;***
595
 
596
  ;mov tile_drobn,0
597
  mov tile_drobn,SCALE_0_USE ;ставим флаг открытия картинки текущего уровня
598
  stdcall load_new_tile,edi
1441 IgorA 599
  cmp tile_err_f,0
600
  je @f ;если удачно открыли текущий файл то остальные действия пропускаем
1442 IgorA 601
;  cmp tile_err_f,6
602
;  je @f
1401 IgorA 603
    mov tile_drobn,0
3175 IgorA 604
    bt dword[ch2.flags],1 ;проверяем опцию 'брать снизу'
1401 IgorA 605
    jae .opt_drobn_false
606
 
607
    ;если файл не найден, попадаем сюда
608
    inc tile_zoom
609
    shl tile_coord_y,1
610
    shl tile_coord_x,1
611
    stdcall get_tile_path,edi
612
    stdcall load_new_tile,edi
613
 
1441 IgorA 614
    cmp tile_err_f,0
615
    jne .no_tile_00 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 616
      or tile_drobn,FRACT_TILE_00
617
; 1 сжатие картинки по высоте
618
      stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
619
; 2 сжатие картинки по ширине
620
      stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
621
; 3 копирование 1-й картинки в резервный буфер
622
      stdcall mem_copy, tile_rgb_icon, tile_drobn_icon, RGB_TILE_SIZE_1N4
623
    .no_tile_00:
624
 
625
    ;если файл не найден, попадаем сюда
626
    inc tile_coord_y
627
    stdcall get_tile_path,edi
628
    stdcall load_new_tile,edi
629
 
1441 IgorA 630
    cmp tile_err_f,0
631
    jne .no_tile_01 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 632
;      mov byte[map.drobn],0
633
      or tile_drobn,FRACT_TILE_01
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 копирование 2-й картинки в резервный буфер
639
      mov eax,tile_drobn_icon
640
      add eax,RGB_TILE_SIZE_1N4 ; сдвиг картинки вниз (т. к. она нижняя)
641
      stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4
642
    .no_tile_01:
643
 
644
    ;если файл не найден, попадаем сюда
645
    dec tile_coord_y
646
    inc tile_coord_x
647
    stdcall get_tile_path,edi
648
    stdcall load_new_tile,edi
649
 
1441 IgorA 650
    cmp tile_err_f,0
651
    jne .no_tile_10 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 652
;      mov byte[map.drobn],0
653
      or tile_drobn,FRACT_TILE_10
654
; 1 сжатие картинки по высоте
655
      stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
656
; 2 сжатие картинки по ширине
657
      stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
658
; 3 копирование 3-й картинки в резервный буфер
659
      mov eax,tile_drobn_icon
660
      add eax,RGB_TILE_SIZE_1N2 ; сдвиг картинки вниз (т. к. она нижняя)
661
      stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4
662
    .no_tile_10:
663
 
664
    ;если файл не найден, попадаем сюда
665
    inc tile_coord_y
666
    stdcall get_tile_path,edi
667
    stdcall load_new_tile,edi
668
 
1441 IgorA 669
    cmp tile_err_f,0
670
    jne .no_tile_11 ;если неудачно открыли то не уменьшаем изображение
1401 IgorA 671
;      mov byte[map.drobn],0
672
      or tile_drobn,FRACT_TILE_11
673
; 1 сжатие картинки по высоте
674
      stdcall img_rgb_hdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN, TILE_LEN
675
; 2 сжатие картинки по ширине
676
      stdcall img_rgb_wdiv2, tile_rgb_icon, TILE_LEN*TILE_LEN/2
677
; 3 сдвиг картинки вниз без копирования (т. к. она нижняя)
678
      stdcall img_rgb_hoffs, tile_rgb_icon, TILE_LEN*TILE_LEN/4, TILE_LEN/2, TILE_LEN*3/2
679
 
680
      ;копируем последнюю дробную картинку в буфер drobn_icon
681
      ;в котором уже были сформированы 3 другие
682
      mov eax,tile_drobn_icon
683
      add eax,RGB_TILE_SIZE_1N4*3
684
      stdcall mem_copy, tile_rgb_icon, eax, RGB_TILE_SIZE_1N4
685
    .no_tile_11:
686
  .opt_drobn_false:
687
 
688
 
3175 IgorA 689
  bt dword[ch1.flags],1 ;проверяем опцию 'брать сверху'
1401 IgorA 690
  jae @f
691
  cmp tile_drobn,FRACT_TILE_ALL ;если собрана вся картинка, то сверху уже не берем
692
  je @f
693
    ;не знаем была-ли включена опция 'брать снизу', для которой изменялись координаты
694
    ;потому опять копируем координаты курсора в структуру тайла
695
    stdcall mem_copy, map,edi, 9
696
    xor eax,eax
697
    mov al,tile_delta_x
698
    add tile_coord_x,eax ;сдвигаем координаты тайла, относительно курсора
699
    mov al,tile_delta_y
700
    add tile_coord_y,eax
701
 
702
    xor ecx,ecx
703
    .zoom:
704
      cmp tile_zoom,0
705
      je @f ;просматривается самая верхняя картинка, выходим
706
      call get_parent_tiles ;циклический просмотр родительских тайлов
707
      bt tile_drobn,SCALE_1BIT_USE
708
      jc @f
709
      cmp ecx,5 ;5 - ограничение на степень растягивания картинки
710
      je @f
711
      jmp .zoom
712
    @@:
713
 
714
  ret
715
endp
716
 
717
;output:
718
;ecx - if not file = count parent levels else = 0
719
align 4
720
proc get_parent_tiles
721
  dec tile_zoom
722
  shr tile_coord_y,1
723
  shr tile_coord_x,1
724
  inc ecx
725
 
726
  stdcall get_tile_path,edi ;берем путь к тайлу
727
  stdcall load_new_tile,edi
1441 IgorA 728
  cmp tile_err_f,0
729
  jne @f ;если неудачно открыли то не растягиваем изображение
1401 IgorA 730
    or tile_drobn,SCALE_1_USE
731
    mov ebx,ecx
732
  .zoom_cycle:
733
    xor eax,eax
734
    dec ebx
735
    bt tile_key_coord_y,ebx
736
    jae .scale_bot_l
737
      add eax,RGB_TILE_SIZE_1N2
738
    .scale_bot_l:
739
    bt tile_key_coord_x,ebx
740
    jae .scale_rig_l
741
      add eax,TILE_LEN_W*3/2
742
    .scale_rig_l:
743
    cmp eax,0
744
    je .scale_top_left
745
      add eax,tile_rgb_icon
746
      stdcall mem_copy, eax, tile_rgb_icon, RGB_TILE_SIZE_1N2
747
    .scale_top_left:
748
 
749
    ;растягивание верхней картинки
750
    stdcall img_rgb_wcrop, tile_rgb_icon,TILE_LEN_W,TILE_LEN_W/2,TILE_LEN_H ;отрезаем лишнее
751
    stdcall img_rgb_wmul2, tile_rgb_icon,RGB_TILE_SIZE_1N4/3 ;растигиваем по ширине
752
    stdcall img_rgb_hmul2, tile_rgb_icon,RGB_TILE_SIZE_1N2/3,TILE_LEN_W ;растягиваем по высоте
753
  loop .zoom_cycle
754
  @@:
755
  ret
756
endp
757
 
758
;tile - указатель на структуру тайла
759
align 4 ;загружает определенный тайл
760
proc load_new_tile, tile:dword
761
  pushad
762
 
1464 IgorA 763
  mov [run_file_70.Function], 0
764
  mov [run_file_70.Position], 0
765
  mov [run_file_70.Flags], 0
766
  mov [run_file_70.Count], RGB_TILE_SIZE+300 ;+54
767
  m2m [run_file_70.Buffer], [bmp_icon]
768
  mov byte[run_file_70+20], 0
769
  mov [run_file_70.FileName], file_name
5911 IgorA 770
  mcall 70,run_file_70
1401 IgorA 771
  mov edi,[tile]
1441 IgorA 772
;  cmp ebx,0xffffffff
773
;  je .no_load
1442 IgorA 774
  cmp al,6 ;ошибка 6 - когда файл закончился раньше чем буфер
775
  jne @f
776
    xor al,al ;нам эта ошибка не страшна, потому ставим код равным 0, как при обычном открытии
777
  @@:
778
  mov tile_err_f,al
779
  cmp al,0
1441 IgorA 780
  jne .no_load
1401 IgorA 781
 
782
  stdcall dword[img_decode], dword[bmp_icon],ebx,0
783
  mov dword[data_icon],eax
784
  stdcall dword[img_to_rgb2], dword[data_icon],tile_rgb_icon
785
  stdcall dword[img_destroy], dword[data_icon]
786
    jmp @f
787
  .no_load:
788
 
789
  mov al,byte[map.zoom]
790
  cmp tile_zoom,al
791
  jne @f
1442 IgorA 792
    mov eax,tile_rgb_icon
793
    mov bl,tile_err_f
794
    add bl,'0' ;bl - код ошибки открытия
795
    mov byte[eax],bl
796
    inc eax
797
    mov byte[eax],' '
798
    inc eax
799
    stdcall mem_copy, file_name,eax,250 ;копируем путь к файлу при ошибочном открытии
1401 IgorA 800
  @@:
801
  popad
802
  ret
803
endp
804
 
805
;функция генерирует часть пути к файлу в виде: \z?\?\x?\?\y?
806
align 4
5911 IgorA 807
proc get_tile_path uses eax ecx edi esi, tile:dword
1401 IgorA 808
    mov ecx,300
809
    mov edi,txt_tile_path
810
    @@:
811
      mov byte[edi],0 ;чистим строку
812
      inc edi
813
      loop @b
814
 
815
    mov esi,dword[tile] ;берем указатель
816
 
817
    mov ecx,0x80000000 ;rol 0x80000000,1 = 1
818
    xor eax,eax
819
    mov al,byte[esi+8] ;+8 = zoom
820
    .calc_coord:
821
      rol ecx,1 ;ecx = maximum coord
822
      dec ax
823
      cmp ax,0
824
      jg .calc_coord
825
 
826
    mov byte[txt_tile_path],'z'
827
    mov edi,txt_tile_path
828
    inc edi
829
    xor eax,eax
830
    mov al,byte[esi+8] ;+8 = zoom
5911 IgorA 831
    stdcall convert_int_to_str, 300
1401 IgorA 832
 
833
    inc edi
834
    cmp byte[esi+8],9 ;+8 = zoom
835
    jle @f
836
      inc edi
837
    @@:
838
    mov byte[edi],'/'
839
    inc edi
840
 
841
    mov eax,[esi] ;coord_x
842
cmp eax,ecx
843
jge .out_of_rang ;coord_x больше допустимого значения при заданном масштабе
844
    shr eax,10
5911 IgorA 845
    stdcall convert_int_to_str, 300
1401 IgorA 846
 
847
    @@:
848
      inc edi
849
      cmp byte[edi],'0'
850
      jge @b
851
    mov byte[edi],'/'
852
    inc edi
853
    mov byte[edi],'x'
854
    inc edi
855
 
856
    mov eax,[esi] ;coord_x
5911 IgorA 857
    stdcall convert_int_to_str, 300
1401 IgorA 858
 
859
    @@:
860
      inc edi
861
      cmp byte[edi],'0'
862
      jl @f
863
      cmp byte[edi],'9'
864
      jg @f
865
      jmp @b
866
    @@:
867
 
868
    ;coord y
869
    mov byte[edi],'/'
870
    inc edi
871
 
872
    mov eax,[esi+4] ;coord_y
873
cmp eax,ecx
874
jge .out_of_rang ;coord_y больше допустимого значения при заданном масштабе
875
    shr eax,10
5911 IgorA 876
    stdcall convert_int_to_str, 300
1401 IgorA 877
 
878
    @@:
879
      inc edi
880
      cmp byte[edi],'0'
881
      jge @b
882
    mov byte[edi],'/'
883
    inc edi
884
    mov byte[edi],'y'
885
    inc edi
886
 
887
    mov eax,[esi+4] ;coord_y]
5911 IgorA 888
    stdcall convert_int_to_str, 300
1401 IgorA 889
 
890
.out_of_rang:
891
    call get_all_path
892
  ret
893
endp
894
 
895
align 4
896
get_all_path: ;функция для собирания полного пути из всех кусков
897
  mov ecx,dword[edit1.text]
898
  add ecx,dword[edit1.size]
899
  dec ecx
900
 
901
  stdcall [str_copy], file_name,4096-1, dword[edit1.text],dword[edit1.max]
902
 
903
  cmp byte[ecx],'/'
904
  je @f
905
    stdcall [str_catchar],file_name,4096-1, dword '/'
906
  @@:
907
 
908
  stdcall [str_cat], file_name,4096-1, txt_tile_path,300
909
  stdcall [str_cat], file_name,4096-1, dword [txt_tile_type],10
1441 IgorA 910
ret