Spaces:
Sleeping
Sleeping
| /** | |
| * @package HTML2PS | |
| * @subpackage Document | |
| * Contains information about the background image to be rendered. | |
| * | |
| * If box does not have any background image it will still contain the | |
| * BackgroundImage object having $_url member set to NULL. | |
| * | |
| * @see GenericFormattedBox | |
| * @see CSSBackgroundImage | |
| * @link http://www.w3.org/TR/CSS21/colors.html#q2 CSS 2.1 "The background" | |
| */ | |
| class BackgroundImage { | |
| /** | |
| * @var string URL of the background image file (may be NULL in case no background image specified). | |
| * @access private | |
| */ | |
| var $_url; | |
| /** | |
| * @var Resource image to be displayed | |
| * @access private | |
| */ | |
| var $_image; | |
| /** | |
| * Constructs new BackgroundImage object | |
| * | |
| * @param string $url URL of the image file (or NULL of no image should be rendered at all) | |
| * @param resource $image image object to be displayed | |
| */ | |
| function BackgroundImage($url, $image) { | |
| $this->_url = $url; | |
| $this->_image = $image; | |
| } | |
| /** | |
| * "Deep copy" routine; it is required for compatibility with PHP 5 | |
| * | |
| * @return BackgroundImage A copy of current object | |
| */ | |
| function ©() { | |
| $value =& new BackgroundImage($this->_url, $this->_image); | |
| return $value; | |
| } | |
| /** | |
| * Checks if this value is equivalent to default value. According to CSS2, default value | |
| * if the 'background-image' is 'none' - no image at all; in this case $_url member should | |
| * contain NULL value. | |
| * | |
| * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-image CSS 2 'background-image' description | |
| * | |
| * @return boolean flag indicating whether this background image value is equivalent to default value | |
| * | |
| * @see CSSProperty::is_default() | |
| * @see CSSBackgroundImage::default_value() | |
| */ | |
| function is_default() { | |
| return is_null($this->_url); | |
| } | |
| /** | |
| * Renders the backgroung image using the specified output driver. | |
| * | |
| * @param OutputDriver $driver an output driver object | |
| * @param GenericFormattedBox $box an box owning this background image | |
| * @param int $repeat the 'background-repeat' value | |
| * @param BackgroundPosition $position the 'background-position' value | |
| * | |
| * @uses BackgroundPosition | |
| * @uses OutputDriver | |
| */ | |
| function show(&$driver, $box, $repeat, $position, $attachment) { | |
| /** | |
| * If no image should be rendered, just return | |
| * @see BackgroundImage::$_url | |
| */ | |
| if (is_null($this->_url)) { | |
| return; | |
| }; | |
| if (is_null($this->_image)) { | |
| return; | |
| }; | |
| if ($attachment == BACKGROUND_ATTACHMENT_FIXED && | |
| $box->getCSSProperty(CSS_DISPLAY) == '-body') { | |
| $media =& $driver->get_media(); | |
| $left = $box->get_left_background(); | |
| $right = $box->get_right_background(); | |
| $top = $driver->offset + mm2pt($media->margins['bottom']) + mm2pt($media->real_height()); | |
| $bottom = $driver->offset + mm2pt($media->margins['bottom']); | |
| } else { | |
| $left = $box->get_left_background(); | |
| $right = $box->get_right_background(); | |
| $top = $box->get_top_background(); | |
| $bottom = $box->get_bottom_background(); | |
| }; | |
| /** | |
| * Setup clipping region for padding area. Note that background image is drawn in the padding | |
| * area which in generic case is greater than content area. | |
| * | |
| * @see OutputDriver::clip() | |
| * | |
| * @link http://www.w3.org/TR/CSS21/box.html#box-padding-area CSS 2.1 definition of padding area | |
| */ | |
| $driver->save(); | |
| $driver->moveto($left, $top); | |
| $driver->lineto($right, $top); | |
| $driver->lineto($right, $bottom); | |
| $driver->lineto($left, $bottom); | |
| $driver->closepath(); | |
| $driver->clip(); | |
| /** | |
| * get real image size in device points | |
| * | |
| * @see pt2pt() | |
| * @see px2pt() | |
| */ | |
| $image_height = px2pt(imagesy($this->_image)); | |
| $image_width = px2pt(imagesx($this->_image)); | |
| /** | |
| * Get dimensions of the rectangle to be filled with the background image | |
| */ | |
| $padding_width = $right - $left; | |
| $padding_height = $top - $bottom; | |
| /** | |
| * Calculate the vertical offset from the top padding edge to the background image top edge using current | |
| * 'background-position' value. | |
| * | |
| * @link file:///C:/docs/css/colors.html#propdef-background-position CSS 2 'background-position' description | |
| */ | |
| if ($position->x_percentage) { | |
| $x_offset = ($padding_width - $image_width) * $position->x / 100; | |
| } else { | |
| $x_offset = $position->x; | |
| } | |
| /** | |
| * Calculate the horizontal offset from the left padding edge to the background image left edge using current | |
| * 'background-position' value | |
| * | |
| * @link file:///C:/docs/css/colors.html#propdef-background-position CSS 2 'background-position' description | |
| */ | |
| if ($position->y_percentage) { | |
| $y_offset = ($padding_height - $image_height) * $position->y / 100; | |
| } else { | |
| $y_offset = $position->y; | |
| }; | |
| /** | |
| * Output the image (probably tiling it; depends on current value of 'background-repeat') using | |
| * current output driver's tiled image output functions. Note that px2pt(1) is an image scaling factor; as all | |
| * page element are scaled to fit the media, background images should be scaled too! | |
| * | |
| * @see OutputDriver::image() | |
| * @see OutputDriver::image_rx() | |
| * @see OutputDriver::image_ry() | |
| * @see OutputDriver::image_rxry() | |
| * | |
| * @link file:///C:/docs/css/colors.html#propdef-background-repeat CSS 2.1 'background-repeat' property description | |
| */ | |
| switch ($repeat) { | |
| case BR_NO_REPEAT: | |
| /** | |
| * 'background-repeat: no-repeat' case; no tiling at all | |
| */ | |
| $driver->image($this->_image, | |
| $left + $x_offset, | |
| $top - $image_height - $y_offset, | |
| px2pt(1)); | |
| break; | |
| case BR_REPEAT_X: | |
| /** | |
| * 'background-repeat: repeat-x' case; horizontal tiling | |
| */ | |
| $driver->image_rx($this->_image, | |
| $left + $x_offset, | |
| $top - $image_height - $y_offset, | |
| $image_width, | |
| $right, | |
| $x_offset, | |
| $y_offset, | |
| px2pt(1)); | |
| break; | |
| case BR_REPEAT_Y: | |
| /** | |
| * 'background-repeat: repeat-y' case; vertical tiling | |
| */ | |
| $driver->image_ry($this->_image, | |
| $left + $x_offset, | |
| $top - $image_height - $y_offset, | |
| $image_height, | |
| $bottom, | |
| $x_offset, | |
| $y_offset, | |
| px2pt(1)); | |
| break; | |
| case BR_REPEAT: | |
| /** | |
| * 'background-repeat: repeat' case; full tiling | |
| */ | |
| $driver->image_rx_ry($this->_image, | |
| $left + $x_offset, | |
| $top - $image_height + $y_offset, | |
| $image_width, | |
| $image_height, | |
| $right, | |
| $bottom, | |
| $x_offset, | |
| $y_offset, | |
| px2pt(1)); | |
| break; | |
| }; | |
| /** | |
| * Restore the previous clipping area | |
| * | |
| * @see OutputDriver::clip() | |
| * @see OutputDriver::restore() | |
| */ | |
| $driver->restore(); | |
| } | |
| } | |