Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
258 mikedld 1
;-----------------------------------------------------------------------------
2
func clear_selection ;////////////////////////////////////////////////////////
3
;-----------------------------------------------------------------------------
4
	push	eax ebx
297 mikedld 5
	mov	eax,[cur_editor.SelStart.Y]
6
	mov	ebx,[cur_editor.Caret.Y]
258 mikedld 7
	cmp	eax,ebx
8
	jle	@f
9
	xchg	eax,ebx
297 mikedld 10
    @@: push	[cur_editor.Caret.X] [cur_editor.Caret.Y]
11
	pop	[cur_editor.SelStart.Y] [cur_editor.SelStart.X]
258 mikedld 12
	pop	ebx eax
13
	ret
14
endf
15
 
16
;-----------------------------------------------------------------------------
17
func pt_in_rect ;/////////////////////////////////////////////////////////////
18
;-----------------------------------------------------------------------------
19
	cmp	eax,[ecx+0x0]
20
	jl	@f
21
	cmp	ebx,[ecx+0x4]
22
	jl	@f
23
	cmp	eax,[ecx+0x8]
24
	jg	@f
25
	cmp	ebx,[ecx+0xC]
26
	jg	@f
27
	stc
28
	ret
29
    @@: clc
30
	ret
31
endf
32
 
33
;-----------------------------------------------------------------------------
34
func check_bottom_right ;/////////////////////////////////////////////////////
35
;-----------------------------------------------------------------------------
36
	push	eax
297 mikedld 37
	mov	eax,[cur_editor.TopLeft.Y]
258 mikedld 38
	add	eax,[lines.scr]
297 mikedld 39
	cmp	eax,[cur_editor.Lines.Count]
258 mikedld 40
	jbe	.lp1
297 mikedld 41
	mov	eax,[cur_editor.Lines.Count]
258 mikedld 42
	sub	eax,[lines.scr]
43
	jns	@f
44
	xor	eax,eax
297 mikedld 45
    @@: mov	[cur_editor.TopLeft.Y],eax
46
  .lp1: mov	eax,[cur_editor.TopLeft.X]
258 mikedld 47
	add	eax,[columns.scr]
297 mikedld 48
	cmp	eax,[cur_editor.Columns.Count]
258 mikedld 49
	jbe	.exit
297 mikedld 50
	mov	eax,[cur_editor.Columns.Count]
258 mikedld 51
	sub	eax,[columns.scr]
52
	jns	@f
53
	xor	eax,eax
297 mikedld 54
    @@: mov	[cur_editor.TopLeft.X],eax
258 mikedld 55
  .exit:
56
	pop	eax
57
	ret
58
endf
59
 
60
;-----------------------------------------------------------------------------
61
func get_real_length ;////////////////////////////////////////////////////////
62
;-----------------------------------------------------------------------------
63
	movzx	eax,word[esi]
64
    @@: cmp	byte[esi+eax+4-1],' '
65
	jne	@f
66
	dec	eax
67
	jnz	@b
68
    @@: ret
69
endf
70
 
71
;-----------------------------------------------------------------------------
72
func get_line_offset ;////////////////////////////////////////////////////////
73
;-----------------------------------------------------------------------------
74
; Input:
75
;  ECX = line number
76
; Output:
77
;  ESI = line data offset
78
;-----------------------------------------------------------------------------
79
	push	eax ecx
297 mikedld 80
	mov	esi,[cur_editor.Lines]
259 mikedld 81
    @@: dec	ecx
82
	js	.exit
83
	movzx	eax,word[esi]
258 mikedld 84
	lea	esi,[esi+eax+4]
259 mikedld 85
	jmp	@b
258 mikedld 86
  .exit:
87
	pop	ecx eax
88
	ret
89
endf
90
 
91
;-----------------------------------------------------------------------------
92
func init_sel_vars ;//////////////////////////////////////////////////////////
93
;-----------------------------------------------------------------------------
94
	pushad
95
	mov	[sel.selected],1
297 mikedld 96
	mov	eax,[ebp+EDITOR.SelStart.X]
97
	mov	ebx,[ebp+EDITOR.SelStart.Y]
98
	mov	ecx,[ebp+EDITOR.Caret.X]
99
	mov	edx,[ebp+EDITOR.Caret.Y]
258 mikedld 100
	cmp	ebx,edx
101
	jl	.lp2
102
	jne	@f
103
	cmp	eax,ecx
104
	jl	.lp2
105
	jne	.lp1
106
	dec	[sel.selected]
107
	jmp	.lp2
