36,13 → 36,13 |
|
mov edi, [_data] |
|
cmp [edi + pcx_header.magic_number], 10 |
cmp byte[edi + pcx_header.magic_number], 0x0A |
jne .is_not_pcx |
cmp [edi + pcx_header.version], 5 |
cmp byte[edi + pcx_header.version], 5 |
jne .is_not_pcx |
cmp [edi + pcx_header.encoding], 1 |
cmp byte[edi + pcx_header.encoding], 1 |
jne .is_not_pcx |
cmp [edi + pcx_header.reserved], 0 |
cmp byte[edi + pcx_header.reserved], 0 |
jne .is_not_pcx |
|
add edi, pcx_header.filler |
74,9 → 74,9 |
;;================================================================================================;; |
locals |
nplanes rd 1 |
xsize rw 1 |
ysize rw 1 |
bpl rw 1 |
xsize rd 1 |
ysize rd 1 |
bpl rd 1 |
total_bpl rd 1 |
line_begin rd 1 |
retvalue rd 1 ; 0 (error) or pointer to image |
87,25 → 87,21 |
mov esi, [_data] |
movzx eax, byte[esi + pcx_header.nplanes] |
mov [nplanes], eax |
mov bx, word[esi + pcx_header.bpl] |
mov [bpl], bx |
mul bx |
shl eax, 16 |
mov ax, dx |
ror eax, 16 |
movzx ebx, word[esi + pcx_header.bpl] |
mov [bpl], ebx |
imul eax, ebx |
mov [total_bpl], eax |
|
movzx eax, word[esi + pcx_header.xmax] |
inc ax |
sub ax, word[esi + pcx_header.xmin] |
mov [xsize], ax |
inc eax |
mov [xsize], eax |
|
movzx ebx, word[esi + pcx_header.ymax] |
inc bx |
sub bx, word[esi + pcx_header.ymin] |
mov [ysize], bx |
inc ebx |
mov [ysize], ebx |
|
|
cmp [esi + pcx_header.bpp], 1 |
jz .monochrome |
cmp byte[esi + pcx_header.nplanes], 3 |
112,7 → 108,7 |
jnz .indexed |
|
|
._24bit: |
.24bit: |
|
stdcall img.create, eax, ebx, Image.bpp24 |
mov [retvalue], eax |
119,53 → 115,45 |
test eax, eax |
jz .quit |
|
movzx ebx, [xsize] |
movzx ecx, [ysize] |
mov edx, [eax+Image.Data] |
|
rol ebx, 16 |
or ebx, ecx |
xor ebx, [edx] |
mov [eax + Image.Checksum], ebx |
|
|
mov esi, [_data] |
add esi, 128 |
; mov edi, [retvalue] |
add esi, 128 ; skip header |
mov edi, [eax + Image.Data] |
add edi, 2 |
mov [line_begin], edi |
|
.24bit.scanline: |
mov ebx, [total_bpl] |
|
._24bit.begin: |
mov ax, word[bpl] |
._24bit.decode: |
.24bit.color_line: |
mov edx, [bpl] |
.24bit.next_byte: |
call pcx._.get_byte |
._24bit.write_sequence: |
mov [edi], dl |
dec ax |
sub edx, ecx |
@@: |
mov [edi], al |
add edi, [nplanes] |
dec dh |
jnz ._24bit.write_sequence |
dec ecx |
jnz @b |
|
test ax, ax |
jz ._24bit.end_color_line |
jmp ._24bit.decode |
test edx, edx |
jnz .24bit.next_byte |
|
._24bit.end_color_line: |
.24bit.end_color_line: |
test ebx, ebx |
jz ._24bit.end_full_line |
jz .24bit.end_full_line |
dec [line_begin] |
mov edi, [line_begin] |
jmp ._24bit.begin |
jmp .24bit.color_line |
|
._24bit.end_full_line: |
dec word[ysize] |
.24bit.end_full_line: |
dec [ysize] |
jz .quit |
mov ebx, [total_bpl] |
add edi, 2 |
bt [xsize], 0 |
jnc @f |
sub edi, 3 |
@@: |
mov [line_begin], edi |
jmp ._24bit.begin |
jmp .24bit.scanline |
|
|
.indexed: |
175,56 → 163,42 |
test eax, eax |
jz .quit |
|
movzx ebx, [xsize] |
movzx ecx, [ysize] |
mov edx, [eax + Image.Data] |
|
rol ebx, 16 |
or ebx, ecx |
xor ebx, [edx] |
mov [eax + Image.Checksum], ebx |
|
mov ebx, eax |
mov esi, [_data] |
add esi, [_length] |
sub esi, 768 |
mov edi, [eax + Image.Palette] |
mov cx, 256 |
mov ecx, 256 |
xor eax, eax |
@@: |
mov ebx, [esi] |
bswap ebx |
shr ebx, 8 |
mov [edi], ebx |
add edi, 4 |
add esi, 3 |
dec cx |
lodsw |
xchg al, ah |
shl eax, 8 |
lodsb |
stosd |
dec ecx |
jnz @b |
|
mov esi, [_data] |
add esi, 128 |
; mov edi, [retvalue] |
mov edi, [eax + Image.Data] |
mov edi, [ebx + Image.Data] |
|
.indexed.begin: |
mov ax, word[bpl] |
.indexed.decode: |
.indexed.line: |
mov ebx, [total_bpl] |
.indexed.next_byte: |
call pcx._.get_byte |
.indexed.write_sequence: |
mov [edi], dl |
inc edi |
dec ax |
dec dh |
jnz .indexed.write_sequence |
@@: |
stosb |
dec ecx |
jnz @b |
test ebx, ebx |
jnz .indexed.next_byte |
|
test ax, ax |
jz .indexed.end_line |
jmp .indexed.decode |
dec [ysize] |
jnz .indexed.line |
jmp .quit |
|
.indexed.end_line: |
dec word[ysize] |
jz .quit |
jmp .indexed.begin |
|
|
.monochrome: |
|
stdcall img.create, eax, ebx, Image.bpp1 |
232,50 → 206,28 |
test eax, eax |
jz .quit |
|
movzx ebx, [xsize] |
movzx ecx, [ysize] |
mov edx, [eax + Image.Data] |
|
rol ebx, 16 |
or ebx, ecx |
xor ebx, [edx] |
mov [eax + Image.Checksum], ebx |
|
mov edi, [eax + Image.Palette] |
mov [edi], dword 0x00000000 |
mov [edi + 4], dword 0x00ffffff |
mov [edi], dword 0xff000000 |
mov [edi + 4], dword 0xffffffff |
|
mov esi, [_data] |
add esi, 128 |
; mov edi, [retvalue] |
mov edi, [eax + Image.Data] |
|
|
.monochrome.begin: |
.monochrome.line: |
mov ebx, [total_bpl] |
mov ax, [xsize] |
|
.monochrome.decode: |
.monochrome.next_byte: |
call pcx._.get_byte |
.monochrome.write_sequence: |
mov [edi], dl |
inc edi |
cmp ax, 8 |
jng .monochrome.is_last_byte_in_line |
sub ax, 8 |
dec dh |
jnz .monochrome.write_sequence |
jmp .monochrome.decode |
|
.monochrome.is_last_byte_in_line: |
@@: |
stosb |
dec ecx |
jnz @b |
test ebx, ebx |
jng @f |
call pcx._.get_byte |
jmp .monochrome.is_last_byte_in_line |
@@: |
dec word[ysize] |
jnz .monochrome.begin |
jmp .quit |
jnz .monochrome.next_byte |
dec [ysize] |
jnz .monochrome.line |
; jmp .quit |
|
|
.quit: |
309,19 → 261,15 |
;;================================================================================================;; |
proc pcx._.get_byte |
|
mov dh, byte[esi] |
inc esi |
cmp dh, 0xC0 |
jnb .cycle1 |
mov dl, dh |
mov dh, 1 |
jmp .exit1 |
.cycle1: |
and dh, 0x3F |
mov dl, byte[esi] |
inc esi |
.exit1: |
movzx ecx, dh |
xor ecx, ecx |
lodsb |
cmp al, 0xC0 |
setb cl |
jb .done |
and al, 0x3F |
mov cl, al |
lodsb |
.done: |
sub ebx, ecx |
ret |
endp |