Subversion Repositories Kolibri OS

Rev

Rev 3014 | Rev 6238 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1401 IgorA 1
;Огромная благодарность Maxxxx32, Diamond, Heavyiron
2
;и другим программистам, а также
3
;Теплову Алексею ( www.lrz.land.ru)
4
use32
5
  org 0x0
6
  db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
7
  dd 0x1
8
  dd start
9
  dd i_end ; размер приложения
10
  dd mem
11
  dd stacktop
12
  dd 0x0
13
  dd sys_path
14
 
15
include '../../proc32.inc'
16
include '../../macros.inc'
3014 dunkaist 17
include '../../dll.inc'
1401 IgorA 18
 
19
include '../../develop/libraries/box_lib/load_lib.mac'
1432 mario79 20
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
1401 IgorA 21
 
22
min_window_w equ 485 ;минимальная ширина окна
23
min_window_h equ 325 ;минимальная высота окна
24
otst_panel_left equ 265
25
 
26
include 'tile_fun.inc'
27
include 'pl_import.inc'
28
 
1488 IgorA 29
  @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc, dll.Load
1401 IgorA 30
 
1464 IgorA 31
struct FileInfoBlock
32
	Function dd ?
33
	Position dd ?
34
	Flags	 dd ?
35
	Count	 dd ?
36
	Buffer	 dd ?
37
		db ?
38
	FileName dd ?
1401 IgorA 39
ends
40
 
41
fn_metki db 'pl_metki.lst',0
42
fn_icon1 db 'tl_sys_16.png',0
43
fn_icon2 db 'tl_nod_16.bmp',0
44
 
45
ini_name db 'planet_v.ini',0
46
ini_sec  db 'Map',0
47
ini_k_cache db 'Cache',0
48
ini_def_cache db '/cache/sat',0
49
ini_ext  db 'ext'
50
.number  db '?'
51
.def db 0 ;расширение по умолчанию
52
 
53
 
54
align 4
55
start:
56
  load_libraries l_libs_start,load_lib_end
57
 
58
;проверка на сколько удачно загузилась наша либа
59
	mov	ebp,lib0
60
	cmp	dword [ebp+ll_struc_size-4],0
61
	jz	@f
62
	mcall	-1	;exit not correct
63
@@:
64
	mov	ebp,lib1
65
	cmp	dword [ebp+ll_struc_size-4],0
66
	jz	@f
67
	mcall	-1	;exit not correct
68
@@:
69
	mov	ebp,lib2
70
	cmp	dword [ebp+ll_struc_size-4],0
71
	jz	@f
72
	mcall	-1	;exit not correct
73
@@:
74
	mov	ebp,lib3
75
	cmp	dword [ebp+ll_struc_size-4],0
76
	jz	@f
77
	mcall	-1	;exit not correct
78
@@:
79
 
80
  copy_path ini_name,sys_path,file_name,0x0
81
  stdcall dword[ini_get_str],file_name,ini_sec,ini_k_cache,dword[edit1.text],dword[edit1.max],ini_def_cache
82
  stdcall [str_len],dword[edit1.text],dword[edit1.max]
83
  mov dword[edit1.size],eax
84
  mov dword[edit1.pos],eax
85
 
86
  stdcall dword[tl_data_init], tree1
87
  stdcall dword[tl_data_init], tree2
88
 
89
;считываем расширения карт из *.ini файла
90
  mov byte[ini_ext.number],'0'
91
@@: ;считываем параметры от ext1 до ext9
92
  inc byte[ini_ext.number]
93
  stdcall dword[ini_get_str],file_name,ini_sec,ini_ext,txt_tile_type_0,dword[tree1.info_capt_len],ini_ext.def
94
  cmp byte[txt_tile_type_0],0
95
  je @f
96
    stdcall dword[tl_node_add], txt_tile_type_0, 0, tree1
97
  jmp @b
98
@@:
99
  mov byte[ini_ext.number],'0' ;считываем параметр от ext0 который будет выбран в списке
100
  stdcall dword[ini_get_str],file_name,ini_sec,ini_ext,txt_tile_type_0,dword[tree1.info_capt_len],ini_ext.def
101
  cmp byte[txt_tile_type_0],0
102
  jne @f
103
    mov dword[txt_tile_type_0],'.bmp' ;если в *.ini файле ничего нет добавляем расширение .bmp
104
  @@:
105
  stdcall dword[tl_node_add], txt_tile_type_0, 0, tree1
106
 
107
; init bmp file
1467 IgorA 108
  stdcall mem.Alloc, dword RGB_TILE_SIZE+300 ;300 - запасные байты с учетом заголовка bmp файла
1401 IgorA 109
  mov [bmp_icon],eax
110
 
111
  stdcall array_tile_function, tile_00,max_tiles_count,tile_init
112
  stdcall tiles_init_grid, tile_00,max_tiles_count,max_tiles_cols
113
 
1467 IgorA 114
  stdcall mem.Alloc, dword TREE_ICON_SYS16_BMP_SIZE
1401 IgorA 115
  mov [tree_sys_icon],eax
116
 
