Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4060 hidnplayr 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
4621 hidnplayr 3
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved.    ;;
4060 hidnplayr 4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
4143 hidnplayr 6
;;   Written by hidnplayr@kolibrios.org                            ;;
4060 hidnplayr 7
;;                                                                 ;;
8
;;         GNU GENERAL PUBLIC LICENSE                              ;;
9
;;          Version 2, June 1991                                   ;;
10
;;                                                                 ;;
11
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12
 
13
 
4824 gtament 14
text_insert_newlines:			; esi = ASCIIZ string
4143 hidnplayr 15
 
4824 gtament 16
	xor	edx, edx		; number of lines of text
17
	cmp	byte[esi], 0
18
	je	.done
4143 hidnplayr 19
  .next_line:
4824 gtament 20
	xor	ebx, ebx
21
	mov	ecx, [textbox_width]
22
	inc	ecx
4143 hidnplayr 23
  .more:
4824 gtament 24
	dec	ecx
25
	jz	.end_of_line
26
	lodsb				; get one character of the string
27
	test	al, al			; end of string?
28
	jz	.almost_done
29
	cmp	al, ' ' 		; it's a space! remember its position
30
	je	.space
31
	cmp	al, 13			; we already inserted a newline once, make it a space again
32
	je	.soft_nl
33
	cmp	al, 10			; it's a newline, continue onto the next line
34
	jne	.more
35
	inc	edx
36
	jmp	.next_line
4143 hidnplayr 37
  .soft_nl:
4824 gtament 38
	mov	byte[esi-1], ' '
4143 hidnplayr 39
  .space:
4824 gtament 40
	mov	ebx, esi		; last detected space
41
	jmp	.more
4143 hidnplayr 42
  .end_of_line:
4824 gtament 43
	inc	edx
44
	test	ebx, ebx		; did we detect any spaces on this line?
45
	jz	.next_line		; no:   just continue onto the next line
46
	mov	byte[ebx-1], 13 	; yes:  replace last space on line with a soft newline
47
	mov	esi, ebx		;       and continue parsing just after last space
48
	jmp	.next_line		;
4143 hidnplayr 49
  .almost_done:
4824 gtament 50
	dec	esi
4143 hidnplayr 51
  .done:
52
 
4824 gtament 53
	ret
4143 hidnplayr 54
 
4623 hidnplayr 55
;----------------------------------
56
; scan untill next line is reached
57
;
4143 hidnplayr 58
; When you set the direction flag before calling, you can also scan for previous line!
4623 hidnplayr 59
; IN:   esi
60
; OUT:  esi
61
;----------------------------------
4143 hidnplayr 62
text_nextline:
63
 
4824 gtament 64
	mov	ecx, [textbox_width]
4143 hidnplayr 65
  .loop:
4824 gtament 66
	lodsb
67
	test	al, al
68
	jz	.done
69
	cmp	al, 10
70
	je	.done
71
	cmp	al, 13
72
	je	.done
73
	dec	ecx
74
	jnz	.loop
4143 hidnplayr 75
  .done:
76
 
4824 gtament 77
	ret
4143 hidnplayr 78
 
79
 
4623 hidnplayr 80
;----------------------------------
81
; print string
82
;
83
; IN:   esi = ptr to string
84
;       bl = char which marks end of string
85
; OUT:  esi = ptr to end of str
86
;----------------------------------
87
print_string:
4060 hidnplayr 88
 
4824 gtament 89
	push	eax
4623 hidnplayr 90
  .loop:
4824 gtament 91
	lodsb
92
	cmp	al, bl
93
	je	.done
94
	cmp	al, 13
95
	je	.loop
96
	test	al, al
97
	jz	.done
98
	call	print_char
99
	jmp	.loop
4060 hidnplayr 100
  .done:
4824 gtament 101
	pop	eax
4143 hidnplayr 102
 
4824 gtament 103
	ret
4060 hidnplayr 104
 
105
 
4623 hidnplayr 106
;----------------------------------
107
; print ASCIIZ string
108
;
109
; IN:   esi = ptr to ASCIIZ string
110
; OUT:  esi = ptr to end of str
111
;----------------------------------
112
print_asciiz:
4060 hidnplayr 113
 
4824 gtament 114
	push	eax
4060 hidnplayr 115
  .loop:
4824 gtament 116
	lodsb
117
	test	al, al
118
	jz	.done
119
	call	print_char
120
	jmp	.loop
4060 hidnplayr 121
  .done:
4824 gtament 122
	pop	eax
4143 hidnplayr 123
 
4824 gtament 124
	ret
4060 hidnplayr 125
 
126
 
4623 hidnplayr 127
;----------------------------------
128
; print character
129
;
130
; IN:   al = char to print
131
; OUT:  /
132
;----------------------------------
133
print_char:
4060 hidnplayr 134
 
4824 gtament 135
	push	esi edi
136
	mov	esi, [window_print]
137
	mov	edi, [esi + window.text_write]
138
	stosb
139
	cmp	edi, [esi + window.text_end]
140
	jae	.uh_ow
