/**
  * @param $text
  * @param bool $outfile
  * @param bool $raw
  *
  * @return array|int
  */
 public function encode($text, $outfile = false, $raw = false)
 {
     $code = new Code();
     if ($this->eightBit) {
         $code->encodeString8bit($text, $this->version, $this->level);
     } else {
         $code->encodeString($text, $this->version, $this->level, $this->hint, $this->caseSensitive);
     }
     Tools::markTime('after_encode');
     return $outfile !== false ? file_put_contents($outfile, join("\n", Tools::binarize($code->data))) : ($raw ? $code->data : Tools::binarize($code->data));
 }
Beispiel #2
0
 /**
  * @param Input $input
  * @param $mask
  *
  * @return $this|null
  * @throws \yii\base\InvalidParamException
  */
 public function encodeMask(Input $input, $mask)
 {
     if ($input->getVersion() < 0 || $input->getVersion() > Enum::QRSPEC_VERSION_MAX) {
         throw new InvalidParamException('wrong version');
     }
     if ($input->getErrorCorrectionLevel() > Enum::QR_ECLEVEL_H) {
         throw new InvalidParamException('wrong level');
     }
     $raw = new RawCode($input);
     if ($this->benchmark) {
         Tools::markTime('after_raw');
     }
     $version = $raw->version;
     $width = Specifications::getWidth($version);
     $frame = Specifications::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, 0x2 | ($bit & $code) != 0);
             $bit = $bit >> 1;
         }
     }
     if ($this->benchmark) {
         Tools::markTime('after_filler');
     }
     unset($raw);
     // remainder bits
     $j = Specifications::getRemainder($version);
     for ($i = 0; $i < $j; $i++) {
         $addr = $filler->next();
         $filler->setFrameAt($addr, 0x2);
     }
     $frame = $filler->frame;
     unset($filler);
     // masking
     $maskObj = new Mask();
     if ($mask < 0) {
         if (Enum::QR_FIND_BEST_MASK) {
             $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
         } else {
             $masked = $maskObj->makeMask($width, $frame, intval(Enum::QR_DEFAULT_MASK) % 8, $input->getErrorCorrectionLevel());
         }
     } else {
         $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
     }
     if (is_null($masked)) {
         return null;
     }
     if ($this->benchmark) {
         Tools::markTime('after_mask');
     }
     $this->version = $version;
     $this->width = $width;
     $this->data = $masked;
     return $this;
 }