Rev 5159 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5153 | IgorA | 1 | ;PUTPIXEL -> RGBPIXEL |
2 | |||
3 | locals |
||
4 | n dd ? |
||
5 | d_x dd ? |
||
6 | d_y dd ? |
||
7 | sx dd ? ;ширина буфера в пикселях |
||
8 | pp_inc_1 dd ? |
||
9 | pp_inc_2 dd ? |
||
10 | a dd ? ;register int |
||
11 | r dd ? ;register unsigned int |
||
12 | g dd ? |
||
13 | b dd ? |
||
14 | rinc dd ? ;register unsigned int |
||
15 | ginc dd ? |
||
16 | binc dd ? |
||
17 | if INTERP_Z eq 1 |
||
18 | pz dd ? ;register unsigned short * |
||
19 | zinc dd ? |
||
20 | z dd ? ;register int |
||
21 | zz dd ? |
||
22 | end if |
||
23 | endl |
||
24 | pushad |
||
25 | |||
26 | mov eax,[p1] |
||
27 | mov ebx,[p2] |
||
28 | mov ecx,[ebx+offs_zbup_y] |
||
29 | cmp [eax+offs_zbup_y], ecx ;if (p1.y > p2.y) |
||
30 | jg @f |
||
31 | jl .end_0 ;if (p1.y != p2.y) |
||
32 | mov ecx,[ebx+offs_zbup_x] |
||
33 | cmp [eax+offs_zbup_x], ecx ;if (p1.x > p2.x) |
||
34 | jle .end_0 ;if (p1.x <= p2.x) |
||
35 | @@: ;if (p1.y > p2.y || (p1.y == p2.y && p1.x > p2.x)) |
||
36 | mov [p1],ebx |
||
37 | mov [p2],eax |
||
38 | .end_0: |
||
39 | |||
40 | mov eax,[zb] |
||
41 | mov edx,[eax+offs_zbuf_xsize] |
||
42 | mov [sx],edx |
||
43 | mov ecx,[p1] |
||
44 | mov edi,[eax+offs_zbuf_linesize] |
||
45 | imul edi,[ecx+offs_zbup_y] |
||
46 | mov edx,[ecx+offs_zbup_x] |
||
47 | imul edx,PSZB |
||
48 | add edi,edx |
||
49 | add edi,[eax+offs_zbuf_pbuf] ;edi = (zb.pbuf + zb.linesize*p1.y + p1.x*PSZB) |
||
50 | if INTERP_Z eq 1 |
||
51 | mov edx,[ecx+offs_zbup_y] |
||
52 | imul edx,[sx] |
||
53 | add edx,[ecx+offs_zbup_x] |
||
54 | add edx,[eax+offs_zbuf_zbuf] |
||
55 | mov [pz],edx ;pz = zb.zbuf + (p1.y*sx + p1.x) |
||
56 | mov edx,[ecx+offs_zbup_z] |
||
57 | mov [z],edx ;z = p1.z |
||
58 | end if |
||
59 | |||
60 | mov ebx,[p2] |
||
61 | mov eax,[ebx+offs_zbup_x] |
||
62 | sub eax,[ecx+offs_zbup_x] |
||
63 | mov [d_x],eax ;d_x = p2.x - p1.x |
||
64 | mov eax,[ebx+offs_zbup_y] |
||
65 | sub eax,[ecx+offs_zbup_y] |
||
66 | mov [d_y],eax ;d_y = p2.y - p1.y |
||
67 | |||
68 | mov eax,[ecx+offs_zbup_r] |
||
69 | shl eax,8 |
||
70 | mov [r],eax ;r = p1.r << 8 |
||
71 | mov eax,[ecx+offs_zbup_g] |
||
72 | shl eax,8 |
||
73 | mov [g],eax ;g = p1.g << 8 |
||
74 | mov eax,[ecx+offs_zbup_b] |
||
75 | shl eax,8 |
||
76 | mov [b],eax ;b = p1.b << 8 |
||
77 | |||
78 | macro RGBPIXEL |
||
79 | { |
||
80 | if TGL_FEATURE_RENDER_BITS eq 24 |
||
81 | mov eax,[r] |
||
82 | shr eax,16 |
||
83 | mov byte[edi],al |
||
84 | mov eax,[g] |
||
85 | shr eax,16 |
||
86 | mov byte[edi+1],al |
||
87 | mov eax,[b] |
||
88 | shr eax,16 |
||
89 | mov byte[edi+2],al |
||
90 | ;;; else |
||
91 | ;*pp = RGB_TO_PIXEL(r >> 8,g >> 8,b >> 8) |
||
92 | end if |
||
93 | } |
||
94 | |||
95 | macro PUTPIXEL |
||
96 | { |
||
97 | if INTERP_Z eq 1 |
||
98 | local .end_0 |
||
99 | mov eax,[z] |
||
100 | shr eax, ZB_POINT_Z_FRAC_BITS |
||
101 | mov [zz],eax |
||
102 | cmp eax,[pz] |
||
103 | jl .end_0 |
||
104 | RGBPIXEL |
||
105 | mov eax,dword[zz] |
||
106 | mov [pz],eax |
||
107 | .end_0: |
||
108 | else ; INTERP_Z |
||
109 | RGBPIXEL |
||
110 | end if ; INTERP_Z |
||
111 | } |
||
112 | |||
113 | macro DRAWLINE d_x,d_y,inc_1,inc_2 |
||
114 | { |
||
115 | mov eax,d_x |
||
116 | mov [n],eax |
||
117 | |||
118 | mov ebx,[p1] |
||
119 | mov ecx,[p2] |
||
120 | if INTERP_Z eq 1 |
||
121 | mov eax,[ecx+offs_zbup_z] |
||
122 | sub eax,[ebx+offs_zbup_z] |
||
123 | xor edx,edx |
||
124 | div dword[n] |
||
125 | mov [zinc],eax ;zinc=(p2.z-p1.z)/n |
||
126 | end if |
||
127 | |||
128 | ;ebx=&p1, ecx=&p2 |
||
129 | mov eax,[ecx+offs_zbup_r] |
||
130 | sub eax,[ebx+offs_zbup_r] |
||
131 | shl eax,8 |
||
132 | xor edx,edx |
||
133 | div dword[n] |
||
134 | mov [rinc],eax ;rinc=((p2.r-p1.r)<<8)/n |
||
135 | |||
136 | mov eax,[ecx+offs_zbup_g] |
||
137 | sub eax,[ebx+offs_zbup_g] |
||
138 | shl eax,8 |
||
139 | xor edx,edx |
||
140 | div dword[n] |
||
141 | mov [ginc],eax ;ginc=((p2.g-p1.g)<<8)/n |
||
142 | |||
143 | mov eax,[ecx+offs_zbup_b] |
||
144 | sub eax,[ebx+offs_zbup_b] |
||
145 | shl eax,8 |
||
146 | xor edx,edx |
||
147 | div dword[n] |
||
148 | mov [binc],eax ;binc=((p2.b-p1.b)<<8)/n |
||
149 | |||
150 | shl dword d_y,1 |
||
151 | mov eax, d_y |
||
152 | sub eax, d_x |
||
153 | mov [a],eax ;a=2*d_y-d_x |
||
154 | shl dword d_x,1 |
||
155 | mov eax, d_y |
||
156 | sub d_x,eax |
||
157 | mov eax,inc_1 |
||
158 | imul eax,PSZB |
||
159 | mov [pp_inc_1],eax ;pp_inc_1 = inc_1*PSZB |
||
160 | mov eax,inc_2 |
||
161 | imul eax,PSZB |
||
162 | mov [pp_inc_2],eax ;pp_inc_2 = inc_2*PSZB |
||
163 | |||
164 | local .do_cycle |
||
165 | local .els_0 |
||
166 | local .end_0 |
||
167 | |||
168 | align 4 |
||
169 | .do_cycle: |
||
170 | |||
171 | PUTPIXEL |
||
172 | if INTERP_Z eq 1 |
||
173 | mov eax,[zinc] |
||
174 | add [z],eax |
||
175 | end if |
||
176 | mov eax,[rinc] |
||
177 | add [r],eax |
||
178 | mov eax,[ginc] |
||
179 | add [g],eax |
||
180 | mov eax,[binc] |
||
181 | add [b],eax |
||
182 | |||
183 | cmp dword[a],0 |
||
184 | jle .els_0 |
||
185 | add edi,[pp_inc_1] |
||
186 | if INTERP_Z eq 1 |
||
187 | mov eax,inc_1 |
||
188 | add [pz],eax |
||
189 | end if |
||
190 | mov eax,d_x |
||
191 | sub [a],eax |
||
192 | jmp .end_0 |
||
193 | |||
194 | .els_0: |
||
195 | add edi,[pp_inc_2] |
||
196 | if INTERP_Z eq 1 |
||
197 | mov eax,inc_2 |
||
198 | add [pz],eax |
||
199 | end if |
||
200 | mov eax,d_y |
||
201 | add [a],eax |
||
202 | |||
203 | .end_0: |
||
204 | dec dword[n] |
||
205 | cmp dword[n],0 |
||
206 | jge .do_cycle |
||
207 | } |
||
208 | |||
209 | ; fin macro |
||
210 | |||
211 | mov eax,[d_x] |
||
212 | cmp eax,0 |
||
213 | jne .els_0 |
||
214 | cmp dword[d_y],0 |
||
215 | jne .els_0 |
||
216 | ;if (d_x==0 && d_y==0) |
||
217 | PUTPIXEL |
||
218 | jmp .end_2 |
||
219 | .els_0: |
||
220 | cmp eax,0 |
||
221 | jle .els_3 |
||
222 | ;if (d_x > 0) |
||
223 | mov esi,[sx] |
||
224 | inc esi |
||
225 | cmp eax,[d_y] |
||
226 | jl .els_2 |
||
227 | ;if (d_x >= d_y) |
||
228 | DRAWLINE [d_x], [d_y], esi, 1 |
||
229 | jmp .end_2 |
||
230 | .els_2: |
||
231 | DRAWLINE [d_y], [d_x], esi, [sx] |
||
232 | jmp .end_2 |
||
233 | .els_3: |
||
234 | xor eax,eax |
||
235 | sub eax,[d_x] |
||
236 | mov [d_x],eax |
||
237 | mov esi,[sx] |
||
238 | dec esi |
||
239 | cmp eax,[d_y] |
||
240 | jl .els_4 |
||
241 | ;if (d_x >= d_y) |
||
242 | DRAWLINE [d_x], [d_y], esi, -1 |
||
243 | jmp .end_2 |
||
244 | .els_4: |
||
245 | DRAWLINE [d_y], [d_x], esi, [sx] |
||
246 | .end_2: |
||
247 | |||
248 | popad |
||
249 | ret |
||
250 | endp |
||
251 | |||
252 | restore INTERP_Z |
||
253 | |||
254 | ; internal defines |
||
255 | purge DRAWLINE |
||
256 | purge PUTPIXEL |
||
257 | purge RGBPIXEL8)/n |