Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1921 dunkaist 1
proc blend_rgb
2
 
3
        xchg    al,     bh
4
        mov     ah,     bh
5
        neg     ax
6
        add     ax,     0xffff
7
        mul     ah
8
        neg     ah
9
        add     ah,     0xff
10
        xchg    ah,     bh
11
 
12
        mov     al,     0xff
13
        cmp     ah,     bh
14
         je     @f
15
        not     al
16
        div     bh
17
@@:
18
 
19
        mov     ah,     al
20
        movd    mm1,    eax
21
;        pxor    mm0,    mm0        ; already xor'ed in composite function
22
        punpcklbw   mm1,    mm1
23
        punpcklbw   mm1,    mm0
24
;        punpcklbw   mm3,    mm0
25
 
26
        movq        mm7,    mm1
27
        psrlw       mm7,    7
28
        paddw       mm1,    mm7
29
 
30
        psubw       mm3,    mm2
31
        pmullw      mm3,    mm1
32
        psllw       mm2,    8
33
        paddw       mm3,    mm2
34
        pinsrw      mm3,    ebx,    3
35
        psrlw       mm3,    8
36
        packuswb    mm3,    mm0
37
        movd        eax,    mm3
38
 
39
        ret
40
endp
41
 
42
 
43
proc blend_gray
44
 
45
        xchg    al,     bh
46
        mov     ah,     bh
47
        neg     ax
48
        add     ax,     0xffff
49
        mul     ah
50
        neg     ah
51
        add     ah,     0xff
52
        xchg    ah,     bh
53
 
54
        mov     al,     0xff
55
        cmp     ah,     bh
56
         je     @f
57
        not     al
58
        div     bh
59
@@:
60
 
61
        mov     ah,     al
62
        movd    mm1,    eax
63
;        pxor    mm0,    mm0        ; already xor'ed in composite function
64
        punpcklbw   mm1,    mm1
65
        punpcklbw   mm1,    mm0
66
;        punpcklbw   mm3,    mm0
67
 
68
        movq        mm7,    mm1
69
        psrlw       mm7,    7
70
        paddw       mm1,    mm7
71
 
72
        psubw       mm3,    mm2
73
        pmullw      mm3,    mm1
74
        psllw       mm2,    8
75
        paddw       mm3,    mm2
76
        pinsrw      mm3,    ebx,    1
77
        psrlw       mm3,    8
78
        packuswb    mm3,    mm0
79
        movd        eax,    mm3
80
 
81
        ret
82
endp
83
 
84
 
85
proc merge_32 _copy_width, _copy_height, _img_total_bpl, _bottom_total_bpl
86
.rgb_line:
87
        mov     ecx,    [_copy_width]
88
.rgb_pixel:
89
        mov     ebx,    [edi]
90
        lodsd
91
 
92
        movd    mm2,    ebx
93
        movd    mm3,    eax
94
        shr     eax,    24
95
        shr     ebx,    16
96
        cmp     al,     bh
97
         jna    @f
98
        mov     al,     bh
99
@@:     pxor    mm0,    mm0
100
        call    edx
101
        call    blend_rgb
102
        stosd
103
        dec     ecx
104
         jnz    .rgb_pixel
105
        add     esi,    [_img_total_bpl]
106
        add     edi,    [_bottom_total_bpl]
107
        dec     [_copy_height]
108
         jnz    .rgb_line
109
        emms
110
        ret
111
endp
112
 
113
 
114
proc merge_8a _copy_width, _copy_height, _img_total_bpl, _bottom_total_bpl
115
.gray_line:
116
        mov     ecx,    [_copy_width]
117
.gray_pixel:
118
        mov     bx,     word[edi]
119
        lodsw
120
        movd    mm2,    ebx
121
        movd    mm3,    eax
122
        shr     eax,    8
123
        cmp     al,     bh
124
         jna    @f
125
        mov     al,     bh
126
@@:     pxor    mm0,    mm0
127
        call    edx
128
        call    blend_gray
129
        stosw
130
        dec     ecx
