ILIAS  release_5-0 Revision 5.0.0-1144-gc4397b1f870
QRcode Class Reference

Class to create QR-code arrays for TCPDF class. More...

+ Collaboration diagram for QRcode:

Public Member Functions

 __construct ($code, $eclevel='L')
 This is the class constructor. More...
 
 getBarcodeArray ()
 Returns a barcode array which is readable by TCPDF. More...
 

Protected Member Functions

 binarize ($frame)
 Convert the frame in binary form. More...
 
 encodeString ($string)
 Encode the input string to QR code. More...
 
 encodeMask ($mask)
 Encode mask. More...
 
 setFrameAt ($at, $val)
 Set frame value at specified position. More...
 
 getFrameAt ($at)
 Get frame value at specified position. More...
 
 getNextPosition ()
 Return the next frame position. More...
 
 init ($spec)
 Initialize code. More...
 
 getCode ()
 Return Reed-Solomon block code. More...
 
 writeFormatInformation ($width, &$frame, $mask, $level)
 Write Format Information on frame and returns the number of black bits. More...
 
 mask0 ($x, $y)
 mask0 More...
 
 mask1 ($x, $y)
 mask1 More...
 
 mask2 ($x, $y)
 mask2 More...
 
 mask3 ($x, $y)
 mask3 More...
 
 mask4 ($x, $y)
 mask4 More...
 
 mask5 ($x, $y)
 mask5 More...
 
 mask6 ($x, $y)
 mask6 More...
 
 mask7 ($x, $y)
 mask7 More...
 
 generateMaskNo ($maskNo, $width, $frame)
 Return bitmask. More...
 
 makeMaskNo ($maskNo, $width, $s, &$d, $maskGenOnly=false)
 makeMaskNo More...
 
 makeMask ($width, $frame, $maskNo, $level)
 makeMask More...
 
 calcN1N3 ($length)
 calcN1N3 More...
 
 evaluateSymbol ($width, $frame)
 evaluateSymbol More...
 
 mask ($width, $frame, $level)
 mask More...
 
 isdigitat ($str, $pos)
 Return true if the character at specified position is a number. More...
 
 isalnumat ($str, $pos)
 Return true if the character at specified position is an alphanumeric character. More...
 
 identifyMode ($pos)
 identifyMode More...
 
 eatNum ()
 eatNum More...
 
 eatAn ()
 eatAn More...
 
 eatKanji ()
 eatKanji More...
 
 eat8 ()
 eat8 More...
 
 splitString ()
 splitString More...
 
 toUpper ()
 toUpper More...
 
 newInputItem ($mode, $size, $data, $bstream=null)
 newInputItem More...
 
 encodeModeNum ($inputitem, $version)
 encodeModeNum More...
 
 encodeModeAn ($inputitem, $version)
 encodeModeAn More...
 
 encodeMode8 ($inputitem, $version)
 encodeMode8 More...
 
 encodeModeKanji ($inputitem, $version)
 encodeModeKanji More...
 
 encodeModeStructure ($inputitem)
 encodeModeStructure More...
 
 encodeBitStream ($inputitem, $version)
 encodeBitStream More...
 
 appendNewInputItem ($items, $mode, $size, $data)
 Append data to an input object. More...
 
 insertStructuredAppendHeader ($items, $size, $index, $parity)
 insertStructuredAppendHeader More...
 
 calcParity ($items)
 calcParity More...
 
 checkModeNum ($size, $data)
 checkModeNum More...
 
 lookAnTable ($c)
 Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). More...
 
 checkModeAn ($size, $data)
 checkModeAn More...
 
 estimateBitsModeNum ($size)
 estimateBitsModeNum More...
 
 estimateBitsModeAn ($size)
 estimateBitsModeAn More...
 
 estimateBitsMode8 ($size)
 estimateBitsMode8 More...
 
 estimateBitsModeKanji ($size)
 estimateBitsModeKanji More...
 
 checkModeKanji ($size, $data)
 checkModeKanji More...
 
 check ($mode, $size, $data)
 Validate the input data. More...
 
 estimateBitStreamSize ($items, $version)
 estimateBitStreamSize More...
 
 estimateVersion ($items)
 estimateVersion More...
 
 lengthOfCode ($mode, $version, $bits)
 lengthOfCode More...
 
 createBitStream ($items)
 createBitStream More...
 
 convertData ($items)
 convertData More...
 
 appendPaddingBit ($bstream)
 Append Padding Bit to bitstream. More...
 
 mergeBitStream ($items)
 mergeBitStream More...
 
 getBitStream ($items)
 Returns a stream of bits. More...
 
 getByteStream ($items)
 Pack all bit streams padding bits into a byte array. More...
 
 allocate ($setLength)
 Return an array with zeros. More...
 
 newFromNum ($bits, $num)
 Return new bitstream from number. More...
 
 newFromBytes ($size, $data)
 Return new bitstream from bytes. More...
 
 appendBitstream ($bitstream, $append)
 Append one bitstream to another. More...
 
 appendNum ($bitstream, $bits, $num)
 Append one bitstream created from number to another. More...
 
 appendBytes ($bitstream, $size, $data)
 Append one bitstream created from bytes to another. More...
 
 bitstreamToByte ($bstream)
 Convert bitstream to bytes. More...
 
 qrstrset ($srctab, $x, $y, $repl, $replLen=false)
 Replace a value on the array at the specified position. More...
 
 getDataLength ($version, $level)
 Return maximum data code length (bytes) for the version. More...
 
 getECCLength ($version, $level)
 Return maximum error correction code length (bytes) for the version. More...
 
 getWidth ($version)
 Return the width of the symbol for the version. More...
 
 getRemainder ($version)
 Return the numer of remainder bits. More...
 
 getMinimumVersion ($size, $level)
 Return a version number that satisfies the input code length. More...
 
 lengthIndicator ($mode, $version)
 Return the size of length indicator for the mode and version. More...
 
 maximumWords ($mode, $version)
 Return the maximum length for the mode and version. More...
 
 getEccSpec ($version, $level, $spec)
 Return an array of ECC specification. More...
 
 putAlignmentMarker ($frame, $ox, $oy)
 Put an alignment marker. More...
 
 putAlignmentPattern ($version, $frame, $width)
 Put an alignment pattern. More...
 
 getVersionPattern ($version)
 Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. More...
 
 getFormatInfo ($mask, $level)
 Return BCH encoded format information pattern. More...
 
 putFinderPattern ($frame, $ox, $oy)
 Put a finder pattern. More...
 
 createFrame ($version)
 Return a copy of initialized frame. More...
 
 newFrame ($version)
 Set new frame for the specified version. More...
 
 rsBlockNum ($spec)
 Return block number 0. More...
 
 rsBlockNum1 ($spec)
 Return block number 1. More...
 
 rsDataCodes1 ($spec)
 Return data codes 1. More...
 
 rsEccCodes1 ($spec)
 Return ecc codes 1. More...
 
 rsBlockNum2 ($spec)
 Return block number 2. More...
 
 rsDataCodes2 ($spec)
 Return data codes 2. More...
 
 rsEccCodes2 ($spec)
 Return ecc codes 2. More...
 
 rsDataLength ($spec)
 Return data length. More...
 
 rsEccLength ($spec)
 Return ecc length. More...
 
 init_rs ($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
 Initialize a Reed-Solomon codec and add it to existing rsitems. More...
 
 modnn ($rs, $x)
 modnn More...
 
 init_rs_char ($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
 Initialize a Reed-Solomon codec and returns an array of values. More...
 
 encode_rs_char ($rs, $data, $parity)
 Encode a Reed-Solomon codec and returns the parity array. More...
 

Protected Attributes

 $barcode_array = array()
 Barcode array to be returned which is readable by TCPDF. More...
 
 $version = 0
 QR code version. More...
 
 $level = QR_ECLEVEL_L
 Levels of error correction. More...
 
 $hint = QR_MODE_8B
 Encoding mode. More...
 
 $casesensitive = true
 Boolean flag, if true the input string will be converted to uppercase. More...
 
 $structured = 0
 Structured QR code (not supported yet). More...
 
 $data
 Mask data. More...
 
 $width
 Width. More...
 
 $frame
 Frame. More...
 
 $x
 X position of bit. More...
 
 $y
 Y position of bit. More...
 
 $dir
 Direction. More...
 
 $bit
 Single bit value. More...
 
 $datacode = array()
 Data code. More...
 
 $ecccode = array()
 Error correction code. More...
 
 $blocks
 Blocks. More...
 
 $rsblocks = array()
 Reed-Solomon blocks. More...
 
 $count
 Counter. More...
 
 $dataLength
 Data length. More...
 
 $eccLength
 Error correction length. More...
 
 $b1
 Value b1. More...
 
 $runLength = array()
 Run length. More...
 
 $dataStr = ''
 Input data string. More...
 
 $items
 Input items. More...
 
 $rsitems = array()
 Reed-Solomon items. More...
 
 $frames = array()
 Array of frames. More...
 
 $anTable
 Alphabet-numeric convesion table. More...
 
 $capacity
 Array Table of the capacity of symbols. More...
 
 $lengthTableBits
 Array Length indicator. More...
 
 $eccTable
 Array Table of the error correction code (Reed-Solomon block). More...
 
 $alignmentPattern
 Array Positions of alignment patterns. More...
 
 $versionPattern
 Array Version information pattern (BCH coded). More...
 
 $formatInfo
 Array Format information. More...
 

Detailed Description

Class to create QR-code arrays for TCPDF class.

QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.

This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). Please read comments on this class source file for full copyright and license information.

Definition at line 291 of file qrcode.php.

Constructor & Destructor Documentation

◆ __construct()

QRcode::__construct (   $code,
  $eclevel = 'L' 
)

This is the class constructor.

Creates a QRcode object

Parameters
$code(string) code to represent using QRcode
$eclevel(string) error level:
  • L : About 7% or less errors can be corrected.
  • M : About 15% or less errors can be corrected.
  • Q : About 25% or less errors can be corrected.
  • H : About 30% or less errors can be corrected.
Since
1.0.000

Definition at line 639 of file qrcode.php.

639 {
640 $barcode_array = array();
641 if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
642 return false;
643 }
644 // set error correction level
645 $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
646 if ($this->level === false) {
647 $this->level = QR_ECLEVEL_L;
648 }
649 if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
650 return false;
651 }
652 if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
653 return false;
654 }
655 $this->items = array();
656 $this->encodeString($code);
657 if (is_null($this->data)) {
658 return false;
659 }
660 $qrTab = $this->binarize($this->data);
661 $size = count($qrTab);
662 $barcode_array['num_rows'] = $size;
663 $barcode_array['num_cols'] = $size;
664 $barcode_array['bcode'] = array();
665 foreach ($qrTab as $line) {
666 $arrAdd = array();
667 foreach (str_split($line) as $char) {
668 $arrAdd[] = ($char=='1')?1:0;
669 }
670 $barcode_array['bcode'][] = $arrAdd;
671 }
672 $this->barcode_array = $barcode_array;
673 }
$size
Definition: RandomTest.php:79
binarize($frame)
Convert the frame in binary form.
Definition: qrcode.php:689
$barcode_array
Barcode array to be returned which is readable by TCPDF.
Definition: qrcode.php:297
encodeString($string)
Encode the input string to QR code.
Definition: qrcode.php:704

References $barcode_array, $size, binarize(), and encodeString().

+ Here is the call graph for this function:

Member Function Documentation

◆ allocate()

QRcode::allocate (   $setLength)
protected

Return an array with zeros.

Parameters
$setLength(int) array size
Returns
array

Definition at line 2128 of file qrcode.php.

2128 {
2129 return array_fill(0, $setLength, 0);
2130 }

Referenced by newFromBytes(), and newFromNum().

+ Here is the caller graph for this function:

◆ appendBitstream()

QRcode::appendBitstream (   $bitstream,
  $append 
)
protected

Append one bitstream to another.

Parameters
$bitstream(array) original bitstream
$append(array) bitstream to append
Returns
array bitstream

Definition at line 2182 of file qrcode.php.

2182 {
2183 if ((!is_array($append)) OR (count($append) == 0)) {
2184 return $bitstream;
2185 }
2186 if (count($bitstream) == 0) {
2187 return $append;
2188 }
2189 return array_values(array_merge($bitstream, $append));
2190 }

Referenced by appendBytes(), appendNum(), appendPaddingBit(), encodeBitStream(), and mergeBitStream().

+ Here is the caller graph for this function:

◆ appendBytes()

QRcode::appendBytes (   $bitstream,
  $size,
  $data 
)
protected

Append one bitstream created from bytes to another.

