Esempio n. 1
0
 function parseContent($tagCode, $content, $opts = array())
 {
     $reader = new IO_Bit();
     $reader->input($content);
     $this->_CharacterID = $reader->getUI16LE();
     $bitmapFormat = $reader->getUI8();
     $this->_BitmapFormat = $bitmapFormat;
     $this->_BitmapWidth = $reader->getUI16LE();
     $this->_BitmapHeight = $reader->getUI16LE();
     if ($bitmapFormat == 3) {
         $this->_BitmapColorTableSize = $reader->getUI8() + 1;
     }
     $this->_ZlibBitmapData = $reader->getDataUntil(false);
 }
Esempio n. 2
0
 function parseContent($tagCode, $content, $opts = array())
 {
     $reader = new IO_Bit();
     $reader->input($content);
     $this->_buttonId = $reader->getUI16LE();
     $opts['tagCode'] = $tagCode;
     if ($tagCode == 34) {
         // DefineButton2
         $this->_reservedFlags = $reader->getUIBits(7);
         $this->_trackAsMenu = $reader->getUIBit();
         list($offset_actionOffset, $dummy) = $reader->getOffset();
         $this->_actionOffset = $reader->getUI16LE();
     }
     $characters = array();
     while ($reader->getUI8() != 0) {
         $reader->incrementOffset(-1, 0);
         // 1 byte back
         $characters[] = IO_SWF_Type_BUTTONRECORD::parse($reader, $opts);
     }
     $this->_characters = $characters;
     if ($tagCode == 34) {
         // DefineButton2
         // TODO: skip ActionOffset - CurrentOffsetUntilCharactersField
         $actions = array();
         if ($this->_actionOffset > 0) {
             list($offset_buttonCondition, $dummy) = $reader->getOffset();
             if ($offset_actionOffset + $this->_actionOffset != $offset_buttonCondition) {
                 // TODO: warning
                 $reader->setOffset($offset_actionOffset + $this->_actionOffset, 0);
             }
             while (true) {
                 $action = IO_SWF_Type_BUTTONCONDACTION::parse($reader, $opts);
                 $actions[] = $action;
                 if ($action['CondActionSize'] == 0) {
                     break;
                     // last action
                 }
             }
             $this->_actions = $actions;
         } else {
             $this->_actions = null;
         }
     } else {
         $actions = array();
         while ($reader->getUI8() != 0) {
             $reader->incrementOffset(-1, 0);
             // 1 byte back
             $actions[] = IO_SWF_Type_Action::parse($reader);
         }
         $this->_actions = $actions;
     }
     return true;
 }
Esempio n. 3
0
 function _form_26($tag)
 {
     // PlaceObject2
     $reader = new IO_Bit();
     $reader->input($tab['Content']);
     $placeFlag = $reader->getUI8();
     $depth = $reader->getUI16LE();
     if ($placeFlag & 0x2) {
         $characterId = $reader->getUI16LE();
     }
     //
 }
Esempio n. 4
0
File: SWF.php Progetto: yoya/IO_SWF
 function parse($swfdata)
 {
     $reader = new IO_Bit();
     $reader->input($swfdata);
     $this->_swfdata = $swfdata;
     /* SWF Header */
     $this->_headers['Signature'] = $reader->getData(3);
     $this->_headers['Version'] = $reader->getUI8();
     $this->_headers['FileLength'] = $reader->getUI32LE();
     if ($this->_headers['Signature'][0] == 'C') {
         // CWS の場合、FileLength の後ろが zlib 圧縮されている
         $uncompressed_data = gzuncompress(substr($swfdata, 8));
         if ($uncompressed_data === false) {
             return false;
         }
         list($byte_offset, $dummy) = $reader->getOffset();
         $reader->setOffset(0, 0);
         $swfdata = $reader->getData($byte_offset) . $uncompressed_data;
         $reader = new IO_Bit();
         $reader->input($swfdata);
         $this->_swfdata = $swfdata;
         $reader->setOffset($byte_offset, 0);
     }
     /* SWF Movie Header */
     $this->_headers['FrameSize'] = IO_SWF_Type_RECT::parse($reader);
     $reader->byteAlign();
     $this->_headers['FrameRate'] = $reader->getUI16LE();
     $this->_headers['FrameCount'] = $reader->getUI16LE();
     list($this->_header_size, $dummy) = $reader->getOffset();
     /* SWF Tags */
     while (true) {
         $swfInfo = array('Version' => $this->_headers['Version']);
         $tag = new IO_SWF_Tag($swfInfo);
         $tag->parse($reader);
         $this->_tags[] = $tag;
         if ($tag->code == 0) {
             // END Tag
             break;
         }
     }
     return true;
 }
