getSize(); echo "Matrix: {$size}x{$size}\n\n"; // Generate SVG manually to ensure correct structure $moduleSize = 20; $quietZone = 80; $canvasSize = $size * $moduleSize + 2 * $quietZone; $svg = "\n"; $svg .= "\n"; $svg .= " QR Code\n"; $svg .= " QR Code Version 1\n"; $svg .= " \n"; // Render all dark modules for ($row = 0; $row < $size; $row++) { for ($col = 0; $col < $size; $col++) { if ($matrix->getModuleAt($row, $col)->isDark()) { $x = $quietZone + $col * $moduleSize; $y = $quietZone + $row * $moduleSize; $svg .= " \n"; } } } $svg .= "\n"; // Save $filepath = __DIR__ . '/test-qrcodes/simple-manual.svg'; file_put_contents($filepath, $svg); echo "✅ Generated simple manual SVG: {$filepath}\n"; echo " Canvas: {$canvasSize}x{$canvasSize}\n"; echo " Module size: {$moduleSize}px\n"; echo " Quiet zone: {$quietZone}px\n\n"; // Compare with renderer output $style = QrCodeStyle::large(); $renderer = new QrCodeRenderer(); $rendererSvg = $renderer->renderCustom($matrix, $style, false); $rendererPath = __DIR__ . '/test-qrcodes/renderer-output.svg'; file_put_contents($rendererPath, $rendererSvg); echo "✅ Generated renderer SVG: {$rendererPath}\n\n"; // Compare structure echo "=== Structure Comparison ===\n"; // Count rectangles $manualRects = substr_count($svg, '