131
         jnz    .gray_pixel
132
        add     esi,    [_img_total_bpl]
133
        add     edi,    [_bottom_total_bpl]
134
        dec     [_copy_height]
135
         jnz    .gray_line
136
        emms
137
        ret
138
endp
139
 
140
 
141
proc composite_rgb_00 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
142
 
143
.line:  mov     ecx,    [_copy_width]
144
.pixel: mov     ebx,    [edi]
145
        lodsd
146
        movd    mm2,    ebx
147
        movd    mm3,    eax
148
 
149
        shr     eax,    24
150
        shr     ebx,    16
151
 
152
        xchg    al,     bh
153
        mov     ah,     bh
154
        neg     ax
155
        add     ax,     0xffff
156
        mul     ah
157
        neg     ah
158
        add     ah,     0xff
159
        xchg    ah,     bh
160
 
161
        mov     al,     0xff
162
        cmp     ah,     bh
163
         je    @f
164
        not     al
165
        div     bh
166
@@:
167
 
168
        mov     ah,     al
169
        movd    mm1,    eax
170
        pxor    mm0,    mm0
171
        punpcklbw   mm1,    mm1
172
        punpcklbw   mm1,    mm0
173
        punpcklbw   mm2,    mm0
174
        punpcklbw   mm3,    mm0
175
 
176
        psubsw      mm3,    mm2
177
        pmullw      mm3,    mm1
178
        psllw       mm2,    8
179
        paddw       mm3,    mm2
180
        pinsrw      mm3,    ebx,    3
181
        psrlw       mm3,    8
182
        packuswb    mm3,    mm0
183
        movd        eax,    mm3
184
        stosd
185
 
186
        dec     ecx
187
         jnz    .pixel
188
        add     esi,    [_img_total_bpl]
189
        add     edi,    [_bottom_total_bpl]
190
        dec     [_copy_height]
191
         jnz    .line
192
 
193
        ret
194
endp
195
 
196
 
197
proc composite_gray_00 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
198
 
199
.line:  mov     ecx,    [_copy_width]
200
.pixel: mov     bx,     [edi]
201
        lodsw
202
        movd    mm2,    ebx
203
        movd    mm3,    eax
204
 
205
        shr     eax,    8
206
 
207
        xchg    al,     bh
208
        mov     ah,     bh
209
        neg     ax
210
        add     ax,     0xffff
211
        mul     ah
212
        neg     ah
213
        add     ah,     0xff
214
        xchg    ah,     bh
215
 
216
        mov     al,     0xff
217
        cmp     ah,     bh
218
         je    @f
219
        not     al
220
        div     bh
221
@@:
222
 
223
        mov     ah,     al
224
        movd    mm1,    eax
225
        pxor    mm0,    mm0
226
        punpcklbw   mm1,    mm1
227
        punpcklbw   mm1,    mm0
228
        punpcklbw   mm2,    mm0
229
        punpcklbw   mm3,    mm0
230
 
231
        psubw       mm3,    mm2
232
        pmullw      mm3,    mm1
233
        psllw       mm2,    8
234
        paddw       mm3,    mm2
235
        pinsrw      mm3,    ebx,    1
236
        psrlw       mm3,    8
237
        packuswb    mm3,    mm0
238
        movd        eax,    mm3
239
        stosw
240
 
241
        dec     ecx
242
         jnz    .pixel
243
        add     esi,    [_img_total_bpl]
244
        add     edi,    [_bottom_total_bpl]
245
        dec     [_copy_height]
246
         jnz    .line
247
 
248
        ret
249
endp
250
 
251
 
252
proc composite_indexed_00 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
253
 
254
.line:  mov     ecx,    [_copy_width]
255
.pixel: mov     bx,     [edi]
256
        lodsw
257
 
258
        or      ah,     0x7f
259
        test    ah,     0x80
260
         jnz    @f
261
        mov     ax,     bx
262
@@:     stosw
263
 
264
        dec     ecx
265
         jnz    .pixel
266
        add     esi,    [_img_total_bpl]