1467 IgorA 117
  stdcall mem.Alloc, dword TREE_ICON_NOD16_BMP_SIZE
1401 IgorA 118
  mov [tree_nod_icon],eax
119
 
120
  copy_path fn_icon1,sys_path,file_name,0x0
121
  mov eax,70 ;load icon file
1464 IgorA 122
  mov [run_file_70.Function], 0
123
  mov [run_file_70.Position], 0
124
  mov [run_file_70.Flags], 0
125
  mov [run_file_70.Count], TREE_ICON_SYS16_BMP_SIZE
126
  m2m [run_file_70.Buffer], [tree_sys_icon]
127
  mov byte[run_file_70+20], 0
128
  mov [run_file_70.FileName], file_name
1401 IgorA 129
  mov ebx,run_file_70
130
  int 0x40
131
  cmp ebx,0xffffffff
132
  je @f
133
    stdcall dword[img_decode], dword[tree_sys_icon],ebx,0
134
    mov dword[data_icon],eax
135
    stdcall dword[img_to_rgb2], dword[data_icon],dword[tree_sys_icon]
136
    stdcall dword[img_destroy], dword[data_icon]
137
 
138
    m2m dword[tree1.data_img_sys],dword[tree_sys_icon]
139
    m2m dword[tree2.data_img_sys],dword[tree_sys_icon]
140
  @@:
141
 
142
 
143
  copy_path fn_icon2,sys_path,file_name,0x0
144
  mov eax,70 ;load icon file
1464 IgorA 145
  mov [run_file_70.Count], TREE_ICON_NOD16_BMP_SIZE
146
  m2m [run_file_70.Buffer], [tree_nod_icon]
1401 IgorA 147
  mov ebx,run_file_70
148
  int 0x40
149
  cmp ebx,0xffffffff
150
  je @f
151
    stdcall dword[img_decode], dword[tree_nod_icon],ebx,0
152
    mov dword[data_icon],eax
153
    stdcall dword[img_to_rgb2], dword[data_icon],dword[tree_nod_icon]
154
    stdcall dword[img_destroy], dword[data_icon]
155
 
156
    m2m dword[tree1.data_img],dword[tree_nod_icon]
157
    m2m dword[tree2.data_img],dword[tree_nod_icon]
158
  @@:
159
 
3175 IgorA 160
  mcall 40,0x27 ;маска системных событий
161
  init_checkboxes2 ch1,checkboxes_end
1401 IgorA 162
 
163
  mcall 48,3,sc,sizeof.system_colors
164
  ;установка системных цветов
165
  edit_boxes_set_sys_color edit1,editboxes_end,sc
3175 IgorA 166
  check_boxes_set_sys_color2 ch1,checkboxes_end,sc
1401 IgorA 167
 
168
  mov byte[file_name],0
169
 
1467 IgorA 170
  ; OpenDialog initialisation
1584 IgorA 171
  stdcall [OpenDialog_Init],OpenDialog_data
1467 IgorA 172
 
173
align 4
1401 IgorA 174
red_win:
1467 IgorA 175
  call draw_window
1401 IgorA 176
  call but_MetLoad
2078 Albom 177
  call but_Refresh ; Auto Refresh after program start
1401 IgorA 178
 
1467 IgorA 179
align 4
1401 IgorA 180
still:
181
  mov eax,10
182
  mcall
183
 
184
  cmp al,0x1 ;изм. положение окна
185
  jz red_win
186
  cmp al,0x2
187
  jz key
188
  cmp al,0x3
189
  jz button
190
 
191
  push dword ch2
192
  call [check_box_mouse]
193
  push dword ch1
194
  call [check_box_mouse]
195
 
196
  stdcall [edit_box_mouse], edit1
197
  stdcall [edit_box_mouse], edit2
198
 
199
  stdcall [tl_mouse], tree1
200
  stdcall [tl_mouse], tree2
201
 
202
  jmp still
203
 
1467 IgorA 204
align 4
1401 IgorA 205
key:
206
  push eax ebx
207
  mcall 2
208
  stdcall [edit_box_key], edit1
209
  stdcall [edit_box_key], edit2
210
 
211
  push dword tree1
212
  call [tl_key]
213
  push dword tree2
214
  call [tl_key]
215
 
1467 IgorA 216
  mov ebx,dword[el_focus] ;что-бы карта не двигалась если окна treelist в фокусе
1401 IgorA 217
  cmp ebx, dword tree1
218
  je .end_f
219
  cmp ebx, dword tree2
220
  je .end_f
221
 
1467 IgorA 222
  ;что-бы карта не двигалась если текстовые поля в фокусе
1401 IgorA 223
  test word[edit1.flags],10b ;ed_focus
224
  jne .end_f
225
  test word[edit2.flags],10b ;ed_focus
226
  jne .end_f
227
 
228
    cmp ah,179 ;Right
229
    jne @f
230
      call CursorMoveRight
231
    @@:
232
    cmp ah,176 ;Left
233
    jne @f
234
    cmp dword[map.coord_x],0
235
    je @f
236
      dec dword[map.coord_x]
237
      ;сдвигаем сетку тайлов вправо, что-бы часть тайлов совпали и пришлось меньше загружать новых
