static function build(&$writer, $shapeRecords, $opts = array()) { $tagCode = $opts['tagCode']; $fillStyleCount = $opts['fillStyleCount']; $lineStyleCount = $opts['lineStyleCount']; if ($fillStyleCount == 0) { $numFillBits = 0; } else { // $fillStyleCount == fillStyle MaxValue because 'undefined' use 0 $numFillBits = $writer->need_bits_unsigned($fillStyleCount); } if ($lineStyleCount == 0) { $numLineBits = 0; } else { // $lineStyleCount == lineStyle MaxValue because 'undefined' use 0 $numLineBits = $writer->need_bits_unsigned($lineStyleCount); } $writer->byteAlign(); $writer->putUIBits($numFillBits, 4); $writer->putUIBits($numLineBits, 4); $currentDrawingPositionX = 0; $currentDrawingPositionY = 0; $currentFillStyle0 = 0; $currentFillStyle1 = 0; $currentLineStyle = 0; foreach ($shapeRecords as $shapeRecordIndex => $shapeRecord) { $typeFlag = $shapeRecord['TypeFlag']; $writer->putUIBit($typeFlag); if ($typeFlag == 0) { if (isset($shapeRecord['EndOfShape']) && $shapeRecord['EndOfShape'] == 0) { // EndShapeRecord $writer->putUIBits(0, 5); } else { // StyleChangeRecord $stateNewStyles = 0; if (isset($shapeRecord['FillStyles'])) { $fillStyleCount = count($shapeRecord['FillStyles']); if ($fillStyleCount == 0) { $numFillBits = 0; } else { // $fillStyleCount == fillStyle MaxValue because 'undefined' use 0 $numFillBits = $writer->need_bits_unsigned($fillStyleCount); $stateNewStyles = 1; } } if (isset($shapeRecord['LineStyles'])) { $lineStyleCount = count($shapeRecord['LineStyles']); if ($lineStyleCount == 0) { $numLineBits = 0; } else { // $lineStyleCount == lineStyle MaxValue because 'undefined' use 0 $numLineBits = $writer->need_bits_unsigned($lineStyleCount); $stateNewStyles = 1; } } $stateLineStyle = $shapeRecord['LineStyle'] != $currentLineStyle ? 1 : 0; $stateFillStyle1 = $shapeRecord['FillStyle1'] != $currentFillStyle1 ? 1 : 0; $stateFillStyle0 = $shapeRecord['FillStyle0'] != $currentFillStyle0 ? 1 : 0; if ($shapeRecord['MoveX'] != $currentDrawingPositionX || $shapeRecord['MoveY'] != $currentDrawingPositionY) { $stateMoveTo = true; } else { $stateMoveTo = false; } if ($stateNewStyles + $stateNewStyles + $stateFillStyle1 + $stateFillStyle0 + $stateMoveTo == 0) { $stateMoveTo = 1; } $writer->putUIBit($stateNewStyles); $writer->putUIBit($stateLineStyle); $writer->putUIBit($stateFillStyle1); $writer->putUIBit($stateFillStyle0); $writer->putUIBit($stateMoveTo); if ($stateMoveTo) { $moveX = $shapeRecord['MoveX']; $moveY = $shapeRecord['MoveY']; $currentDrawingPositionX = $moveX; $currentDrawingPositionY = $moveY; if ($moveX | $moveY) { $XmoveBits = $writer->need_bits_signed($moveX); $YmoveBits = $writer->need_bits_signed($moveY); $moveBits = max($XmoveBits, $YmoveBits); } else { $moveBits = 0; } $writer->putUIBits($moveBits, 5); $writer->putSIBits($moveX, $moveBits); $writer->putSIBits($moveY, $moveBits); } if ($stateFillStyle0) { $currentFillStyle0 = $shapeRecord['FillStyle0']; $writer->putUIBits($currentFillStyle0, $numFillBits); } if ($stateFillStyle1) { $currentFillStyle1 = $shapeRecord['FillStyle1']; $writer->putUIBits($currentFillStyle1, $numFillBits); } if ($stateLineStyle) { $currentLineStyle = $shapeRecord['LineStyle']; $writer->putUIBits($currentLineStyle, $numLineBits); } if ($stateNewStyles) { $opts = array('tagCode' => $tagCode); IO_SWF_Type_FILLSTYLEARRAY::build($writer, $shapeRecord['FillStyles'], $opts); IO_SWF_Type_LINESTYLEARRAY::build($writer, $shapeRecord['LineStyles'], $opts); $writer->byteAlign(); $writer->putUIBits($numFillBits, 4); $writer->putUIBits($numLineBits, 4); } } } else { $straightFlag = $shapeRecord['StraightFlag']; $writer->putUIBit($straightFlag); if ($straightFlag) { $deltaX = $shapeRecord['X'] - $currentDrawingPositionX; $deltaY = $shapeRecord['Y'] - $currentDrawingPositionY; if ($deltaX | $deltaY) { $XNumBits = $writer->need_bits_signed($deltaX); $YNumBits = $writer->need_bits_signed($deltaY); $numBits = max($XNumBits, $YNumBits); } else { $numBits = 0; } if ($numBits < 2) { $numBits = 2; } $writer->putUIBits($numBits - 2, 4); if ($deltaX && $deltaY) { $writer->putUIBit(1); // GeneralLineFlag $writer->putSIBits($deltaX, $numBits); $writer->putSIBits($deltaY, $numBits); } else { $writer->putUIBit(0); // GeneralLineFlag if ($deltaX) { $writer->putUIBit(0); // VertLineFlag $writer->putSIBits($deltaX, $numBits); } else { $writer->putUIBit(1); // VertLineFlag $writer->putSIBits($deltaY, $numBits); } } $currentDrawingPositionX = $shapeRecord['X']; $currentDrawingPositionY = $shapeRecord['Y']; } else { $controlDeltaX = $shapeRecord['ControlX'] - $currentDrawingPositionX; $controlDeltaY = $shapeRecord['ControlY'] - $currentDrawingPositionY; $currentDrawingPositionX = $shapeRecord['ControlX']; $currentDrawingPositionY = $shapeRecord['ControlY']; $anchorDeltaX = $shapeRecord['AnchorX'] - $currentDrawingPositionX; $anchorDeltaY = $shapeRecord['AnchorY'] - $currentDrawingPositionY; $currentDrawingPositionX = $shapeRecord['AnchorX']; $currentDrawingPositionY = $shapeRecord['AnchorY']; $numBitsControlDeltaX = $writer->need_bits_signed($controlDeltaX); $numBitsControlDeltaY = $writer->need_bits_signed($controlDeltaY); $numBitsAnchorDeltaX = $writer->need_bits_signed($anchorDeltaX); $numBitsAnchorDeltaY = $writer->need_bits_signed($anchorDeltaY); $numBits = max($numBitsControlDeltaX, $numBitsControlDeltaY, $numBitsAnchorDeltaX, $numBitsAnchorDeltaY); if ($numBits < 2) { $numBits = 2; } $writer->putUIBits($numBits - 2, 4); $writer->putSIBits($controlDeltaX, $numBits); $writer->putSIBits($controlDeltaY, $numBits); $writer->putSIBits($anchorDeltaX, $numBits); $writer->putSIBits($anchorDeltaY, $numBits); } } } return true; }
function buildContent($tagCode, $opts = array()) { $isMorph = $tagCode == 46 || $tagCode == 84; $writer = new IO_Bit(); if (empty($opts['noShapeId'])) { $writer->putUI16LE($this->_shapeId); } $opts = array('tagCode' => $tagCode); if ($isMorph === false) { IO_SWF_Type_RECT::build($writer, $this->_shapeBounds); // 描画スタイル IO_SWF_Type_FILLSTYLEARRAY::build($writer, $this->_fillStyles, $opts); IO_SWF_Type_LINESTYLEARRAY::build($writer, $this->_lineStyles, $opts); // 描画枠 $opts['fillStyleCount'] = count($this->_fillStyles); $opts['lineStyleCount'] = count($this->_lineStyles); IO_SWF_Type_SHAPE::build($writer, $this->_shapeRecords, $opts); } else { IO_SWF_Type_RECT::build($writer, $this->_startBounds); IO_SWF_Type_RECT::build($writer, $this->_endBounds); $writer->byteAlign(); list($offset_offset, $dummy) = $writer->getOffset(); $this->_offset = $writer->putUI32LE(0); // at first, write dummy // 描画スタイル IO_SWF_Type_FILLSTYLEARRAY::build($writer, $this->_morphFillStyles, $opts); IO_SWF_Type_LINESTYLEARRAY::build($writer, $this->_morphLineStyles, $opts); // 描画枠 $opts['fillStyleCount'] = count($this->_morphFillStyles); $opts['lineStyleCount'] = count($this->_morphLineStyles); // StartEdge IO_SWF_Type_SHAPE::build($writer, $this->_startEdge, $opts); // EndEdge $writer->byteAlign(); list($end_edge_offset, $dummy) = $writer->getOffset(); $this->_offset = $end_edge_offset - $offset_offset - 4; $writer->setUI32LE($this->_offset, $offset_offset); IO_SWF_Type_SHAPE::build($writer, $this->_endEdge, $opts); } return $writer->output(); }