Esempio n. 5
0
File: JPEG.php Progetto: yoya/IO_SWF
 function _splitChunk($eoiFinish = true, $sosScan = true)
 {
     $bitin = new IO_Bit();
     $bitin->input($this->_jpegdata);
     while ($bitin->hasNextData()) {
         $marker1 = $bitin->getUI8();
         if ($marker1 != 0xff) {
             fprintf(STDERR, "dumpChunk: marker1=0x%02X", $marker1);
             return false;
         }
         $marker2 = $bitin->getUI8();
         switch ($marker2) {
             case 0xd8:
                 // SOI (Start of Image)
                 $this->_jpegChunk[] = array('marker' => $marker2, 'data' => null, 'length' => null);
                 continue;
             case 0xd9:
                 // EOI (End of Image)
                 $this->_jpegChunk[] = array('marker' => $marker2, 'data' => null, 'length' => null);
                 if ($eoiFinish) {
                     break 2;
                     // while break;
                 }
                 continue;
             case 0xda:
                 // SOS
                 if ($sosScan === false) {
                     $remainData = $bitin->getDataUntil(false);
                     $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $remainData, 'length' => null);
                     break 2;
                     // while break;
                 }
             case 0xd0:
             case 0xd1:
             case 0xd2:
             case 0xd3:
                 // RST
             // RST
             case 0xd4:
             case 0xd5:
             case 0xd6:
             case 0xd7:
                 // RST
                 list($chunk_data_offset, $dummy) = $bitin->getOffset();
                 while (true) {
                     $next_marker1 = $bitin->getUI8();
                     if ($next_marker1 != 0xff) {
                         continue;
                     }
                     $next_marker2 = $bitin->getUI8();
                     if ($next_marker2 == 0x0) {
                         continue;
                     }
                     $bitin->incrementOffset(-2, 0);
                     // back from next marker
                     list($next_chunk_offset, $dummy) = $bitin->getOffset();
                     $length = $next_chunk_offset - $chunk_data_offset;
                     $bitin->setOffset($chunk_data_offset, 0);
                     $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $bitin->getData($length), 'length' => null);
                     break;
                 }
                 break;
             default:
                 $length = $bitin->getUI16BE();
                 $this->_jpegChunk[] = array('marker' => $marker2, 'data' => $bitin->getData($length - 2), 'length' => $length);
                 continue;
         }
     }
 }