Parameters
$bitstream(array) original bitstream
$size(int) size
$data(array) bytes
Returns
array bitstream

Definition at line 2214 of file qrcode.php.

2214 {
2215 if ($size == 0) {
2216 return 0;
2217 }
2218 $b = $this->newFromBytes($size, $data);
2219 return $this->appendBitstream($bitstream, $b);
2220 }
$data
Mask data.
Definition: qrcode.php:333
newFromBytes($size, $data)
Return new bitstream from bytes.
Definition: qrcode.php:2158
appendBitstream($bitstream, $append)
Append one bitstream to another.
Definition: qrcode.php:2182

References $data, $size, appendBitstream(), and newFromBytes().

Referenced by appendPaddingBit().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ appendNewInputItem()

QRcode::appendNewInputItem (   $items,
  $mode,
  $size,
  $data 
)
protected

Append data to an input object.

The data is copied and appended to the input object.

Parameters
$items(arrray) input items
$mode(int) encoding mode.
$size(int) size of data (byte).
$data(array) array of input data.
Returns
items

Definition at line 1695 of file qrcode.php.

1695 {
1696 $newitem = $this->newInputItem($mode, $size, $data);
1697 if (!empty($newitem)) {
1698 $items[] = $newitem;
1699 }
1700 return $items;
1701 }
$items
Input items.
Definition: qrcode.php:443
newInputItem($mode, $size, $data, $bstream=null)
newInputItem
Definition: qrcode.php:1512

References $data, $items, $size, and newInputItem().

Referenced by eat8(), eatAn(), eatKanji(), and eatNum().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ appendNum()

QRcode::appendNum (   $bitstream,
  $bits,
  $num 
)
protected

Append one bitstream created from number to another.

Parameters
$bitstream(array) original bitstream
$bits(int) number of bits
$num(int) number
Returns
array bitstream

Definition at line 2199 of file qrcode.php.

2199 {
2200 if ($bits == 0) {
2201 return 0;
2202 }
2203 $b = $this->newFromNum($bits, $num);
2204 return $this->appendBitstream($bitstream, $b);
2205 }
newFromNum($bits, $num)
Return new bitstream from number.
Definition: qrcode.php:2138

References appendBitstream(), and newFromNum().

Referenced by appendPaddingBit(), encodeMode8(), encodeModeAn(), encodeModeKanji(), encodeModeNum(), and encodeModeStructure().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ appendPaddingBit()

QRcode::appendPaddingBit (   $bstream)
protected

Append Padding Bit to bitstream.

Parameters
$bstream(array)
Returns
array bitstream

Definition at line 2054 of file qrcode.php.

2054 {
2055 if (is_null($bstream)) {
2056 return null;
2057 }
2058 $bits = count($bstream);
2059 $maxwords = $this->getDataLength($this->version, $this->level);
2060 $maxbits = $maxwords * 8;
2061 if ($maxbits == $bits) {
2062 return $bstream;
2063 }
2064 if ($maxbits - $bits < 5) {
2065 return $this->appendNum($bstream, $maxbits - $bits, 0);
2066 }
2067 $bits += 4;
2068 $words = (int)(($bits + 7) / 8);
2069 $padding = array();
2070 $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
2071 $padlen = $maxwords - $words;
2072 if ($padlen > 0) {
2073 $padbuf = array();
2074 for ($i=0; $i<$padlen; ++$i) {
2075 $padbuf[$i] = ($i&1)?0x11:0xec;
2076 }
2077 $padding = $this->appendBytes($padding, $padlen, $padbuf);
2078 }
2079 return $this->appendBitstream($bstream, $padding);
2080 }
getDataLength($version, $level)
Return maximum data code length (bytes) for the version.
Definition: qrcode.php:2283
appendBytes($bitstream, $size, $data)
Append one bitstream created from bytes to another.
Definition: qrcode.php:2214
appendNum($bitstream, $bits, $num)
Append one bitstream created from number to another.
Definition: qrcode.php:2199

References appendBitstream(), appendBytes(), appendNum(), and getDataLength().

Referenced by getBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ binarize()

QRcode::binarize (   $frame)
protected

Convert the frame in binary form.

Parameters
$frame(array) array to binarize
Returns
array frame in binary form

Definition at line 689 of file qrcode.php.

689 {
690 $len = count($frame);
691 // the frame is square (width = height)
692 foreach ($frame as &$frameLine) {
693 for ($i=0; $i<$len; $i++) {
694 $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
695 }
696 }
697 return $frame;
698 }
$frame
Frame.
Definition: qrcode.php:347

References $frame.

Referenced by __construct().

+ Here is the caller graph for this function:

◆ bitstreamToByte()

QRcode::bitstreamToByte (   $bstream)
protected

Convert bitstream to bytes.

Parameters
$bstream(array) original bitstream
Returns
array of bytes

Definition at line 2227 of file qrcode.php.

2227 {
2228 if (is_null($bstream)) {
2229 return null;
2230 }
2231 $size = count($bstream);
2232 if ($size == 0) {
2233 return array();
2234 }
2235 $data = array_fill(0, (int)(($size + 7) / 8), 0);
2236 $bytes = (int)($size / 8);
2237 $p = 0;
2238 for ($i=0; $i<$bytes; $i++) {
2239 $v = 0;
2240 for ($j=0; $j<8; $j++) {
2241 $v = $v << 1;
2242 $v |= $bstream[$p];
2243 $p++;
2244 }
2245 $data[$i] = $v;
2246 }
2247 if ($size & 7) {
2248 $v = 0;
2249 for ($j=0; $j<($size & 7); $j++) {
2250 $v = $v << 1;
2251 $v |= $bstream[$p];
2252 $p++;
2253 }
2254 $data[$bytes] = $v;
2255 }
2256 return $data;
2257 }

References $data, and $size.

Referenced by getByteStream().

+ Here is the caller graph for this function:

◆ calcN1N3()

QRcode::calcN1N3 (   $length)
protected

calcN1N3

Parameters
$length(int)
Returns
int demerit

Definition at line 1126 of file qrcode.php.

1126 {
1127 $demerit = 0;
1128 for ($i=0; $i<$length; ++$i) {
1129 if ($this->runLength[$i] >= 5) {
1130 $demerit += (N1 + ($this->runLength[$i] - 5));
1131 }
1132 if ($i & 1) {
1133 if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
1134 $fact = (int)($this->runLength[$i] / 3);
1135 if (($this->runLength[$i-2] == $fact)
1136 AND ($this->runLength[$i-1] == $fact)
1137 AND ($this->runLength[$i+1] == $fact)
1138 AND ($this->runLength[$i+2] == $fact)) {
1139 if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
1140 $demerit += N3;
1141 } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
1142 $demerit += N3;
1143 }
1144 }
1145 }
1146 }
1147 }
1148 return $demerit;
1149 }

Referenced by evaluateSymbol().

+ Here is the caller graph for this function:

◆ calcParity()

QRcode::calcParity (   $items)
protected

calcParity

Parameters
$items(array)
Returns
int parity

Definition at line 1729 of file qrcode.php.

1729 {
1730 $parity = 0;
1731 foreach ($items as $item) {
1732 if ($item['mode'] != QR_MODE_ST) {
1733 for ($i=$item['size']-1; $i>=0; --$i) {
1734 $parity ^= $item['data'][$i];
1735 }
1736 }
1737 }
1738 return $parity;
1739 }

References $items.

◆ check()

QRcode::check (   $mode,
  $size,
  $data 
)
protected

Validate the input data.

Parameters
$mode(int) encoding mode.
$size(int) size of data (byte).
$data(array) data to validate
Returns
boolean true in case of valid data, false otherwise

Definition at line 1858 of file qrcode.php.

1858 {
1859 if ($size <= 0) {
1860 return false;
1861 }
1862 switch($mode) {
1863 case QR_MODE_NM: {
1864 return $this->checkModeNum($size, $data);
1865 }
1866 case QR_MODE_AN: {
1867 return $this->checkModeAn($size, $data);
1868 }
1869 case QR_MODE_KJ: {
1870 return $this->checkModeKanji($size, $data);
1871 }
1872 case QR_MODE_8B: {
1873 return true;
1874 }
1875 case QR_MODE_ST: {
1876 return true;
1877 }
1878 default: {
1879 break;
1880 }
1881 }
1882 return false;
1883 }
checkModeAn($size, $data)
checkModeAn
Definition: qrcode.php:1771
checkModeNum($size, $data)
checkModeNum
Definition: qrcode.php:1747
checkModeKanji($size, $data)
checkModeKanji
Definition: qrcode.php:1838

References $data, $size, checkModeAn(), checkModeKanji(), and checkModeNum().

Referenced by newInputItem().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ checkModeAn()

QRcode::checkModeAn (   $size,
  $data 
)
protected

checkModeAn

Parameters
$size(int)
$data(array)
Returns
boolean true or false

Definition at line 1771 of file qrcode.php.

1771 {
1772 for ($i=0; $i<$size; ++$i) {
1773 if ($this->lookAnTable(ord($data[$i])) == -1) {
1774 return false;
1775 }
1776 }
1777 return true;
1778 }
lookAnTable($c)
Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
Definition: qrcode.php:1761

References $data, $size, and lookAnTable().

Referenced by check().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ checkModeKanji()

QRcode::checkModeKanji (   $size,
  $data 
)
protected

checkModeKanji

Parameters
$size(int)
$data(array)
Returns
boolean true or false

Definition at line 1838 of file qrcode.php.

1838 {
1839 if ($size & 1) {
1840 return false;
1841 }
1842 for ($i=0; $i<$size; $i+=2) {
1843 $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
1844 if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
1845 return false;
1846 }
1847 }
1848 return true;
1849 }

References $data, and $size.

Referenced by check().

+ Here is the caller graph for this function:

◆ checkModeNum()

QRcode::checkModeNum (   $size,
  $data 
)
protected

checkModeNum

Parameters
$size(int)
$data(array)
Returns
boolean true or false

Definition at line 1747 of file qrcode.php.

1747 {
1748 for ($i=0; $i<$size; ++$i) {
1749 if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
1750 return false;
1751 }
1752 }
1753 return true;
1754 }

References $data, and $size.

Referenced by check().

+ Here is the caller graph for this function:

◆ convertData()

QRcode::convertData (   $items)
protected

convertData

Parameters
$items(array)
Returns
array items

Definition at line 2025 of file qrcode.php.

2025 {
2026 $ver = $this->estimateVersion($items);
2027 if ($ver > $this->version) {
2028 $this->version = $ver;
2029 }
2030 while (true) {
2031 $cbs = $this->createBitStream($items);
2032 $items = $cbs[0];
2033 $bits = $cbs[1];
2034 if ($bits < 0) {
2035 return -1;
2036 }
2037 $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
2038 if ($ver < 0) {
2039 return -1;
2040 } elseif ($ver > $this->version) {
2041 $this->version = $ver;
2042 } else {
2043 break;
2044 }
2045 }
2046 return $items;
2047 }
estimateVersion($items)
estimateVersion
Definition: qrcode.php:1934
getMinimumVersion($size, $level)
Return a version number that satisfies the input code length.
Definition: qrcode.php:2321
createBitStream($items)
createBitStream
Definition: qrcode.php:2010

References $items, createBitStream(), estimateVersion(), and getMinimumVersion().

Referenced by mergeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createBitStream()

QRcode::createBitStream (   $items)
protected

createBitStream

Parameters
$items(array)
Returns
array of items and total bits

Definition at line 2010 of file qrcode.php.

2010 {
2011 $total = 0;
2012 foreach ($items as $key => $item) {
2013 $items[$key] = $this->encodeBitStream($item, $this->version);
2014 $bits = count($items[$key]['bstream']);
2015 $total += $bits;
2016 }
2017 return array($items, $total);
2018 }
encodeBitStream($inputitem, $version)
encodeBitStream
Definition: qrcode.php:1640

References $items, $total, and encodeBitStream().

Referenced by convertData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createFrame()

QRcode::createFrame (   $version)
protected

Return a copy of initialized frame.

Parameters
$version(int) version
Returns
Array of unsigned char.

Definition at line 2529 of file qrcode.php.

