1
0
Fork 0
forked from miraty/libreqr

Use composer and change QR code generation library

This commit is contained in:
Miraty 2022-05-30 17:50:46 +02:00
parent 6832804dc0
commit 147a25c93f
564 changed files with 15838 additions and 34258 deletions

7
.gitignore vendored
View file

@ -1,3 +1,4 @@
.directory
css/*
!css/.gitkeep
/.directory
/css/*
!/css/.gitkeep
/composer.lock

View file

@ -1,6 +1,4 @@
# ![](themes/libreqr/icons/32.png) LibreQR
[Lire ceci en français](README_fr.md)
# LibreQR
A PHP Web interface for generating QR codes.
@ -14,19 +12,10 @@ A LibreQR instance is available at <https://qr.antopie.org>.
Just place this source code in a Web server with PHP.
`wget https://code.antopie.org/miraty/libreqr/archive/1.3.0.zip`
GD extension is required.
`apt install php7.3-gd`
PHP extensions GD and iconv are required.
LibreQR need writing rights on the `css/` directory.
```
chown -R www-data:www-data /var/www/libreqr/css
chmod -R 600 /var/www/libreqr/css
```
#### Security hardening
Your HTTP server can reply the following headers:
@ -61,16 +50,9 @@ If you want to report a bug, you can open an issue at <https://code.antopie.org/
If you want to contact me, for instance to report a bug or ask me a question about installing or using LibreQR, you can get my contact details on <https://miraty.antopie.org>.
## Libraries
This source code includes:
* [CodeItNow Barcode & QrCode Generator](https://github.com/codeitnowin/barcode-generator) to generate QR codes
* [Less.php](https://github.com/wikimedia/less.php) to compile [Less](http://lesscss.org)
## License
[AGPLv3+](https://code.antopie.org/miraty/libreqr/src/branch/main/LICENSE)
LibreQR is published under [AGPLv3+](https://code.antopie.org/miraty/libreqr/src/branch/main/LICENSE). Librairies located in the `vendor` subdirectory use their own licenses.
LibreQR is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

View file

@ -1,79 +0,0 @@
# ![](themes/libreqr/icons/32.png) LibreQR
[Read this in english](README.md)
Une interface Web en PHP pour générer des codes QR.
## Démo
Une instance de LibreQR est disponible sur <https://qr.antopie.org>.
## Installation
### Générique
Placez simplement ce code source dans un serveur Web avec PHP.
`wget https://code.antopie.org/miraty/libreqr/archive/1.3.0.zip`
L'extension GD est requise.
`apt install php7.3-gd`
LibreQR a besoin des permissions d'écriture dans le dossier `css/`.
```
chown -R www-data:www-data /var/www/libreqr/css
chmod -R 600 /var/www/libreqr/css
```
#### Durcir la sécurité
Votre serveur HTTP peut répondre avec les entêtes suivantes :
```
Content-Security-Policy: default-src 'none'; img-src 'self' data:; style-src 'self'; frame-ancestors 'none'; form-action 'self';
Referrer-Policy: no-referrer
```
### YunoHost
Il y a [un paquet](https://code.antopie.org/miraty/qr_ynh/) pour [YunoHost](https://yunohost.org/).
Pour des raisons historiques, LibreQR est techniquement nommée `qr` dans YunoHost.
Vous pouvez l'installer depuis l'interface Web d'administration ou avec cette commande :
```
sudo yunohost app install qr
```
## Themes
Les thèmes sont situés dans `themes/`, le thème par défaut est dans `themes/libreqr`.
Vous pouvez personnaliser l'apparence de votre instance LibreQR en changeant les couleurs dans `theme.php`, le logo dans `logo.less` ou les icônes dans `icons/<size>.png` (ensuite indiquer leur taille dans `theme.php`).
## Contribuer
Si vous souhaitez rapporter un bug, vous pouvez ouvrir un ticket sur <https://code.antopie.org/miraty/libreqr/issues> après vous être créé un compte (méthode préférée) ou me contacter d'une autre manière.
## Contact
Si vous voulez me contacter, par exemple pour signaler un bug ou me poser une question sur l'installation ou l'utilisation de LibreQR, vous trouverez des moyens de me contacter sur <https://miraty.antopie.org>.
## Bibliothèques tierces
Ce code source inclus :
* [CodeItNow Barcode & QrCode Generator](https://github.com/codeitnowin/barcode-generator) pour générer les codes QR
* [less.php](https://github.com/wikimedia/less.php) pour compiler le [Less](http://lesscss.org)
## Licence
[AGPLv3+](https://code.antopie.org/miraty/libreqr/src/branch/main/LICENSE)
LibreQR est un logiciel libre ; vous pouvez le diffuser et le modifier suivant les termes de la GNU Affero General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de cette licence, soit (à votre convenance) une version ultérieure.
LibreQR est diffusé dans lespoir quil sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIALISATION ou dADÉQUATION À UN USAGE PARTICULIER. Voyez la GNU Affero General Public License pour plus de détails.
Vous devriez avoir reçu une copie de la GNU Affero General Public License avec ce code. Sinon, consultez <https://www.gnu.org/licenses/>

View file

@ -1,31 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Argument Exception
*
*--------------------------------------------------------------------
*
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
use Exception;
class CINArgumentException extends Exception {
protected $param;
/**
* Constructor with specific message for a parameter.
*
* @param string $message
* @param string $param
*/
public function __construct($message, $param) {
$this->param = $param;
parent::__construct($message, 20000);
}
}
?>

