Redmine/vendor/plugins/rfpdf/lib/barcode/c128bobject.rb

394 lines
11 KiB
Ruby
Executable File
Raw Blame History

#============================================================+
# File name : c128bobject.rb
# Begin : 2002-07-31
# Last Update : 2004-12-29
# Author : Karim Mribti [barcode@mribti.com]
# Version : 0.0.8a 2001-04-01 (original code)
# License : GNU LGPL (Lesser General Public License) 2.1
# http://www.gnu.org/copyleft/lesser.txt
# Source Code : http://www.mribti.com/barcode/
#
# Description : Code 128-B Barcode Render Class for PHP using
# the GD graphics library.
# Code 128-B is a continuous, multilevel and full
# ASCII code.
#
# NOTE:
# This version contains changes by Nicola Asuni:
# - porting to Ruby
# - code style and formatting
# - automatic php documentation in PhpDocumentor Style
# (www.phpdoc.org)
# - minor bug fixing
#============================================================+
#
# Code 128-B Barcode Render Class for PHP using the GD graphics library.<br>
# Code 128-B is a continuous, multilevel and full ASCII code.
# @author Karim Mribti, Nicola Asuni
# @name BarcodeObject
# @package com.tecnick.tcpdf
# @@version 0.0.8a 2001-04-01 (original code)
# @since 2001-03-25
# @license http://www.gnu.org/copyleft/lesser.html LGPL
#
#
# Code 128-B Barcode Render Class for PHP using the GD graphics library.<br>
# Code 128-B is a continuous, multilevel and full ASCII code.
# @author Karim Mribti, Nicola Asuni
# @name BarcodeObject
# @package com.tecnick.tcpdf
# @@version 0.0.8a 2001-04-01 (original code)
# @since 2001-03-25
# @license http://www.gnu.org/copyleft/lesser.html LGPL
#
class C128BObject extends BarcodeObject {
#
# Class Constructor.
# @param int $Width Image width in pixels.
# @param int $Height Image height in pixels.
# @param int $Style Barcode style.
# @param int $Value value to print on barcode.
#
def __construct($Width, $Height, $Style, $Value)
parent::__construct($Width, $Height, $Style);
@mValue = $Value;
@mChars = " !\"#$%&'()*+<2B>-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{ }~";
@mCharSet = array (
"212222", # 00#
"222122", # 01#
"222221", # 02#
"121223", # 03#
"121322", # 04#
"131222", # 05#
"122213", # 06#
"122312", # 07#
"132212", # 08#
"221213", # 09#
"221312", # 10#
"231212", # 11#
"112232", # 12#
"122132", # 13#
"122231", # 14#
"113222", # 15#
"123122", # 16#
"123221", # 17#
"223211", # 18#
"221132", # 19#
"221231", # 20#
"213212", # 21#
"223112", # 22#
"312131", # 23#
"311222", # 24#
"321122", # 25#
"321221", # 26#
"312212", # 27#
"322112", # 28#
"322211", # 29#
"212123", # 30#
"212321", # 31#
"232121", # 32#
"111323", # 33#
"131123", # 34#
"131321", # 35#
"112313", # 36#
"132113", # 37#
"132311", # 38#
"211313", # 39#
"231113", # 40#
"231311", # 41#
"112133", # 42#
"112331", # 43#
"132131", # 44#
"113123", # 45#
"113321", # 46#
"133121", # 47#
"313121", # 48#
"211331", # 49#
"231131", # 50#
"213113", # 51#
"213311", # 52#
"213131", # 53#
"311123", # 54#
"311321", # 55#
"331121", # 56#
"312113", # 57#
"312311", # 58#
"332111", # 59#
"314111", # 60#
"221411", # 61#
"431111", # 62#
"111224", # 63#
"111422", # 64#
"121124", # 65#
"121421", # 66#
"141122", # 67#
"141221", # 68#
"112214", # 69#
"112412", # 70#
"122114", # 71#
"122411", # 72#
"142112", # 73#
"142211", # 74#
"241211", # 75#
"221114", # 76#
"413111", # 77#
"241112", # 78#
"134111", # 79#
"111242", # 80#
"121142", # 81#
"121241", # 82#
"114212", # 83#
"124112", # 84#
"124211", # 85#
"411212", # 86#
"421112", # 87#
"421211", # 88#
"212141", # 89#
"214121", # 90#
"412121", # 91#
"111143", # 92#
"111341", # 93#
"131141", # 94#
"114113", # 95#
"114311", # 96#
"411113", # 97#
"411311", # 98#
"113141", # 99#
"114131", # 100#
"311141", # 101#
"411131" # 102#
);
end
#
# Returns the character index.
# @param char $char character.
# @return int character index or -1 in case of error.
# @access private
#
def GetCharIndex($char)
for ($i=0;$i<95;$i++)
if (@mChars[$i] == $char)
return $i;
end
end
return -1;
end
#
# Returns the bar size.
# @param int $xres Horizontal resolution.
# @param char $char Character.
# @return int barcode size.
# @access private
#
def GetBarSize($xres, $char)
switch ($char)
case '1'
$cVal = BCD_C128_BAR_1;
case '2'
$cVal = BCD_C128_BAR_2;
case '3'
$cVal = BCD_C128_BAR_3;
case '4'
$cVal = BCD_C128_BAR_4;
default
$cVal = 0;
end
end
return $cVal# $xres;
end
#
# Returns barcode size.
# @param int $xres Horizontal resolution.
# @return barcode size.
# @access private
#
def GetSize($xres)
$len = @mValue.length;
if ($len == 0) {
@mError = "Null value";
return false;
end
$ret = 0;
for ($i=0;$i<$len;$i++)
if (($id = GetCharIndex(@mValue[$i])) == -1)
@mError = "C128B not include the char '".@mValue[$i]."'";
return false;
else
$cset = @mCharSet[$id];
$ret += GetBarSize($xres, $cset[0]);
$ret += GetBarSize($xres, $cset[1]);
$ret += GetBarSize($xres, $cset[2]);
$ret += GetBarSize($xres, $cset[3]);
$ret += GetBarSize($xres, $cset[4]);
$ret += GetBarSize($xres, $cset[5]);
end
end
# length of Check character#
$cset = GetCheckCharValue();
$CheckSize = 0;
for ($i=0;$i<6;$i++)
$CheckSize += GetBarSize($cset[$i], $xres);
end
$StartSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres;
$StopSize = 2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + 2*BCD_C128_BAR_3*$xres;
return $StartSize + $ret + $CheckSize + $StopSize;
end
#
# Returns the check-char value.
# @return string.
# @access private
#
def GetCheckCharValue()
$len = @mValue.length;
$sum = 104; # 'B' type;
for ($i=0;$i<$len;$i++)
$sum += GetCharIndex(@mValue[$i])# ($i+1);
end
$check = $sum % 103;
return @mCharSet[$check];
end
#
# Draws the start code.
# @param int $DrawPos Drawing position.
# @param int $yPos Vertical position.
# @param int $ySize Vertical size.
# @param int $xres Horizontal resolution.
# @return int drawing position.
# @access private
#
def DrawStart($DrawPos, $yPos, $ySize, $xres)
# Start code is '211214'#
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres), $ySize);
$DrawPos += GetBarSize('2', $xres);
$DrawPos += GetBarSize('1', $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres), $ySize);
$DrawPos += GetBarSize('1', $xres);
$DrawPos += GetBarSize('2', $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres), $ySize);
$DrawPos += GetBarSize('1', $xres);
$DrawPos += GetBarSize('4', $xres);
return $DrawPos;
end
#
# Draws the stop code.
# @param int $DrawPos Drawing position.
# @param int $yPos Vertical position.
# @param int $ySize Vertical size.
# @param int $xres Horizontal resolution.
# @return int drawing position.
# @access private
#
def DrawStop($DrawPos, $yPos, $ySize, $xres)
# Stop code is '2331112'#
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize);
$DrawPos += GetBarSize('2', $xres);
$DrawPos += GetBarSize('3', $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('3', $xres) , $ySize);
$DrawPos += GetBarSize('3', $xres);
$DrawPos += GetBarSize('1', $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('1', $xres) , $ySize);
$DrawPos += GetBarSize('1', $xres);
$DrawPos += GetBarSize('1', $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize('2', $xres) , $ySize);
$DrawPos += GetBarSize('2', $xres);
return $DrawPos;
end
#
# Draws the check-char code.
# @param int $DrawPos Drawing position.
# @param int $yPos Vertical position.
# @param int $ySize Vertical size.
# @param int $xres Horizontal resolution.
# @return int drawing position.
# @access private
#
def DrawCheckChar($DrawPos, $yPos, $ySize, $xres)
$cset = GetCheckCharValue();
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ySize);
$DrawPos += GetBarSize($cset[0], $xres);
$DrawPos += GetBarSize($cset[1], $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ySize);
$DrawPos += GetBarSize($cset[2], $xres);
$DrawPos += GetBarSize($cset[3], $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ySize);
$DrawPos += GetBarSize($cset[4], $xres);
$DrawPos += GetBarSize($cset[5], $xres);
return $DrawPos;
end
#
# Draws the barcode object.
# @param int $xres Horizontal resolution.
# @return bool true in case of success.
#
def DrawObject($xres)
$len = @mValue.length;
if (($size = GetSize($xres))==0)
return false;
end
if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2);
elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size;
else $sPos = 0;
# Total height of bar code -Bars only-#
if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont);
else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2;
# Draw text#
if (@mStyle & BCS_DRAW_TEXT)
if (@mStyle & BCS_STRETCH_TEXT)
for ($i=0;$i<$len;$i++)
@DrawChar(@mFont, $sPos+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres)+($size/$len)*$i,
$ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]);
else# Center#
$text_width = GetFontWidth(@mFont)# @mValue.length;
@DrawText(@mFont, $sPos+(($size-$text_width)/2)+(2*BCD_C128_BAR_2*$xres + 3*BCD_C128_BAR_1*$xres + BCD_C128_BAR_4*$xres),
$ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue);
end
end
$cPos = 0;
$DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
do {
$c = GetCharIndex(@mValue[$cPos]);
$cset = @mCharSet[$c];
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[0], $xres) , $ysize);
$DrawPos += GetBarSize($cset[0], $xres);
$DrawPos += GetBarSize($cset[1], $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[2], $xres) , $ysize);
$DrawPos += GetBarSize($cset[2], $xres);
$DrawPos += GetBarSize($cset[3], $xres);
@DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, GetBarSize($cset[4], $xres) , $ysize);
$DrawPos += GetBarSize($cset[4], $xres);
$DrawPos += GetBarSize($cset[5], $xres);
$cPos += 1;
end while ($cPos<$len);
$DrawPos = @DrawCheckChar($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
$DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
return true;
end
}
#============================================================+
# END OF FILE
#============================================================+