2529 {
2530 $width = $this->capacity[$version][QRCAP_WIDTH];
2531 $frameLine = str_repeat ("\0", $width);
2532 $frame = array_fill(0, $width, $frameLine);
2533 // Finder pattern
2534 $frame = $this->putFinderPattern($frame, 0, 0);
2535 $frame = $this->putFinderPattern($frame, $width - 7, 0);
2536 $frame = $this->putFinderPattern($frame, 0, $width - 7);
2537 // Separator
2538 $yOffset = $width - 7;
2539 for ($y=0; $y < 7; ++$y) {
2540 $frame[$y][7] = "\xc0";
2541 $frame[$y][$width - 8] = "\xc0";
2542 $frame[$yOffset][7] = "\xc0";
2543 ++$yOffset;
2544 }
2545 $setPattern = str_repeat("\xc0", 8);
2546 $frame = $this->qrstrset($frame, 0, 7, $setPattern);
2547 $frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
2548 $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
2549 // Format info
2550 $setPattern = str_repeat("\x84", 9);
2551 $frame = $this->qrstrset($frame, 0, 8, $setPattern);
2552 $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
2553 $yOffset = $width - 8;
2554 for ($y=0; $y < 8; ++$y,++$yOffset) {
2555 $frame[$y][8] = "\x84";
2556 $frame[$yOffset][8] = "\x84";
2557 }
2558 // Timing pattern
2559 $wo = $width - 15;
2560 for ($i=1; $i < $wo; ++$i) {
2561 $frame[6][7+$i] = chr(0x90 | ($i & 1));
2562 $frame[7+$i][6] = chr(0x90 | ($i & 1));
2563 }
2564 // Alignment pattern
2566 // Version information
2567 if ($version >= 7) {
2568 $vinf = $this->getVersionPattern($version);
2569 $v = $vinf;
2570 for ($x=0; $x<6; ++$x) {
2571 for ($y=0; $y<3; ++$y) {
2572 $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
2573 $v = $v >> 1;
2574 }
2575 }
2576 $v = $vinf;
2577 for ($y=0; $y<6; ++$y) {
2578 for ($x=0; $x<3; ++$x) {
2579 $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
2580 $v = $v >> 1;
2581 }
2582 }
2583 }
2584 // and a little bit...
2585 $frame[$width - 8][8] = "\x81";
2586 return $frame;
2587 }
putFinderPattern($frame, $ox, $oy)
Put a finder pattern.
Definition: qrcode.php:2508
$x
X position of bit.
Definition: qrcode.php:353
$version
QR code version.
Definition: qrcode.php:303
putAlignmentPattern($version, $frame, $width)
Put an alignment pattern.
Definition: qrcode.php:2438
$y
Y position of bit.
Definition: qrcode.php:359
getVersionPattern($version)
Return BCH encoded version information pattern that is used for the symbol of version 7 or greater.
Definition: qrcode.php:2478
$width
Width.
Definition: qrcode.php:341
qrstrset($srctab, $x, $y, $repl, $replLen=false)
Replace a value on the array at the specified position.
Definition: qrcode.php:2272

References $frame, $version, $width, $x, $y, getVersionPattern(), putAlignmentPattern(), putFinderPattern(), and qrstrset().

Referenced by newFrame().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eat8()

QRcode::eat8 ( )
protected

eat8

Returns
int run

Definition at line 1395 of file qrcode.php.

1395 {
1396 $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
1397 $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
1398 $p = 1;
1399 $dataStrLen = strlen($this->dataStr);
1400 while($p < $dataStrLen) {
1401 $mode = $this->identifyMode($p);
1402 if ($mode == QR_MODE_KJ) {
1403 break;
1404 }
1405 if ($mode == QR_MODE_NM) {
1406 $q = $p;
1407 while($this->isdigitat($this->dataStr, $q)) {
1408 $q++;
1409 }
1410 $dif = $this->estimateBitsMode8($p) // + 4 + l8
1411 + $this->estimateBitsModeNum($q - $p) + 4 + $ln
1412 - $this->estimateBitsMode8($q); // - 4 - l8
1413 if ($dif < 0) {
1414 break;
1415 } else {
1416 $p = $q;
1417 }
1418 } elseif ($mode == QR_MODE_AN) {
1419 $q = $p;
1420 while($this->isalnumat($this->dataStr, $q)) {
1421 $q++;
1422 }
1423 $dif = $this->estimateBitsMode8($p) // + 4 + l8
1424 + $this->estimateBitsModeAn($q - $p) + 4 + $la
1425 - $this->estimateBitsMode8($q); // - 4 - l8
1426 if ($dif < 0) {
1427 break;
1428 } else {
1429 $p = $q;
1430 }
1431 } else {
1432 $p++;
1433 }
1434 }
1435 $run = $p;
1436 $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
1437 return $run;
1438 }
isalnumat($str, $pos)
Return true if the character at specified position is an alphanumeric character.
Definition: qrcode.php:1274
estimateBitsMode8($size)
estimateBitsMode8
Definition: qrcode.php:1819
estimateBitsModeAn($size)
estimateBitsModeAn
Definition: qrcode.php:1806
identifyMode($pos)
identifyMode
Definition: qrcode.php:1286
estimateBitsModeNum($size)
estimateBitsModeNum
Definition: qrcode.php:1785
lengthIndicator($mode, $version)
Return the size of length indicator for the mode and version.
Definition: qrcode.php:2338
appendNewInputItem($items, $mode, $size, $data)
Append data to an input object.
Definition: qrcode.php:1695
isdigitat($str, $pos)
Return true if the character at specified position is a number.
Definition: qrcode.php:1261

References appendNewInputItem(), estimateBitsMode8(), estimateBitsModeAn(), estimateBitsModeNum(), identifyMode(), isalnumat(), isdigitat(), and lengthIndicator().

Referenced by eatAn(), eatNum(), and splitString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eatAn()

QRcode::eatAn ( )
protected

eatAn

Returns
int run

Definition at line 1343 of file qrcode.php.

1343 {
1344 $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
1345 $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
1346 $p =1 ;
1347 while($this->isalnumat($this->dataStr, $p)) {
1348 if ($this->isdigitat($this->dataStr, $p)) {
1349 $q = $p;
1350 while($this->isdigitat($this->dataStr, $q)) {
1351 $q++;
1352 }
1353 $dif = $this->estimateBitsModeAn($p) // + 4 + la
1354 + $this->estimateBitsModeNum($q - $p) + 4 + $ln
1355 - $this->estimateBitsModeAn($q); // - 4 - la
1356 if ($dif < 0) {
1357 break;
1358 } else {
1359 $p = $q;
1360 }
1361 } else {
1362 $p++;
1363 }
1364 }
1365 $run = $p;
1366 if (!$this->isalnumat($this->dataStr, $p)) {
1367 $dif = $this->estimateBitsModeAn($run) + 4 + $la
1368 + $this->estimateBitsMode8(1) // + 4 + l8
1369 - $this->estimateBitsMode8($run + 1); // - 4 - l8
1370 if ($dif > 0) {
1371 return $this->eat8();
1372 }
1373 }
1374 $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
1375 return $run;
1376 }
eat8()
eat8
Definition: qrcode.php:1395

References appendNewInputItem(), eat8(), estimateBitsMode8(), estimateBitsModeAn(), estimateBitsModeNum(), isalnumat(), isdigitat(), and lengthIndicator().

Referenced by eatNum(), and splitString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eatKanji()

QRcode::eatKanji ( )
protected

eatKanji

Returns
int run

Definition at line 1382 of file qrcode.php.

1382 {
1383 $p = 0;
1384 while($this->identifyMode($p) == QR_MODE_KJ) {
1385 $p += 2;
1386 }
1387 $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
1388 return $run;
1389 }

References appendNewInputItem(), and identifyMode().

Referenced by splitString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ eatNum()

QRcode::eatNum ( )
protected

eatNum

Returns
int run

Definition at line 1311 of file qrcode.php.

1311 {
1312 $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
1313 $p = 0;
1314 while($this->isdigitat($this->dataStr, $p)) {
1315 $p++;
1316 }
1317 $run = $p;
1318 $mode = $this->identifyMode($p);
1319 if ($mode == QR_MODE_8B) {
1320 $dif = $this->estimateBitsModeNum($run) + 4 + $ln
1321 + $this->estimateBitsMode8(1) // + 4 + l8
1322 - $this->estimateBitsMode8($run + 1); // - 4 - l8
1323 if ($dif > 0) {
1324 return $this->eat8();
1325 }
1326 }
1327 if ($mode == QR_MODE_AN) {
1328 $dif = $this->estimateBitsModeNum($run) + 4 + $ln
1329 + $this->estimateBitsModeAn(1) // + 4 + la
1330 - $this->estimateBitsModeAn($run + 1);// - 4 - la
1331 if ($dif > 0) {
1332 return $this->eatAn();
1333 }
1334 }
1335 $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
1336 return $run;
1337 }
eatAn()
eatAn
Definition: qrcode.php:1343

References appendNewInputItem(), eat8(), eatAn(), estimateBitsMode8(), estimateBitsModeAn(), estimateBitsModeNum(), identifyMode(), isdigitat(), and lengthIndicator().

Referenced by splitString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encode_rs_char()

QRcode::encode_rs_char (   $rs,
  $data,
  $parity 
)
protected

Encode a Reed-Solomon codec and returns the parity array.

Parameters
$rs(array) RS values
$data(array) data
$parity(array) parity
Returns
parity array

Definition at line 2827 of file qrcode.php.

2827 {
2828 $MM =& $rs['mm']; // bits per symbol
2829 $NN =& $rs['nn']; // the total number of symbols in a RS block
2830 $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form
2831 $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form
2832 $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
2833 $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block
2834 $FCR =& $rs['fcr']; // first consecutive root, index form
2835 $PRIM =& $rs['prim']; // primitive element, index form
2836 $IPRIM =& $rs['iprim']; // prim-th root of 1, index form
2837 $PAD =& $rs['pad']; // the number of pad symbols in a block
2838 $A0 =& $NN;
2839 $parity = array_fill(0, $NROOTS, 0);
2840 for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
2841 $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
2842 if ($feedback != $A0) {
2843 // feedback term is non-zero
2844 // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
2845 // always be for the polynomials constructed by init_rs()
2846 $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
2847 for ($j=1; $j < $NROOTS; ++$j) {
2848 $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
2849 }
2850 }
2851 // Shift
2852 array_shift($parity);
2853 if ($feedback != $A0) {
2854 array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
2855 } else {
2856 array_push($parity, 0);
2857 }
2858 }
2859 return $parity;
2860 }
modnn($rs, $x)
modnn
Definition: qrcode.php:2725

References $data, and modnn().

Referenced by init().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeBitStream()

QRcode::encodeBitStream (   $inputitem,
  $version 
)
protected

encodeBitStream

Parameters
$inputitem(array)
$version(int)
Returns
array input item

Definition at line 1640 of file qrcode.php.

1640 {
1641 $inputitem['bstream'] = array();
1642 $words = $this->maximumWords($inputitem['mode'], $version);
1643 if ($inputitem['size'] > $words) {
1644 $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
1645 $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
1646 $st1 = $this->encodeBitStream($st1, $version);
1647 $st2 = $this->encodeBitStream($st2, $version);
1648 $inputitem['bstream'] = array();
1649 $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
1650 $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
1651 } else {
1652 switch($inputitem['mode']) {
1653 case QR_MODE_NM: {
1654 $inputitem = $this->encodeModeNum($inputitem, $version);
1655 break;
1656 }
1657 case QR_MODE_AN: {
1658 $inputitem = $this->encodeModeAn($inputitem, $version);
1659 break;
1660 }
1661 case QR_MODE_8B: {
1662 $inputitem = $this->encodeMode8($inputitem, $version);
1663 break;
1664 }
1665 case QR_MODE_KJ: {
1666 $inputitem = $this->encodeModeKanji($inputitem, $version);
1667 break;
1668 }
1669 case QR_MODE_ST: {
1670 $inputitem = $this->encodeModeStructure($inputitem);
1671 break;
1672 }
1673 default: {
1674 break;
1675 }
1676 }
1677 }
1678 return $inputitem;
1679 }
maximumWords($mode, $version)
Return the maximum length for the mode and version.
Definition: qrcode.php:2358
encodeModeStructure($inputitem)
encodeModeStructure
Definition: qrcode.php:1625
encodeModeAn($inputitem, $version)
encodeModeAn
Definition: qrcode.php:1563
encodeMode8($inputitem, $version)
encodeMode8
Definition: qrcode.php:1586
encodeModeNum($inputitem, $version)
encodeModeNum
Definition: qrcode.php:1534
encodeModeKanji($inputitem, $version)
encodeModeKanji
Definition: qrcode.php:1602

References $version, appendBitstream(), encodeBitStream(), encodeMode8(), encodeModeAn(), encodeModeKanji(), encodeModeNum(), encodeModeStructure(), maximumWords(), and newInputItem().

Referenced by createBitStream(), and encodeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeMask()

QRcode::encodeMask (   $mask)
protected

Encode mask.

Parameters
$mask(int) masking mode

Definition at line 720 of file qrcode.php.

