Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
221 serge 1
 
2
LOAD_FROM_MEM   equ 1
3
LOAD_INDIRECT   equ 2
4
LOAD_SYSTEM     equ 3
5
6
 
224 serge 7
  .biSize          dd ? ; DWORD
8
  .biWidth         dd ? ; LONG
9
  .biHeight        dd ? ; LONG
10
  .biPlanes        dw ? ; WORD
11
  .biBitCount      dw ? ; WORD
12
  .biCompression   dd ? ; DWORD
13
  .biSizeImage     dd ? ; DWORD
14
  .biXPelsPerMeter dd ? ; LONG
15
  .biYPelsPerMeter dd ? ; LONG
16
  .biClrUsed       dd ? ; DWORD
17
  .biClrImportant  dd ? ; DWORD
18
}
19
20
 
21
  BI BITMAPINFOHEADER
22
end virtual
23
24
 
221 serge 25
proc vesa_init_cursor stdcall, dst:dword, src:dword
26
           locals
27
             rBase    dd ?
28
             pQuad    dd ?
29
             pBits    dd ?
30
             pAnd     dd ?
31
             width    dd ?
32
             height   dd ?
33
             counter  dd ?
34
           endl
35
36
 
37
           add esi,[esi+18]
224 serge 38
           mov eax,esi
39
221 serge 40
 
224 serge 41
           je .img_24
42
.img_4:
43
           add eax, [esi]
221 serge 44
           mov [pQuad],eax
45
           add eax,64
46
           mov [pBits],eax
47
           add eax, 0x200
48
           mov [pAnd],eax
49
           mov eax,[esi+4]
50
           mov [width],eax
51
           mov ebx,[esi+8]
52
           shr ebx,1
53
           mov [height],ebx
54
55
 
56
           add edi, 32*31*4
57
           mov [rBase],edi
58
59
 
60
           mov ebx, [pBits]
61
.l1:
62
           mov eax, [esi]
63
           bswap eax
64
           mov [counter], 16
65
@@:
66
           xor edx, edx
67
           shl eax,1
68
           setc dl
69
           dec edx
70
71
 
72
           and ecx, 0xF0
73
           shr ecx, 2
74
           add ecx, [pQuad]
75
           mov ecx, [ecx]
76
           and ecx, edx
77
           and edx, 0xFF000000
78
           or edx, ecx
79
           mov [edi], edx
80
81
 
82
           shl eax,1
83
           setc dl
84
           dec edx
85
86
 
87
           and ecx, 0x0F
88
           shl ecx, 2
89
           add ecx, [pQuad]
90
           mov ecx, [ecx]
91
           and ecx, edx
92
           and edx, 0xFF000000
93
           or edx, ecx
94
           mov [edi+4], edx
95
96
 
97
           add edi, 8
98
           dec [counter]
99
           jnz @B
100
101
 
102
           mov edi,[rBase]
103
           sub edi,128
104
           mov [rBase],edi
105
           sub [height],1
106
           jnz .l1
107
           ret
108
.img_24:
224 serge 109
           add eax, [esi]
110
           mov [pQuad],eax
111
           add eax, 0xC00
112
           mov [pAnd],eax
113
           mov eax,[esi+BI.biWidth]
114
           mov [width],eax
115
           mov ebx,[esi+BI.biHeight]
116
           shr ebx,1
117
           mov [height],ebx
118
119
 
120
           add edi, 32*31*4
121
           mov [rBase],edi
122
123
 
124
           mov ebx, [pQuad]
125
.row_24:
126
           mov eax, [esi]
127
           bswap eax
128
           mov [counter], 32
129
@@:
130
           xor edx, edx
131
           shl eax,1
132
           setc dl
133
           dec edx
134
135
 
136
           and ecx, 0x00FFFFFF
137
           and ecx, edx
138
           and edx, 0xFF000000
139
           or edx, ecx
140
           mov [edi], edx
141
           add ebx, 3
142
           add edi, 4
143
           dec [counter]
144
           jnz @B
145
146
 
147
           mov edi,[rBase]
148
           sub edi,128
149
           mov [rBase],edi
150
           sub [height],1
