Esempio n. 1
0
 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;
 }
Esempio n. 2
0
 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;
 }
Esempio n. 3
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. 4
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. 5
0
 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);
     }
 }
Esempio n. 6
0
 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);
 }
Esempio n. 7
0
 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];
         }
     }
 }
Esempio n. 8
0
 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);
 }
Esempio n. 9
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. 10
0
 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;
 }
Esempio n. 11
0
File: Jpeg.php Progetto: yoya/IO_SWF
 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);
     }
 }
Esempio n. 12
0
 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);
     }
 }
Esempio n. 13
0
File: Text.php Progetto: yoya/IO_SWF
 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;
 }
Esempio n. 14
0
 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;
 }
Esempio n. 15
0
<?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;
Esempio n. 16
0
 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']);
             }
         }
     }
 }
Esempio n. 17
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. 18
0
 function parseContent($tagCode, $content, $opts = array())
 {
     $reader = new IO_Bit();
     $reader->input($content);
     $this->_color = IO_SWF_Type_RGB::parse($reader);
 }
Esempio n. 19
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;
 }
Esempio n. 20
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. 21
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. 22
0
 function parseContent($tagCode, $content, $opts = array())
 {
     $reader = new IO_Bit();
     $reader->input($content);
     $this->_label = IO_SWF_Type_String::parse($reader);
 }
Esempio n. 23
0
File: SWF.php Progetto: yoya/IO_SWF
 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();
         }
     }
 }
Esempio n. 24
0
File: Font.php Progetto: yoya/IO_SWF
 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);
             }
         }
     }
 }
Esempio n. 25
0
 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);
     }
 }