720 {
721 $spec = array(0, 0, 0, 0, 0);
722 $this->datacode = $this->getByteStream($this->items);
723 if (is_null($this->datacode)) {
724 return NULL;
725 }
726 $spec = $this->getEccSpec($this->version, $this->level, $spec);
727 $this->b1 = $this->rsBlockNum1($spec);
728 $this->dataLength = $this->rsDataLength($spec);
729 $this->eccLength = $this->rsEccLength($spec);
730 $this->ecccode = array_fill(0, $this->eccLength, 0);
731 $this->blocks = $this->rsBlockNum($spec);
732 $ret = $this->init($spec);
733 if ($ret < 0) {
734 return NULL;
735 }
736 $this->count = 0;
737 $this->width = $this->getWidth($this->version);
738 $this->frame = $this->newFrame($this->version);
739 $this->x = $this->width - 1;
740 $this->y = $this->width - 1;
741 $this->dir = -1;
742 $this->bit = -1;
743 // inteleaved data and ecc codes
744 for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
745 $code = $this->getCode();
746 $bit = 0x80;
747 for ($j=0; $j<8; $j++) {
748 $addr = $this->getNextPosition();
749 $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
750 $bit = $bit >> 1;
751 }
752 }
753 // remainder bits
754 $j = $this->getRemainder($this->version);
755 for ($i=0; $i<$j; $i++) {
756 $addr = $this->getNextPosition();
757 $this->setFrameAt($addr, 0x02);
758 }
759 // masking
760 $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
761 if ($mask < 0) {
762 if (QR_FIND_BEST_MASK) {
763 $masked = $this->mask($this->width, $this->frame, $this->level);
764 } else {
765 $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
766 }
767 } else {
768 $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
769 }
770 if ($masked == NULL) {
771 return NULL;
772 }
773 $this->data = $masked;
774 }
getByteStream($items)
Pack all bit streams padding bits into a byte array.
Definition: qrcode.php:2114
getEccSpec($version, $level, $spec)
Return an array of ECC specification.
Definition: qrcode.php:2384
setFrameAt($at, $val)
Set frame value at specified position.
Definition: qrcode.php:785
rsBlockNum($spec)
Return block number 0.
Definition: qrcode.php:2612
$eccLength
Error correction length.
Definition: qrcode.php:415
rsEccLength($spec)
Return ecc length.
Definition: qrcode.php:2684
mask($width, $frame, $level)
mask
Definition: qrcode.php:1219
getNextPosition()
Return the next frame position.
Definition: qrcode.php:802
getCode()
Return Reed-Solomon block code.
Definition: qrcode.php:909
$bit
Single bit value.
Definition: qrcode.php:371
newFrame($version)
Set new frame for the specified version.
Definition: qrcode.php:2594
getWidth($version)
Return the width of the symbol for the version.
Definition: qrcode.php:2302
getRemainder($version)
Return the numer of remainder bits.
Definition: qrcode.php:2311
rsDataLength($spec)
Return data length.
Definition: qrcode.php:2675
rsBlockNum1($spec)
Return block number 1.
Definition: qrcode.php:2621
makeMask($width, $frame, $maskNo, $level)
makeMask
Definition: qrcode.php:1114
init($spec)
Initialize code.
Definition: qrcode.php:858

References $bit, $eccLength, $ret, getByteStream(), getCode(), getEccSpec(), getNextPosition(), getRemainder(), getWidth(), init(), makeMask(), mask(), newFrame(), rsBlockNum(), rsBlockNum1(), rsDataLength(), rsEccLength(), and setFrameAt().

Referenced by encodeString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeMode8()

QRcode::encodeMode8 (   $inputitem,
  $version 
)
protected

encodeMode8

Parameters
$inputitem(array)
$version(int)
Returns
array input item

Definition at line 1586 of file qrcode.php.

1586 {
1587 $inputitem['bstream'] = array();
1588 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
1589 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
1590 for ($i=0; $i < $inputitem['size']; ++$i) {
1591 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
1592 }
1593 return $inputitem;
1594 }

References $version, appendNum(), and lengthIndicator().

Referenced by encodeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeModeAn()

QRcode::encodeModeAn (   $inputitem,
  $version 
)
protected

encodeModeAn

Parameters
$inputitem(array)
$version(int)
Returns
array input item

Definition at line 1563 of file qrcode.php.

1563 {
1564 $words = (int)($inputitem['size'] / 2);
1565 $inputitem['bstream'] = array();
1566 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
1567 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
1568 for ($i=0; $i < $words; ++$i) {
1569 $val = (int)($this->lookAnTable(ord($inputitem['data'][$i*2])) * 45);
1570 $val += (int)($this->lookAnTable(ord($inputitem['data'][($i*2)+1])));
1571 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
1572 }
1573 if ($inputitem['size'] & 1) {
1574 $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
1575 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
1576 }
1577 return $inputitem;
1578 }

References $version, appendNum(), lengthIndicator(), and lookAnTable().

Referenced by encodeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeModeKanji()

QRcode::encodeModeKanji (   $inputitem,
  $version 
)
protected

encodeModeKanji

Parameters
$inputitem(array)
$version(int)
Returns
array input item

Definition at line 1602 of file qrcode.php.

1602 {
1603 $inputitem['bstream'] = array();
1604 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
1605 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
1606 for ($i=0; $i<$inputitem['size']; $i+=2) {
1607 $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
1608 if ($val <= 0x9ffc) {
1609 $val -= 0x8140;
1610 } else {
1611 $val -= 0xc140;
1612 }
1613 $h = ($val >> 8) * 0xc0;
1614 $val = ($val & 0xff) + $h;
1615 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
1616 }
1617 return $inputitem;
1618 }

References $version, appendNum(), and lengthIndicator().

Referenced by encodeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeModeNum()

QRcode::encodeModeNum (   $inputitem,
  $version 
)
protected

encodeModeNum

Parameters
$inputitem(array)
$version(int)
Returns
array input item

Definition at line 1534 of file qrcode.php.

1534 {
1535 $words = (int)($inputitem['size'] / 3);
1536 $inputitem['bstream'] = array();
1537 $val = 0x1;
1538 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
1539 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
1540 for ($i=0; $i < $words; ++$i) {
1541 $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
1542 $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
1543 $val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
1544 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
1545 }
1546 if ($inputitem['size'] - $words * 3 == 1) {
1547 $val = ord($inputitem['data'][$words*3]) - ord('0');
1548 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
1549 } elseif (($inputitem['size'] - ($words * 3)) == 2) {
1550 $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
1551 $val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
1552 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
1553 }
1554 return $inputitem;
1555 }

References $version, appendNum(), and lengthIndicator().

Referenced by encodeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeModeStructure()

QRcode::encodeModeStructure (   $inputitem)
protected

encodeModeStructure

Parameters
$inputitem(array)
Returns
array input item

Definition at line 1625 of file qrcode.php.

1625 {
1626 $inputitem['bstream'] = array();
1627 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
1628 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
1629 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
1630 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
1631 return $inputitem;
1632 }

References appendNum().

Referenced by encodeBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ encodeString()

QRcode::encodeString (   $string)
protected

Encode the input string to QR code.

Parameters
$string(string) input string to encode

Definition at line 704 of file qrcode.php.

704 {
705 $this->dataStr = $string;
706 if (!$this->casesensitive) {
707 $this->toUpper();
708 }
709 $ret = $this->splitString();
710 if ($ret < 0) {
711 return NULL;
712 }
713 $this->encodeMask(-1);
714 }
encodeMask($mask)
Encode mask.
Definition: qrcode.php:720
splitString()
splitString
Definition: qrcode.php:1444
toUpper()
toUpper
Definition: qrcode.php:1483

References $ret, encodeMask(), splitString(), and toUpper().

Referenced by __construct().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ estimateBitsMode8()

QRcode::estimateBitsMode8 (   $size)
protected

estimateBitsMode8

Parameters
$size(int)
Returns
int number of bits

Definition at line 1819 of file qrcode.php.

1819 {
1820 return (int)($size * 8);
1821 }

References $size.

Referenced by eat8(), eatAn(), eatNum(), and estimateBitStreamSize().

+ Here is the caller graph for this function:

◆ estimateBitsModeAn()

QRcode::estimateBitsModeAn (   $size)
protected

estimateBitsModeAn

Parameters
$size(int)
Returns
int number of bits

Definition at line 1806 of file qrcode.php.

1806 {
1807 $bits = (int)($size * 5.5); // (size / 2 ) * 11
1808 if ($size & 1) {
1809 $bits += 6;
1810 }
1811 return $bits;
1812 }

References $size.

Referenced by eat8(), eatAn(), eatNum(), and estimateBitStreamSize().

+ Here is the caller graph for this function:

◆ estimateBitsModeKanji()

QRcode::estimateBitsModeKanji (   $size)
protected

estimateBitsModeKanji

Parameters
$size(int)
Returns
int number of bits

Definition at line 1828 of file qrcode.php.

1828 {
1829 return (int)($size * 6.5); // (size / 2 ) * 13
1830 }

References $size.

Referenced by estimateBitStreamSize().

+ Here is the caller graph for this function:

◆ estimateBitsModeNum()

QRcode::estimateBitsModeNum (   $size)
protected

estimateBitsModeNum

Parameters
$size(int)
Returns
int number of bits

Definition at line 1785 of file qrcode.php.

1785 {
1786 $w = (int)($size / 3);
1787 $bits = ($w * 10);
1788 switch($size - ($w * 3)) {
1789 case 1: {
1790 $bits += 4;
1791 break;
1792 }
1793 case 2: {
1794 $bits += 7;
1795 break;
1796 }
1797 }
1798 return $bits;
1799 }

References $size.

Referenced by eat8(), eatAn(), eatNum(), and estimateBitStreamSize().

+ Here is the caller graph for this function:

◆ estimateBitStreamSize()

QRcode::estimateBitStreamSize (   $items,
  $version 
)
protected

estimateBitStreamSize

Parameters
$items(array)
$version(int)
Returns
int bits

Definition at line 1891 of file qrcode.php.

1891 {
1892 $bits = 0;
1893 if ($version == 0) {
1894 $version = 1;
1895 }
1896 foreach ($items as $item) {
1897 switch($item['mode']) {
1898 case QR_MODE_NM: {
1899 $bits = $this->estimateBitsModeNum($item['size']);
1900 break;
1901 }
1902 case QR_MODE_AN: {
1903 $bits = $this->estimateBitsModeAn($item['size']);
1904 break;
1905 }
1906 case QR_MODE_8B: {
1907 $bits = $this->estimateBitsMode8($item['size']);
1908 break;
1909 }
1910 case QR_MODE_KJ: {
1911 $bits = $this->estimateBitsModeKanji($item['size']);
1912 break;
1913 }
1914 case QR_MODE_ST: {
1915 return STRUCTURE_HEADER_BITS;
1916 }
1917 default: {
1918 return 0;
1919 }
1920 }
1921 $l = $this->lengthIndicator($item['mode'], $version);
1922 $m = 1 << $l;
1923 $num = (int)(($item['size'] + $m - 1) / $m);
1924 $bits += $num * (4 + $l);
1925 }
1926 return $bits;
1927 }
estimateBitsModeKanji($size)
estimateBitsModeKanji
Definition: qrcode.php:1828

References $items, $version, estimateBitsMode8(), estimateBitsModeAn(), estimateBitsModeKanji(), estimateBitsModeNum(), and lengthIndicator().

Referenced by estimateVersion().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ estimateVersion()

QRcode::estimateVersion (   $items)
protected

estimateVersion

Parameters
$items(array)
Returns
int version

Definition at line 1934 of file qrcode.php.

1934 {
1935 $version = 0;
1936 $prev = 0;
1937 do {
1938 $prev = $version;
1939 $bits = $this->estimateBitStreamSize($items, $prev);
1940 $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
1941 if ($version < 0) {
1942 return -1;
1943 }
1944 } while ($version > $prev);
1945 return $version;
1946 }
estimateBitStreamSize($items, $version)
estimateBitStreamSize
Definition: qrcode.php:1891

References $items, $version, estimateBitStreamSize(), and getMinimumVersion().

Referenced by convertData().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ evaluateSymbol()

QRcode::evaluateSymbol (   $width,
  $frame 
)
protected

evaluateSymbol

Parameters
$width(int)
$frame(array)
Returns
int demerit

Definition at line 1157 of file qrcode.php.

