QROutputAbstract.html 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. <!DOCTYPE html>
  2. <html class="writer-html5" lang="en" data-content_root="../">
  3. <head>
  4. <meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>QROutputAbstract &mdash; PHP-QRCode main
  7. Manual</title>
  8. <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" />
  9. <link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=e59714d7" />
  10. <script src="../_static/jquery.js?v=5d32c60e"></script>
  11. <script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
  12. <script src="../_static/documentation_options.js?v=a8da1a53"></script>
  13. <script src="../_static/doctools.js?v=9bcbadda"></script>
  14. <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
  15. <script src="../_static/js/theme.js"></script>
  16. <link rel="index" title="Index" href="../genindex.html" />
  17. <link rel="search" title="Search" href="../search.html" />
  18. <link rel="next" title="Custom QROutputInterface" href="Custom-output-interface.html" />
  19. <link rel="prev" title="Module values" href="Module-Values.html" />
  20. </head>
  21. <body class="wy-body-for-nav">
  22. <div class="wy-grid-for-nav">
  23. <nav data-toggle="wy-nav-shift" class="wy-nav-side">
  24. <div class="wy-side-scroll">
  25. <div class="wy-side-nav-search" >
  26. <a href="../index.html" class="icon icon-home">
  27. PHP-QRCode
  28. </a>
  29. <div role="search">
  30. <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
  31. <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
  32. <input type="hidden" name="check_keywords" value="yes" />
  33. <input type="hidden" name="area" value="default" />
  34. </form>
  35. </div>
  36. </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
  37. <p class="caption" role="heading"><span class="caption-text">Usage</span></p>
  38. <ul>
  39. <li class="toctree-l1"><a class="reference internal" href="../Usage/Overview.html">Overview</a><ul>
  40. <li class="toctree-l2"><a class="reference internal" href="../Usage/Overview.html#features">Features</a></li>
  41. <li class="toctree-l2"><a class="reference internal" href="../Usage/Overview.html#requirements">Requirements</a></li>
  42. <li class="toctree-l2"><a class="reference internal" href="../Usage/Overview.html#framework-integration">Framework Integration</a></li>
  43. <li class="toctree-l2"><a class="reference internal" href="../Usage/Overview.html#shameless-advertising">Shameless advertising</a></li>
  44. </ul>
  45. </li>
  46. <li class="toctree-l1"><a class="reference internal" href="../Usage/Installation.html">Installation</a><ul>
  47. <li class="toctree-l2"><a class="reference internal" href="../Usage/Installation.html#installation-with-composer">Installation with Composer</a><ul>
  48. <li class="toctree-l3"><a class="reference internal" href="../Usage/Installation.html#composer-json">composer.json</a><ul>
  49. <li class="toctree-l4"><a class="reference internal" href="../Usage/Installation.html#version-switch">Version switch</a></li>
  50. </ul>
  51. </li>
  52. <li class="toctree-l3"><a class="reference internal" href="../Usage/Installation.html#terminal">Terminal</a></li>
  53. </ul>
  54. </li>
  55. <li class="toctree-l2"><a class="reference internal" href="../Usage/Installation.html#manual-installation">Manual installation</a><ul>
  56. <li class="toctree-l3"><a class="reference internal" href="../Usage/Installation.html#can-i-use-this-library-without-using-composer">Can I use this library without using composer?</a></li>
  57. </ul>
  58. </li>
  59. <li class="toctree-l2"><a class="reference internal" href="../Usage/Installation.html#supported-php-versions-extension-requirements">Supported PHP versions &amp; extension requirements</a></li>
  60. <li class="toctree-l2"><a class="reference internal" href="../Usage/Installation.html#imagemagick">ImageMagick</a></li>
  61. </ul>
  62. </li>
  63. <li class="toctree-l1"><a class="reference internal" href="../Usage/Quickstart.html">Quickstart</a><ul>
  64. <li class="toctree-l2"><a class="reference internal" href="../Usage/Quickstart.html#import-the-library">Import the library</a></li>
  65. <li class="toctree-l2"><a class="reference internal" href="../Usage/Quickstart.html#create-your-first-qr-code">Create your first QR Code</a><ul>
  66. <li class="toctree-l3"><a class="reference internal" href="../Usage/Quickstart.html#configuration">Configuration</a></li>
  67. </ul>
  68. </li>
  69. <li class="toctree-l2"><a class="reference internal" href="../Usage/Quickstart.html#reading-qr-codes">Reading QR Codes</a></li>
  70. <li class="toctree-l2"><a class="reference internal" href="../Usage/Quickstart.html#notes">Notes</a></li>
  71. </ul>
  72. </li>
  73. <li class="toctree-l1"><a class="reference internal" href="../Usage/Advanced-usage.html">Advanced usage</a><ul>
  74. <li class="toctree-l2"><a class="reference internal" href="../Usage/Advanced-usage.html#configuration-via-qroptions">Configuration via <code class="docutils literal notranslate"><span class="pre">QROptions</span></code></a><ul>
  75. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#supply-an-iterable-of-options">Supply an <code class="docutils literal notranslate"><span class="pre">iterable</span></code> of options</a></li>
  76. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#load-and-save-options-from-to-json">Load and save options from/to JSON</a></li>
  77. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#extending-the-qroptions-class">Extending the <code class="docutils literal notranslate"><span class="pre">QROptions</span></code> class</a></li>
  78. </ul>
  79. </li>
  80. <li class="toctree-l2"><a class="reference internal" href="../Usage/Advanced-usage.html#qrcode-methods"><code class="docutils literal notranslate"><span class="pre">QRCode</span></code> methods</a><ul>
  81. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#render-a-qrmatrix-instance">Render a <code class="docutils literal notranslate"><span class="pre">QRMatrix</span></code> instance</a></li>
  82. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#mixed-mode">Mixed mode</a></li>
  83. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#qr-code-reader">QR Code reader</a></li>
  84. </ul>
  85. </li>
  86. <li class="toctree-l2"><a class="reference internal" href="../Usage/Advanced-usage.html#common-output-options">Common output options</a><ul>
  87. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#save-to-file">Save to file</a></li>
  88. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#base64-uri-output">Base64 URI output</a></li>
  89. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#return-the-image-resource">Return the image resource</a></li>
  90. <li class="toctree-l3"><a class="reference internal" href="../Usage/Advanced-usage.html#add-a-logo-space">Add a logo space</a></li>
  91. </ul>
  92. </li>
  93. </ul>
  94. </li>
  95. <li class="toctree-l1"><a class="reference internal" href="../Usage/Configuration-settings.html">Configuration settings</a><ul>
  96. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#version">version</a></li>
  97. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#versionmin">versionMin</a></li>
  98. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#versionmax">versionMax</a></li>
  99. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#ecclevel">eccLevel</a></li>
  100. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#maskpattern">maskPattern</a></li>
  101. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#addquietzone">addQuietzone</a></li>
  102. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#quietzonesize">quietzoneSize</a></li>
  103. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#outputinterface">outputInterface</a></li>
  104. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#returnresource">returnResource</a></li>
  105. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#cachefile">cachefile</a></li>
  106. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#outputbase64">outputBase64</a></li>
  107. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#eol">eol</a></li>
  108. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#bgcolor">bgColor</a></li>
  109. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#invertmatrix">invertMatrix</a></li>
  110. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#drawlightmodules">drawLightModules</a></li>
  111. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#drawcircularmodules">drawCircularModules</a></li>
  112. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#circleradius">circleRadius</a></li>
  113. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#keepassquare">keepAsSquare</a></li>
  114. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#connectpaths">connectPaths</a></li>
  115. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#excludefromconnect">excludeFromConnect</a></li>
  116. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#modulevalues">moduleValues</a></li>
  117. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#addlogospace">addLogoSpace</a></li>
  118. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#logospacewidth">logoSpaceWidth</a></li>
  119. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#logospaceheight">logoSpaceHeight</a></li>
  120. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#logospacestartx">logoSpaceStartX</a></li>
  121. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#logospacestarty">logoSpaceStartY</a></li>
  122. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#scale">scale</a></li>
  123. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#imagetransparent">imageTransparent</a></li>
  124. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#transparencycolor">transparencyColor</a></li>
  125. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#quality">quality</a></li>
  126. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#gdimageuseupscale">gdImageUseUpscale</a></li>
  127. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#imagickformat">imagickFormat</a></li>
  128. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#cssclass">cssClass</a></li>
  129. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#svgaddxmlheader">svgAddXmlHeader</a></li>
  130. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#svgdefs">svgDefs</a></li>
  131. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#svgpreserveaspectratio">svgPreserveAspectRatio</a></li>
  132. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#svgusefillattributes">svgUseFillAttributes</a></li>
  133. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#textlinestart">textLineStart</a></li>
  134. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#jsonflags">jsonFlags</a></li>
  135. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#fpdfmeasureunit">fpdfMeasureUnit</a></li>
  136. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#xmlstylesheet">xmlStylesheet</a></li>
  137. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#readeruseimagickifavailable">readerUseImagickIfAvailable</a></li>
  138. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#readergrayscale">readerGrayscale</a></li>
  139. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#readerinvertcolors">readerInvertColors</a></li>
  140. <li class="toctree-l2"><a class="reference internal" href="../Usage/Configuration-settings.html#readerincreasecontrast">readerIncreaseContrast</a></li>
  141. </ul>
  142. </li>
  143. </ul>
  144. <p class="caption" role="heading"><span class="caption-text">Customizing output</span></p>
  145. <ul class="current">
  146. <li class="toctree-l1"><a class="reference internal" href="Module-Values.html">Module values</a><ul>
  147. <li class="toctree-l2"><a class="reference internal" href="Module-Values.html#basics">Basics</a></li>
  148. <li class="toctree-l2"><a class="reference internal" href="Module-Values.html#assigning-values">Assigning values</a></li>
  149. <li class="toctree-l2"><a class="reference internal" href="Module-Values.html#handling-in-your-own-qroutputinterface">Handling in your own <code class="docutils literal notranslate"><span class="pre">QROutputInterface</span></code></a><ul>
  150. <li class="toctree-l3"><a class="reference internal" href="Module-Values.html#setting-module-values">Setting module values</a></li>
  151. <li class="toctree-l3"><a class="reference internal" href="Module-Values.html#using-the-module-values">Using the module values</a></li>
  152. </ul>
  153. </li>
  154. </ul>
  155. </li>
  156. <li class="toctree-l1 current"><a class="current reference internal" href="#"><code class="docutils literal notranslate"><span class="pre">QROutputAbstract</span></code></a><ul>
  157. <li class="toctree-l2"><a class="reference internal" href="#properties">Properties</a><ul>
  158. <li class="toctree-l3"><a class="reference internal" href="#options-and-matrix"><code class="docutils literal notranslate"><span class="pre">$options</span></code> and <code class="docutils literal notranslate"><span class="pre">$matrix</span></code></a></li>
  159. <li class="toctree-l3"><a class="reference internal" href="#modulecount-scale-and-length"><code class="docutils literal notranslate"><span class="pre">$moduleCount</span></code>, <code class="docutils literal notranslate"><span class="pre">$scale</span></code> and <code class="docutils literal notranslate"><span class="pre">$length</span></code></a></li>
  160. <li class="toctree-l3"><a class="reference internal" href="#modulevalues"><code class="docutils literal notranslate"><span class="pre">$moduleValues</span></code></a></li>
  161. <li class="toctree-l3"><a class="reference internal" href="#copies-of-qroptions-values">Copies of <code class="docutils literal notranslate"><span class="pre">QROptions</span></code> values</a></li>
  162. </ul>
  163. </li>
  164. <li class="toctree-l2"><a class="reference internal" href="#methods">Methods</a><ul>
  165. <li class="toctree-l3"><a class="reference internal" href="#setmodulevalues"><code class="docutils literal notranslate"><span class="pre">setModuleValues()</span></code></a></li>
  166. <li class="toctree-l3"><a class="reference internal" href="#modulevalueisvalid"><code class="docutils literal notranslate"><span class="pre">moduleValueIsValid()</span></code></a></li>
  167. <li class="toctree-l3"><a class="reference internal" href="#preparemodulevalue"><code class="docutils literal notranslate"><span class="pre">prepareModuleValue()</span></code></a></li>
  168. <li class="toctree-l3"><a class="reference internal" href="#getdefaultmodulevalue"><code class="docutils literal notranslate"><span class="pre">getDefaultModuleValue()</span></code></a></li>
  169. <li class="toctree-l3"><a class="reference internal" href="#getmodulevalue-and-getmodulevalueat"><code class="docutils literal notranslate"><span class="pre">getModuleValue()</span></code> and <code class="docutils literal notranslate"><span class="pre">getModuleValueAt()</span></code></a></li>
  170. <li class="toctree-l3"><a class="reference internal" href="#setmatrixdimensions"><code class="docutils literal notranslate"><span class="pre">setMatrixDimensions()</span></code></a></li>
  171. <li class="toctree-l3"><a class="reference internal" href="#getoutputdimensions"><code class="docutils literal notranslate"><span class="pre">getOutputDimensions()</span></code></a></li>
  172. <li class="toctree-l3"><a class="reference internal" href="#collectmodules"><code class="docutils literal notranslate"><span class="pre">collectModules()</span></code></a></li>
  173. <li class="toctree-l3"><a class="reference internal" href="#savetofile-and-tobase64datauri"><code class="docutils literal notranslate"><span class="pre">saveToFile()</span></code> and <code class="docutils literal notranslate"><span class="pre">toBase64DataURI()</span></code></a></li>
  174. </ul>
  175. </li>
  176. </ul>
  177. </li>
  178. <li class="toctree-l1"><a class="reference internal" href="Custom-output-interface.html">Custom <code class="docutils literal notranslate"><span class="pre">QROutputInterface</span></code></a><ul>
  179. <li class="toctree-l2"><a class="reference internal" href="Custom-output-interface.html#class-skeleton">Class skeleton</a></li>
  180. <li class="toctree-l2"><a class="reference internal" href="Custom-output-interface.html#module-values">Module values</a></li>
  181. <li class="toctree-l2"><a class="reference internal" href="Custom-output-interface.html#transform-the-output">Transform the output</a></li>
  182. <li class="toctree-l2"><a class="reference internal" href="Custom-output-interface.html#run-the-custom-output">Run the custom output</a></li>
  183. <li class="toctree-l2"><a class="reference internal" href="Custom-output-interface.html#summary">Summary</a></li>
  184. </ul>
  185. </li>
  186. </ul>
  187. <p class="caption" role="heading"><span class="caption-text">Built-In Output Classes</span></p>
  188. <ul>
  189. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QREps.html">QREps</a><ul>
  190. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QREps.html#example">Example</a></li>
  191. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QREps.html#additional-methods">Additional methods</a></li>
  192. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QREps.html#options-that-affect-this-class">Options that affect this class</a></li>
  193. </ul>
  194. </li>
  195. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRFpdf.html">QRFpdf</a><ul>
  196. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRFpdf.html#example">Example</a></li>
  197. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRFpdf.html#additional-methods">Additional methods</a></li>
  198. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRFpdf.html#options-that-affect-this-class">Options that affect this class</a></li>
  199. </ul>
  200. </li>
  201. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRGdImage.html">QRGdImage</a><ul>
  202. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRGdImage.html#example">Example</a></li>
  203. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRGdImage.html#additional-methods">Additional methods</a></li>
  204. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRGdImage.html#options-that-affect-this-class">Options that affect this class</a></li>
  205. </ul>
  206. </li>
  207. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRImagick.html">QRImagick</a><ul>
  208. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRImagick.html#example">Example</a></li>
  209. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRImagick.html#additional-methods">Additional methods</a></li>
  210. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRImagick.html#options-that-affect-this-class">Options that affect this class</a></li>
  211. </ul>
  212. </li>
  213. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRInterventionImage.html">QRInterventionImage</a><ul>
  214. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRInterventionImage.html#example">Example</a></li>
  215. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRInterventionImage.html#additional-methods">Additional methods</a></li>
  216. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRInterventionImage.html#options-that-affect-this-class">Options that affect this class</a></li>
  217. </ul>
  218. </li>
  219. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRMarkupHTML.html">QRMarkupHTML</a><ul>
  220. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupHTML.html#example">Example</a></li>
  221. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupHTML.html#additional-methods">Additional methods</a></li>
  222. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupHTML.html#options-that-affect-this-class">Options that affect this class</a></li>
  223. </ul>
  224. </li>
  225. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRMarkupSVG.html">QRMarkupSVG</a><ul>
  226. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupSVG.html#example">Example</a></li>
  227. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupSVG.html#additional-methods">Additional methods</a></li>
  228. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupSVG.html#options-that-affect-this-class">Options that affect this class</a></li>
  229. </ul>
  230. </li>
  231. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRMarkupXML.html">QRMarkupXML</a><ul>
  232. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupXML.html#example">Example</a></li>
  233. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupXML.html#additional-methods">Additional methods</a></li>
  234. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRMarkupXML.html#options-that-affect-this-class">Options that affect this class</a></li>
  235. </ul>
  236. </li>
  237. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRStringJSON.html">QRStringJSON</a><ul>
  238. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringJSON.html#example">Example</a></li>
  239. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringJSON.html#previous-functionality">Previous functionality</a></li>
  240. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringJSON.html#additional-methods">Additional methods</a></li>
  241. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringJSON.html#options-that-affect-this-class">Options that affect this class</a></li>
  242. </ul>
  243. </li>
  244. <li class="toctree-l1"><a class="reference internal" href="../Built-In-Output/QRStringText.html">QRStringText</a><ul>
  245. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringText.html#example">Example</a></li>
  246. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringText.html#additional-methods">Additional methods</a></li>
  247. <li class="toctree-l2"><a class="reference internal" href="../Built-In-Output/QRStringText.html#options-that-affect-this-class">Options that affect this class</a></li>
  248. </ul>
  249. </li>
  250. </ul>
  251. <p class="caption" role="heading"><span class="caption-text">Appendix</span></p>
  252. <ul>
  253. <li class="toctree-l1"><a class="reference internal" href="../Appendix/Terminology.html">Terminology</a><ul>
  254. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#qr-code">QR Code</a></li>
  255. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#matrix">Matrix</a><ul>
  256. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#module">Module</a></li>
  257. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#version">Version</a></li>
  258. </ul>
  259. </li>
  260. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#function-patterns">Function Patterns</a><ul>
  261. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#finder-pattern">Finder Pattern</a></li>
  262. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#alignment-pattern">Alignment Pattern</a></li>
  263. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#timing-pattern">Timing Pattern</a></li>
  264. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#separators">Separators</a></li>
  265. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#quiet-zone">Quiet Zone</a></li>
  266. </ul>
  267. </li>
  268. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#encoding-region">Encoding Region</a><ul>
  269. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#data">Data</a></li>
  270. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#version-information">Version Information</a></li>
  271. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#format-information">Format Information</a></li>
  272. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#darkmodule">Darkmodule</a></li>
  273. </ul>
  274. </li>
  275. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#mode">Mode</a><ul>
  276. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#segment">Segment</a></li>
  277. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#extended-channel-interpretation-eci">Extended Channel Interpretation (ECI)</a></li>
  278. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#mixed-mode">Mixed Mode</a></li>
  279. </ul>
  280. </li>
  281. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#ecc-error-correction-coding">ECC (Error Correction Coding)</a><ul>
  282. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#ecc-level">ECC Level</a></li>
  283. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#maximum-data-capacity">Maximum data capacity</a></li>
  284. </ul>
  285. </li>
  286. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#data-masking">Data masking</a><ul>
  287. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#evaluation">Evaluation</a></li>
  288. <li class="toctree-l3"><a class="reference internal" href="../Appendix/Terminology.html#mask-pattern">Mask pattern</a></li>
  289. </ul>
  290. </li>
  291. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Terminology.html#reflectance">Reflectance</a></li>
  292. </ul>
  293. </li>
  294. <li class="toctree-l1"><a class="reference internal" href="../Appendix/URI-Content.html">Popular content and URI schemes</a><ul>
  295. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#url-https">URL <code class="docutils literal notranslate"><span class="pre">https</span></code></a></li>
  296. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#e-mail-mailto">E-Mail <code class="docutils literal notranslate"><span class="pre">mailto</span></code></a></li>
  297. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#phone-numbers-tel">Phone numbers <code class="docutils literal notranslate"><span class="pre">tel</span></code></a></li>
  298. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#geo-coordinates-geo">Geo Coordinates <code class="docutils literal notranslate"><span class="pre">geo</span></code></a></li>
  299. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#mobile-authenticators-otpauth">Mobile Authenticators <code class="docutils literal notranslate"><span class="pre">otpauth</span></code></a></li>
  300. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#wireless-network-configuration">Wireless Network configuration</a></li>
  301. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#contact-information-vcard">Contact information: vCard</a></li>
  302. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#calendar-events-vcalendar-and-icalendar">Calendar Events: vCalendar and iCalendar</a></li>
  303. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#credit-transfer">Credit Transfer</a><ul>
  304. <li class="toctree-l3"><a class="reference internal" href="../Appendix/URI-Content.html#sepa-european-payments-council">SEPA (European Payments Council)</a></li>
  305. <li class="toctree-l3"><a class="reference internal" href="../Appendix/URI-Content.html#pix-banco-central-do-brasil">Pix (Banco Central do Brasil)</a></li>
  306. </ul>
  307. </li>
  308. <li class="toctree-l2"><a class="reference internal" href="../Appendix/URI-Content.html#see-also">See also</a></li>
  309. </ul>
  310. </li>
  311. <li class="toctree-l1"><a class="reference internal" href="../Appendix/Performance-considerations.html">Performance considerations</a><ul>
  312. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Performance-considerations.html#version">Version</a></li>
  313. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Performance-considerations.html#ecc-level">Ecc level</a></li>
  314. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Performance-considerations.html#data-mode">Data mode</a></li>
  315. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Performance-considerations.html#mask-pattern">Mask pattern</a></li>
  316. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Performance-considerations.html#output">Output</a></li>
  317. </ul>
  318. </li>
  319. <li class="toctree-l1"><a class="reference internal" href="../Appendix/Contribute.html">How to contribute</a><ul>
  320. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Contribute.html#questions-and-issues">Questions and issues</a></li>
  321. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Contribute.html#bug-reports">Bug reports</a></li>
  322. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Contribute.html#pull-requests-and-bug-fixes">Pull requests and bug fixes</a></li>
  323. <li class="toctree-l2"><a class="reference internal" href="../Appendix/Contribute.html#documentation">Documentation</a></li>
  324. </ul>
  325. </li>
  326. <li class="toctree-l1"><a class="reference internal" href="../Appendix/License.html">License</a></li>
  327. </ul>
  328. </div>
  329. </div>
  330. </nav>
  331. <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
  332. <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
  333. <a href="../index.html">PHP-QRCode</a>
  334. </nav>
  335. <div class="wy-nav-content">
  336. <div class="rst-content">
  337. <div role="navigation" aria-label="Page navigation">
  338. <ul class="wy-breadcrumbs">
  339. <li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
  340. <li class="breadcrumb-item active"><code class="docutils literal notranslate"><span class="pre">QROutputAbstract</span></code></li>
  341. <li class="wy-breadcrumbs-aside">
  342. <a href="https://github.com/chillerlan/php-qrcode/blob/main/docs/Customizing/QROutputAbstract.md" class="fa fa-github"> Edit on GitHub</a>
  343. </li>
  344. </ul>
  345. <hr/>
  346. </div>
  347. <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
  348. <div itemprop="articleBody">
  349. <section id="qroutputabstract">
  350. <h1><code class="docutils literal notranslate"><span class="pre">QROutputAbstract</span></code><a class="headerlink" href="#qroutputabstract" title="Link to this heading"></a></h1>
  351. <p>The abstract class <code class="docutils literal notranslate"><span class="pre">QROutputAbstract</span></code> contains several commonly used methods and properties and can be used as a basis for a custom output class.</p>
  352. <section id="properties">
  353. <h2>Properties<a class="headerlink" href="#properties" title="Link to this heading"></a></h2>
  354. <section id="options-and-matrix">
  355. <h3><code class="docutils literal notranslate"><span class="pre">$options</span></code> and <code class="docutils literal notranslate"><span class="pre">$matrix</span></code><a class="headerlink" href="#options-and-matrix" title="Link to this heading"></a></h3>
  356. <p>The <code class="docutils literal notranslate"><span class="pre">QROptions</span></code> and <code class="docutils literal notranslate"><span class="pre">QRMatrix</span></code> instances that were passed to the constructor of the output class.
  357. Both objects can be modified during runtime, for example to override settings or add matrix modifications.</p>
  358. </section>
  359. <section id="modulecount-scale-and-length">
  360. <h3><code class="docutils literal notranslate"><span class="pre">$moduleCount</span></code>, <code class="docutils literal notranslate"><span class="pre">$scale</span></code> and <code class="docutils literal notranslate"><span class="pre">$length</span></code><a class="headerlink" href="#modulecount-scale-and-length" title="Link to this heading"></a></h3>
  361. <p>These are convenience variables mostly to avoid multiple method calls to <code class="docutils literal notranslate"><span class="pre">QRMatrix::getSize()</span></code> and <code class="docutils literal notranslate"><span class="pre">QROptions::__get('scale')</span></code> inside loops,
  362. the <code class="docutils literal notranslate"><span class="pre">$length</span></code> is calculated from the aforementioned values (<code class="docutils literal notranslate"><span class="pre">$moduleCount</span> <span class="pre">*</span> <span class="pre">$scale</span></code>).
  363. The method <code class="docutils literal notranslate"><span class="pre">setMatrixDimensions()</span></code> can be called to update these 3 values after the matrix has been modified, e.g. by adding a quiet zone during output.</p>
  364. </section>
  365. <section id="modulevalues">
  366. <h3><code class="docutils literal notranslate"><span class="pre">$moduleValues</span></code><a class="headerlink" href="#modulevalues" title="Link to this heading"></a></h3>
  367. <p>The finalized map of <code class="docutils literal notranslate"><span class="pre">$M_TYPE</span></code> to value for the current output. This map is generated during invocation of the output class via <code class="docutils literal notranslate"><span class="pre">setModuleValues()</span></code>.</p>
  368. </section>
  369. <section id="copies-of-qroptions-values">
  370. <h3>Copies of <code class="docutils literal notranslate"><span class="pre">QROptions</span></code> values<a class="headerlink" href="#copies-of-qroptions-values" title="Link to this heading"></a></h3>
  371. <p>Some values from the <code class="docutils literal notranslate"><span class="pre">QROptions</span></code> instance are copied to properties to avoid calling the magic getters in long loops for a significant performance increase, e.g. in the module collector.
  372. Currently, the following values are copied via <code class="docutils literal notranslate"><span class="pre">copyVars()</span></code> during invocation: <code class="docutils literal notranslate"><span class="pre">$connectPaths</span></code>, <code class="docutils literal notranslate"><span class="pre">$excludeFromConnect</span></code>, <code class="docutils literal notranslate"><span class="pre">$eol</span></code>,
  373. <code class="docutils literal notranslate"><span class="pre">$drawLightModules</span></code>, <code class="docutils literal notranslate"><span class="pre">$drawCircularModules</span></code>, <code class="docutils literal notranslate"><span class="pre">$keepAsSquare</span></code>, <code class="docutils literal notranslate"><span class="pre">$circleRadius</span></code> (and additionally <code class="docutils literal notranslate"><span class="pre">$circleDiameter</span></code>).</p>
  374. </section>
  375. </section>
  376. <section id="methods">
  377. <h2>Methods<a class="headerlink" href="#methods" title="Link to this heading"></a></h2>
  378. <section id="setmodulevalues">
  379. <h3><code class="docutils literal notranslate"><span class="pre">setModuleValues()</span></code><a class="headerlink" href="#setmodulevalues" title="Link to this heading"></a></h3>
  380. <p>This method calls the abstract/interface methods <code class="docutils literal notranslate"><span class="pre">moduleValueIsValid()</span></code>, <code class="docutils literal notranslate"><span class="pre">prepareModuleValue()</span></code> and <code class="docutils literal notranslate"><span class="pre">getDefaultModuleValue()</span></code> to prepare the module values map.</p>
  381. </section>
  382. <section id="modulevalueisvalid">
  383. <h3><code class="docutils literal notranslate"><span class="pre">moduleValueIsValid()</span></code><a class="headerlink" href="#modulevalueisvalid" title="Link to this heading"></a></h3>
  384. <p>This method is declared in the <code class="docutils literal notranslate"><span class="pre">QROutputInterface</span></code> and needs to be implemented by the output class; it is <code class="docutils literal notranslate"><span class="pre">static</span></code> so that it can be called before invocation.
  385. The purpose is to determine whether the given <code class="docutils literal notranslate"><span class="pre">mixed</span></code> input is a valid module value for the current output class and returns <code class="docutils literal notranslate"><span class="pre">bool</span></code>.
  386. It’s also useful to check values from <code class="docutils literal notranslate"><span class="pre">QROptions</span></code> such as <code class="docutils literal notranslate"><span class="pre">$bgColor</span></code> or <code class="docutils literal notranslate"><span class="pre">$transparencyColor</span></code>.</p>
  387. <p>Below is a pseudo implementation, check the code of the several output classes for actual implementations
  388. (e.g. <a class="reference external" href="https://github.com/chillerlan/php-qrcode/blob/4bd4b59fdec72397f5b1f70da9cadcb76764191b/src/Output/QRImagick.php#L68-L96"><code class="docutils literal notranslate"><span class="pre">QRImagick::moduleValueIsValid()</span></code></a>)</p>
  389. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  390. <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">moduleValueIsValid</span><span class="p">(</span><span class="nx">mixed</span> <span class="nv">$value</span><span class="p">)</span><span class="o">:</span><span class="nx">bool</span><span class="p">{</span>
  391. <span class="c1">// check the type of the input value first</span>
  392. <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">is_expected_type</span><span class="p">(</span><span class="nv">$value</span><span class="p">)){</span>
  393. <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
  394. <span class="p">}</span>
  395. <span class="c1">// do some more checks to determine the value</span>
  396. <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">is_somehow_valid</span><span class="p">(</span><span class="nv">$value</span><span class="p">)){</span>
  397. <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
  398. <span class="p">}</span>
  399. <span class="c1">// looks like we got a match</span>
  400. <span class="k">return</span> <span class="k">true</span><span class="p">;</span>
  401. <span class="p">}</span>
  402. <span class="p">}</span>
  403. </pre></div>
  404. </div>
  405. </section>
  406. <section id="preparemodulevalue">
  407. <h3><code class="docutils literal notranslate"><span class="pre">prepareModuleValue()</span></code><a class="headerlink" href="#preparemodulevalue" title="Link to this heading"></a></h3>
  408. <p>This method prepares the final replacement value from the given input.
  409. It might still be necessary to validate the given value despite it being checked earlier by <code class="docutils literal notranslate"><span class="pre">moduleValueIsValid()</span></code> -
  410. if nothing helps, this is a good place to throw an exception.
  411. Below a pseudo implementation example (see <a class="reference external" href="https://github.com/chillerlan/php-qrcode/blob/4bd4b59fdec72397f5b1f70da9cadcb76764191b/src/Output/QRGdImage.php#L138-L158"><code class="docutils literal notranslate"><span class="pre">QRGdImage::prepareModuleValue()</span></code></a>):</p>
  412. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  413. <span class="k">protected</span> <span class="k">function</span> <span class="nf">prepareModuleValue</span><span class="p">(</span><span class="nx">mixed</span> <span class="nv">$value</span><span class="p">)</span><span class="o">:</span><span class="nx">mixed</span><span class="p">{</span>
  414. <span class="c1">// extended validation to make sure the values are valid for output</span>
  415. <span class="c1">// e.g. examine array values, clamp etc.</span>
  416. <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nx">is_valid</span><span class="p">(</span><span class="nv">$value</span><span class="p">)){</span>
  417. <span class="k">throw</span> <span class="k">new</span> <span class="nx">QRCodeOutputException</span><span class="p">(</span><span class="s1">&#39;invalid module value&#39;</span><span class="p">);</span>
  418. <span class="p">}</span>
  419. <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">modifyValue</span><span class="p">(</span><span class="nv">$value</span><span class="p">);</span>
  420. <span class="p">}</span>
  421. <span class="p">}</span>
  422. </pre></div>
  423. </div>
  424. </section>
  425. <section id="getdefaultmodulevalue">
  426. <h3><code class="docutils literal notranslate"><span class="pre">getDefaultModuleValue()</span></code><a class="headerlink" href="#getdefaultmodulevalue" title="Link to this heading"></a></h3>
  427. <p>Finally, setting a default value is required, in case a value for an <code class="docutils literal notranslate"><span class="pre">$M_TYPE</span></code> is not set or it’s invalid.</p>
  428. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  429. <span class="k">protected</span> <span class="k">function</span> <span class="nf">getDefaultModuleValue</span><span class="p">(</span><span class="nx">bool</span> <span class="nv">$isDark</span><span class="p">)</span><span class="o">:</span><span class="nx">mixed</span><span class="p">{</span>
  430. <span class="nv">$defaultValue</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$isDark</span> <span class="o">===</span> <span class="k">true</span><span class="p">)</span>
  431. <span class="o">?</span> <span class="s1">&#39;default value for dark&#39;</span>
  432. <span class="o">:</span> <span class="s1">&#39;default value for light&#39;</span><span class="p">;</span>
  433. <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">prepareModuleValue</span><span class="p">(</span><span class="nv">$defaultValue</span><span class="p">);</span>
  434. <span class="p">}</span>
  435. <span class="p">}</span>
  436. </pre></div>
  437. </div>
  438. </section>
  439. <section id="getmodulevalue-and-getmodulevalueat">
  440. <h3><code class="docutils literal notranslate"><span class="pre">getModuleValue()</span></code> and <code class="docutils literal notranslate"><span class="pre">getModuleValueAt()</span></code><a class="headerlink" href="#getmodulevalue-and-getmodulevalueat" title="Link to this heading"></a></h3>
  441. <p>Both methods return a module value, the main difference is that <code class="docutils literal notranslate"><span class="pre">getModuleValueAt()</span></code> is a convenience method
  442. that makes an extra call to retrieve the <code class="docutils literal notranslate"><span class="pre">$M_TYPE</span></code> from the given matrix coordinate to return the value via <code class="docutils literal notranslate"><span class="pre">getModuleValue()</span></code>.
  443. A <code class="docutils literal notranslate"><span class="pre">foreach</span></code> loop over the matrix gives you the key (coordinate) <em>and</em> value of an array element:</p>
  444. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  445. <span class="k">public</span> <span class="k">function</span> <span class="nf">dump</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$file</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span><span class="o">:</span><span class="nx">string</span><span class="p">{</span>
  446. <span class="nv">$lines</span> <span class="o">=</span> <span class="p">[];</span>
  447. <span class="k">foreach</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">matrix</span><span class="o">-&gt;</span><span class="na">getMatrix</span><span class="p">()</span> <span class="k">as</span> <span class="nv">$y</span> <span class="o">=&gt;</span> <span class="nv">$row</span><span class="p">){</span>
  448. <span class="nv">$lines</span><span class="p">[</span><span class="nv">$y</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
  449. <span class="k">foreach</span><span class="p">(</span><span class="nv">$row</span> <span class="k">as</span> <span class="nv">$x</span> <span class="o">=&gt;</span> <span class="nv">$M_TYPE</span><span class="p">){</span>
  450. <span class="nv">$lines</span><span class="p">[</span><span class="nv">$y</span><span class="p">]</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getModuleValue</span><span class="p">(</span><span class="nv">$M_TYPE</span><span class="p">);</span>
  451. <span class="p">}</span>
  452. <span class="p">}</span>
  453. <span class="k">return</span> <span class="nb">implode</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">options</span><span class="o">-&gt;</span><span class="na">eol</span><span class="p">,</span> <span class="nv">$lines</span><span class="p">);</span>
  454. <span class="p">}</span>
  455. <span class="p">}</span>
  456. </pre></div>
  457. </div>
  458. <p>However, sometimes you might happen to use a <code class="docutils literal notranslate"><span class="pre">for</span></code> loop instead. The <code class="docutils literal notranslate"><span class="pre">for</span></code> loop leaves you only with the matrix coordinates, so you need to call <code class="docutils literal notranslate"><span class="pre">getModuleValueAt()</span></code>:</p>
  459. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  460. <span class="k">public</span> <span class="k">function</span> <span class="nf">dump</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$file</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span><span class="o">:</span><span class="nx">string</span><span class="p">{</span>
  461. <span class="nv">$lines</span> <span class="o">=</span> <span class="p">[];</span>
  462. <span class="k">for</span><span class="p">(</span><span class="nv">$y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nv">$y</span> <span class="o">&lt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">moduleCount</span><span class="p">;</span> <span class="nv">$y</span><span class="o">++</span><span class="p">){</span>
  463. <span class="nv">$lines</span><span class="p">[</span><span class="nv">$y</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
  464. <span class="k">for</span><span class="p">(</span><span class="nv">$x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nv">$x</span> <span class="o">&lt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">moduleCount</span><span class="p">;</span> <span class="nv">$x</span><span class="o">++</span><span class="p">){</span>
  465. <span class="nv">$lines</span><span class="p">[</span><span class="nv">$y</span><span class="p">]</span> <span class="o">.=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getModuleValueAt</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span> <span class="nv">$y</span><span class="p">);</span>
  466. <span class="p">}</span>
  467. <span class="p">}</span>
  468. <span class="k">return</span> <span class="nb">implode</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">options</span><span class="o">-&gt;</span><span class="na">eol</span><span class="p">,</span> <span class="nv">$lines</span><span class="p">);</span>
  469. <span class="p">}</span>
  470. <span class="p">}</span>
  471. </pre></div>
  472. </div>
  473. </section>
  474. <section id="setmatrixdimensions">
  475. <h3><code class="docutils literal notranslate"><span class="pre">setMatrixDimensions()</span></code><a class="headerlink" href="#setmatrixdimensions" title="Link to this heading"></a></h3>
  476. <p>As mentioned before, this method is supposed to set the values for the properties <code class="docutils literal notranslate"><span class="pre">$moduleCount</span></code>, <code class="docutils literal notranslate"><span class="pre">$scale</span></code> and <code class="docutils literal notranslate"><span class="pre">$length</span></code>.
  477. It is called in the constructor during invocation, but it might be necessary to call it again if the size of the matrix was changed in the output class
  478. (see <a class="reference external" href="https://github.com/chillerlan/php-qrcode/blob/99b1f9cf454ab1316cb643950a71caed3a6c0f5a/examples/svgRoundQuietzone.php#L38-L44">the round quiet zone example</a> for a use case).</p>
  479. </section>
  480. <section id="getoutputdimensions">
  481. <h3><code class="docutils literal notranslate"><span class="pre">getOutputDimensions()</span></code><a class="headerlink" href="#getoutputdimensions" title="Link to this heading"></a></h3>
  482. <p>This method provides a simple way for consistent width/height values for the output (if applicable) which then can be changed by simply overriding this method.
  483. It returns a 2-element array that contains the values in a format that can be used by the output class, which is <code class="docutils literal notranslate"><span class="pre">QROutputAbstract::$length</span></code> (<code class="docutils literal notranslate"><span class="pre">$moduleCount</span> <span class="pre">*</span> <span class="pre">$scale</span></code>):</p>
  484. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="nv">$width</span><span class="p">,</span> <span class="nv">$height</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">getOutputDimensions</span><span class="p">();</span>
  485. </pre></div>
  486. </div>
  487. <p>The output width and height can be changed in all places by simply overriding the method:</p>
  488. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  489. <span class="k">protected</span> <span class="k">function</span> <span class="nf">getOutputDimensions</span><span class="p">()</span><span class="o">:</span><span class="k">array</span><span class="p">{</span>
  490. <span class="c1">// adjust the height in order to add something under the QR Code</span>
  491. <span class="k">return</span> <span class="p">[</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">length</span><span class="p">,</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">length</span> <span class="o">+</span> <span class="mi">69</span><span class="p">)];</span>
  492. <span class="p">}</span>
  493. <span class="p">}</span>
  494. </pre></div>
  495. </div>
  496. </section>
  497. <section id="collectmodules">
  498. <h3><code class="docutils literal notranslate"><span class="pre">collectModules()</span></code><a class="headerlink" href="#collectmodules" title="Link to this heading"></a></h3>
  499. <p>The module collector is particularly useful for plain text based file formats, for example the various markup languages like SVG and HTML or other structured file formats such as EPS.
  500. This method calls a method <code class="docutils literal notranslate"><span class="pre">moduleTransform()</span></code> internally with 4 parameters: the module coordinates <code class="docutils literal notranslate"><span class="pre">$x</span></code> and <code class="docutils literal notranslate"><span class="pre">$y</span></code>, the <code class="docutils literal notranslate"><span class="pre">$M_TYPE</span></code> and <code class="docutils literal notranslate"><span class="pre">$M_TYPE_LAYER</span></code>.
  501. The transform method should return a value that is valid for a single module of the QR matrix, or <code class="docutils literal notranslate"><span class="pre">null</span></code> if no transform was performed for the current module.
  502. The <code class="docutils literal notranslate"><span class="pre">$M_TYPE_LAYER</span></code> is a copy of the <code class="docutils literal notranslate"><span class="pre">$M_TYPE</span></code> that represents the array key of the returned array and that may have been reassigned in the collector to another path layer, e.g. through <code class="docutils literal notranslate"><span class="pre">QROptions::$connectPaths</span></code>.</p>
  503. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  504. <span class="k">public</span> <span class="k">function</span> <span class="nf">dump</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$file</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span><span class="o">:</span><span class="nx">string</span><span class="p">{</span>
  505. <span class="c1">// collect the modules for the path elements</span>
  506. <span class="nv">$paths</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">collectModules</span><span class="p">();</span>
  507. <span class="c1">// loop over the paths</span>
  508. <span class="k">foreach</span><span class="p">(</span><span class="nv">$paths</span> <span class="k">as</span> <span class="nv">$M_TYPE_LAYER</span> <span class="o">=&gt;</span> <span class="o">&amp;</span><span class="nv">$path</span><span class="p">){</span>
  509. <span class="k">if</span><span class="p">(</span><span class="nv">$path</span> <span class="o">===</span> <span class="p">[]){</span>
  510. <span class="k">continue</span><span class="p">;</span>
  511. <span class="p">}</span>
  512. <span class="nv">$path</span> <span class="o">=</span> <span class="nb">implode</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">options</span><span class="o">-&gt;</span><span class="na">eol</span><span class="p">,</span> <span class="nv">$path</span><span class="p">);</span>
  513. <span class="p">}</span>
  514. <span class="k">return</span> <span class="nb">implode</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">options</span><span class="o">-&gt;</span><span class="na">eol</span><span class="p">,</span> <span class="nv">$paths</span><span class="p">);</span>
  515. <span class="p">}</span>
  516. <span class="c1">// this method must be implemented/overridden if your output class uses the module collector</span>
  517. <span class="k">protected</span> <span class="k">function</span> <span class="nf">moduleTransform</span><span class="p">(</span><span class="nx">int</span> <span class="nv">$x</span><span class="p">,</span> <span class="nx">int</span> <span class="nv">$y</span><span class="p">,</span> <span class="nx">int</span> <span class="nv">$M_TYPE</span><span class="p">,</span> <span class="nx">int</span> <span class="nv">$M_TYPE_LAYER</span><span class="p">)</span><span class="o">:</span><span class="nx">string</span><span class="p">{</span>
  518. <span class="k">return</span> <span class="nb">sprintf</span><span class="p">(</span><span class="s1">&#39;%d %d %012b&#39;</span><span class="p">,</span> <span class="nv">$x</span><span class="p">,</span> <span class="nv">$y</span><span class="p">,</span> <span class="nv">$M_TYPE</span><span class="p">);</span>
  519. <span class="p">}</span>
  520. <span class="p">}</span>
  521. </pre></div>
  522. </div>
  523. <p>Sometimes it can be necessary to override <code class="docutils literal notranslate"><span class="pre">collectModules()</span></code> in order to apply special effects such as random colors - you can find some implementations in <a class="reference external" href="https://github.com/chillerlan/php-qrcode/tree/main/examples">the SVG examples</a>.</p>
  524. </section>
  525. <section id="savetofile-and-tobase64datauri">
  526. <h3><code class="docutils literal notranslate"><span class="pre">saveToFile()</span></code> and <code class="docutils literal notranslate"><span class="pre">toBase64DataURI()</span></code><a class="headerlink" href="#savetofile-and-tobase64datauri" title="Link to this heading"></a></h3>
  527. <p>The void method <code class="docutils literal notranslate"><span class="pre">saveToFile()</span></code> takes a data blob and the <code class="docutils literal notranslate"><span class="pre">$file</span></code> given in <code class="docutils literal notranslate"><span class="pre">QROutputInterface::dump()</span></code> and save to the path if it is not <code class="docutils literal notranslate"><span class="pre">null</span></code> - the file path itself is not checked except for writability.
  528. The final output can be transformed to a <a class="reference external" href="https://en.wikipedia.org/wiki/Data_URI_scheme">base64 data URI</a> with <code class="docutils literal notranslate"><span class="pre">toBase64DataURI()</span></code>, where the data blob and a valid mime type as parameters - the mime type is not checked.</p>
  529. <div class="highlight-php notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyOutput</span> <span class="k">extends</span> <span class="nx">QROutputAbstract</span><span class="p">{</span>
  530. <span class="k">public</span> <span class="k">function</span> <span class="nf">dump</span><span class="p">(</span><span class="nx">string</span> <span class="nv">$file</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span><span class="o">:</span><span class="nx">string</span><span class="p">{</span>
  531. <span class="nv">$output</span> <span class="o">=</span> <span class="s1">&#39;qrcode data string&#39;</span><span class="p">;</span>
  532. <span class="c1">// save the plain data to file</span>
  533. <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">saveToFile</span><span class="p">(</span><span class="nv">$output</span><span class="p">,</span> <span class="nv">$file</span><span class="p">);</span>
  534. <span class="c1">// base64 encoding may be called optionally</span>
  535. <span class="k">if</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">options</span><span class="o">-&gt;</span><span class="na">outputBase64</span><span class="p">){</span>
  536. <span class="nv">$output</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">toBase64DataURI</span><span class="p">(</span><span class="nv">$output</span><span class="p">,</span> <span class="s1">&#39;text/plain&#39;</span><span class="p">);</span>
  537. <span class="p">}</span>
  538. <span class="k">return</span> <span class="nv">$output</span><span class="p">;</span>
  539. <span class="p">}</span>
  540. <span class="p">}</span>
  541. </pre></div>
  542. </div>
  543. </section>
  544. </section>
  545. </section>
  546. </div>
  547. </div>
  548. <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
  549. <a href="Module-Values.html" class="btn btn-neutral float-left" title="Module values" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
  550. <a href="Custom-output-interface.html" class="btn btn-neutral float-right" title="Custom QROutputInterface" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
  551. </div>
  552. <hr/>
  553. <div role="contentinfo">
  554. <p>&#169; Copyright 2023, smiley.</p>
  555. </div>
  556. </footer>
  557. </div>
  558. </div>
  559. </section>
  560. </div>
  561. <script>
  562. jQuery(function () {
  563. SphinxRtdTheme.Navigation.enable(true);
  564. });
  565. </script>
  566. </body>
  567. </html>