Subversion Repositories Kolibri OS

Rev

Rev 1102 | Rev 2733 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1102 Rev 1308
Line 52... Line 52...
52
;;proc img.decode.png _data, _length, _options ;//////////////////////////////////////////////////;;
52
;;proc img.decode.png _data, _length, _options ;//////////////////////////////////////////////////;;
53
img.decode.png:
53
img.decode.png:
54
	xor	eax, eax	; .image = 0
54
	xor	eax, eax	; .image = 0
55
	pushad
55
	pushad
56
	mov	ebp, esp
56
	mov	ebp, esp
57
.localsize = 15*4
57
.localsize = 29*4
58
virtual at ebp - .localsize
58
virtual at ebp - .localsize
59
.width		dd	?
59
.width		dd	?
60
.height		dd	?
60
.height		dd	?
61
.bit_depth	dd	?
61
.bit_depth	dd	?
62
.color_type	dd	?
62
.color_type	dd	?
63
.bytes_per_pixel dd	?
63
.bytes_per_pixel dd	?
64
.scanline_len	dd	?
64
.scanline_len	dd	?
-
 
65
.bits_per_pixel dd	?
-
 
66
.size_rest	dd	?
65
.cur_chunk_ptr	dd	?
67
.cur_chunk_ptr	dd	?
66
.cur_chunk_size	dd	?
68
.cur_chunk_size	dd	?
-
 
69
.allocated	dd	?
67
.paeth_a	dd	?
70
.paeth_a	dd	?
68
.paeth_b	dd	?
71
.paeth_b	dd	?
69
.paeth_c	dd	?
72
.paeth_c	dd	?
70
.paeth_pa	dd	?
73
.paeth_pa	dd	?
71
.paeth_pb	dd	?
74
.paeth_pb	dd	?
72
.paeth_pc	dd	?
75
.paeth_pc	dd	?
-
 
76
.i		dd	?
-
 
77
.j		dd	?
-
 
78
; variables to handle interlace
-
 
79
.row_distance	dd	?	; diff between two consecutives rows in destination
-
 
80
.col_distance	dd	?	; summand for moving to next row in source
-
 
81
.row_increment	dd	?
-
 
82
.col_increment	dd	?
-
 
83
.block_height	dd	?
-
 
84
.block_width	dd	?
-
 
85
.interlace	db	?	; 0 if not interlaced, 1 if interlaced
-
 
86
.row_increment_shift db	?
-
 
87
.col_increment_shift db	?
-
 
88
.shift		db	?	; shift for current src byte
-
 
89
.starting_row	dd	?
-
 
90
.starting_col	dd	?
73
.idat_read	dd	?
91
.idat_read	dd	?
74
	rb	1Ch
92
	rb	1Ch
75
.image		dd	?
93
.image		dd	?
76
	rd	1
94
	rd	1
77
.data		dd	?
95
.data		dd	?
78
.length		dd	?
96
.length		dd	?
79
.options	dd	?
97
.options	dd	?
80
end virtual
98
end virtual
81
	push	0	; .idat_read = 0
99
	push	eax	; .idat_read = 0
-
 
100
	push	eax	; .starting_col = 0
-
 
101
	push	eax	; .starting_row = 0
-
 
102
	push	eax	; .col_increment_shift, .row_increment_shift
-
 
103
	inc	eax
-
 
104
	push	eax	; .block_width
-
 
105
	push	eax	; .block_height
-
 
106
	push	eax	; .col_increment
-
 
107
	push	eax	; .row_increment
82
	sub	esp, .localsize-4
108
	sub	esp, .localsize-32
83
; load deflate unpacker, if not yet
109
; load deflate unpacker, if not yet
84
; acquire mutex
110
; acquire mutex
85
@@:
111
@@:
86
	push	1
112
	push	1
87
	pop	eax
113
	pop	eax
Line 167... Line 193...
167
	jnz	.invalid_chunk	; only compression method 0 is defined
193
	jnz	.invalid_chunk	; only compression method 0 is defined
168
	lodsb
194
	lodsb
169
	test	al, al
195
	test	al, al
170
	jnz	.invalid_chunk	; only filtering method 0 is defined
196
	jnz	.invalid_chunk	; only filtering method 0 is defined
171
	lodsb
197
	lodsb
172
	test	al, al
198
	cmp	al, 1
173
	jnz	.invalid_chunk	; progressive PNGs are not supported yet
199
	ja	.invalid_chunk	; only interlacing methods 0 and 1 are defined
-
 
200
	mov	[.interlace], al
174
; check for correctness and calculate bytes_per_pixel and scanline_len
201
; check for correctness and calculate bytes_per_pixel and scanline_len
175
	mov	eax, [.bit_depth]
202
	mov	eax, [.bit_depth]
176
	mov	edx, [.color_type]
203
	mov	edx, [.color_type]
177
	dec	edx
204
	dec	edx
178
	js	.grayscale1
205
	js	.grayscale1
Line 198... Line 225...
198
	cmp	al, 8
225
	cmp	al, 8
199
	ja	.invalid_chunk
226
	ja	.invalid_chunk
200
.grayscale1:
227
.grayscale1:
201
@@:
228
@@:
202
	mul	ebx
229
	mul	ebx
203
	push	eax
