Subversion Repositories Kolibri OS

Rev

Rev 4824 | Rev 6023 | 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]
4827 gtament 187
	add	edx, [edi + window.text_line_print]
188
    cmp edx, [edi + window.text_lines]
189
	jl	.noscroll
4621 hidnplayr 190
  .yesscroll:
191
; Scrollbar was at lowest position, scroll down automatically when new text arrived.
4824 gtament 192
	mov	edx, [edi + window.text_lines]
193
	sub	edx, [textbox_height]
194
	jle	.noscroll				; There are less lines of text than fit into the window, dont scroll..
195
	sub	edx, [edi + window.text_line_print]
196
	je	.noscroll				; We are already at the bottom pos, dont scroll..
197
  .scroll_to_pos:		; edx = number of lines to go up/down (flags must indicate direction)
198
	pushf
199
	add	[edi + window.text_line_print], edx
200
	mov	esi, [edi + window.text_print]
201
	popf
202
	ja	.loop_forward
203
	std			; set direction flag so we can scan backwards
204
	dec	esi
205
	dec	esi		; move our cursor just in front of newline, for scanning backwards
4143 hidnplayr 206
  .loop_backward:
4824 gtament 207
	call	text_nextline
208
	inc	edx
209
	jnz	.loop_backward
210
	inc	esi
211
	inc	esi		; move the cursor just after last newline
212
	cld
213
	jmp	.ok
4060 hidnplayr 214
 
4143 hidnplayr 215
  .loop_forward:
4824 gtament 216
	call	text_nextline
217
	dec	edx
218
	jnz	.loop_forward
4143 hidnplayr 219
  .ok:
4824 gtament 220
	mov	[edi + window.text_print], esi
4143 hidnplayr 221
  .noscroll:
4060 hidnplayr 222
 
4622 hidnplayr 223
; Update and draw scrollbar when nescessary
4824 gtament 224
	mov	edx, [edi + window.text_lines]
225
	cmp	edx, [textbox_height]
226
	jbe	.scroll_done
4622 hidnplayr 227
 
4824 gtament 228
	mov	[scroll2.max_area], edx
229
	mov	eax, [edi + window.text_line_print]
230
	mov	[scroll2.position], eax
4622 hidnplayr 231
 
4824 gtament 232
	push	dword scroll2			; redraw scrollbar
233
	call	[scrollbar_draw]
234
	mov	[scroll2.all_redraw], 0 	; next time, dont redraw it completely
4622 hidnplayr 235
  .scroll_done:
236
 
4621 hidnplayr 237
; Calculate start offset coordinates (align text to bottom)
4824 gtament 238
	mov	ebx, [textbox_height]
239
	sub	ebx, [edi + window.text_lines]
240
	jb	.no_offset
241
	imul	ebx, FONT_HEIGHT
242
	push	[edi + window.text_start]
243
	pop	[edi + window.text_print]
244
	jmp	.draw_text
4621 hidnplayr 245
  .no_offset:
4824 gtament 246
	xor	ebx, ebx
4621 hidnplayr 247
  .draw_text:
4143 hidnplayr 248
; Prepare to actually draw some text
4824 gtament 249
	mov	eax, [textbox_height]	; max number of lines to draw
250
	add	ebx, TEXT_X shl 16 + TEXT_Y
251
	mov	ecx, [colors.work_text] ; default text color
252
	mov	edx, [edi + window.text_print]
4143 hidnplayr 253
  .drawloop:
4824 gtament 254
	cmp	byte[edx], 0
255
	je	.end_of_text
4060 hidnplayr 256
 
4143 hidnplayr 257
; Clear one row of characters
4824 gtament 258
	pusha
259
	mov	cx, bx
260
	shl	ecx, 16
261
	mov	cx, FONT_HEIGHT
262
	mov	ebx, TEXT_X shl 16
263
	mov	bx, word[textbox_width]
264
	imul	bx, FONT_WIDTH
265
	mov	edx, [colors.work]
266
	mcall	13			; draw rectangle
267
	popa
4060 hidnplayr 268
 
4824 gtament 269
	mov	esi, edx
