mainwin 40 15
' G4 Compression calling libtiff3.dll, by Pablo Nieto (Editorial Sísifo)
' Matches the well-known CCITTFaxDecode April 2007
' Also known as Huffman MMR
' Warning: runnig this program a second time inside the same instance
' of Liberty Basic gives "Run-time error! ... abnormal program termination"
' Keep one mainwin running to avoid this.
' The problem is related to msvcrt.dll, called by libtiff3.dll:
' it keeps track of some pointers in memory.
' This program runs under W98. Others not tested
ceros$="": for i=0 to 23: ceros$=ceros$+chr$(0): next
OPEN "kernel32.dll" for dll as #kernel
OPEN "libtiff3.dll" for dll as #tiff
' codec struct embedded in tiff struct for easier debugging
struct tiff, unused0 as char[460], codec as char[8], _
rowbytes as long, rowpixels as long, _
unused1 as char[12], codecptr as long, _
unused2 as char[8], streamstart as long, _
bignum as long, curstreamptr as long, _
rawcc as long, acumbits as long, pendbits as long, _
unused3 as char[16], unusedwrite as long, _
unusedseek as long, ptr2refline as long, _
ptr2origin as long, ptr2stream as long, _
xyz as char[4], _
refline as char[24], origin as char[24], stream as char[24]
OPEN "memor.dll" for dll as #memor
CALLDLL #memor, "VarPtr", tiff as ptr, tifptr as ulong
'proc VarPtr (in memor.dll)
' mov eax, [esp+4] ; dereference the given dword pointer
' ret 4 ; return the result
' Inaccessible functions in libtiff because they lack entry point
absol=hexdec("6fd8edf0") 'fax4encode ,3,0
'absol=hexdec("6fd90120") 'fax3dencode2drow ref, 24
calldll #memor,"Peek4",absol as ulong, resu as ulong
'proc Peek4 (in memor.dll)
' mov ecx,[esp+4] ; ecx := addr from
' mov eax,[ecx] ; eax := DWORD
' ret 4
code$=dechex$(resu)
' Check code contents in libtiff
print "Code in libtiff3.dll : ";code$ ' 53565755 =OK reverso
'OPEN "libtiff3.dll" for dll as #tiff
if code$<>"53565755" then print "Version mismatch" : goto [fin]
tiff.codecptr.struct=tifptr+460
tiff.rowbytes.struct=3
tiff.rowpixels.struct=24
tiff.pendbits.struct=8
tiff.acumbits.struct=0
tiff.bignum.struct=hexdec("888888")
tiff.rawcc.struct=0
tiff.ptr2refline.struct=tifptr+564 'pointer to refline start
tiff.ptr2origin.struct=tifptr+564+24 '+refline length
tiff.ptr2stream.struct=tifptr+564+24+24 '++origin length
tiff.streamstart.struct=tifptr+564+24+24
tiff.curstreamptr.struct=tifptr+564+24+24
tiff.stream.struct=space$(24)+chr$(0)+chr$(0)+chr$(0)
tiff.origin.struct="f0"+chr$(15)+"@qà"
' Typical example in Internet for CCITTFax4Encode
' binary input: 0110 0110 0011 0000 0000 1111 row 1
' 0100 0000 0111 0000 1110 0000 row 2
print "ASCII equivalent of binary input: ";tiff.origin.struct
print "tiff-codec struct BEFORE encoding:" : gosub [codec]
tiff.refline.struct=ceros$ : todo=6 : ori=tifptr+588
gosub [getg4] ' keep the sub there, don't place here its contents
if resu=1 then print "Encoding OK"
print "tiff-codec struct AFTER encoding:" : gosub [codec]
stream$=tiff.stream.struct : coded=tiff.rawcc.struct
pend=tiff.pendbits.struct : stream$=left$(stream$,coded)
if pend<>8 then stream$=stream$+chr$(tiff.acumbits.struct) : coded=coded+1
print "ascii stream=";stream$
print "hex stream=";
for i=1 to coded : print dechex$(asc(mid$(stream$,i,1)));" "; : next
eol$=mid$("00 20 0200 40 0400 80 0801 00 1002 00 2004 00 4008 00 8000 10 01",pend*8-7,8)
acu=tiff.acumbits.struct : pend=tiff.pendbits.struct
print: print " EOLs: ";eol$
[fin]
print "finished"
close #memor
close #kernel
close #tiff
end
[codec]
restore 100
for i=0 to 43
if i mod 4 = 0 then print : read expl$ : print expl$
desde=tifptr+i*4+460
CALLDLL #memor, "Peek4", desde as ulong, resu as ulong
re1$=dechex$(resu):le$=right$("0000000",8-len(re1$))
res$=le$+re1$
print res$;" ";
next
print
return
100
data " rowbytes rowpixels"
data " codecptr"
data " streamstart bignum"
data "streamend streamlen acumbits pendbits"
data ""
data " ptr2refline ptr2origin"
data "ptr2stream r-e-f-l-i-n-e"
data " 0-0-0"
data "origin"
data " s-t-r-e-a-m"
data ""
data ""
data ""
[getg4]
calldll #memor,"CallAbs", absol as ulong, tifptr as ulong, _
ori as ulong, todo as ulong, 0 as ulong, resu as ulong
return
'proc CallAbs ; calls external binary sub ended with RET
' pop eax ; provided that the stack reverts unchanged
' xchg eax,[esp] ; and register ebp must return unchanged
' push eax ; exchanges the values of the 2 latest in the stack
' ret (in memor.dll)
' PRINTOUT IN MAINWIN :
'code in libtiff3.dll : 53565755
'ASCII equivalent of binary input: f0@qà
' if you remove this sub, the struct gets spurious garbage
'codec ascii=
'codecptr 14959196 E4425C
'rowb,px 3 24
'tiff-codec struct BEFORE encoding:
'
' rowbytes rowpixels
'00000000 00000000 00000003 00000018
' codecptr
'00000000 00000000 00000000 00E4425C
' streamstart bignum
'00000000 00000000 00E442F4 00888888
'streamend streamlen acumbits pendbits
'00E442F4 00000000 00000000 00000008
'
'00000000 00000000 00000000 00000000
' ptr2refline ptr2origin
'00000000 00000000 00E442C6 00E442DC
'ptr2stream r-e-f-l-i-n-e
'00E442F4 00000000 00000000 00000000
' 0-0-0
'00000000 00000000 00000000 00000000
'origin
'400F3066 0000E071 00000000 00000000
' s-t-r-e-a-m
'00000000 00000000 20202020 20202020
'
'20202020 20202020 20202020 00202020
'Encoding OK
'tiff-codec struct AFTER encoding:
'
' rowbytes rowpixels
'00000000 00000000 00000003 00000018
' codecptr
'00000000 00000000 00000000 00E4425C
' streamstart bignum
'00000000 00000000 00E442F4 00888888
'streamend streamlen acumbits pendbits
'00E442FD 00000009 0000006E 00000001
'
'00000000 00000000 00000000 00000000
' ptr2refline ptr2origin
'00000000 00000000 00E442C6 00E442DC
'ptr2stream r-e-f-l-i-n-e
'00E442F4 00000000 71400000 000000E0
' 0-0-0
'00000000 00000000 00000000 00000000
'origin
'400F3066 0000E071 00000000 00000000
' s-t-r-e-a-m
'00000000 00000000 19F3E523 0C53A19B
'
'202020E0 20202020 20202020 00202020
'ascii stream=#åó›¡Sàn
'hex stream=23 E5 F3 19 9B A1 53 C E0 6E
' EOLs: 00 20 02
'finished
Pagina principal