View file

@ -1,439 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Base class for Barcode 1D and 2D
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
use CodeItNow\BarcodeBundle\Generator\CINColor;
use CodeItNow\BarcodeBundle\Generator\CINLabel;
use CodeItNow\BarcodeBundle\Generator\CINArgumentException;
use CodeItNow\BarcodeBundle\Generator\CINDrawException;
abstract class CINBarcode {
const COLOR_BG = 0;
const COLOR_FG = 1;
protected $colorFg, $colorBg; // Color Foreground, Barckground
protected $scale; // Scale of the graphic, default: 1
protected $offsetX, $offsetY; // Position where to start the drawing
protected $labels = array(); // Array of CINLabel
protected $pushLabel = array(0, 0); // Push for the label, left and top
/**
* Constructor.
*/
protected function __construct() {
$this->setOffsetX(0);
$this->setOffsetY(0);
$this->setForegroundColor(0x000000);
$this->setBackgroundColor(0xffffff);
$this->setScale(1);
}
/**
* Parses the text before displaying it.
*
* @param mixed $text
*/
public function parse($text) {
}
/**
* Gets the foreground color of the barcode.
*
* @return CINColor
*/
public function getForegroundColor() {
return $this->colorFg;
}
/**
* Sets the foreground color of the barcode. It could be a CINColor
* value or simply a language code (white, black, yellow...) or hex value.
*
* @param mixed $code
*/
public function setForegroundColor($code) {
if ($code instanceof CINColor) {
$this->colorFg = $code;
} else {
$this->colorFg = new CINColor($code);
}
}
/**
* Gets the background color of the barcode.
*
* @return CINColor
*/
public function getBackgroundColor() {
return $this->colorBg;
}
/**
* Sets the background color of the barcode. It could be a CINColor
* value or simply a language code (white, black, yellow...) or hex value.
*
* @param mixed $code
*/
public function setBackgroundColor($code) {
if ($code instanceof CINColor) {
$this->colorBg = $code;
} else {
$this->colorBg = new CINColor($code);
}
foreach ($this->labels as $label) {
$label->setBackgroundColor($this->colorBg);
}
}
/**
* Sets the color.
*
* @param mixed $fg
* @param mixed $bg
*/
public function setColor($fg, $bg) {
$this->setForegroundColor($fg);
$this->setBackgroundColor($bg);
}
/**
* Gets the scale of the barcode.
*
* @return int
*/
public function getScale() {
return $this->scale;
}
/**
* Sets the scale of the barcode in pixel.
* If the scale is lower than 1, an exception is raised.
*
* @param int $scale
*/
public function setScale($scale) {
$scale = intval($scale);
if ($scale <= 0) {
throw new CINArgumentException('The scale must be larger than 0.', 'scale');
}
$this->scale = $scale;
}
/**
* Abstract method that draws the barcode on the resource.
*
* @param resource $im
*/
public abstract function draw($im);
/**
* Returns the maximal size of a barcode.
* [0]->width
* [1]->height
*
* @param int $w
* @param int $h
* @return int[]
*/
public function getDimension($w, $h) {
$labels = $this->getBiggestLabels(false);
$pixelsAround = array(0, 0, 0, 0); // TRBL
if (isset($labels[CINLabel::POSITION_TOP])) {
$dimension = $labels[CINLabel::POSITION_TOP]->getDimension();
$pixelsAround[0] += $dimension[1];
}
if (isset($labels[CINLabel::POSITION_RIGHT])) {
$dimension = $labels[CINLabel::POSITION_RIGHT]->getDimension();
$pixelsAround[1] += $dimension[0];
}
if (isset($labels[CINLabel::POSITION_BOTTOM])) {
$dimension = $labels[CINLabel::POSITION_BOTTOM]->getDimension();
$pixelsAround[2] += $dimension[1];
}
if (isset($labels[CINLabel::POSITION_LEFT])) {
$dimension = $labels[CINLabel::POSITION_LEFT]->getDimension();
$pixelsAround[3] += $dimension[0];
}
$finalW = ($w + $this->offsetX) * $this->scale;
$finalH = ($h + $this->offsetY) * $this->scale;
// This section will check if a top/bottom label is too big for its width and left/right too big for its height
$reversedLabels = $this->getBiggestLabels(true);
foreach ($reversedLabels as $label) {
$dimension = $label->getDimension();
$alignment = $label->getAlignment();
if ($label->getPosition() === CINLabel::POSITION_LEFT || $label->getPosition() === CINLabel::POSITION_RIGHT) {
if ($alignment === CINLabel::ALIGN_TOP) {
$pixelsAround[2] = max($pixelsAround[2], $dimension[1] - $finalH);
} elseif ($alignment === CINLabel::ALIGN_CENTER) {
$temp = ceil(($dimension[1] - $finalH) / 2);
$pixelsAround[0] = max($pixelsAround[0], $temp);
$pixelsAround[2] = max($pixelsAround[2], $temp);
} elseif ($alignment === CINLabel::ALIGN_BOTTOM) {
$pixelsAround[0] = max($pixelsAround[0], $dimension[1] - $finalH);
}
} else {
if ($alignment === CINLabel::ALIGN_LEFT) {
$pixelsAround[1] = max($pixelsAround[1], $dimension[0] - $finalW);
} elseif ($alignment === CINLabel::ALIGN_CENTER) {
$temp = ceil(($dimension[0] - $finalW) / 2);
$pixelsAround[1] = max($pixelsAround[1], $temp);
$pixelsAround[3] = max($pixelsAround[3], $temp);
} elseif ($alignment === CINLabel::ALIGN_RIGHT) {
$pixelsAround[3] = max($pixelsAround[3], $dimension[0] - $finalW);
}
}
}
$this->pushLabel[0] = $pixelsAround[3];
$this->pushLabel[1] = $pixelsAround[0];
$finalW = ($w + $this->offsetX) * $this->scale + $pixelsAround[1] + $pixelsAround[3];
$finalH = ($h + $this->offsetY) * $this->scale + $pixelsAround[0] + $pixelsAround[2];
return array($finalW, $finalH);
}
/**
* Gets the X offset.
*
* @return int
*/
public function getOffsetX() {
return $this->offsetX;
}
/**
* Sets the X offset.
*
* @param int $offsetX
*/
public function setOffsetX($offsetX) {
$offsetX = intval($offsetX);
if ($offsetX < 0) {
throw new CINArgumentException('The offset X must be 0 or larger.', 'offsetX');
}
$this->offsetX = $offsetX;
}
/**
* Gets the Y offset.
*
* @return int
*/
public function getOffsetY() {
return $this->offsetY;
}
/**
* Sets the Y offset.
*
* @param int $offsetY
*/
public function setOffsetY($offsetY) {
$offsetY = intval($offsetY);
if ($offsetY < 0) {
throw new CINArgumentException('The offset Y must be 0 or larger.', 'offsetY');
}
$this->offsetY = $offsetY;
}
/**
* Adds the label to the drawing.
*
* @param CINLabel $label
*/
public function addLabel(CINLabel $label) {
$label->setBackgroundColor($this->colorBg);
$label->setForegroundColor($this->colorFg);
$this->labels[] = $label;
}
/**
* Removes the label from the drawing.
*
* @param CINLabel $label
*/
public function removeLabel(CINLabel $label) {
$remove = -1;
$c = count($this->labels);
for ($i = 0; $i < $c; $i++) {
if ($this->labels[$i] === $label) {
$remove = $i;
break;
}
}
if ($remove > -1) {
array_splice($this->labels, $remove, 1);
}
}
/**
* Clears the labels.
*/
public function clearLabels() {
$this->labels = array();
}
/**
* Draws the text.
* The coordinate passed are the positions of the barcode.
* $x1 and $y1 represent the top left corner.
* $x2 and $y2 represent the bottom right corner.
*
* @param resource $im
* @param int $x1
* @param int $y1
* @param int $x2
* @param int $y2
*/
protected function drawText($im, $x1, $y1, $x2, $y2) {
foreach ($this->labels as $label) {
$label->draw($im,
($x1 + $this->offsetX) * $this->scale + $this->pushLabel[0],
($y1 + $this->offsetY) * $this->scale + $this->pushLabel[1],
($x2 + $this->offsetX) * $this->scale + $this->pushLabel[0],
($y2 + $this->offsetY) * $this->scale + $this->pushLabel[1]);
}
}
/**
* Draws 1 pixel on the resource at a specific position with a determined color.
*
* @param resource $im
* @param int $x
* @param int $y
* @param int $color
*/
protected function drawPixel($im, $x, $y, $color = self::COLOR_FG) {
$xR = ($x + $this->offsetX) * $this->scale + $this->pushLabel[0];
$yR = ($y + $this->offsetY) * $this->scale + $this->pushLabel[1];
// We always draw a rectangle
imagefilledrectangle($im,
$xR,
$yR,
$xR + $this->scale - 1,
$yR + $this->scale - 1,
$this->getColor($im, $color));
}
/**
* Draws an empty rectangle on the resource at a specific position with a determined color.
*
* @param resource $im
* @param int $x1
* @param int $y1
* @param int $x2
* @param int $y2
* @param int $color
*/
protected function drawRectangle($im, $x1, $y1, $x2, $y2, $color = self::COLOR_FG) {
if ($this->scale === 1) {
imagefilledrectangle($im,
($x1 + $this->offsetX) + $this->pushLabel[0],
($y1 + $this->offsetY) + $this->pushLabel[1],
($x2 + $this->offsetX) + $this->pushLabel[0],
($y2 + $this->offsetY) + $this->pushLabel[1],
$this->getColor($im, $color));
} else {
imagefilledrectangle($im, ($x1 + $this->offsetX) * $this->scale + $this->pushLabel[0], ($y1 + $this->offsetY) * $this->scale + $this->pushLabel[1], ($x2 + $this->offsetX) * $this->scale + $this->pushLabel[0] + $this->scale - 1, ($y1 + $this->offsetY) * $this->scale + $this->pushLabel[1] + $this->scale - 1, $this->getColor($im, $color));
imagefilledrectangle($im, ($x1 + $this->offsetX) * $this->scale + $this->pushLabel[0], ($y1 + $this->offsetY) * $this->scale + $this->pushLabel[1], ($x1 + $this->offsetX) * $this->scale + $this->pushLabel[0] + $this->scale - 1, ($y2 + $this->offsetY) * $this->scale + $this->pushLabel[1] + $this->scale - 1, $this->getColor($im, $color));
imagefilledrectangle($im, ($x2 + $this->offsetX) * $this->scale + $this->pushLabel[0], ($y1 + $this->offsetY) * $this->scale + $this->pushLabel[1], ($x2 + $this->offsetX) * $this->scale + $this->pushLabel[0] + $this->scale - 1, ($y2 + $this->offsetY) * $this->scale + $this->pushLabel[1] + $this->scale - 1, $this->getColor($im, $color));
imagefilledrectangle($im, ($x1 + $this->offsetX) * $this->scale + $this->pushLabel[0], ($y2 + $this->offsetY) * $this->scale + $this->pushLabel[1], ($x2 + $this->offsetX) * $this->scale + $this->pushLabel[0] + $this->scale - 1, ($y2 + $this->offsetY) * $this->scale + $this->pushLabel[1] + $this->scale - 1, $this->getColor($im, $color));
}
}
/**
* Draws a filled rectangle on the resource at a specific position with a determined color.
*
* @param resource $im
* @param int $x1
* @param int $y1
* @param int $x2
* @param int $y2
* @param int $color
*/
protected function drawFilledRectangle($im, $x1, $y1, $x2, $y2, $color = self::COLOR_FG) {
if ($x1 > $x2) { // Swap
$x1 ^= $x2 ^= $x1 ^= $x2;
}
if ($y1 > $y2) { // Swap
$y1 ^= $y2 ^= $y1 ^= $y2;
}
imagefilledrectangle($im,
($x1 + $this->offsetX) * $this->scale + $this->pushLabel[0],
($y1 + $this->offsetY) * $this->scale + $this->pushLabel[1],
($x2 + $this->offsetX) * $this->scale + $this->pushLabel[0] + $this->scale - 1,
($y2 + $this->offsetY) * $this->scale + $this->pushLabel[1] + $this->scale - 1,
$this->getColor($im, $color));
}
/**
* Allocates the color based on the integer.
*
* @param resource $im
* @param int $color
* @return resource
*/
protected function getColor($im, $color) {
if ($color === self::COLOR_BG) {
return $this->colorBg->allocate($im);
} else {
return $this->colorFg->allocate($im);
}
}
/**
* Returning the biggest label widths for LEFT/RIGHT and heights for TOP/BOTTOM.
*
* @param bool $reversed
* @return CINLabel[]
*/
private function getBiggestLabels($reversed = false) {
$searchLR = $reversed ? 1 : 0;
$searchTB = $reversed ? 0 : 1;
$labels = array();
foreach ($this->labels as $label) {
$position = $label->getPosition();
if (isset($labels[$position])) {
$savedDimension = $labels[$position]->getDimension();
$dimension = $label->getDimension();
if ($position === CINLabel::POSITION_LEFT || $position === CINLabel::POSITION_RIGHT) {
if ($dimension[$searchLR] > $savedDimension[$searchLR]) {
$labels[$position] = $label;
}
} else {
if ($dimension[$searchTB] > $savedDimension[$searchTB]) {
$labels[$position] = $label;
}
}
} else {
$labels[$position] = $label;
}
}
return $labels;
}
}
?>

