]> 4ch.mooo.com Git - 16.git/blob - 16/x/mxsi.asm
b88d3b1121d1bc6f3d8559889de75390b4f73215
[16.git] / 16 / x / mxsi.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXPI.ASM - Stretch image\r
4 ; Copyright (c) 1994 by Alessandro Scotti\r
5 ;\r
6 ;-----------------------------------------------------------\r
7 WARN    PRO\r
8 NOWARN  RES\r
9 INCLUDE MODEX.DEF\r
10 \r
11 PUBLIC  mxStretchImage\r
12 \r
13 EXTRN   subClipBox              : NEAR\r
14 \r
15 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
16                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
17 \r
18 EXTRN   mx_VideoSegment : WORD\r
19 EXTRN   mx_BytesPerLine : WORD\r
20 \r
21 mxTable LABEL   WORD                    ; Raster ops\r
22         DW      subMove\r
23         DW      subAnd\r
24         DW      subOr\r
25         DW      subXor\r
26         DW      subTrans\r
27         DW      subAdd\r
28 \r
29 ;-----------------------------------------------------------\r
30 ;\r
31 ; Stretches and copies a "raw" image from memory to screen.\r
32 ;\r
33 ; Input:\r
34 ;       Image     = pointer to image\r
35 ;       X, Y      = coordinates of destination\r
36 ;       Width     = width of image in pixels\r
37 ;       Height    = height of image in pixels\r
38 ;       NewWidth  = new width of image in pixels\r
39 ;       NewHeight = new height of image in pixels\r
40 ;       Op        = raster op (OP_xxx)\r
41 ; Output:\r
42 ;       none\r
43 ;\r
44 mxStretchImage  PROC    FAR\r
45         ARG     Op:WORD,                \\r
46                 NewHeight:WORD,         \\r
47                 NewWidth:WORD,          \\r
48                 Height:WORD,            \\r
49                 Width:WORD,             \\r
50                 Y:WORD,                 \\r
51                 X:WORD,                 \\r
52                 Image:DWORD             = ARG_SIZE\r
53         LOCAL   PixelOffset:WORD,       \\r
54                 MoveFunction:WORD,      \\r
55                 ReadPlane:BYTE,         \\r
56                 OpInfo:BYTE,            \\r
57                 WidthStep:DWORD,        \\r
58                 HeightStep:DWORD,       \\r
59                 ImageLo:WORD,           \\r
60                 WritePlane:BYTE         = AUTO_SIZE\r
61         ASSUME  ds:NOTHING\r
62         .enter  AUTO_SIZE\r
63         .push   ds, si, es, di\r
64 \r
65 ; Get width stretch factor\r
66     IF USE386 EQ TRUE\r
67         movzx   edx, [Width]\r
68         xor     eax, eax\r
69         movzx   ebx, [NewWidth]\r
70         shl     ebx, 16\r
71         idiv    ebx\r
72         mov     [WidthStep], eax\r
73     ELSE\r
74         xor     dx, dx                  ; Width stretch factor\r
75         mov     ax, [Width]\r
76         mov     bx, [NewWidth]\r
77         div     bx\r
78         mov     WORD PTR WidthStep[2], ax\r
79         xor     ax, ax\r
80         div     bx\r
81         mov     WORD PTR WidthStep[0], ax\r
82     ENDIF\r
83 ; Get height stretch factor\r
84     IF USE386 EQ TRUE\r
85         movzx   edx, [Height]\r
86         xor     eax, eax\r
87         movzx   ebx, [NewHeight]\r
88         shl     ebx, 16\r
89         idiv    ebx\r
90         mov     [HeightStep], eax\r
91     ELSE\r
92         xor     dx, dx\r
93         mov     ax, [Height]\r
94         mov     bx, [NewHeight]\r
95         div     bx\r
96         mov     WORD PTR HeightStep[2], ax\r
97         xor     ax, ax\r
98         div     bx\r
99         mov     WORD PTR HeightStep[0], ax\r
100    ENDIF\r
101 \r
102 ; Clip image\r
103         mov     bx, [X]\r
104         mov     ax, [Y]\r
105         mov     cx, [NewWidth]\r
106         mov     dx, [NewHeight]\r
107         call    subClipBox\r
108         jc      @@Exit                  ; Full clipped\r
109         mov     [NewWidth], cx\r
110         mov     [NewHeight], dx\r
111         sub     [X], bx\r
112         sub     [Y], ax\r
113 \r
114 ; Get pixel address\r
115         mul     [mx_BytesPerLine]\r
116         mov     di, bx\r
117         shr     di, 1\r
118         shr     di, 1\r
119         add     di, ax\r
120         mov     [PixelOffset], di\r
121         mov     es, [mx_VideoSegment]   ; ES:DI points to pixel\r
122         and     bl, 03h\r
123         mov     [ReadPlane], bl         ; Set read plane\r
124         mov     cl, bl\r
125         mov     al, 00010001b\r
126         shl     al, cl\r
127         mov     [WritePlane], al        ; Set write plane\r
128 \r
129 ; Relocate image origin if previously clipped\r
130         mov     ax, [Y]\r
131         test    ax, ax\r
132         jz      @@OriginYDone\r
133     IF USE386 EQ TRUE\r
134         shl     eax, 16\r
135         imul    [HeightStep]\r
136         mov     ax, [Width]\r
137         mul     dx\r
138     ELSE\r
139         mov     bx, ax\r
140         mul     WORD PTR HeightStep[0]\r
141         mov     cx, dx\r
142         mov     ax, bx\r
143         mul     WORD PTR HeightStep[2]\r
144         add     ax, cx\r
145         mul     [Width]\r
146     ENDIF\r
147         add     WORD PTR [Image], ax\r
148 @@OriginYDone:\r
149         mov     ax, [X]\r
150         test    ax, ax\r
151         jz      @@OriginXDone\r
152     IF USE386 EQ TRUE\r
153         shl     eax, 16\r
154         imul    [WidthStep]\r
155         add     WORD PTR [Image], dx\r
156     ELSE\r
157         mov     bx, ax\r
158         mul     WORD PTR WidthStep[0]\r
159         mov     cx, dx\r
160         mov     ax, bx\r
161         mul     WORD PTR WidthStep[2]\r
162         add     ax, cx\r
163         add     WORD PTR [Image], ax\r
164     ENDIF\r
165 @@OriginXDone:\r
166         mov     ax, WORD PTR HeightStep[2]\r
167         mul     [Width]\r
168         mov     WORD PTR HeightStep[2], ax\r
169 \r
170 ; Install move function\r
171         mov     bx, [Op]\r
172         mov     [OpInfo], bh            ; Remember additional info if needed\r
173         xor     bh, bh\r
174         cmp     bl, OP_ADD\r
175         jbe     @@SetMoveFunction\r
176         xor     bl, bl\r
177 @@SetMoveFunction:\r
178         shl     bx, 1\r
179         mov     ax, mxTable[bx]\r
180         mov     [MoveFunction], ax\r
181 \r
182 ; Put image\r
183         mov     ds, WORD PTR Image[2]\r
184         xor     ax, ax\r
185         mov     [ImageLo], ax\r
186 @@Loop:\r
187         mov     si, WORD PTR Image[0]   ; Get pointer to image\r
188         mov     ah, [WritePlane]\r
189         and     ah, 0Fh\r
190         mov     al, 02h\r
191         mov     dx, TS\r
192         out     dx, ax                  ; Select write plane\r
193         mov     ah, [ReadPlane]\r
194         and     ah, 03h\r
195         mov     al, 04h\r
196         mov     dx, GDC\r
197         out     dx, ax                  ; Select read plane\r
198         mov     cx, [NewHeight]\r
199         mov     di, [PixelOffset]       ; ES:DI points to video memory\r
200         mov     ah, [OpInfo]            ; Additional raster op info\r
201         xor     bx, bx\r
202         mov     dx, [mx_BytesPerLine]\r
203         call    [MoveFunction]          ; Draw column\r
204         inc     [ReadPlane]             ; Next read plane\r
205         rol     [WritePlane], 1         ; Next write plane\r
206         adc     [PixelOffset], 0        ; Update video offset if needed\r
207         mov     dx, WORD PTR WidthStep[0]\r
208         mov     ax, WORD PTR WidthStep[2]\r
209         add     [ImageLo], dx\r
210         adc     WORD PTR Image[0], ax   ; Next image column\r
211         dec     [NewWidth]\r
212         jnz     @@Loop                  ; Repeat for all columns\r
213 \r
214 @@Exit:\r
215         xor     ax, ax\r
216         .pop    ds, si, es, di\r
217         .leave  ARG_SIZE\r
218 \r
219 ;-----------------------------------------------------------\r
220 ;\r
221 ; Move functions, on entry:\r
222 ;       AH = additional raster op info (e.g. transparent color)\r
223 ;       BX = 0,\r
224 ;       CX = pixel count,\r
225 ;       DX = mx_BytesPerLine.\r
226 ;\r
227 subMove         PROC    NEAR\r
228 @@Loop: mov     al, ds:[si]\r
229         mov     es:[di], al\r
230         add     di, dx\r
231         dec     cx\r
232         jz      @@Exit\r
233         add     si, WORD PTR HeightStep[2]\r
234         add     bx, WORD PTR HeightStep[0]\r
235         jnc     @@Loop\r
236         add     si, [Width]\r
237         jmp     @@Loop\r
238 @@Exit: ret\r
239 subMove         ENDP\r
240 ;\r
241 subAnd          PROC     NEAR\r
242 @@Loop: mov     al, ds:[si]\r
243         and     es:[di], al\r
244         add     di, dx\r
245         dec     cx\r
246         jz      @@Exit\r
247         add     si, WORD PTR HeightStep[2]\r
248         add     bx, WORD PTR HeightStep[0]\r
249         jnc     @@Loop\r
250         add     si, [Width]\r
251         jmp     @@Loop\r
252 @@Exit: ret\r
253 subAnd          ENDP\r
254 ;\r
255 subOr           PROC     NEAR\r
256 @@Loop: mov     al, ds:[si]\r
257         or      es:[di], al\r
258         add     di, dx\r
259         dec     cx\r
260         jz      @@Exit\r
261         add     si, WORD PTR HeightStep[2]\r
262         add     bx, WORD PTR HeightStep[0]\r
263         jnc     @@Loop\r
264         add     si, [Width]\r
265         jmp     @@Loop\r
266 @@Exit: ret\r
267 subOr           ENDP\r
268 ;\r
269 subXor          PROC     NEAR\r
270 @@Loop: mov     al, ds:[si]\r
271         xor     es:[di], al\r
272         add     di, dx\r
273         dec     cx\r
274         jz      @@Exit\r
275         add     si, WORD PTR HeightStep[2]\r
276         add     bx, WORD PTR HeightStep[0]\r
277         jnc     @@Loop\r
278         add     si, [Width]\r
279         jmp     @@Loop\r
280 @@Exit: ret\r
281 subXor          ENDP\r
282 ;\r
283 subTrans        PROC     NEAR\r
284 @@Loop: mov     al, ds:[si]\r
285         cmp     al, ah\r
286         je      @@Skip\r
287         mov     es:[di], al\r
288 @@Skip:\r
289         add     di, dx\r
290         dec     cx\r
291         jz      @@Exit\r
292         add     si, WORD PTR HeightStep[2]\r
293         add     bx, WORD PTR HeightStep[0]\r
294         jnc     @@Loop\r
295         add     si, [Width]\r
296         jmp     @@Loop\r
297 @@Exit: ret\r
298 subTrans        ENDP\r
299 ;\r
300 subAdd          PROC     NEAR\r
301 @@Loop: mov     al, ds:[si]\r
302         add     es:[di], al\r
303         add     di, dx\r
304         dec     cx\r
305         jz      @@Exit\r
306         add     si, WORD PTR HeightStep[2]\r
307         add     bx, WORD PTR HeightStep[0]\r
308         jnc     @@Loop\r
309         add     si, [Width]\r
310         jmp     @@Loop\r
311 @@Exit: ret\r
312 subAdd          ENDP\r
313 \r
314 mxStretchImage  ENDP\r
315 \r
316 MX_TEXT         ENDS\r
317 END\r