Rev 2388 | Rev 2691 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2388 | Rev 2397 | ||
---|---|---|---|
Line 34... | Line 34... | ||
34 | push ecx edi |
34 | push ecx edi |
35 | xor eax, eax |
35 | xor eax, eax |
Line 36... | Line 36... | ||
36 | 36 | ||
Line 37... | Line 37... | ||
37 | mov edi, [_data] |
37 | mov edi, [_data] |
38 | 38 | ||
39 | cmp [edi + pcx_header.magic_number], 10 |
39 | cmp byte[edi + pcx_header.magic_number], 0x0A |
40 | jne .is_not_pcx |
40 | jne .is_not_pcx |
41 | cmp [edi + pcx_header.version], 5 |
41 | cmp byte[edi + pcx_header.version], 5 |
42 | jne .is_not_pcx |
42 | jne .is_not_pcx |
43 | cmp [edi + pcx_header.encoding], 1 |
43 | cmp byte[edi + pcx_header.encoding], 1 |
44 | jne .is_not_pcx |
44 | jne .is_not_pcx |
Line 45... | Line 45... | ||
45 | cmp [edi + pcx_header.reserved], 0 |
45 | cmp byte[edi + pcx_header.reserved], 0 |
46 | jne .is_not_pcx |
46 | jne .is_not_pcx |
47 | 47 | ||
Line 72... | Line 72... | ||
72 | ;;------------------------------------------------------------------------------------------------;; |
72 | ;;------------------------------------------------------------------------------------------------;; |
73 | ;< eax = 0 (error) or pointer to image ;; |
73 | ;< eax = 0 (error) or pointer to image ;; |
74 | ;;================================================================================================;; |
74 | ;;================================================================================================;; |
75 | locals |
75 | locals |
76 | nplanes rd 1 |
76 | nplanes rd 1 |
77 | xsize rw 1 |
77 | xsize rd 1 |
78 | ysize rw 1 |
78 | ysize rd 1 |
79 | bpl rw 1 |
79 | bpl rd 1 |
80 | total_bpl rd 1 |
80 | total_bpl rd 1 |
81 | line_begin rd 1 |
81 | line_begin rd 1 |
82 | retvalue rd 1 ; 0 (error) or pointer to image |
82 | retvalue rd 1 ; 0 (error) or pointer to image |
83 | endl |
83 | endl |
Line 84... | Line 84... | ||
84 | 84 | ||
Line 85... | Line 85... | ||
85 | pusha |
85 | pusha |
86 | 86 | ||
87 | mov esi, [_data] |
87 | mov esi, [_data] |
88 | movzx eax, byte[esi + pcx_header.nplanes] |
88 | movzx eax, byte[esi + pcx_header.nplanes] |
89 | mov [nplanes], eax |
89 | mov [nplanes], eax |
90 | mov bx, word[esi + pcx_header.bpl] |
- | |
91 | mov [bpl], bx |
90 | movzx ebx, word[esi + pcx_header.bpl] |
92 | mul bx |
- | |
93 | shl eax, 16 |
- | |
94 | mov ax, dx |
91 | mov [bpl], ebx |
Line 95... | Line 92... | ||
95 | ror eax, 16 |
92 | imul eax, ebx |
96 | mov [total_bpl], eax |
- | |
97 | 93 | mov [total_bpl], eax |
|
- | 94 | ||
98 | movzx eax, word[esi + pcx_header.xmax] |
95 | movzx eax, word[esi + pcx_header.xmax] |
Line 99... | Line 96... | ||
99 | inc ax |
96 | sub ax, word[esi + pcx_header.xmin] |
100 | sub ax, word[esi + pcx_header.xmin] |
- | |
101 | mov [xsize], ax |
97 | inc eax |
- | 98 | mov [xsize], eax |
|
102 | 99 | ||
103 | movzx ebx, word[esi + pcx_header.ymax] |
- | |
Line 104... | Line 100... | ||
104 | inc bx |
100 | movzx ebx, word[esi + pcx_header.ymax] |
105 | sub bx, word[esi + pcx_header.ymin] |
101 | sub bx, word[esi + pcx_header.ymin] |
106 | mov [ysize], bx |
102 | inc ebx |
107 | 103 | mov [ysize], ebx |
|
Line 108... | Line 104... | ||
108 | 104 | ||
Line 109... | Line 105... | ||
109 | cmp [esi + pcx_header.bpp], 1 |
105 | cmp [esi + pcx_header.bpp], 1 |
110 | jz .monochrome |
106 | jz .monochrome |
111 | cmp byte[esi + pcx_header.nplanes], 3 |
107 | cmp byte[esi + pcx_header.nplanes], 3 |
112 | jnz .indexed |
108 | jnz .indexed |
Line 113... | Line -... | ||
113 | - | ||
114 | - | ||
115 | ._24bit: |
- | |
116 | - | ||
117 | stdcall img.create, eax, ebx, Image.bpp24 |
- | |
118 | mov [retvalue], eax |
- | |
119 | test eax, eax |
- | |
120 | jz .quit |
- | |
121 | - | ||
122 | movzx ebx, [xsize] |
- | |
123 | movzx ecx, [ysize] |
109 | |
124 | mov edx, [eax+Image.Data] |
110 | |
125 | - | ||
126 | rol ebx, 16 |
111 | .24bit: |
127 | or ebx, ecx |
112 | |
128 | xor ebx, [edx] |
113 | stdcall img.create, eax, ebx, Image.bpp24 |
129 | mov [eax + Image.Checksum], ebx |
- | |
Line 130... | Line 114... | ||
130 | 114 | mov [retvalue], eax |
|
- | 115 | test eax, eax |
|
- | 116 | jz .quit |
|
131 | 117 | ||
132 | mov esi, [_data] |
118 | mov esi, [_data] |
133 | add esi, 128 |
119 | add esi, 128 ; skip header |
134 | ; mov edi, [retvalue] |
120 | mov edi, [eax + Image.Data] |
- | 121 | add edi, 2 |
|
135 | mov edi, [eax + Image.Data] |
122 | mov [line_begin], edi |
136 | add edi, 2 |
- | |
137 | mov [line_begin], edi |
123 | |
138 | mov ebx, [total_bpl] |
124 | .24bit.scanline: |
139 | 125 | mov ebx, [total_bpl] |
|
Line 140... | Line 126... | ||
140 | ._24bit.begin: |
126 | .24bit.color_line: |
141 | mov ax, word[bpl] |
- | |
142 | ._24bit.decode: |
127 | mov edx, [bpl] |
Line 143... | Line 128... | ||
143 | call pcx._.get_byte |
128 | .24bit.next_byte: |
144 | ._24bit.write_sequence: |
129 | call pcx._.get_byte |
145 | mov [edi], dl |
130 | sub edx, ecx |
146 | dec ax |
131 | @@: |
147 | add edi, [nplanes] |
132 | mov [edi], al |
148 | dec dh |
133 | add edi, [nplanes] |
Line 149... | Line 134... | ||
149 | jnz ._24bit.write_sequence |
134 | dec ecx |
150 | 135 | jnz @b |
|
151 | test ax, ax |
136 | |
152 | jz ._24bit.end_color_line |
- | |
153 | jmp ._24bit.decode |
137 | test edx, edx |
- | 138 | jnz .24bit.next_byte |
|
- | 139 | ||
- | 140 | .24bit.end_color_line: |
|
- | 141 | test ebx, ebx |
|
154 | 142 | jz .24bit.end_full_line |
|
155 | ._24bit.end_color_line: |
143 | dec [line_begin] |
Line 156... | Line 144... | ||
156 | test ebx, ebx |
144 | mov edi, [line_begin] |
Line 157... | Line 145... | ||
157 | jz ._24bit.end_full_line |
145 | jmp .24bit.color_line |
158 | dec [line_begin] |
146 | |
159 | mov edi, [line_begin] |
147 | .24bit.end_full_line: |
160 | jmp ._24bit.begin |
148 | dec [ysize] |
Line 161... | Line -... | ||
161 | - | ||
162 | ._24bit.end_full_line: |
- | |
163 | dec word[ysize] |
- | |
164 | jz .quit |
- | |
165 | mov ebx, [total_bpl] |
- | |
166 | add edi, 2 |
149 | jz .quit |
167 | mov [line_begin], edi |
- | |
168 | jmp ._24bit.begin |
- | |
169 | - | ||
170 | 150 | add edi, 2 |
|
171 | .indexed: |
151 | bt [xsize], 0 |
172 | 152 | jnc @f |
|
173 | stdcall img.create, eax, ebx, Image.bpp8 |
153 | sub edi, 3 |
174 | mov [retvalue], eax |
154 | @@: |
- | 155 | mov [line_begin], edi |
|
175 | test eax, eax |
156 | jmp .24bit.scanline |
176 | jz .quit |
157 | |
177 | 158 | ||
178 | movzx ebx, [xsize] |
159 | .indexed: |
179 | movzx ecx, [ysize] |
- | |
180 | mov edx, [eax + Image.Data] |
160 | |
181 | 161 | stdcall img.create, eax, ebx, Image.bpp8 |
|
182 | rol ebx, 16 |
162 | mov [retvalue], eax |
183 | or ebx, ecx |
163 | test eax, eax |
Line 184... | Line 164... | ||
184 | xor ebx, [edx] |
164 | jz .quit |
185 | mov [eax + Image.Checksum], ebx |
165 | |
186 | - | ||
187 | mov esi, [_data] |
166 | mov ebx, eax |
Line 188... | Line 167... | ||
188 | add esi, [_length] |
167 | mov esi, [_data] |
189 | sub esi, 768 |
168 | add esi, [_length] |
190 | mov edi, [eax + Image.Palette] |
169 | sub esi, 768 |
191 | mov cx, 256 |
170 | mov edi, [eax + Image.Palette] |
192 | @@: |
- | |
193 | mov ebx, [esi] |
171 | mov ecx, 256 |
194 | bswap ebx |
172 | xor eax, eax |
195 | shr ebx, 8 |
173 | @@: |
196 | mov [edi], ebx |
174 | lodsw |
197 | add edi, 4 |
- | |
198 | add esi, 3 |
- | |
199 | dec cx |
175 | xchg al, ah |
200 | jnz @b |
176 | shl eax, 8 |
201 | - | ||
Line 202... | Line -... | ||
202 | mov esi, [_data] |
- | |
203 | add esi, 128 |
177 | lodsb |
204 | ; mov edi, [retvalue] |
178 | stosd |
205 | mov edi, [eax + Image.Data] |
179 | dec ecx |
Line 206... | Line 180... | ||
206 | 180 | jnz @b |
|
Line 207... | Line 181... | ||
207 | .indexed.begin: |
181 | |
208 | mov ax, word[bpl] |
182 | mov esi, [_data] |
209 | .indexed.decode: |
183 | add esi, 128 |
210 | call pcx._.get_byte |
184 | mov edi, [ebx + Image.Data] |
Line 211... | Line -... | ||
211 | .indexed.write_sequence: |
- | |
212 | mov [edi], dl |
- | |
213 | inc edi |
- | |
214 | dec ax |
- | |
215 | dec dh |
- | |
216 | jnz .indexed.write_sequence |
- | |
217 | - | ||
218 | test ax, ax |
- | |
219 | jz .indexed.end_line |
- | |
220 | jmp .indexed.decode |
185 | |
221 | 186 | .indexed.line: |
|
222 | .indexed.end_line: |
187 | mov ebx, [total_bpl] |
Line 223... | Line 188... | ||
223 | dec word[ysize] |
188 | .indexed.next_byte: |
224 | jz .quit |
189 | call pcx._.get_byte |
225 | jmp .indexed.begin |
- | |
226 | 190 | @@: |
|
Line 227... | Line 191... | ||
227 | 191 | stosb |
|
228 | .monochrome: |
192 | dec ecx |
229 | - | ||
230 | stdcall img.create, eax, ebx, Image.bpp1 |
- | |
231 | mov [retvalue], eax |
193 | jnz @b |
232 | test eax, eax |
- | |
233 | jz .quit |
- | |
234 | - | ||
235 | movzx ebx, [xsize] |
- | |
236 | movzx ecx, [ysize] |
- | |
237 | mov edx, [eax + Image.Data] |
- | |
238 | - | ||
239 | rol ebx, 16 |
- | |
240 | or ebx, ecx |
- | |
241 | xor ebx, [edx] |
- | |
242 | mov [eax + Image.Checksum], ebx |
- | |
243 | - | ||
244 | mov edi, [eax + Image.Palette] |
- | |
245 | mov [edi], dword 0x00000000 |
- | |
246 | mov [edi + 4], dword 0x00ffffff |
194 | test ebx, ebx |
247 | - | ||
248 | mov esi, [_data] |
195 | jnz .indexed.next_byte |
- | 196 | ||
- | 197 | dec [ysize] |
|
- | 198 | jnz .indexed.line |
|
- | 199 | jmp .quit |
|
- | 200 | ||
249 | add esi, 128 |
201 | |
250 | ; mov edi, [retvalue] |
202 | .monochrome: |
251 | mov edi, [eax + Image.Data] |
203 | |
Line 252... | Line 204... | ||
252 | 204 | stdcall img.create, eax, ebx, Image.bpp1 |
|
253 | 205 | mov [retvalue], eax |
|
254 | .monochrome.begin: |
206 | test eax, eax |
Line 307... | Line 259... | ||
307 | ;;================================================================================================;; |
259 | ;;================================================================================================;; |
308 | ;;////////////////////////////////////////////////////////////////////////////////////////////////;; |
260 | ;;////////////////////////////////////////////////////////////////////////////////////////////////;; |
309 | ;;================================================================================================;; |
261 | ;;================================================================================================;; |
310 | proc pcx._.get_byte |
262 | proc pcx._.get_byte |
Line 311... | Line 263... | ||
311 | 263 | ||
312 | mov dh, byte[esi] |
264 | xor ecx, ecx |
313 | inc esi |
265 | lodsb |
314 | cmp dh, 0xC0 |
266 | cmp al, 0xC0 |
315 | jnb .cycle1 |
- | |
316 | mov dl, dh |
- | |
317 | mov dh, 1 |
267 | setb cl |
318 | jmp .exit1 |
- | |
319 | .cycle1: |
268 | jb .done |
320 | and dh, 0x3F |
269 | and al, 0x3F |
321 | mov dl, byte[esi] |
270 | mov cl, al |
322 | inc esi |
271 | lodsb |
323 | .exit1: |
- | |
324 | movzx ecx, dh |
272 | .done: |
325 | sub ebx, ecx |
273 | sub ebx, ecx |
326 | ret |
274 | ret |