View file

@ -1,262 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Holds all type of barcodes for 1D generation
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
use CodeItNow\BarcodeBundle\Generator\CINArgumentException;
use CodeItNow\BarcodeBundle\Generator\CINBarcode1D;
use CodeItNow\BarcodeBundle\Generator\CINFontPhp;
use CodeItNow\BarcodeBundle\Generator\CINFontFile;
use CodeItNow\BarcodeBundle\Generator\CINLabel;
abstract class CINBarcode1D extends CINBarcode {
const SIZE_SPACING_FONT = 5;
const AUTO_LABEL = '##!!AUTO_LABEL!!##';
protected $thickness; // int
protected $keys, $code; // string[]
protected $positionX; // int
protected $font; // CINFont
protected $text; // string
protected $checksumValue; // int or int[]
protected $displayChecksum; // bool
protected $label; // string
protected $defaultLabel; // CINLabel
/**
* Constructor.
*/
protected function __construct() {
parent::__construct();
$this->setThickness(30);
$this->defaultLabel = new CINLabel();
$this->defaultLabel->setPosition(CINLabel::POSITION_BOTTOM);
$this->setLabel(self::AUTO_LABEL);
$this->setFont(new CINFontPhp(5));
$this->text = '';
$this->checksumValue = false;
$this->positionX = 0;
}
/**
* Gets the thickness.
*
* @return int
*/
public function getThickness() {
return $this->thickness;
}
/**
* Sets the thickness.
*
* @param int $thickness
*/
public function setThickness($thickness) {
$thickness = intval($thickness);
if ($thickness <= 0) {
throw new CINArgumentException('The thickness must be larger than 0.', 'thickness');
}
$this->thickness = $thickness;
}
/**
* Gets the label.
* If the label was set to CINBarcode1D::AUTO_LABEL, the label will display the value from the text parsed.
*
* @return string
*/
public function getLabel() {
$label = $this->label;
if ($this->label === self::AUTO_LABEL) {
$label = $this->text;
if ($this->displayChecksum === true && ($checksum = $this->processChecksum()) !== false) {
$label .= $checksum;
}
}
return $label;
}
/**
* Sets the label.
* You can use CINBarcode::AUTO_LABEL to have the label automatically written based on the parsed text.
*
* @param string $label
*/
public function setLabel($label) {
$this->label = $label;
}
/**
* Gets the font.
*
* @return CINFont
*/
public function getFont() {
return $this->font;
}
/**
* Sets the font.
*
* @param mixed $font CINFont or int
*/
public function setFont($font) {
if (is_int($font)) {
if ($font === 0) {
$font = null;
} else {
$font = new CINFontPhp($font);
}
}
$this->font = $font;
}
/**
* Parses the text before displaying it.
*
* @param mixed $text
*/
public function parse($text) {
$this->text = $text;
$this->checksumValue = false; // Reset checksumValue
$this->validate();
parent::parse($text);
$this->addDefaultLabel();
}
/**
* Gets the checksum of a Barcode.
* If no checksum is available, return FALSE.
*
* @return string
*/
public function getChecksum() {
return $this->processChecksum();
}
/**
* Sets if the checksum is displayed with the label or not.
* The checksum must be activated in some case to make this variable effective.
*
* @param boolean $displayChecksum
*/
public function setDisplayChecksum($displayChecksum) {
$this->displayChecksum = (bool)$displayChecksum;
}
/**
* Adds the default label.
*/
protected function addDefaultLabel() {
$label = $this->getLabel();
$font = $this->font;
if ($label !== null && $label !== '' && $font !== null && $this->defaultLabel !== null) {
$this->defaultLabel->setText($label);
$this->defaultLabel->setFont($font);
$this->addLabel($this->defaultLabel);
}
}
/**
* Validates the input
*/
protected function validate() {
// No validation in the abstract class.
}
/**
* Returns the index in $keys (useful for checksum).
*
* @param mixed $var
* @return mixed
*/
protected function findIndex($var) {
return array_search($var, $this->keys);
}
/**
* Returns the code of the char (useful for drawing bars).
*
* @param mixed $var
* @return string
*/
protected function findCode($var) {
return $this->code[$this->findIndex($var)];
}
/**
* Draws all chars thanks to $code. If $startBar is true, the line begins by a space.
* If $startBar is false, the line begins by a bar.
*
* @param resource $im
* @param string $code
* @param boolean $startBar
*/
protected function drawChar($im, $code, $startBar = true) {
$colors = array(CINBarcode::COLOR_FG, CINBarcode::COLOR_BG);
$currentColor = $startBar ? 0 : 1;
$c = strlen($code);
for ($i = 0; $i < $c; $i++) {
for ($j = 0; $j < intval($code[$i]) + 1; $j++) {
$this->drawSingleBar($im, $colors[$currentColor]);
$this->nextX();
}
$currentColor = ($currentColor + 1) % 2;
}
}
/**
* Draws a Bar of $color depending of the resolution.
*
* @param resource $img
* @param int $color
*/
protected function drawSingleBar($im, $color) {
$this->drawFilledRectangle($im, $this->positionX, 0, $this->positionX, $this->thickness - 1, $color);
}
/**
* Moving the pointer right to write a bar.
*/
protected function nextX() {
$this->positionX++;
}
/**
* Method that saves FALSE into the checksumValue. This means no checksum
* but this method should be overriden when needed.
*/
protected function calculateChecksum() {
$this->checksumValue = false;
}
/**
* Returns FALSE because there is no checksum. This method should be
* overriden to return correctly the checksum in string with checksumValue.
*
* @return string
*/
protected function processChecksum() {
return false;
}
}
?>

