$val) { if ($i > 2) { break; } if (!is_numeric($val)) { return \false; } } return \true; } /** * @param array $value * * @inheritDoc * @throws \chillerlan\QRCode\Output\QRCodeOutputException */ protected function prepareModuleValue($value) : array { $values = []; foreach (array_values($value) as $i => $val) { if ($i > 2) { break; } $values[] = max(0, min(255, intval($val))); } if (count($values) !== 3) { throw new QRCodeOutputException('invalid color value'); } return $values; } /** * @inheritDoc */ protected function getDefaultModuleValue(bool $isDark) : array { return $isDark ? [0, 0, 0] : [255, 255, 255]; } /** * Initializes an FPDF instance */ protected function initFPDF() : FPDF { $fpdf = new FPDF('P', $this->options->fpdfMeasureUnit, $this->getOutputDimensions()); $fpdf->AddPage(); return $fpdf; } /** * @inheritDoc * * @return string|\FPDF */ public function dump(?string $file = null, ?FPDF $fpdf = null) { $this->fpdf = $fpdf ?? $this->initFPDF(); if ($this::moduleValueIsValid($this->options->bgColor)) { $bgColor = $this->prepareModuleValue($this->options->bgColor); [$width, $height] = $this->getOutputDimensions(); /** @phan-suppress-next-line PhanParamTooFewUnpack */ $this->fpdf->SetFillColor(...$bgColor); $this->fpdf->Rect(0, 0, $width, $height, 'F'); } $this->prevColor = null; foreach ($this->matrix->getMatrix() as $y => $row) { foreach ($row as $x => $M_TYPE) { $this->module($x, $y, $M_TYPE); } } if ($this->options->returnResource) { return $this->fpdf; } $pdfData = $this->fpdf->Output('S'); $this->saveToFile($pdfData, $file); if ($this->options->outputBase64) { $pdfData = $this->toBase64DataURI($pdfData); } return $pdfData; } /** * Renders a single module */ protected function module(int $x, int $y, int $M_TYPE) : void { if (!$this->drawLightModules && !$this->matrix->isDark($M_TYPE)) { return; } $color = $this->getModuleValue($M_TYPE); if ($color !== null && $color !== $this->prevColor) { /** @phan-suppress-next-line PhanParamTooFewUnpack */ $this->fpdf->SetFillColor(...$color); $this->prevColor = $color; } $this->fpdf->Rect($x * $this->scale, $y * $this->scale, $this->scale, $this->scale, 'F'); } }