Skip to content

Commit

Permalink
Fix renderers interpreting percentages as pixels
Browse files Browse the repository at this point in the history
  • Loading branch information
meyfa committed Nov 12, 2016
1 parent fcae18c commit 35ab405
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 21 deletions.
8 changes: 4 additions & 4 deletions src/Rasterization/Renderers/SVGEllipseRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ class SVGEllipseRenderer extends SVGRenderer
protected function prepareRenderParams(SVGRasterizer $rasterizer, array $options)
{
return array(
'cx' => $options['cx'] * $rasterizer->getScaleX(),
'cy' => $options['cy'] * $rasterizer->getScaleY(),
'width' => $options['rx'] * 2 * $rasterizer->getScaleX(),
'height' => $options['ry'] * 2 * $rasterizer->getScaleY(),
'cx' => self::prepareLengthX($options['cx'], $rasterizer),
'cy' => self::prepareLengthY($options['cy'], $rasterizer),
'width' => self::prepareLengthX($options['rx'], $rasterizer) * 2,
'height' => self::prepareLengthY($options['ry'], $rasterizer) * 2,
);
}

Expand Down
8 changes: 4 additions & 4 deletions src/Rasterization/Renderers/SVGLineRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ class SVGLineRenderer extends SVGRenderer
protected function prepareRenderParams(SVGRasterizer $rasterizer, array $options)
{
return array(
'x1' => $options['x1'] * $rasterizer->getScaleX(),
'y1' => $options['y1'] * $rasterizer->getScaleY(),
'x2' => $options['x2'] * $rasterizer->getScaleX(),
'y2' => $options['y2'] * $rasterizer->getScaleY(),
'x1' => self::prepareLengthX($options['x1'], $rasterizer),
'y1' => self::prepareLengthY($options['y1'], $rasterizer),
'x2' => self::prepareLengthX($options['x2'], $rasterizer),
'y2' => self::prepareLengthY($options['y2'], $rasterizer),
);
}

Expand Down
8 changes: 4 additions & 4 deletions src/Rasterization/Renderers/SVGRectRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ class SVGRectRenderer extends SVGRenderer
{
protected function prepareRenderParams(SVGRasterizer $rasterizer, array $options)
{
$x1 = $options['x'] * $rasterizer->getScaleX();
$y1 = $options['y'] * $rasterizer->getScaleY();
$w = $options['width'] * $rasterizer->getScaleX();
$h = $options['height'] * $rasterizer->getScaleY();
$x1 = self::prepareLengthX($options['x'], $rasterizer);
$y1 = self::prepareLengthY($options['y'], $rasterizer);
$w = self::prepareLengthX($options['width'], $rasterizer);
$h = self::prepareLengthY($options['height'], $rasterizer);

return array(
'x1' => $x1,
Expand Down
32 changes: 24 additions & 8 deletions src/Rasterization/Renderers/SVGRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public function render(SVGRasterizer $rasterizer, array $options, SVGNode $conte
if (isset($stroke) && $stroke !== 'none') {
$stroke = self::prepareColor($stroke, $context);
$strokeWidth = $context->getComputedStyle('stroke-width');
$strokeWidth = self::prepareLength($strokeWidth, $rasterizer);
$strokeWidth = self::prepareLengthX($strokeWidth, $rasterizer);

$this->renderStroke($image, $params, $stroke, $strokeWidth);
}
Expand Down Expand Up @@ -128,19 +128,35 @@ private static function calculateTotalOpacity(SVGNode $node)


/**
* Parses the length string and multiplies it with the rasterizer's scale.
* Parses the length string in relation to the rasterizer's X dimension.
*
* @param string $len The CSS length string.
* @param SVGRasterizer $rasterizer The rasterizer for scaling the length.
* @param string $len The CSS length string.
* @param SVGRasterizer $ras The rasterizer for scaling the length.
*
* @return float The parsed and scaled length, in pixels.
*/
private static function prepareLength($len, SVGRasterizer $rasterizer)
protected static function prepareLengthX($len, SVGRasterizer $ras)
{
$docWidth = $rasterizer->getDocumentWidth();
$scaleX = $rasterizer->getScaleX();
$doc = $ras->getDocumentWidth();
$scale = $ras->getScaleX();

return SVG::convertUnit($len, $docWidth) * $scaleX;
return SVG::convertUnit($len, $doc) * $scale;
}

/**
* Parses the length string in relation to the rasterizer's Y dimension.
*
* @param string $len The CSS length string.
* @param SVGRasterizer $ras The rasterizer for scaling the length.
*
* @return float The parsed and scaled length, in pixels.
*/
protected static function prepareLengthY($len, SVGRasterizer $ras)
{
$doc = $ras->getDocumentWidth();
$scale = $ras->getScaleY();

return SVG::convertUnit($len, $doc) * $scale;
}


Expand Down
2 changes: 1 addition & 1 deletion src/SVG.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public static function convertUnit($unit, $viewLength)
}

$num = floatval($matches[1]);
$unit = $matches[2];
$unit = isset($matches[2]) ? $matches[2] : null;

if ($unit === 'px' || $unit === null) {
return $num;
Expand Down

0 comments on commit 35ab405

Please sign in to comment.