View file

@ -1,157 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Holds Color in RGB Format.
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
class CINColor {
protected $r, $g, $b; // int Hexadecimal Value
protected $transparent;
/**
* Save RGB value into the classes.
*
* There are 4 way to associate color with this classes :
* 1. Gives 3 parameters int (R, G, B)
* 2. Gives 1 parameter string hex value (#ff0000) (preceding with #)
* 3. Gives 1 parameter int hex value (0xff0000)
* 4. Gives 1 parameter string color code (white, black, orange...)
*
* @param mixed ...
*/
public function __construct() {
$args = func_get_args();
$c = count($args);
if ($c === 3) {
$this->r = intval($args[0]);
$this->g = intval($args[1]);
$this->b = intval($args[2]);
} elseif ($c === 1) {
if (is_string($args[0]) && strlen($args[0]) === 7 && $args[0][0] === '#') { // Hex Value in String
$this->r = intval(substr($args[0], 1, 2), 16);
$this->g = intval(substr($args[0], 3, 2), 16);
$this->b = intval(substr($args[0], 5, 2), 16);
} else {
if (is_string($args[0])) {
$args[0] = self::getColor($args[0]);
}
$args[0] = intval($args[0]);
$this->r = ($args[0] & 0xff0000) >> 16;
$this->g = ($args[0] & 0x00ff00) >> 8;
$this->b = ($args[0] & 0x0000ff);
}
} else {
$this->r = $this->g = $this->b = 0;
}
}
/**
* Sets the color transparent.
*
* @param bool $transparent
*/
public function setTransparent($transparent) {
$this->transparent = $transparent;
}
/**
* Returns Red Color.
*
* @return int
*/
public function r() {
return $this->r;
}
/**
* Returns Green Color.
*
* @return int
*/
public function g() {
return $this->g;
}
/**
* Returns Blue Color.
*
* @return int
*/
public function b() {
return $this->b;
}
/**
* Returns the int value for PHP color.
*
* @param resource $im
* @return int
*/
public function allocate(&$im) {
$allocated = imagecolorallocate($im, $this->r, $this->g, $this->b);
if ($this->transparent) {
return imagecolortransparent($im, $allocated);
} else {
return $allocated;
}
}
/**
* Returns class of CINColor depending of the string color.
*
* If the color doens't exist, it takes the default one.
*
* @param string $code
* @param string $default
*/
public static function getColor($code, $default = 'white') {
switch(strtolower($code)) {
case '':
case 'white':
return 0xffffff;
case 'black':
return 0x000000;
case 'maroon':
return 0x800000;
case 'red':
return 0xff0000;
case 'orange':
return 0xffa500;
case 'yellow':
return 0xffff00;
case 'olive':
return 0x808000;
case 'purple':
return 0x800080;
case 'fuchsia':
return 0xff00ff;
case 'lime':
return 0x00ff00;
case 'green':
return 0x008000;
case 'navy':
return 0x000080;
case 'blue':
return 0x0000ff;
case 'aqua':
return 0x00ffff;
case 'teal':
return 0x008080;
case 'silver':
return 0xc0c0c0;
case 'gray':
return 0x808080;
default:
return self::getColor($default, 'white');
}
}
}
?>

