/** * @param Path $path */ private function initTable(Path $path) { $curX = 0.0; $curY = 0.0; foreach ($path->getElements() as $path) { $destX = $path->getDestX(); $destY = $path->getDestY(); if ($path instanceof LineTo || $path instanceof Close) { if ($curX === $destX && $curY === $destY) { // skip empty lines continue; } $this->addSection(new LinearSection($curX, $curY, $destX, $destY)); } elseif ($path instanceof CurveTo) { $c1x = $path->getControl1X(); $c1y = $path->getControl1Y(); $c2x = $path->getControl2X(); $c2y = $path->getControl2Y(); if ($curX === $destX && $curY === $destY && $curX === $c1x && $curY === $c1y && $curX === $c2x && $curY === $c2y) { // skip empty curve continue; } $this->addSection(new CurvedSection($curX, $curY, $c1x, $c1y, $c2x, $c2y, $destX, $destY)); } $curX = $destX; $curY = $destY; } }
/** */ public function testCloseLastMoveTo() { $path = new Path(1, 2); $path->moveTo(2, 3); $path->moveTo(3, 4); $path->close(); $elements = $path->getElements(); $this->assertCount(4, $elements); $this->assertEquals(3, $elements[3]->getDestX()); $this->assertEquals(4, $elements[3]->getDestY()); }
/** * @param ZendPage $page * @param Path $path * @param int $fillType * * @return ZendPage * @throws \Exception */ private function drawRawPath(ZendPage $page, Path $path, $fillType) { $content = ''; foreach ($path->getElements() as $element) { if ($element instanceof MoveTo) { $xObj = new ZendNumericObject($element->getDestX()); $yObj = new ZendNumericObject($element->getDestY()); $content .= $xObj->toString() . ' ' . $yObj->toString() . ' ' . " m\n"; } elseif ($element instanceof LineTo) { $xObj = new ZendNumericObject($element->getDestX()); $yObj = new ZendNumericObject($element->getDestY()); $content .= $xObj->toString() . ' ' . $yObj->toString() . ' ' . " l\n"; } elseif ($element instanceof CurveTo) { $x1Obj = new ZendNumericObject($element->getControl1X()); $y1Obj = new ZendNumericObject($element->getControl1Y()); $x2Obj = new ZendNumericObject($element->getControl2X()); $y2Obj = new ZendNumericObject($element->getControl2Y()); $x3Obj = new ZendNumericObject($element->getDestX()); $y3Obj = new ZendNumericObject($element->getDestY()); $content .= $x1Obj->toString() . ' ' . $y1Obj->toString() . ' ' . $x2Obj->toString() . ' ' . $y2Obj->toString() . ' ' . $x3Obj->toString() . ' ' . $y3Obj->toString() . ' ' . " c\n"; } elseif ($element instanceof Close) { $content .= "h\n"; } else { throw new InvalidArgumentException('unsupported path element: ' . get_class($element)); } } switch ($fillType) { case ZendPage::SHAPE_DRAW_FILL_AND_STROKE: $content .= " B*\n"; break; case ZendPage::SHAPE_DRAW_FILL: $content .= " f*\n"; break; case ZendPage::SHAPE_DRAW_STROKE: $content .= " S\n"; break; } return $page->rawWrite($content, 'PDF'); }
/** * @param SimpleXMLElement $svg * @param Path $path * @param $yBase * * @return SimpleXMLElement * @throws \Exception */ private function addPath(SimpleXMLElement $svg, Path $path, $yBase) { $d = ''; foreach ($path->getElements() as $element) { if ($element instanceof MoveTo) { $d .= 'M ' . $element->getDestX() . ',' . ($yBase - $element->getDestY()) . ' '; } elseif ($element instanceof LineTo) { $d .= 'L ' . $element->getDestX() . ',' . ($yBase - $element->getDestY()) . ' '; } elseif ($element instanceof CurveTo) { $d .= 'C ' . $element->getControl1X() . ',' . ($yBase - $element->getControl1Y()) . ' ' . $element->getControl2X() . ',' . ($yBase - $element->getControl2Y()) . ' ' . $element->getDestX() . ',' . ($yBase - $element->getDestY()) . ' '; } elseif ($element instanceof Close) { $d .= "Z "; } else { throw new InvalidArgumentException('unsupported path element: ' . get_class($element)); } } $child = $svg->addChild("path"); $child->addAttribute("d", $d); return $child; }