1157 {
1158 $head = 0;
1159 $demerit = 0;
1160 for ($y=0; $y<$width; ++$y) {
1161 $head = 0;
1162 $this->runLength[0] = 1;
1163 $frameY = $frame[$y];
1164 if ($y > 0) {
1165 $frameYM = $frame[$y-1];
1166 }
1167 for ($x=0; $x<$width; ++$x) {
1168 if (($x > 0) AND ($y > 0)) {
1169 $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
1170 $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
1171 if (($b22 | ($w22 ^ 1)) & 1) {
1172 $demerit += N2;
1173 }
1174 }
1175 if (($x == 0) AND (ord($frameY[$x]) & 1)) {
1176 $this->runLength[0] = -1;
1177 $head = 1;
1178 $this->runLength[$head] = 1;
1179 } elseif ($x > 0) {
1180 if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
1181 $head++;
1182 $this->runLength[$head] = 1;
1183 } else {
1184 $this->runLength[$head]++;
1185 }
1186 }
1187 }
1188 $demerit += $this->calcN1N3($head+1);
1189 }
1190 for ($x=0; $x<$width; ++$x) {
1191 $head = 0;
1192 $this->runLength[0] = 1;
1193 for ($y=0; $y<$width; ++$y) {
1194 if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
1195 $this->runLength[0] = -1;
1196 $head = 1;
1197 $this->runLength[$head] = 1;
1198 } elseif ($y > 0) {
1199 if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
1200 $head++;
1201 $this->runLength[$head] = 1;
1202 } else {
1203 $this->runLength[$head]++;
1204 }
1205 }
1206 }
1207 $demerit += $this->calcN1N3($head+1);
1208 }
1209 return $demerit;
1210 }
calcN1N3($length)
calcN1N3
Definition: qrcode.php:1126

References $frame, $width, $x, $y, and calcN1N3().

Referenced by mask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ generateMaskNo()

QRcode::generateMaskNo (   $maskNo,
  $width,
  $frame 
)
protected

Return bitmask.

Parameters
$maskNo(int) mask number
$width(int) width
$frame(array) frame
Returns
array bitmask

Definition at line 1063 of file qrcode.php.

1063 {
1064 $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
1065 for ($y=0; $y<$width; ++$y) {
1066 for ($x=0; $x<$width; ++$x) {
1067 if (ord($frame[$y][$x]) & 0x80) {
1068 $bitMask[$y][$x] = 0;
1069 } else {
1070 $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
1071 $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
1072 }
1073 }
1074 }
1075 return $bitMask;
1076 }

References $frame, $width, $x, and $y.

Referenced by makeMaskNo().

+ Here is the caller graph for this function:

◆ getBarcodeArray()

QRcode::getBarcodeArray ( )

Returns a barcode array which is readable by TCPDF.

Returns
array barcode array readable by TCPDF;

Definition at line 680 of file qrcode.php.

680 {
682 }

References $barcode_array.

◆ getBitStream()

QRcode::getBitStream (   $items)
protected

Returns a stream of bits.

Parameters
$items(int)
Returns
array padded merged byte stream

Definition at line 2104 of file qrcode.php.

2104 {
2105 $bstream = $this->mergeBitStream($items);
2106 return $this->appendPaddingBit($bstream);
2107 }
mergeBitStream($items)
mergeBitStream
Definition: qrcode.php:2087
appendPaddingBit($bstream)
Append Padding Bit to bitstream.
Definition: qrcode.php:2054

References $items, appendPaddingBit(), and mergeBitStream().

Referenced by getByteStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getByteStream()

QRcode::getByteStream (   $items)
protected

Pack all bit streams padding bits into a byte array.

Parameters
$items(int)
Returns
array padded merged byte stream

Definition at line 2114 of file qrcode.php.

2114 {
2115 $bstream = $this->getBitStream($items);
2116 return $this->bitstreamToByte($bstream);
2117 }
bitstreamToByte($bstream)
Convert bitstream to bytes.
Definition: qrcode.php:2227
getBitStream($items)
Returns a stream of bits.
Definition: qrcode.php:2104

References $items, bitstreamToByte(), and getBitStream().

Referenced by encodeMask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getCode()

QRcode::getCode ( )
protected

Return Reed-Solomon block code.

Returns
array rsblocks

Definition at line 909 of file qrcode.php.

909 {
910 if ($this->count < $this->dataLength) {
911 $row = $this->count % $this->blocks;
912 $col = $this->count / $this->blocks;
913 if ($col >= $this->rsblocks[0]['dataLength']) {
914 $row += $this->b1;
915 }
916 $ret = $this->rsblocks[$row]['data'][$col];
917 } elseif ($this->count < $this->dataLength + $this->eccLength) {
918 $row = ($this->count - $this->dataLength) % $this->blocks;
919 $col = ($this->count - $this->dataLength) / $this->blocks;
920 $ret = $this->rsblocks[$row]['ecc'][$col];
921 } else {
922 return 0;
923 }
924 $this->count++;
925 return $ret;
926 }
$b1
Value b1.
Definition: qrcode.php:421
$dataLength
Data length.
Definition: qrcode.php:409
$blocks
Blocks.
Definition: qrcode.php:391

References $b1, $blocks, $dataLength, $ret, and $row.

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ getDataLength()

QRcode::getDataLength (   $version,
  $level 
)
protected

Return maximum data code length (bytes) for the version.

Parameters
$version(int) version
$level(int) error correction level
Returns
int maximum size (bytes)

Definition at line 2283 of file qrcode.php.

2283 {
2284 return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
2285 }
$level
Levels of error correction.
Definition: qrcode.php:309

References $level, and $version.

Referenced by appendPaddingBit(), and getEccSpec().

+ Here is the caller graph for this function:

◆ getECCLength()

QRcode::getECCLength (   $version,
  $level 
)
protected

Return maximum error correction code length (bytes) for the version.

Parameters
$version(int) version
$level(int) error correction level
Returns
int ECC size (bytes)

Definition at line 2293 of file qrcode.php.

2293 {
2294 return $this->capacity[$version][QRCAP_EC][$level];
2295 }

References $level, and $version.

Referenced by getEccSpec().

+ Here is the caller graph for this function:

◆ getEccSpec()

QRcode::getEccSpec (   $version,
  $level,
  $spec 
)
protected

Return an array of ECC specification.

Parameters
$version(int) version
$level(int) error correction level
$spec(array) an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
Returns
array spec

Definition at line 2384 of file qrcode.php.

2384 {
2385 if (count($spec) < 5) {
2386 $spec = array(0, 0, 0, 0, 0);
2387 }
2388 $b1 = $this->eccTable[$version][$level][0];
2389 $b2 = $this->eccTable[$version][$level][1];
2391 $ecc = $this->getECCLength($version, $level);
2392 if ($b2 == 0) {
2393 $spec[0] = $b1;
2394 $spec[1] = (int)($data / $b1);
2395 $spec[2] = (int)($ecc / $b1);
2396 $spec[3] = 0;
2397 $spec[4] = 0;
2398 } else {
2399 $spec[0] = $b1;
2400 $spec[1] = (int)($data / ($b1 + $b2));
2401 $spec[2] = (int)($ecc / ($b1 + $b2));
2402 $spec[3] = $b2;
2403 $spec[4] = $spec[1] + 1;
2404 }
2405 return $spec;
2406 }
getECCLength($version, $level)
Return maximum error correction code length (bytes) for the version.
Definition: qrcode.php:2293

References $b1, $data, $level, $version, getDataLength(), and getECCLength().

Referenced by encodeMask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getFormatInfo()

QRcode::getFormatInfo (   $mask,
  $level 
)
protected

Return BCH encoded format information pattern.

Parameters
$mask(array)
$level(int) error correction level
Returns
BCH encoded format information pattern

Definition at line 2491 of file qrcode.php.

2491 {
2492 if (($mask < 0) OR ($mask > 7)) {
2493 return 0;
2494 }
2495 if (($level < 0) OR ($level > 3)) {
2496 return 0;
2497 }
2498 return $this->formatInfo[$level][$mask];
2499 }

References $level.

Referenced by writeFormatInformation().

+ Here is the caller graph for this function:

◆ getFrameAt()

QRcode::getFrameAt (   $at)
protected

Get frame value at specified position.

Parameters
$at(array) x,y position
Returns
value at specified position

Definition at line 794 of file qrcode.php.

794 {
795 return ord($this->frame[$at['y']][$at['x']]);
796 }

◆ getMinimumVersion()

QRcode::getMinimumVersion (   $size,
  $level 
)
protected

Return a version number that satisfies the input code length.

Parameters
$size(int) input code length (bytes)
$level(int) error correction level
Returns
int version number

Definition at line 2321 of file qrcode.php.

2321 {
2322 for ($i = 1; $i <= QRSPEC_VERSION_MAX; ++$i) {
2323 $words = ($this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]);
2324 if ($words >= $size) {
2325 return $i;
2326 }
2327 }
2328 // the size of input data is greater than QR capacity, try to lover the error correction mode
2329 return -1;
2330 }

References $level, and $size.

Referenced by convertData(), and estimateVersion().

+ Here is the caller graph for this function:

◆ getNextPosition()

QRcode::getNextPosition ( )
protected

Return the next frame position.

Returns
array of x,y coordinates

Definition at line 802 of file qrcode.php.

802 {
803 do {
804 if ($this->bit == -1) {
805 $this->bit = 0;
806 return array('x'=>$this->x, 'y'=>$this->y);
807 }
808 $x = $this->x;
809 $y = $this->y;
810 $w = $this->width;
811 if ($this->bit == 0) {
812 $x--;
813 $this->bit++;
814 } else {
815 $x++;
816 $y += $this->dir;
817 $this->bit--;
818 }
819 if ($this->dir < 0) {
820 if ($y < 0) {
821 $y = 0;
822 $x -= 2;
823 $this->dir = 1;
824 if ($x == 6) {
825 $x--;
826 $y = 9;
827 }
828 }
829 } else {
830 if ($y == $w) {
831 $y = $w - 1;
832 $x -= 2;
833 $this->dir = -1;
834 if ($x == 6) {
835 $x--;
836 $y -= 8;
837 }
838 }
839 }
840 if (($x < 0) OR ($y < 0)) {
841 return NULL;
842 }
843 $this->x = $x;
844 $this->y = $y;
845 } while(ord($this->frame[$y][$x]) & 0x80);
846 return array('x'=>$x, 'y'=>$y);
847 }
$dir
Direction.
Definition: qrcode.php:365

References $dir, $width, $x, and $y.

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ getRemainder()

QRcode::getRemainder (   $version)
protected

Return the numer of remainder bits.

Parameters
$version(int) version
Returns
int number of remainder bits

Definition at line 2311 of file qrcode.php.

2311 {
2312 return $this->capacity[$version][QRCAP_REMINDER];
2313 }

References $version.

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ getVersionPattern()

QRcode::getVersionPattern (   $version)
protected

Return BCH encoded version information pattern that is used for the symbol of version 7 or greater.

Use lower 18 bits.

Parameters
$version(int) version
Returns
BCH encoded version information pattern

Definition at line 2478 of file qrcode.php.

2478 {
2479 if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
2480 return 0;
2481 }
2482 return $this->versionPattern[($version - 7)];
2483 }

References $version.

Referenced by createFrame().

+ Here is the caller graph for this function:

◆ getWidth()

QRcode::getWidth (   $version)
protected

Return the width of the symbol for the version.

Parameters
$version(int) version
Returns
int width

Definition at line 2302 of file qrcode.php.

2302 {
2303 return $this->capacity[$version][QRCAP_WIDTH];
2304 }

References $version.

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ identifyMode()

QRcode::identifyMode (   $pos)
protected

identifyMode

Parameters
$pos(int)
Returns
int mode

Definition at line 1286 of file qrcode.php.

1286 {
1287 if ($pos >= strlen($this->dataStr)) {
1288 return QR_MODE_NL;
1289 }
1290 $c = $this->dataStr[$pos];
1291 if ($this->isdigitat($this->dataStr, $pos)) {
1292 return QR_MODE_NM;
1293 } elseif ($this->isalnumat($this->dataStr, $pos)) {
1294 return QR_MODE_AN;
1295 } elseif ($this->hint == QR_MODE_KJ) {
1296 if ($pos+1 < strlen($this->dataStr)) {
1297 $d = $this->dataStr[$pos+1];
1298 $word = (ord($c) << 8) | ord($d);
1299 if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
1300 return QR_MODE_KJ;
1301 }
1302 }
1303 }
1304 return QR_MODE_8B;
1305 }

References $d, isalnumat(), and isdigitat().

Referenced by eat8(), eatKanji(), eatNum(), splitString(), and toUpper().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init()

QRcode::init (   $spec)
protected

Initialize code.

Parameters
$spec(array) array of ECC specification
Returns
0 in case of success, -1 in case of error

Definition at line 858 of file qrcode.php.

