smiley 1 year ago
parent
commit
de3d321b00

+ 2 - 1
README.md

@@ -61,8 +61,9 @@ It also features a QR Code reader based on a [PHP port](https://github.com/khana
     - [`ext-imagick`](https://github.com/Imagick/imagick) with [ImageMagick](https://imagemagick.org) installed
       - [`ext-fileinfo`](https://www.php.net/manual/book.fileinfo.php) (required by `QRImagick` output)
     - [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module
+    - [`intervention/image`](https://github.com/Intervention/image) for alternative GD/ImageMagick output
 
-For the QRCode reader, either `ext-gd` or `ext-imagick` is required!
+For the QR Code reader, either `ext-gd` or `ext-imagick` is required!
 
 
 # Documentation

+ 3 - 13
docs/Built-In-Output/QREps.md

@@ -1,6 +1,7 @@
 # QREps
 
-[Class `QREps`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QREps.php): [Encapsulated Postscript](https://en.wikipedia.org/wiki/Encapsulated_PostScript) (EPS) output.
+[Class `QREps`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QREps.php):
+[Encapsulated Postscript](https://en.wikipedia.org/wiki/Encapsulated_PostScript) (EPS) output.
 
 
 ## Example
@@ -50,6 +51,7 @@ echo (new QRCode($options))->render($data);
 exit;
 ```
 
+
 ## Additional methods
 
 | method                                            | return   | description                                |
@@ -67,15 +69,3 @@ exit;
 | `$drawLightModules`   | `bool`  |
 | `$excludeFromConnect` | `array` |
 | `$scale`              | `int`   |
-
-
-### Options that have no effect
-
-| property               | reason          |
-|------------------------|-----------------|
-| `$circleRadius`        | not implemented |
-| `$drawCircularModules` | not implemented |
-| `$outputBase64`        | N/A             |
-| `$imageTransparent`    | N/A             |
-| `$keepAsSquare`        | not implemented |
-| `$returnResource`      | N/A             |

+ 2 - 13
docs/Built-In-Output/QRFpdf.md

@@ -1,6 +1,7 @@
 # QRFpdf
 
-[Class `QRFpdf`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRFpdf.php): [Portable Document Format](https://en.wikipedia.org/wiki/PDF) (PDF) output via [FPDF](https://github.com/setasign/fpdf)
+[Class `QRFpdf`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRFpdf.php):
+[Portable Document Format](https://en.wikipedia.org/wiki/PDF) (PDF) output via [FPDF](https://github.com/setasign/fpdf).
 
 
 ## Example
@@ -74,15 +75,3 @@ echo $fpdf->Output('S');
 | `$outputBase64`     | `bool`   |
 | `$returnResource`   | `bool`   |
 | `$scale`            | `ìnt`    |
-
-
-### Options that have no effect
-
-| property               | reason |
-|------------------------|--------|
-| `$circleRadius`        | N/A    |
-| `$connectPaths`        | N/A    |
-| `$drawCircularModules` | N/A    |
-| `$excludeFromConnect`  | N/A    |
-| `$imageTransparent`    | N/A    |
-| `$keepAsSquare`        | N/A    |

+ 12 - 18
docs/Built-In-Output/QRGdImage.md

@@ -1,6 +1,7 @@
 # QRGdImage
 
-[Class `QRGdImage`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRGdImage.php): [GdImage](https://www.php.net/manual/book.image) raster graphic output (GIF, JPG, PNG)
+[Class `QRGdImage`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRGdImage.php):
+[GdImage](https://www.php.net/manual/book.image) raster graphic output (GIF, JPG, PNG, ...)
 
 
 ## Example
@@ -51,12 +52,12 @@ printf('<img alt="%s" src="%s" />', $alt, $out);
 ```
 
 
-Return the `GdImage` instance/resource (will ignore other output options):
+Return the `GdImage` instance (will ignore other output options):
 
 ```php
 $options->returnResource = true;
 
-/** @var \GdImage|resource $gdImage */
+/** @var \GdImage $gdImage */
 $gdImage = (new QRCode($options))->render($data);
 
 // do stuff with the GdImage instance...
@@ -73,13 +74,14 @@ imagedestroy($gdImage);
 
 ## Additional methods
 
-| method                                            | return   | description                                                       |
-|---------------------------------------------------|----------|-------------------------------------------------------------------|
-| (protected) `drawImage()`                         | `void`   | Draws the QR image                                                |
-| (protected) `dumpImage()`                         | `string` | Creates the final image by calling the desired GD output function |
-| (protected) `module(int $x, int $y, int $M_TYPE)` | `void`   | Renders a single module                                           |
-| (protected) `setBgColor()`                        | `void`   | Sets the background color                                         |
-| (protected) `setTransparencyColor()`              | `void`   | Sets the transparency color                                       |
+| method                                            | return   | description                                                                                      |
+|---------------------------------------------------|----------|--------------------------------------------------------------------------------------------------|
+| (protected) `drawImage()`                         | `void`   | Draws the QR image                                                                               |
+| (protected) `dumpImage()`                         | `string` | Creates the final image by calling the desired GD output function                                |
+| (protected) `module(int $x, int $y, int $M_TYPE)` | `void`   | Renders a single module                                                                          |
+| (protected) `setBgColor()`                        | `void`   | Sets the background color                                                                        |
+| (protected) `setTransparencyColor()`              | `void`   | Sets the transparency color                                                                      |
+| (abstract protected) `renderImage()`              | `void`   | Renders the image with the gdimage function for the desired output, implemented by child classes |
 
 
 ## Options that affect this module
@@ -97,11 +99,3 @@ imagedestroy($gdImage);
 | `$returnResource`      | `bool`         |
 | `$scale`               | `int`          |
 | `$transparencyColor`   | `mixed`        |
-
-
-### Options that have no effect
-
-| property              | reason |
-|-----------------------|--------|
-| `$connectPaths`       | N/A    |
-| `$excludeFromConnect` | N/A    |

+ 0 - 8
docs/Built-In-Output/QRImagick.md

@@ -102,11 +102,3 @@ echo $imagick->getImageBlob();
 | `$returnResource`      | `bool`   |
 | `$scale`               | `int`    |
 | `$transparencyColor`   | `mixed`  |
-
-
-### Options that have no effect
-
-| property              | reason |
-|-----------------------|--------|
-| `$connectPaths`       | N/A    |
-| `$excludeFromConnect` | N/A    |

+ 102 - 0
docs/Built-In-Output/QRInterventionImage.md

@@ -0,0 +1,102 @@
+# QRInterventionImage
+
+[Class `QRInterventionImage`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRInterventionImage.php):
+[intervention/image](https://image.intervention.io/) alternative GD/ImageMagick output.
+
+***Note:** this output class works significantly slower than the native GD/Imagick output classes due to the several underlying abstraction layers. Use only if you must.*
+
+
+## Example
+
+See: [intervention/image example](https://github.com/chillerlan/php-qrcode/blob/main/examples/intervention-image.php)
+
+Set the options:
+
+```php
+$options = new QROptions;
+
+$options->outputInterface     = QRInterventionImage::class;
+$options->scale               = 20;
+$options->bgColor             = '#ccccaa';
+$options->imageTransparent    = false;
+$options->transparencyColor   = '#ccccaa';
+$options->drawLightModules    = false;
+$options->drawCircularModules = true;
+$options->circleRadius        = 0.4;
+$options->keepAsSquare        = [
+	QRMatrix::M_FINDER_DARK,
+	QRMatrix::M_FINDER_DOT,
+	QRMatrix::M_ALIGNMENT_DARK,
+];
+$options->moduleValues        = [
+	QRMatrix::M_FINDER_DARK    => '#A71111', // dark (true)
+	QRMatrix::M_FINDER_DOT     => '#A71111', // finder dot, dark (true)
+	QRMatrix::M_FINDER         => '#FFBFBF', // light (false)
+	QRMatrix::M_ALIGNMENT_DARK => '#A70364',
+	QRMatrix::M_ALIGNMENT      => '#FFC9C9',
+	QRMatrix::M_VERSION_DARK   => '#650098',
+	QRMatrix::M_VERSION        => '#E0B8FF',
+];
+```
+
+
+Render the output:
+
+```php
+$data = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
+$out  = (new QRCode($options))->render($data); // -> data:image/png;base64,...
+
+printf('<img alt="%s" src="%s" />', $alt, $out);
+```
+
+
+Return the `ImageInterface` instance (will ignore other output options):
+
+```php
+$options->returnResource = true;
+
+/** @var \Intervention\Image\Interfaces\ImageInterface $image */
+$image = (new QRCode($options))->render($data);
+
+// do stuff with the ImageInterface instance...
+
+// ...dump output
+
+header('Content-type: image/png');
+
+echo $image->toPng()->toString();
+```
+
+Set a different driver in the internal `ImageManager` instance (the internal detection order is: 1. GD, 2. Imagick):
+
+```php
+$qrOutputInterface = new QRInterventionImage($options, $matrix);
+// set a different driver
+$qrOutputInterface->setDriver(new \Intervention\Image\Drivers\Imagick\Driver);
+// dump output
+$out = $qrOutputInterface->dump();
+```
+
+
+## Additional methods
+
+| method                               | return   | description                                                                                                          |
+|--------------------------------------|----------|----------------------------------------------------------------------------------------------------------------------|
+| `setDriver(DriverInterface $driver)` | `static` | Sets a DriverInterface, see [instantiation (intervention.io)](https://image.intervention.io/v3/basics/instantiation) |
+| (protected) `module()`               | `void`   | Draws a single pixel at the given position                                                                           |
+
+
+## Options that affect this module
+
+| property               | type     |
+|------------------------|----------|
+| `$bgColor`             | `mixed`  |
+| `$circleRadius`        | `float`  |
+| `$drawCircularModules` | `bool`   |
+| `$drawLightModules`    | `bool`   |
+| `$imageTransparent`    | `bool`   |
+| `$keepAsSquare`        | `array`  |
+| `$outputBase64`        | `bool`   |
+| `$returnResource`      | `bool`   |
+| `$scale`               | `int`    |
+| `$transparencyColor`   | `mixed`  |

+ 7 - 14
docs/Built-In-Output/QRMarkupSVG.md

@@ -1,10 +1,12 @@
 # QRMarkupSVG
 
-[Class `QRMarkupSVG`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRMarkupSVG.php): [Scalable Vector Graphics](https://developer.mozilla.org/en-US/docs/Glossary/SVG) (SVG) output
+[Class `QRMarkupSVG`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRMarkupSVG.php):
+[Scalable Vector Graphics](https://developer.mozilla.org/en-US/docs/Glossary/SVG) (SVG) output.
+
 
 ## Example
 
-See: [ImageMagick example](https://github.com/chillerlan/php-qrcode/blob/main/examples/imagick.php)
+See: [SVG example](https://github.com/chillerlan/php-qrcode/blob/main/examples/svg.php)
 
 Set the options:
 
@@ -62,13 +64,14 @@ printf('<img alt="%s" src="%s" />', $alt, $out);
 | method                                            | return   | description                                                   |
 |---------------------------------------------------|----------|---------------------------------------------------------------|
 | (protected) `getCssClass(int $M_TYPE = 0)`        | `string` | returns a string with all css classes for the current element |
+| (protected) `getViewBox()`                        | `string` | returns the value for the SVG viewBox attribute               |
 | (protected) `header()`                            | `string` | returns the `<svg>` header with the given options parsed      |
-| (protected) `module(int $x, int $y, int $M_TYPE)` | `string` | returns a path segment for a single module                    |
 | (protected) `path(string $path, int $M_TYPE)`     | `string` | renders and returns a single `<path>` element                 |
 | (protected) `paths()`                             | `string` | returns one or more SVG `<path>` elements                     |
+| (protected) `module(int $x, int $y, int $M_TYPE)` | `string` | returns a path segment for a single module                    |
 
 
-## Options that affect this module
+## Options that affect this class
 
 | property                  | type        |
 |---------------------------|-------------|
@@ -87,13 +90,3 @@ printf('<img alt="%s" src="%s" />', $alt, $out);
 | `$svgPreserveAspectRatio` | `string`    |
 | `$svgViewBoxSize`         | `int\|null` |
 | `$svgUseFillAttributes`   | `bool`      |
-
-
-### Options that have no effect
-
-| property            | reason                                                                                                                                                                                                            |
-|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `$bgColor`          | background color can be achieved via CSS, attributes or the `<defs>` element, see also [php-qrcode/discussions/199 (comment)](https://github.com/chillerlan/php-qrcode/discussions/199#discussioncomment-5747471) |
-| `$imageTransparent` | SVG is - similar to a HTML element - transparent by default                                                                                                                                                       |
-| `$returnResource`   | N/A                                                                                                                                                                                                               |
-| `$scale`            | `$scale` (pixel size of a qr module) is intended for raster image types, use `$svgViewBoxSize` instead                                                                                                            |

+ 104 - 0
docs/Built-In-Output/QRMarkupXML.md

@@ -0,0 +1,104 @@
+# QRMarkupXML
+
+[Class `QRMarkupXML`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRMarkupXML.php): [eXtensible Markup Language](https://developer.mozilla.org/en-US/docs/Glossary/XML) (XML) output
+
+
+## Example
+
+See: [XML example](https://github.com/chillerlan/php-qrcode/blob/main/examples/xml.php)
+
+Set the options:
+
+```php
+$options = new QROptions;
+
+$options->outputInterface  = QRMarkupXML::class;
+$options->outputBase64     = false;
+// if set to false, the light modules won't be included in the output
+$options->drawLightModules = false;
+
+// assign an XSLT stylesheet
+$options->xmlStylesheet    = './qrcode.style.xsl';
+
+$options->moduleValues     = [
+	QRMatrix::M_FINDER_DARK    => '#A71111', // dark (true)
+	QRMatrix::M_FINDER_DOT     => '#A71111', // finder dot, dark (true)
+	QRMatrix::M_FINDER         => '#FFBFBF', // light (false)
+	QRMatrix::M_ALIGNMENT_DARK => '#A70364',
+	QRMatrix::M_ALIGNMENT      => '#FFC9C9',
+	QRMatrix::M_VERSION_DARK   => '#650098',
+	QRMatrix::M_VERSION        => '#E0B8FF',
+];
+```
+
+
+The XSLT stylesheet `qrcode.style.xsl`:
+
+```XSLT
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- XSLT style for the XML output example -->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+	<xsl:template match="/">
+		<!-- SVG header -->
+		<svg xmlns="http://www.w3.org/2000/svg"
+		     version="1.0"
+		     viewBox="0 0 {qrcode/matrix/@width} {qrcode/matrix/@height}"
+		     preserveAspectRatio="xMidYMid"
+		>
+			<!--
+				path for a single module
+				we could define a path for each layer and use the @layer attribute for selection,
+				but that would exaggerate this example
+			-->
+			<symbol id="module" width="1" height="1">
+				<circle cx="0.5" cy="0.5" r="0.4" />
+			</symbol>
+			<!-- loop over the rows -->
+			<xsl:for-each select="qrcode/matrix/row">
+				<!-- set a variable for $y (vertical) -->
+				<xsl:variable name="y" select="@y"/>
+				<xsl:for-each select="module">
+					<!-- set a variable for $x (horizontal) -->
+					<xsl:variable name="x" select="@x"/>
+					<!-- draw only dark modules -->
+					<xsl:if test="@dark='true'">
+						<!-- position the module and set its fill color -->
+						<use href="#module" class="{@layer}" x="{$x}" y="{$y}" fill="{@value}"/>
+					</xsl:if>
+				</xsl:for-each>
+			</xsl:for-each>
+		</svg>
+	</xsl:template>
+</xsl:stylesheet>
+```
+
+
+Render the output:
+
+```php
+$data = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
+$out  = (new QRCode($options))->render($data); // -> XML, rendered as SVG
+
+printf('<img alt="%s" src="%s" />', $alt, $out);
+```
+
+The associated [XML schema](https://www.w3.org/XML/Schema) can be found over at GitHub: [`qrcode.schema.xsd`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/qrcode.schema.xsd)
+
+
+## Additional methods
+
+| method                                            | return             | description                               |
+|---------------------------------------------------|--------------------|-------------------------------------------|
+| (protected) `createMatrix()`                      | `DOMElement`       | creates the matrix element                |
+| (protected) `row(int $y, array $row)`             | `DOMElement\|null` | creates a DOM element for a matrix row    |
+| (protected) `module(int $x, int $y, int $M_TYPE)` | `DOMElement\|null` | creates a DOM element for a single module |
+
+
+## Options that affect this class
+
+| property                  | type     |
+|---------------------------|----------|
+| `$drawLightModules`       | `bool`   |
+| `$outputBase64`           | `bool`   |
+| `xmlStylesheet`           | `string` |

+ 0 - 98
docs/Built-In-Output/QRString.md

@@ -1,98 +0,0 @@
-# QRString
-
-[Class `QRString`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRString.php): String output: plain text, [JSON](https://developer.mozilla.org/en-US/docs/Glossary/JSON)
-
-## Plain text
-
-Render in a CLI console, using [ANSI colors](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) and [block elements](https://en.wikipedia.org/wiki/Block_Elements):
-
-```php
-// a little helper to a create proper ANSI 8-bit color escape sequence
-function ansi8(string $str, int $color, bool $background = false):string{
-	$color      = max(0, min($color, 255));
-	$background = ($background ? 48 : 38);
-
-	return sprintf("\x1b[%s;5;%sm%s\x1b[0m", $background, $color, $str);
-}
-
-$options = new QROptions;
-
-$options->outputInterface = QRStringText::class;
-$options->eol             = "\n";
-// add some space on the line start
-$options->textLineStart   = str_repeat(' ', 6);
-// default values for unassigned module types
-$options->textDark        = QRStringText::ansi8('██', 253);
-$options->textLight       = QRStringText::ansi8('░░', 253);
-$options->moduleValues    = [
-	QRMatrix::M_FINDER_DARK    => QRStringText::ansi8('██', 124),
-	QRMatrix::M_FINDER         => QRStringText::ansi8('░░', 124),
-	QRMatrix::M_FINDER_DOT     => QRStringText::ansi8('██', 124),
-	QRMatrix::M_ALIGNMENT_DARK => QRStringText::ansi8('██', 2),
-	QRMatrix::M_ALIGNMENT      => QRStringText::ansi8('░░', 2),
-	QRMatrix::M_VERSION_DARK   => QRStringText::ansi8('██', 21),
-	QRMatrix::M_VERSION        => QRStringText::ansi8('░░', 21),
-];
-```
-
-
-Output:
-
-```php
-$data   = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
-$qrcode = (new QRCode($options))->render($data);
-
-echo "\n\n$qrcode\n\n";
-```
-
-
-## JSON
-
-```php
-$options = new QROptions;
-
-$options->outputType     = QROutputInterface::STRING_JSON;
-// output the integer values ($M_TYPE) held in the matrix object
-$options->jsonAsBooleans = false;
-
-header('Content-type: application/json');
-
-echo (new QRCode($options))->render($data);
-```
-
-
-## Additional methods
-
-| method                                                    | return   | description                                                         |
-|-----------------------------------------------------------|----------|---------------------------------------------------------------------|
-| (protected) `text()`                                      | `string` | string output                                                       |
-| (protected) `json()`                                      | `string` | JSON output                                                         |
-| `ansi8(string $str, int $color, bool $background = null)` | `string` | a little helper to create a proper ANSI 8-bit color escape sequence |
-
-
-## Options that affect this module
-
-| property          | type     |
-|-------------------|----------|
-| `$eol`            | `string` |
-| `$jsonAsBooleans` | `bool`   |
-| `$textDark`       | `string` |
-| `$textLight`      | `string` |
-| `$textLineStart`  | `string` |
-
-
-### Options that have no effect
-
-| property               | reason          |
-|------------------------|-----------------|
-| `$bgColor`             | N/A             |
-| `$circleRadius`        | N/A             |
-| `$connectPaths`        | N/A             |
-| `$drawCircularModules` | N/A             |
-| `$drawLightModules`    | not implemented |
-| `$excludeFromConnect`  | N/A             |
-| `$imageTransparent`    | N/A             |
-| `$keepAsSquare`        | N/A             |
-| `$outputBase64`        | N/A             |
-| `$returnResource`      | N/A             |
-| `$scale`               | N/A             |

+ 50 - 0
docs/Built-In-Output/QRStringJSON.md

@@ -0,0 +1,50 @@
+# QRStringJSON
+
+[Class `QRStringJSON`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRStringJSON.php):
+[JSON](https://developer.mozilla.org/en-US/docs/Glossary/JSON) output.
+
+
+## Example
+
+```php
+$options = new QROptions;
+
+$options->outputType = QROutputInterface::STRING_JSON;
+$options->jsonFlags  = JSON_THROW_ON_ERROR|JSON_UNESCAPED_SLASHES;
+
+header('Content-type: application/json');
+
+$data   = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
+
+echo (new QRCode($options))->render($data); // -> JSON string
+```
+
+The associated [JSON schema](https://json-schema.org/specification) can be found over at GitHub: [`qrcode.schema.json`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/qrcode.schema.json)
+
+
+## Previous functionality
+
+The previous versions of `php-qrcode` (v5 and earlier) just dumped an array representation of the internal matrix,
+which is equivalent to the following:
+
+```php
+$matrix = (new QRCode($options))->getQRMatrix(); // -> QRMatrix instance
+
+// retrieve the internal matrix as an array of booleans
+$json   = json_encode($matrix->getMatrix(true), $jsonFlags);
+```
+
+
+## Additional methods
+
+| method                                            | return        | description                               |
+|---------------------------------------------------|---------------|-------------------------------------------|
+| (protected) `row(int $y, array $row)`             | `array\|null` | creates a DOM element for a matrix row    |
+| (protected) `module(int $x, int $y, int $M_TYPE)` | `array\|null` | creates a DOM element for a single module |
+
+
+## Options that affect this class
+
+| property     | type  |
+|--------------|-------|
+| `$jsonFlags` | `int` |

+ 57 - 0
docs/Built-In-Output/QRStringText.md

@@ -0,0 +1,57 @@
+# QRStringText
+
+[Class `QRStringText`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRStringText.php):
+render in a CLI console, using [ANSI colors](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) and [block elements](https://en.wikipedia.org/wiki/Block_Elements).
+
+
+## Example
+
+See: [plaintext example](https://github.com/chillerlan/php-qrcode/blob/main/examples/text.php)
+
+```php
+$options = new QROptions;
+
+$options->outputInterface = QRStringText::class;
+$options->eol             = "\n";
+// add some space on the line start
+$options->textLineStart   = str_repeat(' ', 6);
+// default values for unassigned module types
+$options->textDark        = QRStringText::ansi8('██', 253);
+$options->textLight       = QRStringText::ansi8('░░', 253);
+$options->moduleValues    = [
+	QRMatrix::M_FINDER_DARK    => QRStringText::ansi8('██', 124),
+	QRMatrix::M_FINDER         => QRStringText::ansi8('░░', 124),
+	QRMatrix::M_FINDER_DOT     => QRStringText::ansi8('██', 124),
+	QRMatrix::M_ALIGNMENT_DARK => QRStringText::ansi8('██', 2),
+	QRMatrix::M_ALIGNMENT      => QRStringText::ansi8('░░', 2),
+	QRMatrix::M_VERSION_DARK   => QRStringText::ansi8('██', 21),
+	QRMatrix::M_VERSION        => QRStringText::ansi8('░░', 21),
+];
+```
+
+
+Output:
+
+```php
+$data   = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
+$qrcode = (new QRCode($options))->render($data);
+
+echo "\n\n$qrcode\n\n";
+```
+
+
+## Additional methods
+
+| method                                                    | return   | description                                                         |
+|-----------------------------------------------------------|----------|---------------------------------------------------------------------|
+| `ansi8(string $str, int $color, bool $background = null)` | `string` | a little helper to create a proper ANSI 8-bit color escape sequence |
+
+
+## Options that affect this class
+
+| property          | type     |
+|-------------------|----------|
+| `$eol`            | `string` |
+| `$textDark`       | `string` |
+| `$textLight`      | `string` |
+| `$textLineStart`  | `string` |

+ 4 - 1
docs/Readme.md

@@ -77,9 +77,12 @@ The markdown sources for the [Read the Docs online manual](https://php-qrcode.re
 - [QRFpdf](./Built-In-Output/QRFpdf.md)
 - [QRGdImage](./Built-In-Output/QRGdImage.md)
 - [QRImagick](./Built-In-Output/QRImagick.md)
+- [QRInterventionImage](./Built-In-Output/QRInterventionImage.md)
 - [QRMarkupHTML](./Built-In-Output/QRMarkupHTML.md)
 - [QRMarkupSVG](./Built-In-Output/QRMarkupSVG.md)
-- [QRString](./Built-In-Output/QRString.md)
+- [QRMarkupXML](./Built-In-Output/QRMarkupXML.md)
+- [QRStringText](./Built-In-Output/QRStringText.md)
+- [QRStringJSON](./Built-In-Output/QRStringJSON.md)
 
 
 ### Appendix

+ 10 - 5
docs/Usage/Configuration-settings.md

@@ -408,11 +408,6 @@ Sets the flags to use for the `json_encode()` call
 - [www.php.net/manual/json.constants.php](https://www.php.net/manual/json.constants.php)
 
 
-## jsonAsBooleans
-
-Whether to return matrix values in JSON as booleans or `$M_TYPE` integers
-
-
 ## fpdfMeasureUnit
 
 Measurement unit for `FPDF` output: `pt`, `mm`, `cm`, `in` (default: `pt`)
@@ -423,6 +418,16 @@ Measurement unit for `FPDF` output: `pt`, `mm`, `cm`, `in` (default: `pt`)
 - `FPDF::__construct()`
 
 
+## xmlStylesheet
+
+Sets an optional XSLT stylesheet in the XML output
+
+
+**See also:**
+
+- [developer.mozilla.org/en-US/docs/Web/XSLT](https://developer.mozilla.org/en-US/docs/Web/XSLT)
+
+
 ## readerUseImagickIfAvailable
 
 Use Imagick (if available) when reading QR Codes

+ 3 - 2
docs/Usage/Overview.md

@@ -28,13 +28,14 @@ It also features a QR Code reader based on a [PHP port](https://github.com/khana
 
 ## Requirements
 
-- PHP 7.4+
+- PHP 8.2+
   - [`ext-mbstring`](https://www.php.net/manual/book.mbstring.php)
   - optional:
-    - [`ext-fileinfo`](https://www.php.net/manual/book.fileinfo.php) (required by `QRImagick` output)
     - [`ext-gd`](https://www.php.net/manual/book.image)
     - [`ext-imagick`](https://github.com/Imagick/imagick) with [ImageMagick](https://imagemagick.org) installed
+      - [`ext-fileinfo`](https://www.php.net/manual/book.fileinfo.php) (required by `QRImagick` output)
     - [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module
+    - [`intervention/image`](https://github.com/Intervention/image) for alternative GD/ImageMagick output
 
 For the QR Code reader, either `ext-gd` or `ext-imagick` is required!
 

+ 4 - 1
docs/index.rst

@@ -38,9 +38,12 @@ This work is licensed under the Creative Commons Attribution 4.0 International (
    Built-In-Output/QRFpdf.md
    Built-In-Output/QRGdImage.md
    Built-In-Output/QRImagick.md
+   Built-In-Output/QRInterventionImage.md
    Built-In-Output/QRMarkupHTML.md
    Built-In-Output/QRMarkupSVG.md
-   Built-In-Output/QRString.md
+   Built-In-Output/QRMarkupXML.md
+   Built-In-Output/QRStringJSON.md
+   Built-In-Output/QRStringText.md
 
 .. toctree::
    :maxdepth: 3

+ 2 - 1
examples/Readme.md

@@ -6,10 +6,11 @@
 - [ImageMagick](./imagick.php): Raster Images via [ImageMagick](https://imagemagick.org/)
 - [SVG](./svg.php): [Scalable Vector Graphics](https://developer.mozilla.org/en-US/docs/Web/SVG)
 - [HTML](./html.php): HTML markup
-- [FPDF](./fpdf.php): PDF output via [FPDF](http://www.fpdf.org/)
+- [FPDF](./fpdf.php): PDF output, see http://www.fpdf.org/
 - [EPS](./eps.php): Encapsulated PostScript
 - [String](./text.php): String output
 - [XML](./xml.php): XML output (rendered as SVG via an [XSLT style](./qrcode.style.xsl))
+- [intervention/image](./intervention-image.php): alternative GD/ImageMagick output, see https://image.intervention.io/
 - [Multi mode](./multimode.php): a demostration of multi mode usage
 - [Reflectance](./reflectance.php): demonstrates reflectance reversal
 - [QRCode reader](./reader.php): a simple reader example