Subversion Repositories Kolibri OS

Rev

Rev 2320 | Rev 2322 | 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: 2321 $
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
2320 art_zh 173
        and     ecx, 7                      ; cl = number of ticks
2318 art_zh 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
2320 art_zh 194
        pushad
2318 art_zh 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:
2320 art_zh 205
        push    edx
206
        mov     cl, dh
207
        shr     cl, 3               ; orig.#
208
        mov     edx, [ebp+8]        ; orig. table
209
        mov     ch, byte[edx+ecx]   ; orig. coords
210
        pop     edx
211
        mov     cl, dh
2321 art_zh 212
        and     cl, 7                   ; three rotation bits
213
        and     edx, 0xFF               ; dl = gptick#
2320 art_zh 214
        sub     dl, 32
2321 art_zh 215
        cmp     dl, (sdsh_data.v5-sdsh_data.v1)
2320 art_zh 216
        jae     .gptick.2
217
.gptick.1:
218
        mov     esi, sdsh_data.tick_table
2321 art_zh 219
        add     esi, edx                ;  1-byte tickgroups .v1-v4:
2320 art_zh 220
        inc     dh
2321 art_zh 221
        sub     dl, 2                   ; .v1 : 2 ticks only (#32, 33)
222
        jae     @f
223
        mov     dl, dh
224
        jmp     .gptick.done
225
@@:     inc     dh
226
        shr     dl, 3                   ; tickgroups .v2-v4 : 8 ticks each
227
        add     dl, dh
228
        jmp     .gptick.done
2320 art_zh 229
.gptick.2:
230
        sub     dl, (sdsh_data.v5-sdsh_data.v1)
2321 art_zh 231
        cmp     dl, (sdsh_data.v9-sdsh_data.v5)
2320 art_zh 232
        jae     .gptick.3
233
        mov     esi, sdsh_data.v5
2321 art_zh 234
        lea     esi, [esi+edx*2]        ; 2-byte tickgroups .v5-v8: 8 ticks each
2320 art_zh 235
        mov     dh, 5
2321 art_zh 236
        shr     dl, 3
237
        add     dl, dh
238
        jmp     .gptick.done
2320 art_zh 239
.gptick.3:
240
        sub     dl, (sdsh_data.v9-sdsh_data.v5)
2321 art_zh 241
        cmp     dl, (sdsh_data.v13-sdsh_data.v9)
2320 art_zh 242
        jae     .gptick.4
243
        mov     esi, sdsh_data.v9
2321 art_zh 244
        lea     esi,[esi+edx*2+edx]     ; 3-byte tickgroups .v9-12: 4 ticks each
2320 art_zh 245
        mov     dh, 9
2321 art_zh 246
        shr     dl, 2
247
        add     dl, dh
248
        jmp     .gptick.done
2320 art_zh 249
.gptick.4:
250
        sub     dl, (sdsh_data.v13-sdsh_data.v9)
2321 art_zh 251
        cmp     dl, 16
252
        jae     .exit
2320 art_zh 253
        mov     esi, sdsh_data.v13
2321 art_zh 254
        lea     esi,[esi+edx*4]         ; 4-byte tickgroups .v13-16: 4 ticks each
2320 art_zh 255
        mov     dh, 13
2321 art_zh 256
        shr     dl, 2
257
        add     dl, dh
2320 art_zh 258
.gptick.done:
2321 art_zh 259
        mov     dh, ch                  ; dh = orig.XY;     dl = numvert
260
        jmp     .draw                   ; cl = rotation
2318 art_zh 261
 
262
.cstick:
263
        and     cl, 4
2321 art_zh 264
        shr     cl, 2                   ; only one rotational bit
2318 art_zh 265
        and     dl, 3
2321 art_zh 266
        inc     dl
2318 art_zh 267
        dec     dl
2321 art_zh 268
        jz      .cstick.0
2318 art_zh 269
        dec     dl
2321 art_zh 270
        jnz     @f
271
        mov     dl, 6
272
        jz      .cstick.1
273
@@:     dec     dl
274
        jz      .cstick.2
2318 art_zh 275
.cstick.3:
2321 art_zh 276
        mov     esi, sdsh_data.cs3      ; 12pix-ring
2318 art_zh 277
        mov     dl, 10
278
        jmp     .draw
279
.cstick.2:
280
        mov     dl, 7
281
.cstick.1:
2321 art_zh 282
        mov     esi, sdsh_data.cs2      ; the square
2318 art_zh 283
        jmp     .draw
2321 art_zh 284
.cstick.0:
285
        mov     esi, sdsh_data.cs0      ; 4pix-square
2318 art_zh 286
        mov     dl, 3
287
        jmp     .draw
288
 
289
.ritick:
290
        test    dl, 1
291
        jnz     .ritick.1
292
.ritick.0:
293
        mov     cl, dh              ; y
294
        and     cl, 0x0F
2320 art_zh 295
        sub     ebx, ecx
2318 art_zh 296
        mov     cl, dh
297
        shr     cl, 4               ; x
2320 art_zh 298
        add     eax, ecx
2318 art_zh 299
        call    ch_putpixel
300
        jmp     .exit
301
.ritick.1:
302
        mov     esi, sdsh_data.ri1  ; 8pix-ring
303
        mov     dl, 4
2320 art_zh 304
        xor     cl, cl
2318 art_zh 305
        jmp     .draw
306
 
307
.lntick.short:
308
        test    dl, 0x06            ; ticks #0, 1 are reserved for
309
        jz      .ritick             ;             rotational invariants
310
        and     dl, 0x07            ; dl = line length
311
        jmp     .lntick.both
312
.lntick.long:
313
        and     dl, 0x07
314
        add     dl, 8
315
.lntick.both:
316
        sub     dl, 2               ; num_vertice = num_points - 2
317
        and     cl, 0x18            ; two rotation bits
318
        shr     cl, 3
319
        mov     esi, sdsh_data.blank
320
.draw:
2320 art_zh 321
; cl = rot; dl = numvert; dh = orig.xy
2318 art_zh 322
        push    ecx
323
        mov     cl, dh              ; y
324
        and     cl, 0x0F
2320 art_zh 325
        sub     ebx, ecx
2318 art_zh 326
        mov     cl, dh
327
        shr     cl, 4               ; x
2320 art_zh 328
        add     eax, ecx
2318 art_zh 329
        pop     ecx
330
        call    draw_tick
2320 art_zh 331
.gptick.5:
2318 art_zh 332
.exit:
333
        popad
334
        ret
335
 
336
 
337
 
338
draw_tick:
339
; eax = x-origin
340
; ebx = y-origin
341
; edi = 0x0RRGGBB
342
;  cl = direction (0..7)
2320 art_zh 343
;  dl = number of vertices  (dl)
344
; esi -> tick bitfield
2318 art_zh 345
 
346
	pushad
2320 art_zh 347
    inc     dl                      ; -- that's to count down to 0
348
	call	ch_putpixel		        ; the point of origin
349
	and		ecx, 7
350
	call	[.moves + ecx*4]        ; basic vector
351
	call	ch_putpixel
352
    dec     dl
353
    jz      .done                   ; 2pix lines only
354
    mov     esi, dword [esi]        ; max 16 vertice bitfield limit
355
    xchg    esi, edx
2318 art_zh 356
.move_and_draw:
2320 art_zh 357
    mov     ch, dl
358
    and     ch, 3
359
    jz      .moved
360
    btc     ch, 0
361
    jz      .2
362
.1:
363
    dec     cl                      ; right turns (1 and 3)
364
    and     cl, 7
365
@@: btc     ch, 1                   ; straight angle (3) ?
366
    jc      .1
367
    jmp     .moved
368
.2:
369
    inc     cl                      ; left turn (2)
370
    and     cl, 7
371
    btc     ch, 1                   ; just to zero ah
372
.moved:
373
	call	[.moves + ecx*4]        ; go new way
374
	call	ch_putpixel
375
    shr     edx, 2
376
    dec     esi
377
    jnz     .move_and_draw
2318 art_zh 378
.done:
379
	popad
380
	ret
381
 
382
.move000:
383
	inc		eax
384
	ret
385
.move001:
386
	inc		eax
2320 art_zh 387
	dec		ebx
2318 art_zh 388
	ret
389
.move010:
2320 art_zh 390
	dec		ebx
2318 art_zh 391
	ret
392
.move011:
393
	dec		eax
2320 art_zh 394
	dec		ebx
2318 art_zh 395
	ret
2320 art_zh 396
.move100:
2318 art_zh 397
	dec		eax
398
	ret
2320 art_zh 399
.move101:
2318 art_zh 400
	dec		eax
2320 art_zh 401
	inc		ebx
2318 art_zh 402
	ret
2320 art_zh 403
.move110:
404
	inc		ebx
2318 art_zh 405
	ret
2320 art_zh 406
.move111:
2318 art_zh 407
	inc		eax
2320 art_zh 408
	inc		ebx
2318 art_zh 409
	ret
410
 
411
align 4
412
.moves dd .move000, .move001, .move010, .move011, .move100, .move101, .move110, .move111
413
 
414
;)
415
 
