loadFile($inputFile); $rendered = $this->render($label, $params); if ($output) { $ext = pathinfo($output, \PATHINFO_EXTENSION); switch (strtolower($ext)) { case 'png': imagepng($rendered, $output); break; case 'jpg': imagejpeg($rendered, $output); break; default: throw new \InvalidArgumentException("Can't write {$ext} yet"); } } return $rendered; } public function render(Label $label, array $params=[]) { $width = $label->getProp("width"); $height = $label->getProp("height"); $gd = imagecreatetruecolor($width, $height); if (is_callable("imageantialias")) { \imageantialias($gd, true); } $this->renderElement($gd, $label, 0, 0, $width, $height, $params); return $gd; } protected function renderElement($gd, Element $element, int $x, int $y, int $width, int $height, array $params) { $xOffs = $x + $element->getProp("left", 0); $yOffs = $y + $element->getProp("top", 0); if (($widthAttr = $element->getProp("width",0))) { $elemWidth = $widthAttr; } else { $rightAttr = $element->getProp("right",0); $elemWidth = $width - $rightAttr - $element->getProp("left",0);; } if (($heightAttr = $element->getProp("height",0))) { $elemHeight = $heightAttr; } else { $bottomAttr = $element->getProp("bottom",0); $elemHeight = $height - $bottomAttr - $element->getProp("top",0); } // printf("render[%s] at {%dx%d}→{%dx%d}\n", get_class($element), $xOffs, $yOffs, $xOffs+$elemWidth, $yOffs+$elemHeight); $element->drawElement($gd, $xOffs, $yOffs, $elemWidth, $elemHeight, $params); foreach ($element->getChildren() as $child) { $this->renderElement($gd, $child, $xOffs, $yOffs, $elemWidth, $elemHeight, $params); } } }