function reflow(Frame_Decorator $block = null) { $fixed_children = array(); $prev_child = null; $child = $this->_frame->get_first_child(); $current_page = 0; while ($child) { $this->apply_page_style($this->_frame, $current_page + 1); $style = $this->_frame->get_style(); $cb = $this->_frame->get_containing_block(); $left = $style->length_in_pt($style->margin_left, $cb["w"]); $right = $style->length_in_pt($style->margin_right, $cb["w"]); $top = $style->length_in_pt($style->margin_top, $cb["h"]); $bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); $content_x = $cb["x"] + $left; $content_y = $cb["y"] + $top; $content_width = $cb["w"] - $left - $right; $content_height = $cb["h"] - $top - $bottom; if ($current_page == 0) { $children = $child->get_children(); foreach ($children as $onechild) { if ($onechild->get_style()->position === "fixed") { $fixed_children[] = $onechild->deep_copy(); } } $fixed_children = array_reverse($fixed_children); } $child->set_containing_block($content_x, $content_y, $content_width, $content_height); $this->_check_callbacks("begin_page_reflow", $child); if ($current_page >= 1) { foreach ($fixed_children as $fixed_child) { $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child()); } } $child->reflow(); $next_child = $child->get_next_sibling(); $this->_check_callbacks("begin_page_render", $child); $renderer = $this->_frame->get_renderer(); $renderer->render($child); Renderer::$stacking_first_pass = false; ksort($this->_stacking_context); foreach ($this->_stacking_context as $_frames) { foreach ($_frames as $_frame) { $renderer->render($_frame); } } Renderer::$stacking_first_pass = true; $this->_stacking_context = array(); $this->_check_callbacks("end_page_render", $child); if ($next_child) { $this->_frame->next_page(); } if ($prev_child) { $prev_child->dispose(true); } $prev_child = $child; $child = $next_child; $current_page++; } if ($prev_child) { $prev_child->dispose(true); } }
/** * Paged layout: * http://www.w3.org/TR/CSS21/page.html */ function reflow(Frame_Decorator $block = null) { $fixed_children = array(); $prev_child = null; $child = $this->_frame->get_first_child(); $current_page = 0; while ($child) { $this->apply_page_style($this->_frame, $current_page + 1); $style = $this->_frame->get_style(); // Pages are only concerned with margins $cb = $this->_frame->get_containing_block(); $left = $style->length_in_pt($style->margin_left, $cb["w"]); $right = $style->length_in_pt($style->margin_right, $cb["w"]); $top = $style->length_in_pt($style->margin_top, $cb["h"]); $bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); $content_x = $cb["x"] + $left; $content_y = $cb["y"] + $top; $content_width = $cb["w"] - $left - $right; $content_height = $cb["h"] - $top - $bottom; // Only if it's the first page, we save the nodes with a fixed position if ($current_page == 0) { $children = $child->get_children(); foreach ($children as $onechild) { if ($onechild->get_style()->position === "fixed") { $fixed_children[] = $onechild->deep_copy(); } } $fixed_children = array_reverse($fixed_children); } $child->set_containing_block($content_x, $content_y, $content_width, $content_height); // Check for begin reflow callback $this->_check_callbacks("begin_page_reflow", $child); //Insert a copy of each node which have a fixed position if ($current_page >= 1) { foreach ($fixed_children as $fixed_child) { $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child()); } } $child->reflow(); $next_child = $child->get_next_sibling(); // Check for begin render callback $this->_check_callbacks("begin_page_render", $child); $renderer = $this->_frame->get_renderer(); // Render the page $renderer->render($child); Renderer::$stacking_first_pass = false; // http://www.w3.org/TR/CSS21/visuren.html#z-index ksort($this->_stacking_context); foreach ($this->_stacking_context as $_frames) { foreach ($_frames as $_frame) { $renderer->render($_frame); } } Renderer::$stacking_first_pass = true; $this->_stacking_context = array(); // Check for end render callback $this->_check_callbacks("end_page_render", $child); if ($next_child) { $this->_frame->next_page(); } // Wait to dispose of all frames on the previous page // so callback will have access to them if ($prev_child) { $prev_child->dispose(true); } $prev_child = $child; $child = $next_child; $current_page++; } // Dispose of previous page if it still exists if ($prev_child) { $prev_child->dispose(true); } }