230
	mov	[.bits_per_pixel], eax
204
	add	eax, 7
231
	add	eax, 7
205
	shr	eax, 3
232
	shr	eax, 3
206
	mov	[.bytes_per_pixel], eax
233
	mov	[.bytes_per_pixel], eax
207
	pop	eax
-
 
208
	mul	[.width]
-
 
209
	add	eax, 7
-
 
210
	shr	eax, 3
-
 
211
	mov	[.scanline_len], eax
-
 
212
; allocate image
234
; allocate image
213
	push	Image.bpp24
235
	push	Image.bpp24
214
	pop	eax
236
	pop	eax
215
	cmp	[.color_type], 2
237
	cmp	[.color_type], 2
216
	jz	@f
238
	jz	@f
Line 298... Line 320...
298
	pop	ecx
320
	pop	ecx
299
	test	eax, eax
321
	test	eax, eax
300
	jz	.invalid_chunk
322
	jz	.invalid_chunk
301
; convert PNG unpacked data to RAW data
323
; convert PNG unpacked data to RAW data
302
	mov	esi, eax
324
	mov	esi, eax
-
 
325
	mov	[.allocated], eax
-
 
326
	mov	[.size_rest], ecx
-
 
327
; unfilter and deinterlace
-
 
328
; .interlace_pass, .starting_row and .starting_col have been already set to 0
-
 
329
; .block_width, .block_height, .col_increment, .row_increment were set
-
 
330
; to values for non-interlaced images; correct if necessary
-
 
331
	cmp	[.interlace], 0
-
 
332
	jz	.deinterlace_loop
303
	push	eax ecx
333
	push	8
304
; unfilter
334
	pop	eax
-
 
335
	mov	[.row_increment], eax
-
 
336
	mov	[.col_increment], eax
-
 
337
	mov	[.block_height], eax
-
 
338
	mov	[.block_width], eax
-
 
339
	mov	[.row_increment_shift], 3
-
 
340
	mov	[.col_increment_shift], 3
-
 
341
.deinterlace_loop:
305
	mov	edx, [.height]
342
	mov	edx, [.height]
-
 
343
	cmp	edx, [.starting_row]
-
 
344
	jbe	.deinterlace_next
-
 
345
	mov	ebx, [.width]
-
 
346
	sub	ebx, [.starting_col]
-
 
347
	jbe	.deinterlace_next
-
 
348
	mov	cl, [.col_increment_shift]
-
 
349
	add	ebx, [.col_increment]
-
 
350
	dec	ebx
-
 
351
	shr	ebx, cl
-
 
352
	mov	eax, [.bits_per_pixel]
-
 
353
	imul	eax, ebx
-
 
354
	add	eax, 7
-
 
355
	shr	eax, 3
-
 
356
	mov	[.scanline_len], eax
-
 
357
	shl	ebx, cl
-
 
358
	mov	[.col_distance], ebx
-
 
359
; Unfilter
-
 
360
	mov	ecx, [.size_rest]
-
 
361
	push	esi
306
.unfilter_loop_e:
362
.unfilter_loop_e:
307
	mov	ebx, [.scanline_len]
363
	mov	ebx, [.scanline_len]
308
	sub	ecx, 1
364
	sub	ecx, 1
309
	jc	.unfilter_done
365
	jc	.unfilter_abort
310
	sub	ecx, ebx
366
	sub	ecx, ebx
311
	jc	.unfilter_done
367
	jc	.unfilter_abort
312
	movzx	eax, byte [esi]
368
	movzx	eax, byte [esi]
313
	add	esi, 1
369
	add	esi, 1
314
	cmp	eax, 4
370
	cmp	eax, 4
315
	ja	.next_scanline
371
	ja	.next_scanline
316
	jmp	dword [@f + eax*4]
372
	jmp	dword [@f + eax*4]
Line 478... Line 534...
478
	pop	edx
534
	pop	edx
479
	jmp	.next_scanline
535
	jmp	.next_scanline
480
.unfilter_none:
536
.unfilter_none:
481
	add	esi, ebx
537
	add	esi, ebx
482
.next_scanline:
538
.next_scanline:
483
	sub	edx, 1
539
	sub	edx, [.row_increment]
-
 
540
	jc	.unfilter_done
-
 
541
	cmp	edx, [.starting_row]
-
 
542
	jbe	.unfilter_done
484
	jnz	.unfilter_loop_e
543
	jmp	.unfilter_loop_e
-
 
544
.unfilter_abort:
-
 
545
	xor	ecx, ecx
485
.unfilter_done:
546
.unfilter_done:
486
; unfiltering done, now convert to raw data
547
; unfiltering done, now convert to raw data
-
 
548
; with deinterlacing if needed
487
	pop	ebx esi
549
	pop	esi
-
 
550
	mov	ebx, [.image]
-
 
551
	mov	eax, [.width]
-
 
552
	call	img._.get_scanline_len
-
 
553
	mov	[.row_distance], eax
-
 
554
	mov	eax, [.row_increment]
488
	push	esi
555
	mul	[.width]
-
 
556
	sub	eax, [.col_distance]
-
 
557
	call	img._.get_scanline_len
-
 
558
	mov	[.col_distance], eax
-
 
559
	mov	edi, [ebx + Image.Data]