View file

@ -1,25 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Draw Exception
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
use Exception;
class CINDrawException extends Exception {
/**
* Constructor with specific message.
*
* @param string $message
*/
public function __construct($message) {
parent::__construct($message, 30000);
}
}
?>

View file

@ -1,250 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Holds the drawing $im
* You can use get_im() to add other kind of form not held into these classes.
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
use CodeItNow\BarcodeBundle\Generator\CINBarcode;
use CodeItNow\BarcodeBundle\Generator\CINColor;
use CodeItNow\BarcodeBundle\Generator\CINDrawException;
use CodeItNow\BarcodeBundle\Generator\Drawer\CINDrawJPG;
use CodeItNow\BarcodeBundle\Generator\Drawer\CINDrawPNG;
class CINDrawing {
const IMG_FORMAT_PNG = 1;
const IMG_FORMAT_JPEG = 2;
const IMG_FORMAT_GIF = 3;
const IMG_FORMAT_WBMP = 4;
private $w, $h; // int
private $color; // CINColor
private $filename; // char *
private $im; // {object}
private $barcode; // CINBarcode
private $dpi; // float
private $rotateDegree; // float
/**
* Constructor.
*
* @param int $w
* @param int $h
* @param string filename
* @param CINColor $color
*/
public function __construct($filename, CINColor $color) {
$this->im = null;
$this->setFilename($filename);
$this->color = $color;
$this->dpi = null;
$this->rotateDegree = 0.0;
}
/**
* Destructor.
*/
public function __destruct() {
$this->destroy();
}
/**
* Gets the filename.
*
* @return string
*/
public function getFilename() {
return $this->filename;
}
/**
* Sets the filename.
*
* @param string $filaneme
*/
public function setFilename($filename) {
$this->filename = $filename;
}
/**
* @return resource.
*/
public function get_im() {
return $this->im;
}
/**
* Sets the image.
*
* @param resource $im
*/
public function set_im($im) {
$this->im = $im;
}
/**
* Gets barcode for drawing.
*
* @return CINBarcode
*/
public function getBarcode() {
return $this->barcode;
}
/**
* Sets barcode for drawing.
*
* @param CINBarcode $barcode
*/
public function setBarcode(CINBarcode $barcode) {
$this->barcode = $barcode;
}
/**
* Gets the DPI for supported filetype.
*
* @return float
*/
public function getDPI() {
return $this->dpi;
}
/**
* Sets the DPI for supported filetype.
*
* @param float $dpi
*/
public function setDPI($dpi) {
$this->dpi = $dpi;
}
/**
* Gets the rotation angle in degree clockwise.
*
* @return float
*/
public function getRotationAngle() {
return $this->rotateDegree;
}
/**
* Sets the rotation angle in degree clockwise.
*
* @param float $degree
*/
public function setRotationAngle($degree) {
$this->rotateDegree = (float)$degree;
}
/**
* Draws the barcode on the image $im.
*/
public function draw() {
$size = $this->barcode->getDimension(0, 0);
$this->w = max(1, $size[0]);
$this->h = max(1, $size[1]);
$this->init();
$this->barcode->draw($this->im);
}
/**
* Saves $im into the file (many format available).
*
* @param int $image_style
* @param int $quality
*/
public function finish($image_style = self::IMG_FORMAT_PNG, $quality = 100) {
$drawer = null;
$im = $this->im;
if ($this->rotateDegree > 0.0) {
if (function_exists('imagerotate')) {
$im = imagerotate($this->im, 360 - $this->rotateDegree, $this->color->allocate($this->im));
} else {
throw new CINDrawException('The method imagerotate doesn\'t exist on your server. Do not use any rotation.');
}
}
if ($image_style === self::IMG_FORMAT_PNG) {
$drawer = new CINDrawPNG($im);
$drawer->setFilename($this->filename);
$drawer->setDPI($this->dpi);
} elseif ($image_style === self::IMG_FORMAT_JPEG) {
$drawer = new CINDrawJPG($im);
$drawer->setFilename($this->filename);
$drawer->setDPI($this->dpi);
$drawer->setQuality($quality);
} elseif ($image_style === self::IMG_FORMAT_GIF) {
// Some PHP versions have a bug if passing 2nd argument as null.
if ($this->filename === null || $this->filename === '') {
imagegif($im);
} else {
imagegif($im, $this->filename);
}
} elseif ($image_style === self::IMG_FORMAT_WBMP) {
imagewbmp($im, $this->filename);
}
if ($drawer !== null) {
$drawer->draw();
}
}
/**
* Writes the Error on the picture.
*
* @param Exception $exception
*/
public function drawException($exception) {
$this->w = 1;
$this->h = 1;
$this->init();
// Is the image big enough?
$w = imagesx($this->im);
$h = imagesy($this->im);
$text = 'Error: ' . $exception->getMessage();
$width = imagefontwidth(2) * strlen($text);
$height = imagefontheight(2);
if ($width > $w || $height > $h) {
$width = max($w, $width);
$height = max($h, $height);
// We change the size of the image
$newimg = imagecreatetruecolor($width, $height);
imagefill($newimg, 0, 0, imagecolorat($this->im, 0, 0));
imagecopy($newimg, $this->im, 0, 0, 0, 0, $w, $h);
$this->im = $newimg;
}
$black = new CINColor('black');
imagestring($this->im, 2, 0, 0, $text, $black->allocate($this->im));
}
/**
* Free the memory of PHP (called also by destructor).
*/
public function destroy() {
@imagedestroy($this->im);
}
/**
* Init Image and color background.
*/
private function init() {
if ($this->im === null) {
$this->im = imagecreatetruecolor($this->w, $this->h)
or die('Can\'t Initialize the GD Libraty');
imagefilledrectangle($this->im, 0, 0, $this->w - 1, $this->h - 1, $this->color->allocate($this->im));
}
}
}
?>

