Subversion Repositories Kolibri OS

Rev

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