use gr_linear_rep_movsd_2x instead of almost identical gr_linear_movsd_double. Better...
[btb/d2x.git] / 2d / scalea.h
1 /* $Id: scalea.h,v 1.3 2002-07-17 21:34:56 bradleyb Exp $ */
2 extern char scale_trans_color;
3 extern int scale_error_term;
4 extern int scale_initial_pixel_count;
5 extern int scale_adj_up;
6 extern int scale_adj_down;
7 extern int scale_final_pixel_count;
8 extern int scale_ydelta_minus_1;
9 extern int scale_whole_step;
10 extern ubyte * scale_source_ptr;
11 extern ubyte * scale_dest_ptr;
12 extern void rls_stretch_scanline_asm();
13 extern void scale_do_cc_scanline();
14 extern void rls_do_cc_setup_asm();
15
16 #ifdef __WATCOMC__
17 void rep_stosb(char *ScreenPtr, int RunLength, int Color);
18 #pragma aux rep_stosb = \
19 "               rep stosb"  \
20 parm [EDI] [ECX] [EAX]\
21 modify [];
22
23 // esi, edi = source, dest
24 // ecx = width
25 // ebx = u
26 // edx = du
27
28 void scale_row_asm_transparent( ubyte * sbits, ubyte * dbits, int width, fix u, fix du );
29 #pragma aux scale_row_asm_transparent parm [esi] [edi] [ecx] [ebx] [edx] modify exact [edi eax ebx ecx] = \
30 "newpixel:  mov eax, ebx            " \
31 "               shr eax, 16         " \
32 "               mov al, [esi+eax]   " \
33 "               cmp al, 255         " \
34 "               je      skip_it         " \
35 "               mov [edi], al       " \
36 "skip_it:   add ebx, edx            " \
37 "               inc edi             " \
38 "               dec ecx             " \
39 "               jne newpixel            "
40
41 void scale_row_asm( ubyte * sbits, ubyte * dbits, int width, fix u, fix du );
42 #pragma aux scale_row_asm parm [esi] [edi] [ecx] [ebx] [edx] modify exact [edi eax ebx ecx] = \
43 "newpixel1: mov eax, ebx            " \
44 "               shr eax, 16         " \
45 "               mov al, [esi+eax]   " \
46 "               add ebx, edx            " \
47 "               mov [edi], al       " \
48 "               inc edi             " \
49 "               dec ecx             " \
50 "               jne newpixel1       "
51
52
53 void rep_movsb( ubyte * sbits, ubyte * dbits, int width );
54 #pragma aux rep_movsb parm [esi] [edi] [ecx] modify exact [esi edi ecx] = \
55 "rep movsb"
56
57 #else
58 static inline void rep_stosb(char *ScreenPtr, int RunLength, int Color) {
59    int dummy[2];
60    __asm__ __volatile__ ("cld; rep; stosb"
61     : "=c" (dummy[0]), "=D" (dummy[1]) : "1" (ScreenPtr), "0" (RunLength), "a" (Color) );
62 }
63 static inline void scale_row_asm_transparent( ubyte * sbits, ubyte * dbits, int width, fix u, fix du ) {
64    int dummy[3];
65    __asm__ __volatile__ (
66 "0:           movl %%ebx, %%eax;"
67 "             shrl $16, %%eax;"
68 "             movb (%%esi, %%eax), %%al;"
69 "             cmpb $255, %%al;"
70 "             je  1f;"
71 "             movb %%al, (%%edi);"
72 "1:           addl %%edx, %%ebx;"
73 "             incl %%edi;"
74 "             decl %%ecx;"
75 "             jne 0b"
76  : "=c" (dummy[0]), "=b" (dummy[1]), "=D" (dummy[2])
77  : "S" (sbits), "2" (dbits), "0" (width), "1" (u), "d" (du)
78  : "%eax");
79 }
80
81 static inline void scale_row_asm( ubyte * sbits, ubyte * dbits, int width, fix u, fix du ) {
82      __asm__ __volatile__ (
83 "0:         movl %%ebx,%%eax;"
84 "           shrl $16, %%eax;"
85 "           movb (%%esi, %%eax), %%al;"
86 "           addl %%edx, %%ebx;"
87 "           movb %%al, (%%edi);"
88 "           incl %%edi;"
89 "           decl %%ecx;"
90 "           jne 0b"
91         : : "S" (sbits), "D" (dbits), "c" (width), "b" (u), "d" (du)
92         : "%eax", "%ebx", "%ecx", "%edi");
93 }
94
95 static inline void rep_movsb( ubyte * sbits, ubyte * dbits, int width ) {
96    __asm__ __volatile__ ("cld; rep; movsb"
97     : : "S" (sbits), "D" (dbits), "c" (width) : "%ecx", "%esi", "%edi");
98 }
99 #endif