source: trunk/src/gdi32/rgbcvt.asm@ 10366

Last change on this file since 10366 was 9420, checked in by sandervl, 23 years ago

Fixed bugs in MMX RGB 555<->565 conversion (leftovers)

File size: 3.5 KB
Line 
1; $Id: rgbcvt.asm,v 1.6 2002-11-21 11:39:37 sandervl Exp $
2; Copyright 2000 Daniela Engert (dani@ngrt.de)
3
4 .586p
5 .MMX
6 .MODEL FLAT
7
8 .DATA
9
10 align 4
11 and1mask dd 0001F001Fh
12 dd 0001F001Fh
13 and2mask dd 0FFC0FFC0h
14 dd 0FFC0FFC0h
15 and2mask565 dd 0FFE07FE0h
16 dd 07FE07FE0h
17
18 .CODE
19
20; void _Optlink RGB555to565 (WORD *dest, WORD *src, ULONG num);
21
22 PUBLIC RGB555to565
23
24RGB555to565 PROC NEAR
25
26 push esi
27 push edi
28 cld
29
30 mov edi, eax ; _Optlink arg1 = EAX
31 mov esi, edx ; _Optlink arg2 = EDX
32 shr ecx, 1 ; _Optlink arg3 = ECX
33 pushf
34cvt:
35 mov eax, [esi]
36 mov edx, eax
37
38 add esi, 4
39 shl eax, 1
40
41 and edx, 0001F001Fh
42 and eax, 0FFC0FFC0h
43
44 add edi, 4
45 or eax, edx
46
47 mov [edi-4], eax
48 loop cvt
49
50 popf
51 jnc SHORT done
52
53 mov ax, [esi]
54 mov dx, ax
55 and dx, 0001Fh
56 shl ax, 1
57 and ax, 0FFC0h
58 or ax, dx
59 mov [edi], ax
60
61done:
62 pop edi
63 pop esi
64 ret
65
66RGB555to565 ENDP
67
68 PUBLIC RGB565to555
69
70RGB565to555 PROC NEAR
71
72 push esi
73 push edi
74 cld
75
76 cmp ecx, 0
77 jz done
78
79 mov edi, eax ; _Optlink arg1 = EAX
80 mov esi, edx ; _Optlink arg2 = EDX
81 shr ecx, 1 ; _Optlink arg3 = ECX
82 pushf
83cvt:
84 mov eax, [esi]
85 mov edx, eax
86
87 add esi, 4
88 shr eax, 1
89
90 and edx, 0001F001Fh
91 and eax, 0FFE07FE0h
92
93 add edi, 4
94 or eax, edx
95
96 mov [edi-4], eax
97 loop cvt
98
99 popf
100 jnc SHORT done
101
102 mov ax, [esi]
103 mov dx, ax
104 and dx, 0001Fh
105 shr ax, 1
106 and ax, 0FFE0h
107 or ax, dx
108 mov [edi], ax
109
110done:
111 pop edi
112 pop esi
113 ret
114
115RGB565to555 ENDP
116
117; void _Optlink RGB555to565MMX(WORD *dest, WORD *src, ULONG num);
118
119 PUBLIC RGB555to565MMX
120
121RGB555to565MMX PROC NEAR
122 push esi
123 push edi
124 cld
125
126 cmp ecx, 0
127 jz done
128
129 push ecx
130
131 mov edi, eax ; _Optlink arg1 = EAX
132 mov esi, edx ; _Optlink arg2 = EDX
133 shr ecx, 3 ; _Optlink arg3 = ECX
134 jz lastpixels
135
136 sub esp, 108
137 fsaved dword ptr [esp]
138
139 movq mm2, qword ptr and1mask ; 0001F001F001F001Fh
140 movq mm3, qword ptr and2mask ; FFC0FFC00FFC0FFC0h
141
142cvt:
143 movq mm0, qword ptr [esi]
144 add edi, 16
145
146 movq mm4, qword ptr [esi+8]
147 movq mm1, mm0
148
149 movq mm5, mm4
150 psllq mm0, 1
151
152 psllq mm4, 1
153 pand mm1, mm2
154
155 pand mm0, mm3
156 pand mm5, mm2
157
158 pand mm4, mm3
159 por mm0, mm1
160
161 por mm4, mm5
162 add esi, 16
163
164 movq qword ptr [edi-16], mm0
165 dec ecx
166
167 movq qword ptr [edi-8], mm4
168 jnz cvt
169
170 nop
171 nop
172
173 frstord dword ptr [esp]
174 add esp, 108
175
176lastpixels:
177 pop ecx
178 and ecx, 7
179 jz short done
180
181cvt2loop:
182 mov ax, [esi]
183 mov dx, ax
184
185 add esi, 2
186 and dx, 001Fh
187
188 shl ax, 1
189 add edi, 2
190
191 and ax, 0FFC0h
192 or ax, dx
193
194 mov [edi-2], ax
195 loop cvt2loop
196
197done:
198 pop edi
199 pop esi
200 ret
201
202RGB555to565MMX ENDP
203
204
205; void _Optlink RGB565to555MMX(WORD *dest, WORD *src, ULONG num);
206
207 PUBLIC RGB565to555MMX
208
209RGB565to555MMX PROC NEAR
210 push esi
211 push edi
212 cld
213
214 cmp ecx, 0
215 jz done
216
217 push ecx
218
219 mov edi, eax ; _Optlink arg1 = EAX
220 mov esi, edx ; _Optlink arg2 = EDX
221 shr ecx, 3 ; _Optlink arg3 = ECX
222 jz lastpixels
223
224 sub esp, 108
225 fsaved dword ptr [esp]
226
227 movq mm2, qword ptr and1mask ; 0001F001F001F001Fh
228 movq mm3, qword ptr and2mask565 ; FFE07FE007FE07FE0h
229
230cvt:
231 movq mm0, qword ptr [esi]
232 add edi, 16
233
234 movq mm4, qword ptr [esi+8]
235 movq mm1, mm0
236
237 movq mm5, mm4
238 psrlq mm0, 1
239
240 psrlq mm4, 1
241 pand mm1, mm2
242
243 pand mm0, mm3
244 pand mm5, mm2
245
246 pand mm4, mm3
247 por mm0, mm1
248
249 por mm4, mm5
250 add esi, 16
251
252 movq qword ptr [edi-16], mm0
253 dec ecx
254
255 movq qword ptr [edi-8], mm4
256 jnz cvt
257
258 nop
259 nop
260
261 frstord dword ptr [esp]
262 add esp, 108
263
264lastpixels:
265 pop ecx
266 and ecx, 7
267 jz short done
268
269cvt2loop:
270 mov ax, [esi]
271 mov dx, ax
272
273 add esi, 2
274 and dx, 001Fh
275
276 shr ax, 1
277 add edi, 2
278
279 and ax, 0FFE0h
280 or ax, dx
281
282 mov [edi-2], ax
283 loop cvt2loop
284
285done:
286 pop edi
287 pop esi
288 ret
289
290RGB565to555MMX ENDP
291
292 END
Note: See TracBrowser for help on using the repository browser.