238
      stdcall tiles_grid_move_right, tile_00,max_tiles_count,max_tiles_cols
239
      call but_Refresh
240
    @@:
241
    cmp ah,177 ;Down
242
    jne @f
243
      call CursorMoveDown
244
    @@:
245
    cmp ah,178 ;Up
246
    jne @f
247
    cmp dword[map.coord_y],0
248
    je @f
249
      dec dword[map.coord_y]
250
      ;сдвигаем сетку тайлов вниз
251
      stdcall tiles_grid_move_down, tile_00,max_tiles_count,max_tiles_rows
252
      call but_Refresh
253
    @@:
254
 
255
    cmp ah,45 ;-
256
    jne @f
257
      call but_ZoomM
258
    @@:
259
    cmp ah,61 ;+
260
    jne @f
261
      call but_ZoomP
262
    @@:
263
 
264
  .end_f:
265
  pop ebx eax
266
  jmp still
267
 
268
 
269
align 4
1467 IgorA 270
draw_window:
1401 IgorA 271
pushad
272
  mcall 12,1
273
 
274
  xor eax,eax
275
  mov ebx,20*65536+min_window_w
276
  mov ecx,20*65536+min_window_h
277
  mov edx,[sc.work]
278
  or  edx,0x33000000
279
  mov edi,hed
280
  mcall
281
 
282
  mcall 9,procinfo,-1
283
 
284
  cmp dword[procinfo.box.width],min_window_w ; проверяем ширину окна
285
  jge @f
286
    mov dword[procinfo.box.width],min_window_w ; если окно очень узкое, увеличиваем ширину для избежания глюков
287
  @@:
288
 
289
  mov edi,dword[procinfo.box.width]
290
  sub edi,min_window_w-otst_panel_left
291
  mov dword[tree1.box_left],edi
292
  mov dword[tree2.box_left],edi
293
 
294
  mov eax,dword[tree2.box_left] ;двигаем скроллинг
295
  add eax,dword[tree2.box_width]
296
  mov ebx,dword[tree2.p_scrol]
297
  mov word[ebx+2],ax
298
 
299
  mov dword[edit2.left],edi
300
  add dword[edit2.left],370-otst_panel_left
301
 
302
  stdcall dword[tl_draw],dword tree1
303
  stdcall dword[tl_draw],dword tree2
304
  mov dword[wScrMetki.all_redraw],1
1467 IgorA 305
  stdcall [scrollbar_ver_draw], dword wScrMetki
1401 IgorA 306
 
307
  mov eax,8 ;кнопка
308
  mov ebx,145*65536+20
309
  mov ecx,5*65536+25
310
  mov edx,6
311
  mov esi,[sc.work_button]
312
  int 0x40
313
 
314
  mov ebx,100*65536+20
315
  mov ecx,5*65536+25
316
  mov edx,5
317
  int 0x40
318
 
1467 IgorA 319
  mov ebx,170*65536+40 ;кнопка вызова диалога OpenDial
320
  ;mov ecx,5*65536+25
321
  mov edx,13
322
  int 0x40
323
 
1401 IgorA 324
  mov bx,di
325
  shl ebx,16
326
  mov bx,100
327
  mov ecx,265*65536+25
328
  mov edx,9
329
  int 0x40
330
 
331
  ;ebx ...
332
  mov ecx,235*65536+25
333
  mov edx,8
334
  int 0x40
335
 
336
  mov bx,di
337
  add bx,410-otst_panel_left
338
  shl ebx,16
339
  mov bx,55
340
  ;mov ebx,410*65536+55
341
  mov ecx,5*65536+25
342
  mov edx,7
343
  int 0x40
344
 
345
  mov bx,di
346
  add bx,440-otst_panel_left
347
  shl ebx,16
348
  mov bx,30
349
  ;mov ebx,440*65536+30
350
  mov ecx,265*65536+25
351
  mov edx,12
352
  int 0x40
353
 
354
  mov bx,di
355
  add bx,405-otst_panel_left
356
  shl ebx,16
357
  mov bx,30
358
  ;mov ebx,405*65536+30
1467 IgorA 359
  ;mov ecx,265*65536+25
1401 IgorA 360
  mov edx,11
361
  int 0x40
362
 
363
  mov bx,di
364
  add bx,370-otst_panel_left
365
  shl ebx,16
366
  mov bx,30
367
  ;mov ebx,370*65536+30
1467 IgorA 368
  ;mov ecx,265*65536+25
1401 IgorA 369
  mov edx,10
370
  int 0x40
371
 
372
  mov eax,4 ;рисование текста
373
  mov ebx,152*65536+13
374
  mov ecx,[sc.work_button_text]
375
  or  ecx,0x80000000
376
  mov edx,txt_zoom_p
377
  mcall
378
 
379
  mov ebx,107*65536+13
380
  mov edx,txt_zoom_m
381
  int 0x40
382
 
383
  mov bx,di
384
  add bx,270-otst_panel_left
385
  shl ebx,16
386
  mov bx,243
387
  ;mov ebx,270*65536+243
