Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2318 art_zh 1
.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
431 serge 2
;;                                                              ;;
983 diamond 3
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 2318 $
9
 
803 alver 10
; // Alver 22.06.2008 // {
11
align 4
2014 art_zh 12
dtext_asciiz_esi:			   ; for skins title out
803 alver 13
    push eax
14
    xor eax, eax
15
    inc eax
16
    jmp    dtext.1
17
; } \\ Alver \\
593 mikedld 18
 
1 ha 19
align 4
2014 art_zh 20
dtext:	; Text String Output (rw by Johnny_B[john@kolibrios.org])
21
	; ebx x & y
22
	; ecx style ( 0xX0000000 ) & color ( 0x00RRGGBB )
23
	; X = ABnnb:
24
	; nn = font
25
	; A = 0 <=> output esi characters; otherwise output ASCIIZ string
26
	; B = 1 <=> fill background with color eax
27
	; edx start of text
28
	; edi 1 force
1 ha 29
 
803 alver 30
; // Alver 22.06.2008 // {
31
       push eax
2014 art_zh 32
	xor	eax, eax
803 alver 33
.1:
34
; } \\ Alver \\
2014 art_zh 35
	pushad
36
	call	[_display.disable_mouse]
1 ha 37
 
2014 art_zh 38
	movsx	eax, bx 	; eax=y
39
	sar	ebx, 16 	; ebx=x
40
	xchg	eax, ebx	; eax=x, ebx=y
41
	cmp	esi, 255
42
	jb	.loop
43
	mov	esi, 255
139 diamond 44
.loop:
2014 art_zh 45
	test	ecx, ecx
46
	js	.test_asciiz
47
	dec	esi
48
	js	.end
49
	jmp	@f
139 diamond 50
.test_asciiz:
2014 art_zh 51
	cmp	byte [edx], 0
52
	jz	.end
803 alver 53
; // Alver 22.06.2008 // {
2014 art_zh 54
	cmp byte [esp+28], 1	;  was the entry point = dtext.1 ?
55
	jne   @f
56
	dec	esi
57
	js	  .end
803 alver 58
; } \\ Alver \\
139 diamond 59
@@:
2014 art_zh 60
	inc	edx
61
	pushad			; esp -= 64 !
62
	movzx	edx, byte [edx-1]
63
	test	ecx, 0x10000000
64
	jnz	.font2
65
	mov	esi, 9
66
	lea	ebp, [FONT_I+8*edx+edx]
139 diamond 67
.symloop1:
2014 art_zh 68
	mov	dl, byte [ebp]
69
	or	dl, 1 shl 6
139 diamond 70
.pixloop1:
2014 art_zh 71
	shr	dl, 1
72
	jz	.pixloop1end
73
	jnc	.nopix
74
	call	[putpixel]
75
	jmp	.pixloop1cont
12 halyavin 76
.nopix:
2014 art_zh 77
	test	ecx, 0x40000000
78
	jz	.pixloop1cont
79
	push	ecx
80
	mov	ecx, [esp+4+20h+20h]	; original eax?
81
	call	[putpixel]
82
	pop	ecx
139 diamond 83
.pixloop1cont:
2014 art_zh 84
	inc	eax
85
	jmp	.pixloop1
139 diamond 86
.pixloop1end:
2014 art_zh 87
	sub	eax, 6
88
	inc	ebx
89
	inc	ebp
90
	dec	esi
91
	jnz	.symloop1
92
	popad
93
	add	eax, 6
94
	jmp	.loop
139 diamond 95
.font2:
2014 art_zh 96
	add	edx, edx
97
	lea	ebp, [FONT_II+4*edx+edx+1]
98
	push	9
99
	movzx	esi, byte [ebp-1]
139 diamond 100
.symloop2:
2014 art_zh 101
	mov	dl, byte [ebp]
102
	push	esi
139 diamond 103
.pixloop2:
2014 art_zh 104
	shr	dl, 1
105
	jnc	.nopix2
106
	call	[putpixel]
107
	jmp	.pixloop2cont
139 diamond 108
.nopix2:
2014 art_zh 109
	test	ecx, 0x40000000
110
	jz	.pixloop2cont
111
	push	ecx
112
	mov	ecx, [esp+12+20h+20h]
113
	call	[putpixel]
114
	pop	ecx
139 diamond 115
.pixloop2cont:
2014 art_zh 116
	inc	eax
117
	dec	esi
118
	jnz	.pixloop2
119
	pop	esi
120
	sub	eax, esi
