a:8:{s:4:"name";s:6:"zem_ir";s:6:"author";s:15:"Threshold State";s:10:"author_uri";s:26:"http://thresholdstate.com/";s:7:"version";s:3:"0.5";s:11:"description";s:32:"CSS/PNG image replacement plugin";s:4:"help";s:9530:"
<code>zem_image_replace</code>, or <code>zem_ir</code>, replaces text with a PNG image rendered using a TrueType font, and uses CSS to place the image on the page in such a way that the text is still accessible to text-only browsers.  It&#8217;s similar, in some respects, to <a href="http://www.mikeindustries.com/blog/archive/2004/08/sifr">SIFR</a>, except that zem_ir uses PNG and CSS where SIFR uses Flash and Javascript.

	<p>Because it integrates with Textpattern, zem_ir can be safely used to automatically turn any text into an image &#8211; not just a static heading, but article titles, dates, even excerpts and entire articles.  All images are cached to save bandwidth and minimize server load.  In most cases the title images create by zem_ir are very small, often less than 1kb each.</p>

	<p>The image is generated by code based on Stewart Rosenberger&#8217;s <a href="http://www.alistapart.com/articles/dynatext/">Dynamic Text Replacement script</a>.  zem_ir supports several different CSS replacement methods, based on <a href="http://www.mezzoblue.com/tests/revised-image-replacement/">the most widely tested techniques</a>.  Alternative methods can be implemented using the <code>class</code> attribute.</p>

	<p>Typical use might be something like this:
<pre><code>
&lt;txp:zem_ir font="myfont.ttf" wraptag="h2"&gt;&lt;txp:page_title /&gt;&lt;/txp:zem_ir&gt;
</code></pre></p>

	<p>Which would automatically generate a PNG image containing the page title rendered in the specified font, and display it with code similar to this:
<pre><code>
&lt;h2 style="margin: 0 0 0 -5000px; background: url('/images/zir/b0f4c80ec436ee047716afc02b79cc92.png') no-repeat top right; height: 24px; text-align: left;"&gt;my page title&lt;/h2&gt;
</code></pre></p>

	<p>nb &#8211; this example assumes your image directory is writable, and the font file is stored in your home directory (<strong>not</strong> public_html).</p>

	<p>A more complex example, using the new <code>zem_ir_set</code> tag to pre-define attributes:</p>

<pre><code>
&lt;txp:zem_ir_set font="myfont.ttf" fontsize=32 backgroundcolor="#fff" color="#ccc" wraptag="h1" /&gt;
&lt;txp:zem_ir_set group="subhead" font="myfont.ttf" fontsize=16 wraptag="h2" /&gt;

	<p>&lt;txp:zem_ir&gt;&lt;txp:page_title /&gt;&lt;/txp:zem_ir&gt;
&lt;txp:zem_ir group="subhead"&gt;&lt;txp:site_slogan /&gt;&lt;/txp:zem_ir&gt;
&lt;txp:zem_ir&gt;&lt;txp:title /&gt;&lt;/txp:zem_ir&gt;
</code></pre></p>

	<p>The first <code>&lt;txp:zem_ir_set&gt;</code> tag defines the default parameters used by <code>&lt;txp:zem_ir&gt;</code>.  The second one defines a second set of defaults, identified by <code>group="subhead"</code>.  The page title and article title are displayed using the default settings (fontsize=32, etc); the site slogan is displayed using the <code>group="subhead"</code> settings (fontsize=16, etc).  (Default parameters, where no group is specified, are not inherited by other groups, so the site slogan will not use the color and backgroundcolor settings specified in the first <code>&lt;txp:zem_ir_set /&gt;</code> tag).</p>

	<p><strong>Tags</strong></p>

<code>&lt;txp:zem_ir_set /&gt;</code> &#8211; specify the default parameters used by <code>&lt;txp:zem_ir&gt;</code> tags.  The <code>group</code> attribute may be used to create multiple independent groups of parameters.

<code>&lt;txp:zem_ir&gt;...&lt;/txp:zem_ir&gt;</code> &#8211; create a PNG image containing the enclosed content, and use CSS to display it.  The content may include any Textpattern tags, such as <code>&lt;txp:title /&gt;</code>.  Any parameters specified by zem_ir_set with the same <code>group</code> setting will be applied.  Additional parameters may also be specified as attributes to the <code>zem_ir</code> tag.

	<p>For compatibility with older versions, <code>&lt;txp:zem_image_replace&gt;</code>  is an alias for <code>&lt;txp:zem_ir&gt;</code>.</p>

	<p><strong>Attributes</strong></p>

	<p>Both tags support the following attributes:<br />
<dl><br />
<dt>group</dt><dd>Specify the group name.  <code>zem_ir</code> will use any parameters specified by a <code>zem_ir_set</code> tag with the same group name.  If no group is specified, both tags use a group named &#8216;default&#8217;.</dd><br />
<dt>info</dt><dd>Use info=1 to produce debugging output instead of creating an image.  Default is 0.</dd><br />
<dt>fontdir</dt><dd>Absolute filesystem path to the directory where font files are found.  Default is the directory containing the document root, typically your home directory (e.g. <code>/home/myname/</code>).</dd><br />
<dt>font</dt><dd>Pathname of the ttf font file, relative to the fontdir.  May include subfolders.</dd><br />
<dt>fontsize</dt><dd>Font size in pixels.  Default is 24.</dd><br />
<dt>color</dt><dd>Font color, in #rrggbb or #rgb format.  Default is &#8221;#000000&#8221;.</dd><br />
<dt>backgroundcolor</dt><dd>Background color, in #rrggbb or #rgb format.  Default is &#8221;#ffffff&#8221;.</dd><br />
<dt>angle</dt><dd>Text rotation angle in degrees, counter-clockwise from horizontal.  Default is 0.</dd><br />
<dt>trans</dt><dd>1 for a transparent image, 0 for a solid image.  Default is 1.</dd><br />
<dt>aa</dt><dd>1 to use anti-aliasing if available; 0 to disable.  Default is 1.</dd><br />
<dt>ft</dt><dd>1 to use Freetype 2 if it&#8217;s available; 0 to disable.  Default is 0.</dd><br />
<dt>depth</dt><dd>Image depth in bits, 8 or 24.  Default is 8.</dd><br />
<dt>cachedir</dt><dd>Folder used to store generated images, relative to the document root.  Default is &#8221;[prefix]/images/zir&#8221;.  The final subdirectory will be created if it does not exist.  <strong>This folder must be writable (chmod 0777)</strong>.</dd><br />
<dt>wraptag</dt><dd>Tag used for image replacement.  Default is h1</dd><br />
<dt>width</dt><br />
<dt>height</dt><dd>CSS element width and height.  Set this if you need the wraptag element to be a different size to the image.  Defaults to the image size.</dd><br />
<dt>wrap</dt><dd>Word-wrap text to a specific width limit, in pixels.  Default is 0, no wrapping.  The pixel width refers to the dimensions of the text <cite>before</cite> rotation and padding is applied.</dd><br />
<dt>position</dt><dd>Image position.  Default is &#8220;top left&#8221;.  Doesn&#8217;t work well with all image replacement methods.</dd><br />
<dt>limit</dt><dd>Maximum number of characters to pass to the image replacement script.  Default is 0, no limit.</dd><br />
<dt>class</dt><dd>If set, the generated code will only provide the <cite>background</cite> attribute in the inline style.  Use this if you want to shift the CSS to your stylesheet, or use a different replacement technique (e.g. FIR).</dd><br />
<dt>padding</dt><dd>Padding around the text within the image, in pixels.  Use this to compensate for bounding box errors with some fonts.  Provide a single number for equal padding on all sides, or &#8220;1 2 3 4&#8221; to specify the top, right, bottom and left separately.  Default is &#8220;0&#8221;.</dd><br />
<dt>transform</dt><dd>Transform the text used to create the image.  One of &#8220;uppercase&#8221;, &#8220;lowercase&#8221;, &#8220;capitalize&#8221;.</dd><br />
<dt>method</dt><dd>Image replacement method.  One of &#8220;phark&#8221;, &#8220;radu&#8221;, &#8220;dwyer&#8221;, &#8220;lir&#8221;, &#8220;img&#8221;.  Default is &#8220;phark&#8221;.</dd><br />
<dt>tr</dt><dd>Convert unwanted characters to spaces before creating the image.  Useful for fonts that don&#8217;t provide a complete character set.  For example, <code>tr="_/"</code> will convert underscores and slashes to spaces.  Default is no conversion.</dd><br />
<dt>tt</dt><dd>Alternate replacement character to use with <code>tr</code>.  Default is <code>" "</code>, a space.</dd><br />
<dt>text</dt><dd>Specify the text to display.  May be used instead of an enclosing tag as a shorthand for creating images with static text.  For example, <code>&lt;txp:zem_ir text="hello world" /&gt;</code> is equivalent to <code>&lt;txp:zem_ir&gt;hello world&lt;/txp:zem_ir&gt;</code>.</dd><br />
</dl></p>

	<p>Some notes on the different CSS replacement methods:</p>

	<p><dl><br />
<dt>phark</dt><dd>&#8220;Phark Revised&#8221;, the most reliable method in most circumstances.  Tests well in IE, Mozilla, Opera and Konqueror, and allows left, right or center positioning.</dd><br />
<dt>radu</dt><dd>Radu Darvas&#8217; negative margin method.  Tests well in IE, Mozilla, Opera and Konqueror, but only when right aligned.</dd><br />
<dt>dwyer</dt><dd>Leon Dwyer&#8217;s enhanced FIR method.  Tests well in IE, Mozilla, Opera and Konqueror.  Uses an extra <code>&lt;span&gt;</code> tag.</dd><br />
<dt>lir</dt><dd>Leahy/Langridge overflow method.  Tests well in IE, Mozilla and Opera, but fails in Konqueror and Safari.</dd><br />
<dt>img</dt><dd>Doesn&#8217;t use CSS replacement at all, but simply produces an <code>&lt;img&gt;</code> tag with a link to the generated PNG image.  Text content will be included in the <code>alt</code> attribute.</dd><br />
</dl></p>

	<p>zem_ir is Copyright 2004-2005 <a href="http://thresholdstate.com/">Threshold State</a>.<br />
Distributed under the terms of the <a href="http://www.gnu.org/licenses/gpl.txt">GNU General Public License</a>.</p>

	<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.</p>



 ";s:4:"code";s:12116:"
	function zem_ir_set($atts) {
		global $zem_ir_set;

		$group = (empty($atts['group']) ? 'default' : $atts['group']);

		$orig = (isset($zem_ir_set[$group]) ? $zem_ir_set[$group] : array());
		$zem_ir_set[$group] = array_merge($orig, $atts);

		return '';
	}

	function zem_ir_get_atts($atts) {
		global $pfr, $txpcfg, $img_dir;

		$group = (empty($atts['group']) ? 'default' : $atts['group']);
		$wraptag = (empty($atts["wraptag"]) ? "h1" : $atts["wraptag"]);
		$position = (empty($atts["position"]) ? "top left" : $atts["position"]);
		$limit = (empty($atts["limit"]) ? 0 : $atts["limit"]);
		$class = (empty($atts["class"]) ? "" : $atts["class"]);
		$font = (empty($atts["font"]) ? "" : $atts["font"]);
		$font_dir = (empty($atts["fontdir"]) ? dirname($txpcfg["doc_root"]) : $atts["fontdir"]);
		$font_size = (empty($atts["fontsize"]) ? 24 : (int)$atts["fontsize"]);
		$angle = (empty($atts["angle"]) ? 0 : $atts["angle"]);
		$color = (empty($atts["color"]) ? "#000000" : $atts["color"]);
		$backgroundcolor = (empty($atts["backgroundcolor"]) ? "#ffffff" : $atts["backgroundcolor"]);
		$cachedir = (empty($atts["cachedir"]) ? "$img_dir/zir" : $atts["cachedir"]);
		$ft = (isset($atts["ft"]) ? $atts["ft"] : 0);
		$aa = (isset($atts["aa"]) ? $atts["aa"] : 1);
		$info = (isset($atts["info"]) ? $atts["info"] : 0);
		$trans = (isset($atts["trans"]) ? $atts["trans"] : 1);
		$cache = (isset($atts["cache"]) ? $atts["cache"] : 1);
		$depth = (empty($atts["depth"]) ? 8 : $atts["depth"]);
		$method = (empty($atts["method"]) ? "phark" : $atts["method"]);
		$align = (empty($atts["align"]) ? "left" : $atts["align"]);
		$padding = (empty($atts["padding"]) ? "0" : $atts["padding"]);
		$text = (empty($atts['text']) ? '' : $atts['text']);
		$wrap = (empty($atts['wrap']) ? 0 : $atts['wrap']);
		$tr = (empty($atts['tr']) ? '' : $atts['tr']);
		$tt = (empty($atts['tt']) ? ' ' : $atts['tt']);
		$charset = (empty($atts['charset']) ? 'ISO-8859-15' : $atts['charset']);
		$transform = (empty($atts['transform']) ? '' : $atts['transform']);

		$pad = preg_split('/\s+/', trim($padding));
		if (count($pad) != 4)
			$pad = array_fill(0, 4, $pad[0]);

		if (substr($font_dir, -1, 1) != DIRECTORY_SEPARATOR) $font_dir .= DIRECTORY_SEPARATOR;
		$font_file = $font_dir . $font;
		$cache_folder = $txpcfg["doc_root"].$pfr.$cachedir;

		return compact('wraptag', 'position', 'limit', 'class', 'font', 'font_dir', 'font_size', 'angle', 'color', 'backgroundcolor', 'cachedir', 'ft', 'aa', 'info', 'trans', 'cache', 'depth', 'method', 'align', 'padding', 'text', 'wrap', 'tr', 'charset', 'transform', 'pad', 'font_file', 'cache_folder');

	}

	function zem_image_replace($atts, $thing) {
		return zem_ir($atts, $thing);
	}

	function zem_ir($atts, $thing=NULL) {
		global $pfr, $zem_ir_set, $txpcfg;

		# Merge any settings configured by zem_ir_set with the attributes for this tag
		$group = (empty($atts['group']) ? 'default' : $atts['group']);
		$defaults = (isset($zem_ir_set[$group]) ? $zem_ir_set[$group] : array());
		$settings = zem_ir_get_atts(array_merge($defaults, $atts));

		extract($settings);
		$content = $text;

		if ($thing) {
			$content = parse($thing);
			$text = trim(html_entity_decode(strip_tags($content), ENT_NOQUOTES, $charset));
			if ($limit)
				$text = substr($text, 0, $limit);
		}

		if ($tr) {
			$tr = html_entity_decode($tr, ENT_NOQUOTES, $charset);
			$tt = substr(html_entity_decode($tt, ENT_NOQUOTES, $charset), 0, 1);
			$text = strtr($text, $tr, str_repeat($tt, strlen($tr)));
		}

		if ($transform == 'capitalize')
			$text = ucwords($text);
		elseif ($transform == 'lowercase')
			$text = strtolower($text);
		elseif ($transform == 'uppercase')
			$text = strtoupper($text);

		if ($info) {
			ob_start();
			echo "<pre>";
			var_dump(compact("text", "font_file", "font_size", "angle", "color", "backgroundcolor", "cache_folder", "aa", "trans", "depth", "ft", "cache", "method", "align", "pad"));
			echo "doc_root setting ".$txpcfg['doc_root']." ". ($txpcfg['doc_root'] == $_SERVER['DOCUMENT_ROOT'] ? "does" : "<b>does not</b>"). " match the server setting '".$_SERVER['DOCUMENT_ROOT']."'\n";
			echo "cache folder $cache_folder " . (is_dir($cache_folder) ? "is" : "is <b>not</b>") . " a directory\n";
			echo "cache folder $cache_folder " . (is_writable($cache_folder) ? "is" : "is <b>not</b>") . " writable\n";
			echo "font file $font_file " . (is_file($font_file) ? "is" : "is <b>not</b>") . " a file\n";
			echo "font file $font_file " . (is_readable($font_file) ? "is" : "is <b>not</b>") . " readable\n";
			echo "freetype 2 " . (is_callable("imagefttext") ? "is" : "is <b>not</b>") . " supported\n";
			echo "freetype 1 " . (is_callable("imagettfbbox") ? "is" : "is <b>not</b>") . " supported\n";
			echo "</pre>";
			return ob_get_clean();
		}

		// Skip the image routines if there's no text to display
		if (!trim($text))
			return tag($wraptag, $content);


		$old_umask = umask(0000);
		$result = dynamic_image($text, $settings);
		umask($old_umask);
		if ($result[0]) {
			return $result[1];
		}

		list($error, $data, $w, $h) = $result;
		$url = $pfr . $cachedir . "/" . $data;
		$height = (empty($atts["height"]) ? $h : $atts["height"]);
		$width = (empty($atts["width"]) ? $w : $atts["width"]);
		$title = " title=\"{$text}\"";

		if ($class) {
			$style = " style=\"background: url($url) no-repeat {$position};\"";
			$class = " class=\"$class\"";
		}
		elseif ($method == "radu") {
			$style = " style=\"margin: 0 0 0 -5000px; background: url($url) no-repeat top right; height: {$height}px;\"";
		}
		elseif ($method == "lir") {
			$style = " style=\"padding: {$height}px 0 0 0; overflow: hidden; background: url($url) no-repeat {$position}; height: 0px !important; height /**/: {$height}px;\"";
		}
		elseif ($method == "dwyer") {
			$style = " style=\"background: url($url) no-repeat {$position}; height: {$height}px; width: {$width}px;\"";
			$spanstyle = " style=\"display: block; width: 0; height: 0; overflow: hidden;\"";
			$content = tag($content, "span", $spanstyle);
		}
		elseif ($method == "img") {
			$wraptag = "img";
			$style = " src=\"{$url}\" alt=\"{$text}\"";
		}
		else {
			// Default: Phark Revisited
			$style = " style=\"text-indent: -5000px; background: url($url) no-repeat {$position}; height: {$height}px;\"";
		}


		return tag($content, $wraptag, $class.$style.$title);

	}

# The following code is taken from Stewart Rosenberger's header.php, with modifications to allow text rotation and FT support
# http://www.stewartspeak.com/headings/

function dynamic_image($content, $settings) {

extract($settings);
$text = $content;

$transparent_background  = $trans ;

$mime_type = "image/png" ;
$extension = ".png" ;
$send_buffer_size = 4096 ;

// check for GD support
if(!function_exists("ImageCreate"))
    return array(1, "Error: Server does not support PHP image generation");

// look for cached copy, send if it exists
$hash = md5(join('-', array(basename($font_file), $font_size , $color , $angle , $aa, $ft , $depth , $backgroundcolor , $trans, $padding , $wrap, $text)));
$cache_filename = $cache_folder . DIRECTORY_SEPARATOR . $hash . $extension ;
if($cache && is_readable($cache_filename))
{
	list($w, $h) = getimagesize($cache_filename);
	return array(0, $hash.$extension, $w, $h);
}

// check font availability
$font_found = is_readable($font_file) ;
if(!$font_found)
{
    return array(1, "Error: The server is missing the specified font '$font_file'.") ;
}

// create cache dir if necessary
if (!is_dir($cache_folder)) {
	mkdir($cache_folder, 0777);
	if (!is_dir($cache_folder)) {
		return array(1, "Error: unable to create cache folder '$cache_folder'.") ;
	}
}

if (!is_writable($cache_folder)) {
		return array(1, "Error: unable to write to cache folder '$cache_folder'.") ;
}

// create image
$background_rgb = hex_to_rgb($backgroundcolor) ;
$font_rgb = hex_to_rgb($color) ;

if ($ft and is_callable('imageftbbox'))
	$boxfn = 'imageftbbox';
else
	$boxfn = 'imagettfbbox';

if ($wrap) {
	# Word wrapping is measured in characters, not pixels.  We have to guess the number of characters
	# that will fit in the specified pixel width, then gradually reduce our guess until the text fits.
	$wrapstart = max($wrap/4, 80);
	for ($i = $wrapstart; $i >= 6; $i--) {
		$box = @$boxfn($font_size, 0, $font_file, wordwrap($text, $i, "\n", 1));
		$wrap_w = max($box[0], $box[2], $box[4], $box[6]) - min($box[0], $box[2], $box[4], $box[6]);
		if ($wrap_w <= $wrap) {
			$text = wordwrap($text, $i, "\n", 1);
			break;
		}
	}
}
else {
		$box = @$boxfn($font_size,0,$font_file,$text) ;
}

@list($w, $h, $base_x, $base_y) = imagerotatedbbox($box, $angle, $pad);

if (isset($w, $h, $base_x, $base_y)) {
	if ($depth == 24 and is_callable("imagecreatetruecolor"))
		$image = @ImageCreateTrueColor($w, $h);
	else
		$image = @ImageCreate($w,$h) ;
}
if(!$image || !$box)
{
    return array(1, "Error: The server could not create this heading image.") ;
}

// allocate colors and draw text
$background_color = ImageColorAllocate($image,$background_rgb["red"],
    $background_rgb["green"],$background_rgb["blue"]) ;
$font_color = ImageColorAllocate($image,$font_rgb["red"],
    $font_rgb["green"],$font_rgb["blue"]) ;
// have to explicitly draw the background color for 24-bit
imageFilledRectangle($image, 0, 0, $w, $h, $background_color);
if ($ft and is_callable("imagefttext")) {
	if (!$aa)
		$font_color = -$font_color;
	imagefttext($image, $font_size, $angle, $base_x, $base_y,
    $font_color, $font_file, $text) ;
}
else {
	ImageTTFText($image, $font_size, $angle, $base_x, $base_y,
    $font_color, $font_file, $text) ;
}

// set transparency
if($transparent_background)
    ImageColorTransparent($image,$background_color) ;

// save copy of image for cache
 ImagePNG($image,$cache_filename) ;

ImageDestroy($image) ;

return array(0, $hash.$extension, $w, $h);
}


/*
    decode an HTML hex-code into an array of R,G, and B values.
    accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff
*/
function hex_to_rgb($hex)
{
    // remove "#"
    if(substr($hex,0,1) == "#")
        $hex = substr($hex,1) ;

    // expand short form ("fff") color
    if(strlen($hex) == 3)
    {
        $hex = substr($hex,0,1) . substr($hex,0,1) .
               substr($hex,1,1) . substr($hex,1,1) .
               substr($hex,2,1) . substr($hex,2,1) ;
    }

    if(strlen($hex) != 6)
        print("Error: Invalid color \"$hex\"") ;

    // convert
    $rgb["red"] = hexdec(substr($hex,0,2)) ;
    $rgb["green"] = hexdec(substr($hex,2,2)) ;
    $rgb["blue"] = hexdec(substr($hex,4,2)) ;

    return $rgb ;
}

// Determine the text bounding box after rotation is applied
function imagerotatedbbox($bbox, $angle=0, $pad=0) {

	if (count($bbox) != 8)
		return;

	if (empty($pad))
		$pad = array(0,0,0,0);

	$a = $angle * M_PI / 180;

	$cosa = cos($a);
	$sina = sin($a);
	$result = array();

	# baseline and total width/height of text when horizontal
	$base_x = abs($bbox[6]);
	$base_y = abs($bbox[7]);
	$old_w = max($bbox[0], $bbox[2], $bbox[4], $bbox[6]) - min($bbox[0], $bbox[2], $bbox[4], $bbox[6]);
	$old_h = max($bbox[1], $bbox[3], $bbox[5], $bbox[7]) - min($bbox[1], $bbox[3], $bbox[5], $bbox[7]);

	// rotate the box coordinates to get the new width & height of the final image
	for ($i = 0; $i < 7; $i += 2) {
		$result[$i] = round($bbox[$i] * $cosa + $bbox[$i+1] * $sina);
		$result[$i+1] = round($bbox[$i+1] * $cosa - $bbox[$i] * $sina);
	}
	$w = max($result[0], $result[2], $result[4], $result[6]) - min($result[0], $result[2], $result[4], $result[6]);
	$h = max($result[1], $result[3], $result[5], $result[7]) - min($result[1], $result[3], $result[5], $result[7]);

	$pad_w = $w + ($pad[3] + $pad[1]);
	$pad_h = $h + ($pad[0] + $pad[2]);

	// center of bounding box (xc,yc);
	$xc = $old_w/2.0;
	$yc = $old_h/2.0;
	// center of image
	$px = $w/2.0;
	$py = $h/2.0;
	// baseline coordinates relative to the center
	$x1 = $base_x - $xc;
	$y1 = $base_y - $yc;
	// baseline after rotation
	$x2= intval( $x1*$cosa+$y1*$sina+$px+0.5);
	$y2= intval(-$x1*$sina+$y1*$cosa+$py+0.5);

	return array($pad_w, $pad_h, $x2 + $pad[3], $y2 + $pad[0]);
}
";s:3:"md5";s:32:"2505f1cc0cbf7f11da9041f97db63e00";}