108
    @@: xchg	ebx,edx
109
  .lp1: xchg	eax,ecx
110
  .lp2: mov	[sel.begin.x],eax
111
	mov	[sel.begin.y],ebx
112
	mov	[sel.end.x],ecx
113
	mov	[sel.end.y],edx
114
	popad
115
	ret
116
endf
117
 
118
;-----------------------------------------------------------------------------
119
func get_scroll_vars ;////////////////////////////////////////////////////////
120
;-----------------------------------------------------------------------------
121
; Input:
122
;  EAX = maximum data size      (units)
123
;  EBX = visible data size      (units)
124
;  ECX = current data position  (units)
125
;  EDX = scrolling area size    (pixels)
126
; Output:
127
;  EAX = srcoller offset        (pixels)
128
;  EBX = scroller size          (pixels)
129
;-----------------------------------------------------------------------------
130
	push	eax ebx edx
131
;       sub     eax,ebx
132
	mov	esi,eax
133
	mov	eax,edx
134
	imul	ebx
135
	idiv	esi
136
	cmp	eax,[esp]
137
	jge	.null
138
	cmp	eax,AMINS
139
	jge	@f
140
	neg	eax
141
	add	eax,AMINS
142
	sub	[esp],eax
143
	mov	eax,AMINS
144
    @@: mov	[esp+4],eax	; scroller size
145
	mov	eax,[esp]
146
	imul	ecx
147
	idiv	esi
148
	or	eax,eax
149
	jns	@f
150
	xor	eax,eax
297 mikedld 151
   @@:	mov	[esp+8],eax	; scroller offset
258 mikedld 152
	add	eax,[esp+4]
153
	cmp	eax,[esp]
154
	jle	@f
155
    @@:
156
	pop	edx ebx eax
157
	ret
158
  .null:
159
	mov	dword[esp+4],0
160
	mov	dword[esp+8],0
161
	jmp	@b
162
endf
163
 
164
;-----------------------------------------------------------------------------
165
func uint2strz ;//////////////////////////////////////////////////////////////
166
;-----------------------------------------------------------------------------
167
	dec	ebx
168
	jz	@f
169
	xor	edx,edx
170
	div	ecx
171
	push	edx
172
	call	uint2strz
173
	pop	eax
174
    @@: cmp	al,10
175
	sbb	al,$69
176
	das
177
	stosb
178
	ret
179
endf
180
 
181
;-----------------------------------------------------------------------------
182
func uint2str ;///////////////////////////////////////////////////////////////
183
;-----------------------------------------------------------------------------
184
	cmp	eax,ecx
185
	jb	@f
186
	xor	edx,edx
187
	div	ecx
188
	push	edx
189
	call	uint2str
190
	pop	eax
191
    @@: cmp	al,10
192
	sbb	al,$69
193
	das
194
	stosb
195
	ret
196
endf
197
 
198
;-----------------------------------------------------------------------------
259 mikedld 199
func strlen ;/////////////////////////////////////////////////////////////////
200
;-----------------------------------------------------------------------------
201
	push	ebx
202
	mov	ebx,eax
203
	xor	eax,eax
204
    @@: cmp	byte[ebx+eax],0
205
	je	@f
206
	inc	eax
207
	jmp	@b
208
    @@: pop	ebx
209
	ret
210
endf
211
 
212
;-----------------------------------------------------------------------------
258 mikedld 213
func rgb_to_gray ;////////////////////////////////////////////////////////////
214
;-----------------------------------------------------------------------------
215
	push	0 eax
216
	and	dword[esp],0x000000FF
217
	fild	dword[esp]
218
	fmul	[float_gray_b]
219
	shr	eax,8
220
	mov	[esp],eax
221
	and	dword[esp],0x000000FF
222
	fild	dword[esp]
223
	fmul	[float_gray_g]
224
	faddp
225
	shr	eax,8
226
	and	eax,0x000000FF
227
	mov	[esp],eax
228
	fild	dword[esp]
229
	fmul	[float_gray_r]
230
	faddp
231
	frndint
232
	fist	dword[esp]
233
	fist	dword[esp+1]
234
	fistp	dword[esp+2]
235
	pop	eax
236
	add	esp,4
237
	ret
238
endf
239
 
240
;float_gray_r dd 0.30f
241
;float_gray_g dd 0.59f
242
;float_gray_b dd 0.11f
243
 
244
;-----------------------------------------------------------------------------
245
func get_active_menu_item ;///////////////////////////////////////////////////
246
;-----------------------------------------------------------------------------
247
	pushad