121
	inc	ebx
122
	inc	ebp
123
	dec	dword [esp]
124
	jnz	.symloop2
125
	pop	eax
126
	add	dword [esp+28], esi
127
	popad
128
	jmp	.loop
139 diamond 129
.end:
2014 art_zh 130
	popad
131
	pop  eax		; << // Alver 22.06.2008 // <<
132
	ret
2318 art_zh 133
 
134
;=====================================================
135
; NEW FONTS
136
;_____________________________________________________
137
;
138
 
139
align 8
140
sdsh_data:
141
 
142
include 'sdsh.inc'
143
 
144
sdsh_code:
145
 
146
; eax	=	if (bit[31])
147
;				then lower 31 bits points to the user-selected font
148
;				else ax = number of preloaded system font
149
; ebx	=	x<<16 + y
150
; ecx	=	0x00RRGGBB
151
; edx	=	if (bits[31:8] == 0)
152
;				then dl = single char to write
153
;				else edx= pointer to asciiz-string
154
 
155
 
156
sdsh_draw_char:
157
; eax = left side X
158
; ebx = bottom Y
159
; edi = color 0x0RRGGBB
160
; ebp = font@
161
; ecx = ascii, zero-extended to 32bits
162
        push    ecx, edx, ebp
163
        shl     ebp, 4
164
        add     ebp, sdsh_data.info
165
        call	ch_checkscreen
166
        jb		.exit
167
        call	ch_checkwin
168
        jc		.exit
169
        xor		ch, ch
170
        mov     edx, [ebp + 4]              ; chartable addr
171
        mov		cx, word[edx + ecx*2]       ; tick info
172
        mov		edx, ecx
173
        and     ecx, 15                     ; cl = number of ticks
174
        jz      .blank
175
        shr     edx, 4                      ; offset in the chartable
176
        add     edx, [sdsh_data.chars]      ; edx -> the char's ticklist
177
.next_tick:
178
        call    parse_tick
179
        add     edx, 4
180
        dec     cl
181
        jnz     .next_tick
182
.blank:
183
.exit:
184
        pop     ebp, edx, ecx
185
        ret
186
 
187
 
188
parse_tick:
189
; eax = left side X
190
; ebx = bottom Y
191
; edx ->tickinfo
192
; edi = color 0x0RRGGBB
193
; ebp = font's header
194
        popad
195
        xor     ecx, ecx
196
        mov     dx, word[edx]
197
        mov     cl, dl
198
        test    dl, 0xE0            ; ticks #32..255
199
        jz      .lntick.short
200
        cmp     dl, 0xE0
201
        jae     .lntick.long
202
        cmp     dl, 0xC0
203
        jae     .cstick
204
.gptick:
205
        mov     cl, dh              ; three rotation bits
206
        and     cl, 7
207
        mov     dh,  ... - origin
208
        mov     dl, .... - num_vertices!!
209
        mov     esi, ... - tickfield??
210
        jmp     .draw
211
 
212
.cstick:
213
        and     cl, 4
214
        shr     cl, 2               ; only one rotational bit
215
        and     dl, 3
216
        dec     dl
217
        jb      .cstick.0
218
        mov     esi, sdsh_data.cs2  ; the square
219
        dec     dl
220
        jb      .cstick.1
221
        dec     dl
222
        jb      .cstick.2
223
.cstick.3:
224
        mov     esi, sdsh_data.cs3  ; 12pix-ring
225
        mov     dl, 10
226
        jmp     .draw
227
.cstick.2:
228
        mov     dl, 7
229
        jmp     .draw
230
.cstick.1:
231
        mov     dl, 6
232
        jmp     .draw
233
.cstick.3:
234
        mov     esi, sdsh_data.cs0  ; 4pix-square
235
        mov     dl, 3
236
        jmp     .draw
237
 
238
.ritick:
239
        test    dl, 1
240
        jnz     .ritick.1
241
.ritick.0:
242
        mov     cl, dh              ; y
243
        and     cl, 0x0F
244
        and     ebx, ecx
245
        mov     cl, dh
246
        shr     cl, 4               ; x
247
        and     eax, ecx
248
        call    ch_putpixel
249
        jmp     .exit
250
.ritick.1:
251
        mov     esi, sdsh_data.ri1  ; 8pix-ring
252
        mov     dl, 4
253
        jmp     .draw
254
 
255
.lntick.short:
256
        test    dl, 0x06            ; ticks #0, 1 are reserved for
257
        jz      .ritick             ;             rotational invariants
