Chris@441:
Chris@441: #============================================================+
Chris@441: # File name : c39object.rb
Chris@441: # Begin : 2002-07-31
Chris@441: # Last Update : 2004-12-29
Chris@441: # Author : Karim Mribti [barcode@mribti.com]
Chris@441: # : Nicola Asuni [info@tecnick.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 39 Barcode Render Class for PHP using
Chris@441: # the GD graphics library.
Chris@441: # Code 39 is an alphanumeric bar code that can
Chris@441: # encode decimal number, case alphabet and some
Chris@441: # special symbols.
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 39 Barcode Render Class.
Chris@441: # Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols.
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 39 Barcode Render Class.
Chris@441: # Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols.
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 C39Object 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 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.#$/+%";
Chris@441: @mCharSet = array (
Chris@441: # 0 # "000110100",
Chris@441: # 1 # "100100001",
Chris@441: # 2 # "001100001",
Chris@441: # 3 # "101100000",
Chris@441: # 4 # "000110001",
Chris@441: # 5 # "100110000",
Chris@441: # 6 # "001110000",
Chris@441: # 7 # "000100101",
Chris@441: # 8 # "100100100",
Chris@441: # 9 # "001100100",
Chris@441: # A # "100001001",
Chris@441: # B # "001001001",
Chris@441: # C # "101001000",
Chris@441: # D # "000011001",
Chris@441: # E # "100011000",
Chris@441: # F # "001011000",
Chris@441: # G # "000001101",
Chris@441: # H # "100001100",
Chris@441: # I # "001001100",
Chris@441: # J # "000011100",
Chris@441: # K # "100000011",
Chris@441: # L # "001000011",
Chris@441: # M # "101000010",
Chris@441: # N # "000010011",
Chris@441: # O # "100010010",
Chris@441: # P # "001010010",
Chris@441: # Q # "000000111",
Chris@441: # R # "100000110",
Chris@441: # S # "001000110",
Chris@441: # T # "000010110",
Chris@441: # U # "110000001",
Chris@441: # V # "011000001",
Chris@441: # W # "111000000",
Chris@441: # X # "010010001",
Chris@441: # Y # "110010000",
Chris@441: # Z # "011010000",
Chris@441: # - # "010000101",
Chris@441: # . # "110000100",
Chris@441: # SP# "011000100",
Chris@441: /*# # "010010100",
Chris@441: # $ # "010101000",
Chris@441: # / # "010100010",
Chris@441: # + # "010001010",
Chris@441: # % # "000101010"
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<44;$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 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:
Chris@441: for ($i=0;$i<$len;$i++)
Chris@441: if (GetCharIndex(@mValue[$i]) == -1 || @mValue[$i] == '*')
Chris@441: # The asterisk is only used as a start and stop code#
Chris@441: @mError = "C39 not include the char '".@mValue[$i]."'";
Chris@441: return false;
Chris@441: end
Chris@441: end
Chris@441:
Chris@441: # Start, Stop is 010010100 == '*' #
Chris@441: $StartSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3;
Chris@441: $StopSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3;
Chris@441: $CharSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3; # Same for all chars#
Chris@441:
Chris@441: return $CharSize# $len + $StartSize + $StopSize + # Space between chars# BCD_C39_NARROW_BAR# $xres# ($len-1);
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 '*'#
Chris@441: $narrow = BCD_C39_NARROW_BAR# $xres;
Chris@441: $wide = BCD_C39_WIDE_BAR# $xres;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441: $DrawPos += $narrow;
Chris@441: $DrawPos += $wide;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441: $DrawPos += $narrow;
Chris@441: $DrawPos += $narrow;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441: $DrawPos += $wide;
Chris@441: $DrawPos += $narrow;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441: $DrawPos += $wide;
Chris@441: $DrawPos += $narrow;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize);
Chris@441: $DrawPos += $narrow;
Chris@441: $DrawPos += $narrow; # Space between chars#
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 '*'#
Chris@441: $narrow = BCD_C39_NARROW_BAR# $xres;
Chris@441: $wide = BCD_C39_WIDE_BAR# $xres;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441: $DrawPos += $narrow;
Chris@441: $DrawPos += $wide;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441: $DrawPos += $narrow;
Chris@441: $DrawPos += $narrow;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441: $DrawPos += $wide;
Chris@441: $DrawPos += $narrow;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441: $DrawPos += $wide;
Chris@441: $DrawPos += $narrow;
Chris@441: @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize);
Chris@441: $DrawPos += $narrow;
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:
Chris@441: $narrow = BCD_C39_NARROW_BAR# $xres;
Chris@441: $wide = BCD_C39_WIDE_BAR# $xres;
Chris@441:
Chris@441: if (($size = GetSize($xres))==0)
Chris@441: return false;
Chris@441: end
Chris@441:
Chris@441: $cPos = 0;
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+($narrow*6+$wide*3)+($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)+($narrow*6+$wide*3),
Chris@441: $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue);
Chris@441: end
Chris@441: end
Chris@441:
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, ($cset[0] == '0') ? $narrow : $wide , $ysize);
Chris@441: $DrawPos += ($cset[0] == '0') ? $narrow : $wide;
Chris@441: $DrawPos += ($cset[1] == '0') ? $narrow : $wide;
Chris@441: @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[2] == '0') ? $narrow : $wide , $ysize);
Chris@441: $DrawPos += ($cset[2] == '0') ? $narrow : $wide;
Chris@441: $DrawPos += ($cset[3] == '0') ? $narrow : $wide;
Chris@441: @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[4] == '0') ? $narrow : $wide , $ysize);
Chris@441: $DrawPos += ($cset[4] == '0') ? $narrow : $wide;
Chris@441: $DrawPos += ($cset[5] == '0') ? $narrow : $wide;
Chris@441: @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[6] == '0') ? $narrow : $wide , $ysize);
Chris@441: $DrawPos += ($cset[6] == '0') ? $narrow : $wide;
Chris@441: $DrawPos += ($cset[7] == '0') ? $narrow : $wide;
Chris@441: @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[8] == '0') ? $narrow : $wide , $ysize);
Chris@441: $DrawPos += ($cset[8] == '0') ? $narrow : $wide;
Chris@441: $DrawPos += $narrow; # Space between chars#
Chris@441: $cPos += 1;
Chris@441: end while ($cPos<$len);
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: #============================================================+