151
           jnz .row_24
152
           ret
153
endp
221 serge 154
155
 
156
proc alloc_cursor
157
158
 
159
           cli
160
           mov ebx, [cursor_start]
161
           mov ecx, [cursor_end]
162
.l1:
163
           bsf eax,[ebx];
164
           jnz .found
165
           add ebx,4
166
           cmp ebx, ecx
167
           jb .l1
168
           popfd
169
           xor eax,eax
170
           ret
171
.found:
172
           btr [ebx], eax
173
           popfd
227 serge 174
175
 
221 serge 176
           sub ebx, cursor_map
177
           shl ebx, 3
178
           add eax,ebx
179
           shl eax,3
180
           lea eax,[cursors+eax+eax*2]
181
227 serge 182
 
183
           mov [eax+CURSOR.magic], 'CURS'
184
           mov [eax+CURSOR.size],  CURSOR_SIZE
185
           mov [eax+CURSOR.pid], ebx
186
           mov [eax+CURSOR.hot_x], ebx
187
           mov [eax+CURSOR.hot_y], ebx
188
           ret
221 serge 189
endp
190
191
 
192
proc set_cursor stdcall, hcursor:dword
227 serge 193
           mov eax, [hcursor]
194
           cmp [eax+CURSOR.magic], 'CURS'
230 serge 195
           jne .fail
196
           cmp [eax+CURSOR.size], CURSOR_SIZE
197
           jne .fail
198
           mov ebx, [CURRENT_TASK]
227 serge 199
           shl ebx, 8
200
           xchg eax, [ebx+PROC_BASE+APPDATA.cursor]
201
           ret
202
.fail:
230 serge 203
           mov eax, [def_cursor]
204
           mov ebx, [CURRENT_TASK]
205
           shl ebx, 8
206
           xchg eax, [ebx+PROC_BASE+APPDATA.cursor]
207
           ret
208
endp
227 serge 209
221 serge 210
 
227 serge 211
212
 
213
           test eax, eax
221 serge 214
           jz .fail
215
216
 
227 serge 217
           mov [edi+CURSOR.base], eax
218
221 serge 219
 
227 serge 220
           mov ebx, [flags]
221
           cmp bx, LOAD_INDIRECT
222
           je .indirect
223
221 serge 224
 
227 serge 225
           movzx edx, word [esi+12]
226
           mov [edi+CURSOR.hot_x], ecx
227
           mov [edi+CURSOR.hot_y], edx
228
221 serge 229
 
227 serge 230
           mov eax, [hcursor]
231
.fail:
221 serge 232
           ret
233
.indirect:
227 serge 234
           shr ebx, 16
235
           movzx ecx, bh
236
           movzx edx, bl
237
           mov [eax+CURSOR.hot_x], ecx
238
           mov [eax+CURSOR.hot_y], edx
239
221 serge 240
 
227 serge 241
           mov ecx, 1024
242
           cld
243
           rep movsd
244
           ret
221 serge 245
endp
246
247
 
248
proc load_cursor stdcall, src:dword, flags:dword
249
           locals
250
             handle  dd ?
251
           endl
252
253
 
227 serge 254
           mov [handle], eax
255
           cmp word [flags], LOAD_FROM_FILE
256
           jne @F
257
221 serge 258
 
259
           test eax, eax
260
           jz .exit
261
           mov [src], eax
262
@@:
227 serge 263
           call alloc_cursor
264
           test eax, eax
221 serge 265
           jz .fail
266
267
 
230 serge 268
           shl ebx, 5
269
           mov ebx, [0x3000+ebx+4]
270
           mov [eax+CURSOR.pid], ebx
271
272
 
227 serge 273
           mov [handle], eax
221 serge 274
.fail:
227 serge 275
           cmp word [flags], LOAD_FROM_FILE
276
           jne .exit
277
           stdcall kernel_free, [src]
221 serge 278
.exit:
227 serge 279
           mov eax, [handle]
221 serge 280
           ret
281
endp
282
283
 
284
proc init_cursors
285
           movzx eax, byte [ScreenBPP]
286
           mov ebx, [SCR_BYTES_PER_LINE]
