]> 4ch.mooo.com Git - 16.git/blob - 16/xlib/xcbitm32.c
refresh wwww
[16.git] / 16 / xlib / xcbitm32.c
1 #include "xbmtools.h"\r
2 \r
3 /* these are here instead of the header file because they're not part\r
4    of the library interface */\r
5 \r
6 // rol al\r
7 #define ROL_AL          0xc0d0\r
8 // mov [si + disp8], imm8\r
9 #define SHORT_STORE_8   0x44c6\r
10 // mov [si + disp16], imm8\r
11 #define STORE_8         0x84c6\r
12 // mov [si + disp8], imm16\r
13 #define SHORT_STORE_16  0x44c7\r
14 // mov [si + disp16], imm16\r
15 #define STORE_16        0x84c7\r
16 // adc si, imm8\r
17 #define ADC_SI_IMMED    0xd683\r
18 // out dx, al\r
19 #define OUT_AL          0xee\r
20 // ret\r
21 #define RETURN          0xcb\r
22 // 32-bit prefix\r
23 #define DWORD_PREFIX    0x66\r
24 \r
25 #define Emitb(x) *(output + output_used) = (x); output_used++\r
26 \r
27 #define Emitw(x) *(output + output_used) = (x) & 255; \\r
28                                  *(output + output_used + 1) = (x) >> 8; \\r
29                                  output_used += 2\r
30 \r
31 \r
32 int x_compile_bitmap_32 (int logical_screen_width, char far * bitmap,\r
33                                 char far * output)\r
34 {\r
35         int pix0, pix1, pix2, pix3, numpix, pos;\r
36         int column = 0, set_column = 0;\r
37         int scanx = 0, scany = 0;\r
38         int output_used = 0;\r
39 \r
40         int height = LBMHeight(bitmap);\r
41         int width = LBMWidth(bitmap);\r
42         int margin = width - 1;\r
43         int margin2 = margin - 4;\r
44         int margin4 = margin - 12;\r
45 \r
46         while (column < 4) {\r
47                 numpix = 1;\r
48                 pix0 = LBMGetPix(scanx, scany, bitmap);\r
49                 if (pix0 != 0) {\r
50                         if (set_column != column) {\r
51                                 do {\r
52                                         Emitw (ROL_AL);\r
53                                         Emitw (ADC_SI_IMMED);\r
54                                         Emitb (0);\r
55                                         set_column++;\r
56                                 } while (set_column != column);\r
57                                 Emitb (OUT_AL);\r
58                         }\r
59                         if (scanx <= margin2) {\r
60                                 pix1 = LBMGetPix(scanx + 4, scany, bitmap);\r
61                                 if ((pix1 != 0)\r
62                                   &&(scanx <= margin4)) {\r
63                                         numpix = 2;\r
64                                         pix2 = LBMGetPix(scanx + 8, scany, bitmap);\r
65                                         pix3 = LBMGetPix(scanx + 12, scany, bitmap);\r
66                                         if ((pix2 != 0) && (pix3 != 0)) {\r
67                                                 numpix = 4;\r
68                                                 Emitb (DWORD_PREFIX);\r
69                                         }\r
70                                 }\r
71                         }\r
72                         pos = (scany * logical_screen_width) + (scanx >> 2) - 128;\r
73                         if ((pos >= -128) && (pos <= 127)) {\r
74                                 if (numpix == 1) {\r
75                                         Emitw (SHORT_STORE_8);\r
76                                         Emitb (pos);\r
77                                         Emitb (pix0);\r
78                                 } else {\r
79                                         Emitw (SHORT_STORE_16);\r
80                                         Emitb (pos);\r
81                                         Emitb (pix0);\r
82                                         Emitb (pix1);\r
83                                         if (numpix == 4) {\r
84                                                 Emitb (pix2);\r
85                                                 Emitb (pix3);\r
86                                         }\r
87                                 }\r
88                         } else {\r
89                                 if (numpix == 1) {\r
90                                         Emitw (STORE_8);\r
91                                         Emitw (pos);\r
92                                         Emitb (pix0);\r
93                                 } else {\r
94                                         Emitw (STORE_16);\r
95                                         Emitw (pos);\r
96                                         Emitb (pix0);\r
97                                         Emitb (pix1);\r
98                                         if (numpix == 4) {\r
99                                                 Emitb (pix2);\r
100                                                 Emitb (pix3);\r
101                                         }\r
102                                 }\r
103                         }\r
104                 }\r
105                 scanx += (numpix << 2);\r
106                 if (scanx > margin) {\r
107                         scanx = column;\r
108                         scany++;\r
109                         if (scany == height) {\r
110                                 scany = 0;\r
111                                 column++;\r
112                         }\r
113                 }\r
114         }\r
115         Emitb(RETURN);\r
116         return(output_used);\r
117 }\r
118 \r
119 \r
120 int x_sizeof_cbitmap_32 (int logical_screen_width, char far * bitmap)\r
121 {\r
122         int pix0, pix1, pix2, pix3, numpix, pos;\r
123         int column = 0, set_column = 0;\r
124         int scanx = 0, scany = 0;\r
125         int output_used = 1;\r
126 \r
127         int height = LBMHeight(bitmap);\r
128         int width = LBMWidth(bitmap);\r
129         int margin = width - 1;\r
130         int margin2 = margin - 4;\r
131         int margin4 = margin - 12;\r
132 \r
133         while (column < 4) {\r
134                 numpix = 1;\r
135                 pix0 = LBMGetPix(scanx, scany, bitmap);\r
136                 if (pix0 != 0) {\r
137                         if (set_column != column) {\r
138                                 do {\r
139                                         output_used += 5;\r
140                                         set_column++;\r
141                                 } while (set_column != column);\r
142                                 output_used++;\r
143                         }\r
144                         if (scanx <= margin2) {\r
145                                 pix1 = LBMGetPix(scanx + 4, scany, bitmap);\r
146                                 if ((pix1 != 0)\r
147                                   &&(scanx <= margin4)) {\r
148                                         numpix = 2;\r
149                                         pix2 = LBMGetPix(scanx + 8, scany, bitmap);\r
150                                         pix3 = LBMGetPix(scanx + 12, scany, bitmap);\r
151                                         if ((pix2 != 0) && (pix3 != 0)) {\r
152                                                 numpix = 4;\r
153                                                 output_used++;\r
154                                         }\r
155                                 }\r
156                         }\r
157                         pos = (scany * logical_screen_width) + (scanx >> 2) - 128;\r
158                         if ((pos >= -128) && (pos <= 127)) {\r
159                                 if (numpix == 1) {\r
160                                         output_used += 4;\r
161                                 } else {\r
162                                         output_used += 5;\r
163                                         if (numpix == 4)\r
164                                                 output_used += 2;\r
165                                 }\r
166                         } else {\r
167                                 if (numpix == 1) {\r
168                                         output_used += 5;\r
169                                 } else {\r
170                                         output_used += 6;\r
171                                         if (numpix == 4)\r
172                                                 output_used += 2;\r
173                                 }\r
174                         }\r
175                 }\r
176                 scanx += (numpix << 2);\r
177                 if (scanx > margin) {\r
178                         scanx = column;\r
179                         scany++;\r
180                         if (scany == height) {\r
181                                 scany = 0;\r
182                                 column++;\r
183                         }\r
184                 }\r
185         }\r
186         return(output_used);\r
187 }\r
188 \r