PluginProbe
MBE eShip / trunk
MBE eShip vtrunk
2.8.1 trunk 1.0.0 1.1.0 1.1.3 1.2.1 1.2.2 1.3.0 1.4.0 1.4.1 1.5.0 1.5.1 1.5.2 1.6.0 1.7.0 1.7.1 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.1.0 2.1.1 2.1.2 2.2.1 All 37 releases
mail-boxes-etc / lib / dompdf / src / Positioner / Absolute.php

Absolute.php in MBE eShip trunk, at lib/dompdf/src/Positioner/Absolute.php

129 lines 4.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package dompdf
4 * @link https://github.com/dompdf/dompdf
5 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
6 */
7 namespace Dompdf\Positioner;
8
9 use Dompdf\FrameDecorator\AbstractFrameDecorator;
10 use Dompdf\FrameReflower\Block;
11
12 /**
13 * Positions absolutely positioned frames
14 */
15 class Absolute extends AbstractPositioner
16 {
17
18 /**
19 * @param AbstractFrameDecorator $frame
20 */
21 function position(AbstractFrameDecorator $frame): void
22 {
23 if ($frame->get_reflower() instanceof Block) {
24 $style = $frame->get_style();
25 [$cbx, $cby, $cbw, $cbh] = $frame->get_containing_block();
26
27 // If the `top` value is `auto`, the frame will be repositioned
28 // after its height has been resolved
29 $left = (float) $style->length_in_pt($style->left, $cbw);
30 $top = (float) $style->length_in_pt($style->top, $cbh);
31
32 $frame->set_position($cbx + $left, $cby + $top);
33 } else {
34 // Legacy positioning logic for image and table frames
35 // TODO: Resolve dimensions, margins, and offsets similar to the
36 // block case in the reflowers and use the simplified logic above
37 $style = $frame->get_style();
38 $block_parent = $frame->find_block_parent();
39 $current_line = $block_parent->get_current_line_box();
40
41 list($x, $y, $w, $h) = $frame->get_containing_block();
42 $inflow_x = $block_parent->get_content_box()["x"] + $current_line->left + $current_line->w;
43 $inflow_y = $current_line->y;
44
45 $top = $style->length_in_pt($style->top, $h);
46 $right = $style->length_in_pt($style->right, $w);
47 $bottom = $style->length_in_pt($style->bottom, $h);
48 $left = $style->length_in_pt($style->left, $w);
49
50 list($width, $height) = [$frame->get_margin_width(), $frame->get_margin_height()];
51
52 $orig_width = $style->get_specified("width");
53 $orig_height = $style->get_specified("height");
54
55 /****************************
56 *
57 * Width auto:
58 * ____________| left=auto | left=fixed |
59 * right=auto | A | B |
60 * right=fixed | C | D |
61 *
62 * Width fixed:
63 * ____________| left=auto | left=fixed |
64 * right=auto | E | F |
65 * right=fixed | G | H |
66 *****************************/
67
68 if ($left === "auto") {
69 if ($right === "auto") {
70 // A or E - Keep the frame at the same position
71 $x = $inflow_x;
72 } else {
73 if ($orig_width === "auto") {
74 // C
75 $x += $w - $width - $right;
76 } else {
77 // G
78 $x += $w - $width - $right;
79 }
80 }
81 } else {
82 if ($right === "auto") {
83 // B or F
84 $x += (float)$left;
85 } else {
86 if ($orig_width === "auto") {
87 // D - TODO change width
88 $x += (float)$left;
89 } else {
90 // H - Everything is fixed: left + width win
91 $x += (float)$left;
92 }
93 }
94 }
95
96 // The same vertically
97 if ($top === "auto") {
98 if ($bottom === "auto") {
99 // A or E - Keep the frame at the same position
100 $y = $inflow_y;
101 } else {
102 if ($orig_height === "auto") {
103 // C
104 $y += (float)$h - $height - (float)$bottom;
105 } else {
106 // G
107 $y += (float)$h - $height - (float)$bottom;
108 }
109 }
110 } else {
111 if ($bottom === "auto") {
112 // B or F
113 $y += (float)$top;
114 } else {
115 if ($orig_height === "auto") {
116 // D - TODO change height
117 $y += (float)$top;
118 } else {
119 // H - Everything is fixed: top + height win
120 $y += (float)$top;
121 }
122 }
123 }
124
125 $frame->set_position($x, $y);
126 }
127 }
128 }
129