267
        add     edi,    [_bottom_total_bpl]
268
        dec     [_copy_height]
269
         jnz    .line
270
        ret
271
endp
272
 
273
 
274
proc composite_rgb_01 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
275
        pushad
276
 
277
        pxor    mm4,    mm4
278
        movd    mm4,    [random_b]
279
        movd    mm1,    [random_a]
280
        movd    mm2,    [random_c]
281
 
282
.line:  mov     ecx,    [_copy_width]
283
.pixel: mov     ebx,    [edi]
284
        lodsd
285
 
286
        movq    mm0,    mm4
287
        pmuludq mm0,    mm1
288
        paddq   mm0,    mm2
289
        movd    edx,    mm0
290
        movd    mm4,    edx
291
        pxor    mm0,    mm0
292
 
293
        rol     eax,    8
294
        test    al,     al
295
         jz     @f
296
        shr     edx,    17
297
        cmp     dl,     al
298
         ja     @f
299
        ror     eax,    8
300
        or      eax,    0xff000000
301
         jmp    .done
302
@@:     mov     eax,    ebx
303
.done:  stosd
304
        dec     ecx
305
         jnz    .pixel
306
        add     esi,    [_img_total_bpl]
307
        add     edi,    [_bottom_total_bpl]
308
        dec     [_copy_height]
309
         jnz    .line
310
 
311
.quit:  popad
312
        ret
313
endp
314
 
315
 
316
proc composite_gray_01 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
317
        pushad
318
 
319
        pxor    mm4,    mm4
320
        movd    mm4,    [random_b]
321
        movd    mm1,    [random_a]
322
        movd    mm2,    [random_c]
323
 
324
.line:  mov     ecx,    [_copy_width]
325
.pixel: mov     ebx,    [edi]
326
        lodsw
327
 
328
        movq    mm0,    mm4
329
        pmuludq mm0,    mm1
330
        paddq   mm0,    mm2
331
        movd    edx,    mm0
332
        movd    mm4,    edx
333
        pxor    mm0,    mm0
334
 
335
        test    ah,     ah
336
         jz     @f
337
        shr     edx,    17
338
        cmp     dl,     ah
339
         ja     @f
340
        or      ax,     0xff00
341
         jmp    .done
342
@@:     mov     eax,    ebx
343
.done:  stosw
344
        dec     ecx
345
         jnz    .pixel
346
        add     esi,    [_img_total_bpl]
347
        add     edi,    [_bottom_total_bpl]
348
        dec     [_copy_height]
349
         jnz    .line
350
 
351
.quit:  popad
352
        ret
353
endp
354
 
355
 
356
;proc composite_indexed_01 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
357
;        pushad
358
;
359
;        pxor    mm4,    mm4
360
;        movd    mm4,    [random_b]
361
;        movd    mm1,    [random_a]
362
;        movd    mm2,    [random_c]
363
;
364
;.line:  mov     ecx,    [_copy_width]
365
;.pixel: mov     ebx,    [edi]
366
;        lodsw
367
;
368
;        movq    mm0,    mm4
369
;        pmuludq mm0,    mm1
370
;        paddq   mm0,    mm2
371
;        movd    edx,    mm0
372
;        movd    mm4,    edx
373
;        pxor    mm0,    mm0
374
;
375
;        test    ah,     ah
376
;         jz     @f
377
;        shr     edx,    17
378
;        cmp     dl,     ah
379
;         ja     @f
380
;        or      ax,     0xff00
381
;         jmp    .done
382
;@@:     mov     eax,    ebx
383
;.done:  stosw
384
;        dec     ecx
385
;         jnz    .pixel
386
;        add     esi,    [_img_total_bpl]
387
;        add     edi,    [_bottom_total_bpl]
388
;        dec     [_copy_height]
389
;         jnz    .line
390
;
391
;.quit:  popad
392
;        ret
393
;endp
394
 
395
 
396
proc composite_rgb_03               ; Multiply
397
 
398
        punpcklbw   mm2,    mm0