View file

@ -1,26 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Interface for a font.
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
interface CINFont {
public /*internal*/ function getText();
public /*internal*/ function setText($text);
public /*internal*/ function getRotationAngle();
public /*internal*/ function setRotationAngle($rotationDegree);
public /*internal*/ function getBackgroundColor();
public /*internal*/ function setBackgroundColor($backgroundColor);
public /*internal*/ function getForegroundColor();
public /*internal*/ function setForegroundColor($foregroundColor);
public /*internal*/ function getDimension();
public /*internal*/ function draw($im, $x, $y);
}
?>

View file

@ -1,211 +0,0 @@
<?php
/**
*--------------------------------------------------------------------
*
* Holds font family and size.
*
*--------------------------------------------------------------------
* @author Akhtar Khan <er.akhtarkhan@gmail.com>
* @link http://www.codeitnow.in
* @package https://github.com/codeitnowin/barcode-generator
*/
namespace CodeItNow\BarcodeBundle\Generator;
use CodeItNow\BarcodeBundle\Generator\CINArgumentException;
use CodeItNow\BarcodeBundle\Generator\CINFont;
use CodeItNow\BarcodeBundle\Generator\CINColor;
class CINFontFile implements CINFont {
const PHP_BOX_FIX = 0;
private $path;
private $size;
private $text = '';
private $foregroundColor;
private $rotationAngle;
private $box;
private $boxFix;
/**
* Constructor.
*
* @param string $fontPath path to the file
* @param int $size size in point
*/
public function __construct($fontPath, $size) {
if (!file_exists($fontPath)) {
throw new CINArgumentException('The font path is incorrect.', 'fontPath');
}
$this->path = $fontPath;
$this->size = $size;
$this->foregroundColor = new CINColor('black');
$this->setRotationAngle(0);
$this->setBoxFix(self::PHP_BOX_FIX);
}
/**
* Gets the text associated to the font.
*
* @return string
*/
public function getText() {
return $this->text;
}
/**
* Sets the text associated to the font.
*
* @param string text
*/
public function setText($text) {
$this->text = $text;
$this->box = null;
}
/**
* Gets the rotation in degree.
*
* @return int
*/
public function getRotationAngle() {
return (360 - $this->rotationAngle) % 360;
}
/**
* Sets the rotation in degree.
*
* @param int
*/
public function setRotationAngle($rotationAngle) {
$this->rotationAngle = (int)$rotationAngle;
if ($this->rotationAngle !== 90 && $this->rotationAngle !== 180 && $this->rotationAngle !== 270) {
$this->rotationAngle = 0;
}
$this->rotationAngle = (360 - $this->rotationAngle) % 360;
$this->box = null;
}
/**
* Gets the background color.
*
* @return CINColor
*/
public function getBackgroundColor() {
}
/**
* Sets the background color.
*
* @param CINColor $backgroundColor
*/
public function setBackgroundColor($backgroundColor) {
}
/**
* Gets the foreground color.
*
* @return CINColor
*/
public function getForegroundColor() {
return $this->foregroundColor;
}
/**
* Sets the foreground color.
*
* @param CINColor $foregroundColor
*/
public function setForegroundColor($foregroundColor) {
$this->foregroundColor = $foregroundColor;
}
/**
* Gets the box fix information.
*
* @return int
*/
public function getBoxFix() {
return $this->boxFix;
}
/**
* Sets the box fix information.
*
* @param int $value
*/
public function setBoxFix($value) {
$this->boxFix = intval($value);
}