416
align 4
417
ch_checkscreen:
418
     cmp	[Screen_Max_X], eax
419
     jb		.getout
420
     cmp	[Screen_Max_Y], ebx
421
.getout:
422
     ret
423
 
424
align 4
425
ch_checkwin:
426
; eax = x coordinate
427
; ebx = y coordinate
428
; ebp -> font info
429
;!destroys ch, edx!
430
        push    eax, ebx
431
        mov     ch,  byte[CURRENT_TASK]
432
        mov     al,  byte [ebp]	            ; char X-width
433
        mov     edx, [_display.width]       ; screen X-size
434
        imul    edx, ebx
435
        add     edx, [_WinMapAddress]
436
        add     edx, eax
437
        cmp     ch,  byte [edx]
438
        jne     .fail
439
        moxzx   eax, byte [ebp]
440
        cmp     ch,  byte [edx+eax]
441
        jne     .fail
442
        moxzx   ebx, byte [ebp+1]
443
        imul    ebx, [_display.width]
444
        cmp     ch,  byte [edx+ebx]
445
        jne     .fail
446
        add     edx, eax
447
        cmp     ch,  byte [edx+ebx]
448
        clc
449
        je     .done
450
.fail:
451
        stc                                 ; CF means the charbox is invisible
452
.done:
453
        pop     ebx, eax
454
        ret
455
 
456
align 4
457
ch_putpixel:
458
; eax = x coordinate
459
; ebx = y coordinate
460
; edi = 0x0RRGGBB
461
     push   edx
462
	 mov	edx, ebx
463
     imul	edx, [BytesPerScanLine]
464
     lea	edx, [edx+eax*4]
465
     mov   [LFB_BASE+edx], edi
466
     pop   edx
467
     ret
468
;)
469
 
2014 art_zh 470
;diff16 "font  code end ",0,$
471
diff10 "font  code size",dtext,$