388
  mov edx,txt151
389
  int 0x40
390
 
391
  mov bx,di
392
  add bx,270-otst_panel_left
393
  shl ebx,16
394
  mov bx,273
395
  ;mov ebx,270*65536+273
396
  mov edx,txt152
397
  int 0x40
398
 
399
  mov bx,di
400
  add bx,415-otst_panel_left
401
  shl ebx,16
402
  mov bx,13
403
  ;mov ebx,415*65536+13
404
  mov edx,txt_but_refresh
405
  int 0x40
406
 
407
  mov bx,di
408
  add bx,380-otst_panel_left
409
  shl ebx,16
410
  mov bx,275
411
  ;mov ebx,380*65536+275
412
  mov edx,txt_met_up
413
  int 0x40
414
 
415
  mov bx,di
416
  add bx,415-otst_panel_left
417
  shl ebx,16
418
  mov bx,275
419
  ;mov ebx,415*65536+275
420
  mov edx,txt_met_dn
421
  int 0x40
422
 
423
 
424
  mov bx,di
425
  add bx,450-otst_panel_left
426
  shl ebx,16
427
  mov bx,275
428
  ;mov ebx,450*65536+275
429
  mov edx,txt_met_sh
430
  int 0x40
431
 
432
  mov ebx,175*65536+13
433
  mov edx,txt_cache
434
  int 0x40
435
 
1619 IgorA 436
  mov ecx,[sc.work_text]
437
  or  ecx,0x80000000
438
 
1401 IgorA 439
  mov bx,di
440
  ;add bx,450-otst_panel_left
441
  shl ebx,16
442
  mov bx,35
443
  ;mov ebx,265*65536+35
444
  mov edx,txt141
445
  int 0x40
446
 
447
  mov bx,135
448
  ;mov ebx,265*65536+135
449
  mov edx,txt142
450
  int 0x40
451
 
452
  call draw_tiles
453
 
1467 IgorA 454
  stdcall [check_box_draw], dword ch1
455
  stdcall [check_box_draw], dword ch2
1401 IgorA 456
  stdcall [edit_box_draw], edit1
457
  stdcall [edit_box_draw], edit2
458
 
459
  mcall 12,2
460
popad
461
  ret
462
 
463
  head_f_i:
464
  head_f_l  db 'Системная ошибка',0
1584 IgorA 465
  err_message_found_lib0 db 'Не найдена библиотека box_lib.obj',0
1401 IgorA 466
  err_message_import0 db 'Ошибка при импорте библиотеки box_lib.obj',0
1584 IgorA 467
  err_message_found_lib1 db 'Не найдена библиотека libimg.obj',0
1401 IgorA 468
  err_message_import1 db 'Ошибка при импорте библиотеки libimg.obj',0
1584 IgorA 469
  err_message_found_lib2 db 'Не найдена библиотека str.obj',0
1401 IgorA 470
  err_message_import2 db 'Ошибка при импорте библиотеки str.obj',0
1584 IgorA 471
  err_message_found_lib3 db 'Не найдена библиотека libini.obj',0
1401 IgorA 472
  err_message_import3 db 'Ошибка при импорте библиотеки libini.obj',0
1584 IgorA 473
  err_message_found_lib4 db 'Не найдена библиотека proc_lib.obj',0
474
  err_message_import4 db 'Ошибка при импорте библиотеки proc_lib.obj',0
1401 IgorA 475
 
476
system_dir0 db '/sys/lib/'
1584 IgorA 477
lib0_name db 'box_lib.obj',0
1401 IgorA 478
 
479
system_dir1 db '/sys/lib/'
1584 IgorA 480
lib1_name db 'libimg.obj',0
1401 IgorA 481
 
482
system_dir2 db '/sys/lib/'
1584 IgorA 483
lib2_name db 'str.obj',0
1401 IgorA 484
 
485
system_dir3 db '/sys/lib/'
1584 IgorA 486
lib3_name db 'libini.obj',0
1401 IgorA 487
 
1584 IgorA 488
system_dir4 db '/sys/lib/'
489
lib4_name db 'proc_lib.obj',0
490
 
1401 IgorA 491
;library structures
492
l_libs_start:
1584 IgorA 493
  lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, boxlib_import,err_message_import0, head_f_i
494
  lib1 l_libs lib1_name, sys_path, file_name, system_dir1, err_message_found_lib1, head_f_l, libimg_import, err_message_import1, head_f_i
495
  lib2 l_libs lib2_name, sys_path, file_name, system_dir2, err_message_found_lib2, head_f_l, strlib_import, err_message_import2, head_f_i
496
  lib3 l_libs lib3_name, sys_path, file_name, system_dir3, err_message_found_lib3, head_f_l, libini_import, err_message_import3, head_f_i
497
  lib4 l_libs lib4_name, sys_path, file_name, system_dir4, err_message_found_lib4, head_f_l, proclib_import, err_message_import4, head_f_i
1401 IgorA 498
load_lib_end:
499
 
500
align 4
501
button:
502
  mcall 17 ;получить код нажатой кнопки
503
  cmp ah,5
504
  jne @f
