197 lines
6.1 KiB
PHP
197 lines
6.1 KiB
PHP
<?php
|
|
/**
|
|
*--------------------------------------------------------------------
|
|
*
|
|
* Enable to join 2 CINDrawing or 2 image object to make only one image.
|
|
* There are some options for alignment.
|
|
*
|
|
*--------------------------------------------------------------------
|
|
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
|
|
* @link http://www.codeitnow.in
|
|
* @package https://github.com/codeitnowin/barcode-generator
|
|
*/
|
|
namespace CodeItNow\BarcodeBundle\Generator;
|
|
|
|
class JoinDraw {
|
|
const ALIGN_RIGHT = 0;
|
|
const ALIGN_BOTTOM = 0;
|
|
const ALIGN_LEFT = 1;
|
|
const ALIGN_TOP = 1;
|
|
const ALIGN_CENTER = 2;
|
|
|
|
const POSITION_RIGHT = 0;
|
|
const POSITION_BOTTOM = 1;
|
|
const POSITION_LEFT = 2;
|
|
const POSITION_TOP = 3;
|
|
|
|
private $image1;
|
|
private $image2;
|
|
private $alignement;
|
|
private $position;
|
|
private $space;
|
|
private $im;
|
|
|
|
/**
|
|
* Construct the JoinDrawing Object.
|
|
* - $image1 and $image2 have to be CINDrawing object or image object.
|
|
* - $space is the space between the two graphics in pixel.
|
|
* - $position is the position of the $image2 depending the $image1.
|
|
* - $alignment is the alignment of the $image2 if this one is smaller than $image1;
|
|
* if $image2 is bigger than $image1, the $image1 will be positionned on the opposite side specified.
|
|
*
|
|
* @param mixed $image1
|
|
* @param mixed $image2
|
|
* @param CINColor $background
|
|
* @param int $space
|
|
* @param int $position
|
|
* @param int $alignment
|
|
*/
|
|
public function __construct($image1, $image2, $background, $space = 10, $position = self::POSITION_RIGHT, $alignment = self::ALIGN_TOP) {
|
|
if ($image1 instanceof CINDrawing) {
|
|
$this->image1 = $image1->get_im();
|
|
} else {
|
|
$this->image1 = $image1;
|
|
}
|
|
if ($image2 instanceof CINDrawing) {
|
|
$this->image2 = $image2->get_im();
|
|
} else {
|
|
$this->image2 = $image2;
|
|
}
|
|
|
|
$this->background = $background;
|
|
$this->space = (int)$space;
|
|
$this->position = (int)$position;
|
|
$this->alignment = (int)$alignment;
|
|
|
|
$this->createIm();
|
|
}
|
|
|
|
/**
|
|
* Destroys the image.
|
|
*/
|
|
public function __destruct() {
|
|
imagedestroy($this->im);
|
|
}
|
|
|
|
/**
|
|
* Finds the position where the barcode should be aligned.
|
|
*
|
|
* @param int $size1
|
|
* @param int $size2
|
|
* @param int $ailgnment
|
|
* @return int
|
|
*/
|
|
private function findPosition($size1, $size2, $alignment) {
|
|
$rsize1 = max($size1, $size2);
|
|
$rsize2 = min($size1, $size2);
|
|
|
|
if ($alignment === self::ALIGN_LEFT) { // Or TOP
|
|
return 0;
|
|
} elseif ($alignment === self::ALIGN_CENTER) {
|
|
return $rsize1 / 2 - $rsize2 / 2;
|
|
} else { // RIGHT or TOP
|
|
return $rsize1 - $rsize2;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change the alignments.
|
|
*
|
|
* @param int $alignment
|
|
* @return int
|
|
*/
|
|
private function changeAlignment($alignment) {
|
|
if ($alignment === 0) {
|
|
return 1;
|
|
} elseif ($alignment === 1) {
|
|
return 0;
|
|
} else {
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Creates the image.
|
|
*/
|
|
private function createIm() {
|
|
$w1 = imagesx($this->image1);
|
|
$w2 = imagesx($this->image2);
|
|
$h1 = imagesy($this->image1);
|
|
$h2 = imagesy($this->image2);
|
|
|
|
if ($this->position === self::POSITION_LEFT || $this->position === self::POSITION_RIGHT) {
|
|
$w = $w1 + $w2 + $this->space;
|
|
$h = max($h1, $h2);
|
|
} else {
|
|
$w = max($w1, $w2);
|
|
$h = $h1 + $h2 + $this->space;
|
|
}
|
|
|
|
$this->im = imagecreatetruecolor($w, $h);
|
|
imagefill($this->im, 0, 0, $this->background->allocate($this->im));
|
|
|
|
// We start defining position of images
|
|
if ($this->position === self::POSITION_TOP) {
|
|
if ($w1 > $w2) {
|
|
$posX1 = 0;
|
|
$posX2 = $this->findPosition($w1, $w2, $this->alignment);
|
|
} else {
|
|
$a = $this->changeAlignment($this->alignment);
|
|
$posX1 = $this->findPosition($w1, $w2, $a);
|
|
$posX2 = 0;
|
|
}
|
|
|
|
$posY2 = 0;
|
|
$posY1 = $h2 + $this->space;
|
|
} elseif ($this->position === self::POSITION_LEFT) {
|
|
if ($w1 > $w2) {
|
|
$posY1 = 0;
|
|
$posY2 = $this->findPosition($h1, $h2, $this->alignment);
|
|
} else {
|
|
$a = $this->changeAlignment($this->alignment);
|
|
$posY2 = 0;
|
|
$posY1 = $this->findPosition($h1, $h2, $a);
|
|
}
|
|
|
|
$posX2 = 0;
|
|
$posX1 = $w2 + $this->space;
|
|
} elseif ($this->position === self::POSITION_BOTTOM) {
|
|
if ($w1 > $w2) {
|
|
$posX2 = $this->findPosition($w1, $w2, $this->alignment);
|
|
$posX1 = 0;
|
|
} else {
|
|
$a = $this->changeAlignment($this->alignment);
|
|
$posX2 = 0;
|
|
$posX1 = $this->findPosition($w1, $w2, $a);
|
|
}
|
|
|
|
$posY1 = 0;
|
|
$posY2 = $h1 + $this->space;
|
|
} else { // defaults to RIGHT
|
|
if ($w1 > $w2) {
|
|
$posY2 = $this->findPosition($h1, $h2, $this->alignment);
|
|
$posY1 = 0;
|
|
} else {
|
|
$a = $this->changeAlignment($this->alignment);
|
|
$posY2 = 0;
|
|
$posY1 = $this->findPosition($h1, $h2, $a);
|
|
}
|
|
|
|
$posX1 = 0;
|
|
$posX2 = $w1 + $this->space;
|
|
}
|
|
|
|
imagecopy($this->im, $this->image1, $posX1, $posY1, 0, 0, $w1, $h1);
|
|
imagecopy($this->im, $this->image2, $posX2, $posY2, 0, 0, $w2, $h2);
|
|
}
|
|
|
|
/**
|
|
* Returns the new $im created.
|
|
*
|
|
* @return resource
|
|
*/
|
|
public function get_im() {
|
|
return $this->im;
|
|
}
|
|
}
|
|
?>
|