php-gdlabel/src/Renderer.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);
}
}
}