MDL-49515 libraries: Update FPDI to 1.5.4
[moodle.git] / mod / assign / feedback / editpdf / fpdi / pdf_context.php
1 <?php\r
2 //\r
3 //  FPDI - Version 1.5.4\r
4 //\r
5 //    Copyright 2004-2015 Setasign - Jan Slabon\r
6 //\r
7 //  Licensed under the Apache License, Version 2.0 (the "License");\r
8 //  you may not use this file except in compliance with the License.\r
9 //  You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 //  Unless required by applicable law or agreed to in writing, software\r
14 //  distributed under the License is distributed on an "AS IS" BASIS,\r
15 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 //  See the License for the specific language governing permissions and\r
17 //  limitations under the License.\r
18 //\r
19 \r
20 /**\r
21  * Class pdf_context\r
22  */\r
23 class pdf_context\r
24 {\r
25     /**\r
26      * Mode\r
27      *\r
28      * @var integer 0 = file | 1 = string\r
29      */\r
30     protected $_mode = 0;\r
31 \r
32     /**\r
33      * @var resource|string\r
34      */\r
35     public $file;\r
36 \r
37     /**\r
38      * @var string\r
39      */\r
40     public $buffer;\r
41 \r
42     /**\r
43      * @var integer\r
44      */\r
45     public $offset;\r
46 \r
47     /**\r
48      * @var integer\r
49      */\r
50     public $length;\r
51 \r
52     /**\r
53      * @var array\r
54      */\r
55     public $stack;\r
56 \r
57     /**\r
58      * The constructor\r
59      *\r
60      * @param resource $f\r
61      */\r
62     public function __construct(&$f)\r
63     {\r
64         $this->file =& $f;\r
65         if (is_string($this->file))\r
66             $this->_mode = 1;\r
67 \r
68         $this->reset();\r
69     }\r
70 \r
71     /**\r
72      * Get the position in the file stream\r
73      *\r
74      * @return int\r
75      */\r
76     public function getPos()\r
77     {\r
78         if ($this->_mode == 0) {\r
79             return ftell($this->file);\r
80         } else {\r
81             return 0;\r
82         }\r
83     }\r
84 \r
85     /**\r
86      * Reset the position in the file stream.\r
87      *\r
88      * Optionally move the file pointer to a new location and reset the buffered data.\r
89      *\r
90      * @param null $pos\r
91      * @param int $l\r
92      */\r
93     public function reset($pos = null, $l = 100)\r
94     {\r
95         if ($this->_mode == 0) {\r
96             if (!is_null($pos)) {\r
97                 fseek ($this->file, $pos);\r
98             }\r
99 \r
100             $this->buffer = $l > 0 ? fread($this->file, $l) : '';\r
101             $this->length = strlen($this->buffer);\r
102             if ($this->length < $l)\r
103                 $this->increaseLength($l - $this->length);\r
104         } else {\r
105             $this->buffer = $this->file;\r
106             $this->length = strlen($this->buffer);\r
107         }\r
108         $this->offset = 0;\r
109         $this->stack = array();\r
110     }\r
111 \r
112     /**\r
113      * Make sure that there is at least one character beyond the current offset in the buffer.\r
114      *\r
115      * To prevent the tokenizer from attempting to access data that does not exist.\r
116      *\r
117      * @return bool\r
118      */\r
119     public function ensureContent()\r
120     {\r
121         if ($this->offset >= $this->length - 1) {\r
122             return $this->increaseLength();\r
123         } else {\r
124             return true;\r
125         }\r
126     }\r
127 \r
128     /**\r
129      * Forcefully read more data into the buffer\r
130      *\r
131      * @param int $l\r
132      * @return bool\r
133      */\r
134     public function increaseLength($l = 100)\r
135     {\r
136         if ($this->_mode == 0 && feof($this->file)) {\r
137             return false;\r
138         } else if ($this->_mode == 0) {\r
139             $totalLength = $this->length + $l;\r
140             do {\r
141                 $toRead = $totalLength - $this->length;\r
142                 if ($toRead < 1)\r
143                     break;\r
144 \r
145                 $this->buffer .= fread($this->file, $toRead);\r
146             } while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file));\r
147 \r
148             return true;\r
149         } else {\r
150             return false;\r
151         }\r
152     }\r