From fb48e26b6004ca8dee5002dfaa9ca9147f6ebef9 Mon Sep 17 00:00:00 2001 From: "Julio J." Date: Tue, 1 Oct 2024 10:51:42 -0300 Subject: [PATCH] fix(svg): generate unique IDs for gradients based on their properties (#187) Closes #186 --- src/Renderer/Image/SvgImageBackEnd.php | 6 +- test/Integration/SVGRenderingTest.php | 70 +++++++++++++++++++ ...SVGRenderingTest__testGenericQrCode__1.svg | 2 + ...ntIdsForDifferentGradients__horizontal.svg | 2 + ...rentIdsForDifferentGradients__vertical.svg | 2 + 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 test/Integration/SVGRenderingTest.php create mode 100644 test/Integration/__snapshots__/files/SVGRenderingTest__testGenericQrCode__1.svg create mode 100644 test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__horizontal.svg create mode 100644 test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__vertical.svg diff --git a/src/Renderer/Image/SvgImageBackEnd.php b/src/Renderer/Image/SvgImageBackEnd.php index 227afa7..44d014e 100644 --- a/src/Renderer/Image/SvgImageBackEnd.php +++ b/src/Renderer/Image/SvgImageBackEnd.php @@ -316,7 +316,11 @@ private function createGradientFill(Gradient $gradient, float $x, float $y, floa break; } - $id = sprintf('g%d', ++$this->gradientCount); + $toBeHashed = $this->getColorString($startColor) . $this->getColorString($endColor) . $gradient->getType(); + if ($startColor instanceof Alpha) { + $toBeHashed .= (string) $startColor->getAlpha(); + } + $id = sprintf('g%d-%s', ++$this->gradientCount, hash('xxh64', $toBeHashed)); $this->xmlWriter->writeAttribute('id', $id); $this->xmlWriter->startElement('stop'); diff --git a/test/Integration/SVGRenderingTest.php b/test/Integration/SVGRenderingTest.php new file mode 100644 index 0000000..2eb71d9 --- /dev/null +++ b/test/Integration/SVGRenderingTest.php @@ -0,0 +1,70 @@ +writeString('Hello World!'); + $expected = file_get_contents(__DIR__.'/__snapshots__/files/SVGRenderingTest__testGenericQrCode__1.svg'); + + $this->assertEquals($expected, $svgCode); + } + + // SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients_horizontal + //SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients_vertical + public function testQrWithGradientGeneratesDifferentIdsForDifferentGradients() + { + $types = ['HORIZONTAL', 'VERTICAL']; + foreach ($types as $type) { + $gradient = new Gradient( + new Rgb(0, 0, 0), + new Rgb(255, 0, 0), + GradientType::$type() + ); + $renderer = new ImageRenderer( + new RendererStyle( + size: 400, + fill: Fill::withForegroundGradient( + new Rgb(255, 255, 255), + $gradient, + EyeFill::inherit(), + EyeFill::inherit(), + EyeFill::inherit() + ) + ), + new SvgImageBackEnd() + ); + $writer = new Writer($renderer); + $qr = $writer->writeString('Hello World!'); + $expectedFile = __DIR__ . '/__snapshots__/files/'; + $expectedFile .= 'SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__'; + $expectedFile .= strtolower($type) . '.svg'; + $expected = file_get_contents($expectedFile); + + $this->assertEquals($expected, $qr); + } + } +} diff --git a/test/Integration/__snapshots__/files/SVGRenderingTest__testGenericQrCode__1.svg b/test/Integration/__snapshots__/files/SVGRenderingTest__testGenericQrCode__1.svg new file mode 100644 index 0000000..8c8607e --- /dev/null +++ b/test/Integration/__snapshots__/files/SVGRenderingTest__testGenericQrCode__1.svg @@ -0,0 +1,2 @@ + + diff --git a/test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__horizontal.svg b/test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__horizontal.svg new file mode 100644 index 0000000..aa79f5d --- /dev/null +++ b/test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__horizontal.svg @@ -0,0 +1,2 @@ + + diff --git a/test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__vertical.svg b/test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__vertical.svg new file mode 100644 index 0000000..60c25da --- /dev/null +++ b/test/Integration/__snapshots__/files/SVGRenderingTest__testQrWithGradientGeneratesDifferentIdsForDifferentGradients__vertical.svg @@ -0,0 +1,2 @@ + +