Subversion Repositories Kolibri OS

Rev

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