505
    call but_ZoomM
506
  @@:
507
  cmp ah,6
508
  jne @f
509
    call but_ZoomP
510
  @@:
511
  cmp ah,7
512
  jne @f
513
    call but_Refresh
514
  @@:
515
 
516
  cmp ah,9
517
  jz  but_MetSave
518
  cmp ah,8
519
  jz  but_MetAdd
520
 
521
  cmp ah,10
522
  jne @f
523
    call but_met_up
524
  @@:
525
  cmp ah,11
526
  jne @f
527
    call but_met_dn
528
  @@:
529
  cmp ah,12
530
  jne @f
531
    call fun_goto_met
532
  @@:
1467 IgorA 533
  cmp ah,13 ;диалог OpenDialog для поиска папки
534
  jne @f
535
    call fun_opn_dlg
536
  @@:
1401 IgorA 537
  cmp ah,1
538
  jne still
539
 
540
.exit:
541
  push dword[bmp_icon]
542
  call mem.Free
543
  stdcall array_tile_function, tile_00,max_tiles_count,tile_destroy
544
 
545
  stdcall dword[tl_data_clear], tree1
1467 IgorA 546
  mov dword[tree2.data_img_sys],0 ;чистим указатель на системные иконки,
547
    ;т. к. они были удалены верхней функцией tl_data_clear
548
    ;повторный вызов tl_data_clear без чистки указателя вызвет ошибку
549
  mov dword[tree2.data_img],0 ;чистим указатель на иконки узлов
1401 IgorA 550
  stdcall dword[tl_data_clear], tree2
551
 
552
;  stdcall dword[img_destroy], dword[data_icon]
553
  mcall -1 ;выход из программы
554
 
555
 
556
;input:
557
;data_rgb - pointer to rgb data
558
;size - count img pixels (size img data / 3(rgb) )
559
align 4
560
proc img_rgb_wdiv2 data_rgb:dword, size:dword
561
  push eax ebx ecx edx
562
  mov eax,dword[data_rgb]
563
  mov ecx,dword[size] ;ecx = size
564
  imul ecx,3
1467 IgorA 565
  @@: ;затемнение цвета пикселей
1401 IgorA 566
    shr byte[eax],1
567
    and byte[eax],0x7f
568
    inc eax
569
    loop @b
570
 
571
  mov eax,dword[data_rgb]
572
  mov ecx,dword[size] ;ecx = size
573
  shr ecx,1
1467 IgorA 574
  @@: ;сложение цветов пикселей
575
    mov ebx,dword[eax+3] ;копируем цвет соседнего пикселя
1401 IgorA 576
    add word[eax],bx
577
    shr ebx,16
578
    add byte[eax+2],bl
579
 
580
    add eax,6 ;=2*3
581
    loop @b
582
 
583
  mov eax,dword[data_rgb]
584
  add eax,3
585
  mov ebx,eax
586
  add ebx,3
587
  mov ecx,dword[size] ;ecx = size
588
  shr ecx,1
1467 IgorA 589
  dec ecx ;лишний пиксель
590
  @@: ;поджатие пикселей
1401 IgorA 591
    mov edx,dword[ebx]
592
    mov word[eax],dx
593
    shr edx,16
594
    mov byte[eax+2],dl
595
 
596
    add eax,3
597
    add ebx,6
598
    loop @b
599
 
600
  pop edx ecx ebx eax
601
  ret
602
endp
603
 
604
;input:
605
;data_rgb - pointer to rgb data
606
;size - count img pixels (size img data / 3(rgb) )
607
;size_w - width img in pixels
608
align 4
609
proc img_rgb_hdiv2, data_rgb:dword, size:dword, size_w:dword
610
  pushad
611
 
612
  mov eax,dword[data_rgb] ;eax =
613
  mov ecx,dword[size]	  ;ecx = size
614
  imul ecx,3
1467 IgorA 615
  @@: ;затемнение цвета пикселей
1401 IgorA 616
    shr byte[eax],1
617
    and byte[eax],0x7f
618
    inc eax
619
    loop @b
620
 
621
  mov eax,dword[data_rgb] ;eax =
622
  mov edi,dword[size_w]
623
  lea esi,[edi+edi*2] ;esi = width*3(rgb)
624
  mov ebx,esi
625
  add ebx,eax
626
  mov ecx,dword[size]  ;ecx = size
627
  shr ecx,1
628
  xor edi,edi
1467 IgorA 629
  @@: ;сложение цветов пикселей
630
    mov edx,dword[ebx] ;копируем цвет нижнего пикселя
1401 IgorA 631
    add word[eax],dx
632
    shr edx,16
633
    add byte[eax+2],dl
634
 
635
    add eax,3
636
    add ebx,3
637
    inc edi
638
    cmp edi,dword[size_w]
639
    jl .old_line
640
      add eax,esi
641
      add ebx,esi
642
      xor edi,edi
643
    .old_line:
644
    loop @b
645
 
646
 
647
  mov eax,dword[data_rgb] ;eax =
648
  add eax,esi ;esi = width*3(rgb)
649
  mov ebx,esi
650
  add ebx,eax