-
 
560
	mov	eax, [.starting_row]
-
 
561
	mul	[.width]
-
 
562
	add	eax, [.starting_col]
-
 
563
	call	img._.get_scanline_len
-
 
564
	add	edi, eax
-
 
565
	mov	eax, ebx
-
 
566
	mov	ebx, [.size_rest]
-
 
567
	mov	[.size_rest], ecx
489
	mov	edx, [.height]
568
	mov	edx, [.height]
490
	mov	eax, [.image]
569
	sub	edx, [.starting_row]
491
	mov	edi, [eax + Image.Data]
570
	mov	[.j], edx
492
	cmp	[.color_type], 0
571
	cmp	[.color_type], 0
493
	jz	.grayscale2
572
	jz	.grayscale2
494
	cmp	[.color_type], 2
573
	cmp	[.color_type], 2
495
	jz	.rgb2
574
	jz	.rgb2
496
	cmp	[.color_type], 3
575
	cmp	[.color_type], 3
Line 499... Line 578...
499
	jz	.grayscale_alpha2
578
	jz	.grayscale_alpha2
500
.rgb_alpha2:
579
.rgb_alpha2:
501
	cmp	[.bit_depth], 16
580
	cmp	[.bit_depth], 16
502
	jz	.rgb_alpha2_16bit
581
	jz	.rgb_alpha2_16bit
503
.rgb_alpha2.next:
582
.rgb_alpha2.next:
504
	mov	ecx, [.scanline_len]
-
 
505
	sub	ebx, 1
583
	sub	ebx, 1
506
	jc	.convert_done
584
	jc	.convert_done
507
	add	esi, 1
585
	add	esi, 1
508
	sub	ebx, ecx
586
	sub	ebx, [.scanline_len]
509
	jc	.convert_done
587
	jc	.convert_done
-
 
588
	mov	ecx, [.width]
-
 
589
	sub	ecx, [.starting_col]
-
 
590
	mov	[.i], ecx
-
 
591
.rgb_alpha2.extloop:
-
 
592
 
-
 
593
macro init_block
-
 
594
{
-
 
595
	push	ebx
-
 
596
	mov	eax, [.col_increment]
-
 
597
	mov	edx, [.j]
-
 
598
	cmp	edx, [.block_height]
-
 
599
	jb	@f
-
 
600
	mov	edx, [.block_height]
-
 
601
@@:
-
 
602
	mov	ebx, [.i]
-
 
603
	cmp	ebx, [.block_width]
-
 
604
	jb	@f
-
 
605
	mov	ebx, [.block_width]
510
@@:
606
@@:
-
 
607
}
-
 
608
 
-
 
609
	init_block
-
 
610
	lea	eax, [edi+eax*4]
-
 
611
	push	eax
-
 
612
.rgb_alpha2.innloop1:
-
 
613
	push	edi
-
 
614
	mov	ecx, ebx
-
 
615
.rgb_alpha2.innloop2:
511
	mov	al, [esi+2]
616
	mov	al, [esi+2]
512
	mov	[edi], al
617
	mov	[edi], al
513
	mov	al, [esi+1]
618
	mov	al, [esi+1]
514
	mov	[edi+1], al
619
	mov	[edi+1], al
515
	mov	al, [esi]
620
	mov	al, [esi]
516
	mov	[edi+2], al
621
	mov	[edi+2], al
517
	mov	al, [esi+3]
622
	mov	al, [esi+3]
518
	mov	[edi+3], al
623
	mov	[edi+3], al
519
	add	esi, 4
-
 
520
	add	edi, 4
624
	add	edi, 4
521
	sub	ecx, 4
625
	dec	ecx
-
 
626
	jnz	.rgb_alpha2.innloop2
522
	jnz	@b
627
	pop	edi
-
 
628
	add	edi, [.row_distance]
-
 
629
	dec	edx
-
 
630
	jnz	.rgb_alpha2.innloop1
-
 
631
	pop	edi ebx
523
	sub	edx, 1
632
	add	esi, 4
-
 
633
	mov	eax, [.col_increment]
-
 
634
	sub	[.i], eax
-
 
635
	ja	.rgb_alpha2.extloop
-
 
636
	add	edi, [.col_distance]
-
 
637
	mov	eax, [.row_increment]
-
 
638
	sub	[.j], eax
524
	jnz	.rgb_alpha2.next
639
	ja	.rgb_alpha2.next
525
	jmp	.convert_done
640
	jmp	.convert_done
526
.rgb_alpha2_16bit:
641
.rgb_alpha2_16bit:
527
	mov	ecx, [.scanline_len]
-
 
528
	sub	ebx, 1
642
	sub	ebx, 1
529
	jc	.convert_done
643
	jc	.convert_done
530
	add	esi, 1
644
	add	esi, 1
531
	sub	ebx, ecx
645
	sub	ebx, [.scanline_len]
532
	jc	.convert_done
646
	jc	.convert_done
-
 
647
	mov	ecx, [.width]
-
 
648
	sub	ecx, [.starting_col]
-
 
649
	mov	[.i], ecx
533
.rgb_alpha2.loop:
650
.rgb_alpha2_16bit.loop:
-
 
651
	init_block
-
 
