mirror of
https://github.com/zint/zint
synced 2024-11-16 20:57:25 +13:00
Add buffer option
This commit is contained in:
parent
13a8a80136
commit
7c1d8fdc5b
@ -61,6 +61,9 @@ struct zint_symbol *ZBarcode_Create()
|
|||||||
}
|
}
|
||||||
symbol->row_height[i] = 0;
|
symbol->row_height[i] = 0;
|
||||||
}
|
}
|
||||||
|
symbol->bitmap = NULL;
|
||||||
|
symbol->bitmap_width = 0;
|
||||||
|
symbol->bitmap_height = 0;
|
||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,6 +132,7 @@ extern int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int l
|
|||||||
|
|
||||||
#ifndef NO_PNG
|
#ifndef NO_PNG
|
||||||
int png_handle(struct zint_symbol *symbol, int rotate_angle);
|
int png_handle(struct zint_symbol *symbol, int rotate_angle);
|
||||||
|
int bmp_handle(struct zint_symbol *symbol, int rotate_angle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int ps_plot(struct zint_symbol *symbol);
|
extern int ps_plot(struct zint_symbol *symbol);
|
||||||
@ -666,6 +670,29 @@ int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle)
|
|||||||
return error_number;
|
return error_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NO_PNG
|
||||||
|
int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle)
|
||||||
|
{
|
||||||
|
int error_number;
|
||||||
|
|
||||||
|
switch(rotate_angle) {
|
||||||
|
case 0:
|
||||||
|
case 90:
|
||||||
|
case 180:
|
||||||
|
case 270:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
strcpy(symbol->errtxt, "Invalid rotation angle");
|
||||||
|
return ERROR_INVALID_OPTION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_number = bmp_handle(symbol, rotate_angle);
|
||||||
|
error_tag(symbol->errtxt, error_number);
|
||||||
|
return error_number;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int ZBarcode_Print_Rotated(struct zint_symbol *symbol, int rotate_angle) {
|
int ZBarcode_Print_Rotated(struct zint_symbol *symbol, int rotate_angle) {
|
||||||
/* Depreciated - will be removed in later version */
|
/* Depreciated - will be removed in later version */
|
||||||
return ZBarcode_Print(symbol, rotate_angle);
|
return ZBarcode_Print(symbol, rotate_angle);
|
||||||
@ -686,6 +713,23 @@ int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input,
|
|||||||
return error_number;
|
return error_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NO_PNG
|
||||||
|
int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle)
|
||||||
|
{
|
||||||
|
int error_number;
|
||||||
|
|
||||||
|
error_number = 0;
|
||||||
|
|
||||||
|
error_number = ZBarcode_Encode(symbol, input, length);
|
||||||
|
if(error_number != 0) {
|
||||||
|
return error_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_number = ZBarcode_Buffer(symbol, rotate_angle);
|
||||||
|
return error_number;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int ZBarcode_Encode_and_Print_Rotated(struct zint_symbol *symbol, unsigned char *input, int rotate_angle) {
|
int ZBarcode_Encode_and_Print_Rotated(struct zint_symbol *symbol, unsigned char *input, int rotate_angle) {
|
||||||
/* Depreciated - will be removed in later version */
|
/* Depreciated - will be removed in later version */
|
||||||
return ZBarcode_Encode_and_Print(symbol, input, rotate_angle, strlen((char *)input));
|
return ZBarcode_Encode_and_Print(symbol, input, rotate_angle, strlen((char *)input));
|
||||||
@ -759,3 +803,18 @@ int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, i
|
|||||||
return ZBarcode_Print(symbol, rotate_angle);
|
return ZBarcode_Print(symbol, rotate_angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef NO_PNG
|
||||||
|
int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle)
|
||||||
|
{
|
||||||
|
int error_number;
|
||||||
|
|
||||||
|
error_number = 0;
|
||||||
|
|
||||||
|
error_number = ZBarcode_Encode_File(symbol, filename);
|
||||||
|
if(error_number != 0) {
|
||||||
|
return error_number;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ZBarcode_Buffer(symbol, rotate_angle);
|
||||||
|
}
|
||||||
|
#endif
|
201
backend/png.c
201
backend/png.c
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
libzint - the open source barcode library
|
libzint - the open source barcode library
|
||||||
Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
|
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -19,6 +19,15 @@
|
|||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This file initially included the code to output barcodes to PNG images. To this has been
|
||||||
|
added routines to ouput the symbol in a byte array for manipulation within an external
|
||||||
|
program - the difference can be seen as "PNG mode" and "BMP mode". The reason they have been
|
||||||
|
lumped together here is because they use much the same functions and so it saves memory to
|
||||||
|
put them together. The problem is that it means the "BMP mode" functions are not available
|
||||||
|
unless PNG encoding is enabled. This is a compromise and I hope it doesn't cause anybody problems.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
@ -41,6 +50,9 @@
|
|||||||
|
|
||||||
#define SSET "0123456789ABCDEF"
|
#define SSET "0123456789ABCDEF"
|
||||||
|
|
||||||
|
#define PNG_DATA 100
|
||||||
|
#define BMP_DATA 200
|
||||||
|
|
||||||
struct mainprog_info_type {
|
struct mainprog_info_type {
|
||||||
long width;
|
long width;
|
||||||
long height;
|
long height;
|
||||||
@ -65,7 +77,7 @@ static void writepng_error_handler(png_structp png_ptr, png_const_charp msg)
|
|||||||
longjmp(graphic->jmpbuf, 1);
|
longjmp(graphic->jmpbuf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle)
|
int png_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle)
|
||||||
{
|
{
|
||||||
struct mainprog_info_type wpng_info;
|
struct mainprog_info_type wpng_info;
|
||||||
struct mainprog_info_type *graphic;
|
struct mainprog_info_type *graphic;
|
||||||
@ -297,6 +309,165 @@ int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, c
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bmp_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle)
|
||||||
|
{
|
||||||
|
unsigned long rowbytes;
|
||||||
|
int i, row, column, errno;
|
||||||
|
int fgred, fggrn, fgblu, bgred, bggrn, bgblu;
|
||||||
|
|
||||||
|
switch(rotate_angle) {
|
||||||
|
case 0:
|
||||||
|
case 180:
|
||||||
|
symbol->bitmap_width = image_width;
|
||||||
|
symbol->bitmap_height = image_height;
|
||||||
|
break;
|
||||||
|
case 90:
|
||||||
|
case 270:
|
||||||
|
symbol->bitmap_width = image_height;
|
||||||
|
symbol->bitmap_height = image_width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (symbol->bitmap != NULL)
|
||||||
|
free(symbol->bitmap);
|
||||||
|
|
||||||
|
symbol->bitmap = (char *) malloc(image_width * image_height * 3);
|
||||||
|
|
||||||
|
|
||||||
|
/* sort out colour options */
|
||||||
|
to_upper((unsigned char*)symbol->fgcolour);
|
||||||
|
to_upper((unsigned char*)symbol->bgcolour);
|
||||||
|
|
||||||
|
if(strlen(symbol->fgcolour) != 6) {
|
||||||
|
strcpy(symbol->errtxt, "Malformed foreground colour target");
|
||||||
|
return ERROR_INVALID_OPTION;
|
||||||
|
}
|
||||||
|
if(strlen(symbol->bgcolour) != 6) {
|
||||||
|
strcpy(symbol->errtxt, "Malformed background colour target");
|
||||||
|
return ERROR_INVALID_OPTION;
|
||||||
|
}
|
||||||
|
errno = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour));
|
||||||
|
if (errno == ERROR_INVALID_DATA) {
|
||||||
|
strcpy(symbol->errtxt, "Malformed foreground colour target");
|
||||||
|
return ERROR_INVALID_OPTION;
|
||||||
|
}
|
||||||
|
errno = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->fgcolour));
|
||||||
|
if (errno == ERROR_INVALID_DATA) {
|
||||||
|
strcpy(symbol->errtxt, "Malformed background colour target");
|
||||||
|
return ERROR_INVALID_OPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]);
|
||||||
|
fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]);
|
||||||
|
fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]);
|
||||||
|
bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]);
|
||||||
|
bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]);
|
||||||
|
bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]);
|
||||||
|
|
||||||
|
/* set rowbytes - depends on picture depth */
|
||||||
|
rowbytes = symbol->bitmap_width * 3;
|
||||||
|
|
||||||
|
/* Pixel Plotting */
|
||||||
|
i = 0;
|
||||||
|
switch(rotate_angle) {
|
||||||
|
case 0: /* Plot the right way up */
|
||||||
|
for(row = 0; row < image_height; row++) {
|
||||||
|
for(column = 0; column < image_width; column++) {
|
||||||
|
switch(*(pixelbuf + (image_width * row) + column))
|
||||||
|
{
|
||||||
|
case '1':
|
||||||
|
symbol->bitmap[i++] = fgred;
|
||||||
|
symbol->bitmap[i++] = fggrn;
|
||||||
|
symbol->bitmap[i++] = fgblu;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
symbol->bitmap[i++] = bgred;
|
||||||
|
symbol->bitmap[i++] = bggrn;
|
||||||
|
symbol->bitmap[i++] = bgblu;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 90: /* Plot 90 degrees clockwise */
|
||||||
|
for(row = 0; row < image_width; row++) {
|
||||||
|
for(column = 0; column < image_height; column++) {
|
||||||
|
switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row))
|
||||||
|
{
|
||||||
|
case '1':
|
||||||
|
symbol->bitmap[i++] = fgred;
|
||||||
|
symbol->bitmap[i++] = fggrn;
|
||||||
|
symbol->bitmap[i++] = fgblu;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
symbol->bitmap[i++] = bgred;
|
||||||
|
symbol->bitmap[i++] = bggrn;
|
||||||
|
symbol->bitmap[i++] = bgblu;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 180: /* Plot upside down */
|
||||||
|
for(row = 0; row < image_height; row++) {
|
||||||
|
for(column = 0; column < image_width; column++) {
|
||||||
|
switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1)))
|
||||||
|
{
|
||||||
|
case '1':
|
||||||
|
symbol->bitmap[i++] = fgred;
|
||||||
|
symbol->bitmap[i++] = fggrn;
|
||||||
|
symbol->bitmap[i++] = fgblu;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
symbol->bitmap[i++] = bgred;
|
||||||
|
symbol->bitmap[i++] = bggrn;
|
||||||
|
symbol->bitmap[i++] = bgblu;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 270: /* Plot 90 degrees anti-clockwise */
|
||||||
|
for(row = 0; row < image_width; row++) {
|
||||||
|
for(column = 0; column < image_height; column++) {
|
||||||
|
switch(*(pixelbuf + (image_width * column) + (image_width - row - 1)))
|
||||||
|
{
|
||||||
|
case '1':
|
||||||
|
symbol->bitmap[i++] = fgred;
|
||||||
|
symbol->bitmap[i++] = fggrn;
|
||||||
|
symbol->bitmap[i++] = fgblu;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
symbol->bitmap[i++] = bgred;
|
||||||
|
symbol->bitmap[i++] = bggrn;
|
||||||
|
symbol->bitmap[i++] = bgblu;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type)
|
||||||
|
{
|
||||||
|
int error_number;
|
||||||
|
|
||||||
|
if(image_type == PNG_DATA) {
|
||||||
|
error_number = png_pixel_plot(symbol, image_height, image_width, pixelbuf, rotate_angle);
|
||||||
|
} else {
|
||||||
|
error_number = bmp_pixel_plot(symbol, image_height, image_width, pixelbuf, rotate_angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return error_number;
|
||||||
|
}
|
||||||
|
|
||||||
void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height)
|
void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height)
|
||||||
{
|
{
|
||||||
/* Draw a rectangle */
|
/* Draw a rectangle */
|
||||||
@ -412,7 +583,7 @@ void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int im
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxi_png_plot(struct zint_symbol *symbol, int rotate_angle)
|
int maxi_png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type)
|
||||||
{
|
{
|
||||||
int i, row, column, xposn, yposn;
|
int i, row, column, xposn, yposn;
|
||||||
int image_height, image_width;
|
int image_height, image_width;
|
||||||
@ -466,7 +637,7 @@ int maxi_png_plot(struct zint_symbol *symbol, int rotate_angle)
|
|||||||
draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * scaler), symbol->border_width * scaler, 0, image_height, image_width, image_height);
|
draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * scaler), symbol->border_width * scaler, 0, image_height, image_width, image_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle);
|
error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
|
||||||
free(pixelbuf);
|
free(pixelbuf);
|
||||||
return error_number;
|
return error_number;
|
||||||
}
|
}
|
||||||
@ -504,7 +675,7 @@ void to_latin1(unsigned char source[], unsigned char preprocessed[])
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int png_plot(struct zint_symbol *symbol, int rotate_angle)
|
int png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type)
|
||||||
{
|
{
|
||||||
int textdone, main_width, comp_offset, large_bar_count;
|
int textdone, main_width, comp_offset, large_bar_count;
|
||||||
char textpart[10], addon[6];
|
char textpart[10], addon[6];
|
||||||
@ -912,7 +1083,7 @@ int png_plot(struct zint_symbol *symbol, int rotate_angle)
|
|||||||
draw_string(pixelbuf, (char*)local_text, textpos, default_text_posn, image_width, image_height);
|
draw_string(pixelbuf, (char*)local_text, textpos, default_text_posn, image_width, image_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle);
|
error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type);
|
||||||
free(pixelbuf);
|
free(pixelbuf);
|
||||||
return error_number;
|
return error_number;
|
||||||
}
|
}
|
||||||
@ -922,10 +1093,24 @@ int png_handle(struct zint_symbol *symbol, int rotate_angle)
|
|||||||
int error;
|
int error;
|
||||||
|
|
||||||
if(symbol->symbology == BARCODE_MAXICODE) {
|
if(symbol->symbology == BARCODE_MAXICODE) {
|
||||||
error = maxi_png_plot(symbol, rotate_angle);
|
error = maxi_png_plot(symbol, rotate_angle, PNG_DATA);
|
||||||
} else {
|
} else {
|
||||||
error = png_plot(symbol, rotate_angle);
|
error = png_plot(symbol, rotate_angle, PNG_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bmp_handle(struct zint_symbol *symbol, int rotate_angle)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
if(symbol->symbology == BARCODE_MAXICODE) {
|
||||||
|
error = maxi_png_plot(symbol, rotate_angle, BMP_DATA);
|
||||||
|
} else {
|
||||||
|
error = png_plot(symbol, rotate_angle, BMP_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
libzint - the open source barcode library
|
libzint - the open source barcode library
|
||||||
Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
|
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* zint.h - definitions for libzint
|
/* zint.h - definitions for libzint
|
||||||
|
|
||||||
libzint - the open source barcode library
|
libzint - the open source barcode library
|
||||||
Copyright (C) 2008 Robin Stuart <robin@zint.org.uk>
|
Copyright (C) 2009 Robin Stuart <robin@zint.org.uk>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -46,6 +46,9 @@ struct zint_symbol {
|
|||||||
unsigned char encoded_data[178][143];
|
unsigned char encoded_data[178][143];
|
||||||
int row_height[178]; /* Largest symbol is 177x177 QR Code */
|
int row_height[178]; /* Largest symbol is 177x177 QR Code */
|
||||||
char errtxt[100];
|
char errtxt[100];
|
||||||
|
char *bitmap;
|
||||||
|
int bitmap_width;
|
||||||
|
int bitmap_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Tbarcode 7 codes */
|
/* Tbarcode 7 codes */
|
||||||
@ -183,6 +186,10 @@ ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
|
|||||||
ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle);
|
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_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle);
|
||||||
|
|
||||||
|
ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
|
||||||
|
ZINT_EXTERN int ZBarcide_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);
|
ZINT_EXTERN int ZBarcode_ValidID(int symbol_id);
|
||||||
|
|
||||||
/* Depreciated */
|
/* Depreciated */
|
||||||
|
Loading…
Reference in New Issue
Block a user