RIFFReader.st
changeset 525 59e97643a8bc
child 526 263d3775d846
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RIFFReader.st	Mon Apr 14 13:59:34 1997 +0200
@@ -0,0 +1,170 @@
+'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!