GenericInlineBox(); } function get_max_width_natural(&$context) { return $this->get_full_width($context); } function get_min_width(&$context) { return $this->get_full_width(); } function get_max_width(&$context) { return $this->get_full_width(); } function is_null() { return false; } function pre_reflow_images() { switch ($this->scale) { case SCALE_WIDTH: // Only 'width' attribute given $size = $this->src_width/$this->src_height* $this->get_width(); $this->put_height($size); // Update baseline according to constrained image height $this->default_baseline = $this->get_full_height(); break; case SCALE_HEIGHT: // Only 'height' attribute given $size = $this->src_height/$this->src_width* $this->get_height(); $this->put_width($size); $this->setCSSProperty(CSS_WIDTH, new WCConstant($size)); $this->default_baseline = $this->get_full_height(); break; }; } function readCSS(&$state) { parent::readCSS($state); // '-html2ps-link-target' global $g_config; if ($g_config["renderlinks"]) { $this->_readCSS($state, array(CSS_HTML2PS_LINK_TARGET)); }; } function reflow_static(&$parent, &$context) { $this->pre_reflow_images(); GenericFormattedBox::reflow($parent, $context); // Check if we need a line break here $this->maybe_line_break($parent, $context); // set default baseline $this->baseline = $this->default_baseline; // append to parent line box $parent->append_line($this); // Move box to the parent current point $this->guess_corner($parent); // Move parent's X coordinate $parent->_current_x += $this->get_full_width(); // Extend parent height $parent->extend_height($this->get_bottom_margin()); } function _get_font_name(&$driver, $subword_index) { if (isset($this->_cache[CACHE_TYPEFACE][$subword_index])) { return $this->_cache[CACHE_TYPEFACE][$subword_index]; }; $font_resolver =& $driver->get_font_resolver(); $font = $this->get_css_property(CSS_FONT); $typeface = $font_resolver->get_typeface_name($font->family, $font->weight, $font->style, 'iso-8859-1'); $this->_cache[CACHE_TYPEFACE][$subword_index] = $typeface; return $typeface; } function reflow_text(&$driver) { // In XHTML images are treated as a common inline elements; they are affected by line-height and font-size global $g_config; if ($g_config['mode'] == 'xhtml') { /** * A simple assumption is made: fonts used for different encodings * have equal ascender/descender values (while they have the same * typeface, style and weight). */ $font_name = $this->_get_font_name($driver, 0); /** * Get font vertical metrics */ $ascender = $driver->font_ascender($font_name, 'iso-8859-1'); if (is_null($ascender)) { error_log("ImgBox::reflow_text: cannot get font ascender"); return null; }; $descender = $driver->font_descender($font_name, 'iso-8859-1'); if (is_null($descender)) { error_log("ImgBox::reflow_text: cannot get font descender"); return null; }; /** * Setup box size */ $font = $this->get_css_property(CSS_FONT_SIZE); $font_size = $font->getPoints(); $this->ascender = $ascender * $font_size; $this->descender = $descender * $font_size; } else { $this->ascender = $this->get_height(); $this->descender = 0; }; return true; } // Image boxes are regular inline boxes; whitespaces after images should be rendered // function reflow_whitespace(&$linebox_started, &$previous_whitespace) { $linebox_started = true; $previous_whitespace = false; return; } function show_fixed(&$driver) { return $this->show($driver); } } class BrokenImgBox extends GenericImgBox { var $alt; function BrokenImgBox($width, $height, $alt) { $this->scale = SCALE_NONE; $this->encoding = DEFAULT_ENCODING; // Call parent constructor $this->GenericImgBox(); $this->alt = $alt; } function show(&$driver) { $driver->save(); // draw generic box GenericFormattedBox::show($driver); $driver->setlinewidth(0.1); $driver->moveto($this->get_left(), $this->get_top()); $driver->lineto($this->get_right(), $this->get_top()); $driver->lineto($this->get_right(), $this->get_bottom()); $driver->lineto($this->get_left(), $this->get_bottom()); $driver->closepath(); $driver->stroke(); if (!$GLOBALS['g_config']['debugnoclip']) { $driver->moveto($this->get_left(), $this->get_top()); $driver->lineto($this->get_right(), $this->get_top()); $driver->lineto($this->get_right(), $this->get_bottom()); $driver->lineto($this->get_left(), $this->get_bottom()); $driver->closepath(); $driver->clip(); }; // Output text with the selected font $size = pt2pt(BROKEN_IMAGE_ALT_SIZE_PT); $status = $driver->setfont("Times-Roman", "iso-8859-1", $size); if (is_null($status)) { return null; }; $driver->show_xy($this->alt, $this->get_left() + $this->width/2 - $driver->stringwidth($this->alt, "Times-Roman", "iso-8859-1", $size)/2, $this->get_top() - $this->height/2 - $size/2); $driver->restore(); $strategy =& new StrategyLinkRenderingNormal(); $strategy->apply($this, $driver); return true; } } class ImgBox extends GenericImgBox { var $image; var $type; // unused; should store the preferred image format (JPG / PNG) function ImgBox($img) { $this->encoding = DEFAULT_ENCODING; $this->scale = SCALE_NONE; // Call parent constructor $this->GenericImgBox(); // Store image for further processing $this->image = $img; } function &create(&$root, &$pipeline) { // Open image referenced by HTML tag // Some crazy HTML writers add leading and trailing spaces to SRC attribute value - we need to remove them // $url_autofix = new AutofixUrl(); $src = $url_autofix->apply(trim($root->get_attribute("src"))); $image_url = $pipeline->guess_url($src); $src_img = ImageFactory::get($image_url, $pipeline); if (is_null($src_img)) { // image could not be opened, use ALT attribute if ($root->has_attribute('width')) { $width = px2pt($root->get_attribute('width')); } else { $width = px2pt(BROKEN_IMAGE_DEFAULT_SIZE_PX); }; if ($root->has_attribute('height')) { $height = px2pt($root->get_attribute('height')); } else { $height = px2pt(BROKEN_IMAGE_DEFAULT_SIZE_PX); }; $alt = $root->get_attribute('alt'); $box =& new BrokenImgBox($width, $height, $alt); $box->readCSS($pipeline->get_current_css_state()); $box->put_width($width); $box->put_height($height); $box->default_baseline = $box->get_full_height(); $box->src_height = $box->get_height(); $box->src_width = $box->get_width(); return $box; } else { $box =& new ImgBox($src_img); $box->readCSS($pipeline->get_current_css_state()); $box->_setupSize(); return $box; } } function _setupSize() { $this->put_width(px2pt($this->image->sx())); $this->put_height(px2pt($this->image->sy())); $this->default_baseline = $this->get_full_height(); $this->src_height = $this->image->sx(); $this->src_width = $this->image->sy(); $wc = $this->get_css_property(CSS_WIDTH); $hc = $this->get_height_constraint(); // Proportional scaling if ($hc->is_null() && !$wc->isNull()) { $this->scale = SCALE_WIDTH; // Only 'width' attribute given $size = $this->src_width/$this->src_height* $this->get_width(); $this->put_height($size); // Update baseline according to constrained image height $this->default_baseline = $this->get_full_height(); } elseif (!$hc->is_null() && $wc->isNull()) { $this->scale = SCALE_HEIGHT; // Only 'height' attribute given $size = $this->src_height/$this->src_width* $this->get_height(); $this->put_width($size); $this->setCSSProperty(CSS_WIDTH, new WCConstant($size)); $this->default_baseline = $this->get_full_height(); }; } function show(&$driver) { // draw generic box GenericFormattedBox::show($driver); // Check if "designer" set the height or width of this image to zero; in this there will be no reason // in drawing the image at all // if ($this->get_width() < EPSILON || $this->get_height() < EPSILON) { return true; }; $driver->image_scaled($this->image, $this->get_left(), $this->get_bottom(), $this->get_width() / $this->image->sx(), $this->get_height() / $this->image->sy()); $strategy =& new StrategyLinkRenderingNormal(); $strategy->apply($this, $driver); return true; } } ?>