652
	lea	eax, [edi+eax*4]
-
 
653
	push	eax
Line 534... Line 654...
534
 
654
 
535
; convert 16 bit sample to 8 bit sample
655
; convert 16 bit sample to 8 bit sample
536
macro convert_16_to_8
656
macro convert_16_to_8
537
{
657
{
Line 545... Line 665...
545
	cmp	ah, al
665
	cmp	ah, al
546
	sbb	al, 0
666
	sbb	al, 0
547
.l2:
667
.l2:
548
}
668
}
Line -... Line 669...
-
 
669
 
-
 
670
.rgb_alpha2_16bit.innloop1:
-
 
671
	push	edi
-
 
672
	mov	ecx, ebx
549
 
673
.rgb_alpha2_16bit.innloop2:
550
	mov	ax, [esi+4]
674
	mov	ax, [esi+4]
551
	convert_16_to_8
675
	convert_16_to_8
552
	mov	[edi], al
676
	mov	[edi], al
553
	mov	ax, [esi+2]
677
	mov	ax, [esi+2]
Line 557... Line 681...
557
	convert_16_to_8
681
	convert_16_to_8
558
	mov	[edi+2], al
682
	mov	[edi+2], al
559
	;mov	ax, [esi+6]
683
	;mov	ax, [esi+6]
560
	;convert_16_to_8
684
	;convert_16_to_8
561
	;mov	[edi+3], al
685
	;mov	[edi+3], al
562
	add	esi, 8
-
 
563
	add	edi, 4
686
	add	edi, 4
-
 
687
	dec	ecx
-
 
688
	jnz	.rgb_alpha2_16bit.innloop2
-
 
689
	pop	edi
-
 
690
	add	edi, [.row_distance]
-
 
691
	dec	edx
-
 
692
	jnz	.rgb_alpha2_16bit.innloop1
-
 
693
	pop	edi ebx
564
	sub	ecx, 8
694
	add	esi, 8
-
 
695
	mov	eax, [.col_increment]
-
 
696
	sub	[.i], eax
565
	jnz	.rgb_alpha2.loop
697
	ja	.rgb_alpha2_16bit.loop
-
 
698
	add	edi, [.col_distance]
-
 
699
	mov	eax, [.row_increment]
566
	sub	edx, 1
700
	sub	[.j], eax
567
	jnz	.rgb_alpha2_16bit
701
	ja	.rgb_alpha2_16bit
568
	jmp	.convert_done
702
	jmp	.convert_done
569
.grayscale2:
703
.grayscale2:
570
	push	edi edx
-
 
571
	mov	edi, [eax + Image.Palette]
704
	call	.create_grayscale_palette
572
	mov	ecx, [.bit_depth]
-
 
573
	cmp	cl, 16
-
 
574
	jnz	@f
-
 
575
	mov	cl, 8
-
 
576
@@:
-
 
577
	push	1
-
 
578
	pop	eax
-
 
579
	shl	eax, cl
-
 
580
	xchg	eax, ecx
-
 
581
	mov	edx, 0x010101
-
 
582
	cmp	al, 8
-
 
583
	jz	.graypal_common
-
 
584
	mov	edx, 0x111111
-
 
585
	cmp	al, 4
-
 
586
	jz	.graypal_common
-
 
587
	mov	edx, 0x555555
-
 
588
	cmp	al, 2
-
 
589
	jz	.graypal_common
-
 
590
	mov	edx, 0xFFFFFF
-
 
591
.graypal_common:
-
 
592
	xor	eax, eax
-
 
593
@@:
-
 
594
	stosd
-
 
595
	add	eax, edx
-
 
596
	loop	@b
-
 
597
	pop	edx edi
-
 
598
	cmp	[.bit_depth], 16
705
	cmp	[.bit_depth], 16
599
	jz	.grayscale2_16bit
706
	jz	.grayscale2_16bit
600
.palette2:
707
.palette2:
601
	cmp	[.bit_depth], 1
708
	cmp	[.bit_depth], 1
602
	jz	.palette2_1bit
709
	jz	.palette2_1bit
603
	cmp	[.bit_depth], 2
710
	cmp	[.bit_depth], 2
604
	jz	.palette2_2bit
711
	jz	.palette2_2bit
605
	cmp	[.bit_depth], 4
712
	cmp	[.bit_depth], 4
606
	jz	.palette2_4bit
713
	jz	.palette2_4bit
607
.palette2_8bit:
714
.palette2_8bit:
608
	mov	ecx, [.scanline_len]
-
 
609
	sub	ebx, 1
715
	sub	ebx, 1
610
	jc	.convert_done
716
	jc	.convert_done
611
	add	esi, 1
717
	add	esi, 1
612
	sub	ebx, ecx
718
	sub	ebx, [.scanline_len]
613
	jc	.convert_done
719
	jc	.convert_done
-
 
720
	mov	ecx, [.width]
-
 
721
	sub	ecx, [.starting_col]
-
 
722
	mov	[.i], ecx
-
 
723
.palette2_8bit.extloop:
-
 
724
	init_block
-
 
725
	add	eax, edi
614
	push	ecx
726
	push	eax
-
 
727
	mov	al, [esi]
-
 
728
	inc	esi
-
 
729
macro block_byte_innerloop extloop
-
 
