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