248
	mov	[mi_cur],0
249
	mcall	37,1
250
	movsx	ebx,ax
251
	sar	eax,16
252
	mov	ecx,__rc
253
	pushd	2 0 (main_menu.width+7) (ATOPH-2)
254
	popd	[__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
255
;       add     [__rc+0xC],ATOPH-2
256
	call	pt_in_rect
257
	jnc	.outside_menu
258
	m2m	dword[ecx+0x8],dword[ecx+0x0]
259
	mov	edx,main_menu
260
    @@: inc	[mi_cur]
261
	movzx	esi,word[edx+0]
262
	add	[ecx+0x8],esi
263
	call	pt_in_rect
264
	jc	.exit
265
	m2m	dword[ecx+0x0],dword[ecx+0x8]
266
	add	edx,8+1
267
	movzx	esi,byte[edx-1]
268
	add	edx,esi
269
	cmp	byte[edx+8],0
270
	jne	@b
271
	mov	[mi_cur],0
272
  .exit:
273
	popad
274
	ret
275
  .outside_menu:
276
	or	[mi_cur],-1
277
    @@: popad
278
	ret
279
endf
280
 
281
;-----------------------------------------------------------------------------
282
func get_active_popup_item ;//////////////////////////////////////////////////
283
;-----------------------------------------------------------------------------
284
	pushad
285
	mov	[pi_cur],0
286
	mcall	37,1
287
	movsx	ebx,ax
288
	sar	eax,16
289
	mov	ecx,__rc
290
	mov	dword[ecx+0x0],0
291
	mov	dword[ecx+0x4],0
292
	movzx	edx,[ebp+POPUP.width]
297 mikedld 293
	mov	dword[ecx+0x8],edx
258 mikedld 294
	movzx	edx,[ebp+POPUP.height]
297 mikedld 295
	mov	dword[ecx+0xC],edx
258 mikedld 296
	call	pt_in_rect
297
	jnc	.outside_window
298
	inc	dword[ecx+0x0]
299
	mov	dword[ecx+0x4],3
300
	dec	dword[ecx+0x8]
301
	mov	dword[ecx+0xC],3+POP_IHEIGHT-1
297 mikedld 302
	mov	edx,[ebp+POPUP.data]
258 mikedld 303
    @@: inc	[pi_cur]
304
	inc	edx
305
	movzx	esi,byte[edx-1]
306
	cmp	byte[edx],'-'
307
	jne	.lp1
308
	pushd	[ecx+0xC]
309
	sub	dword[ecx+0xC],POP_IHEIGHT-4
310
	call	pt_in_rect
311
	popd	[ecx+0xC]
312
	jc	.separator
313
	add	dword[ecx+0x4],4
314
	add	dword[ecx+0xC],4
315
	jmp	.lp3
316
  .lp1: call	pt_in_rect
317
	jnc	.lp2
318
	mov	eax,[pi_cur]
297 mikedld 319
	test	byte[ebp+eax-1],1
258 mikedld 320
	jnz	.exit
321
	jmp	.separator
322
  .lp2: add	dword[ecx+0x4],POP_IHEIGHT
323
	add	dword[ecx+0xC],POP_IHEIGHT
324
	add	edx,esi
325
	inc	edx
326
	movzx	esi,byte[edx-1]
327
  .lp3: add	edx,esi
328
	cmp	byte[edx],0
329
	jne	@b
330
  .separator:
331
	mov	[pi_cur],0
332
  .exit:
333
	popad
334
	ret
335
  .outside_window:
336
	or	[pi_cur],-1
337
	jmp	.exit
338
endf
339
 
340
;-----------------------------------------------------------------------------
341
func line_add_spaces ;////////////////////////////////////////////////////////
342
;-----------------------------------------------------------------------------
280 mikedld 343
; Input:
344
;  ESI = line offset
345
;  ECX = needed line length
346
; Output:
347
;  EAX = delta
258 mikedld 348
;-----------------------------------------------------------------------------
280 mikedld 349
	xor	eax,eax
258 mikedld 350
	pushad
351
	movzx	edx,word[esi]
352
	cmp	ecx,edx
353
	jbe	.exit
354
	sub	ecx,edx
280 mikedld 355
	lea	eax,[ecx+4]
356
	call	editor_realloc_lines
357
	mov	[esp+4*7],eax
358
	add	esi,eax
258 mikedld 359
	push	ecx
297 mikedld 360
	mov	edi,[cur_editor.Lines]
259 mikedld 361
	add	edi,[edi-4]
362
	dec	edi
258 mikedld 363
	mov	eax,esi
364
	mov	esi,edi
365
	sub	esi,ecx
366
	lea	ecx,[eax+4]
297 mikedld 367
	add	ecx,edx
258 mikedld 368
	push	ecx
369
	neg	ecx
370
	lea	ecx,[esi+ecx+1]
371
	std
372
	rep	movsb
373
	pop	edi ecx
374
	add	[eax],cx
375
	mov	al,' '
376
	cld
377
	rep	stosb
378
  .exit:
379
	popad
380
	ret
381
endf
382
 
383
;-----------------------------------------------------------------------------
384
func delete_selection ;///////////////////////////////////////////////////////
385
;-----------------------------------------------------------------------------
259 mikedld 386
;       call    init_sel_vars
387
 
258 mikedld 388
	cmp	[sel.selected],0
389
	je	.exit.2
390
 
391
	pushad
392
	mov	ecx,[sel.begin.y]
393
	cmp	ecx,[sel.end.y]
394
	je	.single_line
395
	call	get_line_offset
396
	and	dword[esi],not 0x00020000
397
	or	dword[esi],0x00010000
398
	mov	ecx,[sel.begin.x]
399
	call	line_add_spaces
280 mikedld 400
	add	esi,eax
258 mikedld 401
	lea	edi,[esi+4]
402
	mov	ecx,[sel.end.y]
403
	call	get_line_offset
404
	call	get_real_length
405
	cmp	eax,[sel.end.x]
406
	jbe	@f
407
	mov	eax,[sel.end.x]
408
    @@: movzx	ecx,word[esi]
409
	sub	ecx,eax
410
	mov	ebx,[sel.begin.x]
411
	add	ebx,ecx
412
	mov	[edi-4],bx
413
	add	edi,[sel.begin.x]
414
	lea	esi,[esi+eax+4]
297 mikedld 415
	mov	ecx,[cur_editor.Lines]
259 mikedld 416
	add	ecx,[ecx-4]
258 mikedld 417
	sub	ecx,esi
418
	cld
419
	rep	movsb
420
	mov	eax,[sel.end.y]
421
	sub	eax,[sel.begin.y]
297 mikedld 422
	sub	[cur_editor.Lines.Count],eax
258 mikedld 423
	jmp	.exit
424
 
425
  .single_line:
426
	call	get_line_offset
427
	and	dword[esi],not 0x00020000
428
	or	dword[esi],0x00010000
429
	call	get_real_length
430
	cmp	eax,[sel.begin.x]
431
	jbe	.exit
432
	mov	ecx,[sel.end.x]
433
	cmp	ecx,eax
434
	jbe	@f
435
	mov	ecx,eax
436
    @@: sub	ecx,[sel.begin.x]
437
	sub	[esi],cx
438
	lea	edi,[esi+4]
439
	add	edi,[sel.begin.x]
440
	lea	esi,[edi+ecx]
297 mikedld 441
	mov	ecx,[cur_editor.Lines]
259 mikedld 442
	add	ecx,[ecx-4]
258 mikedld 443
	sub	ecx,esi
444
	cld
445
	rep	movsb
446
 
447
  .exit:
448
	mov	eax,[sel.begin.x]
297 mikedld 449
	mov	[cur_editor.Caret.X],eax
450
	mov	[cur_editor.SelStart.X],eax
258 mikedld 451
	mov	eax,[sel.begin.y]
297 mikedld 452
	mov	[cur_editor.Caret.Y],eax
453
	mov	[cur_editor.SelStart.Y],eax
280 mikedld 454
 
455
	mov	ecx,[cur_editor.Lines.Count]
456
	call	get_line_offset
457
	movzx	eax,word[esi]
458
	lea	esi,[esi+eax+4]
459
	mov	eax,[cur_editor.Lines]
460
	add	eax,[eax-4]
461
	sub	esi,eax
462
	lea	eax,[esi+4096]
463
	call	editor_realloc_lines
464
 
258 mikedld 465
	popad
297 mikedld 466
	mov	[cur_editor.Modified],1
258 mikedld 467
	clc
468
	ret
469
 
470
  .exit.2:
471
	stc
472
	ret
473
endf
259 mikedld 474
 
475
;-----------------------------------------------------------------------------
476
func get_selection_size ;/////////////////////////////////////////////////////
477
;-----------------------------------------------------------------------------
478
	push	ecx esi
479
	mov	ecx,[sel.end.y]
480
	inc	ecx
481
	call	get_line_offset
482
	mov	eax,esi
483
	mov	ecx,[sel.begin.y]
484
	call	get_line_offset
485
	sub	eax,esi
486
	pop	esi ecx
487
	ret
488
endf
489
 
490
;-----------------------------------------------------------------------------
491
func get_lines_in_file ;//////////////////////////////////////////////////////
492
;-----------------------------------------------------------------------------
280 mikedld 493
; Input:
494
;  ESI = data pointer
495
;  ECX = data length
496
; Output:
497
;  EAX = lines number
498
;  EBX = extra length after tabs expansion
259 mikedld 499
;-----------------------------------------------------------------------------
280 mikedld 500
	push	ecx edx esi 0
259 mikedld 501
	or	ebx,-1
280 mikedld 502
	xor	edx,edx
259 mikedld 503
  .lp0: inc	ebx
504
  .lp1: dec	ecx
505
	jle	.lp2
506
	lodsb
280 mikedld 507
	cmp	al,0
508
	je	.lp2
509
	cmp	al,9
510
	je	.TB
259 mikedld 511
	cmp	al,10
512
	je	.LF
513
	cmp	al,13
514
	je	.CR
280 mikedld 515
	inc	edx
259 mikedld 516
	jmp	.lp1
280 mikedld 517
  .lp2: lea	eax,[ebx+1]
518
	pop	ebx esi edx ecx
259 mikedld 519
	ret
520
 
521
   .CR: cmp	byte[esi],10
280 mikedld 522
	jne	.LF
259 mikedld 523
	lodsb
280 mikedld 524
   .LF: xor	edx,edx
525
	jmp	.lp0
526
   .TB: and	edx,00000111b
527
	add	dword[esp],ATABW
528
	sub	[esp],edx
529
	xor	edx,edx
530
	jmp	.lp1
259 mikedld 531
endf
532
 
533
;-----------------------------------------------------------------------------
297 mikedld 534
func update_caption ;/////////////////////////////////////////////////////////
535
;-----------------------------------------------------------------------------
536
	lea	esi,[cur_editor.FilePath]
537
	mov	edi,s_title
538
 
539
    @@: lodsb
540
	cmp	al,0
541
	je	@f
542
	stosb
543
	jmp	@b
544
    @@:
545
	mov	dword[edi],' - '
546
	add	edi,3
547
    @@: mov	esi,htext
548
	mov	ecx,htext.size
549
	cld
550
	rep	movsb
551
 
552
	mov	al,0
553
	stosb
554
 
555
	mcall	71,1,s_title
556
 
557
	clc
558
	ret
559
endf
560
 
561
;-----------------------------------------------------------------------------
259 mikedld 562
func mem.Alloc ;//////////////////////////////////////////////////////////////
563
;-----------------------------------------------------------------------------
564
	push	ebx ecx
565
	lea	ecx,[eax+4+4095]
566
	and	ecx,not 4095
567
	mcall	68,12
568
	add	ecx,-4
569
	mov	[eax],ecx
570
	add	eax,4
571
	pop	ecx ebx
572
	ret
573
endf
574
 
575
;-----------------------------------------------------------------------------
576
func mem.ReAlloc ;////////////////////////////////////////////////////////////
577
;-----------------------------------------------------------------------------
578
	push	ebx ecx esi edi eax
579
	or	eax,eax
580
	jz	@f
581
	lea	ecx,[ebx+4+4095]
582
	and	ecx,not 4095
583
	add	ecx,-4
584
	cmp	ecx,[eax-4]
585
	je	.exit
586
    @@: mov	eax,ebx
587
	call	mem.Alloc
588
	xchg	eax,[esp]
589
	or	eax,eax
590
	jz	.exit
591
	mov	esi,eax
592
	xchg	eax,[esp]
593
	mov	edi,eax
594
	mov	ecx,[esi-4]
595
	cmp	ecx,[edi-4]
596
	jbe	@f
597
	mov	ecx,[edi-4]
598
    @@: add	ecx,3
599
	shr	ecx,2
600
	cld
601
	rep	movsd
602
	xchg	eax,[esp]
603
	call	mem.Free
604
  .exit:
605
	pop	eax edi esi ecx ebx
606
	ret
607
endf
608
 
609
;-----------------------------------------------------------------------------
610
func mem.Free ;///////////////////////////////////////////////////////////////
611
;-----------------------------------------------------------------------------
612
	push	ebx ecx
613
	lea	ecx,[eax-4]
614
	mcall	68,13
615
	pop	ecx ebx
616
	ret
617
endf