annotate vendor/plugins/rfpdf/lib/barcode/c39object.rb @ 1181:27b6f53331d5 bug_320

Close obsolete branch bug_320
author Chris Cannam
date Wed, 09 Nov 2011 14:19:49 +0000
parents cbce1fd3b1b7
children
rev   line source
Chris@441 1
Chris@441 2 #============================================================+
Chris@441 3 # File name : c39object.rb
Chris@441 4 # Begin : 2002-07-31
Chris@441 5 # Last Update : 2004-12-29
Chris@441 6 # Author : Karim Mribti [barcode@mribti.com]
Chris@441 7 # : Nicola Asuni [info@tecnick.com]
Chris@441 8 # Version : 0.0.8a 2001-04-01 (original code)
Chris@441 9 # License : GNU LGPL (Lesser General Public License) 2.1
Chris@441 10 # http://www.gnu.org/copyleft/lesser.txt
Chris@441 11 # Source Code : http://www.mribti.com/barcode/
Chris@441 12 #
Chris@441 13 # Description : Code 39 Barcode Render Class for PHP using
Chris@441 14 # the GD graphics library.
Chris@441 15 # Code 39 is an alphanumeric bar code that can
Chris@441 16 # encode decimal number, case alphabet and some
Chris@441 17 # special symbols.
Chris@441 18 #
Chris@441 19 # NOTE:
Chris@441 20 # This version contains changes by Nicola Asuni:
Chris@441 21 # - porting to Ruby
Chris@441 22 # - code style and formatting
Chris@441 23 # - automatic php documentation in PhpDocumentor Style
Chris@441 24 # (www.phpdoc.org)
Chris@441 25 # - minor bug fixing
Chris@441 26 #============================================================+
Chris@441 27
Chris@441 28 #
Chris@441 29 # Code 39 Barcode Render Class.<br>
Chris@441 30 # Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols.
Chris@441 31 # @author Karim Mribti, Nicola Asuni
Chris@441 32 # @name BarcodeObject
Chris@441 33 # @package com.tecnick.tcpdf
Chris@441 34 # @@version 0.0.8a 2001-04-01 (original code)
Chris@441 35 # @since 2001-03-25
Chris@441 36 # @license http://www.gnu.org/copyleft/lesser.html LGPL
Chris@441 37 #
Chris@441 38
Chris@441 39 #
Chris@441 40 # Code 39 Barcode Render Class.<br>
Chris@441 41 # Code 39 is an alphanumeric bar code that can encode decimal number, case alphabet and some special symbols.
Chris@441 42 # @author Karim Mribti, Nicola Asuni
Chris@441 43 # @name BarcodeObject
Chris@441 44 # @package com.tecnick.tcpdf
Chris@441 45 # @@version 0.0.8a 2001-04-01 (original code)
Chris@441 46 # @since 2001-03-25
Chris@441 47 # @license http://www.gnu.org/copyleft/lesser.html LGPL
Chris@441 48 #
Chris@441 49 class C39Object extends BarcodeObject {
Chris@441 50
Chris@441 51 #
Chris@441 52 # Class Constructor.
Chris@441 53 # @param int $Width Image width in pixels.
Chris@441 54 # @param int $Height Image height in pixels.
Chris@441 55 # @param int $Style Barcode style.
Chris@441 56 # @param int $Value value to print on barcode.
Chris@441 57 #
Chris@441 58 def __construct($Width, $Height, $Style, $Value)
Chris@441 59 parent::__construct($Width, $Height, $Style);
Chris@441 60 @mValue = $Value;
Chris@441 61 @mChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-.#$/+%";
Chris@441 62 @mCharSet = array (
Chris@441 63 # 0 # "000110100",
Chris@441 64 # 1 # "100100001",
Chris@441 65 # 2 # "001100001",
Chris@441 66 # 3 # "101100000",
Chris@441 67 # 4 # "000110001",
Chris@441 68 # 5 # "100110000",
Chris@441 69 # 6 # "001110000",
Chris@441 70 # 7 # "000100101",
Chris@441 71 # 8 # "100100100",
Chris@441 72 # 9 # "001100100",
Chris@441 73 # A # "100001001",
Chris@441 74 # B # "001001001",
Chris@441 75 # C # "101001000",
Chris@441 76 # D # "000011001",
Chris@441 77 # E # "100011000",
Chris@441 78 # F # "001011000",
Chris@441 79 # G # "000001101",
Chris@441 80 # H # "100001100",
Chris@441 81 # I # "001001100",
Chris@441 82 # J # "000011100",
Chris@441 83 # K # "100000011",
Chris@441 84 # L # "001000011",
Chris@441 85 # M # "101000010",
Chris@441 86 # N # "000010011",
Chris@441 87 # O # "100010010",
Chris@441 88 # P # "001010010",
Chris@441 89 # Q # "000000111",
Chris@441 90 # R # "100000110",
Chris@441 91 # S # "001000110",
Chris@441 92 # T # "000010110",
Chris@441 93 # U # "110000001",
Chris@441 94 # V # "011000001",
Chris@441 95 # W # "111000000",
Chris@441 96 # X # "010010001",
Chris@441 97 # Y # "110010000",
Chris@441 98 # Z # "011010000",
Chris@441 99 # - # "010000101",
Chris@441 100 # . # "110000100",
Chris@441 101 # SP# "011000100",
Chris@441 102 /*# # "010010100",
Chris@441 103 # $ # "010101000",
Chris@441 104 # / # "010100010",
Chris@441 105 # + # "010001010",
Chris@441 106 # % # "000101010"
Chris@441 107 );
Chris@441 108 end
Chris@441 109
Chris@441 110 #
Chris@441 111 # Returns the character index.
Chris@441 112 # @param char $char character.
Chris@441 113 # @return int character index or -1 in case of error.
Chris@441 114 # @access private
Chris@441 115 #
Chris@441 116 def GetCharIndex($char)
Chris@441 117 for ($i=0;$i<44;$i++)
Chris@441 118 if (@mChars[$i] == $char)
Chris@441 119 return $i;
Chris@441 120 end
Chris@441 121 end
Chris@441 122 return -1;
Chris@441 123 end
Chris@441 124
Chris@441 125 #
Chris@441 126 # Returns barcode size.
Chris@441 127 # @param int $xres Horizontal resolution.
Chris@441 128 # @return barcode size.
Chris@441 129 # @access private
Chris@441 130 #
Chris@441 131 def GetSize($xres)
Chris@441 132 $len = @mValue.length;
Chris@441 133
Chris@441 134 if ($len == 0) {
Chris@441 135 @mError = "Null value";
Chris@441 136 return false;
Chris@441 137 end
Chris@441 138
Chris@441 139 for ($i=0;$i<$len;$i++)
Chris@441 140 if (GetCharIndex(@mValue[$i]) == -1 || @mValue[$i] == '*')
Chris@441 141 # The asterisk is only used as a start and stop code#
Chris@441 142 @mError = "C39 not include the char '".@mValue[$i]."'";
Chris@441 143 return false;
Chris@441 144 end
Chris@441 145 end
Chris@441 146
Chris@441 147 # Start, Stop is 010010100 == '*' #
Chris@441 148 $StartSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3;
Chris@441 149 $StopSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3;
Chris@441 150 $CharSize = BCD_C39_NARROW_BAR# $xres# 6 + BCD_C39_WIDE_BAR# $xres# 3; # Same for all chars#
Chris@441 151
Chris@441 152 return $CharSize# $len + $StartSize + $StopSize + # Space between chars# BCD_C39_NARROW_BAR# $xres# ($len-1);
Chris@441 153 end
Chris@441 154
Chris@441 155 #
Chris@441 156 # Draws the start code.
Chris@441 157 # @param int $DrawPos Drawing position.
Chris@441 158 # @param int $yPos Vertical position.
Chris@441 159 # @param int $ySize Vertical size.
Chris@441 160 # @param int $xres Horizontal resolution.
Chris@441 161 # @return int drawing position.
Chris@441 162 # @access private
Chris@441 163 #
Chris@441 164 def DrawStart($DrawPos, $yPos, $ySize, $xres)
Chris@441 165 # Start code is '*'#
Chris@441 166 $narrow = BCD_C39_NARROW_BAR# $xres;
Chris@441 167 $wide = BCD_C39_WIDE_BAR# $xres;
Chris@441 168 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441 169 $DrawPos += $narrow;
Chris@441 170 $DrawPos += $wide;
Chris@441 171 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441 172 $DrawPos += $narrow;
Chris@441 173 $DrawPos += $narrow;
Chris@441 174 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441 175 $DrawPos += $wide;
Chris@441 176 $DrawPos += $narrow;
Chris@441 177 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441 178 $DrawPos += $wide;
Chris@441 179 $DrawPos += $narrow;
Chris@441 180 @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize);
Chris@441 181 $DrawPos += $narrow;
Chris@441 182 $DrawPos += $narrow; # Space between chars#
Chris@441 183 return $DrawPos;
Chris@441 184 end
Chris@441 185
Chris@441 186 #
Chris@441 187 # Draws the stop code.
Chris@441 188 # @param int $DrawPos Drawing position.
Chris@441 189 # @param int $yPos Vertical position.
Chris@441 190 # @param int $ySize Vertical size.
Chris@441 191 # @param int $xres Horizontal resolution.
Chris@441 192 # @return int drawing position.
Chris@441 193 # @access private
Chris@441 194 #
Chris@441 195 def DrawStop($DrawPos, $yPos, $ySize, $xres)
Chris@441 196 # Stop code is '*'#
Chris@441 197 $narrow = BCD_C39_NARROW_BAR# $xres;
Chris@441 198 $wide = BCD_C39_WIDE_BAR# $xres;
Chris@441 199 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441 200 $DrawPos += $narrow;
Chris@441 201 $DrawPos += $wide;
Chris@441 202 @DrawSingleBar($DrawPos, $yPos, $narrow , $ySize);
Chris@441 203 $DrawPos += $narrow;
Chris@441 204 $DrawPos += $narrow;
Chris@441 205 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441 206 $DrawPos += $wide;
Chris@441 207 $DrawPos += $narrow;
Chris@441 208 @DrawSingleBar($DrawPos, $yPos, $wide , $ySize);
Chris@441 209 $DrawPos += $wide;
Chris@441 210 $DrawPos += $narrow;
Chris@441 211 @DrawSingleBar($DrawPos, $yPos, $narrow, $ySize);
Chris@441 212 $DrawPos += $narrow;
Chris@441 213 return $DrawPos;
Chris@441 214 end
Chris@441 215
Chris@441 216 #
Chris@441 217 # Draws the barcode object.
Chris@441 218 # @param int $xres Horizontal resolution.
Chris@441 219 # @return bool true in case of success.
Chris@441 220 #
Chris@441 221 def DrawObject($xres)
Chris@441 222 $len = @mValue.length;
Chris@441 223
Chris@441 224 $narrow = BCD_C39_NARROW_BAR# $xres;
Chris@441 225 $wide = BCD_C39_WIDE_BAR# $xres;
Chris@441 226
Chris@441 227 if (($size = GetSize($xres))==0)
Chris@441 228 return false;
Chris@441 229 end
Chris@441 230
Chris@441 231 $cPos = 0;
Chris@441 232 if (@mStyle & BCS_ALIGN_CENTER) $sPos = (integer)((@mWidth - $size ) / 2);
Chris@441 233 elsif (@mStyle & BCS_ALIGN_RIGHT) $sPos = @mWidth - $size;
Chris@441 234 else $sPos = 0;
Chris@441 235
Chris@441 236 # Total height of bar code -Bars only-#
Chris@441 237 if (@mStyle & BCS_DRAW_TEXT) $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2 - GetFontHeight(@mFont);
Chris@441 238 else $ysize = @mHeight - BCD_DEFAULT_MAR_Y1 - BCD_DEFAULT_MAR_Y2;
Chris@441 239
Chris@441 240 # Draw text#
Chris@441 241 if (@mStyle & BCS_DRAW_TEXT)
Chris@441 242 if (@mStyle & BCS_STRETCH_TEXT)
Chris@441 243 for ($i=0;$i<$len;$i++)
Chris@441 244 @DrawChar(@mFont, $sPos+($narrow*6+$wide*3)+($size/$len)*$i,
Chris@441 245 $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue[$i]);
Chris@441 246 else# Center#
Chris@441 247 $text_width = GetFontWidth(@mFont)# @mValue.length;
Chris@441 248 @DrawText(@mFont, $sPos+(($size-$text_width)/2)+($narrow*6+$wide*3),
Chris@441 249 $ysize + BCD_DEFAULT_MAR_Y1 + BCD_DEFAULT_TEXT_OFFSET, @mValue);
Chris@441 250 end
Chris@441 251 end
Chris@441 252
Chris@441 253 $DrawPos = @DrawStart($sPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
Chris@441 254 do {
Chris@441 255 $c = GetCharIndex(@mValue[$cPos]);
Chris@441 256 $cset = @mCharSet[$c];
Chris@441 257 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[0] == '0') ? $narrow : $wide , $ysize);
Chris@441 258 $DrawPos += ($cset[0] == '0') ? $narrow : $wide;
Chris@441 259 $DrawPos += ($cset[1] == '0') ? $narrow : $wide;
Chris@441 260 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[2] == '0') ? $narrow : $wide , $ysize);
Chris@441 261 $DrawPos += ($cset[2] == '0') ? $narrow : $wide;
Chris@441 262 $DrawPos += ($cset[3] == '0') ? $narrow : $wide;
Chris@441 263 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[4] == '0') ? $narrow : $wide , $ysize);
Chris@441 264 $DrawPos += ($cset[4] == '0') ? $narrow : $wide;
Chris@441 265 $DrawPos += ($cset[5] == '0') ? $narrow : $wide;
Chris@441 266 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[6] == '0') ? $narrow : $wide , $ysize);
Chris@441 267 $DrawPos += ($cset[6] == '0') ? $narrow : $wide;
Chris@441 268 $DrawPos += ($cset[7] == '0') ? $narrow : $wide;
Chris@441 269 @DrawSingleBar($DrawPos, BCD_DEFAULT_MAR_Y1, ($cset[8] == '0') ? $narrow : $wide , $ysize);
Chris@441 270 $DrawPos += ($cset[8] == '0') ? $narrow : $wide;
Chris@441 271 $DrawPos += $narrow; # Space between chars#
Chris@441 272 $cPos += 1;
Chris@441 273 end while ($cPos<$len);
Chris@441 274 $DrawPos = @DrawStop($DrawPos, BCD_DEFAULT_MAR_Y1 , $ysize, $xres);
Chris@441 275 return true;
Chris@441 276 end
Chris@441 277 }
Chris@441 278
Chris@441 279 #============================================================+
Chris@441 280 # END OF FILE
Chris@441 281 #============================================================+