287
           cmp eax, 32
288
           jne @F
289
           sub ebx, 128
290
           jmp .init
291
@@:
292
           cmp eax, 24
293
           jne .fail
294
           sub ebx, 96
295
.init:
296
           mov [cur_def_interl], ebx
297
298
 
299
           mov edi, cursors
300
           mov ecx, CURSOR_SIZE*16
301
           cld
302
           rep stosd
303
304
 
305
           mov [cursor_map], eax
306
           mov [cursor_map+4], eax
307
           mov edx, cursor_map
308
           mov [cursor_start], edx
309
           add edx, 8
230 serge 310
           mov [cursor_end], edx
221 serge 311
312
 
227 serge 313
           test eax, eax
314
           jz .sw_mouse
315
316
 
221 serge 317
           mov [def_cursor], eax
318
           ret
227 serge 319
.sw_mouse:
320
           mov [create_cursor], vesa_cursor
321
221 serge 322
 
227 serge 323
           mov [def_cursor], eax
324
325
 
221 serge 326
           mov edx, [SCR_Y_SIZE]
327
           inc ecx
328
           inc edx
329
           mov [scr_width], ecx
330
           mov [scr_height], edx
331
332
 
333
           cmp ebx, 32
334
           jne @F
335
336
 
337
           mov dword [hw_restore], restore_32
338
           ret
339
@@:
340
           mov dword [set_hw_cursor], cursor_24
341
           mov dword [hw_restore], restore_24
342
           ret
343
.fail:
344
           xor eax, eax
345
           mov dword [set_hw_cursor], eax
346
           mov dword [hw_restore], eax
347
           ret
348
endp
349
350
 
351
proc restore_24 stdcall, x:dword, y:dword
352
           locals
353
             w  dd ?
354
           endl
355
356
 
357
           mov edx, [cur_saved_h]
358
           mov ebx, [cur_saved_interl]
359
360
 
361
@@:
362
           mov ecx, [cur_saved_w]
363
           lea ecx, [ecx+ecx*2]
364
           rep movsb
365
           add edi, ebx
366
           dec edx
367
           jnz @B
368
           ret
369
endp
370
371
 
372
proc restore_32 stdcall, x:dword, y:dword
373
           locals
374
             w  dd ?
375
           endl
376
377
 
378
           mov edx, [cur_saved_h]
379
           mov ebx, [cur_saved_interl]
380
381
 
382
@@:
383
           mov ecx, [cur_saved_w]
384
           rep movsd
385
           add edi, ebx
386
           dec edx
387
           jnz @B
388
           ret
389
endp
390
391
 
392
proc cursor_24 stdcall, hcursor:dword, x:dword, y:dword
393
           locals
394
             w      dd ?
395
             h      dd ?
396
             st     dd ?
397
             _dx     dd ?
398
             _dy     dd ?
399
           endl
400
401
 
402
           mov ecx, [x]
403
           mov eax, [y]
404
           mov ebx, [BytesPerScanLine]
405
406
 
407
           sub ecx, [esi+CURSOR.hot_x]
408
           mov [x], ecx
409
           sets dl
410
           dec edx
411
           and ecx, edx       ;clip x to 0<=x
412
           mov edi, ecx
413
           sub edi, [x]
414
           mov [_dx], edi
415
416
 
417
           sub eax, [esi+CURSOR.hot_y]
418
           mov [y], eax
419
           sets dl
420
           dec edx
421
           and eax, edx       ;clip y to 0<=y
422
           mov edi, eax
423
           sub edi, [y]
424
           mov [_dy], edi
425
426
 
427
           lea esi, [ecx+ecx*2]
428
           add esi, [LFBAddress]
429
           add esi, eax
430
           mov [cur_saved_base],esi
431
432
 
433
           mov edx, [scr_height]
434
           mov eax, 32
435
436
 
437
           cmp edi, eax
438
           jng @F
224 serge 439
           mov edi, eax
440
@@:
441
           sub edi, [_dx]
221 serge 442
443
 
444
           cmp edx, eax
445
           jng @F
224 serge 446
           mov edx, eax
