function parse($sfdata) { $reader = new IO_Bit(); $reader->input($sfdata); $length = strlen($sfdata); $id = $reader->getData(4); // 'RIFF' if ($id !== 'RIFF') { throw new IO_SoundFont_Exception("non RIFF fourcc"); } $size = $reader->getUI32LE(); if ($length !== $size + 8) { fputs(STDERR, "parse: illegal length({$length}) and RIFF size({$size})\n"); } $id = $reader->getData(4); // 'sfbk' if ($id !== 'sfbk') { throw new IO_SoundFont_Exception("non sfbk fourcc"); } $info = $this->parseChunkLIST($reader); $sdta = $this->parseChunkLIST($reader); $pdta = $this->parseChunkLIST($reader); $this->sfbk = array('INFO' => $info, 'sdta' => $sdta, 'pdta' => $pdta); return true; }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); switch ($tagCode) { case 4: // PlaceObject $this->_characterId = $reader->getUI16LE(); $this->_depth = $reader->getUI16LE(); $this->_matrix = IO_SWF_Type_MATRIX::parse($reader); if ($reader->hasNextData()) { // optional $this->_colorTransform = IO_SWF_Type_CXFORM::parse($reader); } break; case 26: // PlaceObject2 // placeFlag $this->_placeFlagHasClipActions = $reader->getUIBit(); $this->_placeFlagHasClipDepth = $reader->getUIBit(); $this->_placeFlagHasName = $reader->getUIBit(); $this->_placeFlagHasRatio = $reader->getUIBit(); $this->_placeFlagHasColorTransform = $reader->getUIBit(); $this->_placeFlagHasMatrix = $reader->getUIBit(); $this->_placeFlagHasCharacter = $reader->getUIBit(); $this->_placeFlagMove = $reader->getUIBit(); // $this->_depth = $reader->getUI16LE(); if ($this->_placeFlagHasCharacter) { $this->_characterId = $reader->getUI16LE(); } if ($this->_placeFlagHasMatrix) { $this->_matrix = IO_SWF_Type_MATRIX::parse($reader); } if ($this->_placeFlagHasColorTransform) { $this->_colorTransform = IO_SWF_Type_CXFORMWITHALPHA::parse($reader); } if ($this->_placeFlagHasRatio) { $this->_ratio = $reader->getUI16LE(); } if ($this->_placeFlagHasName) { $this->_name = IO_SWF_Type_String::parse($reader); } if ($this->_placeFlagHasClipDepth) { $this->_clipDepth = $reader->getUI16LE(); } if ($this->_placeFlagHasClipActions) { $this->_clipActions = IO_SWF_Type_CLIPACTIONS::parse($reader, $opts); } break; } return true; }
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; }
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(); } // }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); $this->CharacterID = $reader->getUI16LE(); $this->Bounds = IO_SWF_Type_RECT::parse($reader); // ---- $reader->byteAlign(); $hasText = $reader->getUIBit(); $this->WordWrap = $reader->getUIBit(); $this->Multiline = $reader->getUIBit(); $this->Password = $reader->getUIBit(); $this->ReadOnly = $reader->getUIBit(); $hasTextColor = $reader->getUIBit(); $hasMaxLength = $reader->getUIBit(); $hasFont = $reader->getUIBit(); // ---- $hasFontClass = $reader->getUIBit(); $this->AutoSize = $reader->getUIBit(); $hasLayout = $reader->getUIBit(); $this->NoSelect = $reader->getUIBit(); $this->Border = $reader->getUIBit(); $this->WasStatic = $reader->getUIBit(); $this->HTML = $reader->getUIBit(); $this->UseOutlines = $reader->getUIBit(); if ($hasFont) { $this->FontID = $reader->getUI16LE(); } if ($hasFontClass) { $this->FontClass = IO_SWF_Type_String::parse($reader); } if ($hasFont) { $this->FontHeight = $reader->getUI16LE(); } if ($hasTextColor) { $this->TextColor = IO_SWF_Type_RGBA::parse($reader); } if ($hasMaxLength) { $this->MaxLength = $reader->getUI16LE(); } if ($hasLayout) { $this->Align = $reader->getUI8(); $this->LeftMargin = $reader->getUI16LE(); $this->RightMargin = $reader->getUI16LE(); $this->Indent = $reader->getUI16LE(); $this->Leading = $reader->getSI16LE(); } $this->VariableName = IO_SWF_Type_String::parse($reader); if ($hasText) { $this->InitialText = IO_SWF_Type_String::parse($reader); } }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); $this->Reserved = $reader->getUIBit(); $this->UseDirectBlit = $reader->getUIBit(); $this->UseGPU = $reader->getUIBit(); $this->HasMetadata = $reader->getUIBit(); $this->ActionScript3 = $reader->getUIBit(); $this->Reserved2 = $reader->getUIBits(2); $this->UseNetwork = $reader->getUIBit(); $this->Reserved3 = $reader->getUIBits(24); }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); if ($tagCode == 59) { // DoInitAction $this->_spriteId = $reader->getUI16LE(); } $i = 0; while ($reader->hasNextData(1)) { list($byteOffset, $dummy) = $reader->getOffset(); $action = IO_SWF_Type_Action::parse($reader); list($nextByteOffset, $dummy) = $reader->getOffset(); // $this->_byteOffsetTable[$i] = $byteOffset; $this->_byteSizeTable[$i] = $nextByteOffset - $byteOffset; $recordOffsetToByteOffset[$i] = $byteOffset; $byteOffsetToRecordOffset[$byteOffset] = $i; // $this->_actions[] = $action; $i++; } if ($i > 0) { $recordOffsetToByteOffset[$i] = $nextByteOffset; $byteOffsetToRecordOffset[$nextByteOffset] = $i; $byteOffsetToRecordOffset[$nextByteOffset] = $i; } $label_num = 0; foreach ($this->_actions as $i => $action) { if ($action['Code'] == 0x99) { // Jump $branch_offset = $action['BranchOffset']; } else { if ($action['Code'] == 0x9d) { // If $branch_offset = $action['Offset']; } else { continue; } } $targetByteOffset = $recordOffsetToByteOffset[$i + 1] + $branch_offset; if (isset($byteOffsetToRecordOffset[$targetByteOffset])) { $targetRecordOffset = $byteOffsetToRecordOffset[$targetByteOffset]; if (isset($this->_labels[$targetRecordOffset]) === false) { $this->_labels[$targetRecordOffset] = $targetRecordOffset; } $this->_branches[$i] = $this->_labels[$targetRecordOffset]; } } }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); $this->SoundId = $reader->getUI16LE(); // --- $this->SoundFormat = $reader->getUIBits(4); $this->SoundRate = $reader->getUIBits(2); $this->SoundSize = $reader->getUIBit(); $this->SoundType = $reader->getUIBit(); // --- $this->SoundSampleCount = $reader->getUI32LE(); $this->SoundData = $reader->getDataUntil(false); }
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); }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); switch ($tagCode) { case 5: // RemoveObject $this->_characterId = $reader->getUI16LE(); $this->_depth = $reader->getUI16LE(); break; case 28: // RemoveObject2 $this->_depth = $reader->getUI16LE(); break; } return true; }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); if ($tagCode != 8) { // ! JPEGTable $this->_CharacterID = $reader->getUI16LE(); } if ($tagCode == 35) { // DefgineBitsJPEG3 $alphaDataOffset = $reader->getUI32LE(); $this->_AlphaDataOffset = $alphaDataOffset; } if ($tagCode != 35) { // ! DefgineBitsJPEG3 $this->_JPEGData = $reader->getDataUntil(false); } else { $this->_JPEGData = $reader->getData($alphaDataOffset); $this->_ZlibBitmapAlphaData = $reader->getDataUntil(false); } }
function parseContent($tagCode, $content, $opts = array()) { // DefineMorphShape, DefineMorphShape2 $isMorph = $tagCode == 46 || $tagCode == 84; $reader = new IO_Bit(); $reader->input($content); $this->_shapeId = $reader->getUI16LE(); $opts = array('tagCode' => $tagCode, 'isMorph' => $isMorph); if ($isMorph === false) { // 描画スタイル $this->_shapeBounds = IO_SWF_TYPE_RECT::parse($reader); if ($tagCode == 83) { // DefineShape4 $this->_edgeBounds = IO_SWF_TYPE_RECT::parse($reader); $this->_reserved = $reader->getUIBits(6); $this->_usesNonScalingStrokes = $reader->getUIBit(); $this->_UsesScalingStrokes = $reader->getUIBit(); } $this->_fillStyles = IO_SWF_TYPE_FILLSTYLEARRAY::parse($reader, $opts); $this->_lineStyles = IO_SWF_TYPE_LINESTYLEARRAY::parse($reader, $opts); // 描画枠 $this->_shapeRecords = IO_SWF_Type_SHAPE::parse($reader, $opts); } else { $this->_startBounds = IO_SWF_TYPE_RECT::parse($reader); $this->_endBounds = IO_SWF_TYPE_RECT::parse($reader); list($offset_offset, $dummy) = $reader->getOffset(); $this->_offset = $reader->getUI32LE(); // 描画スタイル $this->_morphFillStyles = IO_SWF_TYPE_FILLSTYLEARRAY::parse($reader, $opts); $this->_morphLineStyles = IO_SWF_TYPE_LINESTYLEARRAY::parse($reader, $opts); // 描画枠 $this->_startEdge = IO_SWF_Type_SHAPE::parse($reader, $opts); list($end_edge_offset, $dummy) = $reader->getOffset(); if ($offset_offset + $this->_offset + 4 != $end_edge_offset) { trigger_error("offset_offset({$offset_offset}) + this->_offset({$this->_offset}) + 4 != end_edge_offset({$end_edge_offset})", E_USER_WARNING); $reader->setOffset($offset_offset + $this->_offset + 4, 0); } $this->_endEdge = IO_SWF_Type_SHAPE::parse($reader, $opts); } }
function parseContent($tagCode, $content, $opts = array()) { $opts['tagCode'] = $tagCode; $reader = new IO_Bit(); $reader->input($content); $this->_CharacterID = $reader->getUI16LE(); $this->_TextBounds = IO_SWF_TYPE_RECT::parse($reader); $this->_TextMatrix = IO_SWF_Type_MATRIX::parse($reader); $glyphBits = $reader->getUI8(); $advanceBits = $reader->getUI8(); $this->_GlyphBits = $glyphBits; $this->_AdvanceBits = $advanceBits; $textRecords = array(); $opts['GlyphBits'] = $glyphBits; $opts['AdvanceBits'] = $advanceBits; while ($reader->getUI8() != 0) { $reader->incrementOffset(-1, 0); // 1 byte back $textRecords[] = IO_SWF_Type_TEXTRECORD::parse($reader, $opts); } $this->_TextRecords = $textRecords; }
function parseChunkData() { if (isset($this->detail)) { return; } $detailData = array(); $id = $this->id; $reader = new IO_Bit(); $reader->input($this->data); $this->data = null; // XXX switch ($id) { // INFO sub-chunks case 'ifil': $detailData['sfVersionMajor'] = $reader->getUI16LE(); $detailData['sfVersionMinor'] = $reader->getUI16LE(); break; case 'INAM': $detailData['sfName'] = $this->data; // String break; case 'isng': $detailData['sfEngine'] = $this->data; // String break; case 'IENG': $detailData['sfEngineers'] = $this->data; // String break; case 'ISFT': $detailData['sfTools'] = $this->data; // String break; case 'ICMT': $detailData['Comments'] = $this->data; // String break; case 'ICOP': $detailData['Copyright'] = $this->data; // String break; // sdta sub-chunks // sdta sub-chunks case 'smpl': $detailData['Samples'] = $this->data; // String break; // pdta sub-chunks // pdta sub-chunks case 'phdr': $detailData = array(); while ($reader->hasNextData()) { $preset = array(); $presetName = explode("", $reader->getData(20)); $preset['PresetName'] = $presetName[0]; $preset['Preset'] = $reader->getUI16LE(); $preset['Bank'] = $reader->getUI16LE(); $preset['PresetBagNdx'] = $reader->getUI16LE(); $preset['Library'] = $reader->getUI32LE(); $preset['Genre'] = $reader->getUI32LE(); $preset['MorphologyGenre'] = $reader->getUI32LE(); $detailData[] = $preset; } break; case 'pbag': $detailData = array(); while ($reader->hasNextData()) { $presetBag = array(); $presetBag['GenNdx'] = $reader->getUI16LE(); $presetBag['ModNdx'] = $reader->getUI16LE(); $detailData[] = $presetBag; } break; case 'pmod': case 'imod': $detailData = array(); while ($reader->hasNextData()) { $sfMod = array(); $sfMod['sfModSrcOper'] = IO_SoundFont_Modulator::parse($reader); $sfMod['sfModDestOper'] = $reader->getUI16LE(); $sfMod['modAmount'] = $reader->getSI16LE(); $sfMod['sfModAmtSrcOper'] = IO_SoundFont_Modulator::parse($reader); $sfMod['sfModTransOper'] = $reader->getUI16LE(); $detailData[] = $sfMod; } break; case 'pgen': case 'igen': $detailData = array(); while ($reader->hasNextData()) { $detailData[] = IO_SoundFont_Generator::parse($reader); } break; case 'inst': $detailData = array(); while ($reader->hasNextData()) { $sfInst = array(); $InstName = explode("", $reader->getData(20)); $sfInst['InstName'] = $InstName[0]; $sfInst['InstBagNdx'] = $reader->getSI16LE(); $detailData[] = $sfInst; } break; case 'ibag': $detailData = array(); while ($reader->hasNextData()) { $presetBag = array(); $presetBag['GenNdx'] = $reader->getUI16LE(); $presetBag['ModNdx'] = $reader->getUI16LE(); $detailData[] = $presetBag; } break; case 'shdr': $detailData = array(); while ($reader->hasNextData()) { $sfSample = array(); $SampleName = explode("", $reader->getData(20)); $sfSample['SampleName'] = $SampleName[0]; $sfSample['Start'] = $reader->getUI32LE(); $sfSample['End'] = $reader->getUI32LE(); $sfSample['StartLoop'] = $reader->getUI32LE(); $sfSample['EndLoop'] = $reader->getUI32LE(); $sfSample['SampleRate'] = $reader->getUI32LE(); $sfSample['OriginalPitch'] = $reader->getUI8(); $sfSample['PitchCorrection'] = $reader->getSI8(); $sfSample['SampleLink'] = $reader->getUI16LE(); $sfSample['SampleType'] = $reader->getUI16LE(); $detailData[] = $sfSample; } break; default: return; // nothing to do break; } $this->detail = $detailData; }
<?php require_once 'IO/Bit.php'; function usage() { echo "Usage: php iobit_get.php <filename> <width> [<width2> [...]]" . PHP_EOL; echo "ex) php iobit_get.php iobit_get.php 1 2 3 4 5 6 7 8" . PHP_EOL; } if ($argc < 2) { usage(); exit(1); } $filename = $argv[1]; if ($filename === '-') { $filename = 'php://stdin'; } else { if (is_readable($filename) === false) { usage(); exit(1); } } $iobit = new IO_Bit(); $filedata = file_get_contents($filename); $iobit->input($filedata); foreach (array_slice($argv, 2) as $arg) { $value = $iobit->getUIBits($arg); echo "{$arg}:{$value} "; } echo PHP_EOL;
function dump($opts = array()) { if (empty($opts['hexdump']) === false) { $bitio = new IO_Bit(); $bitio->input($this->_mididata); } echo "HEADER:\n"; foreach ($this->header['header'] as $key => $value) { echo " {$key}: {$value}\n"; } if (empty($opts['hexdump']) === false) { $bitio->hexdump(0, $this->header['length'] + 8); } $xfkaraoke_with_track = $this->tracks; if ($this->xfkaraoke !== null) { $xfkaraoke_with_track["karaoke"] = $this->xfkaraoke; $xfkaraoke_with_track["karaoke"]["track"] = $this->xfkaraoke["xfkaraoke"]; } foreach ($xfkaraoke_with_track as $idx => $track) { $scaleCharactors = array('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'); echo "TRACK[{$idx}]:\n"; if (empty($opts['hexdump']) === false) { $bitio->hexdump($track['_offset'], 8); } foreach ($track['track'] as $idx2 => $chunk) { if (empty($opts['measure']) === false) { $deltaTime = $chunk['DeltaTime']; $this->_timeInMeasure -= $deltaTime; // XXX if ($this->_timeInMeasure <= 0) { echo "=== Measure:{$this->_measureSeqno}\n"; $this->_timeInMeasure = $this->header['header']['Division'] * $this->_measure1 * (4 / $this->_measure2); $this->_measureSeqno++; } } echo " [{$idx2}]:"; foreach ($chunk as $key => $value) { switch ($key) { case 'EventType': if ($value < 0xf) { $eventname = $this->event_name[$value]; } else { if (isset($chunk['SystemEx'])) { $eventname = "System Exclusive"; } elseif (isset($chunk['SystemExCont'])) { $eventname = "System Exclusive Cont"; } elseif (isset($chunk['MetaEventType'])) { $eventname = "Meta Event"; } else { $eventname = "Unknown"; } } echo " {$key}:{$value}({$eventname}),"; break; case 'MetaEventType': $meta_event_type = $value; if (isset($this->meta_event_name[$value])) { $eventname = $this->meta_event_name[$value]; echo " {$key}:{$value}({$eventname}),"; } else { echo " {$key}:{$value},"; } break; case 'ControllerType': $typename = $this->controller_type_name[$value]; echo " {$key}:{$value}({$typename}),"; break; case 'SystemEx': case 'SystemExCont': case 'MetaEventData': echo " {$key}:"; $dataLen = strlen($value); if ($key === 'MetaEventData') { switch ($meta_event_type) { case 0x5: // Lyric echo mb_convert_encoding($value, "UTF-8", "SJIS"); break; case 0x7: // Cue Point echo $value; break; case 0x58: // time signature $measure1 = ord($value[0]); $measure2 = pow(2, ord($value[1])); echo "{$measure1}/{$measure2}"; $this->_measure1 = $measure1; $this->_measure2 = $measure2; break; default: break; } } echo "("; for ($i = 0; $i < $dataLen; $i++) { printf("%02x", ord($value[$i])); } echo ")"; if ($key === 'SystemEx') { echo "\n"; $sysex = new IO_MIDI_SysEx(); $sysex->dumpPayload($value); } break; case 'NoteNumber': $noteoct = floor($value / 12); $notekey = $scaleCharactors[$value % 12]; echo " {$key}:{$value}({$notekey}{$noteoct}),"; break; default: if ($key[0] !== '_' || empty($opts['verbose']) === false) { echo " {$key}:{$value},"; } break; } } echo "\n"; if (empty($opts['hexdump']) === false) { $bitio->hexdump($chunk['_offset'], $chunk['_length']); } } } }
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; } }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); $this->_color = IO_SWF_Type_RGB::parse($reader); }
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; }
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; } } }
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; }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); $this->_label = IO_SWF_Type_String::parse($reader); }
function dump($opts = array()) { if (empty($opts['hexdump']) === false) { $bitio = new IO_Bit(); $bitio->input($this->_swfdata); } /* SWF Header */ echo 'Signature: ' . $this->_headers['Signature'] . PHP_EOL; echo 'Version: ' . $this->_headers['Version'] . PHP_EOL; echo 'FileLength: ' . $this->_headers['FileLength'] . PHP_EOL; echo 'FrameSize: ' . IO_SWF_Type_RECT::string($this->_headers['FrameSize']) . "\n"; echo 'FrameRate: ' . $this->_headers['FrameRate'] / 0x100 . PHP_EOL; echo 'FrameCount: ' . $this->_headers['FrameCount'] . PHP_EOL; if (empty($opts['hexdump']) === false) { $bitio->hexdump(0, $this->_header_size); $opts['bitio'] =& $bitio; // for tag } $opts['indent'] = 0; /* SWF Tags */ if ($this->_headers['Version'] < 6) { ob_start('mb_convert_encoding_from_sjis'); } echo 'Tags:' . PHP_EOL; foreach ($this->_tags as $tag) { try { $tag->dump($opts); } catch (IO_Bit_Exception $e) { echo "(tag dump failed) {$e}\n"; } if ($this->_headers['Version'] < 6) { ob_flush(); } } }
function parseContent($tagCode, $content, $opts = array()) { $reader = new IO_Bit(); $reader->input($content); $this->FontID = $reader->getUI16LE(); $fontFlagsHasLayout = $reader->getUIBit(); $this->FontFlagsShiftJIS = $reader->getUIBit(); $this->FontFlagsSmallText = $reader->getUIBit(); $this->FontFlagsANSI = $reader->getUIBit(); $this->FontFlagsWideOffsets = $reader->getUIBit(); $this->FontFlagsWideCodes = $reader->getUIBit(); $this->FontFlagsItalic = $reader->getUIBit(); $this->FontFlagsBold = $reader->getUIBit(); $this->LanguageCode = IO_SWF_Type_LANGCODE::parse($reader); $fontNameLen = $reader->getUI8(); $this->FontName = $reader->getData($fontNameLen); $numGlyphs = $reader->getUI16LE(); if ($numGlyphs === 0) { return; // no glyphs field. } list($startOfOffsetTable, $dummy) = $reader->getOffset(); if ($this->FontFlagsWideOffsets) { for ($i = 0; $i < $numGlyphs; $i++) { $this->OffsetTable[] = $reader->getUI32LE(); } } else { for ($i = 0; $i < $numGlyphs; $i++) { $this->OffsetTable[] = $reader->getUI16LE(); } } if ($this->FontFlagsWideOffsets) { $codeTableOffset = $reader->getUI32LE(); } else { $codeTableOffset = $reader->getUI16LE(); } for ($i = 0; $i < $numGlyphs; $i++) { $reader->setOffset($startOfOffsetTable + $this->OffsetTable[$i], 0); $this->GlyphShapeTable[] = IO_SWF_Type_SHAPE::parse($reader, $opts); $reader->byteAlign(); } list($startOfOffsetCodeTable, $dummy) = $reader->getOffset(); if ($startOfOffsetCodeTable != $startOfOffsetTable + $codeTableOffset) { trigger_error("startOfOffsetCodeTable:{$startOfOffsetCodeTable} != startOfOffsetTable:{$startOfOffsetTable} + codeTableOffset:{$codeTableOffset}", E_USER_WARNING); } $reader->setOffset($startOfOffsetTable + $codeTableOffset, 0); if ($this->FontFlagsWideCodes) { for ($i = 0; $i < $numGlyphs; $i++) { $this->CodeTable[] = $reader->getUI16LE(); } } else { for ($i = 0; $i < $numGlyphs; $i++) { $this->CodeTable[] = $reader->getUI8(); } } if ($fontFlagsHasLayout) { $this->FontAscent = $reader->getSI16LE(); $this->FontDescent = $reader->getSI16LE(); $this->FontLeading = $reader->getSI16LE(); $this->FontAdvanceTable = array(); for ($i = 0; $i < $numGlyphs; $i++) { $this->FontAdvanceTable[] = $reader->getSI16LE(); } $this->FontBoundsTable = array(); for ($i = 0; $i < $numGlyphs; $i++) { $this->FontBoundsTable[] = IO_SWF_TYPE_RECT::parse($reader); } $kerningCount = $reader->getUI16LE(); if ($kerningCount > 0) { $this->FontKerningTable = array(); $opts['FontFlagsWideCodes'] = $this->FontFlagsWideCodes; for ($i = 0; $i < $kerningCount; $i++) { $this->FontKerningTable[] = IO_SWF_TYPE_KERNINGRECORD::parse($reader, $opts); } } } }
function dump($opts = array()) { if (empty($opts['hexdump']) === false) { $bitio = new IO_Bit(); $bitio->input($this->_swfdata); } /* SWF Header */ echo 'Signature: ' . $this->_headers['Signature'] . PHP_EOL; echo 'Version: ' . $this->_headers['Version'] . PHP_EOL; echo 'FileLength: ' . $this->_headers['FileLength'] . PHP_EOL; echo 'FrameSize: ' . IO_SWF_Type_RECT::string($this->_headers['FrameSize']) . "\n"; echo 'FrameRate: ' . $this->_headers['FrameRate'] / 0x100 . PHP_EOL; echo 'FrameCount: ' . $this->_headers['FrameCount'] . PHP_EOL; if (empty($opts['hexdump']) === false) { $bitio->hexdump(0, $this->_header_size); $opts['bitio'] =& $bitio; // for tag } $opts['indent'] = 0; /* SWF Tags */ echo 'Tags:' . PHP_EOL; foreach ($this->_tags as $tag) { self::parseTagContent($tag, $opts); } $frame_num = 1; $sprite_tags = array(); for ($i = 0; $i < count($this->_tags); $i++) { $tag = $this->_tags[$i]; switch ($tag->code) { case 39: // Sprite $sprite_tags[] = $tag; break; case 12: // Action // Action case 59: // InitAction self::dumpActionTag($tag, $frame_num, $opts); break; case 1: // ShowFrame $frame_num++; break; case 43: // FrameLabel $tag->dump(); break; default: break; } } foreach ($sprite_tags as $tag) { self::dumpSpriteTag($tag, $opts); } }