399
        punpcklbw   mm3,    mm0
400
        pmullw  mm3,    mm2
401
        psrlw       mm3,    8
402
 
403
        ret
404
endp
405
 
406
 
407
proc composite_rgb_04               ; Screen
408
 
409
        punpcklbw   mm2,    mm0
410
        punpcklbw   mm3,    mm0
411
        movq    mm4,    [mmx_00ff]
412
        movq    mm5,    mm4
413
        psubw   mm4,    mm2
414
        psubw   mm5,    mm3
415
        pmullw  mm4,    mm5
416
        psrlw       mm4,    8
417
        movq    mm3,    [mmx_00ff]
418
        psubw   mm3,    mm4
419
 
420
        ret
421
endp
422
 
423
 
424
proc composite_rgb_05               ; Overlay
425
 
426
        punpcklbw   mm2,    mm0
427
        punpcklbw   mm3,    mm0
428
        movq        mm4,    [mmx_00ff]
429
        psubw       mm4,    mm2
430
        pmullw      mm3,    mm4
431
        psrlw       mm3,    7
432
        paddw       mm3,    mm2
433
        pmullw      mm3,    mm2
434
        psrlw       mm3,    8
435
 
436
        ret
437
endp
438
 
439
 
440
proc composite_rgb_06               ; Difference
441
 
442
        movq    mm4,    mm3
443
        pminub  mm4,    mm2
444
        pmaxub  mm3,    mm2
445
        psubusb mm3,    mm4
446
        punpcklbw   mm2,    mm0
447
        punpcklbw   mm3,    mm0
448
 
449
        ret
450
endp
451
 
452
 
453
proc composite_rgb_07               ; Addition
454
 
455
        paddusb mm3,    mm2
456
        punpcklbw   mm2,    mm0
457
        punpcklbw   mm3,    mm0
458
 
459
        ret
460
endp
461
 
462
 
463
proc composite_rgb_08               ; Subtract
464
 
465
        movq    mm4,    mm2
466
        psubusb mm4,    mm3
467
        movq    mm3,    mm4
468
        punpcklbw   mm2,    mm0
469
        punpcklbw   mm3,    mm0
470
 
471
        ret
472
endp
473
 
474
 
475
proc composite_rgb_09               ; Darken Only
476
 
477
        pminub  mm3,    mm2
478
        punpcklbw   mm2,    mm0
479
        punpcklbw   mm3,    mm0
480
 
481
        ret
482
endp
483
 
484
 
485
proc composite_rgb_10               ; Lighten Only
486
 
487
        pmaxub  mm3,    mm2
488
        punpcklbw   mm2,    mm0
489
        punpcklbw   mm3,    mm0
490
 
491
        ret
492
endp
493
 
494
 
495
proc composite_rgb_11               ; Hue (H of HSV)
496
        push    eax ebx ecx edx
497
 
498
        movd    eax,    mm3
499
        movd    ebx,    mm2
500
 
501
        call    pixel_rgb2hsv
502
        xchg    eax,    ebx
503
        call    pixel_rgb2hsv
504
        xchg    eax,    ebx
505
 
506
        test    ah,     ah
507
         jnz    @f
508
        ror     eax,    8
509
        ror     ebx,    8
510
        mov     ah,     bh
511
        rol     eax,    8
512
        rol     ebx,    8
513
@@:
514
        mov     ax,     bx
515
 
516
        call    pixel_hsv2rgb
517
 
518
 
519
        movd    mm3,    eax
520
 
521
        punpcklbw   mm2,    mm0
522
        punpcklbw   mm3,    mm0
523
 
524
.quit:
525
        pop     edx ecx ebx eax
526
        ret
527
endp
528
 
529
 
530
proc composite_rgb_12               ; Saturation (S of HSV)
531
        push    eax ebx ecx edx
532
 
533
        movd    eax,    mm3
534
        movd    ebx,    mm2
535
 
536
        call    pixel_rgb2hsv
537
        xchg    eax,    ebx
538
        call    pixel_rgb2hsv
