/** * Important! * Make sure the cache directory is writable */ public static function buildCache() { static::markTime('before_build_cache'); $mask = new Mask(); for ($a = 1; $a <= Enum::QRSPEC_VERSION_MAX; $a++) { $frame = Specifications::newFrame($a); $cache_dir = static::getCacheDir(); $fileName = $cache_dir . 'frame_' . $a . '.png'; Image::png(static::binarize($frame), $fileName, 1, 0); $width = count($frame); $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for ($maskNo = 0; $maskNo < 8; $maskNo++) { $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); } } static::markTime('after_build_cache'); }
/** * @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; }