258
        and     dl, 0x07            ; dl = line length
259
        jmp     .lntick.both
260
.lntick.long:
261
        and     dl, 0x07
262
        add     dl, 8
263
.lntick.both:
264
        sub     dl, 2               ; num_vertice = num_points - 2
265
        and     cl, 0x18            ; two rotation bits
266
        shr     cl, 3
267
        mov     esi, sdsh_data.blank
268
.draw:
269
        push    ecx
270
        mov     cl, dh              ; y
271
        and     cl, 0x0F
272
        and     ebx, ecx
273
        mov     cl, dh
274
        shr     cl, 4               ; x
275
        and     eax, ecx
276
        pop     ecx
277
        call    draw_tick
278
.exit:
279
        popad
280
        ret
281
 
282
 
283
 
284
 
285
 
286
 
287
draw_tick:
288
; eax = x-origin
289
; ebx = y-origin
290
; edi = 0x0RRGGBB
291
;  cl = direction (0..7)
292
;  ch = number of vertices
293
; edx -> tick bitfield
294
 
295
	pushad
296
	call	putchpixel		; point 0
297
	xor		ecx, ecx
298
	mov		edx, ecx
299
	mov		dl, byte[esi]
300
	and		dl, 7
301
	mov		cl, 3
302
.move_and_draw:
303
	xor		dh, dh
304
	call	[.moves + edx*4]
305
	call	putchpixel
306
 
307
	shl		edx, 5			; prepare to move the old value to dh
308
	bt		[esi], ecx
309
 
310
	rol		edx, 1
311
	inc		ecx
312
	bt		[esi], ecx
313
	rol		edx, 1
314
	inc		ecx
315
	bt		[esi], ecx
316
	rol		edx, 1
317
	inc		ecx
318
	xor		dh, dl
319
	jnz		.move_and_draw	; any step-back means the end
320
.done:
321
	popad
322
	ret
323
 
324
.move000:
325
	inc		eax
326
	ret
327
.move001:
328
	inc		eax
329
	inc		ebx
330
	ret
331
.move010:
332
	inc		ebx
333
	ret
334
.move011:
335
	dec		eax
336
	inc		ebx
337
	ret
338
.move111:
339
	dec		eax
340
	ret
341
.move110:
342
	dec		eax
343
	dec		ebx
344
	ret
345
.move101:
346
	dec		ebx
347
	ret
348
.move100:
349
	dec		ebx
350
	inc		eax
351
	ret
352
 
353
align 4
354
.moves dd .move000, .move001, .move010, .move011, .move100, .move101, .move110, .move111
355
 
356
;)
357
 
358
align 4
359
ch_checkscreen:
360
     cmp	[Screen_Max_X], eax
361
     jb		.getout
362
     cmp	[Screen_Max_Y], ebx
363
.getout:
364
     ret
365
 
366
align 4
367
ch_checkwin:
368
; eax = x coordinate
369
; ebx = y coordinate
370
; ebp -> font info
371
;!destroys ch, edx!
372
        push    eax, ebx
373
        mov     ch,  byte[CURRENT_TASK]
374
        mov     al,  byte [ebp]	            ; char X-width
375
        mov     edx, [_display.width]       ; screen X-size
376
        imul    edx, ebx
377
        add     edx, [_WinMapAddress]
378
        add     edx, eax
379
        cmp     ch,  byte [edx]
380
        jne     .fail
381
        moxzx   eax, byte [ebp]
382
        cmp     ch,  byte [edx+eax]
383
        jne     .fail
384
        moxzx   ebx, byte [ebp+1]
385
        imul    ebx, [_display.width]
386
        cmp     ch,  byte [edx+ebx]
387
        jne     .fail
388
        add     edx, eax
389
        cmp     ch,  byte [edx+ebx]
390
        clc
391
        je     .done
392
.fail:
393
        stc                                 ; CF means the charbox is invisible
394
.done:
395
        pop     ebx, eax
396
        ret
397
 
398
align 4
399
ch_putpixel:
400
; eax = x coordinate
401
; ebx = y coordinate
402
; edi = 0x0RRGGBB
403
     push   edx
404
	 mov	edx, ebx
405
     imul	edx, [BytesPerScanLine]
406
     lea	edx, [edx+eax*4]
407
     mov   [LFB_BASE+edx], edi
408
     pop   edx
409
     ret
410
 
411
;)
412
 
413
 
414
 
415
 
2014 art_zh 416
;diff16 "font  code end ",0,$
417
diff10 "font  code size",dtext,$