1467 IgorA 651
  mov ecx,dword[size] ;ecx = size
1401 IgorA 652
  shr ecx,1
1467 IgorA 653
  sub ecx,dword[size_w] ;лишняя строка пикселей
1401 IgorA 654
  xor edi,edi
1467 IgorA 655
  @@: ;поджатие пикселей
656
    mov edx,dword[ebx] ;копируем цвет нижнего пикселя
1401 IgorA 657
    mov word[eax],dx
658
    shr edx,16
659
    mov byte[eax+2],dl
660
 
661
    add eax,3
662
    add ebx,3
663
    inc edi
664
    cmp edi,dword[size_w]
665
    jl .old_line_2
666
      add ebx,esi
667
      xor edi,edi
668
    .old_line_2:
669
    loop @b
670
 
671
  popad
672
  ret
673
endp
674
 
675
;input:
676
;data_rgb - pointer to rgb data
677
;size - count img pixels (size img data / 3(rgb) )
678
align 4
679
proc img_rgb_wmul2, data_rgb:dword, size:dword
680
  push eax ebx ecx edx
681
  ;eax - source
682
  ;ebx - destination
683
  mov ecx,dword[size] ;ecx = size
684
  mov eax,ecx
685
  dec eax
686
  lea eax,[eax+eax*2] ;eax = (size-1)*3
687
  mov ebx,eax ;ebx = size*3
688
  add eax,dword[data_rgb] ;eax = pointer + size*3
689
  add ebx,eax ;ebx = pointer + 2*size*3
690
  @@:
691
    mov edx,dword[eax] ;edx = pixel color
692
    mov word[ebx],dx
693
    mov word[ebx+3],dx
694
    shr edx,16
695
    mov byte[ebx+2],dl
696
    mov byte[ebx+3+2],dl
697
    sub eax,3
698
    sub ebx,6
699
    loop @b
700
  pop edx ecx ebx eax
701
  ret
702
endp
703
 
704
;функция для растягивания изображения по высоте в 2 раза
705
;в указателе data_rgb памяти должно быть в 2 раза больше чем size*3
706
;иначе при растягивании будет ошибка, выхода на чужую память
707
;input:
708
;data_rgb - pointer to rgb data
709
;size - count img pixels (size img data / 3(rgb) )
710
;size_w - width img in pixels
711
align 4
712
proc img_rgb_hmul2, data_rgb:dword, size:dword, size_w:dword
713
  pushad
714
 
715
  mov esi,dword[size_w]
716
  lea esi,[esi+esi*2] ;esi = width * 3(rgb)
717
  mov eax,dword[size]
718
  lea eax,[eax+eax*2]
719
  mov edi,eax
720
  shl edi,1
721
  add eax,dword[data_rgb] ;eax = pointer to end pixel (old image) + 1
722
  add edi,dword[data_rgb] ;edi = pointer to end pixel (new image) + 1
723
  mov ebx,edi
724
  sub ebx,esi
725
 
726
  .beg_line:
727
  mov ecx,dword[size_w]
728
  @@:
729
    sub eax,3
730
    sub ebx,3
731
    sub edi,3
732
 
733
    mov edx,dword[eax] ;edx = pixel color
734
    mov word[ebx],dx
735
    mov word[edi],dx
736
    shr edx,16
737
    mov byte[ebx+2],dl
738
    mov byte[edi+2],dl
739
 
740
    loop @b
741
 
742
  sub ebx,esi
743
  sub edi,esi
744
 
745
  cmp eax,dword[data_rgb]
746
  jg .beg_line
747
 
748
  popad
749
  ret
750
endp
751
 
752
;input:
753
;data_rgb - pointer to rgb data
754
;size - count img pixels (size img data / 3(rgb) )
755
;size_w - width img in pixels
756
align 4
757
proc img_rgb_hoffs, data_rgb:dword, size:dword, size_w:dword, hoffs:dword
758
  push eax ebx ecx edx esi
759
 
760
  mov esi,dword[size_w]
761
  lea esi,[esi+esi*2] ;esi = width * 3(rgb)
762
  imul esi,dword[hoffs]
763
 
764
  mov eax,dword[size]
765
  lea eax,[eax+eax*2]
766
  add eax,dword[data_rgb] ;eax = pointer to end pixel + 1
767
  sub eax,3
768
  mov ebx,eax
769
  add ebx,esi
770
 
771
  mov ecx,dword[size]
772
  dec ecx
773
  @@:
774
    mov edx,dword[eax] ;edx = pixel color
775
    mov word[ebx],dx
776
    shr edx,16
777
    mov byte[ebx+2],dl
778
 
779
    sub eax,3
780
    sub ebx,3
781
    loop @b
782
  pop esi edx ecx ebx eax
783
  ret
784
endp
785
 
786
 
787
;input:
788
;data_rgb - pointer to rgb data
789
;size_w_old - width img in pixels
790
;size_w_new - new width img in pixels
791
;size_h - height img in pixels
792
align 4
793
proc img_rgb_wcrop, data_rgb:dword, size_w_old:dword, size_w_new:dword, size_h:dword
794
  pushad
