ErosOlmi
08-11-2017, 19:47
I'm experimenting zint library for generating barcodes.
So far it seems quite easy to interface with thinBasic.
I will consider to create a specific thinBasic module and incorporate the library into it.
Any interest?
References
web site: http://www.zint.org.uk
api manual: http://www.zint.org.uk/Manual.aspx?type=p&page=5
9761
9762
A preliminary VERY LOW level example. You need to have zint.dll downloadable from https://sourceforge.net/projects/zint/files/?source=navbar
Type zint_render_line
x as single
y as single
length as single
width as single
pNext as DWord
end type
Type zint_render_string
x as single
y as single
fsize as single
width as single
length as Long
pText as Byte
pNext as DWord
end type
Type zint_render_ring
x as single
y as single
radius as single
line_width as single
pNext as DWord
end type
Type zint_render_hexagon
x as single
y as single
height as single
pNext as DWord
end type
Type zint_render
width as DWord
height as DWord
pLines as DWord 'struct zint_render_line *lines; /* Pointer to first line */
pStrings as dword 'struct zint_render_string *strings; /* Pointer to first string */
pRings as DWord 'struct zint_render_ring *rings; /* Pointer to first ring */
phexagons as DWord 'struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */
end type
' struct zint_symbol {
' int symbology;
' int height;
' int whitespace_width;
' int border_width;
' int output_options;
' char fgcolour[10];
' char bgcolour[10];
' char outfile[256];
' float scale;
' int option_1;
' int option_2;
' int option_3;
' int show_hrt;
' int input_mode;
' int eci;
' unsigned char text[128];
' int rows;
' int width;
' char primary[128];
' unsigned char encoded_data[200][143];
' int row_height[200]; /* Largest symbol is 189 x 189 Han Xin */
' char errtxt[100];
' char *bitmap;
' int bitmap_width;
' int bitmap_height;
' unsigned int bitmap_byte_length;
' float dot_size;
' struct zint_render *rendered;
' int debug;
' };
'
Type zint_symbol
symbology as Long
height as Long
whitespace_width as Long
border_width as Long
output_options as long
fgcolour(10) as Byte
bgcolour(10) as byte
outfile as string * 256
scale as single
option_1 as Long
option_2 as Long
option_3 as Long
show_hrt as Long
input_mode as Long
eci as Long
stext as string * 128
rows as Long
width as Long
primary as string * 128
encoded_data(200,143) as Byte
row_height(200) as Long
errtxt as string * 100
pbitmap as dword
bitmap_width as Long
bitmap_height as Long
bitmap_byte_length as Long
dot_size as single
pRendered as dword 'struct zint_render *rendered;
debug as Long
end type
'ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void);
DECLARE FUNCTION ZBarcode_Create LIB "zint.dll" ALIAS "ZBarcode_Create" () AS DWord
'ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol);
DECLARE sub ZBarcode_Clear LIB "zint.dll" ALIAS "ZBarcode_Clear" (byval lSymbol as DWord)
'ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol);
DECLARE sub ZBarcode_Delete LIB "zint.dll" ALIAS "ZBarcode_Delete" (byval lSymbol as DWord)
'
'ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int in_length);
DECLARE FUNCTION ZBarcode_Encode LIB "zint.dll" ALIAS "ZBarcode_Encode" (byval lSymbol as DWord, byval zSource as asciiz ptr, byval in_length as Long) AS long
'ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename);
'ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
DECLARE FUNCTION ZBarcode_Print LIB "zint.dll" ALIAS "ZBarcode_Print" (byval lSymbol as DWord, byval rotate_angle as Long) AS Long
'ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
'ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
'
'ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height);
'
'ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
DECLARE FUNCTION ZBarcode_Buffer LIB "zint.dll" ALIAS "ZBarcode_Buffer" (byval lSymbol as DWord, byval rotate_angle as Long) AS Long
'ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
'ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle);
'
'ZINT_EXTERN int ZBarcode_ValidID(int symbol_id);
DECLARE FUNCTION ZBarcode_ValidID LIB "zint.dll" ALIAS "ZBarcode_ValidID" (ByVal SymbolID as Long) AS Long
'ZINT_EXTERN int ZBarcode_Version();
DECLARE FUNCTION ZBarcode_Version LIB "zint.dll" ALIAS "ZBarcode_Version" () AS long
' http://zint.org.uk/Manual.aspx?type=p&page=5
Uses "UI"
uses "console"
' -- ID numbers of controls
Begin ControlID
%cCanvasDB
%bBarCode
%bClose
End ControlID
Type BGRA
B As Byte
G As Byte
R As Byte
A As Byte
End Type
' -- Create dialog here
FUNCTION TBMAIN()
LOCAL hDlg AS DWORD
Dialog NEW pixels, 0, "thinBasic and zint lib",-1,-1, 640, 300, _
%WS_POPUP Or %WS_VISIBLE Or _
%WS_CLIPCHILDREN Or %WS_CAPTION OR _
%WS_SYSMENU Or %WS_MINIMIZEBOX, 0 To hDlg
' -- Place controls here
dim cx, cy as long
'dialog pixels hDlg, 400, 400 to units cx, cy
Control ADD CANVAS, hDlg, %cCanvasDB, "", 0, 0, 640, 200
Control ADD BUTTON, hDlg, %bBarCode , "Redraw" , 10, 250, 50, 25, Call bModifyBitmapProc
Control ADD BUTTON, hDlg, %bClose , "Close" , 100, 250, 50, 25, Call bCloseProc
DIALOG SHOW MODAL hDlg, CALL dlgProc
END FUNCTION
' -- Callback for dialog
CALLBACK FUNCTION dlgProc()
' -- Test for messages
SELECT CASE CBMSG
Case %WM_INITDIALOG
DrawBarCode(CBHNDL)
CASE %WM_CLOSE
' -- Put code to be executed before dialog end here
END SELECT
END FUNCTION
' -- Callback for close button
CallBack Function bCloseProc()
If CBMSG = %WM_COMMAND Then
If CBCTLMSG = %BN_CLICKED Then
' -- Closes the dialog
DIALOG END CBHNDL
END IF
END IF
End Function
CallBack Function bModifyBitmapProc()
If CBMSG = %WM_COMMAND Then
If CBCTLMSG = %BN_CLICKED Then
DrawBarCode(CBHNDL)
Dialog SET TEXT CBHNDL, "OK " & Timer
End If
End If
End Function
function DrawBarCode(byval hWnd as Long) as Long
dim pSymbol as zint_symbol ptr
DWord lSymbol
string sText = "thinBASIC & zint rocks!" & $NUL
printl "Version:", ZBarcode_Version
lSymbol = ZBarcode_Create
PrintL "Symbol:", lSymbol
pSymbol = lSymbol
pSymbol.symbology = 20 'Code 128
'pSymbol.symbology = 58 'QR Code
'pSymbol.symbology = 71 'Data MATRIX
pSymbol.outfile = "xxx.bmp"
pSymbol.input_mode = 0 'DATA_MODE
'pSymbol.scale = 0.8
'printl "BARCODE_CODE128 :", ZBarcode_ValidID(20)
printl "Current pSymbol.symbology", pSymbol.symbology
printl "ZBarcode_Encode :", ZBarcode_Encode(lSymbol, sText, 0)
printl "ZBarcode_Buffer :", ZBarcode_Buffer(lSymbol, 0)
'printl "ZBarcode_Print :", ZBarcode_Print(lSymbol, 0)
printl "pSymbol.bitmap_width", pSymbol.bitmap_width
printl "pSymbol.bitmap_height", pSymbol.bitmap_height
CANVAS_Attach(hWnd, %cCanvasDB, %TRUE)
canvas_clear(rgb(255, 255, 255))
CANVAS_Redraw
long y, x, i
Long red, blue, green
dim nPixels = (pSymbol.bitmap_width) * (pSymbol.bitmap_height) * 4
dim lColors(nPixels) as byte at pSymbol.pbitmap
i = 1
for y = 1 to pSymbol.bitmap_height
for x = 1 to pSymbol.bitmap_width
red = lColors(i)
green = lColors(i + 1)
blue = lColors(i + 2)
Canvas_SetPixel(x, y, rgb(red, green, blue) )
i += 3
Next
Next
ZBarcode_Delete(lSymbol)
CANVAS_Redraw
end Function
So far it seems quite easy to interface with thinBasic.
I will consider to create a specific thinBasic module and incorporate the library into it.
Any interest?
References
web site: http://www.zint.org.uk
api manual: http://www.zint.org.uk/Manual.aspx?type=p&page=5
9761
9762
A preliminary VERY LOW level example. You need to have zint.dll downloadable from https://sourceforge.net/projects/zint/files/?source=navbar
Type zint_render_line
x as single
y as single
length as single
width as single
pNext as DWord
end type
Type zint_render_string
x as single
y as single
fsize as single
width as single
length as Long
pText as Byte
pNext as DWord
end type
Type zint_render_ring
x as single
y as single
radius as single
line_width as single
pNext as DWord
end type
Type zint_render_hexagon
x as single
y as single
height as single
pNext as DWord
end type
Type zint_render
width as DWord
height as DWord
pLines as DWord 'struct zint_render_line *lines; /* Pointer to first line */
pStrings as dword 'struct zint_render_string *strings; /* Pointer to first string */
pRings as DWord 'struct zint_render_ring *rings; /* Pointer to first ring */
phexagons as DWord 'struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */
end type
' struct zint_symbol {
' int symbology;
' int height;
' int whitespace_width;
' int border_width;
' int output_options;
' char fgcolour[10];
' char bgcolour[10];
' char outfile[256];
' float scale;
' int option_1;
' int option_2;
' int option_3;
' int show_hrt;
' int input_mode;
' int eci;
' unsigned char text[128];
' int rows;
' int width;
' char primary[128];
' unsigned char encoded_data[200][143];
' int row_height[200]; /* Largest symbol is 189 x 189 Han Xin */
' char errtxt[100];
' char *bitmap;
' int bitmap_width;
' int bitmap_height;
' unsigned int bitmap_byte_length;
' float dot_size;
' struct zint_render *rendered;
' int debug;
' };
'
Type zint_symbol
symbology as Long
height as Long
whitespace_width as Long
border_width as Long
output_options as long
fgcolour(10) as Byte
bgcolour(10) as byte
outfile as string * 256
scale as single
option_1 as Long
option_2 as Long
option_3 as Long
show_hrt as Long
input_mode as Long
eci as Long
stext as string * 128
rows as Long
width as Long
primary as string * 128
encoded_data(200,143) as Byte
row_height(200) as Long
errtxt as string * 100
pbitmap as dword
bitmap_width as Long
bitmap_height as Long
bitmap_byte_length as Long
dot_size as single
pRendered as dword 'struct zint_render *rendered;
debug as Long
end type
'ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void);
DECLARE FUNCTION ZBarcode_Create LIB "zint.dll" ALIAS "ZBarcode_Create" () AS DWord
'ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol);
DECLARE sub ZBarcode_Clear LIB "zint.dll" ALIAS "ZBarcode_Clear" (byval lSymbol as DWord)
'ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol);
DECLARE sub ZBarcode_Delete LIB "zint.dll" ALIAS "ZBarcode_Delete" (byval lSymbol as DWord)
'
'ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int in_length);
DECLARE FUNCTION ZBarcode_Encode LIB "zint.dll" ALIAS "ZBarcode_Encode" (byval lSymbol as DWord, byval zSource as asciiz ptr, byval in_length as Long) AS long
'ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename);
'ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
DECLARE FUNCTION ZBarcode_Print LIB "zint.dll" ALIAS "ZBarcode_Print" (byval lSymbol as DWord, byval rotate_angle as Long) AS Long
'ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
'ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
'
'ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height);
'
'ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
DECLARE FUNCTION ZBarcode_Buffer LIB "zint.dll" ALIAS "ZBarcode_Buffer" (byval lSymbol as DWord, byval rotate_angle as Long) AS Long
'ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
'ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle);
'
'ZINT_EXTERN int ZBarcode_ValidID(int symbol_id);
DECLARE FUNCTION ZBarcode_ValidID LIB "zint.dll" ALIAS "ZBarcode_ValidID" (ByVal SymbolID as Long) AS Long
'ZINT_EXTERN int ZBarcode_Version();
DECLARE FUNCTION ZBarcode_Version LIB "zint.dll" ALIAS "ZBarcode_Version" () AS long
' http://zint.org.uk/Manual.aspx?type=p&page=5
Uses "UI"
uses "console"
' -- ID numbers of controls
Begin ControlID
%cCanvasDB
%bBarCode
%bClose
End ControlID
Type BGRA
B As Byte
G As Byte
R As Byte
A As Byte
End Type
' -- Create dialog here
FUNCTION TBMAIN()
LOCAL hDlg AS DWORD
Dialog NEW pixels, 0, "thinBasic and zint lib",-1,-1, 640, 300, _
%WS_POPUP Or %WS_VISIBLE Or _
%WS_CLIPCHILDREN Or %WS_CAPTION OR _
%WS_SYSMENU Or %WS_MINIMIZEBOX, 0 To hDlg
' -- Place controls here
dim cx, cy as long
'dialog pixels hDlg, 400, 400 to units cx, cy
Control ADD CANVAS, hDlg, %cCanvasDB, "", 0, 0, 640, 200
Control ADD BUTTON, hDlg, %bBarCode , "Redraw" , 10, 250, 50, 25, Call bModifyBitmapProc
Control ADD BUTTON, hDlg, %bClose , "Close" , 100, 250, 50, 25, Call bCloseProc
DIALOG SHOW MODAL hDlg, CALL dlgProc
END FUNCTION
' -- Callback for dialog
CALLBACK FUNCTION dlgProc()
' -- Test for messages
SELECT CASE CBMSG
Case %WM_INITDIALOG
DrawBarCode(CBHNDL)
CASE %WM_CLOSE
' -- Put code to be executed before dialog end here
END SELECT
END FUNCTION
' -- Callback for close button
CallBack Function bCloseProc()
If CBMSG = %WM_COMMAND Then
If CBCTLMSG = %BN_CLICKED Then
' -- Closes the dialog
DIALOG END CBHNDL
END IF
END IF
End Function
CallBack Function bModifyBitmapProc()
If CBMSG = %WM_COMMAND Then
If CBCTLMSG = %BN_CLICKED Then
DrawBarCode(CBHNDL)
Dialog SET TEXT CBHNDL, "OK " & Timer
End If
End If
End Function
function DrawBarCode(byval hWnd as Long) as Long
dim pSymbol as zint_symbol ptr
DWord lSymbol
string sText = "thinBASIC & zint rocks!" & $NUL
printl "Version:", ZBarcode_Version
lSymbol = ZBarcode_Create
PrintL "Symbol:", lSymbol
pSymbol = lSymbol
pSymbol.symbology = 20 'Code 128
'pSymbol.symbology = 58 'QR Code
'pSymbol.symbology = 71 'Data MATRIX
pSymbol.outfile = "xxx.bmp"
pSymbol.input_mode = 0 'DATA_MODE
'pSymbol.scale = 0.8
'printl "BARCODE_CODE128 :", ZBarcode_ValidID(20)
printl "Current pSymbol.symbology", pSymbol.symbology
printl "ZBarcode_Encode :", ZBarcode_Encode(lSymbol, sText, 0)
printl "ZBarcode_Buffer :", ZBarcode_Buffer(lSymbol, 0)
'printl "ZBarcode_Print :", ZBarcode_Print(lSymbol, 0)
printl "pSymbol.bitmap_width", pSymbol.bitmap_width
printl "pSymbol.bitmap_height", pSymbol.bitmap_height
CANVAS_Attach(hWnd, %cCanvasDB, %TRUE)
canvas_clear(rgb(255, 255, 255))
CANVAS_Redraw
long y, x, i
Long red, blue, green
dim nPixels = (pSymbol.bitmap_width) * (pSymbol.bitmap_height) * 4
dim lColors(nPixels) as byte at pSymbol.pbitmap
i = 1
for y = 1 to pSymbol.bitmap_height
for x = 1 to pSymbol.bitmap_width
red = lColors(i)
green = lColors(i + 1)
blue = lColors(i + 2)
Canvas_SetPixel(x, y, rgb(red, green, blue) )
i += 3
Next
Next
ZBarcode_Delete(lSymbol)
CANVAS_Redraw
end Function