summaryrefslogtreecommitdiffstats
path: root/vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php')
-rw-r--r--vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php102
1 files changed, 102 insertions, 0 deletions
diff --git a/vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php b/vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php
new file mode 100644
index 0000000..1dc936d
--- /dev/null
+++ b/vendor/setasign/fpdi/src/PdfParser/Filter/Ascii85.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * This file is part of FPDI
+ *
+ * @package setasign\Fpdi
+ * @copyright Copyright (c) 2020 Setasign GmbH & Co. KG (https://www.setasign.com)
+ * @license http://opensource.org/licenses/mit-license The MIT License
+ */
+
+namespace setasign\Fpdi\PdfParser\Filter;
+
+/**
+ * Class for handling ASCII base-85 encoded data
+ */
+class Ascii85 implements FilterInterface
+{
+ /**
+ * Decode ASCII85 encoded string.
+ *
+ * @param string $data The input string
+ * @return string
+ * @throws Ascii85Exception
+ */
+ public function decode($data)
+ {
+ $out = '';
+ $state = 0;
+ $chn = null;
+
+ $data = \preg_replace('/\s/', '', $data);
+
+ $l = \strlen($data);
+
+ /** @noinspection ForeachInvariantsInspection */
+ for ($k = 0; $k < $l; ++$k) {
+ $ch = \ord($data[$k]) & 0xff;
+
+ //Start <~
+ if ($k === 0 && $ch === 60 && isset($data[$k + 1]) && (\ord($data[$k + 1]) & 0xFF) === 126) {
+ $k++;
+ continue;
+ }
+ //End ~>
+ if ($ch === 126 && isset($data[$k + 1]) && (\ord($data[$k + 1]) & 0xFF) === 62) {
+ break;
+ }
+
+ if ($ch === 122 /* z */ && $state === 0) {
+ $out .= \chr(0) . \chr(0) . \chr(0) . \chr(0);
+ continue;
+ }
+
+ if ($ch < 33 /* ! */ || $ch > 117 /* u */) {
+ throw new Ascii85Exception(
+ 'Illegal character found while ASCII85 decode.',
+ Ascii85Exception::ILLEGAL_CHAR_FOUND
+ );
+ }
+
+ $chn[$state] = $ch - 33;/* ! */
+ $state++;
+
+ if ($state === 5) {
+ $state = 0;
+ $r = 0;
+ for ($j = 0; $j < 5; ++$j) {
+ /** @noinspection UnnecessaryCastingInspection */
+ $r = (int)($r * 85 + $chn[$j]);
+ }
+
+ $out .= \chr($r >> 24)
+ . \chr($r >> 16)
+ . \chr($r >> 8)
+ . \chr($r);
+ }
+ }
+
+ if ($state === 1) {
+ throw new Ascii85Exception(
+ 'Illegal length while ASCII85 decode.',
+ Ascii85Exception::ILLEGAL_LENGTH
+ );
+ }
+
+ if ($state === 2) {
+ $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1] + 1) * 85 * 85 * 85;
+ $out .= \chr($r >> 24);
+ } elseif ($state === 3) {
+ $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2] + 1) * 85 * 85;
+ $out .= \chr($r >> 24);
+ $out .= \chr($r >> 16);
+ } elseif ($state === 4) {
+ $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3] + 1) * 85;
+ $out .= \chr($r >> 24);
+ $out .= \chr($r >> 16);
+ $out .= \chr($r >> 8);
+ }
+
+ return $out;
+ }
+}