730
{
-
 
731
local .l1
-
 
732
.l1:
615
	shr	ecx, 2
733
	mov	ecx, ebx
616
	rep	movsd
734
	rep	stosb
-
 
735
	sub	edi, ebx
-
 
736
	add	edi, [.row_distance]
617
	pop	ecx
737
	dec	edx
618
	and	ecx, 3
738
	jnz	.l1
619
	rep	movsb
739
	pop	edi ebx
-
 
740
	mov	eax, [.col_increment]
-
 
741
	sub	[.i], eax
-
 
742
	ja	extloop
-
 
743
	add	edi, [.col_distance]
-
 
744
	mov	eax, [.row_increment]
620
	sub	edx, 1
745
	sub	[.j], eax
-
 
746
}
-
 
747
	block_byte_innerloop .palette2_8bit.extloop
621
	jnz	.palette2_8bit
748
	ja	.palette2_8bit
622
	jmp	.convert_done
749
	jmp	.convert_done
623
.palette2_4bit:
750
.palette2_4bit:
624
	sub	ebx, 1
751
	sub	ebx, 1
625
	jc	.convert_done
752
	jc	.convert_done
626
	add	esi, 1
753
	add	esi, 1
627
	sub	ebx, [.scanline_len]
754
	sub	ebx, [.scanline_len]
628
	jc	.convert_done
755
	jc	.convert_done
629
	push	edx
-
 
630
	mov	ecx, [.width]
756
	mov	ecx, [.width]
-
 
757
	sub	ecx, [.starting_col]
-
 
758
	mov	[.i], ecx
-
 
759
	mov	[.shift], 0
-
 
760
.palette2_4bit.extloop:
-
 
761
	init_block
-
 
762
	add	eax, edi
631
@@:
763
	push	eax
-
 
764
	xor	[.shift], 1
-
 
765
	jz	.palette2_4bit.shifted
632
	mov	al, [esi]
766
	mov	al, [esi]
633
	add	esi, 1
767
	inc	esi
634
	mov	dl, al
-
 
635
	shr	al, 4
768
	shr	al, 4
636
	and	dl, 0xF
-
 
637
	mov	[edi], al
-
 
638
	sub	ecx, 1
-
 
639
	jz	@f
769
	jmp	@f
640
	mov	[edi+1], dl
770
.palette2_4bit.shifted:
641
	add	edi, 2
-
 
642
	sub	ecx, 1
771
	mov	al, [esi-1]
643
	jnz	@b
-
 
644
	sub	edi, 1
772
	and	al, 0xF
645
@@:
773
@@:
646
	pop	edx
-
 
647
	add	edi, 1
-
 
648
	sub	edx, 1
774
	block_byte_innerloop .palette2_4bit.extloop
649
	jnz	.palette2_4bit
775
	ja	.palette2_4bit
650
	jmp	.convert_done
776
	jmp	.convert_done
651
.palette2_2bit:
777
.palette2_2bit:
652
	sub	ebx, 1
778
	sub	ebx, 1
653
	jc	.convert_done
779
	jc	.convert_done
654
	add	esi, 1
780
	add	esi, 1
655
	sub	ebx, [.scanline_len]
781
	sub	ebx, [.scanline_len]
656
	jc	.convert_done
782
	jc	.convert_done
657
	push	edx
-
 
658
	mov	ecx, [.width]
783
	mov	ecx, [.width]
-
 
784
	sub	ecx, [.starting_col]
-
 
785
	mov	[.i], ecx
-
 
786
	mov	[.shift], 0
-
 
787
.palette2_2bit.extloop:
-
 
788
	init_block
-
 
789
	add	eax, edi
659
@@:
790
	push	eax
-
 
791
	mov	cl, [.shift]
-
 
792
	sub	cl, 2
-
 
793
	jns	.palette2_2bit.shifted
-
 
794
	mov	cl, 6
660
	mov	al, [esi]
795
	mov	al, [esi]
661
	add	esi, 1
796
	inc	esi
662
	mov	dl, al
-
 
663
	shr	al, 6
797
	shr	al, cl
664
	and	dl, not 11000000b
-
 
665
	mov	[edi], al
-
 
666
	add	edi, 1
-
 
667
	sub	ecx, 1
-
 
668
	jz	@f
798
	jmp	@f
669
	mov	al, dl
-
 
670
	shr	dl, 4
-
 
671
	and	al, not 00110000b
799
.palette2_2bit.shifted:
672
	mov	[edi], dl
-
 
673
	add	edi, 1
-
 
674
	sub	ecx, 1
-
 
675
	jz	@f
-
 
676
	mov	dl, al
800
	mov	al, [esi-1]
677
	shr	al, 2
801
	shr	al, cl
678
	and	dl, not 00001100b
-
 
679
	mov	[edi], al
-
 
680
	add	edi, 1
-
 
681
	sub	ecx, 1
-
 
682
	jz	@f
-
 
683
	mov	[edi], dl
-
 
684
	add	edi, 1
802
	and	al, 3
685
	sub	ecx, 1
-
 
686
	jnz	@b
-
 
687
@@:
803
@@:
688
	pop	edx
804
	mov	[.shift], cl
689
	sub	edx, 1
805
	block_byte_innerloop .palette2_2bit.extloop
