Mercurial > hgrepos > Python2 > PyMuPDF
diff mupdf-source/thirdparty/zint/extras/sunburst.c @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/thirdparty/zint/extras/sunburst.c Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,120 @@ +/* + * sunburst.c + * + * Many encoding schemes were put forward when the UPC system was being considered, + * and this code encodes numeric data according to one of the more interesting looking + * varieties. The system proposed by Charecogn Systems Inc. doesn't seem to have had + * an official name, but "sunburst" seems appropriate from its appearance. The idea was + * that the symbol would be read by a sensor mounted on a rotating head. + * + * This code takes numeric data and produces an image as an SVG. + * + * More details in US Patent 3,636,317, Filed April 28th 1969. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +void print_head(char upc_number[]) { + printf("<?xml version=\"1.0\" standalone=\"no\"?>\n"); + printf("<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"); + printf(" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"); + printf("<svg width=\"100\" height=\"100\" version=\"1.1\"\n"); + printf(" xmlns=\"http://www.w3.org/2000/svg\">\n"); + printf(" <desc>Sunburst %s</desc>\n\n", upc_number); + printf(" <g id=\"sunburst\" fill = \"#000000\">\n"); + printf(" <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"#ffffff\" />\n"); +} + +void print_foot() { + printf(" </g>\n"); + printf("</svg>\n"); +} + +static const char *torrey[11] = { + "01010101", "10010101", "01100101", "10100101", "01010110", "10010110", + "01100110", "10101010", "01011001", "10011001", "01001101" + // Two "surplus" codes were also defined as "01011010" and "10110010" + // In these codes 0 is dark and 1 is light +}; + +int main(int argc, char** argv) { + + int in_length; + char upc_number[12]; + char binary[100]; + int i; + int posn; + int left, right; + double ax, ay, bx, by, cx, cy, dx, dy; + + if (argc != 2) { + /* Only command line input should be the number to encode */ + printf("Usage: sunburst {number}\n"); + printf("Where {number} is the number to be encoded, up to 11 digits\n"); + return 0; + } else { + in_length = strlen(argv[1]); + if (in_length > 11) { + /* Check maximum length */ + printf("Input data too long\n"); + return 0; + } else { + /* Add padding if needed */ + strcpy(upc_number, ""); + for(i = in_length; i < 11; i++) { + strcat(upc_number, "0"); + } + strcat(upc_number, argv[1]); + } + } + + /* Check input is numeric */ + for (i = 0; i < 11; i++) { + if ((upc_number[i] < '0') || (upc_number[i] > '9')) { + printf("Invalid character(s) in input data\n"); + return 0; + } + } + + strcpy(binary, torrey[10]); // Start + + for (i = 0; i < 11; i++) { + strcat(binary, torrey[upc_number[i] - '0']); + } + + print_head(upc_number); + + posn = 0; + + do { + if (binary[posn] == '0') { + for (i = 0; binary[posn + i] == '0'; i++); + left = posn; + right = posn + i; + + ax = 50.0 + (18.72 * cos(0.06545 * left - 1.5708)); + ay = 50.0 + (18.72 * sin(0.06545 * left - 1.5708)); + bx = 50.0 + (50.0 * cos(0.06545 * left - 1.5708)); + by = 50.0 + (50.0 * sin(0.06545 * left - 1.5708)); + cx = 50.0 + (50.0 * cos(0.06545 * right - 1.5708)); + cy = 50.0 + (50.0 * sin(0.06545 * right - 1.5708)); + dx = 50.0 + (18.72 * cos(0.06545 * right - 1.5708)); + dy = 50.0 + (18.72 * sin(0.06545 * right - 1.5708)); + + printf(" <path d=\"M %.2f %.2f A 50.00 50.00 0 0 1 %.2f %.2f L %.2f %.2f A 18.72 18.72 0 0 0 %.2f %.2f Z\" />\n", + bx, by, cx, cy, dx, dy, ax, ay); + + posn += i; + } else { + posn++; + } + } while (posn < 96); + + print_foot(); + + return (EXIT_SUCCESS); +}
