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 |