! *********************************************************************** ! MDL 01/93 P C L . B A S ! ! ! Martin D. Lucas ! Allied Electronics, Inc. ! Fort Worth, TX 76118 ! (817) 595-3500 ! ! Copyright (C) 1993 Martin D. Lucas ! ! DISCLAIMER AND LICENSE AGREEMENT: ! ! Permission is hereby granted for distribution of copies of this set of ! software, under the following license conditions: ! ! 1. You may distribute this software with or without additions, providing ! that all copyright notices remain attached. Any alterations, additions, ! or deletions to the original source must properly noted. ! ! 2. In addition, you may not under any circumstances omit any of the ! copyright notices from either the source files, executables, ! or documentation as provided by the original author. ! ! 3. Any users of this software must be notified that it is without ! warranty or guarantee of any nature, expressed or implied. Use this ! software at your own risk. No responsibility is represented by the ! author, DECUS, or Allied Electronics, Inc., in regards to this software. ! There is no guarantee that use of this software will not cause ! damage to your system, loss of sleep, or gnashing of teeth. Of ! course, this is not likely or expected...but in the event, the ! author cannot be held liable for any damages either directly ! or indirectly caused by this event. ! ! 4. This software has been provided as public domain and is intended to ! help other users. Documentation is limited. This software is ! provided - free of charge - and may not be sold or included in any ! software that is to be sold. ! ! NOTE: This software uses escape sequences that are intended for use with ! the Hewlett-Packard series of laser printers. For more information ! on use of PCL escape sequences, consult the PCL5 Printer Language ! Technical Reference Manual. PCL is a registered U.S. trademark of ! Hewlett-Packard Company. ! ! *********************************************************************** ! This file contains a collection of string functions that return ! appropriate HP PCL5 code sequences. I had a need for drawing boxes, ! lines, shading, and text positioning and couldn't find any available ! support routines for the like....except complete packages for a pc. ! I also added some primitive support for raster graphics. Those routines ! are attached...but are barely tested. I also 'threw' together a few ! functions for manipulating these bitmaps. ! *********************************************************************** ! *********************************************************************** ! PCL_Init_Page - Perform initialization sequences for a new page. ! *********************************************************************** FUNCTION STRING PCL_Init_Page OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Init_Page = ESC + "E" + ESC + "&l0S" + ESC + "*r0F" + ESC + & "&l0O" + ESC + "&l5H" + ESC + "&l2a4d1e42F" + & ESC + "*t300R" + ESC + "*b0M" + CHR$(13) END FUNCTION ! *********************************************************************** ! PCL_Draw_Horizontal - Draw a line on the Y axis from X_Start to ! X_End ! *********************************************************************** FUNCTION STRING PCL_Draw_Horizontal( LONG Y_Position, & LONG X_Start, & LONG X_End, & LONG Line_Thickness, & LONG Shade) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER DECLARE STRING Temp_String ! Set the Y coordinate Temp_String = ESC + "*p" + NUM1$(Y_Position)+"Y" ! Add the X coordinate Temp_String = Temp_String + ESC + "*p" + NUM1$(X_Start) + "X" ! Add the line length Temp_String = Temp_String + ESC + "*c" + NUM1$(X_End-X_Start) + "A" ! Add the line width Temp_String = Temp_String + ESC + "*c" + NUM1$(Line_Thickness) + "B" ! Add the shade option (100% DEFAULT) IF Shade <= 0 OR SHADE >= 100 THEN Temp_String = Temp_String + ESC + "*c100G" ELSE Temp_String = Temp_String + ESC + "*c" + NUM1$(Shade) + "G" END IF ! Add the fill command Temp_String = Temp_String + ESC + "*c2P" PCL_Draw_Horizontal = Temp_String END FUNCTION ! *********************************************************************** ! PCL_Draw_Vertical_Line - Draw a vertical line on the X axis from ! Y_Start to Y_End ! *********************************************************************** FUNCTION STRING PCL_Draw_Vertical( LONG X_Position, & LONG Y_Start, & LONG Y_End, & LONG Line_Thickness, & LONG Shade) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER DECLARE STRING Temp_String ! Set the X coordinate Temp_String = ESC + "*p" + NUM1$(X_Position) + "X" ! Add the Y coordinate Temp_String = Temp_String + ESC + "*p" + NUM1$(Y_Start)+"Y" ! Add the line length Temp_String = Temp_String + ESC + "*c" + NUM1$(Line_Thickness)+"A" ! Add the line width Temp_String = Temp_String + ESC + "*c" + NUM1$(Y_End-Y_Start)+"B" ! Add the shade option (100% DEFAULT) IF Shade <= 0 OR SHADE >= 100 THEN Temp_String = Temp_String + ESC + "*c100G" ELSE Temp_String = Temp_String + ESC + "*c" + NUM1$(Shade) + "G" END IF ! Add the fill command Temp_String = Temp_String + ESC + "*c2P" PCL_Draw_Vertical = Temp_String END FUNCTION ! *********************************************************************** ! PCL_Draw_Rectangle - Draw a box starting at (X,Y) using a specified ! width, and height. Border width optional. ! Shading optional. See the PCL guide for the ! fill commands. ! *********************************************************************** FUNCTION STRING PCL_Draw_Rectangle( LONG Y_Position, & LONG X_Position, & LONG Width, & LONG Height, & LONG Fill_Shade, & LONG Fill_Command, & LONG Border_Width, & LONG Line_Shade) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER EXTERNAL STRING FUNCTION PCL_Draw_Horizontal, & PCL_Draw_Vertical DECLARE STRING Temp_String ! Make the border around this box ! Horizontal lines Temp_String = PCL_Draw_Horizontal(Y_Position,X_Position,X_Position+Width,Border_Width,Line_Shade) Temp_String = Temp_String + PCL_Draw_Horizontal(Y_Position+Height,X_Position,X_Position+Width,Border_Width,Line_Shade) ! Vertical lines Temp_String = Temp_String + PCL_Draw_Vertical(X_Position,Y_Position,Y_Position+Height,Border_Width,Line_Shade) Temp_String = Temp_String + PCL_Draw_Vertical(X_Position+Width-Border_Width,Y_Position,Y_Position+Height,Border_Width,Line_Shade) ! If the user wants this box filled, then do it IF Fill_Command > 0 THEN ! Set the Y coordinate Temp_String = Temp_String + ESC + "*p" + NUM1$(Y_Position+Border_Width)+"Y" ! Add the X coordinate Temp_String = Temp_String + ESC + "*p" + NUM1$(X_Position+Border_Width)+"X" ! Add the rectangle width Temp_String = Temp_String + ESC + "*c" + NUM1$(Width-(2*Border_Width))+"A" ! Add the rectangle height Temp_String = Temp_String + ESC + "*c" + NUM1$(Height-Border_Width)+"B" ! Add the rectangle shade option Temp_String = Temp_String + ESC + "*c" + NUM1$(Fill_Shade)+"G" ! Add the fill command Temp_String = Temp_String + ESC + "*c" + NUM1$(Fill_Command)+ "P" END IF ! Return the generated result PCL_Draw_Rectangle = Temp_String END FUNCTION ! *********************************************************************** ! PCL_Position_Text - Position a text screen starting at an absolute ! (x,y) coordinate on the page. ! *********************************************************************** FUNCTION STRING PCL_Position_Text( LONG Y_Position, & LONG X_Position, & STRING Text_String) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER DECLARE STRING Temp_String Temp_String = ESC + "*p" + NUM1$(Y_Position) + "Y" Temp_String = Temp_String + ESC + "*p" + NUM1$(X_Position) + "X" Temp_String = Temp_String + Text_String PCL_Position_Text = Temp_String END FUNCTION ! *********************************************************************** ! PCL_Position_Cursor - Position cursor starting at an absolute ! (x,y) coordinate on the page. ! *********************************************************************** FUNCTION STRING PCL_Position_Cursor( LONG Y_Position, & LONG X_Position) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER DECLARE STRING Temp_String Temp_String = ESC + "*p" + NUM1$(Y_Position) + "Y" Temp_String = Temp_String + ESC + "*p" + NUM1$(X_Position) + "X" PCL_Position_Cursor = Temp_String END FUNCTION ! *********************************************************************** ! PCL_Print_Direction - Selects a n degree print direction ! *********************************************************************** FUNCTION STRING PCL_Print_Direction( LONG N_Degrees) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Print_Direction = ESC + "&a"+NUM1$(N_Degrees)+"P" END FUNCTION ! *********************************************************************** ! PCL_Copies_Per_Page - Selects number of copies of each page ! *********************************************************************** FUNCTION STRING PCL_Copies_Per_Page(LONG I) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Copies_Per_Page = ESC + "&l"+NUM1$(I)+"X" END FUNCTION ! *********************************************************************** ! PCL_Left_Offset_Registration - Adjusts logical page across page width ! *********************************************************************** FUNCTION STRING PCL_Left_Offset_Registration(LONG I) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Left_Offset_Registration = ESC + "&l"+NUM1$(I)+"U" END FUNCTION ! *********************************************************************** ! PCL_Top_Offset_Registration - Adjusts logical page across page length ! *********************************************************************** FUNCTION STRING PCL_Top_Offset_Registration(LONG I) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Top_Offset_Registration = ESC + "&l"+NUM1$(I)+"Z" END FUNCTION ! *********************************************************************** ! PCL_Line_Spacing - Selects number of lines per inch spacing ! *********************************************************************** FUNCTION STRING PCL_Line_Spacing(LONG Lpi) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Line_Spacing = ESC + "&l"+NUM1$(Lpi)+"D" END FUNCTION ! *********************************************************************** ! PCL_Select_Input_Source - Selects a paper input source ! *********************************************************************** FUNCTION STRING PCL_Select_Input_Source(LONG I_Source) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Select_Input_Source = ESC + "&l"+NUM1$(I_Source)+"H" END FUNCTION ! *********************************************************************** ! PCL_Select_Page_Size - Selects a paper type ! *********************************************************************** FUNCTION STRING PCL_Select_Page_Size(LONG I) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Select_Page_Size = ESC + "&l"+NUM1$(I)+"A" END FUNCTION ! *********************************************************************** ! PCL_Select_Print_Mode - Selects simplex or duplex modes ! *********************************************************************** FUNCTION STRING PCL_Select_Print_Mode(LONG I) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Select_Print_Mode = ESC + "&l"+NUM1$(I)+"S" END FUNCTION ! *********************************************************************** ! PCL_Select_Orientation - Selects a print orientation ! *********************************************************************** FUNCTION STRING PCL_Select_Orientation(LONG I) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Select_Orientation = ESC + "&l"+NUM1$(I)+"O" END FUNCTION ! *********************************************************************** ! PCL_Use_Font Selects a font based on font number, point size, and ! style. (Documented in the PCL reference manual) ! *********************************************************************** FUNCTION STRING PCL_Use_Font( LONG Font_Number, & LONG Point_Size, & LONG Weight, & LONG Style) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Use_Font = ESC + "(s" + & NUM1$(Font_Number) + "t" + & NUM1$(Weight) + "b" + & NUM1$(Style) + "s" + & NUM1$(Point_Size) + & "v1P" END FUNCTION ! *********************************************************************** ! PCL_Draw_Page_Border - Very simply makes a call to PCL_Draw_Rectangle ! using the page dimensions. (300dpi assumed) ! *********************************************************************** FUNCTION STRING PCL_Draw_Page_Border OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER %INCLUDE "OE$SOURCE:PCL.DEF" EXTERNAL STRING FUNCTION PCL_Draw_Rectangle PCL_Draw_Page_Border = PCL_Draw_Rectangle(Y_Origin, & X_Origin, & X_Limit-1, & Y_Limit, & 0,2,1,00) END FUNCTION ! *********************************************************************** ! PCL_Grid_Sheet - Make a graph paperlike grid that can be overlayed on ! a page. - useful for making layouts or making them ! neater. ! *********************************************************************** FUNCTION STRING PCL_Grid_Sheet OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER EXTERNAL STRING FUNCTION PCL_Draw_Horizontal, & PCL_Draw_Vertical, & PCL_Draw_Page_Border DECLARE STRING Temp_String DECLARE LONG Loop ! Draw the edges of the print area Temp_String = PCL_Draw_Page_Border ! Draw the horizontal grid lines every 100, 50% shaded every other FOR Loop = 50 TO 3050 STEP 100 Temp_String = Temp_String + PCL_Draw_Horizontal( Loop,0,2399,1,50) Temp_String = Temp_String + PCL_Draw_Horizontal( Loop+50,0,2399,1,100) NEXT Loop ! Draw the vertical grid lines every 100, 50% shaded every other FOR Loop = 50 TO 2350 STEP 100 Temp_String = Temp_String + PCL_Draw_Vertical( Loop,0,3150,1,50) Temp_String = Temp_String + PCL_Draw_Vertical( Loop+50,0,3150,1,100) NEXT Loop ! Return PCL_Grid_Sheet = Temp_String END FUNCTION ! *********************************************************************** ! PCL_Emulate_Postnet - Generates a PCL sequence to emulate postnet ! barcode. Does not use barcode fonts. with the ! left bottom edge of the barcode starting at the ! specified coordinate. ! *********************************************************************** FUNCTION STRING PCL_Emulate_Postnet(STRING Zip_String, LONG X, LONG Y) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER EXTERNAL STRING FUNCTION PCL_Draw_Vertical DECLARE LONG CONSTANT PN_Spacing=14, & PN_Bar_Thickness=4 DECLARE STRING CONSTANT Zero = "11000", & One = "00011", & Two = "00101", & Three = "00110", & Four = "01001", & Five = "01010", & Six = "01100", & Seven = "10001", & Eight = "10010", & Nine = "10100" DECLARE STRING PN_String, & PN_Zip_String, & Temp_String DECLARE LONG Loop, & Height, & Check_Digit, & Sum_Of_Digits, & Error_Status IF LEN(EDIT$(Zip_String,6%)) = 5 OR LEN(EDIT$(Zip_String,6%)) = 9 THEN ! Add the start mark PN_String = "1" Sum_Of_Digits = 0 Error_Status = 0 FOR Loop = 1 TO LEN(Zip_String) WHEN ERROR IN Sum_Of_Digits = Sum_Of_Digits + VAL%(SEG$(Zip_String,Loop,Loop)) USE Error_Status = -1 END WHEN NEXT Loop IF NOT Error_Status THEN ! Add the check digit IF LEN(NUM1$(Sum_Of_Digits)) > 1 THEN Check_Digit = VAL%(SEG$(Num1$(Sum_Of_Digits),2,2)) ELSE Check_Digit = VAL%(SEG$(Num1$(Sum_Of_Digits),1,1)) END IF Check_Digit = 10 - Check_Digit Check_Digit = 0 IF Check_Digit = 10 PN_Zip_String = Zip_String + NUM1$(Check_Digit) FOR Loop = 1 TO LEN(PN_Zip_String) SELECT SEG$(PN_Zip_String,Loop,Loop) CASE "0" PN_String = PN_String + Zero CASE "1" PN_String = PN_String + One CASE "2" PN_String = PN_String + Two CASE "3" PN_String = PN_String + Three CASE "4" PN_String = PN_String + Four CASE "5" PN_String = PN_String + Five CASE "6" PN_String = PN_String + Six CASE "7" PN_String = PN_String + Seven CASE "8" PN_String = PN_String + Eight CASE "9" PN_String = PN_String + Nine END SELECT NEXT Loop ! Add end mark PN_String = PN_String + "1" Temp_String = "" FOR Loop = 1 TO LEN(PN_String) IF SEG$(PN_String,Loop,Loop) = "1" THEN Height = 40 ELSE Height = 20 END IF Temp_String = Temp_String + & PCL_Draw_Vertical(X,Y-Height,Y,PN_Bar_Thickness,100) X = X + PN_Spacing NEXT Loop PCL_Emulate_Postnet = Temp_String ELSE PCL_Emulate_Postnet = "" END IF ELSE PCL_Emulate_Postnet = "" END IF END FUNCTION ! *********************************************************************** ! PCL_Postnet_Barcode - Generates a PCL sequence to print postnet ! barcode. Uses the USPS barcode font from an ! optional cartridge. If you don't have it, use ! PCL_Emulate_Postnet instead. ! *********************************************************************** FUNCTION STRING PCL_Postnet_Barcode(STRING Zip_String, LONG X, LONG Y) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER DECLARE LONG Check_Digit, & Sum_Of_Digits, & Error_Status, & Loop DECLARE STRING Temp_String EXTERNAL STRING FUNCTION PCL_Position_Text IF LEN(EDIT$(Zip_String,6%)) = 5 OR LEN(EDIT$(Zip_String,6%)) = 9 THEN Error_Status = 0 FOR Loop = 1 TO LEN(Zip_String) WHEN ERROR IN Sum_Of_Digits = Sum_Of_Digits + VAL%(SEG$(Zip_String,Loop,Loop)) USE Error_Status = -1 END WHEN NEXT Loop IF NOT Error_Status THEN IF LEN(NUM1$(Sum_Of_Digits)) > 1 THEN Check_Digit = VAL%(SEG$(Num1$(Sum_Of_Digits),2,2)) ELSE Check_Digit = VAL%(SEG$(Num1$(Sum_Of_Digits),1,1)) END IF Check_Digit = 10 - Check_Digit Check_Digit = 0 IF Check_Digit = 10 PCL_Postnet_Barcode = ESC + "(15Y" + ESC + "(s1p12v0s0b0T" + & PCL_Position_Text(Y,X,EDIT$("*"+Zip_String+NUM1$(Check_Digit)+"*",6%)) + & ESC + "(8U" ELSE PCL_Postnet_Barcode = "" END IF ELSE PCL_Postnet_Barcode = "" END IF END FUNCTION ! *********************************************************************** ! PCL_Emulate_3_of_9 - Print barcode at specified coordinate ! *********************************************************************** FUNCTION STRING PCL_Emulate_3_of_9(STRING Data_String, & LONG Height, LONG X, LONG Y) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER EXTERNAL STRING FUNCTION PCL_Draw_Vertical DECLARE LONG CONSTANT Bar_Spacing=4, & Bar_Thickness=4, & Bar_Length=50 DECLARE STRING CONSTANT Zero = "00 110", & One = "10 001", & Two = "01 001", & Three = "11 000", & Four = "00 101", & Five = "10 100", & Six = "01 100", & Seven = "00 011", & Eight = "10 010", & Nine = "01 010", & Star = "0 0110", & Letter_A = "100 01", & Letter_B = "010 01", & Letter_C = "110 00", & Letter_D = "001 01", & Letter_E = "101 00", & Letter_F = "011 00", & Letter_G = "000 11", & Letter_H = "100 10", & Letter_I = "010 10", & Letter_J = "001 10", & Letter_K = "1000 1", & Letter_L = "0100 1", & Letter_M = "1100 0", & Letter_N = "0010 1", & Letter_O = "1010 0", & Letter_P = "0110 0", & Letter_Q = "0001 1", & Letter_R = "1001 0", & Letter_S = "0101 0", & Letter_T = "0011 0", & Letter_U = "1 0001", & Letter_V = "0 1001", & Letter_W = "1 1000", & Letter_X = "0 0101", & Letter_Y = "1 0100", & Letter_Z = "0 1100", & Dollar_Sign = "0 0 0 00", & Percent_Sign = "00 0 0 0", & Plus_Sign = "0 00 0 0", & Comma = "0 1010", & Dash = "0 0011", & Period = "1 0010", & Slash = "0 0 00 0" DECLARE STRING PN_String, & Temp_String DECLARE LONG Loop PN_String = "" FOR Loop = 1 TO LEN(Data_String) SELECT SEG$(Data_String,Loop,Loop) CASE "0" PN_String = PN_String + Zero CASE "1" PN_String = PN_String + One CASE "2" PN_String = PN_String + Two CASE "3" PN_String = PN_String + Three CASE "4" PN_String = PN_String + Four CASE "5" PN_String = PN_String + Five CASE "6" PN_String = PN_String + Six CASE "7" PN_String = PN_String + Seven CASE "8" PN_String = PN_String + Eight CASE "9" PN_String = PN_String + Nine CASE "A" PN_String = PN_String + Letter_A CASE "B" PN_String = PN_String + Letter_B CASE "C" PN_String = PN_String + Letter_C CASE "D" PN_String = PN_String + Letter_D CASE "E" PN_String = PN_String + Letter_E CASE "F" PN_String = PN_String + Letter_F CASE "G" PN_String = PN_String + Letter_G CASE "H" PN_String = PN_String + Letter_H CASE "I" PN_String = PN_String + Letter_I CASE "J" PN_String = PN_String + Letter_J CASE "K" PN_String = PN_String + Letter_K CASE "L" PN_String = PN_String + Letter_L CASE "M" PN_String = PN_String + Letter_M CASE "N" PN_String = PN_String + Letter_N CASE "O" PN_String = PN_String + Letter_O CASE "P" PN_String = PN_String + Letter_P CASE "Q" PN_String = PN_String + Letter_Q CASE "R" PN_String = PN_String + Letter_R CASE "S" PN_String = PN_String + Letter_S CASE "T" PN_String = PN_String + Letter_T CASE "U" PN_String = PN_String + Letter_U CASE "V" PN_String = PN_String + Letter_V CASE "W" PN_String = PN_String + Letter_W CASE "X" PN_String = PN_String + Letter_X CASE "Y" PN_String = PN_String + Letter_Y CASE "Z" PN_String = PN_String + Letter_Z CASE "$" PN_String = PN_String + Dollar_Sign CASE "%" PN_String = PN_String + Percent_Sign CASE "+" PN_String = PN_String + Plus_Sign CASE "," PN_String = PN_String + Comma CASE "-" PN_String = PN_String + Dash CASE "." PN_String = PN_String + Period CASE "/" PN_String = PN_String + Slash CASE "*" PN_String = PN_String + Star END SELECT NEXT Loop Temp_String = "" Height = 1 IF (Height < 1) OR (Height > 10) FOR Loop = 1 TO LEN(PN_String) IF SEG$(PN_String,Loop,Loop) = "0" THEN Temp_String = Temp_String + & PCL_Draw_Vertical(X,Y-(Bar_Length*Height),Y,Bar_Thickness,100) X = X + Bar_Thickness + Bar_Spacing ELSE IF SEG$(PN_String,Loop,Loop) = "1" THEN Temp_String = Temp_String + & PCL_Draw_Vertical(X,Y-(Bar_Length*Height),Y,(Bar_Thickness*2)+2,100) X = X + (Bar_Thickness * 2) + Bar_Spacing + 2 ELSE X = X + (Bar_Thickness * 2) + Bar_Spacing - 2 END IF END IF NEXT Loop PCL_Emulate_3_of_9 = Temp_String END FUNCTION ! *********************************************************************** ! PCL_3_of_9 - Produce 3 of 9 barcode using barcode fonts ! *********************************************************************** FUNCTION STRING PCL_3_of_9(STRING Data_String, LONG X, LONG Y) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER EXTERNAL STRING FUNCTION PCL_Position_Text IF Data_String > "" THEN PCL_3_of_9 = ESC + "(0Y" + ESC + "(s0p4.6h12v0s0b0T" + & PCL_Position_Text(Y,X,Data_String) + & ESC + "(8U" ELSE PCL_3_of_9 = "" END IF END FUNCTION ! *********************************************************************** ! PCL_Draw_Circle - Uses line drawing functions to compute and draw a ! circle. ! *********************************************************************** SUB PCL_Draw_Circle( LONG X_Center, & LONG Y_Center, & LONG Diameter) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER OPTION ANGLE = RADIANS %INCLUDE "PCL.DEF" EXTERNAL STRING FUNCTION PCL_Draw_Vertical, & PCL_Draw_Horizontal DECLARE STRING Temp_String DECLARE LONG Loop DECLARE SINGLE Turn DECLARE LONG X(6600),Y(6600) DECLARE LONG Point_Base, & X_Max, & Y_Max X_Max = 0 Y_Max = 0 Diameter = 1 IF Diameter < 1 Diameter = 44 IF Diameter > 44 Point_Base = Diameter * 150 FOR Loop = 0 to Point_Base Turn = 2 * PI * Loop/Point_Base X(Loop) = INT(((SIN(Turn)+1)/2)*(50*Diameter)) Y(Loop) = INT(((COS(Turn)+1)/2)*(50*Diameter)) X_Max = X(Loop) IF X(Loop) > X_Max Y_Max = Y(Loop) IF Y(Loop) > Y_Max NEXT Loop Temp_String = "" For Loop = 0 to Point_Base - 1 Print #11, PCL_Draw_Horizontal(Y_Center-Y(Loop)+(Y_Max/2),X_Center-X(Loop)+(X_Max/2),X_Center-X(Loop+1)+(X_Max/2),1,100) Print #11, PCL_Draw_Vertical(X_Center-X(Loop)+(X_Max/2),Y_Center-Y(Loop)+(Y_Max/2),Y_Center-Y(Loop+1)+(Y_Max/2),1,100) NEXT Loop END SUB ! *********************************************************************** ! PCL_Raster_Mode - Select raster graphics mode ! *********************************************************************** FUNCTION STRING PCL_Raster_Mode( LONG Raster_Mode) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Mode = ESC + "*r" + NUM1$(Raster_Mode) + "F" END FUNCTION ! *********************************************************************** ! PCL_Raster_Height - Specify raster height ! *********************************************************************** FUNCTION STRING PCL_Raster_Height( LONG Raster_Height) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Height = ESC + "*r" + NUM1$(Raster_Height) + "T" END FUNCTION ! *********************************************************************** ! PCL_Raster_Width - Specify raster width ! *********************************************************************** FUNCTION STRING PCL_Raster_Width( LONG Raster_Width) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Width = ESC + "*r" + NUM1$(Raster_Width) + "S" END FUNCTION ! *********************************************************************** ! PCL_Raster_Command - Specify raster command ! *********************************************************************** FUNCTION STRING PCL_Raster_Command( LONG Raster_Command) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Command = ESC + "*r" + NUM1$(Raster_Command) + "A" END FUNCTION ! *********************************************************************** ! PCL_Raster_Resolution - Specify raster resolution ! *********************************************************************** FUNCTION STRING PCL_Raster_Resolution( LONG Raster_Resolution) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Resolution = ESC + "*t" + NUM1$(Raster_Resolution) + "R" END FUNCTION ! *********************************************************************** ! PCL_Raster_Y_Offset - Specify raster offset ! *********************************************************************** FUNCTION STRING PCL_Raster_Y_Offset( LONG Raster_Offset) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Y_Offset = ESC + "*b" + NUM1$(Raster_Offset) + "Y" END FUNCTION ! *********************************************************************** ! PCL_Raster_Compression - Specify raster compression mode ! *********************************************************************** FUNCTION STRING PCL_Raster_Compression( LONG Raster_Compression) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Compression = ESC + "*b" + NUM1$(Raster_Compression) + "M" END FUNCTION ! *********************************************************************** ! PCL_Raster_Repeat - Repeat raster row ! *********************************************************************** FUNCTION STRING PCL_Raster_Repeat OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Repeat = ESC + "*b0W" END FUNCTION ! *********************************************************************** ! PCL_Raster_Zero_Row - Print a zeroed raster row ! *********************************************************************** FUNCTION STRING PCL_Raster_Zero_Row OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_Zero_Row = ESC + "*b1Y" END FUNCTION ! *********************************************************************** ! PCL_Raster_Data - Repeat raster row ! *********************************************************************** FUNCTION STRING PCL_Raster_Unencoded_Data(LONG Byte_Count, & LONG Raster_Data(), & LONG Expand_Flag) OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER DECLARE LONG Loop,Y1,Y2,E1,E2 DECLARE STRING Temp_String, Temp_String_2 IF Expand_Flag = 0 THEN Temp_String = ESC + "*b" + NUM1$(Byte_Count) + "W" ELSE Temp_String = ESC + "*b" + NUM1$(Byte_Count*2) + "W" Temp_String_2 = Temp_String END IF FOR Loop = 0 TO UBOUND(Raster_Data) IF Expand_Flag = 0 THEN Temp_String = Temp_String + CHR$(Raster_Data(Loop)) ELSE CALL Expand_Bitmap(Raster_Data(Loop),Y1,Y2) Temp_String = Temp_String + CHR$(Y1) + CHR$(Y2) Temp_String_2 = Temp_String_2 + CHR$(Y1) + CHR$(Y2) END IF NEXT Loop PCL_Raster_Unencoded_Data = Temp_String + Temp_String_2 END FUNCTION ! *********************************************************************** ! PCL_Raster_End - End raster graphics ! *********************************************************************** FUNCTION STRING PCL_Raster_End OPTION TYPE=EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE = INTEGER PCL_Raster_End = ESC + "*rB" END FUNCTION ! *********************************************************************** ! The following support routines are for altering bitmaps ! *********************************************************************** ! *********************************************************************** ! Bit_Compare - Checks to see if a given bit is set and returns a ! character 1 or 0 reflecting its state. ! *********************************************************************** FUNCTION STRING Bit_Compare (LONG X, Y) OPTION TYPE = EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE=INTEGER IF (X AND Y) THEN Bit_Compare = "1" ELSE Bit_Compare = "0" END IF END FUNCTION ! *********************************************************************** ! String_To_Byte - Takes a string of 8 0s or 1s and converts it into ! a single byte representation. ! *********************************************************************** FUNCTION LONG String_to_Byte(STRING A) OPTION TYPE = EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE=INTEGER DECLARE LONG Loop, X X = 0 FOR Loop = 1 TO 8 IF SEG$(A,Loop,Loop) = "1" THEN X = X + (2**(8-Loop)) END IF NEXT Loop String_To_Byte = X END FUNCTION ! *********************************************************************** ! Expand_Bitmap - Stretches a raster bitmap. Result is two bytes ! (11000000 --> 11110000 00000000) ! *********************************************************************** SUB Expand_Bitmap (LONG X,Y1,Y2) OPTION TYPE = EXPLICIT, & SIZE = (REAL DOUBLE, INTEGER LONG), & CONSTANT TYPE=INTEGER DECLARE STRING A,B1,B2 DECLARE LONG Loop EXTERNAL STRING FUNCTION Bit_Compare EXTERNAL LONG FUNCTION String_To_Byte A = "" A = Bit_Compare(X,128) + Bit_Compare(X,64) + Bit_Compare(X,32) + & Bit_Compare(X,16) + Bit_Compare(X,8) + Bit_Compare(X,4) + & Bit_Compare(X,2) + Bit_Compare(X,1) B1 = "" FOR Loop = 1 TO 4 B1 = B1 + SEG$(A,Loop,Loop) + SEG$(A,Loop,Loop) NEXT Loop B2 = "" FOR Loop = 5 TO 8 B2 = B2 + SEG$(A,Loop,Loop) + SEG$(A,Loop,Loop) NEXT Loop Y1 = String_To_Byte(B1) Y2 = String_To_Byte(B2) END SUB