ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
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.
 getBarcodeArray ()
 Returns a barcode array which is readable by TCPDF.

Protected Member Functions

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

Protected Attributes

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

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

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.

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

{
$barcode_array = array();
if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
return false;
}
// set error correction level
$this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
if ($this->level === false) {
$this->level = QR_ECLEVEL_L;
}
if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
return false;
}
if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
return false;
}
$this->items = array();
$this->encodeString($code);
if (is_null($this->data)) {
return false;
}
$qrTab = $this->binarize($this->data);
$size = count($qrTab);
$barcode_array['num_rows'] = $size;
$barcode_array['num_cols'] = $size;
$barcode_array['bcode'] = array();
foreach ($qrTab as $line) {
$arrAdd = array();
foreach (str_split($line) as $char) {
$arrAdd[] = ($char=='1')?1:0;
}
$barcode_array['bcode'][] = $arrAdd;
}
$this->barcode_array = $barcode_array;
}

+ Here is the call graph for this function:

Member Function Documentation

QRcode::allocate (   $setLength)
protected

Return an array with zeros.

Parameters
$setLength(int) array size
Returns
array

Definition at line 2128 of file qrcode.php.

Referenced by newFromBytes(), and newFromNum().

{
return array_fill(0, $setLength, 0);
}

+ Here is the caller graph for this function:

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.

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

{
if ((!is_array($append)) OR (count($append) == 0)) {
return $bitstream;
}
if (count($bitstream) == 0) {
return $append;
}
return array_values(array_merge($bitstream, $append));
}

+ Here is the caller graph for this function:

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.

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

Referenced by appendPaddingBit().