858 {
859 $dl = $this->rsDataCodes1($spec);
860 $el = $this->rsEccCodes1($spec);
861 $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
862 $blockNo = 0;
863 $dataPos = 0;
864 $eccPos = 0;
865 $endfor = $this->rsBlockNum1($spec);
866 for ($i=0; $i < $endfor; ++$i) {
867 $ecc = array_slice($this->ecccode, $eccPos);
868 $this->rsblocks[$blockNo] = array();
869 $this->rsblocks[$blockNo]['dataLength'] = $dl;
870 $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
871 $this->rsblocks[$blockNo]['eccLength'] = $el;
872 $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
873 $this->rsblocks[$blockNo]['ecc'] = $ecc;
874 $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
875 $dataPos += $dl;
876 $eccPos += $el;
877 $blockNo++;
878 }
879 if ($this->rsBlockNum2($spec) == 0) {
880 return 0;
881 }
882 $dl = $this->rsDataCodes2($spec);
883 $el = $this->rsEccCodes2($spec);
884 $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
885 if ($rs == NULL) {
886 return -1;
887 }
888 $endfor = $this->rsBlockNum2($spec);
889 for ($i=0; $i < $endfor; ++$i) {
890 $ecc = array_slice($this->ecccode, $eccPos);
891 $this->rsblocks[$blockNo] = array();
892 $this->rsblocks[$blockNo]['dataLength'] = $dl;
893 $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
894 $this->rsblocks[$blockNo]['eccLength'] = $el;
895 $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
896 $this->rsblocks[$blockNo]['ecc'] = $ecc;
897 $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
898 $dataPos += $dl;
899 $eccPos += $el;
900 $blockNo++;
901 }
902 return 0;
903 }
encode_rs_char($rs, $data, $parity)
Encode a Reed-Solomon codec and returns the parity array.
Definition: qrcode.php:2827
rsBlockNum2($spec)
Return block number 2.
Definition: qrcode.php:2648
rsEccCodes2($spec)
Return ecc codes 2.
Definition: qrcode.php:2666
rsEccCodes1($spec)
Return ecc codes 1.
Definition: qrcode.php:2639
rsDataCodes2($spec)
Return data codes 2.
Definition: qrcode.php:2657
init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
Initialize a Reed-Solomon codec and add it to existing rsitems.
Definition: qrcode.php:2702
rsDataCodes1($spec)
Return data codes 1.
Definition: qrcode.php:2630

References encode_rs_char(), init_rs(), rsBlockNum1(), rsBlockNum2(), rsDataCodes1(), rsDataCodes2(), rsEccCodes1(), and rsEccCodes2().

Referenced by encodeMask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_rs()

QRcode::init_rs (   $symsize,
  $gfpoly,
  $fcr,
  $prim,
  $nroots,
  $pad 
)
protected

Initialize a Reed-Solomon codec and add it to existing rsitems.

Parameters
$symsize(int) symbol size, bits
$gfpoly(int) Field generator polynomial coefficients
$fcr(int) first root of RS code generator polynomial, index form
$prim(int) primitive element to generate polynomial roots
$nroots(int) RS code generator polynomial degree (number of roots)
$pad(int) padding bytes at front of shortened block
Returns
array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
.

Definition at line 2702 of file qrcode.php.

2702 {
2703 foreach ($this->rsitems as $rs) {
2704 if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
2705 OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
2706 continue;
2707 }
2708 return $rs;
2709 }
2710 $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
2711 array_unshift($this->rsitems, $rs);
2712 return $rs;
2713 }
init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
Initialize a Reed-Solomon codec and returns an array of values.
Definition: qrcode.php:2743

References init_rs_char().

Referenced by init().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ init_rs_char()

QRcode::init_rs_char (   $symsize,
  $gfpoly,
  $fcr,
  $prim,
  $nroots,
  $pad 
)
protected

Initialize a Reed-Solomon codec and returns an array of values.

Parameters
$symsize(int) symbol size, bits
$gfpoly(int) Field generator polynomial coefficients
$fcr(int) first root of RS code generator polynomial, index form
$prim(int) primitive element to generate polynomial roots
$nroots(int) RS code generator polynomial degree (number of roots)
$pad(int) padding bytes at front of shortened block
Returns
array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
.

Definition at line 2743 of file qrcode.php.

2743 {
2744 // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
2745 $rs = null;
2746 // Check parameter ranges
2747 if (($symsize < 0) OR ($symsize > 8)) {
2748 return $rs;
2749 }
2750 if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
2751 return $rs;
2752 }
2753 if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
2754 return $rs;
2755 }
2756 if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
2757 return $rs;
2758 }
2759 if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
2760 return $rs;
2761 }
2762 $rs = array();
2763 $rs['mm'] = $symsize;
2764 $rs['nn'] = (1 << $symsize) - 1;
2765 $rs['pad'] = $pad;
2766 $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
2767 $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
2768 // PHP style macro replacement ;)
2769 $NN =& $rs['nn'];
2770 $A0 =& $NN;
2771 // Generate Galois field lookup tables
2772 $rs['index_of'][0] = $A0; // log(zero) = -inf
2773 $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
2774 $sr = 1;
2775 for ($i=0; $i<$rs['nn']; ++$i) {
2776 $rs['index_of'][$sr] = $i;
2777 $rs['alpha_to'][$i] = $sr;
2778 $sr <<= 1;
2779 if ($sr & (1 << $symsize)) {
2780 $sr ^= $gfpoly;
2781 }
2782 $sr &= $rs['nn'];
2783 }
2784 if ($sr != 1) {
2785 // field generator polynomial is not primitive!
2786 return NULL;
2787 }
2788 // Form RS code generator polynomial from its roots
2789 $rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
2790 $rs['fcr'] = $fcr;
2791 $rs['prim'] = $prim;
2792 $rs['nroots'] = $nroots;
2793 $rs['gfpoly'] = $gfpoly;
2794 // Find prim-th root of 1, used in decoding
2795 for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
2796 ; // intentional empty-body loop!
2797 }
2798 $rs['iprim'] = (int)($iprim / $prim);
2799 $rs['genpoly'][0] = 1;
2800 for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
2801 $rs['genpoly'][$i+1] = 1;
2802 // Multiply rs->genpoly[] by @**(root + x)
2803 for ($j = $i; $j > 0; --$j) {
2804 if ($rs['genpoly'][$j] != 0) {
2805 $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
2806 } else {
2807 $rs['genpoly'][$j] = $rs['genpoly'][$j-1];
2808 }
2809 }
2810 // rs->genpoly[0] can never be zero
2811 $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
2812 }
2813 // convert rs->genpoly[] to index form for quicker encoding
2814 for ($i = 0; $i <= $nroots; ++$i) {
2815 $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
2816 }
2817 return $rs;
2818 }

References modnn().

Referenced by init_rs().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ insertStructuredAppendHeader()

QRcode::insertStructuredAppendHeader (   $items,
  $size,
  $index,
  $parity 
)
protected

insertStructuredAppendHeader

Parameters
$items(array)
$size(int)
$index(int)
$parity(int)
Returns
array items

Definition at line 1711 of file qrcode.php.

1711 {
1712 if ($size > MAX_STRUCTURED_SYMBOLS) {
1713 return -1;
1714 }
1715 if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
1716 return -1;
1717 }
1718 $buf = array($size, $index, $parity);
1719 $entry = $this->newInputItem(QR_MODE_ST, 3, buf);
1720 array_unshift($items, $entry);
1721 return $items;
1722 }

References $items, $size, and newInputItem().

+ Here is the call graph for this function:

◆ isalnumat()

QRcode::isalnumat (   $str,
  $pos 
)
protected

Return true if the character at specified position is an alphanumeric character.

Parameters
$str(string) string
$pos(int) characted position
Returns
boolean true of false

Definition at line 1274 of file qrcode.php.

1274 {
1275 if ($pos >= strlen($str)) {
1276 return false;
1277 }
1278 return ($this->lookAnTable(ord($str[$pos])) >= 0);
1279 }

References lookAnTable().

Referenced by eat8(), eatAn(), and identifyMode().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isdigitat()

QRcode::isdigitat (   $str,
  $pos 
)
protected

Return true if the character at specified position is a number.

Parameters
$str(string) string
$pos(int) characted position
Returns
boolean true of false

Definition at line 1261 of file qrcode.php.

1261 {
1262 if ($pos >= strlen($str)) {
1263 return false;
1264 }
1265 return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
1266 }

Referenced by eat8(), eatAn(), eatNum(), and identifyMode().

+ Here is the caller graph for this function:

◆ lengthIndicator()

QRcode::lengthIndicator (   $mode,
  $version 
)
protected

Return the size of length indicator for the mode and version.

Parameters
$mode(int) encoding mode
$version(int) version
Returns
int the size of the appropriate length indicator (bits).

Definition at line 2338 of file qrcode.php.

2338 {
2339 if ($mode == QR_MODE_ST) {
2340 return 0;
2341 }
2342 if ($version <= 9) {
2343 $l = 0;
2344 } elseif ($version <= 26) {
2345 $l = 1;
2346 } else {
2347 $l = 2;
2348 }
2349 return $this->lengthTableBits[$mode][$l];
2350 }

References $version.

Referenced by eat8(), eatAn(), eatNum(), encodeMode8(), encodeModeAn(), encodeModeKanji(), encodeModeNum(), estimateBitStreamSize(), and lengthOfCode().

+ Here is the caller graph for this function:

◆ lengthOfCode()

QRcode::lengthOfCode (   $mode,
  $version,
  $bits 
)
protected

lengthOfCode

Parameters
$mode(int)
$version(int)
$bits(int)
Returns
int size

Definition at line 1955 of file qrcode.php.

1955 {
1956 $payload = $bits - 4 - $this->lengthIndicator($mode, $version);
1957 switch($mode) {
1958 case QR_MODE_NM: {
1959 $chunks = (int)($payload / 10);
1960 $remain = $payload - $chunks * 10;
1961 $size = $chunks * 3;
1962 if ($remain >= 7) {
1963 $size += 2;
1964 } elseif ($remain >= 4) {
1965 $size += 1;
1966 }
1967 break;
1968 }
1969 case QR_MODE_AN: {
1970 $chunks = (int)($payload / 11);
1971 $remain = $payload - $chunks * 11;
1972 $size = $chunks * 2;
1973 if ($remain >= 6) {
1974 ++$size;
1975 }
1976 break;
1977 }
1978 case QR_MODE_8B: {
1979 $size = (int)($payload / 8);
1980 break;
1981 }
1982 case QR_MODE_KJ: {
1983 $size = (int)(($payload / 13) * 2);
1984 break;
1985 }
1986 case QR_MODE_ST: {
1987 $size = (int)($payload / 8);
1988 break;
1989 }
1990 default: {
1991 $size = 0;
1992 break;
1993 }
1994 }
1995 $maxsize = $this->maximumWords($mode, $version);
1996 if ($size < 0) {
1997 $size = 0;
1998 }
1999 if ($size > $maxsize) {
2000 $size = $maxsize;
2001 }
2002 return $size;
2003 }

References $size, $version, lengthIndicator(), and maximumWords().

+ Here is the call graph for this function:

◆ lookAnTable()

QRcode::lookAnTable (   $c)
protected

Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).

Parameters
$c(int) character value
Returns
value

Definition at line 1761 of file qrcode.php.

1761 {
1762 return (($c > 127)?-1:$this->anTable[$c]);
1763 }

Referenced by checkModeAn(), encodeModeAn(), and isalnumat().

+ Here is the caller graph for this function:

◆ makeMask()

QRcode::makeMask (   $width,
  $frame,
  $maskNo,
  $level 
)
protected

makeMask

Parameters
$width(int)
$frame(array)
$maskNo(int)
$level(int)
Returns
array mask

Definition at line 1114 of file qrcode.php.

1114 {
1115 $masked = array_fill(0, $width, str_repeat("\0", $width));
1116 $this->makeMaskNo($maskNo, $width, $frame, $masked);
1117 $this->writeFormatInformation($width, $masked, $maskNo, $level);
1118 return $masked;
1119 }
makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false)
makeMaskNo
Definition: qrcode.php:1087
writeFormatInformation($width, &$frame, $mask, $level)
Write Format Information on frame and returns the number of black bits.
Definition: qrcode.php:940

References $frame, $level, $width, makeMaskNo(), and writeFormatInformation().

Referenced by encodeMask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ makeMaskNo()

QRcode::makeMaskNo (   $maskNo,
  $width,
  $s,
$d,
  $maskGenOnly = false 
)
protected

makeMaskNo

Parameters
$maskNo(int)
$width(int)
$s(int)
$d(int)
$maskGenOnly(boolean)
Returns
int b

