Blame view

dompdf/src/Positioner/Absolute.php 3.66 KB
670b6d6f8   tuan   2016/09/22 - Copy...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  <?php
  /**
   * @package dompdf
   * @link    http://dompdf.github.com/
   * @author  Benj Carson <benjcarson@digitaljunkies.ca>
   * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
   */
  
  namespace Dompdf\Positioner;
  
  use Dompdf\FrameDecorator\AbstractFrameDecorator;
  
  /**
   * Positions absolutely positioned frames
   */
  class Absolute extends AbstractPositioner
  {
  
      function __construct(AbstractFrameDecorator $frame)
      {
          parent::__construct($frame);
      }
  
      function position()
      {
  
          $frame = $this->_frame;
          $style = $frame->get_style();
  
          $p = $frame->find_positionned_parent();
  
          list($x, $y, $w, $h) = $frame->get_containing_block();
  
          $top = $style->length_in_pt($style->top, $h);
          $right = $style->length_in_pt($style->right, $w);
          $bottom = $style->length_in_pt($style->bottom, $h);
          $left = $style->length_in_pt($style->left, $w);
  
          if ($p && !($left === "auto" && $right === "auto")) {
              // Get the parent's padding box (see http://www.w3.org/TR/CSS21/visuren.html#propdef-top)
              list($x, $y, $w, $h) = $p->get_padding_box();
          }
  
          list($width, $height) = array($frame->get_margin_width(), $frame->get_margin_height());
  
          $orig_style = $this->_frame->get_original_style();
          $orig_width = $orig_style->width;
          $orig_height = $orig_style->height;
  
          /****************************
           *
           * Width auto:
           * ____________| left=auto | left=fixed |
           * right=auto  |     A     |     B      |
           * right=fixed |     C     |     D      |
           *
           * Width fixed:
           * ____________| left=auto | left=fixed |
           * right=auto  |     E     |     F      |
           * right=fixed |     G     |     H      |
           *****************************/
  
          if ($left === "auto") {
              if ($right === "auto") {
                  // A or E - Keep the frame at the same position
                  $x = $x + $frame->find_block_parent()->get_current_line_box()->w;
              } else {
                  if ($orig_width === "auto") {
                      // C
                      $x += $w - $width - $right;
                  } else {
                      // G
                      $x += $w - $width - $right;
                  }
              }
          } else {
              if ($right === "auto") {
                  // B or F
                  $x += $left;
              } else {
                  if ($orig_width === "auto") {
                      // D - TODO change width
                      $x += $left;
                  } else {
                      // H - Everything is fixed: left + width win
                      $x += $left;
                  }
              }
          }
  
          // The same vertically
          if ($top === "auto") {
              if ($bottom === "auto") {
                  // A or E - Keep the frame at the same position
                  $y = $frame->find_block_parent()->get_current_line_box()->y;
              } else {
                  if ($orig_height === "auto") {
                      // C
                      $y += $h - $height - $bottom;
                  } else {
                      // G
                      $y += $h - $height - $bottom;
                  }
              }
          } else {
              if ($bottom === "auto") {
                  // B or F
                  $y += $top;
              } else {
                  if ($orig_height === "auto") {
                      // D - TODO change height
                      $y += $top;
                  } else {
                      // H - Everything is fixed: top + height win
                      $y += $top;
                  }
              }
          }
  
          $frame->set_position($x, $y);
  
      }
  }