Esempio n. 6
0
File: MFi.php Progetto: yoya/IO_MFi
 function parse($mfidata)
 {
     $reader = new IO_Bit();
     $reader->input($mfidata);
     // Header Part
     $identifier = $reader->getData(4);
     if ($identifier != 'melo') {
         throw new Exception('Identifer($identifier) is not melo');
     }
     $this->headers['Identifier'] = $identifier;
     $fileLength = $reader->getUI32BE();
     $realFileLength = strlen($mfidata);
     if ($fileLength != $realFileLength - 8) {
         throw new Exception("FileLength({$fileLength}) is not real FileLength({$realFileLength}) - 8");
     }
     $this->headers['FileLength'] = $fileLength;
     $offsetToTrack = $reader->getUI16BE();
     $this->headers['OffsetToTrack'] = $offsetToTrack;
     $this->headers['DataTypeMajor'] = $reader->getUI8();
     $this->headers['DataTypeMinor'] = $reader->getUI8();
     $this->headers['NumberOfTrack'] = $reader->getUI8();
     // Data Information Part
     $reader_di = new IO_Bit();
     $reader_di->input($reader->getData($offsetToTrack - 3));
     $note_message_length_info = 0;
     while ($reader_di->hasNextData(6)) {
         $info = array();
         $identifer = $reader_di->getData(4);
         $length = $reader_di->getUI16BE();
         $info['Identifer'] = $identifer;
         $info['Length'] = $length;
         switch ($identifer) {
             case 'titl':
             case 'copy':
             case 'prot':
             case 'date':
                 $data = $reader_di->getData($length);
                 break;
             case 'sorc':
                 $data = $reader_di->getUI8($length);
                 break;
             case 'note':
             case 'exst':
                 $data = $reader_di->getUI16BE($length);
                 if ($identifer == 'note') {
                     $note_message_length_info = $data;
                 }
                 break;
             case 'vers':
                 $data = $reader_di->getUI32BE($length);
                 break;
         }
         $info['Data'] = $data;
         $this->datainfos[] = $info;
     }
     // Track Part
     while ($reader->hasNextData(8)) {
         $track = array();
         $track['Identifer'] = $reader->getData(4);
         $length = $reader->getUI32BE();
         $track['Length'] = $length;
         $reader_ev = new IO_Bit();
         $reader_ev->input($reader->getData($length));
         $track['Events'] = array();
         while ($reader_ev->hasNextData(3)) {
             $event = array();
             $event['DeltaTime'] = $reader_ev->getUI8();
             $statusInfo = $reader_ev->getUI8();
             $event['StatusInfo'] = $statusInfo;
             switch ($statusInfo) {
                 default:
                     $event['Data'] = $reader_ev->getUI8();
                     if ($note_message_length_info == 1) {
                         // MFi2
                         $event['Data2'] = $reader_ev->getUI8();
                     }
                     break;
                 case 0xff:
                     $statusInfo2 = $reader_ev->getUI8();
                     $event['StatusInfo2'] = $statusInfo2;
                     switch ($statusInfo2) {
                         default:
                             $event['Data'] = $reader_ev->getUI8();
                             break;
                         case 0xf0:
                         case 0xf1:
                         case 0xff:
                             $length = $reader_ev->getUI16BE();
                             $event['Length'] = $length;
                             $event['Data'] = $reader_ev->getData($length);
                             break;
                     }
             }
             $track['Events'][] = $event;
         }
         $this->tracks[] = $track;
     }
 }
Esempio n. 7
0
 function parseDataChunks(&$reader)
 {
     $chunks = array();
     while ($reader->hasNextData(8)) {
         $chunk = array();
         $chunkID = $reader->getData(4);
         $size = $reader->getUI32BE();
         $chunk['ID'] = $chunkID;
         $chunkID_3byte = substr($chunkID, 0, 3);
         $chunkID_4th_value = ord($chunkID[3]);
         switch ($chunkID_3byte) {
             case 'Dch':
                 $chunk['ID'] = $chunkID_3byte;
                 $chunk['CodeType'] = $chunkID_4th_value;
                 break;
             case 'MTR':
             case 'ATR':
             case 'GTR':
                 $chunk['ID'] = $chunkID_3byte;
                 $chunk['TrackNumber'] = $chunkID_4th_value;
                 break;
         }
         $chunk['Size'] = $size;
         switch (substr($chunkID, 0, 3)) {
             case 'CNT':
                 // CNTI: Contents Information Chunk
                 $chunk['Contents Class'] = $reader->getUI8();
                 $chunk['Contents Type'] = $reader->getUI8();
                 $chunk['Contents Code Type'] = $reader->getUI8();
                 $chunk['Copy Status'] = $reader->getUI8();
                 $chunk['Copy Counts'] = $reader->getUI8();
                 if ($size > 5) {
                     $chunk['Option'] = $reader->getData($size - 5);
                 }
                 break;
             case 'MTR':
                 // MTR*: Score Track Chunk
                 $chunk['Format Type'] = $reader->getUI8();
                 $chunk['Sequence Type'] = $reader->getUI8();
                 $chunk['Timebase D'] = $reader->getUI8();
                 $chunk['Timebase G'] = $reader->getUI8();
                 $chunk['Channnel Status'] = $reader->getUI16BE();
                 $data = $reader->getData($size - 6);
                 $reader_chunkdata = new IO_Bit();
                 $reader_chunkdata->input($data);
                 $this->seekToAlphabet($reader_chunkdata);
                 $chunk[$structure_type] = $this->parseDataChunks($reader_chunkdata);
                 break;
             case 'Mts':
                 // Mtsu, Mtsq, Mts
                 $data = $reader->getData($size);
                 $reader_tracks = new IO_Bit();
                 $reader_tracks->input($data);
                 switch ($chunkID) {
                     case 'Mtsu':
                         // Score Track Setup Data
                     // Score Track Setup Data
                     case 'Mtsq':
                         // Score Track Sequence Data
                         $tracks = array();
                         while ($reader_tracks->hasNextData(4)) {
                             $end_check = $reader_tracks->getUI32BE();
                             if ($end_check == 0) {
                                 break;
                             }
                             $reader_tracks->incrementOffset(-4, 0);
                             $track = array();
                             // Duration
                             if ($chunkID != 'Mtsu') {
                                 // Mtsu は Duration 無し
                                 $duration = $reader_tracks->getUI8();
                                 if ($duration & 0x80) {
                                     $duration = ($duration & 0x7f) << 8;
                                     $duration |= $reader_tracks->getUI8();
                                 }
                                 $track['Duration'] = $duration;
                             }
                             // Event
                             $event = $reader_tracks->getUI8();
                             $eventData = array();
                             if ($event != 0) {
                                 $eventData['Type'] = 'Note Message';
                                 $eventData['GetTime'] = $reader_tracks->getUI8();
                                 // Option ???
                             } else {
                                 $data1 = $reader_tracks->getUI8();
                                 $eventData['Channel'] = $data1 >> 6;
                                 if (($data1 & 0xf) == 0) {
                                     $eventData['Type'] = 'Program change';
                                 } elseif (($data1 & 0xf) == 1) {
                                     $eventData['Type'] = 'Bank Select';
                                 } else {
                                     $msg = sprintf("Unknow Event Data#1=0x%02x", $data1);
                                     //                                throw new Exception($msg);
                                     printf($msg . "\n");
                                     break 2;
                                 }
                                 $eventData['Value'] = $reader_tracks->getUI8();
                             }
                             $track['event'] = $tracks[] = $track;
                         }
                         $chunk['Tracks'] = $tracks;
                         break 2;
                 }
             default:
                 $data = $reader->getData($size);
                 if ($structure_type = $this->nestedChunkIDSize($chunkID)) {
                     $reader_chunkdata = new IO_Bit();
                     $reader_chunkdata->input($data);
                     $method = 'parseData' . $structure_type;
                     $chunk[$structure_type] = $this->{$method}($reader_chunkdata);
                 } else {
                     $chunk['Data'] = $data;
                 }
                 break;
         }
         //            var_dump($chunk);
         $chunks[] = $chunk;
     }
     return $chunks;
 }