Definition at line 1087 of file qrcode.php.

1087 {
1088 $b = 0;
1089 $bitMask = array();
1090 $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
1091 if ($maskGenOnly) {
1092 return;
1093 }
1094 $d = $s;
1095 for ($y=0; $y<$width; ++$y) {
1096 for ($x=0; $x<$width; ++$x) {
1097 if ($bitMask[$y][$x] == 1) {
1098 $d[$y][$x] = chr(ord($s[$y][$x]) ^ ((int)($bitMask[$y][$x])));
1099 }
1100 $b += (int)(ord($d[$y][$x]) & 1);
1101 }
1102 }
1103 return $b;
1104 }
generateMaskNo($maskNo, $width, $frame)
Return bitmask.
Definition: qrcode.php:1063

References $d, $width, $x, $y, and generateMaskNo().

Referenced by makeMask(), and mask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mask()

QRcode::mask (   $width,
  $frame,
  $level 
)
protected

mask

Parameters
$width(int)
$frame(array)
$level(int)
Returns
array best mask

Definition at line 1219 of file qrcode.php.

1219 {
1220 $minDemerit = PHP_INT_MAX;
1221 $bestMaskNum = 0;
1222 $bestMask = array();
1223 $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
1224 if (QR_FIND_FROM_RANDOM !== false) {
1225 $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
1226 for ($i = 0; $i < $howManuOut; ++$i) {
1227 $remPos = rand (0, count($checked_masks)-1);
1228 unset($checked_masks[$remPos]);
1229 $checked_masks = array_values($checked_masks);
1230 }
1231 }
1232 $bestMask = $frame;
1233 foreach ($checked_masks as $i) {
1234 $mask = array_fill(0, $width, str_repeat("\0", $width));
1235 $demerit = 0;
1236 $blacks = 0;
1237 $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
1238 $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
1239 $blacks = (int)(100 * $blacks / ($width * $width));
1240 $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
1241 $demerit += $this->evaluateSymbol($width, $mask);
1242 if ($demerit < $minDemerit) {
1243 $minDemerit = $demerit;
1244 $bestMask = $mask;
1245 $bestMaskNum = $i;
1246 }
1247 }
1248 return $bestMask;
1249 }
evaluateSymbol($width, $frame)
evaluateSymbol
Definition: qrcode.php:1157

References $frame, $level, $width, evaluateSymbol(), makeMaskNo(), and writeFormatInformation().

Referenced by encodeMask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ mask0()

QRcode::mask0 (   $x,
  $y 
)
protected

mask0

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 982 of file qrcode.php.

982 {
983 return ($x + $y) & 1;
984 }

References $x, and $y.

◆ mask1()

QRcode::mask1 (   $x,
  $y 
)
protected

mask1

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 992 of file qrcode.php.

992 {
993 return ($y & 1);
994 }

References $y.

◆ mask2()

QRcode::mask2 (   $x,
  $y 
)
protected

mask2

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 1002 of file qrcode.php.

1002 {
1003 return ($x % 3);
1004 }

References $x.

◆ mask3()

QRcode::mask3 (   $x,
  $y 
)
protected

mask3

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 1012 of file qrcode.php.

1012 {
1013 return ($x + $y) % 3;
1014 }

References $x, and $y.

◆ mask4()

QRcode::mask4 (   $x,
  $y 
)
protected

mask4

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 1022 of file qrcode.php.

1022 {
1023 return (((int)($y / 2)) + ((int)($x / 3))) & 1;
1024 }

References $x, and $y.

◆ mask5()

QRcode::mask5 (   $x,
  $y 
)
protected

mask5

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 1032 of file qrcode.php.

1032 {
1033 return (($x * $y) & 1) + ($x * $y) % 3;
1034 }

References $x, and $y.

◆ mask6()

QRcode::mask6 (   $x,
  $y 
)
protected

mask6

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 1042 of file qrcode.php.

1042 {
1043 return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
1044 }

References $x, and $y.

◆ mask7()

QRcode::mask7 (   $x,
  $y 
)
protected

mask7

Parameters
$x(int) X position
$y(int) Y position
Returns
int mask

Definition at line 1052 of file qrcode.php.

1052 {
1053 return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
1054 }

References $x, and $y.

◆ maximumWords()

QRcode::maximumWords (   $mode,
  $version 
)
protected

Return the maximum length for the mode and version.

Parameters
$mode(int) encoding mode
$version(int) version
Returns
int the maximum length (bytes)

Definition at line 2358 of file qrcode.php.

2358 {
2359 if ($mode == QR_MODE_ST) {
2360 return 3;
2361 }
2362 if ($version <= 9) {
2363 $l = 0;
2364 } else if ($version <= 26) {
2365 $l = 1;
2366 } else {
2367 $l = 2;
2368 }
2369 $bits = $this->lengthTableBits[$mode][$l];
2370 $words = (1 << $bits) - 1;
2371 if ($mode == QR_MODE_KJ) {
2372 $words *= 2; // the number of bytes is required
2373 }
2374 return $words;
2375 }

References $version.

Referenced by encodeBitStream(), and lengthOfCode().

+ Here is the caller graph for this function:

◆ mergeBitStream()

QRcode::mergeBitStream (   $items)
protected

mergeBitStream

Parameters
$items(array) items
Returns
array bitstream

Definition at line 2087 of file qrcode.php.

2087 {
2088 $items = $this->convertData($items);
2089 if (!is_array($items)) {
2090 return null;
2091 }
2092 $bstream = array();
2093 foreach ($items as $item) {
2094 $bstream = $this->appendBitstream($bstream, $item['bstream']);
2095 }
2096 return $bstream;
2097 }
convertData($items)
convertData
Definition: qrcode.php:2025

References $items, appendBitstream(), and convertData().

Referenced by getBitStream().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ modnn()

QRcode::modnn (   $rs,
  $x 
)
protected

modnn

Parameters
$rs(array) RS values
$x(int) X position
Returns
int X osition

Definition at line 2725 of file qrcode.php.

2725 {
2726 while ($x >= $rs['nn']) {
2727 $x -= $rs['nn'];
2728 $x = ($x >> $rs['mm']) + ($x & $rs['nn']);
2729 }
2730 return $x;
2731 }

References $x.

Referenced by encode_rs_char(), and init_rs_char().

+ Here is the caller graph for this function:

◆ newFrame()

QRcode::newFrame (   $version)
protected

Set new frame for the specified version.

Parameters
$version(int) version
Returns
Array of unsigned char.

Definition at line 2594 of file qrcode.php.

2594 {
2595 if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
2596 return NULL;
2597 }
2598 if (!isset($this->frames[$version])) {
2599 $this->frames[$version] = $this->createFrame($version);
2600 }
2601 if (is_null($this->frames[$version])) {
2602 return NULL;
2603 }
2604 return $this->frames[$version];
2605 }
createFrame($version)
Return a copy of initialized frame.
Definition: qrcode.php:2529

References $version, and createFrame().

Referenced by encodeMask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newFromBytes()

QRcode::newFromBytes (   $size,
  $data 
)
protected

Return new bitstream from bytes.

Parameters
$size(int) size
$data(array) bytes
Returns
array bitstream

Definition at line 2158 of file qrcode.php.

2158 {
2159 $bstream = $this->allocate($size * 8);
2160 $p=0;
2161 for ($i=0; $i<$size; ++$i) {
2162 $mask = 0x80;
2163 for ($j=0; $j<8; ++$j) {
2164 if ($data[$i] & $mask) {
2165 $bstream[$p] = 1;
2166 } else {
2167 $bstream[$p] = 0;
2168 }
2169 $p++;
2170 $mask = $mask >> 1;
2171 }
2172 }
2173 return $bstream;
2174 }
allocate($setLength)
Return an array with zeros.
Definition: qrcode.php:2128

References $data, $size, and allocate().

Referenced by appendBytes().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newFromNum()

QRcode::newFromNum (   $bits,
  $num 
)
protected

Return new bitstream from number.

Parameters
$bits(int) number of bits
$num(int) number
Returns
array bitstream

Definition at line 2138 of file qrcode.php.

2138 {
2139 $bstream = $this->allocate($bits);
2140 $mask = 1 << ($bits - 1);
2141 for ($i=0; $i<$bits; ++$i) {
2142 if ($num & $mask) {
2143 $bstream[$i] = 1;
2144 } else {
2145 $bstream[$i] = 0;
2146 }
2147 $mask = $mask >> 1;
2148 }
2149 return $bstream;
2150 }

References allocate().

Referenced by appendNum().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newInputItem()

QRcode::newInputItem (   $mode,
  $size,
  $data,
  $bstream = null 
)
protected

newInputItem

Parameters
$mode(int)
$size(int)
$data(array)
$bstream(array)
Returns
array input item

Definition at line 1512 of file qrcode.php.

1512 {
1513 $setData = array_slice($data, 0, $size);
1514 if (count($setData) < $size) {
1515 $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
1516 }
1517 if (!$this->check($mode, $size, $setData)) {
1518 return NULL;
1519 }
1520 $inputitem = array();
1521 $inputitem['mode'] = $mode;
1522 $inputitem['size'] = $size;
1523 $inputitem['data'] = $setData;
1524 $inputitem['bstream'] = $bstream;
1525 return $inputitem;
1526 }
check($mode, $size, $data)
Validate the input data.
Definition: qrcode.php:1858

References $data, $size, and check().

Referenced by appendNewInputItem(), encodeBitStream(), and insertStructuredAppendHeader().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ putAlignmentMarker()

QRcode::putAlignmentMarker (   $frame,
  $ox,
  $oy 
)
protected

Put an alignment marker.

Parameters
$frame(array) frame
$ox(int) X center coordinate of the pattern
$oy(int) Y center coordinate of the pattern
Returns
array frame

Definition at line 2415 of file qrcode.php.

2415 {
2416 $finder = array(
2417 "\xa1\xa1\xa1\xa1\xa1",
2418 "\xa1\xa0\xa0\xa0\xa1",
2419 "\xa1\xa0\xa1\xa0\xa1",
2420 "\xa1\xa0\xa0\xa0\xa1",
2421 "\xa1\xa1\xa1\xa1\xa1"
2422 );
2423 $yStart = $oy - 2;
2424 $xStart = $ox - 2;
2425 for ($y=0; $y < 5; $y++) {
2426 $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
2427 }
2428 return $frame;
2429 }

References $frame, $y, and qrstrset().

Referenced by putAlignmentPattern().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ putAlignmentPattern()

QRcode::putAlignmentPattern (   $version,
  $frame,
  $width 
)
protected

Put an alignment pattern.

Parameters
$version(int) version
$frame(array) frame
$width(int) width
Returns
array frame

Definition at line 2438 of file qrcode.php.

2438 {
2439 if ($version < 2) {
2440 return $frame;
2441 }
2442 $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
2443 if ($d < 0) {
2444 $w = 2;
2445 } else {
2446 $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
2447 }
2448 if ($w * $w - 3 == 1) {
2449 $x = $this->alignmentPattern[$version][0];
2450 $y = $this->alignmentPattern[$version][0];
2451 $frame = $this->putAlignmentMarker($frame, $x, $y);
2452 return $frame;
2453 }
2454 $cx = $this->alignmentPattern[$version][0];
2455 $wo = $w - 1;
2456 for ($x=1; $x < $wo; ++$x) {
2457 $frame = $this->putAlignmentMarker($frame, 6, $cx);
2458 $frame = $this->putAlignmentMarker($frame, $cx, 6);
2459 $cx += $d;
2460 }
2461 $cy = $this->alignmentPattern[$version][0];
2462 for ($y=0; $y < $wo; ++$y) {
2463 $cx = $this->alignmentPattern[$version][0];
2464 for ($x=0; $x < $wo; ++$x) {
2465 $frame = $this->putAlignmentMarker($frame, $cx, $cy);
2466 $cx += $d;
2467 }
2468 $cy += $d;
2469 }
2470 return $frame;
2471 }
putAlignmentMarker($frame, $ox, $oy)
Put an alignment marker.
Definition: qrcode.php:2415

References $d, $frame, $version, $width, $x, $y, and putAlignmentMarker().

Referenced by createFrame().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ putFinderPattern()

QRcode::putFinderPattern (   $frame,
  $ox,
  $oy 
)
protected

Put a finder pattern.

Parameters
$frame(array) frame
$ox(int) X center coordinate of the pattern
$oy(int) Y center coordinate of the pattern
Returns
array frame

Definition at line 2508 of file qrcode.php.