795
    mov eax, dword[size_w_old]
796
    lea eax, dword[eax+eax*2] ;eax = width(old) * 3(rgb)
797
    mov ebx, dword[size_w_new]
798
    lea ebx, dword[ebx+ebx*2] ;ebx = width(new) * 3(rgb)
799
    mov edx, dword[size_h]
800
    ;dec edx
801
    mov edi, dword[data_rgb] ;edi - получает данные
802
    mov esi, edi
803
    add edi, ebx
804
    add esi, eax
805
    cld
806
  @@:
807
    dec edx ;уменьшаем счетчик оставшихся строк на 1
808
    cmp edx,0
809
    jle @f
810
 
811
    mov ecx, ebx
812
    rep movsb ;перенос (копирование) строки пикселей
813
;stdcall mem_copy,esi,edi,ebx
814
 
815
    add esi,eax ;переход на новую строчку изображения
816
    sub esi,ebx
817
;add esi,eax
818
;add edi,ebx
819
    jmp @b
820
  @@:
821
 
822
  popad
823
  ret
824
endp
825
 
826
align 4
827
proc mem_copy, source:dword, destination:dword, len:dword
828
  push ecx esi edi
829
    cld
830
    mov esi, dword[source]
831
    mov edi, dword[destination]
832
    mov ecx, dword[len]
833
    rep movsb
834
  pop edi esi ecx
835
  ret
836
endp
837
 
838
align 4
839
proc mem_clear, mem:dword, len:dword
840
  push eax ecx edi
841
    cld
842
    xor al,al
843
    mov edi, dword[mem]
844
    mov ecx, dword[len]
845
    repne stosb
846
  pop edi ecx eax
847
  ret
848
endp
849
 
1467 IgorA 850
align 4
851
fun_opn_dlg: ;функция для вызова OpenFile диалога
852
	pushad
1468 IgorA 853
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1467 IgorA 854
	mov [OpenDialog_data.type],2
855
	mov dword[plugin_path],0 ;что-бы при открытии диалогового окна путь всегда брался из OpenDialog_data.dir_default_path
1584 IgorA 856
 
857
	stdcall [OpenDialog_Start],OpenDialog_data
1467 IgorA 858
	cmp [OpenDialog_data.status],2
859
	je @f
860
		stdcall [str_len],dword[edit1.text],dword[edit1.max]
861
		mov [edit1.size],eax
862
		mov [edit1.pos],eax
863
		stdcall [edit_box_draw], edit1
864
	@@:
865
	popad
866
	ret
867
 
1401 IgorA 868
  txt_met_up db 24,0
869
  txt_met_dn db 25,0
870
  txt_met_sh db '*',0
871
  txt_zoom_m db '-',0
872
  txt_zoom_p db '+',0
873
  txt151 db 'Добавить метку',0
874
  txt152 db 'Сохранить метки',0
875
  txt_but_refresh db 'Обновить',0
876
  txt_cache db 'Cache:',0
877
  txt141 db 'Вид карты',0
878
  txt142 db 'Выбор метки',0
879
 
880
; check_boxes
3175 IgorA 881
ch1 check_box2 (5 shl 16)+12,  (5 shl 16)+12, 6, 0xffffd0, 0x800000, 0, ch_text1, ch_flag_en
882
ch2 check_box2 (5 shl 16)+12, (20 shl 16)+12, 6, 0xffffd0, 0x800000, 0, ch_text2, ch_flag_en
1401 IgorA 883
checkboxes_end:
884
 
3175 IgorA 885
ch_text1 db 'брать сверху',0
886
ch_text2 db 'брать снизу',0
1401 IgorA 887
 
1467 IgorA 888
edit1 edit_box 190, 215,  10, 0xd0ffff, 0xff, 0x80ff, 0, 0xa000, 4090, openfile_path, mouse_dd, 0
1401 IgorA 889
edit2 edit_box 100, 370, 240, 0xd0ffff, 0xff, 0x80ff, 0, 0xa000,  30, ed_buffer.2, mouse_dd, 0
890
editboxes_end:
891
 
892
tree1 tree_list 10,10, tl_list_box_mode+tl_key_no_edit, 16,16,\
893
    0x8080ff,0x0000ff,0xffffff, 265,45,90,85, 0,0,0,\
894
    el_focus, 0,fun_new_map_type
895
tree2 tree_list 32,300, tl_draw_par_line, 16,16,\
896
    0x8080ff,0x0000ff,0xffffff, 265,145,190,85, 0,12,0,\
897
    el_focus, wScrMetki,fun_goto_met
898
 
