Subversion Repositories Kolibri OS

Rev

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