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