예제 #1
0
 protected function createStyleList($style, &$elements = array())
 {
     $styleList = new Media_SWF_Tag_DefineShape_StyleList();
     $fillStyles = $style['FillStyles']['FillStyles'];
     $lineStyles = $style['LineStyles']['LineStyles'];
     $spreadMode = array('pad', 'reflect', 'repeat');
     foreach ($fillStyles as $f) {
         if (isset($f['Color'])) {
             $svgFillStyle = Media_SVG::newElement('Path');
             $svgFillStyle->set('fill', "#" . sprintf("%02x%02x%02x", $f['Color']['Red'], $f['Color']['Green'], $f['Color']['Blue']));
             if (isset($f['Color']['Alpha'])) {
                 $svgFillStyle->set('fill-opacity', $f['Color']['Alpha'] / 255);
             }
         } elseif (isset($f['Gradient'])) {
             $gradient = $f['Gradient'];
             $gid = sprintf("g_%s_%s", $this->characterId, count($elements));
             $svgFillStyle = Media_SVG::newElement('Path');
             $svgFillStyle->set('fill', "url(#{$gid})");
             $g = Media_SVG::newElement($f['FillStyleType'] === 0x10 ? 'linearGradient' : 'radialGradient');
             $g->set('id', $gid);
             $g->set('spreadMethod', $spreadMode[$gradient['SpreadMode']]);
             // TODO GradientMatrixの対応を実装
             //$g->set('transform', Media_SWF_SVGUtill::matrixToSVGTransform($f['GradientMatrix']));
             foreach ($gradient['GradientRecords'] as $gr) {
                 $g->addNode(Media_SVG::newElement('stop')->set('offset', $gr['Ratio'] / 255 * 100 . "%")->set('stop-color', '#' . sprintf("%02x%02x%02x", $gr['Color']['Red'], $gr['Color']['Green'], $gr['Color']['Blue'])));
             }
             $elements[] = $g;
         } elseif (isset($f['BitmapId']) && $f['BitmapId'] !== 0xffff) {
             $id = $this->root->getTagByCharacterId($f['BitmapId'])->getElementIdString();
             $svgFillStyle = Media_SVG::newElement('use')->set('href', "#{$id}")->set('transform', Media_SWF_SVGUtill::matrixToSVGTransform($f['BitmapMatrix']));
         } else {
             $svgFillStyle = new Media_SVG_Null();
         }
         $styleList->addFillStyle($svgFillStyle);
     }
     // fillStyles
     foreach ($lineStyles as $l) {
         $svgLineStyle = Media_SVG::newElement('Path')->set('fill', 'none');
         if ($this->code !== Media_SWF_Tag::DEFINE_SHAPE4) {
             $svgLineStyle->set('stroke-linejoin', 'round')->set('stroke-linecap', 'round');
         }
         if (isset($l['Color'])) {
             $svgLineStyle->set('stroke', '#' . sprintf("%02x%02x%02x", $l['Color']['Red'], $l['Color']['Green'], $l['Color']['Blue']));
             if (isset($l['Color']['Alpha'])) {
                 $svgLineStyle->set('stroke-opacity', $l['Color']['Alpha'] / 255);
             }
         }
         if (isset($l['Width'])) {
             $svgLineStyle->set('stroke-width', $l['Width']);
         }
         $styleList->addLineStyle($svgLineStyle);
     }
     // lineStyles
     return $styleList;
 }
 public function getControlsArray()
 {
     $ret = array();
     $frame = 0;
     $frame_name = null;
     $display_stack = array();
     $actions_stack = array();
     $remove_stack = array();
     foreach ($this->_tags as $tag) {
         switch ($tag->getCode()) {
             case Media_SWF_Tag::PLACE_OBJECT:
             case Media_SWF_Tag::PLACE_OBJECT2:
             case Media_SWF_Tag::PLACE_OBJECT3:
                 $depth = $tag->getField('Depth');
                 $characterId = $tag->getField('CharacterId');
                 $display = $display_stack[$depth];
                 if ($characterId) {
                     $id = $this->root->getTagByCharacterId($characterId)->getElementIdString();
                     if ($display) {
                         $display['cid'] = $id;
                         //$display['replace'] = true;
                     } else {
                         $display = array('dp' => $depth, 'cid' => $id);
                     }
                 } else {
                     //if ($display['replace']) {
                     //  unset($display['replace']);
                     //}
                 }
                 if ($tag->hasField('Name')) {
                     $display['name'] = $tag->getField('Name');
                 }
                 if ($tag->hasField('Matrix')) {
                     $matrix = Media_SWF_SVGUtill::matrixToArray($tag->getField('Matrix'));
                     if ($matrix != array(1, 0, 0, 1, 0, 0)) {
                         $display['mtx'] = Media_SWF_SVGUtill::matrixToArray($tag->getField('Matrix'));
                     }
                 }
                 if ($tag->hasField('ColorTransform')) {
                     $cxform = $tag->getField('ColorTransform');
                     $display['cx'] = Media_SWF_SVGUtill::cxformToArray($tag->getField('ColorTransform'));
                 }
                 if ($tag->hasField('ClipDepth')) {
                     $display['cdp'] = $tag->getField('ClipDepth');
                 }
                 $display_stack[$depth] = $display;
                 break;
             case Media_SWF_Tag::REMOVE_OBJECT:
             case Media_SWF_Tag::REMOVE_OBJECT2:
                 // SVGでは何もしない
                 $depth = $tag->getField('Depth');
                 $remove_stack[] = $depth;
                 unset($display_stack[$depth]);
                 break;
             case Media_SWF_Tag::DO_ACTION:
                 $actions_stack[] = $tag->convertArray();
                 break;
             case Media_SWF_Tag::FRAME_LABEL:
                 $frame_name = $tag->getField('Name');
                 break;
             case Media_SWF_Tag::SHOW_FRAME:
                 ++$frame;
                 ksort($display_stack);
                 $d = array();
                 foreach ($display_stack as $i => $display) {
                     $d[] = $display;
                     //if ($display_stack[$i]['new']) unset($display_stack[$i]['new']);
                     //if ($display_stack[$i]['replace']) unset($display_stack[$i]['replace']);
                 }
                 $r = array('d' => $d);
                 if (count($remove_stack) > 0) {
                     $r['rm'] = $remove_stack;
                 }
                 if ($frame_name) {
                     $r['label'] = $frame_name;
                 }
                 if (count($actions_stack) > 0) {
                     $r['act'] = $actions_stack;
                 }
                 $ret[] = $r;
                 $remove_stack = array();
                 $actions_stack = array();
                 $frame_name = null;
                 break;
             case Media_SWF_Tag::SET_BACKGROUND_COLOR:
                 break;
             case Media_SWF_Tag::END:
                 break;
             case Media_SWF_Tag::FILE_ATTRIBUTES:
             case Media_SWF_Tag::METADATA:
                 break;
             default:
                 if (!$tag->isDefinitionTag()) {
                     var_dump($tag->getTagName());
                 }
         }
     }
     return $ret;
 }