'From Smalltalk/X, Version:3.1.5 on 11-apr-1997 at 6:49:46 pm' !
ImageReader subclass:#RIFFReader
instanceVariableNames:'chunkSize streamTypes'
classVariableNames:'UnsupportedFormatErrorSignal'
poolDictionaries:''
category:'Graphics-Images-Support'
!
!RIFFReader class methodsFor:'documentation'!
documentation
"
Helper to read RIFF files.
"
! !
!RIFFReader class methodsFor:'class initialization'!
initialize
UnsupportedFormatErrorSignal isNil ifTrue:[
UnsupportedFormatErrorSignal := ErrorSignal newSignalMayProceed:true.
UnsupportedFormatErrorSignal nameClass:self message:#unsupportedFormatErrorSignal.
].
"
RIFFReader initialize
"
"Created: 4.4.1997 / 22:35:52 / cg"
"Modified: 5.4.1997 / 16:12:16 / cg"
! !
!RIFFReader class methodsFor:'testing'!
isRIFFFile:aFileName
"return true, if aFileName contains RIFF-encoded data"
|data1 inStream|
inStream := self streamReadingFile:aFileName.
inStream isNil ifTrue:[^ false].
inStream binary.
data1 := String new:4.
inStream nextBytes:4 into:data1.
inStream close.
^ (data1 = 'RIFF')
"
RIFFReader isRIFFFile:'bitmaps/magtape.xpm'
RIFFReader isRIFFFile:'/home2/pd_stuff/movies/avi/drlair.avi'
"
"Created: 4.4.1997 / 22:35:52 / cg"
"Modified: 5.4.1997 / 16:12:16 / cg"
! !
!RIFFReader methodsFor:'reading from stream'!
getChunk
"get a single chunk"
|id s sel streamNr streamType|
'getChunk -> ' infoPrint.
id := ' '.
inStream nextBytes:4 into:id startingAt:1.
chunkSize := inStream nextLongMSB:false.
(id at:4) == Character space ifTrue:[
id := id copyTo:3
].
(id at:1) isDigit ifTrue:[
streamNr := Number readFrom:(id copyTo:2).
streamType := streamTypes at:(streamNr + 1).
s := 'getChunk_' , streamType , '_' , (id copyFrom:3).
] ifFalse:[
s := 'getChunk_' , id.
].
sel := s asSymbolIfInterned.
(sel isNil or:[(self respondsTo:sel) not]) ifTrue:[
'[' infoPrint. s infoPrint. '] ' infoPrint.
sel := #'getChunk_Unknown'
].
self perform:sel.
'' infoPrintCR.
"Created: 5.4.1997 / 16:29:40 / cg"
"Modified: 11.4.1997 / 14:00:42 / cg"
!
getChunk_LIST
"process a LIST chunk"
'getChunk_LIST' infoPrint.
inStream skip:4.
"
AVIReader fromFile:'/home2/pd_stuff/movies/avi/hangldm.avi'
"
"Created: 4.4.1997 / 23:18:33 / cg"
"Modified: 5.4.1997 / 16:12:16 / cg"
!
getChunk_RIFF
"process a RIFF chunk"
'getChunk_RIFF' infoPrint.
inStream skip:4.
"
AVIReader fromFile:'/home2/pd_stuff/movies/avi/hangldm.avi'
"
"Created: 4.4.1997 / 23:18:08 / cg"
"Modified: 5.4.1997 / 16:12:16 / cg"
!
getChunk_Unknown
"ignore any other chunk"
'getChunk_Unknown -> ' infoPrint.
self skipChunk
"
AVIReader fromFile:'/home2/pd_stuff/movies/avi/hangldm.avi'
"
"Created: 5.4.1997 / 00:03:43 / cg"
"Modified: 5.4.1997 / 16:12:16 / cg"
!
skipChunk
"skip a chunk"
|sz|
'skipChunk' infoPrint.
sz := chunkSize.
(sz bitTest:1) ifTrue:[
sz := sz + 1
].
inStream skip:sz.
"
AVIReader fromFile:'/home2/pd_stuff/movies/avi/hangldm.avi'
"
"Created: 5.4.1997 / 14:13:43 / cg"
"Modified: 5.4.1997 / 16:12:16 / cg"
! !
!RIFFReader class methodsFor:'documentation'!
version
^ '$Header: /cvs/stx/stx/libview2/RIFFReader.st,v 1.1 1997-04-14 11:59:34 cg Exp $'
! !
RIFFReader initialize!