539
        xchg    eax,    ebx
540
 
541
        ror     eax,    8
542
        ror     ebx,    8
543
        mov     ah,     bh
544
        rol     eax,    8
545
        rol     ebx,    8
546
        mov     al,     bl
547
 
548
        call    pixel_hsv2rgb
549
 
550
 
551
        movd    mm3,    eax
552
 
553
        punpcklbw   mm2,    mm0
554
        punpcklbw   mm3,    mm0
555
 
556
.quit:
557
        pop     edx ecx ebx eax
558
        ret
559
endp
560
 
561
 
562
proc composite_rgb_13               ; Color (H and S of HSL)
563
        push    eax ebx ecx edx
564
 
565
        movd    eax,    mm3
566
        movd    ebx,    mm2
567
 
568
        call    pixel_rgb2hsl
569
        xchg    eax,    ebx
570
        call    pixel_rgb2hsl
571
        xchg    eax,    ebx
572
 
573
        mov     al,     bl
574
 
575
        call    pixel_hsl2rgb
576
 
577
 
578
        movd    mm3,    eax
579
 
580
        punpcklbw   mm2,    mm0
581
        punpcklbw   mm3,    mm0
582
 
583
.quit:
584
        pop     edx ecx ebx eax
585
        ret
586
endp
587
 
588
 
589
proc composite_rgb_14               ; Value (V of HSV)
590
        push    eax ebx ecx edx
591
 
592
        movd    eax,    mm3
593
        movd    ebx,    mm2
594
 
595
        call    pixel_rgb2hsv
596
        xchg    eax,    ebx
597
        call    pixel_rgb2hsv
598
        xchg    eax,    ebx
599
 
600
        ror     eax,    8
601
        ror     ebx,    8
602
        mov     ax,     bx
603
        rol     eax,    8
604
        rol     ebx,    8
605
 
606
        call    pixel_hsv2rgb
607
 
608
 
609
        movd    mm3,    eax
610
 
611
        punpcklbw   mm2,    mm0
612
        punpcklbw   mm3,    mm0
613
 
614
.quit:
615
        pop     edx ecx ebx eax
616
        ret
617
endp
618
 
619
 
620
proc composite_rgb_15               ; Divide
621
        push    eax ebx ecx
622
 
623
        movd    eax,    mm3
624
        movd    ebx,    mm2
625
 
626
        rol     eax,    8
627
        rol     ebx,    8
628
 
629
        xchg    eax,    ebx
630
 
631
        mov     ecx,    3
632
 
633
.color: rol     eax,    8
634
        rol     ebx,    8
635
        shl     ax,     8
636
        test    bl,     bl
637
         jz     .clamp1
638
        cmp     ah,     bl
639
         jae    .clamp2
640
        div     bl
641
         jmp    .done
642
.clamp1:mov     al,     0xff
643
        test    ah,     ah
644
         jnz    @f
645
        not     al
646
@@:      jmp    .done
647
.clamp2:mov     al,     0xff
648
         jmp    .done
649
.done:  mov     ah,     al
650
        loop    .color
651
 
652
        ror     eax,    8
653
        movd    mm3,    eax
654
 
655
        punpcklbw   mm2,    mm0
656
        punpcklbw   mm3,    mm0
657
 
658
        pop     ecx ebx eax
659
        ret
660
endp
661
 
662
 
663
proc composite_rgb_16               ; Dodge
664
        push eax ebx ecx
665
 
666
        movd    eax,    mm3
667
        movd    ebx,    mm2
668
 
669
        rol     eax,    8
670
        rol     ebx,    8
671
 
672
        xchg    eax,    ebx
673
 
674
        mov     ecx,    3
675
 
676
.color: rol     eax,    8
677
        rol     ebx,    8
678
        shl     ax,     8
679
        neg     bl
680
        add     bl,     0xff
681
        test    bl,     bl
682
         jz     .clamp1
683
        cmp     ah,     bl
684
         jae    .clamp2
685
        div     bl
686
         jmp    .done