899
align 4
900
wScrMetki:
901
.x:
902
.size_x     dw 16 ;+0
903
.start_x    dw 0 ;+2
904
.y:
905
.size_y     dw 100 ;+4
906
.start_y    dw 0 ;+6
907
.btn_high   dd 15 ;+8
908
.type	    dd 1  ;+12
909
.max_area   dd 100  ;+16
910
.cur_area   dd 30  ;+20
911
.position   dd 0  ;+24
912
.bckg_col   dd 0xeeeeee ;+28
913
.frnt_col   dd 0xbbddff ;+32
914
.line_col   dd 0  ;+36
915
.redraw     dd 0  ;+40
916
.delta	    dw 0  ;+44
917
.delta2     dw 0  ;+46
918
.run_x:
919
.r_size_x   dw 0  ;+48
920
.r_start_x  dw 0  ;+50
921
.run_y:
922
.r_size_y   dw 0 ;+52
923
.r_start_y  dw 0 ;+54
924
.m_pos	    dd 0 ;+56
925
.m_pos_2    dd 0 ;+60
926
.m_keys     dd 0 ;+64
927
.run_size   dd 0 ;+68
928
.position2  dd 0 ;+72
929
.work_size  dd 0 ;+76
930
.all_redraw dd 0 ;+80
931
.ar_offset  dd 1 ;+84
932
 
933
ed_buffer: ;ЄхъёЄ фы  edit
934
  .2: rb 32
935
 
936
el_focus dd tree1
937
 
938
tree_sys_icon dd 0
939
tree_nod_icon dd 0
940
 
941
bmp_icon   dd 0 ;память для загрузки изображения
942
data_icon  dd 0 ;память для преобразования картинки функциями libimg
943
 
1464 IgorA 944
run_file_70 FileInfoBlock
1401 IgorA 945
 
946
 
947
txt_tile_path db 'tile path',0
948
  rb 300
1467 IgorA 949
txt_tile_type dd txt_tile_type_0 ;указатель на выбранный тип файлов
1401 IgorA 950
txt_tile_type_0 db 0
951
  rb 10
952
 
1467 IgorA 953
;---------------------------------------------------------------------
1401 IgorA 954
align 4
1467 IgorA 955
OpenDialog_data:
956
.type			dd 2
957
.procinfo		dd procinfo	;+4
958
.com_area_name		dd communication_area_name	;+8
959
.com_area		dd 0	;+12
960
.opendir_path		dd plugin_path	;+16
1592 IgorA 961
.dir_default_path	dd default_dir ;+20
1467 IgorA 962
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
963
.draw_window		dd draw_window	;+28
964
.status 		dd 0	;+32
965
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
966
.filename_area		dd filename_area	;+40
967
.filter_area		dd Filter
1584 IgorA 968
.x:
969
.x_size 		dw 420 ;+48 ; Window X size
970
.x_start		dw 10 ;+50 ; Window X position
971
.y:
972
.y_size 		dw 320 ;+52 ; Window y size
973
.y_start		dw 10 ;+54 ; Window Y position
1401 IgorA 974
 
1592 IgorA 975
default_dir db '/rd/1',0 ;директория по умолчанию
976
 
1467 IgorA 977
communication_area_name:
978
	db 'FFFFFFFF_open_dialog',0
979
open_dialog_name:
980
	db 'opendial',0
981
communication_area_default_path:
1468 IgorA 982
	db '/rd/1/File managers/',0
1467 IgorA 983
 
984
Filter:
985
dd Filter.end - Filter.1
986
.1:
987
db 'TXT',0
988
.end:
989
db 0
990
 
1401 IgorA 991
align 4
1467 IgorA 992
map: ;координаты карты
993
  .coord_x dd 0 ;координата x
994
  .coord_y dd 0 ;координата y
995
  .zoom    db 1 ;масштаб
996
 
997
align 4
1401 IgorA 998
tile_00 rb size_tile_struc * max_tiles_count
999
 
1467 IgorA 1000
;этот код не мой, он преобразует число в строку
1401 IgorA 1001
;input:
1002
; eax = value
1003
; edi = string buffer
1004
;output:
1005
; edi =
1006
align 4
1007
tl_convert_to_str:
1008
  pushad
1009
    mov dword[edi+1],0;0x20202020
1010
    call .str
1011
  popad
1012
  ret
1013
 
1014
align 4
1015
.str:
1467 IgorA 1016
  mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1017
    ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1018
  cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1401 IgorA 1019
  jb @f
1467 IgorA 1020
  xor edx,edx  ;очистить edx
1021
  div ecx      ;разделить - остаток в edx
1022
  push edx     ;положить в стек
1023
  ;dec edi             ;смещение необходимое для записи с конца строки
1024
  call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1401 IgorA 1025
  pop eax
1467 IgorA 1026
  @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1027
  or al,0x30  ;данная команда короче  чем две выше
1028
  stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1029
  ret	      ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1401 IgorA 1030
 
1031
 
3175 IgorA 1032
hed db 'Planet viewer 16.01.13',0 ;подпись окна
1401 IgorA 1033
 
1034
sc system_colors  ;системные цвета
1035
mouse_dd dd 0 ;нужно для Shift-а в editbox
1036
i_end:
1467 IgorA 1037
	rb 1024
1038
	align 16
1039
	procinfo process_information
1401 IgorA 1040
stacktop:
1467 IgorA 1041
	sys_path rb 4096
1042
	file_name:
1043
		rb 4096
1044
	plugin_path:
1045
		rb 4096
1046
	openfile_path:
1047
		rb 4096
1048
	filename_area:
1049
		rb 256
1401 IgorA 1050
mem:
1051