/** * Singleton pattern * * @return QR_RSBlock */ public static function getInstance() { if (!self::$instance) { self::$instance = new self(0, 0); } return self::$instance; }
/** * Create a bitmap out of all append data elements * * @param int $typeNumber * @param int $errorCorrectLevel * @param array $dataList * * @throws QR_CodeException * * @return array */ private function createData($typeNumber, $errorCorrectLevel, $dataList) { $rsBlocks = QR_RSBlock::getInstance()->getRSBlocks($typeNumber, $errorCorrectLevel); $buffer = new QR_BitBuffer(); for ($i = 0; $i < sizeof($dataList); $i++) { $data = $dataList[$i]; assert($data instanceof QR_Byte); $buffer->put($data->getMode(), 4); $buffer->put($data->getLength(), QR_Util::getInstance()->getLengthInBits($data->getMode(), $typeNumber)); $data->write($buffer); } // calc num max data $totalDataCount = 0; for ($i = 0; $i < sizeof($rsBlocks); $i++) { $totalDataCount += $rsBlocks[$i]->getDataCount(); } if ($buffer->getLengthInBits() > $totalDataCount * 8) { throw new QR_CodeException("code length overflow (" . $buffer->getLengthInBits() . " > " . $totalDataCount * 8 . ")"); } // end code if ($buffer->getLengthInBits() + 4 <= $totalDataCount * 8) { $buffer->put(0, 4); } // padding while ($buffer->getLengthInBits() % 8 != 0) { $buffer->putBit(false); } // padding while (true) { if ($buffer->getLengthInBits() >= $totalDataCount * 8) { break; } $buffer->put(QR_Code::PAD0, 8); if ($buffer->getLengthInBits() >= $totalDataCount * 8) { break; } $buffer->put(QR_Code::PAD1, 8); } return $this->createBytes($buffer, $rsBlocks); }