447
@@:
448
           sub edx, [_dy]
221 serge 449
450
 
451
           mov [h], edx
452
           mov [cur_saved_w], edi
453
           mov [cur_saved_h], edx
454
455
 
456
           shl eax, 2       ;lea eax, [eax+eax*2]
224 serge 457
           lea edi, [edi+edi*2]
221 serge 458
           sub ebx, edi
459
           mov [cur_saved_interl], ebx
460
461
 
462
@@:
463
           mov ecx, [w]
464
           lea ecx, [ecx+ecx*2]
465
           rep movsb
466
           add esi, ebx
467
           dec edx
468
           jnz @B
469
470
 
471
           mov edx, eax
472
           mov edi, [cur_saved_base]
473
           mov eax, [_dy]
474
           shl eax, 5
475
           add eax, [_dx]
476
           shl eax, 2
477
478
 
479
           mov esi, [esi+CURSOR.base]
480
           add esi, eax
481
.row:
482
           mov ecx, [w]
483
.pix:
484
           lodsd
485
           test eax, 0xFF000000
486
           jz @F
487
488
 
489
           shr eax, 16
490
           mov [edi+2],al
491
@@:
492
           add edi, 3
493
           dec ecx
494
           jnz .pix
495
496
 
497
           add edi, ebx
498
           dec [h]
499
           jnz .row
500
           ret
501
endp
502
503
 
504
proc cursor_32 stdcall, hcursor:dword, x:dword, y:dword
505
           locals
506
             w      dd ?
507
             h      dd ?
508
             st     dd ?
509
             _dx     dd ?
510
             _dy     dd ?
511
           endl
512
513
 
514
           mov ecx, [x]
515
           mov eax, [y]
516
           mov ebx, [BytesPerScanLine]
517
518
 
519
           sub ecx, [esi+CURSOR.hot_x]
520
           mov [x], ecx
521
           sets dl
522
           dec edx
523
           and ecx, edx       ;clip x to 0<=x
524
           mov edi, ecx
525
           sub edi, [x]
526
           mov [_dx], edi
527
528
 
529
           sub eax, [esi+CURSOR.hot_y]
530
           mov [y], eax
531
           sets dl
532
           dec edx
533
           and eax, edx       ;clip y to 0<=y
534
           mov edi, eax
535
           sub edi, [y]
536
           mov [_dy], edi
537
538
 
539
           lea esi, [eax+ecx*4]
540
           add esi, [LFBAddress]
541
           mov [cur_saved_base],esi
542
543
 
544
           mov edx, [scr_height]
545
           mov eax, 32
546
547
 
548
           cmp edi, eax
549
           jng @F
224 serge 550
           mov edi, eax
551
@@:
552
           sub edi, [_dx]
221 serge 553
554
 
555
           cmp edx, eax
556
           jng @F
224 serge 557
           mov edx, eax
558
@@:
559
           sub edx, [_dy]
221 serge 560
561
 
562
           mov [h], edx
563
           mov [cur_saved_w], edi
564
           mov [cur_saved_h], edx
565
566
 
567
           shl eax, 2
568
           shl edi, 2
569
           sub ebx, edi
570
           mov [cur_saved_interl], ebx
571
572
 
573
@@:
574
           mov ecx, [w]
575
           rep movsd
576
           add esi, ebx
577
           dec edx
578
           jnz @B
579
580
 
581
           mov edx, eax
582
           mov edi, [cur_saved_base]
583
           mov eax, [_dy]
584
           shl eax, 5
585
           add eax, [_dx]
586
           shl eax, 2
587
588
 
589
           mov esi, [esi+CURSOR.base]
590
           add esi, eax
591
.row:
592
           mov ecx, [w]
593
.pix:
594
           lodsd
595
           test eax, 0xFF000000
596
           jz @F
597
           mov [edi], eax
598
@@:
599
           add edi, 4
600
           dec ecx
601
           jnz .pix
602
           add esi, edx
603
           add edi, ebx
604
           dec [h]
605
           jnz .row
606
           ret
607
endp
608
609
 
610
def_arrow:
611
  file 'arrow.cur'
612
>
613