141
	mov	[esi + window.text_write], edi
4143 hidnplayr 142
  .continue:
4824 gtament 143
	or	[esi + window.flags], FLAG_UPDATED
144
	pop	edi esi
4143 hidnplayr 145
 
4824 gtament 146
	ret
4143 hidnplayr 147
 
148
  .uh_ow:
4824 gtament 149
	pusha
150
	mov	edi, [esi + window.text_start]
151
	mov	[esi + window.text_print], edi
152
	lea	esi, [edi + TEXT_BUFFERSIZE/2]
153
	call	text_nextline
154
	mov	ecx, TEXT_BUFFERSIZE/8
155
	rep	movsd
156
	mov	esi, edi
157
	call	text_insert_newlines
4060 hidnplayr 158
 
4824 gtament 159
	mov	ebx, [window_print]
160
	mov	[ebx + window.text_lines], edx
161
	mov	[ebx + window.text_scanned], esi
162
	mov	[ebx + window.text_write], esi
163
	mov	[ebx + window.text_line_print], 0
164
	popa
4060 hidnplayr 165
 
4824 gtament 166
	jmp	.continue
4060 hidnplayr 167
 
168
 
169
 
4143 hidnplayr 170
draw_channel_text:
4060 hidnplayr 171
 
4824 gtament 172
	mov	edi, [window_active]
173
	and	[edi + window.flags], not FLAG_UPDATED	; clear the 'window is updated' flag
4060 hidnplayr 174
 
4143 hidnplayr 175
; Scan new text for newlines
4824 gtament 176
	mov	esi, [edi + window.text_scanned]
177
	call	text_insert_newlines
178
	add	[edi + window.text_lines], edx
179
	mov	[edi + window.text_scanned], esi
4060 hidnplayr 180
 
4621 hidnplayr 181
; Is scrollbar at lowest position?
4824 gtament 182
	test	[edi + window.flags], FLAG_SCROLL_LOW
183
	jnz	.yesscroll				;Yes
184
	cmp	[scroll2.all_redraw], 1 		;No
185
	jnz	 .noscroll
186
	mov	edx, [textbox_height]
187
	sub	edx, [edi + window.text_line_print]
188
	jg	.noscroll
4621 hidnplayr 189
  .yesscroll:
190
; Scrollbar was at lowest position, scroll down automatically when new text arrived.
4824 gtament 191
	mov	edx, [edi + window.text_lines]
192
	sub	edx, [textbox_height]
193
	jle	.noscroll				; There are less lines of text than fit into the window, dont scroll..
194
	sub	edx, [edi + window.text_line_print]
195
	je	.noscroll				; We are already at the bottom pos, dont scroll..
196
  .scroll_to_pos:		; edx = number of lines to go up/down (flags must indicate direction)
197
	pushf
198
	add	[edi + window.text_line_print], edx
199
	mov	esi, [edi + window.text_print]
200
	popf
201
	ja	.loop_forward
202
	std			; set direction flag so we can scan backwards
203
	dec	esi
204
	dec	esi		; move our cursor just in front of newline, for scanning backwards
4143 hidnplayr 205
  .loop_backward:
4824 gtament 206
	call	text_nextline
207
	inc	edx
208
	jnz	.loop_backward
209
	inc	esi
210
	inc	esi		; move the cursor just after last newline
211
	cld
212
	jmp	.ok
4060 hidnplayr 213
 
4143 hidnplayr 214
  .loop_forward:
4824 gtament 215
	call	text_nextline
216
	dec	edx
217
	jnz	.loop_forward
4143 hidnplayr 218
  .ok:
4824 gtament 219
	mov	[edi + window.text_print], esi
4143 hidnplayr 220
  .noscroll:
4060 hidnplayr 221
 
4622 hidnplayr 222
; Update and draw scrollbar when nescessary
4824 gtament 223
	mov	edx, [edi + window.text_lines]
224
	cmp	edx, [textbox_height]
225
	jbe	.scroll_done
4622 hidnplayr 226
 
4824 gtament 227
	mov	[scroll2.max_area], edx
228
	mov	eax, [edi + window.text_line_print]
229
	mov	[scroll2.position], eax
4622 hidnplayr 230
 
4824 gtament 231
	push	dword scroll2			; redraw scrollbar
232
	call	[scrollbar_draw]
233
	mov	[scroll2.all_redraw], 0 	; next time, dont redraw it completely
4622 hidnplayr 234
  .scroll_done:
235
 
4621 hidnplayr 236
; Calculate start offset coordinates (align text to bottom)
4824 gtament 237
	mov	ebx, [textbox_height]
238
	sub	ebx, [edi + window.text_lines]
239
	jb	.no_offset
240
	imul	ebx, FONT_HEIGHT
241
	push	[edi + window.text_start]
242
	pop	[edi + window.text_print]
243
	jmp	.draw_text
4621 hidnplayr 244
  .no_offset:
4824 gtament 245
	xor	ebx, ebx
4621 hidnplayr 246
  .draw_text:
