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; }