
#============================================================+
# File name   : barcode.rb
# Begin       : 2002-07-31
# Last Update : 2005-01-02
# Author      : Karim Mribti [barcode@mribti.com]
# Version     : 1.1 [0.0.8a (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 : Generic Barcode Render Class for PHP using
#               the GD graphics library.
#
# 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
#  - $mCharSet and $mChars variables were added here
#============================================================+

#
# Barcode Render Class for PHP using the GD graphics library.
# @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
#

# Styles
# Global

#
# option: generate barcode border
#
define("BCS_BORDER", 1);

#
# option: use transparent background
#
define("BCS_TRANSPARENT", 2);

#
# option: center barcode
#
define("BCS_ALIGN_CENTER", 4);

#
# option: align left
#
define("BCS_ALIGN_LEFT", 8);

#
# option: align right
#
define("BCS_ALIGN_RIGHT", 16);

#
# option: generate JPEG image
#
define("BCS_IMAGE_JPEG", 32);

#
# option: generate PNG image
#
define("BCS_IMAGE_PNG", 64);

#
# option: draw text
#
define("BCS_DRAW_TEXT", 128);

#
# option: stretch text
#
define("BCS_STRETCH_TEXT", 256);

#
# option: reverse color
#
define("BCS_REVERSE_COLOR", 512);

#
# option: draw check
# (only for I25 code)
#
define("BCS_I25_DRAW_CHECK", 2048);

#
# set default background color
#
define("BCD_DEFAULT_BACKGROUND_COLOR", 0xFFFFFF);

#
# set default foreground color
#
define("BCD_DEFAULT_FOREGROUND_COLOR", 0x000000);

#
# set default style options
#
define("BCD_DEFAULT_STYLE", BCS_BORDER | BCS_ALIGN_CENTER | BCS_IMAGE_PNG);

#
# set default width
#
define("BCD_DEFAULT_WIDTH", 460);

#
# set default height
#
define("BCD_DEFAULT_HEIGHT", 120);

#
# set default font
#
define("BCD_DEFAULT_FONT", 5);

#
# st default horizontal resolution
#
define("BCD_DEFAULT_XRES", 2);

# Margins

#
# set default margin
#
define("BCD_DEFAULT_MAR_Y1", 0);

#
# set default margin
#
define("BCD_DEFAULT_MAR_Y2", 0);

#
# set default text offset
#
define("BCD_DEFAULT_TEXT_OFFSET", 2);

# For the I25 Only

#
# narrow bar option
# (only for I25 code)
#
define("BCD_I25_NARROW_BAR", 1);

#
# wide bar option
# (only for I25 code)
#
define("BCD_I25_WIDE_BAR", 2);

# For the C39 Only

#
# narrow bar option
# (only for c39 code)
#
define("BCD_C39_NARROW_BAR", 1);

#
# wide bar option
# (only for c39 code)
#
define("BCD_C39_WIDE_BAR", 2);

# For Code 128

#
# set type 1 bar
# (only for c128 code)
#
define("BCD_C128_BAR_1", 1);

#
# set type 2 bar
# (only for c128 code)
#
define("BCD_C128_BAR_2", 2);

#
# set type 3 bar
# (only for c128 code)
#
define("BCD_C128_BAR_3", 3);

#
# set type 4 bar
# (only for c128 code)
#
define("BCD_C128_BAR_4", 4);