4143 hidnplayr 247
; Prepare to actually draw some text
4824 gtament 248
	mov	eax, [textbox_height]	; max number of lines to draw
249
	add	ebx, TEXT_X shl 16 + TEXT_Y
250
	mov	ecx, [colors.work_text] ; default text color
251
	mov	edx, [edi + window.text_print]
4143 hidnplayr 252
  .drawloop:
4824 gtament 253
	cmp	byte[edx], 0
254
	je	.end_of_text
4060 hidnplayr 255
 
4143 hidnplayr 256
; Clear one row of characters
4824 gtament 257
	pusha
258
	mov	cx, bx
259
	shl	ecx, 16
260
	mov	cx, FONT_HEIGHT
261
	mov	ebx, TEXT_X shl 16
262
	mov	bx, word[textbox_width]
263
	imul	bx, FONT_WIDTH
264
	mov	edx, [colors.work]
265
	mcall	13			; draw rectangle
266
	popa
4060 hidnplayr 267
 
4824 gtament 268
	mov	esi, edx
269
	add	esi, [textbox_width]
4143 hidnplayr 270
  .line:
4824 gtament 271
	cmp	byte[edx], 0
272
	je	.end_of_text
4060 hidnplayr 273
 
4824 gtament 274
	cmp	byte[edx], 13
275
	je	.newline_soft
4143 hidnplayr 276
 
4824 gtament 277
	cmp	byte[edx], 10
278
	je	.newline_hard
4143 hidnplayr 279
 
4824 gtament 280
	push	esi eax
281
	cmp	byte[edx], 3		; escape code for mIRC colors
282
	jne	.no_colors
283
	inc	edx
284
	call	dec_to_esi
285
	jz	.no_colors
286
	mov	ecx, [irc_colors + 4*esi]
4143 hidnplayr 287
 
4824 gtament 288
	cmp	byte[edx], ','		; background color?
289
	jne	.no_colors
290
	inc	edx
291
	call	dec_to_esi
292
	jz	.no_colors
293
	mov	edi, [irc_colors + 4*esi]
294
	or	ecx, 0x40000000
4143 hidnplayr 295
  .no_colors:
296
 
4824 gtament 297
	mov	esi, 1
298
	mcall	4			; draw text
299
	add	ebx, FONT_WIDTH shl 16
300
	inc	edx
301
	pop	eax esi
302
	cmp	edx, esi
303
	jb	.line
304
	jmp	.line_full
4060 hidnplayr 305
 
4143 hidnplayr 306
  .newline_hard:
4824 gtament 307
	mov	ecx, [colors.work_text]
4143 hidnplayr 308
  .newline_soft:
4824 gtament 309
	inc	edx
4143 hidnplayr 310
  .line_full:
4824 gtament 311
	and	ebx, 0x0000ffff
312
	add	ebx, TEXT_X shl 16 + FONT_HEIGHT
313
	dec	eax
314
	jnz	.drawloop
4621 hidnplayr 315
  .end_of_text:
4060 hidnplayr 316
 
4824 gtament 317
	ret
4143 hidnplayr 318
 
319
 
320
 
321
 
322
dec_to_esi:
323
 
4824 gtament 324
	xor	esi, esi
4143 hidnplayr 325
  .loop:
4824 gtament 326
	movzx	eax, byte[edx]
327
	sub	al, '0'
328
	jb	.done
329
	cmp	al, 9
330
	ja	.done
331
	inc	edx
332
	lea	esi, [esi*4 + esi]	; esi * 5
333
	lea	esi, [esi*2 + eax]	; esi * 2 + eax
334
	jmp	.loop
4143 hidnplayr 335
  .done:
4824 gtament 336
	cmp	esi, 16
337
	jae	.fail
338
	ret
4143 hidnplayr 339
 
340
  .fail:
4824 gtament 341
	xor	esi, esi
342
	ret
4143 hidnplayr 343
 
344
 
345
 
346
if TIMESTAMP
347
print_timestamp:
348
 
4824 gtament 349
	pusha
350
	mcall	3			; get system time
351
	mov	ebx, eax
4143 hidnplayr 352
 
4824 gtament 353
	mov	al, '['
354
	call	print_char
355
	mov	ecx, TIMESTAMP
4143 hidnplayr 356
  .loop:
4824 gtament 357
	mov	al, bl
358
	shr	al, 4
359
	add	al, '0'
360
	call	print_char
4143 hidnplayr 361
 
4824 gtament 362
	mov	al, bl
363
	and	al, 0x0f
364
	add	al, '0'
365
	call	print_char
4143 hidnplayr 366
 
4824 gtament 367
	dec	ecx
368
	jz	.done
4143 hidnplayr 369
 
4824 gtament 370
	mov	al, ':'
371
	call	print_char
372
	shr	ebx, 8
373
	jmp	.loop
4143 hidnplayr 374
  .done:
4824 gtament 375
	mov	al, ']'
376
	call	print_char
377
	mov	al, ' '
378
	call	print_char
4143 hidnplayr 379
 
4824 gtament 380
	popa
381
	ret
4143 hidnplayr 382
end if