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);
+}