Esempio n. 8
0
 static function parse(&$reader, $opts = array())
 {
     $action = array();
     $code = $reader->getUI8();
     $action['Code'] = $code;
     if ($code >= 0x80) {
         $length = $reader->getUI16LE();
         $action['Length'] = $length;
         switch ($code) {
             case 0x81:
                 // ActionGotoFrame
                 $action['Frame'] = $reader->getUI16LE();
                 break;
             case 0x83:
                 // ActionGetURL
                 $data = $reader->getData($length);
                 $strs = explode("", $data, 2 + 1);
                 $action['UrlString'] = $strs[0];
                 $action['TargetString'] = $strs[1];
                 break;
             case 0x88:
                 // ActionConstantPool
                 $count = $reader->getUI16LE();
                 $action['Count'] = $count;
                 $data = $reader->getData($length - 2);
                 $strs = explode("", $data, $count + 1);
                 $action['ConstantPool'] = array_splice($strs, 0, $count);
                 break;
             case 0x8a:
                 // ActionWaitForFrame
                 $action['Frame'] = $reader->getUI16LE();
                 $action['SkipCount'] = $reader->getUI8();
                 break;
             case 0x8b:
                 // ActionSetTarget
                 $data = $reader->getData($length);
                 $strs = explode("", $data, 1 + 1);
                 $action['TargetName'] = $strs[0];
                 break;
             case 0x8c:
                 // ActionSetTarget
                 $data = $reader->getData($length);
                 $strs = explode("", $data, 1 + 1);
                 $action['Label'] = $strs[0];
                 break;
             case 0x8d:
                 // ActionWaitForFrame2
                 $action['Frame'] = $reader->getUI16LE();
                 $action['SkipCount'] = $reader->getUI8();
                 break;
             case 0x8e:
                 // ActionDefineFunction2
                 $action['FunctionName'] = $reader->getDataUntil("");
                 $action['NumParams'] = $numParams = $reader->getUI16LE();
                 $action['RegisterCount'] = $reader->getUI8();
                 //
                 $action['PreloadParentFlag'] = $reader->getUIBit();
                 $action['PreloadBootFlag'] = $reader->getUIBit();
                 $action['SuppressSuperFlag'] = $reader->getUIBit();
                 $action['PreloadSuperFlag'] = $reader->getUIBit();
                 $action['SuppressArgumentsFlag'] = $reader->getUIBit();
                 $action['PreloadArgumentsFlag'] = $reader->getUIBit();
                 $action['SuppressThisFlag'] = $reader->getUIBit();
                 $action['PreloadThisFlag'] = $reader->getUIBit();
                 //
                 $action['(Reserve)'] = $reader->getUIBits(7);
                 $action['PreloadGlobalFlag'] = $reader->getUIBit();
                 //
                 $parameters = array();
                 for ($i = 0; $i < $numParams; $i++) {
                     $registerParam = array();
                     $registerParam['Register'] = $reader->getUI8();
                     $registerParam['ParamName'] = $reader->getDataUntil("");
                     $parameters[] = $registerParam;
                 }
                 $action['Parameters'] = $parameters;
                 $action['codeSize'] = $reader->getUI16LE();
                 break;
             case 0x96:
                 // ActionPush
                 $data = $reader->getData($length);
                 $values = array();
                 $values_reader = new IO_Bit();
                 $values_reader->input($data);
                 while ($values_reader->hasNextData()) {
                     $value = array();
                     $type = $values_reader->getUI8();
                     $value['Type'] = $type;
                     switch ($type) {
                         case 0:
                             // STRING
                             $value['String'] = IO_SWF_Type_String::parse($values_reader);
                             break;
                         case 1:
                             // Float
                             $value['Float'] = IO_SWF_Type_Float::parse($values_reader);
                             break;
                         case 2:
                             // null
                             $value['null'] = null;
                             break;
                         case 3:
                             // undefined
                             $value['undefined'] = null;
                             break;
                         case 4:
                             // RegisterNumber
                             $value['RegisterNumber'] = $values_reader->getUI8();
                             break;
                         case 5:
                             // Boolean
                             $value['Boolean'] = $values_reader->getUI8();
                             break;
                         case 6:
                             // Double
                             $value['Double'] = IO_SWF_Type_Double::parse($values_reader);
                             break;
                         case 7:
                             // Integer
                             $value['Integer'] = $values_reader->getUI32LE();
                             break;
                         case 8:
                             // Constant8
                             $value['Constant8'] = $values_reader->getUI8();
                             break;
                         case 9:
                             // Constant16
                             $value['Constant16'] = $values_reader->getUI16LE();
                             break;
                         default:
                             throw new IO_SWF_Exception("Illegal ActionPush value's type({$type})");
                     }
                     $values[] = $value;
                 }
                 $action['Values'] = $values;
                 break;
             case 0x99:
                 // ActionJump
                 $action['BranchOffset'] = $reader->getSI16LE();
                 break;
             case 0x9a:
                 // ActionGetURL2
                 //                $action['SendVarsMethod'] = $reader->getUIBits(2);
                 //                $action['(Reserved)'] = $reader->getUIBits(4);
                 //                $action['LoadTargetFlag'] = $reader->getUIBit();
                 //                $action['LoadVariablesFlag'] = $reader->getUIBit();
                 // swf_file_format_spec_v10 bug, field reverse.
                 $action['LoadVariablesFlag'] = $reader->getUIBit();
                 $action['LoadTargetFlag'] = $reader->getUIBit();
                 $action['(Reserved)'] = $reader->getUIBits(4);
                 $action['SendVarsMethod'] = $reader->getUIBits(2);
                 break;
             case 0x9d:
                 // ActionIf
                 $action['Offset'] = $reader->getSI16LE();
                 break;
             case 0x9f:
                 // ActionGotoFrame2
                 $action['(Reserved)'] = $reader->getUIBits(6);
                 $sceneBiasFlag = $reader->getUIBit();
                 $action['SceneBiasFlag'] = $sceneBiasFlag;
                 $action['PlayFlag'] = $reader->getUIBit();
                 if ($sceneBiasFlag == 1) {
                     $action['SceneBias'] = $reader->getUI16LE();
                 }
                 break;
             default:
                 if ($length > 0) {
                     $action['Data'] = $reader->getData($length);
                 }
                 break;
         }
     }
     return $action;
 }