75 lines
2.2 KiB
PHP
75 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace NoccyLabs\GdLabel;
|
|
|
|
use NoccyLabs\GdLabel\Loader\XmlLoader;
|
|
|
|
class Renderer
|
|
{
|
|
|
|
|
|
public function renderFile($inputFile, array $params=[], $output=null)
|
|
{
|
|
|
|
$loader = new XmlLoader();
|
|
$label = $loader->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);
|
|
}
|
|
}
|
|
} |