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