#
# Barcode Render Class for PHP using the GD graphics library.
# @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 BarcodeObject {
	#
	# @var Image width in pixels.
	# @access protected
	#
	protected $mWidth;
	
	#
	# @var Image height in pixels.
	# @access protected
	#
	protected $mHeight;
	
	#
	# @var Numeric code for Barcode style.
	# @access protected
	#
	protected $mStyle;
	
	#
	# @var Background color.
	# @access protected
	#
	protected $mBgcolor;
	
	#
	# @var Brush color.
	# @access protected
	#
	protected $mBrush;
	
	#
	# @var Image object.
	# @access protected
	#
	protected $mImg;
	
	#
	# @var Numeric code for character font.
	# @access protected
	#
	protected $mFont;
	
	#
	# @var Error message.
	# @access protected
	#
	protected $mError;
	
	#
	# @var Character Set.
	# @access protected
	#
	protected $mCharSet;
	
	#
	# @var Allowed symbols.
	# @access protected
	#
	protected $mChars;

	#
	# Class Constructor.
	# @param int $Width Image width in pixels.
	# @param int $Height Image height in pixels. 
	# @param int $Style Barcode style.
	#
	def __construct($Width=BCD_DEFAULT_WIDTH, $Height=BCD_DEFAULT_HEIGHT, $Style=BCD_DEFAULT_STYLE)
		@mWidth = $Width;
		@mHeight = $Height;
		@mStyle = $Style;
		@mFont = BCD_DEFAULT_FONT;
		@mImg = ImageCreate(@mWidth, @mHeight);
		$dbColor = @mStyle & BCS_REVERSE_COLOR ? BCD_DEFAULT_FOREGROUND_COLOR : BCD_DEFAULT_BACKGROUND_COLOR;
		$dfColor = @mStyle & BCS_REVERSE_COLOR ? BCD_DEFAULT_BACKGROUND_COLOR : BCD_DEFAULT_FOREGROUND_COLOR;
		@mBgcolor = ImageColorAllocate(@mImg, ($dbColor & 0xFF0000) >> 16,
		($dbColor & 0x00FF00) >> 8, $dbColor & 0x0000FF);
		@mBrush = ImageColorAllocate(@mImg, ($dfColor & 0xFF0000) >> 16,
		($dfColor & 0x00FF00) >> 8, $dfColor & 0x0000FF);
		if (!(@mStyle & BCS_TRANSPARENT))
			ImageFill(@mImg, @mWidth, @mHeight, @mBgcolor);
		end
	end
	
	#
	# Class Destructor.
	# Destroy image object.
	#
	def __destructor()
		@DestroyObject();
	end

	#
	# Returns the image object.
	# @return object image.
	# @author Nicola Asuni
	# @since 1.5.2
	#
	def getImage()
		return @mImg;
	end
	
	#
	# Abstract method used to draw the barcode image.
	# @param int $xres Horizontal resolution.
	#
	def DrawObject($xres)	{
		# there is not implementation neded, is simply the asbsract function.#
		return false;
	end
	
	#
	# Draws the barcode border.
	# @access protected
	#
	protected function DrawBorder()
		ImageRectangle(@mImg, 0, 0, @mWidth-1, @mHeight-1, @mBrush);
	end
	
	#
	# Draws the alphanumeric code.
	# @param int $Font Font type.
	# @param int $xPos Horiziontal position.
	# @param int $yPos Vertical position.
	# @param int $Char Alphanumeric code to write.
	# @access protected
	#
	protected function DrawChar($Font, $xPos, $yPos, $Char)
		ImageString(@mImg,$Font,$xPos,$yPos,$Char,@mBrush);
	end
	
	#
	# Draws a character string.
	# @param int $Font Font type.
	# @param int $xPos Horiziontal position.
	# @param int $yPos Vertical position.
	# @param int $Char string to write.
	# @access protected
	#
	protected function DrawText($Font, $xPos, $yPos, $Char)
		ImageString(@mImg,$Font,$xPos,$yPos,$Char,@mBrush);
	end

	#
	# Draws a single barcode bar.
	# @param int $xPos Horiziontal position.
	# @param int $yPos Vertical position.
	# @param int $xSize Horizontal size.
    # @param int $xSize Vertical size.
    # @return bool trur in case of success, false otherwise.
    # @access protected
	#
	protected function DrawSingleBar($xPos, $yPos, $xSize, $ySize)
		if ($xPos>=0 && $xPos<=@mWidth && ($xPos+$xSize)<=@mWidth &&
		$yPos>=0 && $yPos<=@mHeight && ($yPos+$ySize)<=@mHeight)
			for ($i=0;$i<$xSize;$i++)
				ImageLine(@mImg, $xPos+$i, $yPos, $xPos+$i, $yPos+$ySize, @mBrush);
			end
			return true;
		end
		return false;
	end
	
	#
	# Returns the current error message.
	# @return string error message.
	#
	def GetError()
		return @mError;
	end
	
	#
	# Returns the font height.
	# @param int $font font type.
	# @return int font height.
	#
	def GetFontHeight($font)
		return ImageFontHeight($font);
	end
	
	#
	# Returns the font width.
	# @param int $font font type.
	# @return int font width.
	#
	def GetFontWidth($font)
		return ImageFontWidth($font);
	end
	
	#
	# Set font type.
	# @param int $font font type.
	#
	def SetFont($font)
		@mFont = $font;
	end
	
	#
	# Returns barcode style.
	# @return int barcode style.
	#
	def GetStyle()
		return @mStyle;
	end

	#
	# Set barcode style.
	# @param int $Style barcode style.
	#
	def SetStyle ($Style)
		@mStyle = $Style;
	end

	#
	# Flush the barcode image.
	#
	def FlushObject()
		if ((@mStyle & BCS_BORDER))
			@DrawBorder();
		end
		if (@mStyle & BCS_IMAGE_PNG)
			Header("Content-Type: image/png");
			ImagePng(@mImg);
		elsif (@mStyle & BCS_IMAGE_JPEG)
			Header("Content-Type: image/jpeg");
			ImageJpeg(@mImg);
		end
	end
	
	#
	# Destroy the barcode image.
	#
	def DestroyObject()
		ImageDestroy(@mImg);
	end
}

#============================================================+
# END OF FILE
#============================================================+
