Ejemplo n.º 1
0
 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;
 }
Ejemplo n.º 2
0
 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();
 }