2508 {
2509 $finder = array(
2510 "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
2511 "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
2512 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
2513 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
2514 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
2515 "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
2516 "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
2517 );
2518 for ($y=0; $y < 7; $y++) {
2519 $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
2520 }
2521 return $frame;
2522 }

References $frame, $y, and qrstrset().

Referenced by createFrame().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ qrstrset()

QRcode::qrstrset (   $srctab,
  $x,
  $y,
  $repl,
  $replLen = false 
)
protected

Replace a value on the array at the specified position.

Parameters
$srctab(array)
$x(int) X position
$y(int) Y position
$repl(string) value to replace
$replLen(int) length of the repl string
Returns
array srctab

Definition at line 2272 of file qrcode.php.

2272 {
2273 $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
2274 return $srctab;
2275 }

References $x, and $y.

Referenced by createFrame(), putAlignmentMarker(), and putFinderPattern().

+ Here is the caller graph for this function:

◆ rsBlockNum()

QRcode::rsBlockNum (   $spec)
protected

Return block number 0.

Parameters
$spec(array)
Returns
int value

Definition at line 2612 of file qrcode.php.

2612 {
2613 return ($spec[0] + $spec[3]);
2614 }

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ rsBlockNum1()

QRcode::rsBlockNum1 (   $spec)
protected

Return block number 1.

Parameters
$spec(array)
Returns
int value

Definition at line 2621 of file qrcode.php.

2621 {
2622 return $spec[0];
2623 }

Referenced by encodeMask(), and init().

+ Here is the caller graph for this function:

◆ rsBlockNum2()

QRcode::rsBlockNum2 (   $spec)
protected

Return block number 2.

Parameters
$spec(array)
Returns
int value

Definition at line 2648 of file qrcode.php.

2648 {
2649 return $spec[3];
2650 }

Referenced by init().

+ Here is the caller graph for this function:

◆ rsDataCodes1()

QRcode::rsDataCodes1 (   $spec)
protected

Return data codes 1.

Parameters
$spec(array)
Returns
int value

Definition at line 2630 of file qrcode.php.

2630 {
2631 return $spec[1];
2632 }

Referenced by init().

+ Here is the caller graph for this function:

◆ rsDataCodes2()

QRcode::rsDataCodes2 (   $spec)
protected

Return data codes 2.

Parameters
$spec(array)
Returns
int value

Definition at line 2657 of file qrcode.php.

2657 {
2658 return $spec[4];
2659 }

Referenced by init().

+ Here is the caller graph for this function:

◆ rsDataLength()

QRcode::rsDataLength (   $spec)
protected

Return data length.

Parameters
$spec(array)
Returns
int value

Definition at line 2675 of file qrcode.php.

2675 {
2676 return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
2677 }

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ rsEccCodes1()

QRcode::rsEccCodes1 (   $spec)
protected

Return ecc codes 1.

Parameters
$spec(array)
Returns
int value

Definition at line 2639 of file qrcode.php.

2639 {
2640 return $spec[2];
2641 }

Referenced by init().

+ Here is the caller graph for this function:

◆ rsEccCodes2()

QRcode::rsEccCodes2 (   $spec)
protected

Return ecc codes 2.

Parameters
$spec(array)
Returns
int value

Definition at line 2666 of file qrcode.php.

2666 {
2667 return $spec[2];
2668 }

Referenced by init().

+ Here is the caller graph for this function:

◆ rsEccLength()

QRcode::rsEccLength (   $spec)
protected

Return ecc length.

Parameters
$spec(array)
Returns
int value

Definition at line 2684 of file qrcode.php.

2684 {
2685 return ($spec[0] + $spec[3]) * $spec[2];
2686 }

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ setFrameAt()

QRcode::setFrameAt (   $at,
  $val 
)
protected

Set frame value at specified position.

Parameters
$at(array) x,y position
$val(int) value of the character to set

Definition at line 785 of file qrcode.php.

785 {
786 $this->frame[$at['y']][$at['x']] = chr($val);
787 }

Referenced by encodeMask().

+ Here is the caller graph for this function:

◆ splitString()

QRcode::splitString ( )
protected

splitString

Returns
(int)

Definition at line 1444 of file qrcode.php.

1444 {
1445 while (strlen($this->dataStr) > 0) {
1446 $mode = $this->identifyMode(0);
1447 switch ($mode) {
1448 case QR_MODE_NM: {
1449 $length = $this->eatNum();
1450 break;
1451 }
1452 case QR_MODE_AN: {
1453 $length = $this->eatAn();
1454 break;
1455 }
1456 case QR_MODE_KJ: {
1457 if ($hint == QR_MODE_KJ) {
1458 $length = $this->eatKanji();
1459 } else {
1460 $length = $this->eat8();
1461 }
1462 break;
1463 }
1464 default: {
1465 $length = $this->eat8();
1466 break;
1467 }
1468 }
1469 if ($length == 0) {
1470 return 0;
1471 }
1472 if ($length < 0) {
1473 return -1;
1474 }
1475 $this->dataStr = substr($this->dataStr, $length);
1476 }
1477 return 0;
1478 }
eatKanji()
eatKanji
Definition: qrcode.php:1382
eatNum()
eatNum
Definition: qrcode.php:1311
$hint
Encoding mode.
Definition: qrcode.php:315

References $hint, eat8(), eatAn(), eatKanji(), eatNum(), and identifyMode().

Referenced by encodeString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ toUpper()

QRcode::toUpper ( )
protected

toUpper

Definition at line 1483 of file qrcode.php.

1483 {
1484 $stringLen = strlen($this->dataStr);
1485 $p = 0;
1486 while ($p < $stringLen) {
1487 $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
1488 if ($mode == QR_MODE_KJ) {
1489 $p += 2;
1490 } else {
1491 if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
1492 $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
1493 }
1494 $p++;
1495 }
1496 }
1497 return $this->dataStr;
1498 }
$dataStr
Input data string.
Definition: qrcode.php:437

References $dataStr, and identifyMode().

Referenced by encodeString().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ writeFormatInformation()

QRcode::writeFormatInformation (   $width,
$frame,
  $mask,
  $level 
)
protected

Write Format Information on frame and returns the number of black bits.

Parameters
$width(int) frame width
$frame(array) frame
$mask(array) masking mode
$level(int) error correction level
Returns
int blacks

Definition at line 940 of file qrcode.php.

940 {
941 $blacks = 0;
942 $format = $this->getFormatInfo($mask, $level);
943 for ($i=0; $i<8; ++$i) {
944 if ($format & 1) {
945 $blacks += 2;
946 $v = 0x85;
947 } else {
948 $v = 0x84;
949 }
950 $frame[8][$width - 1 - $i] = chr($v);
951 if ($i < 6) {
952 $frame[$i][8] = chr($v);
953 } else {
954 $frame[$i + 1][8] = chr($v);
955 }
956 $format = $format >> 1;
957 }
958 for ($i=0; $i<7; ++$i) {
959 if ($format & 1) {
960 $blacks += 2;
961 $v = 0x85;
962 } else {
963 $v = 0x84;
964 }
965 $frame[$width - 7 + $i][8] = chr($v);
966 if ($i == 0) {
967 $frame[8][7] = chr($v);
968 } else {
969 $frame[8][6 - $i] = chr($v);
970 }
971 $format = $format >> 1;
972 }
973 return $blacks;
974 }
getFormatInfo($mask, $level)
Return BCH encoded format information pattern.
Definition: qrcode.php:2491

References $frame, $level, $width, and getFormatInfo().

Referenced by makeMask(), and mask().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Field Documentation

◆ $alignmentPattern

QRcode::$alignmentPattern
protected
Initial value:
= array(
array( 0, 0),
array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0),
array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50),
array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48),
array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62),
array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58),
array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52),
array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54),
array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58)
)

Array Positions of alignment patterns.

This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. See Table 1 in Appendix E (pp.71) of JIS X0510:2004.

Definition at line 589 of file qrcode.php.

◆ $anTable

QRcode::$anTable
protected
Initial value:
= array(
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
)

Alphabet-numeric convesion table.

Definition at line 463 of file qrcode.php.

◆ $b1

QRcode::$b1
protected

Value b1.

Definition at line 421 of file qrcode.php.

Referenced by getCode(), and getEccSpec().

◆ $barcode_array

QRcode::$barcode_array = array()
protected

Barcode array to be returned which is readable by TCPDF.

Definition at line 297 of file qrcode.php.

Referenced by __construct(), and getBarcodeArray().

◆ $bit

QRcode::$bit
protected

Single bit value.

Definition at line 371 of file qrcode.php.

Referenced by encodeMask().

◆ $blocks

QRcode::$blocks
protected

Blocks.

Definition at line 391 of file qrcode.php.

Referenced by getCode().

◆ $capacity

QRcode::$capacity
protected

Array Table of the capacity of symbols.

See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.

Definition at line 479 of file qrcode.php.

◆ $casesensitive

QRcode::$casesensitive = true
protected

Boolean flag, if true the input string will be converted to uppercase.

Definition at line 321 of file qrcode.php.

◆ $count

QRcode::$count
protected

Counter.

Definition at line 403 of file qrcode.php.

◆ $data

◆ $datacode

QRcode::$datacode = array()
protected

Data code.

Definition at line 379 of file qrcode.php.

◆ $dataLength

QRcode::$dataLength
protected

Data length.

Definition at line 409 of file qrcode.php.

Referenced by getCode().

◆ $dataStr

QRcode::$dataStr = ''
protected

Input data string.

Definition at line 437 of file qrcode.php.

Referenced by toUpper().

◆ $dir

QRcode::$dir
protected

Direction.

Definition at line 365 of file qrcode.php.

Referenced by getNextPosition().

◆ $ecccode

QRcode::$ecccode = array()
protected

Error correction code.

Definition at line 385 of file qrcode.php.

◆ $eccLength

QRcode::$eccLength
protected

Error correction length.

Definition at line 415 of file qrcode.php.

Referenced by encodeMask().

◆ $eccTable

QRcode::$eccTable
protected

Array Table of the error correction code (Reed-Solomon block).

See Table 12-16 (pp.30-36), JIS X0510:2004.

Definition at line 539 of file qrcode.php.

◆ $formatInfo

QRcode::$formatInfo
protected
Initial value:
= array(
array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
)

Array Format information.

Definition at line 619 of file qrcode.php.

◆ $frame

◆ $frames

QRcode::$frames = array()
protected

Array of frames.

Definition at line 457 of file qrcode.php.

◆ $hint

QRcode::$hint = QR_MODE_8B
protected

Encoding mode.

Definition at line 315 of file qrcode.php.

Referenced by splitString().

◆ $items

◆ $lengthTableBits

QRcode::$lengthTableBits
protected
Initial value:
= array(
array(10, 12, 14),
array( 9, 11, 13),
array( 8, 16, 16),
array( 8, 10, 12)
)

Array Length indicator.

Definition at line 527 of file qrcode.php.

◆ $level

QRcode::$level = QR_ECLEVEL_L
protected

Levels of error correction.

See definitions for possible values.

Definition at line 309 of file qrcode.php.

Referenced by getDataLength(), getECCLength(), getEccSpec(), getFormatInfo(), getMinimumVersion(), makeMask(), mask(), and writeFormatInformation().

◆ $rsblocks

QRcode::$rsblocks = array()
protected

Reed-Solomon blocks.

Definition at line 397 of file qrcode.php.

◆ $rsitems

QRcode::$rsitems = array()
protected

Reed-Solomon items.

Definition at line 451 of file qrcode.php.

◆ $runLength

QRcode::$runLength = array()
protected

Run length.

Definition at line 429 of file qrcode.php.

◆ $structured

QRcode::$structured = 0
protected

Structured QR code (not supported yet).

Definition at line 327 of file qrcode.php.

◆ $version

QRcode::$version = 0
protected

QR code version.

Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix.

Definition at line 303 of file qrcode.php.

Referenced by createFrame(), encodeBitStream(), encodeMode8(), encodeModeAn(), encodeModeKanji(), encodeModeNum(), estimateBitStreamSize(), estimateVersion(), getDataLength(), getECCLength(), getEccSpec(), getRemainder(), getVersionPattern(), getWidth(), lengthIndicator(), lengthOfCode(), maximumWords(), newFrame(), and putAlignmentPattern().

◆ $versionPattern

QRcode::$versionPattern
protected
Initial value:
= array(
0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
0x27541, 0x28c69
)

Array Version information pattern (BCH coded).

See Table 1 in Appendix D (pp.68) of JIS X0510:2004. size: [QRSPEC_VERSION_MAX - 6]

Definition at line 607 of file qrcode.php.

◆ $width

QRcode::$width
protected

◆ $x

QRcode::$x
protected

◆ $y


The documentation for this class was generated from the following file: