-
Notifications
You must be signed in to change notification settings - Fork 0
/
topi.lib.min
1 lines (1 loc) · 22.1 KB
/
topi.lib.min
1
<?php namespace TopiLib; if( !function_exists('gd_info') ) { throw new Exception('Oops, required GD library is missing!'); } class TopiPanel { private $image; private $imageMode = 'blank'; private $width; private $height; public $bgRedClr = 255; public $bgGreenClr = 255; public $bgBlueClr = 255; public $txtRMagicMagnet = false; public $txtBMagicMagnet = false; public $txtLMagicMagnet = false; public $txtTMagicMagnet = false; public $txtRMagicMagnetTol = 0; public $txtBMagicMagnetTol = 0; public $txtLMagicMagnetTol = 0; public $txtTMagicMagnetTol = 0; public $imgRMagicMagnet = false; public $imgBMagicMagnet = false; public $imgLMagicMagnet = false; public $imgTMagicMagnet = false; public $imgRMagicMagnetTol = 0; public $imgBMagicMagnetTol = 0; public $imgLMagicMagnetTol = 0; public $imgTMagicMagnetTol = 0; public $type = 'png'; public $quality = 9; private $textObjects = array(); private $imageObjects = array(); public function __construct($type = 'png', $quality = 9, $bgRedClr = 255, $bgGreenClr = 255, $bgBlueClr = 255) { $this->type = $type; $this->quality = $quality; $this->bgRedClr = $bgRedClr; $this->bgGreenClr = $bgGreenClr; $this->bgBlueClr = $bgBlueClr; } private function hex2rgb($hex_color, $return_string = false, $separator = ',') { $hex_color = preg_replace("/[^0-9A-Fa-f]/", '', $hex_color); $rgb_array = array(); if( strlen($hex_color) == 6 ) { $color_val = hexdec($hex_color); $rgb_array['r'] = 0xFF & ($color_val >> 0x10); $rgb_array['g'] = 0xFF & ($color_val >> 0x8); $rgb_array['b'] = 0xFF & $color_val; } elseif( strlen($hex_color) == 3 ) { $rgb_array['r'] = hexdec(str_repeat(substr($hex_color, 0, 1), 2)); $rgb_array['g'] = hexdec(str_repeat(substr($hex_color, 1, 1), 2)); $rgb_array['b'] = hexdec(str_repeat(substr($hex_color, 2, 1), 2)); } else { return false; } return $return_string ? implode($separator, $rgb_array) : $rgb_array; } public function setbgHexColor($hex_color){ if( $color = $this->hex2rgb($hex_color) ){ $this->bgRedClr = $color['r']; $this->bgGreenClr = $color['g']; $this->bgBlueClr = $color['b']; return true; }else{ return false; } } public function createBlank($width = 100, $height = 100) { $t = imagecreate($width, $height); imagecolorallocate($t, $this->bgRedClr, $this->bgGreenClr, $this->bgBlueClr); $this->image = imagecreatetruecolor($width, $height); imagecopy($this->image, $t, 0, 0, 0, 0, $width, $height); $this->width = $width; $this->height = $height; } public function createFromJPEG($sourceImage) { if(file_exists($sourceImage)) { $this->imageMode = 'image'; $this->image = imagecreatefromjpeg($sourceImage); $this->width = imagesx($this->image); $this->height = imagesy($this->image); }else { throw new \Exception('JPEG Image is not exist'); } } public function createFromPNG($sourceImage, $isTransparent = false) { if(file_exists($sourceImage)) { if($isTransparent) { $this->imageMode = 'transparent image'; }else { $this->imageMode = 'image'; } $this->image = imagecreatefrompng($sourceImage); $this->width = imagesx($this->image); $this->height = imagesy($this->image); }else { throw new \Exception('PNG Image is not exist'); } } public function crop($startX = 0, $startY = 0, $width = 100, $height = 100) { $crop['src_x'] = $startX; $crop['src_y'] = $startY; $crop['src_w'] = $width; $crop['src_h'] = $height; switch($this->imageMode){ case 'blank': $tempImg = imagecreatetruecolor($crop['src_w'], $crop['src_h']); break; case 'image': $tempImg = imagecreatetruecolor($crop['src_w'], $crop['src_h']); break; case 'transparent image': $tempImg = imagecreate($crop['src_w'], $crop['src_h']); imagesavealpha($tempImg, true); if($this->type == 'png transparent') { $color = imagecolorallocatealpha($tempImg, 255, 255, 255, 127); imagefill($tempImg, 0, 0, $color); } break; } imagecopy($tempImg, $this->image, 0, 0, $crop['src_x'], $crop['src_y'], $crop['src_w'], $crop['src_h']); $this->image = $tempImg; } private function cropImage($imgInfo, $txtInfo) { if($this->txtRMagicMagnet === true || $this->txtBMagicMagnet === true || $this->txtLMagicMagnet === true || $this->txtTMagicMagnet === true || $this->imgRMagicMagnet === true || $this->imgBMagicMagnet === true || $this->imgLMagicMagnet === true || $this->imgTMagicMagnet === true) { $iTxtRMTol = $this->txtRMagicMagnetTol; $iTxtBMTol = $this->txtBMagicMagnetTol; $iTxtLMTol = $this->txtLMagicMagnetTol; $iTxtTMTol = $this->txtTMagicMagnetTol; $iImgRMTol = $this->imgRMagicMagnetTol; $iImgBMTol = $this->imgBMagicMagnetTol; $iImgLMTol = $this->imgLMagicMagnetTol; $iImgTMTol = $this->imgTMagicMagnetTol; $crop['src_x'] = 0; $crop['src_y'] = 0; $crop['src_w'] = $this->getWidth(); $crop['src_h'] = $this->getHeight(); if($this->imgRMagicMagnet === true) { $t = max($imgInfo['x1'], $imgInfo['x2']); $t = max($t); if($t < $this->getWidth()){ $crop['src_w'] = $t + $iImgRMTol; } }else if($this->txtRMagicMagnet === true) { $t = max($txtInfo['rtx'], $txtInfo['ltx'], $txtInfo['rbx'], $txtInfo['lbx']); $t = max($t); if($t < $this->getWidth()){ $crop['src_w'] = $t + $iTxtRMTol; } } if($this->imgBMagicMagnet === true) { $t = max($imgInfo['y1'], $imgInfo['y2']); $t = max($t); if($t < $this->getHeight()){ $crop['src_h'] = $t + $iImgBMTol; } }else if($this->txtBMagicMagnet === true) { $t = max($txtInfo['rty'], $txtInfo['lty'], $txtInfo['rby'], $txtInfo['lby']); $t = max($t); if($t < $this->getHeight()){ $crop['src_h'] = $t + $iTxtBMTol; } } if($this->imgLMagicMagnet === true) { $t = min($imgInfo['x1'], $imgInfo['x2']); $t = min($t); if($t >= 0){ $crop['src_x'] = $t - $iImgLMTol; $crop['src_w'] -= $crop['src_x']; } }else if($this->txtLMagicMagnet === true) { $t = min($txtInfo['rtx'], $txtInfo['ltx'], $txtInfo['rbx'], $txtInfo['lbx']); $t = min($t); if($t >= 0){ $crop['src_x'] = $t - $iTxtLMTol; $crop['src_w'] -= $crop['src_x']; } } if($this->imgTMagicMagnet === true) { $t = min($imgInfo['y1'], $imgInfo['y2']); $t = min($t); if($t >= 0){ $crop['src_y'] = $t - $iImgTMTol; $crop['src_h'] -= $crop['src_y']; } }else if($this->txtTMagicMagnet === true) { $t = min($txtInfo['rty'], $txtInfo['lty'], $txtInfo['rby'], $txtInfo['lby']); $t = min($t); if($t >= 0){ $crop['src_y'] = $t - $iTxtTMTol; $crop['src_h'] -= $crop['src_y']; } } switch($this->imageMode){ case 'blank': $tempImg = imagecreatetruecolor($crop['src_w'], $crop['src_h']); break; case 'image': $tempImg = imagecreatetruecolor($crop['src_w'], $crop['src_h']); break; case 'transparent image': $tempImg = imagecreate($crop['src_w'], $crop['src_h']); imagesavealpha($tempImg, true); if($this->type == 'png transparent') { $color = imagecolorallocatealpha($tempImg, 255, 255, 255, 127); imagefill($tempImg, 0, 0, $color); } break; } imagecopy($tempImg, $this->image, 0, 0, $crop['src_x'], $crop['src_y'], $crop['src_w'], $crop['src_h']); $this->image = $tempImg; } } public function renderToImage($outputImagePath, $replaceIfExist = true) { if ($replaceIfExist === true || (!file_exists($outputImagePath) && $replaceIfExist === false)) { if($this->type == 'png transparent' && $this->imageMode == 'blank') { imagesavealpha($this->image, true); $color = imagecolorallocatealpha($this->image, $this->bgRedClr, $this->bgGreenClr, $this->bgBlueClr, 127); imagefill($this->image, 0, 0, $color); }else if($this->type == 'png transparent') { imagesavealpha($this->image, true); } $r1 =$this->drawImage(); $r2 = $this->drawText(); $this->cropImage($r1, $r2); if($this->type == 'png' || $this->type == 'png transparent') { if($this->quality >=0 && $this->quality<=9) { imagepng($this->image, $outputImagePath, $this->quality); }else { throw new \Exception('Quality must be 0 through 9'); } }else if($this->type == 'jpeg') { if($this->quality >=0 && $this->quality<=100) { imagejpeg($this->image, $outputImagePath, $this->quality); }else { throw new \Exception('Quality must be 0 through 100'); } }else { throw new \Exception('Type must be "jpeg", "png" OR "png transparent"'); } } } public function render() { if($this->type == 'png transparent' && $this->imageMode == 'blank') { imagesavealpha($this->image, true); $color = imagecolorallocatealpha($this->image, $this->bgRedClr, $this->bgGreenClr, $this->bgBlueClr, 127); imagefill($this->image, 0, 0, $color); }else if($this->type == 'png transparent') { imagesavealpha($this->image, true); } $r1 =$this->drawImage(); $r2 = $this->drawText(); $this->cropImage($r1, $r2); if($this->type == 'png' || $this->type == 'png transparent') { if($this->quality >=0 && $this->quality<=9) { header ('Content-type: image/png'); imagepng($this->image, null, $this->quality); }else { throw new \Exception('Quality must be 0 through 9'); } }else if($this->type == 'jpeg') { if($this->quality >=0 && $this->quality<=100) { header ('Content-type: image/jpeg'); imagejpeg($this->image, null, $this->quality); }else { throw new \Exception('Quality must be 0 through 100'); } }else { throw new \Exception('Type must be "jpeg", "png" OR "png transparent"'); } } private function drawText() { if($this->txtRMagicMagnet === true || $this->txtBMagicMagnet === true || $this->txtLMagicMagnet === true || $this->txtTMagicMagnet === true) { $dimensionsLBX = array(); $dimensionsLBY = array(); $dimensionsRBX = array(); $dimensionsRBY = array(); $dimensionsRTX = array(); $dimensionsRTY = array(); $dimensionsLTX = array(); $dimensionsLTY = array(); foreach ($this->textObjects as $text) { $r = $text->renderToImage($this, true); if($text->magicMagnet === true){ foreach($r['lbx'] as $lbx) { array_push($dimensionsLBX, $lbx); } foreach($r['lby'] as $lby) { array_push($dimensionsLBY, $lby); } foreach($r['rbx'] as $rbx) { array_push($dimensionsRBX, $rbx); } foreach($r['rby'] as $rby) { array_push($dimensionsRBY, $rby); } foreach($r['rtx'] as $rtx) { array_push($dimensionsRTX, $rtx); } foreach($r['rty'] as $rty) { array_push($dimensionsRTY, $rty); } foreach($r['ltx'] as $ltx) { array_push($dimensionsLTX, $ltx); } foreach($r['lty'] as $lty) { array_push($dimensionsLTY, $lty); } } } $result['lbx'] = $dimensionsLBX; $result['lby'] = $dimensionsLBY; $result['rbx'] = $dimensionsRBX; $result['rby'] = $dimensionsRBY; $result['rtx'] = $dimensionsRTX; $result['rty'] = $dimensionsRTY; $result['ltx'] = $dimensionsLTX; $result['lty'] = $dimensionsLTY; return $result; }else{ foreach ($this->textObjects as $text) { $r = $text->renderToImage($this, false); } } } private function drawImage() { if($this->imgRMagicMagnet === true || $this->imgBMagicMagnet === true || $this->imgLMagicMagnet === true || $this->imgTMagicMagnet === true) { $dimensionsX1 = array(); $dimensionsY1 = array(); $dimensionsX2 = array(); $dimensionsY2 = array(); foreach ($this->imageObjects as $image) { $r = $image->renderToImage($this); if($image->magicMagnet === true){ array_push($dimensionsX1, $r['x']); array_push($dimensionsY1, $r['y']); array_push($dimensionsX2, $r['x'] + $r['wid']); array_push($dimensionsY2, $r['y'] + $r['hei']); } } $result['x1'] = $dimensionsX1; $result['y1'] = $dimensionsY1; $result['x2'] = $dimensionsX2; $result['y2'] = $dimensionsY2; return $result; }else{ foreach ($this->imageObjects as $image) { $image->renderToImage($this); } } } public function addText(\TopiLib\TopiText $text) { $this->textObjects[] = $text; } public function addImage(\TopiLib\TopiImage $image) { $this->imageObjects[] = $image; } public function getWidth() { return $this->width; } public function getHeight() { return $this->height; } public function getImage() { return $this->image; } } class TopiText { public $text = 'Topi Lib by Hadi Abdi Khojasteh :)'; public $magicMagnet = true; public $width = 80; public $startX = 0; public $startY = 0; public $align = 'left'; public $txtRedClr = 0; public $txtGreenClr = 0; public $txtBlueClr = 0; public $font; public $lineHeight = 24; public $size = 16; public $rotation = 0; private $lines; public function __construct($font, $text = 'Topi Lib by Hadi Abdi Khojasteh :)', $numLines = 1, $width = 80, $size = 16, $lineHeight = 24) { if(file_exists($font)){ $this->font = $font; $this->text = $text; $this->width = $width; $this->size = $size; $this->lineHeight = $lineHeight; $this->addLines($numLines); }else { throw new \Exception('Font is not exist'); } } private function hex2rgb($hex_color, $return_string = false, $separator = ',') { $hex_color = preg_replace("/[^0-9A-Fa-f]/", '', $hex_color); $rgb_array = array(); if( strlen($hex_color) == 6 ) { $color_val = hexdec($hex_color); $rgb_array['r'] = 0xFF & ($color_val >> 0x10); $rgb_array['g'] = 0xFF & ($color_val >> 0x8); $rgb_array['b'] = 0xFF & $color_val; } elseif( strlen($hex_color) == 3 ) { $rgb_array['r'] = hexdec(str_repeat(substr($hex_color, 0, 1), 2)); $rgb_array['g'] = hexdec(str_repeat(substr($hex_color, 1, 1), 2)); $rgb_array['b'] = hexdec(str_repeat(substr($hex_color, 2, 1), 2)); } else { return false; } return $return_string ? implode($separator, $rgb_array) : $rgb_array; } public function settxtHexColor($hex_color){ if( $color = $this->hex2rgb($hex_color) ){ $this->txtRedClr = $color['r']; $this->txtGreenClr = $color['g']; $this->txtBlueClr = $color['b']; return true; }else{ return false; } } private function addLines($numLines = 1) { for ($i = 0; $i < $numLines; $i++) { $this->lines[] = array( 'chars' => 0, 'words' => array(), 'full' => false ); } } public function renderToImage(\TopiLib\TopiPanel $panel, $isMMCheck) { $this->distributeText(); $maxWidthString = implode('', array_fill(0, $this->width, 'x')); $maxWidthBoundingBox = imagettfbbox($this->size, 0, $this->font, $maxWidthString); $maxLineWidth = abs($maxWidthBoundingBox[0] - $maxWidthBoundingBox[2]); for ($j = 0; $j < count($this->lines); $j++) { $line =& $this->lines[$j]; if (empty($line['words'])) { unset($this->lines[$j]); continue; } $lineText = implode(' ', $line['words']); $lineBoundingBox = imagettfbbox($this->size, 0, $this->font, $lineText); $line['width'] = abs($lineBoundingBox[0] - $lineBoundingBox[2]); $line['text'] = $lineText; } for ($i = 0; $i < count($this->lines); $i++) { if (array_key_exists($i, $this->lines)) { $line =& $this->lines[$i]; $lineBoundingBox = imagettfbbox($this->size, $this->rotation, $this->font, $line['text']); $lineWidth = abs($lineBoundingBox[0] - $lineBoundingBox[2]); switch ($this->align) { case 'left': $offsetX = $this->startX; $offsetY = $this->startY + $this->lineHeight + ($this->lineHeight * $i); break; case 'center': $imageWidth = $panel->getWidth(); $offsetX = (($maxLineWidth - $lineWidth) / 2) + $this->startX; $offsetY = $this->startY + $this->lineHeight + ($this->lineHeight * $i); break; case 'right': $imageWidth = $panel->getWidth(); $offsetX = $imageWidth - $line['width'] - $this->startX; $offsetY = $this->startY + $this->lineHeight + ($this->lineHeight * $i); break; } $im = $panel->getImage(); $txtClr = imagecolorallocate($im, $this->txtRedClr, $this->txtGreenClr, $this->txtBlueClr); imagettftext($im, $this->size, $this->rotation, $offsetX, $offsetY, $txtClr, $this->font, $line['text']); if($isMMCheck === true && $this->magicMagnet === true) { $b = $this->imagettfbbox_t($this->size, $this->rotation, $this->font, $line['text'].' '); $result['lbx'][$i] = $offsetX + $b[0]; $result['lby'][$i] = $offsetY + $b[1]; $result['rbx'][$i] = $offsetX + $b[2]; $result['rby'][$i] = $offsetY + $b[3]; $result['rtx'][$i] = $offsetX + $b[4]; $result['rty'][$i] = $offsetY + $b[5]; $result['ltx'][$i] = $offsetX + $b[6]; $result['lty'][$i] = $offsetY + $b[7]; } } } if($isMMCheck === true && $this->magicMagnet === true) { return $result; } } private function distributeText() { $words = explode(' ', $this->text); while ($words) { $tooLong = true; $word = array_shift($words); for ($i = 0; $i < count($this->lines); $i++) { $line =& $this->lines[$i]; if ($line['full'] === false) { $charsPotential = strlen($word) + $line['chars']; if ($charsPotential <= $this->width) { array_push($line['words'], $word); $line['chars'] = $charsPotential; $tooLong = false; break; } else { $line['full'] = true; } } } } if ($tooLong === true) { throw new \Exception('Text is too long'); } } private function imagettfbbox_t($size, $angle, $fontfile, $text) { $coords = imagettfbbox($size, 0, $fontfile, $text); $a = deg2rad($angle); $ca = cos($a); $sa = sin($a); $ret = array(); for($i = 0; $i < 7; $i += 2){ $ret[$i] = round($coords[$i] * $ca + $coords[$i+1] * $sa); $ret[$i+1] = round($coords[$i+1] * $ca - $coords[$i] * $sa); } return $ret; } } class TopiImage { private $image; public $type = 'png'; private $width; private $height; public $magicMagnet = true; public $startX = 0; public $startY = 0; public $position = 'free'; public function __construct($sourceImage, $type = 'png', $position = 'free') { if(file_exists($sourceImage)) { $this->type = $type; $this->position = $position; if($type == 'png' || $type == 'png transparent') { $this->image = imagecreatefrompng($sourceImage); }else if($type == 'jpeg') { $this->image = imagecreatefromjpeg($sourceImage); }else { throw new \Exception('Type must be "jpeg", "png" OR "png transparent"'); } $this->width = imagesx($this->image); $this->height = imagesy($this->image); }else { throw new \Exception('Image is not exist'); } } public function renderToImage(\TopiLib\TopiPanel $panel) { switch($this->position) { default: case 'free': $result['x'] = $this->startX; $result['y'] = $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'fill': $w = abs($panel->getWidth() - $this->width); $h = abs($panel->getHeight() - $this->height); if($w > $h) { $result['x'] = 0 + $this->startX; $result['y'] = 0 + $this->startY; $result['wid'] = $panel->getWidth()+$h; $result['hei'] = $panel->getHeight(); imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); }else { $result['x'] = 0 + $this->startX; $result['y'] = 0 + $this->startY; $result['wid'] = $panel->getWidth(); $result['hei'] = $panel->getHeight()+$w; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); } break; case 'fit': $w = abs($panel->getWidth() - $this->width); $h = abs($panel->getHeight() - $this->height); if($w > $h) { $result['x'] = ($panel->getWidth()-$w)/2 + $this->startX; $result['y'] = 0 + $this->startY; $result['wid'] = $w; $result['hei'] = $panel->getHeight(); imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); }else { $result['x'] = 0 + $this->startX; $result['y'] = ($panel->getHeight()-$h)/2 + $this->startY; $result['wid'] = $panel->getWidth(); $result['hei'] = $h; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); } break; case 'stretch': $result['x'] = 0 + $this->startX; $result['y'] = 0 + $this->startY; $result['wid'] = $panel->getWidth(); $result['hei'] = $panel->getHeight(); imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'tile': $w = abs($panel->getWidth() - $this->width); $h = abs($panel->getHeight() - $this->height); $lasti = $w/$this->width; $lastj = $h/$this->height; for ($i = 0; $i <= $lasti+1; $i++) { for ($j = 0; $j <= $lastj+1; $j++) { imagecopyresampled($panel->getImage(), $this->image, $i*$this->width, $j*$this->height, 0, 0, $this->width, $this->height, $this->width, $this->height); } } $result['x'] = 0; $result['y'] = 0; $result['wid'] = $panel->getWidth(); $result['hei'] = $panel->getHeight(); break; case 'center': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = $w/2 + $this->startX; $result['y'] = $h/2 + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'right': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = $w + $this->startX; $result['y'] = $h/2 + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'right-top': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = $w + $this->startX; $result['y'] = 0 + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'right-bottom': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = $w + $this->startX; $result['y'] = $h + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'left': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = 0 + $this->startX; $result['y'] = $h/2 + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'left-top': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = 0 + $this->startX; $result['y'] = 0 + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; case 'left-bottom': $w = $panel->getWidth() - $this->width; $h = $panel->getHeight() - $this->height; $result['x'] = 0 + $this->startX; $result['y'] = $h + $this->startY; $result['wid'] = $this->width; $result['hei'] = $this->height; imagecopyresampled($panel->getImage(), $this->image, $result['x'], $result['y'], 0, 0, $result['wid'], $result['hei'], $this->width, $this->height); break; } return $result; } public function getWidth() { return $this->width; } public function getHeight() { return $this->height; } } ?>