270
	add	esi, [textbox_width]
4143 hidnplayr 271
  .line:
4824 gtament 272
	cmp	byte[edx], 0
273
	je	.end_of_text
4060 hidnplayr 274
 
4824 gtament 275
	cmp	byte[edx], 13
276
	je	.newline_soft
4143 hidnplayr 277
 
4824 gtament 278
	cmp	byte[edx], 10
279
	je	.newline_hard
4143 hidnplayr 280
 
4824 gtament 281
	push	esi eax
282
	cmp	byte[edx], 3		; escape code for mIRC colors
283
	jne	.no_colors
284
	inc	edx
285
	call	dec_to_esi
286
	jz	.no_colors
287
	mov	ecx, [irc_colors + 4*esi]
4143 hidnplayr 288
 
4824 gtament 289
	cmp	byte[edx], ','		; background color?
290
	jne	.no_colors
291
	inc	edx
292
	call	dec_to_esi
293
	jz	.no_colors
294
	mov	edi, [irc_colors + 4*esi]
295
	or	ecx, 0x40000000
4143 hidnplayr 296
  .no_colors:
297
 
4824 gtament 298
	mov	esi, 1
299
	mcall	4			; draw text
300
	add	ebx, FONT_WIDTH shl 16
301
	inc	edx
302
	pop	eax esi
303
	cmp	edx, esi
304
	jb	.line
305
	jmp	.line_full
4060 hidnplayr 306
 
4143 hidnplayr 307
  .newline_hard:
4824 gtament 308
	mov	ecx, [colors.work_text]
4143 hidnplayr 309
  .newline_soft:
4824 gtament 310
	inc	edx
4143 hidnplayr 311
  .line_full:
4824 gtament 312
	and	ebx, 0x0000ffff
313
	add	ebx, TEXT_X shl 16 + FONT_HEIGHT
314
	dec	eax
315
	jnz	.drawloop
4621 hidnplayr 316
  .end_of_text:
4060 hidnplayr 317
 
4824 gtament 318
	ret
4143 hidnplayr 319
 
320
 
321
 
322
 
323
dec_to_esi:
324
 
4824 gtament 325
	xor	esi, esi
4143 hidnplayr 326
  .loop:
4824 gtament 327
	movzx	eax, byte[edx]
328
	sub	al, '0'
329
	jb	.done
330
	cmp	al, 9
331
	ja	.done
332
	inc	edx
333
	lea	esi, [esi*4 + esi]	; esi * 5
334
	lea	esi, [esi*2 + eax]	; esi * 2 + eax
335
	jmp	.loop
4143 hidnplayr 336
  .done:
4824 gtament 337
	cmp	esi, 16
338
	jae	.fail
339
	ret
4143 hidnplayr 340
 
341
  .fail:
4824 gtament 342
	xor	esi, esi
343
	ret
4143 hidnplayr 344
 
345
 
346
 
347
if TIMESTAMP
348
print_timestamp:
349
 
4824 gtament 350
	pusha
351
	mcall	3			; get system time
352
	mov	ebx, eax
4143 hidnplayr 353
 
4824 gtament 354
	mov	al, '['
355
	call	print_char
356
	mov	ecx, TIMESTAMP
4143 hidnplayr 357
  .loop:
4824 gtament 358
	mov	al, bl
359
	shr	al, 4
360
	add	al, '0'
361
	call	print_char
4143 hidnplayr 362
 
4824 gtament 363
	mov	al, bl
364
	and	al, 0x0f
365
	add	al, '0'
366
	call	print_char
4143 hidnplayr 367
 
4824 gtament 368
	dec	ecx
369
	jz	.done
4143 hidnplayr 370
 
4824 gtament 371
	mov	al, ':'
372
	call	print_char
373
	shr	ebx, 8
374
	jmp	.loop
4143 hidnplayr 375
  .done:
4824 gtament 376
	mov	al, ']'
377
	call	print_char
378
	mov	al, ' '
379
	call	print_char
4143 hidnplayr 380
 
4824 gtament 381
	popa
382
	ret
4143 hidnplayr 383
end if