{
if ($size == 0) {
return 0;
}
$b = $this->newFromBytes($size, $data);
return $this->appendBitstream($bitstream, $b);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

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

{
$newitem = $this->newInputItem($mode, $size, $data);
if (!empty($newitem)) {
$items[] = $newitem;
}
return $items;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References appendBitstream(), and newFromNum().

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

{
if ($bits == 0) {
return 0;
}
$b = $this->newFromNum($bits, $num);
return $this->appendBitstream($bitstream, $b);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::appendPaddingBit (   $bstream)
protected

Append Padding Bit to bitstream.

Parameters
$bstream(array)
Returns
array bitstream

Definition at line 2054 of file qrcode.php.

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

Referenced by getBitStream().

{
if (is_null($bstream)) {
return null;
}
$bits = count($bstream);
$maxwords = $this->getDataLength($this->version, $this->level);
$maxbits = $maxwords * 8;
if ($maxbits == $bits) {
return $bstream;
}
if ($maxbits - $bits < 5) {
return $this->appendNum($bstream, $maxbits - $bits, 0);
}
$bits += 4;
$words = (int)(($bits + 7) / 8);
$padding = array();
$padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
$padlen = $maxwords - $words;
if ($padlen > 0) {
$padbuf = array();
for ($i=0; $i<$padlen; ++$i) {
$padbuf[$i] = ($i&1)?0x11:0xec;
}
$padding = $this->appendBytes($padding, $padlen, $padbuf);
}
return $this->appendBitstream($bstream, $padding);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References $frame.

Referenced by __construct().

{
$len = count($frame);
// the frame is square (width = height)
foreach ($frame as &$frameLine) {
for ($i=0; $i<$len; $i++) {
$frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
}
}
return $frame;
}

+ Here is the caller graph for this function:

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.

References $data, and $size.

Referenced by getByteStream().

{
if (is_null($bstream)) {
return null;
}
$size = count($bstream);
if ($size == 0) {
return array();
}
$data = array_fill(0, (int)(($size + 7) / 8), 0);
$bytes = (int)($size / 8);
$p = 0;
for ($i=0; $i<$bytes; $i++) {
$v = 0;
for ($j=0; $j<8; $j++) {
$v = $v << 1;
$v |= $bstream[$p];
$p++;
}
$data[$i] = $v;
}
if ($size & 7) {
$v = 0;
for ($j=0; $j<($size & 7); $j++) {
$v = $v << 1;
$v |= $bstream[$p];
$p++;
}
$data[$bytes] = $v;
}
return $data;
}

+ Here is the caller graph for this function:

QRcode::calcN1N3 (   $length)
protected

calcN1N3

Parameters
$length(int)
Returns
int demerit

Definition at line 1126 of file qrcode.php.

Referenced by evaluateSymbol().

{
$demerit = 0;
for ($i=0; $i<$length; ++$i) {
if ($this->runLength[$i] >= 5) {
$demerit += (N1 + ($this->runLength[$i] - 5));
}
if ($i & 1) {
if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
$fact = (int)($this->runLength[$i] / 3);
if (($this->runLength[$i-2] == $fact)
AND ($this->runLength[$i-1] == $fact)
AND ($this->runLength[$i+1] == $fact)
AND ($this->runLength[$i+2] == $fact)) {
if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
$demerit += N3;
} elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
$demerit += N3;
}
}
}
}
}
return $demerit;
}

+ Here is the caller graph for this function:

QRcode::calcParity (   $items)
protected

calcParity

Parameters
$items(array)
Returns
int parity

Definition at line 1729 of file qrcode.php.

References $items.

{
$parity = 0;
foreach ($items as $item) {
if ($item['mode'] != QR_MODE_ST) {
for ($i=$item['size']-1; $i>=0; --$i) {
$parity ^= $item['data'][$i];
}
}
}
return $parity;
}
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.

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

Referenced by newInputItem().

{
if ($size <= 0) {
return false;
}
switch($mode) {
case QR_MODE_NM: {
return $this->checkModeNum($size, $data);
}
case QR_MODE_AN: {
return $this->checkModeAn($size, $data);
}
case QR_MODE_KJ: {
return $this->checkModeKanji($size, $data);
}
case QR_MODE_8B: {
return true;
}
case QR_MODE_ST: {
return true;
}
default: {
break;
}
}
return false;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

checkModeAn

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

Definition at line 1771 of file qrcode.php.

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

Referenced by check().

{
for ($i=0; $i<$size; ++$i) {
if ($this->lookAnTable(ord($data[$i])) == -1) {
return false;
}
}
return true;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

checkModeKanji

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

Definition at line 1838 of file qrcode.php.

References $data, and $size.

Referenced by check().

{
if ($size & 1) {
return false;
}
for ($i=0; $i<$size; $i+=2) {
$val = (ord($data[$i]) << 8) | ord($data[$i+1]);
if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
return false;
}
}
return true;
}

+ Here is the caller graph for this function:

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

checkModeNum

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

Definition at line 1747 of file qrcode.php.

References $data, and $size.

Referenced by check().

{
for ($i=0; $i<$size; ++$i) {
if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
return false;
}
}
return true;
}

+ Here is the caller graph for this function:

QRcode::convertData (   $items)
protected

convertData

Parameters
$items(array)
Returns
array items

Definition at line 2025 of file qrcode.php.

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

Referenced by mergeBitStream().

{
$ver = $this->estimateVersion($items);
if ($ver > $this->version) {
$this->version = $ver;
}
while (true) {
$cbs = $this->createBitStream($items);
$items = $cbs[0];
$bits = $cbs[1];
if ($bits < 0) {
return -1;
}
$ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
if ($ver < 0) {
return -1;
} elseif ($ver > $this->version) {
$this->version = $ver;
} else {
break;
}
}
return $items;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::createBitStream (   $items)
protected

createBitStream

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

Definition at line 2010 of file qrcode.php.

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

Referenced by convertData().

{
$total = 0;
foreach ($items as $key => $item) {
$items[$key] = $this->encodeBitStream($item, $this->version);
$bits = count($items[$key]['bstream']);
$total += $bits;
}
return array($items, $total);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by newFrame().

{
$width = $this->capacity[$version][QRCAP_WIDTH];
$frameLine = str_repeat ("\0", $width);
$frame = array_fill(0, $width, $frameLine);
// Finder pattern
$frame = $this->putFinderPattern($frame, 0, 0);
$frame = $this->putFinderPattern($frame, $width - 7, 0);
$frame = $this->putFinderPattern($frame, 0, $width - 7);
// Separator
$yOffset = $width - 7;
for ($y=0; $y < 7; ++$y) {
$frame[$y][7] = "\xc0";
$frame[$y][$width - 8] = "\xc0";
$frame[$yOffset][7] = "\xc0";
++$yOffset;
}
$setPattern = str_repeat("\xc0", 8);
$frame = $this->qrstrset($frame, 0, 7, $setPattern);
$frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
$frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
// Format info
$setPattern = str_repeat("\x84", 9);
$frame = $this->qrstrset($frame, 0, 8, $setPattern);
$frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
$yOffset = $width - 8;
for ($y=0; $y < 8; ++$y,++$yOffset) {
$frame[$y][8] = "\x84";
$frame[$yOffset][8] = "\x84";
}
// Timing pattern
$wo = $width - 15;
for ($i=1; $i < $wo; ++$i) {
$frame[6][7+$i] = chr(0x90 | ($i & 1));
$frame[7+$i][6] = chr(0x90 | ($i & 1));
}
// Alignment pattern
// Version information
if ($version >= 7) {
$vinf = $this->getVersionPattern($version);
$v = $vinf;
for ($x=0; $x<6; ++$x) {
for ($y=0; $y<3; ++$y) {
$frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
$v = $v >> 1;
}
}
$v = $vinf;
for ($y=0; $y<6; ++$y) {
for ($x=0; $x<3; ++$x) {
$frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
$v = $v >> 1;
}
}
}
// and a little bit...
$frame[$width - 8][8] = "\x81";
return $frame;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::eat8 ( )
protected

eat8

Returns
int run

Definition at line 1395 of file qrcode.php.

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

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

{
$la = $this->lengthIndicator(QR_MODE_AN, $this->version);
$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
$p = 1;
$dataStrLen = strlen($this->dataStr);
while($p < $dataStrLen) {
$mode = $this->identifyMode($p);
if ($mode == QR_MODE_KJ) {
break;
}
if ($mode == QR_MODE_NM) {
$q = $p;
while($this->isdigitat($this->dataStr, $q)) {
$q++;
}
$dif = $this->estimateBitsMode8($p) // + 4 + l8
+ $this->estimateBitsModeNum($q - $p) + 4 + $ln
- $this->estimateBitsMode8($q); // - 4 - l8
if ($dif < 0) {
break;
} else {
$p = $q;
}
} elseif ($mode == QR_MODE_AN) {
$q = $p;
while($this->isalnumat($this->dataStr, $q)) {
$q++;
}
$dif = $this->estimateBitsMode8($p) // + 4 + l8
+ $this->estimateBitsModeAn($q - $p) + 4 + $la
- $this->estimateBitsMode8($q); // - 4 - l8
if ($dif < 0) {
break;
} else {
$p = $q;
}
} else {
$p++;
}
}
$run = $p;
$this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
return $run;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::eatAn ( )
protected

eatAn

Returns
int run

Definition at line 1343 of file qrcode.php.

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

Referenced by eatNum(), and splitString().

{
$la = $this->lengthIndicator(QR_MODE_AN, $this->version);
$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
$p =1 ;
while($this->isalnumat($this->dataStr, $p)) {
if ($this->isdigitat($this->dataStr, $p)) {
$q = $p;
while($this->isdigitat($this->dataStr, $q)) {
$q++;
}
$dif = $this->estimateBitsModeAn($p) // + 4 + la
+ $this->estimateBitsModeNum($q - $p) + 4 + $ln
- $this->estimateBitsModeAn($q); // - 4 - la
if ($dif < 0) {
break;
} else {
$p = $q;
}
} else {
$p++;
}
}
$run = $p;
if (!$this->isalnumat($this->dataStr, $p)) {
$dif = $this->estimateBitsModeAn($run) + 4 + $la
+ $this->estimateBitsMode8(1) // + 4 + l8
- $this->estimateBitsMode8($run + 1); // - 4 - l8
if ($dif > 0) {
return $this->eat8();
}
}
$this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
return $run;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::eatKanji ( )
protected

eatKanji

Returns
int run

Definition at line 1382 of file qrcode.php.

References appendNewInputItem(), and identifyMode().

Referenced by splitString().

{
$p = 0;
while($this->identifyMode($p) == QR_MODE_KJ) {
$p += 2;
}
$this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
return $run;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::eatNum ( )
protected

eatNum

Returns
int run

Definition at line 1311 of file qrcode.php.

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

Referenced by splitString().

{
$ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
$p = 0;
while($this->isdigitat($this->dataStr, $p)) {
$p++;
}
$run = $p;
$mode = $this->identifyMode($p);
if ($mode == QR_MODE_8B) {
$dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ $this->estimateBitsMode8(1) // + 4 + l8
- $this->estimateBitsMode8($run + 1); // - 4 - l8
if ($dif > 0) {
return $this->eat8();
}
}
if ($mode == QR_MODE_AN) {
$dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ $this->estimateBitsModeAn(1) // + 4 + la
- $this->estimateBitsModeAn($run + 1);// - 4 - la
if ($dif > 0) {
return $this->eatAn();
}
}
$this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
return $run;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References $data, and modnn().

Referenced by init().

{
$MM =& $rs['mm']; // bits per symbol
$NN =& $rs['nn']; // the total number of symbols in a RS block
$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
$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
$GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
$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
$FCR =& $rs['fcr']; // first consecutive root, index form
$PRIM =& $rs['prim']; // primitive element, index form
$IPRIM =& $rs['iprim']; // prim-th root of 1, index form
$PAD =& $rs['pad']; // the number of pad symbols in a block
$A0 =& $NN;
$parity = array_fill(0, $NROOTS, 0);
for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
$feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
if ($feedback != $A0) {
// feedback term is non-zero
// This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
// always be for the polynomials constructed by init_rs()
$feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
for ($j=1; $j < $NROOTS; ++$j) {
$parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
}
}
// Shift
array_shift($parity);
if ($feedback != $A0) {
array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
} else {
array_push($parity, 0);
}
}
return $parity;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

encodeBitStream

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

Definition at line 1640 of file qrcode.php.

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

Referenced by createBitStream().

{
$inputitem['bstream'] = array();
$words = $this->maximumWords($inputitem['mode'], $version);
if ($inputitem['size'] > $words) {
$st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
$st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
$st1 = $this->encodeBitStream($st1, $version);
$st2 = $this->encodeBitStream($st2, $version);
$inputitem['bstream'] = array();
$inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
$inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
} else {
switch($inputitem['mode']) {
case QR_MODE_NM: {
$inputitem = $this->encodeModeNum($inputitem, $version);
break;
}
case QR_MODE_AN: {
$inputitem = $this->encodeModeAn($inputitem, $version);
break;
}
case QR_MODE_8B: {
$inputitem = $this->encodeMode8($inputitem, $version);
break;
}
case QR_MODE_KJ: {
$inputitem = $this->encodeModeKanji($inputitem, $version);
break;
}
case QR_MODE_ST: {
$inputitem = $this->encodeModeStructure($inputitem);
break;
}
default: {
break;
}
}
}
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::encodeMask (   $mask)
protected

Encode mask.

Parameters
$mask(int) masking mode

Definition at line 720 of file qrcode.php.

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

Referenced by encodeString().

{
$spec = array(0, 0, 0, 0, 0);
$this->datacode = $this->getByteStream($this->items);
if (is_null($this->datacode)) {
return NULL;
}
$spec = $this->getEccSpec($this->version, $this->level, $spec);
$this->b1 = $this->rsBlockNum1($spec);
$this->dataLength = $this->rsDataLength($spec);
$this->eccLength = $this->rsEccLength($spec);
$this->ecccode = array_fill(0, $this->eccLength, 0);
$this->blocks = $this->rsBlockNum($spec);
$ret = $this->init($spec);
if ($ret < 0) {
return NULL;
}
$this->count = 0;
$this->width = $this->getWidth($this->version);
$this->frame = $this->newFrame($this->version);
$this->x = $this->width - 1;
$this->y = $this->width - 1;
$this->dir = -1;
$this->bit = -1;
// inteleaved data and ecc codes
for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
$code = $this->getCode();
$bit = 0x80;
for ($j=0; $j<8; $j++) {
$addr = $this->getNextPosition();
$this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
$bit = $bit >> 1;
}
}
// remainder bits
$j = $this->getRemainder($this->version);
for ($i=0; $i<$j; $i++) {
$addr = $this->getNextPosition();
$this->setFrameAt($addr, 0x02);
}
// masking
$this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
if ($mask < 0) {
if (QR_FIND_BEST_MASK) {
$masked = $this->mask($this->width, $this->frame, $this->level);
} else {
$masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
}
} else {
$masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
}
if ($masked == NULL) {
return NULL;
}
$this->data = $masked;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

encodeMode8

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

Definition at line 1586 of file qrcode.php.

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

Referenced by encodeBitStream().

{
$inputitem['bstream'] = array();
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
for ($i=0; $i < $inputitem['size']; ++$i) {
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
}
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

encodeModeAn

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

Definition at line 1563 of file qrcode.php.

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

Referenced by encodeBitStream().

{
$words = (int)($inputitem['size'] / 2);
$inputitem['bstream'] = array();
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
for ($i=0; $i < $words; ++$i) {
$val = (int)($this->lookAnTable(ord($inputitem['data'][$i*2])) * 45);
$val += (int)($this->lookAnTable(ord($inputitem['data'][($i*2)+1])));
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
}
if ($inputitem['size'] & 1) {
$val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
}
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

encodeModeKanji

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

Definition at line 1602 of file qrcode.php.

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

Referenced by encodeBitStream().

{
$inputitem['bstream'] = array();
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
for ($i=0; $i<$inputitem['size']; $i+=2) {
$val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
if ($val <= 0x9ffc) {
$val -= 0x8140;
} else {
$val -= 0xc140;
}
$h = ($val >> 8) * 0xc0;
$val = ($val & 0xff) + $h;
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
}
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

encodeModeNum

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

Definition at line 1534 of file qrcode.php.

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

Referenced by encodeBitStream().

{
$words = (int)($inputitem['size'] / 3);
$inputitem['bstream'] = array();
$val = 0x1;
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
for ($i=0; $i < $words; ++$i) {
$val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
$val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
$val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
}
if ($inputitem['size'] - $words * 3 == 1) {
$val = ord($inputitem['data'][$words*3]) - ord('0');
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
} elseif (($inputitem['size'] - ($words * 3)) == 2) {
$val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
$val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
}
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::encodeModeStructure (   $inputitem)
protected

encodeModeStructure

Parameters
$inputitem(array)
Returns
array input item

Definition at line 1625 of file qrcode.php.

References appendNum().

Referenced by encodeBitStream().

{
$inputitem['bstream'] = array();
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
$inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by __construct().

{
$this->dataStr = $string;
if (!$this->casesensitive) {
$this->toUpper();
}
$ret = $this->splitString();
if ($ret < 0) {
return NULL;
}
$this->encodeMask(-1);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::estimateBitsMode8 (   $size)
protected

estimateBitsMode8

Parameters
$size(int)
Returns
int number of bits

Definition at line 1819 of file qrcode.php.

References $size.

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

{
return (int)($size * 8);
}

+ Here is the caller graph for this function:

QRcode::estimateBitsModeAn (   $size)
protected

estimateBitsModeAn

Parameters
$size(int)
Returns
int number of bits

Definition at line 1806 of file qrcode.php.

References $size.

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

{
$bits = (int)($size * 5.5); // (size / 2 ) * 11
if ($size & 1) {
$bits += 6;
}
return $bits;
}

+ Here is the caller graph for this function:

QRcode::estimateBitsModeKanji (   $size)
protected

estimateBitsModeKanji

Parameters
$size(int)
Returns
int number of bits

Definition at line 1828 of file qrcode.php.

References $size.

Referenced by estimateBitStreamSize().

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

+ Here is the caller graph for this function:

QRcode::estimateBitsModeNum (   $size)
protected

estimateBitsModeNum

Parameters
$size(int)
Returns
int number of bits

Definition at line 1785 of file qrcode.php.

References $size.

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

{
$w = (int)($size / 3);
$bits = ($w * 10);
switch($size - ($w * 3)) {
case 1: {
$bits += 4;
break;
}
case 2: {
$bits += 7;
break;
}
}
return $bits;
}

+ Here is the caller graph for this function:

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

estimateBitStreamSize

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

Definition at line 1891 of file qrcode.php.

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

Referenced by estimateVersion().

{
$bits = 0;
if ($version == 0) {
$version = 1;
}
foreach ($items as $item) {
switch($item['mode']) {
case QR_MODE_NM: {
$bits = $this->estimateBitsModeNum($item['size']);
break;
}
case QR_MODE_AN: {
$bits = $this->estimateBitsModeAn($item['size']);
break;
}
case QR_MODE_8B: {
$bits = $this->estimateBitsMode8($item['size']);
break;
}
case QR_MODE_KJ: {
$bits = $this->estimateBitsModeKanji($item['size']);
break;
}
case QR_MODE_ST: {
return STRUCTURE_HEADER_BITS;
}
default: {
return 0;
}
}
$l = $this->lengthIndicator($item['mode'], $version);
$m = 1 << $l;
$num = (int)(($item['size'] + $m - 1) / $m);
$bits += $num * (4 + $l);
}
return $bits;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::estimateVersion (   $items)
protected

estimateVersion

Parameters
$items(array)
Returns
int version

Definition at line 1934 of file qrcode.php.

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

Referenced by convertData().

{
$version = 0;
$prev = 0;
do {
$prev = $version;
$bits = $this->estimateBitStreamSize($items, $prev);
$version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
if ($version < 0) {
return -1;
}
} while ($version > $prev);
return $version;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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

evaluateSymbol

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

Definition at line 1157 of file qrcode.php.

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

Referenced by mask().

{
$head = 0;
$demerit = 0;
for ($y=0; $y<$width; ++$y) {
$head = 0;
$this->runLength[0] = 1;
$frameY = $frame[$y];
if ($y > 0) {
$frameYM = $frame[$y-1];
}
for ($x=0; $x<$width; ++$x) {
if (($x > 0) AND ($y > 0)) {
$b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
$w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
if (($b22 | ($w22 ^ 1)) & 1) {
$demerit += N2;
}
}
if (($x == 0) AND (ord($frameY[$x]) & 1)) {
$this->runLength[0] = -1;
$head = 1;
$this->runLength[$head] = 1;
} elseif ($x > 0) {
if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
$head++;
$this->runLength[$head] = 1;
} else {
$this->runLength[$head]++;
}
}
}
$demerit += $this->calcN1N3($head+1);
}
for ($x=0; $x<$width; ++$x) {
$head = 0;
$this->runLength[0] = 1;
for ($y=0; $y<$width; ++$y) {
if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
$this->runLength[0] = -1;
$head = 1;
$this->runLength[$head] = 1;
} elseif ($y > 0) {
if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
$head++;
$this->runLength[$head] = 1;
} else {
$this->runLength[$head]++;
}
}
}
$demerit += $this->calcN1N3($head+1);
}
return $demerit;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by makeMaskNo().

{
$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
for ($y=0; $y<$width; ++$y) {
for ($x=0; $x<$width; ++$x) {
if (ord($frame[$y][$x]) & 0x80) {
$bitMask[$y][$x] = 0;
} else {
$maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
$bitMask[$y][$x] = ($maskFunc == 0)?1:0;
}
}
}
return $bitMask;
}

+ Here is the caller graph for this function:

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.

References $barcode_array.

{
}
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.

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

Referenced by getByteStream().

{
$bstream = $this->mergeBitStream($items);
return $this->appendPaddingBit($bstream);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by encodeMask().

{
$bstream = $this->getBitStream($items);
return $this->bitstreamToByte($bstream);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::getCode ( )
protected

Return Reed-Solomon block code.

Returns
array rsblocks

Definition at line 909 of file qrcode.php.

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

Referenced by encodeMask().

{
if ($this->count < $this->dataLength) {
$row = $this->count % $this->blocks;
$col = $this->count / $this->blocks;
if ($col >= $this->rsblocks[0]['dataLength']) {
}
$ret = $this->rsblocks[$row]['data'][$col];
} elseif ($this->count < $this->dataLength + $this->eccLength) {
$row = ($this->count - $this->dataLength) % $this->blocks;
$col = ($this->count - $this->dataLength) / $this->blocks;
$ret = $this->rsblocks[$row]['ecc'][$col];
} else {
return 0;
}
$this->count++;
return $ret;
}

+ Here is the caller graph for this function:

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.

References $level, and $version.

Referenced by appendPaddingBit(), and getEccSpec().

{
return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
}

+ Here is the caller graph for this function:

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.

References $level, and $version.

Referenced by getEccSpec().

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

+ Here is the caller graph for this function:

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.

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

Referenced by encodeMask().

{
if (count($spec) < 5) {
$spec = array(0, 0, 0, 0, 0);
}
$b1 = $this->eccTable[$version][$level][0];
$b2 = $this->eccTable[$version][$level][1];
$ecc = $this->getECCLength($version, $level);
if ($b2 == 0) {
$spec[0] = $b1;
$spec[1] = (int)($data / $b1);
$spec[2] = (int)($ecc / $b1);
$spec[3] = 0;
$spec[4] = 0;
} else {
$spec[0] = $b1;
$spec[1] = (int)($data / ($b1 + $b2));
$spec[2] = (int)($ecc / ($b1 + $b2));
$spec[3] = $b2;
$spec[4] = $spec[1] + 1;
}
return $spec;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References $level.

Referenced by writeFormatInformation().

{
if (($mask < 0) OR ($mask > 7)) {
return 0;
}
if (($level < 0) OR ($level > 3)) {
return 0;
}
return $this->formatInfo[$level][$mask];
}

+ Here is the caller graph for this function:

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.

{
return ord($this->frame[$at['y']][$at['x']]);
}
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.

References $level, and $size.

Referenced by convertData(), and estimateVersion().

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

+ Here is the caller graph for this function:

QRcode::getNextPosition ( )
protected

Return the next frame position.

Returns
array of x,y coordinates

Definition at line 802 of file qrcode.php.

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

Referenced by encodeMask().

{
do {
if ($this->bit == -1) {
$this->bit = 0;
return array('x'=>$this->x, 'y'=>$this->y);
}
if ($this->bit == 0) {
$x--;
$this->bit++;
} else {
$x++;
$this->bit--;
}
if ($this->dir < 0) {
if ($y < 0) {
$y = 0;
$x -= 2;
$this->dir = 1;
if ($x == 6) {
$x--;
$y = 9;
}
}
} else {
if ($y == $w) {
$y = $w - 1;
$x -= 2;
$this->dir = -1;
if ($x == 6) {
$x--;
$y -= 8;
}
}
}
if (($x < 0) OR ($y < 0)) {
return NULL;
}
$this->x = $x;
$this->y = $y;
} while(ord($this->frame[$y][$x]) & 0x80);
return array('x'=>$x, 'y'=>$y);
}

+ Here is the caller graph for this function:

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.

References $version.

Referenced by encodeMask().

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

+ Here is the caller graph for this function:

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.

References $version.

Referenced by createFrame().

{
if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
return 0;
}
return $this->versionPattern[($version - 7)];
}

+ Here is the caller graph for this function:

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.

References $version.

Referenced by encodeMask().

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

+ Here is the caller graph for this function:

QRcode::identifyMode (   $pos)
protected

identifyMode

Parameters
$pos(int)
Returns
int mode

Definition at line 1286 of file qrcode.php.

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

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

{
if ($pos >= strlen($this->dataStr)) {
return QR_MODE_NL;
}
$c = $this->dataStr[$pos];
if ($this->isdigitat($this->dataStr, $pos)) {
return QR_MODE_NM;
} elseif ($this->isalnumat($this->dataStr, $pos)) {
return QR_MODE_AN;
} elseif ($this->hint == QR_MODE_KJ) {
if ($pos+1 < strlen($this->dataStr)) {
$d = $this->dataStr[$pos+1];
$word = (ord($c) << 8) | ord($d);
if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
return QR_MODE_KJ;
}
}
}
return QR_MODE_8B;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by encodeMask().

{
$dl = $this->rsDataCodes1($spec);
$el = $this->rsEccCodes1($spec);
$rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
$blockNo = 0;
$dataPos = 0;
$eccPos = 0;
$endfor = $this->rsBlockNum1($spec);
for ($i=0; $i < $endfor; ++$i) {
$ecc = array_slice($this->ecccode, $eccPos);
$this->rsblocks[$blockNo] = array();
$this->rsblocks[$blockNo]['dataLength'] = $dl;
$this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
$this->rsblocks[$blockNo]['eccLength'] = $el;
$ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
$this->rsblocks[$blockNo]['ecc'] = $ecc;
$this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
$dataPos += $dl;
$eccPos += $el;
$blockNo++;
}
if ($this->rsBlockNum2($spec) == 0) {
return 0;
}
$dl = $this->rsDataCodes2($spec);
$el = $this->rsEccCodes2($spec);
$rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
if ($rs == NULL) {
return -1;
}
$endfor = $this->rsBlockNum2($spec);
for ($i=0; $i < $endfor; ++$i) {
$ecc = array_slice($this->ecccode, $eccPos);
$this->rsblocks[$blockNo] = array();
$this->rsblocks[$blockNo]['dataLength'] = $dl;
$this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
$this->rsblocks[$blockNo]['eccLength'] = $el;
$ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
$this->rsblocks[$blockNo]['ecc'] = $ecc;
$this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
$dataPos += $dl;
$eccPos += $el;
$blockNo++;
}
return 0;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References init_rs_char().

Referenced by init().

{
foreach ($this->rsitems as $rs) {
if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
continue;
}
return $rs;
}
$rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
array_unshift($this->rsitems, $rs);
return $rs;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References modnn().

Referenced by init_rs().

{
// Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
$rs = null;
// Check parameter ranges
if (($symsize < 0) OR ($symsize > 8)) {
return $rs;
}
if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
return $rs;
}
if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
return $rs;
}
if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
return $rs;
}
if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
return $rs;
}
$rs = array();
$rs['mm'] = $symsize;
$rs['nn'] = (1 << $symsize) - 1;
$rs['pad'] = $pad;
$rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
$rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
// PHP style macro replacement ;)
$NN =& $rs['nn'];
$A0 =& $NN;
// Generate Galois field lookup tables
$rs['index_of'][0] = $A0; // log(zero) = -inf
$rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
$sr = 1;
for ($i=0; $i<$rs['nn']; ++$i) {
$rs['index_of'][$sr] = $i;
$rs['alpha_to'][$i] = $sr;
$sr <<= 1;
if ($sr & (1 << $symsize)) {
$sr ^= $gfpoly;
}
$sr &= $rs['nn'];
}
if ($sr != 1) {
// field generator polynomial is not primitive!
return NULL;
}
// Form RS code generator polynomial from its roots
$rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
$rs['fcr'] = $fcr;
$rs['prim'] = $prim;
$rs['nroots'] = $nroots;
$rs['gfpoly'] = $gfpoly;
// Find prim-th root of 1, used in decoding
for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
; // intentional empty-body loop!
}
$rs['iprim'] = (int)($iprim / $prim);
$rs['genpoly'][0] = 1;
for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
$rs['genpoly'][$i+1] = 1;
// Multiply rs->genpoly[] by @**(root + x)
for ($j = $i; $j > 0; --$j) {
if ($rs['genpoly'][$j] != 0) {
$rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
} else {
$rs['genpoly'][$j] = $rs['genpoly'][$j-1];
}
}
// rs->genpoly[0] can never be zero
$rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
}
// convert rs->genpoly[] to index form for quicker encoding
for ($i = 0; $i <= $nroots; ++$i) {
$rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
}
return $rs;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

{
if ($size > MAX_STRUCTURED_SYMBOLS) {
return -1;
}
if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
return -1;
}
$buf = array($size, $index, $parity);
$entry = $this->newInputItem(QR_MODE_ST, 3, buf);
array_unshift($items, $entry);
return $items;
}

+ Here is the call graph for this function:

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.

References lookAnTable().

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

{
if ($pos >= strlen($str)) {
return false;
}
return ($this->lookAnTable(ord($str[$pos])) >= 0);
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

{
if ($pos >= strlen($str)) {
return false;
}
return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
}

+ Here is the caller graph for this function:

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.

References $version.

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

{
if ($mode == QR_MODE_ST) {
return 0;
}
if ($version <= 9) {
$l = 0;
} elseif ($version <= 26) {
$l = 1;
} else {
$l = 2;
}
return $this->lengthTableBits[$mode][$l];
}

+ Here is the caller graph for this function:

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.

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

{
$payload = $bits - 4 - $this->lengthIndicator($mode, $version);
switch($mode) {
case QR_MODE_NM: {
$chunks = (int)($payload / 10);
$remain = $payload - $chunks * 10;
$size = $chunks * 3;
if ($remain >= 7) {
$size += 2;
} elseif ($remain >= 4) {
$size += 1;
}
break;
}
case QR_MODE_AN: {
$chunks = (int)($payload / 11);
$remain = $payload - $chunks * 11;
$size = $chunks * 2;
if ($remain >= 6) {
++$size;
}
break;
}
case QR_MODE_8B: {
$size = (int)($payload / 8);
break;
}
case QR_MODE_KJ: {
$size = (int)(($payload / 13) * 2);
break;
}
case QR_MODE_ST: {
$size = (int)($payload / 8);
break;
}
default: {
$size = 0;
break;
}
}
$maxsize = $this->maximumWords($mode, $version);
if ($size < 0) {
$size = 0;
}
if ($size > $maxsize) {
$size = $maxsize;
}
return $size;
}

+ Here is the call graph for this function:

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.

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

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

+ Here is the caller graph for this function:

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.

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

Referenced by encodeMask().

{
$masked = array_fill(0, $width, str_repeat("\0", $width));
$this->makeMaskNo($maskNo, $width, $frame, $masked);
$this->writeFormatInformation($width, $masked, $maskNo, $level);
return $masked;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by makeMask(), and mask().

{
$b = 0;
$bitMask = array();
$bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
if ($maskGenOnly) {
return;
}
$d = $s;
for ($y=0; $y<$width; ++$y) {
for ($x=0; $x<$width; ++$x) {
if ($bitMask[$y][$x] == 1) {
$d[$y][$x] = chr(ord($s[$y][$x]) ^ ((int)($bitMask[$y][$x])));
}
$b += (int)(ord($d[$y][$x]) & 1);
}
}
return $b;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by encodeMask().

{
$minDemerit = PHP_INT_MAX;
$bestMaskNum = 0;
$bestMask = array();
$checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
if (QR_FIND_FROM_RANDOM !== false) {
$howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
for ($i = 0; $i < $howManuOut; ++$i) {
$remPos = rand (0, count($checked_masks)-1);
unset($checked_masks[$remPos]);
$checked_masks = array_values($checked_masks);
}
}
$bestMask = $frame;
foreach ($checked_masks as $i) {
$mask = array_fill(0, $width, str_repeat("\0", $width));
$demerit = 0;
$blacks = 0;
$blacks = $this->makeMaskNo($i, $width, $frame, $mask);
$blacks += $this->writeFormatInformation($width, $mask, $i, $level);
$blacks = (int)(100 * $blacks / ($width * $width));
$demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
$demerit += $this->evaluateSymbol($width, $mask);
if ($demerit < $minDemerit) {
$minDemerit = $demerit;
$bestMask = $mask;
$bestMaskNum = $i;
}
}
return $bestMask;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References $x, and $y.

{
return ($x + $y) & 1;
}
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.

References $y.

{
return ($y & 1);
}
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.

References $x.

{
return ($x % 3);
}
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.

References $x, and $y.

{
return ($x + $y) % 3;
}
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.

References $x, and $y.

{
return (((int)($y / 2)) + ((int)($x / 3))) & 1;
}
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.

References $x, and $y.

{
return (($x * $y) & 1) + ($x * $y) % 3;
}
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.

References $x, and $y.

{
return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
}
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.

References $x, and $y.

{
return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
}
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.

References $version.

Referenced by encodeBitStream(), and lengthOfCode().

{
if ($mode == QR_MODE_ST) {
return 3;
}
if ($version <= 9) {
$l = 0;
} else if ($version <= 26) {
$l = 1;
} else {
$l = 2;
}
$bits = $this->lengthTableBits[$mode][$l];
$words = (1 << $bits) - 1;
if ($mode == QR_MODE_KJ) {
$words *= 2; // the number of bytes is required
}
return $words;
}

+ Here is the caller graph for this function:

QRcode::mergeBitStream (   $items)
protected

mergeBitStream

Parameters
$items(array) items
Returns
array bitstream

Definition at line 2087 of file qrcode.php.

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

Referenced by getBitStream().

{
if (!is_array($items)) {
return null;
}
$bstream = array();
foreach ($items as $item) {
$bstream = $this->appendBitstream($bstream, $item['bstream']);
}
return $bstream;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References $x.

Referenced by encode_rs_char(), and init_rs_char().

{
while ($x >= $rs['nn']) {
$x -= $rs['nn'];
$x = ($x >> $rs['mm']) + ($x & $rs['nn']);
}
return $x;
}

+ Here is the caller graph for this function:

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.

References $version, and createFrame().

Referenced by encodeMask().

{
if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
return NULL;
}
if (!isset($this->frames[$version])) {
$this->frames[$version] = $this->createFrame($version);
}
if (is_null($this->frames[$version])) {
return NULL;
}
return $this->frames[$version];
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by appendBytes().

{
$bstream = $this->allocate($size * 8);
$p=0;
for ($i=0; $i<$size; ++$i) {
$mask = 0x80;
for ($j=0; $j<8; ++$j) {
if ($data[$i] & $mask) {
$bstream[$p] = 1;
} else {
$bstream[$p] = 0;
}
$p++;
$mask = $mask >> 1;
}
}
return $bstream;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References allocate().

Referenced by appendNum().

{
$bstream = $this->allocate($bits);
$mask = 1 << ($bits - 1);
for ($i=0; $i<$bits; ++$i) {
if ($num & $mask) {
$bstream[$i] = 1;
} else {
$bstream[$i] = 0;
}
$mask = $mask >> 1;
}
return $bstream;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

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

{
$setData = array_slice($data, 0, $size);
if (count($setData) < $size) {
$setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
}
if (!$this->check($mode, $size, $setData)) {
return NULL;
}
$inputitem = array();
$inputitem['mode'] = $mode;
$inputitem['size'] = $size;
$inputitem['data'] = $setData;
$inputitem['bstream'] = $bstream;
return $inputitem;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by putAlignmentPattern().

{
$finder = array(
"\xa1\xa1\xa1\xa1\xa1",
"\xa1\xa0\xa0\xa0\xa1",
"\xa1\xa0\xa1\xa0\xa1",
"\xa1\xa0\xa0\xa0\xa1",
"\xa1\xa1\xa1\xa1\xa1"
);
$yStart = $oy - 2;
$xStart = $ox - 2;
for ($y=0; $y < 5; $y++) {
$frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
}
return $frame;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by createFrame().

{
if ($version < 2) {
return $frame;
}
$d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
if ($d < 0) {
$w = 2;
} else {
$w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
}
if ($w * $w - 3 == 1) {
$x = $this->alignmentPattern[$version][0];
$y = $this->alignmentPattern[$version][0];
return $frame;
}
$cx = $this->alignmentPattern[$version][0];
$wo = $w - 1;
for ($x=1; $x < $wo; ++$x) {
$frame = $this->putAlignmentMarker($frame, 6, $cx);
$frame = $this->putAlignmentMarker($frame, $cx, 6);
$cx += $d;
}
$cy = $this->alignmentPattern[$version][0];
for ($y=0; $y < $wo; ++$y) {
$cx = $this->alignmentPattern[$version][0];
for ($x=0; $x < $wo; ++$x) {
$frame = $this->putAlignmentMarker($frame, $cx, $cy);
$cx += $d;
}
$cy += $d;
}
return $frame;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by createFrame().

{
$finder = array(
"\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
"\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
"\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
"\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
);
for ($y=0; $y < 7; $y++) {
$frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
}
return $frame;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

References $x, and $y.

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

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

+ Here is the caller graph for this function:

QRcode::rsBlockNum (   $spec)
protected

Return block number 0.

Parameters
$spec(array)
Returns
int value

Definition at line 2612 of file qrcode.php.

Referenced by encodeMask().

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

+ Here is the caller graph for this function:

QRcode::rsBlockNum1 (   $spec)
protected

Return block number 1.

Parameters
$spec(array)
Returns
int value

Definition at line 2621 of file qrcode.php.

Referenced by encodeMask(), and init().

{
return $spec[0];
}

+ Here is the caller graph for this function:

QRcode::rsBlockNum2 (   $spec)
protected

Return block number 2.

Parameters
$spec(array)
Returns
int value

Definition at line 2648 of file qrcode.php.

Referenced by init().

{
return $spec[3];
}

+ Here is the caller graph for this function:

QRcode::rsDataCodes1 (   $spec)
protected

Return data codes 1.

Parameters
$spec(array)
Returns
int value

Definition at line 2630 of file qrcode.php.

Referenced by init().

{
return $spec[1];
}

+ Here is the caller graph for this function:

QRcode::rsDataCodes2 (   $spec)
protected

Return data codes 2.

Parameters
$spec(array)
Returns
int value

Definition at line 2657 of file qrcode.php.

Referenced by init().

{
return $spec[4];
}

+ Here is the caller graph for this function:

QRcode::rsDataLength (   $spec)
protected

Return data length.

Parameters
$spec(array)
Returns
int value

Definition at line 2675 of file qrcode.php.

Referenced by encodeMask().

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

+ Here is the caller graph for this function:

QRcode::rsEccCodes1 (   $spec)
protected

Return ecc codes 1.

Parameters
$spec(array)
Returns
int value

Definition at line 2639 of file qrcode.php.

Referenced by init().

{
return $spec[2];
}

+ Here is the caller graph for this function:

QRcode::rsEccCodes2 (   $spec)
protected

Return ecc codes 2.

Parameters
$spec(array)
Returns
int value

Definition at line 2666 of file qrcode.php.

Referenced by init().

{
return $spec[2];
}

+ Here is the caller graph for this function:

QRcode::rsEccLength (   $spec)
protected

Return ecc length.

Parameters
$spec(array)
Returns
int value

Definition at line 2684 of file qrcode.php.

Referenced by encodeMask().

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

+ Here is the caller graph for this function:

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.

Referenced by encodeMask().

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

+ Here is the caller graph for this function:

QRcode::splitString ( )
protected

splitString

Returns
(int)

Definition at line 1444 of file qrcode.php.

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

Referenced by encodeString().

{
while (strlen($this->dataStr) > 0) {
$mode = $this->identifyMode(0);
switch ($mode) {
case QR_MODE_NM: {
$length = $this->eatNum();
break;
}
case QR_MODE_AN: {
$length = $this->eatAn();
break;
}
case QR_MODE_KJ: {
if ($hint == QR_MODE_KJ) {
$length = $this->eatKanji();
} else {
$length = $this->eat8();
}
break;
}
default: {
$length = $this->eat8();
break;
}
}
if ($length == 0) {
return 0;
}
if ($length < 0) {
return -1;
}
$this->dataStr = substr($this->dataStr, $length);
}
return 0;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

QRcode::toUpper ( )
protected

toUpper

Definition at line 1483 of file qrcode.php.

References $dataStr, and identifyMode().

Referenced by encodeString().

{
$stringLen = strlen($this->dataStr);
$p = 0;
while ($p < $stringLen) {
$mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
if ($mode == QR_MODE_KJ) {
$p += 2;
} else {
if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
$this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
}
$p++;
}
}
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

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.

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

Referenced by makeMask(), and mask().

{
$blacks = 0;
$format = $this->getFormatInfo($mask, $level);
for ($i=0; $i<8; ++$i) {
if ($format & 1) {
$blacks += 2;
$v = 0x85;
} else {
$v = 0x84;
}
$frame[8][$width - 1 - $i] = chr($v);
if ($i < 6) {
$frame[$i][8] = chr($v);
} else {
$frame[$i + 1][8] = chr($v);
}
$format = $format >> 1;
}
for ($i=0; $i<7; ++$i) {
if ($format & 1) {
$blacks += 2;
$v = 0x85;
} else {
$v = 0x84;
}
$frame[$width - 7 + $i][8] = chr($v);
if ($i == 0) {
$frame[8][7] = chr($v);
} else {
$frame[8][6 - $i] = chr($v);
}
$format = $format >> 1;
}
return $blacks;
}

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

Field Documentation

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.

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.

QRcode::$b1
protected

Value b1.

Definition at line 421 of file qrcode.php.

Referenced by getCode(), and getEccSpec().

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().

QRcode::$bit
protected

Single bit value.

Definition at line 371 of file qrcode.php.

Referenced by encodeMask().

QRcode::$blocks
protected

Blocks.

Definition at line 391 of file qrcode.php.

Referenced by getCode().

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.

QRcode::$casesensitive = true
protected

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

Definition at line 321 of file qrcode.php.

QRcode::$count
protected

Counter.

Definition at line 403 of file qrcode.php.

QRcode::$datacode = array()
protected

Data code.

Definition at line 379 of file qrcode.php.

QRcode::$dataLength
protected

Data length.

Definition at line 409 of file qrcode.php.

Referenced by getCode().

QRcode::$dataStr = ''
protected

Input data string.

Definition at line 437 of file qrcode.php.

Referenced by toUpper().

QRcode::$dir
protected

Direction.

Definition at line 365 of file qrcode.php.

Referenced by getNextPosition().

QRcode::$ecccode = array()
protected

Error correction code.

Definition at line 385 of file qrcode.php.

QRcode::$eccLength
protected

Error correction length.

Definition at line 415 of file qrcode.php.

Referenced by encodeMask().

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.

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.

QRcode::$frames = array()
protected

Array of frames.

Definition at line 457 of file qrcode.php.

QRcode::$hint = QR_MODE_8B
protected

Encoding mode.

Definition at line 315 of file qrcode.php.

Referenced by splitString().

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.

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().

QRcode::$rsblocks = array()
protected

Reed-Solomon blocks.

Definition at line 397 of file qrcode.php.

QRcode::$rsitems = array()
protected

Reed-Solomon items.

Definition at line 451 of file qrcode.php.

QRcode::$runLength = array()
protected

Run length.

Definition at line 429 of file qrcode.php.

QRcode::$structured = 0
protected

Structured QR code (not supported yet).

Definition at line 327 of file qrcode.php.

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().

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.

QRcode::$width
protected
QRcode::$x
protected

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