690
	jnz	.palette2_2bit
806
	ja	.palette2_2bit
691
	jmp	.convert_done
807
	jmp	.convert_done
692
.palette2_1bit:
808
.palette2_1bit:
693
	sub	ebx, 1
809
	sub	ebx, 1
694
	jc	.convert_done
810
	jc	.convert_done
695
	add	esi, 1
811
	add	esi, 1
696
	sub	ebx, [.scanline_len]
812
	sub	ebx, [.scanline_len]
697
	jc	.convert_done
813
	jc	.convert_done
698
	push	edx
-
 
699
	mov	ecx, [.width]
814
	mov	ecx, [.width]
-
 
815
	sub	ecx, [.starting_col]
-
 
816
	mov	[.i], ecx
-
 
817
	mov	[.shift], 0
-
 
818
.palette2_1bit.extloop:
-
 
819
	init_block
-
 
820
	add	eax, edi
-
 
821
	push	eax
-
 
822
	mov	cl, [.shift]
700
@@:
823
	dec	cl
-
 
824
	jns	.palette2_1bit.shifted
-
 
825
	mov	cl, 7
701
	mov	al, [esi]
826
	mov	al, [esi]
702
	add	esi, 1
827
	inc	esi
703
repeat 3
-
 
704
	mov	dl, al
-
 
705
	shr	al, 9-%*2
828
	shr	al, cl
706
	and	dl, not (1 shl (9-%*2))
-
 
707
	mov	[edi], al
-
 
708
	add	edi, 1
-
 
709
	sub	ecx, 1
-
 
710
	jz	@f
829
	jmp	@f
711
	mov	al, dl
-
 
712
	shr	dl, 8-%*2
-
 
713
	and	al, not (1 shl (8-%*2))
830
.palette2_1bit.shifted:
714
	mov	[edi], dl
-
 
715
	add	edi, 1
-
 
716
	sub	ecx, 1
-
 
717
	jz	@f
-
 
718
end repeat
-
 
719
	mov	dl, al
831
	mov	al, [esi-1]
720
	shr	al, 1
832
	shr	al, cl
721
	and	dl, not (1 shl 1)
-
 
722
	mov	[edi], al
-
 
723
	add	edi, 1
-
 
724
	sub	ecx, 1
-
 
725
	jz	@f
-
 
726
	mov	[edi], dl
-
 
727
	add	edi, 1
833
	and	al, 1
728
	sub	ecx, 1
-
 
729
	jnz	@b
-
 
730
@@:
834
@@:
731
	pop	edx
835
	mov	[.shift], cl
732
	sub	edx, 1
836
	block_byte_innerloop .palette2_1bit.extloop
733
	jnz	.palette2_1bit
837
	ja	.palette2_1bit
734
	jmp	.convert_done
838
	jmp	.convert_done
735
.grayscale2_16bit:
839
.grayscale2_16bit:
736
	mov	ecx, [.scanline_len]
-
 
737
	sub	ebx, 1
840
	sub	ebx, 1
738
	jc	.convert_done
841
	jc	.convert_done
739
	add	esi, 1
842
	add	esi, 1
740
	sub	ebx, ecx
843
	sub	ebx, [.scanline_len]
741
	jc	.convert_done
844
	jc	.convert_done
-
 
845
	mov	ecx, [.width]
-
 
846
	sub	ecx, [.starting_col]
-
 
847
	mov	[.i], ecx
-
 
848
.grayscale2_16bit.extloop:
-
 
849
	init_block
-
 
850
	add	eax, edi
742
@@:
851
	push	eax
743
	mov	ax, [esi]
852
	mov	ax, [esi]
744
	add	esi, 2
853
	add	esi, 2
745
	convert_16_to_8
854
	convert_16_to_8
746
	mov	[edi], al
855
	block_byte_innerloop .grayscale2_16bit.extloop
747
	add	edi, 1
-
 
748
	sub	ecx, 2
-
 
749
	jnz	@b
-
 
750
	sub	edx, 1
-
 
751
	jnz	.grayscale2_16bit
856
	ja	.grayscale2_16bit
752
	jmp	.convert_done
857
	jmp	.convert_done
753
.rgb2:
858
.rgb2:
754
	cmp	[.bit_depth], 16
859
	cmp	[.bit_depth], 16
755
	jz	.rgb2_16bit
860
	jz	.rgb2_16bit
756
.rgb2.next:
861
.rgb2.next:
757
	mov	ecx, [.scanline_len]
-
 
758
	sub	ebx, 1
862
	sub	ebx, 1
759
	jc	.convert_done
863
	jc	.convert_done
760
	add	esi, 1
864
	add	esi, 1
761
	sub	ebx, ecx
865
	sub	ebx, [.scanline_len]
762
	jc	.convert_done
866
	jc	.convert_done
-
 
867
	mov	ecx, [.width]
-
 
868
	sub	ecx, [.starting_col]
-
 
869
	mov	[.i], ecx
-
 
870
.rgb2.extloop:
-
 
871
	init_block
-
 
872
	lea	eax, [eax*3]
-
 
873
	add	eax, edi
763
@@:
874
	push	eax
-
 
875
.rgb2.innloop1:
-
 
876
	push	edi
-
 
877
	mov	ecx, ebx
-
 
878
.rgb2.innloop2:
764
	mov	al, [esi+2]
879
	mov	al, [esi+2]
765
	mov	[edi], al
880
	mov	[edi], al
766
	mov	al, [esi+1]
881
	mov	al, [esi+1]
767
	mov	[edi+1], al
882
	mov	[edi+1], al
768
	mov	al, [esi]
883
	mov	al, [esi]
769
	mov	[edi+2], al
884
	mov	[edi+2], al
770
	add	esi, 3
-
 
771
	add	edi, 3
885
	add	edi, 3
772
	sub	ecx, 3
886
	dec	ecx
-
 
887
	jnz	.rgb2.innloop2
773
	jnz	@b
888
	pop	edi
-
 
889
	add	edi, [.row_distance]
-
 
890
	dec	edx
-
 
891
	jnz	.rgb2.innloop1
-
 
892
	pop	edi ebx
774
	sub	edx, 1
893
	add	esi, 3
-
 
894
	mov	eax, [.col_increment]
-
 
895
	sub	[.i], eax
-
 
896
	ja	.rgb2.extloop
-
 
897
	add	edi, [.col_distance]
-
 
898
	mov	eax, [.row_increment]
-
 
899
	sub	[.j], eax
775
	jnz	.rgb2.next
900
	ja	.rgb2.next
776
	jmp	.convert_done
901
	jmp	.convert_done
777
.rgb2_16bit:
902
.rgb2_16bit:
778
	mov	ecx, [.scanline_len]
-
 
779
	sub	ebx, 1
903
	sub	ebx, 1
780
	jc	.convert_done
904
	jc	.convert_done
781
	add	esi, 1
905
	add	esi, 1
782
	sub	ebx, ecx
906
	sub	ebx, [.scanline_len]
783
	jc	.convert_done
907
	jc	.convert_done
-
 
908
	mov	ecx, [.width]
-
 
909
	sub	ecx, [.starting_col]
-
 
910
	mov	[.i], ecx
784
.rgb2.loop:
911
.rgb2_16bit.extloop:
-
 
912
	init_block
-
 
913
	lea	eax, [eax*3]
-
 
914
	add	eax, edi
-
 
915
	push	eax
-
 
916
.rgb2_16bit.innloop1:
-
 
917
	push	edi
-
 
918
	mov	ecx, ebx
-
 
919
.rgb2_16bit.innloop2:
785
	mov	ax, [esi+4]
920
	mov	ax, [esi+4]
786
	convert_16_to_8
921
	convert_16_to_8
787
	mov	[edi], al
922
	mov	[edi], al
788
	mov	ax, [esi+2]
923
	mov	ax, [esi+2]
789
	convert_16_to_8
924
	convert_16_to_8
790
	mov	[edi+1], al
925
	mov	[edi+1], al
791
	mov	ax, [esi]
926
	mov	ax, [esi]
792
	convert_16_to_8
927
	convert_16_to_8
793
	mov	[edi+2], al
928
	mov	[edi+2], al
794
	add	esi, 6
-
 
795
	add	edi, 3
929
	add	edi, 3
-
 
930
	dec	ecx
-
 
931
	jnz	.rgb2_16bit.innloop2
-
 
932
	pop	edi
-
 
933
	add	edi, [.row_distance]
-
 
934
	dec	edx
-
 
935
	jnz	.rgb2_16bit.innloop1
-
 
936
	pop	edi ebx
796
	sub	ecx, 6
937
	add	esi, 6
-
 
938
	mov	eax, [.col_increment]
-
 
939
	sub	[.i], eax
797
	jnz	.rgb2.loop
940
	ja	.rgb2_16bit.extloop
-
 
941
	add	edi, [.col_distance]
-
 
942
	mov	eax, [.row_increment]
798
	sub	edx, 1
943
	sub	[.j], eax
799
	jnz	.rgb2_16bit
944
	ja	.rgb2_16bit
800
	jmp	.convert_done
945
	jmp	.convert_done
801
.grayscale_alpha2:
946
.grayscale_alpha2:
-
 
947
	call	.create_grayscale_palette
802
	cmp	[.bit_depth], 16
948
	cmp	[.bit_depth], 16
803
	jz	.grayscale_alpha2_16bit
949
	jz	.grayscale_alpha2_16bit
804
.grayscale_alpha2.next:
950
.grayscale_alpha2.next:
805
	mov	ecx, [.scanline_len]
-
 
806
	sub	ebx, 1
951
	sub	ebx, 1
807
	jc	.convert_done
952
	jc	.convert_done
808
	add	esi, 1
953
	add	esi, 1
809
	sub	ebx, ecx
954
	sub	ebx, [.scanline_len]
810
	jc	.convert_done
955
	jc	.convert_done
-
 
956
	mov	ecx, [.width]
-
 
957
	sub	ecx, [.starting_col]
-
 
958
	mov	[.i], ecx
-
 
959
.grayscale_alpha2.extloop:
-
 
960
	init_block
-
 
961
	add	eax, edi
811
@@:
962
	push	eax
812
	mov	al, [esi]
963
	mov	al, [esi]
813
	mov	[edi], al
-
 
814
	add	esi, 2
964
	add	esi, 2
