Subversion Repositories Kolibri OS

Rev

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