687
.clamp1:mov     al,     0xff
688
        test    ah,     ah
689
         jnz    @f
690
        not     al
691
@@:      jmp    .done
692
.clamp2:mov     al,     0xff
693
         jmp    .done
694
.done:  mov     ah,     al
695
        loop    .color
696
 
697
        ror     eax,    8
698
        movd    mm3,    eax
699
 
700
        punpcklbw   mm2,    mm0
701
        punpcklbw   mm3,    mm0
702
 
703
        pop     ecx ebx eax
704
        ret
705
endp
706
 
707
 
708
proc composite_rgb_17               ; Burn
709
        push eax ebx ecx
710
 
711
        movd    eax,    mm3
712
        movd    ebx,    mm2
713
 
714
        rol     eax,    8
715
        rol     ebx,    8
716
 
717
        xchg    eax,    ebx
718
 
719
        mov     ecx,    3
720
 
721
.color: rol     eax,    8
722
        rol     ebx,    8
723
        shl     ax,     8
724
        neg     ah
725
        add     ah,     0xff
726
        test    bl,     bl
727
         jz     .clamp1
728
        cmp     ah,     bl
729
         jae    .clamp2
730
        div     bl
731
         jmp    .done
732
.clamp1:mov     al,     0xff
733
        test    ah,     ah
734
         jnz    @f
735
        not     al
736
@@:      jmp    .done
737
.clamp2:mov     al,     0xff
738
         jmp    .done
739
.done:  mov     ah,     al
740
        neg     ah
741
        add     ah,     0xff
742
        loop    .color
743
 
744
        ror     eax,    8
745
        movd    mm3,    eax
746
 
747
        punpcklbw   mm2,    mm0
748
        punpcklbw   mm3,    mm0
749
 
750
        pop     ecx ebx eax
751
        ret
752
endp
753
 
754
 
755
proc composite_rgb_18               ; Hard Light
756
        push eax ebx ecx
757
 
758
        movd    eax,    mm3
759
        movd    ebx,    mm2
760
 
761
        rol     eax,    8
762
        rol     ebx,    8
763
 
764
        mov     ecx,    3
765
 
766
.color: rol     eax,    8
767
        rol     ebx,    8
768
        cmp     al,     127
769
         jna    .part1
770
        mov     ah,     0xff
771
        sub     ah,     bl
772
        neg     al
773
        add     al,     0xff
774
        mul     ah
775
        shl     ax,     1
776
        neg     ah
777
        add     ah,     0xff
778
         jmp    .done
779
.part1:
780
        mul     bl
781
        shl     ax,     1
782
.done:  loop    .color
783
 
784
        ror     eax,    8
785
        movd    mm3,    eax
786
 
787
        punpcklbw   mm2,    mm0
788
        punpcklbw   mm3,    mm0
789
 
790
        pop     ecx ebx eax
791
        ret
792
endp
793
 
794
 
795
proc composite_rgb_20               ; Grain Extract
796
 
797
        movq        mm4,    [mmx_0080]
798
        punpcklbw   mm2,    mm0
799
        punpcklbw   mm3,    mm0
800
        movq        mm5,    mm2
801
        psubw       mm3,    mm4
802
        psubsw      mm5,    mm3
803
        packuswb    mm5,    mm0
804
        punpcklbw   mm5,    mm0
805
        movq        mm3,    mm5
806
 
807
        ret
808
endp
809
 
810
 
811
proc composite_rgb_21               ; Grain Merge
812
 
813
        movq        mm4,    [mmx_0080]
814
        punpcklbw   mm2,    mm0
815
        punpcklbw   mm3,    mm0
816
        movq        mm5,    mm2
817
        psubw       mm5,    mm4
818
        paddsw      mm3,    mm5
819
        packuswb    mm3,    mm0
820
        punpcklbw   mm3,    mm0
821
 
822
        ret
823
endp
824
 
825
 
826
mmx_0080        dq  0x0080008000800080
827
mmx_00ff        dq  0x00ff00ff00ff00ff
828
mmx_0100        dq  0x0100010001000100