PluginProbe
WCPOS – Point of Sale (POS) plugin for WooCommerce / 1.10.24
WCPOS – Point of Sale (POS) plugin for WooCommerce v1.10.24
1.10.24 1.10.23 1.10.22 1.10.21 1.10.20 1.10.19 1.10.18 1.10.17 1.10.16 1.10.15 1.10.13 1.10.14 1.10.12 1.10.11 1.10.10 1.10.9 1.10.8 untagged-3d9b7ccddc54df87c672 1.10.7 1.10.6 1.10.5 1.10.3 1.10.4 1.10.2 1.10.1 All 168 releases
woocommerce-pos / vendor_prefixed / dompdf / dompdf / src / Renderer.php

Renderer.php in WCPOS – Point of Sale (POS) plugin for WooCommerce 1.10.24, at vendor_prefixed/dompdf/dompdf/src/Renderer.php

248 lines 8.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * @package dompdf
5 * @link https://github.com/dompdf/dompdf
6 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
7 */
8 namespace WCPOS\Vendor\Dompdf;
9
10 use WCPOS\Vendor\Dompdf\Renderer\AbstractRenderer;
11 use WCPOS\Vendor\Dompdf\Renderer\Block;
12 use WCPOS\Vendor\Dompdf\Renderer\Image;
13 use WCPOS\Vendor\Dompdf\Renderer\Inline;
14 use WCPOS\Vendor\Dompdf\Renderer\ListBullet;
15 use WCPOS\Vendor\Dompdf\Renderer\TableCell;
16 use WCPOS\Vendor\Dompdf\Renderer\TableRow;
17 use WCPOS\Vendor\Dompdf\Renderer\TableRowGroup;
18 use WCPOS\Vendor\Dompdf\Renderer\Text;
19 /**
20 * Concrete renderer
21 *
22 * Instantiates several specific renderers in order to render any given frame.
23 *
24 * @package dompdf
25 */
26 class Renderer extends AbstractRenderer
27 {
28 /**
29 * Array of renderers for specific frame types
30 *
31 * @var AbstractRenderer[]
32 */
33 protected $_renderers;
34 /**
35 * Cache of the callbacks array
36 *
37 * @var array
38 */
39 private $_callbacks;
40 /**
41 * Advance the canvas to the next page
42 */
43 function new_page()
44 {
45 $this->_canvas->new_page();
46 }
47 /**
48 * Render frames recursively
49 *
50 * @param Frame $frame the frame to render
51 */
52 public function render(Frame $frame)
53 {
54 global $_dompdf_debug;
55 $this->_check_callbacks("begin_frame", $frame);
56 if ($_dompdf_debug) {
57 echo $frame;
58 \flush();
59 }
60 $style = $frame->get_style();
61 if (\in_array($style->visibility, ["hidden", "collapse"], \true)) {
62 return;
63 }
64 $display = $style->display;
65 $transformList = $style->transform;
66 $hasTransform = $transformList !== [];
67 // Starts the CSS transformation
68 if ($hasTransform) {
69 $this->_canvas->save();
70 [$x, $y] = $frame->get_padding_box();
71 [$originX, $originY] = $style->transform_origin;
72 $w = (float) $style->length_in_pt($style->width);
73 $h = (float) $style->length_in_pt($style->height);
74 foreach ($transformList as $transform) {
75 [$function, $values] = $transform;
76 if ($function === "matrix") {
77 $function = "transform";
78 } elseif ($function === "translate") {
79 $values[0] = $style->length_in_pt($values[0], $w);
80 $values[1] = $style->length_in_pt($values[1], $h);
81 }
82 $values[] = $x + $style->length_in_pt($originX, $w);
83 $values[] = $y + $style->length_in_pt($originY, $h);
84 \call_user_func_array([$this->_canvas, $function], $values);
85 }
86 }
87 switch ($display) {
88 case "block":
89 case "list-item":
90 case "inline-block":
91 case "table":
92 case "inline-table":
93 $this->_render_frame("block", $frame);
94 break;
95 case "inline":
96 if ($frame->is_text_node()) {
97 $this->_render_frame("text", $frame);
98 } else {
99 $this->_render_frame("inline", $frame);
100 }
101 break;
102 case "table-cell":
103 $this->_render_frame("table-cell", $frame);
104 break;
105 case "table-row":
106 $this->_render_frame("table-row", $frame);
107 break;
108 case "table-row-group":
109 case "table-header-group":
110 case "table-footer-group":
111 $this->_render_frame("table-row-group", $frame);
112 break;
113 case "-dompdf-list-bullet":
114 $this->_render_frame("list-bullet", $frame);
115 break;
116 case "-dompdf-image":
117 $this->_render_frame("image", $frame);
118 break;
119 case "none":
120 $node = $frame->get_node();
121 if ($node->nodeName === "script") {
122 if ($node->getAttribute("type") === "text/php" || $node->getAttribute("language") === "php") {
123 // Evaluate embedded php scripts
124 $this->_render_frame("php", $frame);
125 } elseif ($node->getAttribute("type") === "text/javascript" || $node->getAttribute("language") === "javascript") {
126 // Insert JavaScript
127 $this->_render_frame("javascript", $frame);
128 }
129 }
130 // Don't render children, so skip to next iter
131 return;
132 default:
133 break;
134 }
135 // Starts the overflow: hidden box
136 if ($style->overflow === "hidden") {
137 $padding_box = $frame->get_padding_box();
138 [$x, $y, $w, $h] = $padding_box;
139 $style = $frame->get_style();
140 if ($style->has_border_radius()) {
141 $border_box = $frame->get_border_box();
142 [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $padding_box);
143 $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl);
144 } else {
145 $this->_canvas->clipping_rectangle($x, $y, $w, $h);
146 }
147 }
148 $stack = [];
149 foreach ($frame->get_children() as $child) {
150 // < 0 : negative z-index
151 // = 0 : no z-index, no stacking context
152 // = 1 : stacking context without z-index
153 // > 1 : z-index
154 $child_style = $child->get_style();
155 $child_z_index = $child_style->z_index;
156 $z_index = 0;
157 if ($child_z_index !== "auto") {
158 $z_index = $child_z_index + 1;
159 } elseif ($child_style->float !== "none" || $child->is_positioned()) {
160 $z_index = 1;
161 }
162 $stack[$z_index][] = $child;
163 }
164 \ksort($stack);
165 foreach ($stack as $by_index) {
166 foreach ($by_index as $child) {
167 $this->render($child);
168 }
169 }
170 // Ends the overflow: hidden box
171 if ($style->overflow === "hidden") {
172 $this->_canvas->clipping_end();
173 }
174 if ($hasTransform) {
175 $this->_canvas->restore();
176 }
177 // Check for end frame callback
178 $this->_check_callbacks("end_frame", $frame);
179 }
180 /**
181 * Check for callbacks that need to be performed when a given event
182 * gets triggered on a frame
183 *
184 * @param string $event The type of event
185 * @param Frame $frame The frame that event is triggered on
186 */
187 protected function _check_callbacks(string $event, Frame $frame) : void
188 {
189 if (!isset($this->_callbacks)) {
190 $this->_callbacks = $this->_dompdf->getCallbacks();
191 }
192 if (isset($this->_callbacks[$event])) {
193 $fs = $this->_callbacks[$event];
194 $canvas = $this->_canvas;
195 $fontMetrics = $this->_dompdf->getFontMetrics();
196 foreach ($fs as $f) {
197 $f($frame, $canvas, $fontMetrics);
198 }
199 }
200 }
201 /**
202 * Render a single frame
203 *
204 * Creates Renderer objects on demand
205 *
206 * @param string $type type of renderer to use
207 * @param Frame $frame the frame to render
208 */
209 protected function _render_frame($type, $frame)
210 {
211 if (!isset($this->_renderers[$type])) {
212 switch ($type) {
213 case "block":
214 $this->_renderers[$type] = new Block($this->_dompdf);
215 break;
216 case "inline":
217 $this->_renderers[$type] = new Inline($this->_dompdf);
218 break;
219 case "text":
220 $this->_renderers[$type] = new Text($this->_dompdf);
221 break;
222 case "image":
223 $this->_renderers[$type] = new Image($this->_dompdf);
224 break;
225 case "table-cell":
226 $this->_renderers[$type] = new TableCell($this->_dompdf);
227 break;
228 case "table-row":
229 $this->_renderers[$type] = new TableRow($this->_dompdf);
230 break;
231 case "table-row-group":
232 $this->_renderers[$type] = new TableRowGroup($this->_dompdf);
233 break;
234 case "list-bullet":
235 $this->_renderers[$type] = new ListBullet($this->_dompdf);
236 break;
237 case "php":
238 $this->_renderers[$type] = new PhpEvaluator($this->_canvas);
239 break;
240 case "javascript":
241 $this->_renderers[$type] = new JavascriptEmbedder($this->_dompdf);
242 break;
243 }
244 }
245 $this->_renderers[$type]->render($frame);
246 }
247 }
248