815
	add	edi, 1
-
 
816
	sub	ecx, 2
965
	block_byte_innerloop .grayscale_alpha2.extloop
817
	jnz	@b
-
 
818
	sub	edx, 1
-
 
819
	jnz	.grayscale_alpha2.next
966
	ja	.grayscale_alpha2.next
820
	jmp	.convert_done
967
	jmp	.convert_done
821
.grayscale_alpha2_16bit:
968
.grayscale_alpha2_16bit:
822
	mov	ecx, [.scanline_len]
-
 
823
	sub	ebx, 1
969
	sub	ebx, 1
824
	jc	.convert_done
970
	jc	.convert_done
825
	add	esi, 1
971
	add	esi, 1
826
	sub	ebx, ecx
972
	sub	ebx, [.scanline_len]
827
	jc	.convert_done
973
	jc	.convert_done
-
 
974
	mov	ecx, [.width]
-
 
975
	sub	ecx, [.starting_col]
-
 
976
	mov	[.i], ecx
-
 
977
.grayscale_alpha2_16bit.extloop:
-
 
978
	init_block
-
 
979
	add	eax, edi
828
@@:
980
	push	eax
829
	mov	ax, [esi]
981
	mov	ax, [esi]
830
	add	esi, 4
982
	add	esi, 4
831
	convert_16_to_8
983
	convert_16_to_8
832
	mov	[edi], al
984
	block_byte_innerloop .grayscale_alpha2_16bit.extloop
833
	add	edi, 1
-
 
834
	sub	ecx, 4
-
 
835
	jnz	@b
-
 
836
	sub	edx, 1
-
 
837
	jnz	.grayscale_alpha2_16bit
985
	ja	.grayscale_alpha2_16bit
838
.convert_done:
986
.convert_done:
-
 
987
; next interlace pass
-
 
988
.deinterlace_next:
-
 
989
	mov	eax, [.block_width]
-
 
990
	cmp	eax, [.block_height]
-
 
991
	jz	.deinterlace_dec_width
-
 
992
	mov	[.block_height], eax
-
 
993
	mov	[.col_increment], eax
-
 
994
	dec	[.col_increment_shift]
-
 
995
	mov	[.starting_row], eax
-
 
996
	and	[.starting_col], 0
-
 
997
	jmp	.deinterlace_loop
-
 
998
.deinterlace_dec_width:
839
	pop	ecx
999
	shr	eax, 1
-
 
1000
	jz	.deinterlace_done
-
 
1001
	mov	[.block_width], eax
-
 
1002
	mov	[.starting_col], eax
-
 
1003
	add	eax, eax
-
 
1004
	and	[.starting_row], 0
-
 
1005
	mov	[.row_increment], eax
-
 
1006
	bsf	eax, eax
-
 
1007
	mov	[.row_increment_shift], al
-
 
1008
	jmp	.deinterlace_loop
-
 
1009
.deinterlace_done:
840
	mcall	68, 13
1010
	mcall	68, 13, [.allocated]
841
	mov	esi, [.cur_chunk_ptr]
1011
	mov	esi, [.cur_chunk_ptr]
842
	add	esi, [.cur_chunk_size]
1012
	add	esi, [.cur_chunk_size]
843
	push	[.length]
1013
	push	[.length]
844
	jmp	.next_chunk
1014
	jmp	.next_chunk
Line 871... Line 1041...
871
	mov	[.cur_chunk_size], edx
1041
	mov	[.cur_chunk_size], edx
872
	mov	[.cur_chunk_ptr], esi
1042
	mov	[.cur_chunk_ptr], esi
873
	mov	[.length], ecx
1043
	mov	[.length], ecx
874
.deflate_callback.ret:
1044
.deflate_callback.ret:
875
	ret	8
1045
	ret	8
-
 
1046
 
-
 
1047
.create_grayscale_palette:
-
 
1048
	push	edi edx
-
 
1049
	mov	edi, [eax + Image.Palette]
-
 
1050
	mov	ecx, [.bit_depth]
-
 
1051
	cmp	cl, 16
-
 
1052
	jnz	@f
-
 
1053
	mov	cl, 8
-
 
1054
@@:
-
 
1055
	push	1
-
 
1056
	pop	eax
-
 
1057
	shl	eax, cl
-
 
1058
	xchg	eax, ecx
-
 
1059
	mov	edx, 0x010101
-
 
1060
	cmp	al, 8
-
 
1061
	jz	.graypal_common
-
 
1062
	mov	edx, 0x111111
-
 
1063
	cmp	al, 4
-
 
1064
	jz	.graypal_common
-
 
1065
	mov	edx, 0x555555
-
 
1066
	cmp	al, 2
-
 
1067
	jz	.graypal_common
-
 
1068
	mov	edx, 0xFFFFFF
-
 
1069
.graypal_common:
-
 
1070
	xor	eax, eax
-
 
1071
@@:
-
 
1072
	stosd
-
 
1073
	add	eax, edx
-
 
1074
	loop	@b
-
 
1075
	pop	edx edi
-
 
1076
	ret
876
;endp
1077
;endp
Line 877... Line 1078...
877
 
1078
 
878
img.encode.png:
1079
img.encode.png:
879
	xor	eax, eax
1080
	xor	eax, eax