You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
4.6 KiB
159 lines
4.6 KiB
11 months ago
|
<?php
|
||
|
/**
|
||
|
* QRcode.php
|
||
|
*
|
||
|
* Created by arielferrandini
|
||
|
*/
|
||
|
|
||
|
namespace PHPQRCode;
|
||
|
|
||
|
use Exception;
|
||
|
|
||
|
class QRcode {
|
||
|
|
||
|
public $version;
|
||
|
public $width;
|
||
|
public $data;
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public function encodeMask(QRinput $input, $mask)
|
||
|
{
|
||
|
if($input->getVersion() < 0 || $input->getVersion() > Constants::QRSPEC_VERSION_MAX) {
|
||
|
throw new Exception('wrong version');
|
||
|
}
|
||
|
if($input->getErrorCorrectionLevel() > Constants::QR_ECLEVEL_H) {
|
||
|
throw new Exception('wrong level');
|
||
|
}
|
||
|
|
||
|
$raw = new QRrawcode($input);
|
||
|
|
||
|
QRtools::markTime('after_raw');
|
||
|
|
||
|
$version = $raw->version;
|
||
|
$width = QRspec::getWidth($version);
|
||
|
$frame = QRspec::newFrame($version);
|
||
|
|
||
|
$filler = new FrameFiller($width, $frame);
|
||
|
if(is_null($filler)) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
// inteleaved data and ecc codes
|
||
|
for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
|
||
|
$code = $raw->getCode();
|
||
|
$bit = 0x80;
|
||
|
for($j=0; $j<8; $j++) {
|
||
|
$addr = $filler->next();
|
||
|
$filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
|
||
|
$bit = $bit >> 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QRtools::markTime('after_filler');
|
||
|
|
||
|
unset($raw);
|
||
|
|
||
|
// remainder bits
|
||
|
$j = QRspec::getRemainder($version);
|
||
|
for($i=0; $i<$j; $i++) {
|
||
|
$addr = $filler->next();
|
||
|
$filler->setFrameAt($addr, 0x02);
|
||
|
}
|
||
|
|
||
|
$frame = $filler->frame;
|
||
|
unset($filler);
|
||
|
|
||
|
|
||
|
// masking
|
||
|
$maskObj = new QRmask();
|
||
|
if($mask < 0) {
|
||
|
|
||
|
if (Constants::QR_FIND_BEST_MASK) {
|
||
|
$masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
|
||
|
} else {
|
||
|
$masked = $maskObj->makeMask($width, $frame, (intval(Constants::QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
|
||
|
}
|
||
|
} else {
|
||
|
$masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
|
||
|
}
|
||
|
|
||
|
if($masked == NULL) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
QRtools::markTime('after_mask');
|
||
|
|
||
|
$this->version = $version;
|
||
|
$this->width = $width;
|
||
|
$this->data = $masked;
|
||
|
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public function encodeInput(QRinput $input)
|
||
|
{
|
||
|
return $this->encodeMask($input, -1);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public function encodeString8bit($string, $version, $level)
|
||
|
{
|
||
|
if(string == NULL) {
|
||
|
throw new Exception('empty string!');
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
$input = new QRinput($version, $level);
|
||
|
if($input == NULL) return NULL;
|
||
|
|
||
|
$ret = $input->append($input, Constants::QR_MODE_8, strlen($string), str_split($string));
|
||
|
if($ret < 0) {
|
||
|
unset($input);
|
||
|
return NULL;
|
||
|
}
|
||
|
return $this->encodeInput($input);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public function encodeString($string, $version, $level, $hint, $casesensitive)
|
||
|
{
|
||
|
|
||
|
if($hint != Constants::QR_MODE_8 && $hint != Constants::QR_MODE_KANJI) {
|
||
|
throw new Exception('bad hint');
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
$input = new QRinput($version, $level);
|
||
|
if($input == NULL) return NULL;
|
||
|
|
||
|
$ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
|
||
|
if($ret < 0) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
return $this->encodeInput($input);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public static function png($text, $outfile = false, $level = Constants::QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
|
||
|
{
|
||
|
$enc = QRencode::factory($level, $size, $margin);
|
||
|
return $enc->encodePNG($text, $outfile, $saveandprint=false);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public static function text($text, $outfile = false, $level = Constants::QR_ECLEVEL_L, $size = 3, $margin = 4)
|
||
|
{
|
||
|
$enc = QRencode::factory($level, $size, $margin);
|
||
|
return $enc->encode($text, $outfile);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------
|
||
|
public static function raw($text, $outfile = false, $level = Constants::QR_ECLEVEL_L, $size = 3, $margin = 4)
|
||
|
{
|
||
|
$enc = QRencode::factory($level, $size, $margin);
|
||
|
return $enc->encodeRAW($text, $outfile);
|
||
|
}
|
||
|
}
|