@sythos/js_barcode_universal 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +215 -0
  2. package/NOTICE.md +106 -0
  3. package/README.md +433 -0
  4. package/bundle/sythos-barcode.esm.js +7998 -0
  5. package/bundle/sythos-barcode.js +7948 -0
  6. package/examples/create.html +731 -0
  7. package/examples/read.html +341 -0
  8. package/licenses/README.md +42 -0
  9. package/licenses/codabar.license +74 -0
  10. package/licenses/code-11.license +69 -0
  11. package/licenses/code-128.license +69 -0
  12. package/licenses/code-39.license +70 -0
  13. package/licenses/code-93.license +71 -0
  14. package/licenses/ean-13.license +70 -0
  15. package/licenses/ean-8.license +70 -0
  16. package/licenses/gs1-128.license +71 -0
  17. package/licenses/isbn.license +76 -0
  18. package/licenses/itf-14.license +69 -0
  19. package/licenses/itf.license +70 -0
  20. package/licenses/msi-plessey.license +72 -0
  21. package/licenses/pharmacode.license +71 -0
  22. package/licenses/qr-code.license +75 -0
  23. package/licenses/upc-a.license +72 -0
  24. package/licenses/upc-e.license +69 -0
  25. package/package.json +89 -0
  26. package/src/core/bit-buffer.js +174 -0
  27. package/src/core/bit-matrix.js +241 -0
  28. package/src/core/errors.js +61 -0
  29. package/src/core/galois-field.js +204 -0
  30. package/src/core/index.js +56 -0
  31. package/src/core/reed-solomon.js +313 -0
  32. package/src/image/binarizer.js +270 -0
  33. package/src/image/grid-sampler.js +164 -0
  34. package/src/image/index.js +40 -0
  35. package/src/image/luminance.js +196 -0
  36. package/src/image/perspective.js +195 -0
  37. package/src/index.js +240 -0
  38. package/src/oned/index.js +89 -0
  39. package/src/oned/patterns.js +384 -0
  40. package/src/oned/reader.js +918 -0
  41. package/src/oned/writers.js +741 -0
  42. package/src/qr/decoder.js +575 -0
  43. package/src/qr/detector.js +630 -0
  44. package/src/qr/encoder.js +958 -0
  45. package/src/qr/index.js +44 -0
  46. package/src/qr/tables.js +737 -0
  47. package/src/render/image-data.js +125 -0
  48. package/src/render/index.js +130 -0
  49. package/src/render/options.js +160 -0
  50. package/src/render/png.js +295 -0
  51. package/src/render/svg.js +120 -0
  52. package/src/render/webgl.js +206 -0
  53. package/src/render/webgpu.js +369 -0
@@ -0,0 +1,341 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Sythos Barcode Suite — Read</title>
7
+ <!--
8
+ Sythos Barcode Suite — example
9
+ Copyright (c) 2026 Sythos
10
+ SPDX-License-Identifier: MIT
11
+
12
+ File input first, camera second — deliberately.
13
+
14
+ getUserMedia requires a secure context, so the camera cannot work when this
15
+ page is opened from file://. Reading a dropped or chosen image has no such
16
+ restriction and works everywhere, including iOS Safari opened from disk. The
17
+ camera is offered as a progressive enhancement, and the page says plainly why
18
+ it is unavailable rather than appearing broken.
19
+ -->
20
+ <style>
21
+ :root {
22
+ --bg: #10131a; --panel: #181c26; --line: #262c3a;
23
+ --ink: #e6e9f0; --muted: #8b93a7; --accent: #5ac8fa;
24
+ --ok: #4ade80; --warn: #fbbf24;
25
+ color-scheme: dark;
26
+ }
27
+ @media (prefers-color-scheme: light) {
28
+ :root {
29
+ --bg: #f5f6f8; --panel: #ffffff; --line: #dfe3ea;
30
+ --ink: #171a21; --muted: #666e80; --accent: #0a84c4;
31
+ --ok: #16a34a; --warn: #b45309;
32
+ color-scheme: light;
33
+ }
34
+ }
35
+ * { box-sizing: border-box; }
36
+ body {
37
+ margin: 0; padding: 24px;
38
+ font: 15px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
39
+ background: var(--bg); color: var(--ink);
40
+ }
41
+ header { max-width: 1000px; margin: 0 auto 20px; }
42
+ h1 { font-size: 20px; margin: 0 0 4px; }
43
+ .sub { color: var(--muted); font-size: 13px; }
44
+ .sub a { color: var(--accent); }
45
+ .layout { max-width: 1000px; margin: 0 auto; display: grid; gap: 20px;
46
+ grid-template-columns: 1fr 1fr; align-items: start; }
47
+ @media (max-width: 800px) { .layout { grid-template-columns: 1fr; } }
48
+ .panel { background: var(--panel); border: 1px solid var(--line);
49
+ border-radius: 12px; padding: 18px; }
50
+ h2 { font-size: 13px; text-transform: uppercase; letter-spacing: 0.05em;
51
+ color: var(--muted); margin: 0 0 12px; }
52
+ #drop {
53
+ border: 2px dashed var(--line); border-radius: 10px; padding: 32px 16px;
54
+ text-align: center; color: var(--muted); cursor: pointer; font-size: 14px;
55
+ transition: border-color .15s, background .15s;
56
+ }
57
+ #drop.over { border-color: var(--accent); background: rgba(90,200,250,0.08); }
58
+ #drop b { color: var(--ink); }
59
+ button {
60
+ padding: 10px 16px; font: inherit; font-weight: 600; font-size: 13px;
61
+ cursor: pointer; border-radius: 8px; border: 1px solid var(--line);
62
+ background: var(--bg); color: var(--ink);
63
+ }
64
+ button.primary { background: var(--accent); border-color: var(--accent); color: #051019; }
65
+ button:disabled { opacity: .45; cursor: not-allowed; }
66
+ video, #preview {
67
+ width: 100%; border-radius: 8px; background: #000; display: block; margin-top: 12px;
68
+ }
69
+ #preview { background: #fff; }
70
+ .note {
71
+ margin-top: 12px; padding: 10px 12px; border-radius: 8px; font-size: 12.5px;
72
+ background: rgba(251,191,36,0.12); border: 1px solid var(--warn); color: var(--warn);
73
+ }
74
+ .note code { font-family: ui-monospace, monospace; }
75
+ #results:empty::after {
76
+ content: "Nothing decoded yet."; color: var(--muted); font-size: 13px;
77
+ }
78
+ .hit {
79
+ border: 1px solid var(--line); border-left: 3px solid var(--ok);
80
+ border-radius: 8px; padding: 10px 12px; margin-bottom: 8px;
81
+ background: var(--bg);
82
+ }
83
+ .hit .fmt { font-size: 11px; text-transform: uppercase; letter-spacing: .06em;
84
+ color: var(--ok); font-weight: 700; }
85
+ .hit .val { font-family: ui-monospace, monospace; font-size: 13px;
86
+ word-break: break-all; margin-top: 3px; }
87
+ .hit .val a { color: var(--accent); }
88
+ .status { font-size: 12px; color: var(--muted); margin-top: 10px;
89
+ font-family: ui-monospace, monospace; }
90
+ </style>
91
+ </head>
92
+ <body>
93
+
94
+ <header>
95
+ <h1>Read a barcode</h1>
96
+ <p class="sub">
97
+ Sythos Barcode Suite &mdash; 100% original JavaScript, zero dependencies, MIT.
98
+ See also <a href="create.html">create.html</a>.
99
+ </p>
100
+ </header>
101
+
102
+ <div class="layout">
103
+ <div>
104
+ <div class="panel">
105
+ <h2>From an image</h2>
106
+ <div id="drop">
107
+ <b>Drop an image here</b><br>or click to choose a file
108
+ </div>
109
+ <input type="file" id="file" accept="image/*" hidden>
110
+ <canvas id="preview"></canvas>
111
+ <div class="status" id="fileStatus"></div>
112
+ </div>
113
+
114
+ <div class="panel" style="margin-top:20px">
115
+ <h2>From the camera</h2>
116
+ <button class="primary" id="camStart">Start camera</button>
117
+ <button id="camStop" disabled>Stop</button>
118
+ <!-- playsinline is required on iOS: without it the video takes over the
119
+ whole screen and the canvas never sees a frame. -->
120
+ <video id="video" playsinline muted autoplay hidden></video>
121
+ <div id="camNote"></div>
122
+ <div class="status" id="camStatus"></div>
123
+ </div>
124
+ </div>
125
+
126
+ <div class="panel">
127
+ <h2>Results</h2>
128
+ <div id="results"></div>
129
+ </div>
130
+ </div>
131
+
132
+ <canvas id="work" hidden></canvas>
133
+
134
+ <script src="../bundle/sythos-barcode.js"></script>
135
+ <script>
136
+ (function () {
137
+ 'use strict';
138
+ var B = window.SythosBarcode;
139
+
140
+ var el = function (id) { return document.getElementById(id); };
141
+ var work = el('work');
142
+ var results = el('results');
143
+
144
+ function show(hits, source) {
145
+ if (!hits.length) return false;
146
+ results.innerHTML = '';
147
+ hits.forEach(function (h) {
148
+ var div = document.createElement('div');
149
+ div.className = 'hit';
150
+
151
+ var fmt = document.createElement('div');
152
+ fmt.className = 'fmt';
153
+ fmt.textContent = h.format + (source ? ' · ' + source : '');
154
+
155
+ var val = document.createElement('div');
156
+ val.className = 'val';
157
+ // Linkify URLs, but build the anchor with the DOM so decoded content is
158
+ // never interpreted as markup. Scanned data is untrusted input.
159
+ if (/^https?:\/\//i.test(h.text)) {
160
+ var a = document.createElement('a');
161
+ a.href = h.text;
162
+ a.textContent = h.text;
163
+ a.rel = 'noopener noreferrer';
164
+ a.target = '_blank';
165
+ val.appendChild(a);
166
+ } else {
167
+ val.textContent = h.text;
168
+ }
169
+
170
+ div.appendChild(fmt);
171
+ div.appendChild(val);
172
+ results.appendChild(div);
173
+ });
174
+ return true;
175
+ }
176
+
177
+ function scanCanvas(canvas) {
178
+ var ctx = canvas.getContext('2d', { willReadFrequently: true });
179
+ if (!ctx || !canvas.width || !canvas.height) return [];
180
+ var image = ctx.getImageData(0, 0, canvas.width, canvas.height);
181
+ try {
182
+ return B.decode(image, { tryHarder: true });
183
+ } catch (e) {
184
+ return [];
185
+ }
186
+ }
187
+
188
+ /* ---------------- file input ---------------- */
189
+
190
+ var drop = el('drop');
191
+ var fileInput = el('file');
192
+
193
+ drop.addEventListener('click', function () { fileInput.click(); });
194
+ ['dragenter', 'dragover'].forEach(function (ev) {
195
+ drop.addEventListener(ev, function (e) {
196
+ e.preventDefault(); drop.classList.add('over');
197
+ });
198
+ });
199
+ ['dragleave', 'drop'].forEach(function (ev) {
200
+ drop.addEventListener(ev, function (e) {
201
+ e.preventDefault(); drop.classList.remove('over');
202
+ });
203
+ });
204
+ drop.addEventListener('drop', function (e) {
205
+ if (e.dataTransfer && e.dataTransfer.files[0]) handleFile(e.dataTransfer.files[0]);
206
+ });
207
+ fileInput.addEventListener('change', function () {
208
+ if (fileInput.files[0]) handleFile(fileInput.files[0]);
209
+ });
210
+
211
+ function handleFile(file) {
212
+ var url = URL.createObjectURL(file);
213
+ var img = new Image();
214
+ img.onload = function () {
215
+ URL.revokeObjectURL(url);
216
+
217
+ // Very large photos cost time without adding information; cap the long
218
+ // edge so a 48-megapixel phone shot still scans promptly.
219
+ var max = 1600;
220
+ var s = Math.min(1, max / Math.max(img.width, img.height));
221
+ var w = Math.max(1, Math.round(img.width * s));
222
+ var h = Math.max(1, Math.round(img.height * s));
223
+
224
+ var preview = el('preview');
225
+ preview.width = w; preview.height = h;
226
+ preview.getContext('2d').drawImage(img, 0, 0, w, h);
227
+
228
+ work.width = w; work.height = h;
229
+ work.getContext('2d', { willReadFrequently: true }).drawImage(img, 0, 0, w, h);
230
+
231
+ var t0 = (performance && performance.now) ? performance.now() : 0;
232
+ var hits = scanCanvas(work);
233
+ var ms = ((performance && performance.now) ? performance.now() : 0) - t0;
234
+
235
+ el('fileStatus').textContent =
236
+ w + '×' + h + ' · ' + ms.toFixed(0) + ' ms · ' + hits.length + ' found';
237
+ if (!show(hits, 'image')) {
238
+ results.innerHTML = '<div class="status">No barcode found in that image.</div>';
239
+ }
240
+ };
241
+ img.onerror = function () {
242
+ URL.revokeObjectURL(url);
243
+ el('fileStatus').textContent = 'Could not load that file as an image.';
244
+ };
245
+ img.src = url;
246
+ }
247
+
248
+ /* ---------------- camera ---------------- */
249
+
250
+ var video = el('video');
251
+ var stream = null;
252
+ var raf = null;
253
+
254
+ var secure = window.isSecureContext ||
255
+ location.protocol === 'https:' ||
256
+ location.hostname === 'localhost';
257
+
258
+ if (!secure) {
259
+ el('camNote').innerHTML =
260
+ '<div class="note">The camera needs a secure context, so it is unavailable ' +
261
+ 'when this page is opened from <code>file://</code>. Serve the folder over ' +
262
+ 'http and reload &mdash; for example <code>npx serve</code> &mdash; or use ' +
263
+ 'the image input above, which works anywhere.</div>';
264
+ el('camStart').disabled = true;
265
+ } else if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
266
+ el('camNote').innerHTML =
267
+ '<div class="note">This browser does not expose a camera API.</div>';
268
+ el('camStart').disabled = true;
269
+ }
270
+
271
+ el('camStart').addEventListener('click', function () {
272
+ // Called from a click, which is what iOS requires for both getUserMedia
273
+ // and the subsequent play().
274
+ navigator.mediaDevices.getUserMedia({
275
+ video: { facingMode: 'environment', width: { ideal: 1280 }, height: { ideal: 720 } },
276
+ audio: false
277
+ }).then(function (s) {
278
+ stream = s;
279
+ video.srcObject = s;
280
+ video.hidden = false;
281
+ el('camStart').disabled = true;
282
+ el('camStop').disabled = false;
283
+ return video.play();
284
+ }).then(function () {
285
+ loop();
286
+ }).catch(function (e) {
287
+ el('camNote').innerHTML =
288
+ '<div class="note">Camera unavailable: ' + String(e.message || e) + '</div>';
289
+ });
290
+ });
291
+
292
+ el('camStop').addEventListener('click', stopCamera);
293
+
294
+ function stopCamera() {
295
+ if (raf) { cancelAnimationFrame(raf); raf = null; }
296
+ if (stream) {
297
+ stream.getTracks().forEach(function (t) { t.stop(); });
298
+ stream = null;
299
+ }
300
+ video.hidden = true;
301
+ el('camStart').disabled = false;
302
+ el('camStop').disabled = true;
303
+ el('camStatus').textContent = '';
304
+ }
305
+
306
+ var frames = 0;
307
+ var lastReport = 0;
308
+
309
+ function loop() {
310
+ raf = requestAnimationFrame(loop);
311
+ if (!video.videoWidth) return;
312
+
313
+ // Scan at a reduced size: a 720p frame carries far more detail than the
314
+ // decoder needs, and the binarizer cost is what sets the frame rate.
315
+ var scale = Math.min(1, 800 / video.videoWidth);
316
+ work.width = Math.round(video.videoWidth * scale);
317
+ work.height = Math.round(video.videoHeight * scale);
318
+ work.getContext('2d', { willReadFrequently: true })
319
+ .drawImage(video, 0, 0, work.width, work.height);
320
+
321
+ frames++;
322
+ var hits = scanCanvas(work);
323
+ if (hits.length) {
324
+ show(hits, 'camera');
325
+ stopCamera();
326
+ return;
327
+ }
328
+
329
+ var now = (performance && performance.now) ? performance.now() : 0;
330
+ if (now - lastReport > 500) {
331
+ lastReport = now;
332
+ el('camStatus').textContent =
333
+ 'scanning ' + work.width + '×' + work.height + ' · ' + frames + ' frames';
334
+ }
335
+ }
336
+
337
+ window.addEventListener('pagehide', stopCamera);
338
+ })();
339
+ </script>
340
+ </body>
341
+ </html>
@@ -0,0 +1,42 @@
1
+ # Format licences
2
+
3
+ One file per supported symbology, recording where the format comes from,
4
+ what standard governs it, its patent and trademark position, and the basis
5
+ on which this project implements and redistributes it.
6
+
7
+ **None of these formats imposes any obligation on this project's code.**
8
+ The library is MIT licensed in full — see [`../LICENSE`](../LICENSE), whose
9
+ appendix carries the consolidated inventory these files expand on.
10
+
11
+ | Format | File | `[TO VERIFY]` items |
12
+ |---|---|---:|
13
+ | QR Code | [`qr-code.license`](qr-code.license) | 5 |
14
+ | EAN-13 | [`ean-13.license`](ean-13.license) | 5 |
15
+ | EAN-8 | [`ean-8.license`](ean-8.license) | 5 |
16
+ | UPC-A | [`upc-a.license`](upc-a.license) | 6 |
17
+ | UPC-E | [`upc-e.license`](upc-e.license) | 5 |
18
+ | ISBN (Bookland EAN-13) | [`isbn.license`](isbn.license) | 6 |
19
+ | Code 128 | [`code-128.license`](code-128.license) | 5 |
20
+ | GS1-128 | [`gs1-128.license`](gs1-128.license) | 5 |
21
+ | Code 39 | [`code-39.license`](code-39.license) | 5 |
22
+ | Code 93 | [`code-93.license`](code-93.license) | 6 |
23
+ | ITF (Interleaved 2 of 5) | [`itf.license`](itf.license) | 5 |
24
+ | ITF-14 | [`itf-14.license`](itf-14.license) | 5 |
25
+ | Codabar | [`codabar.license`](codabar.license) | 8 |
26
+ | Code 11 | [`code-11.license`](code-11.license) | 8 |
27
+ | MSI Plessey | [`msi-plessey.license`](msi-plessey.license) | 6 |
28
+ | Pharmacode | [`pharmacode.license`](pharmacode.license) | 6 |
29
+
30
+ ## On the `[TO VERIFY]` markers
31
+
32
+ They are the point, not a defect. Patent expiry, trademark status and
33
+ rights-holder positions are exactly the claims where being confidently
34
+ wrong causes harm, so anything not independently confirmed is marked rather
35
+ than smoothed over. A file with more markers is being more honest, not less
36
+ reliable.
37
+
38
+ **No trademark search was performed.** Where a file says no mark is known,
39
+ that describes the limit of what the author knows, not a finding.
40
+
41
+ These are engineering assessments, **not legal advice**. If your use is
42
+ commercially sensitive, obtain your own legal review.
@@ -0,0 +1,74 @@
1
+ Codabar — format provenance and usability
2
+ ==========================================================================
3
+
4
+ This file records where the Codabar symbology comes from, what governs
5
+ it, and the basis on which this project implements and redistributes it.
6
+
7
+ It is an ENGINEERING INVENTORY, NOT LEGAL ADVICE. Items marked [TO VERIFY]
8
+ have not been independently confirmed by the author.
9
+
10
+
11
+ ORIGIN
12
+ --------------------------------------------------------------------------
13
+
14
+ Developed in the early 1970s. [TO VERIFY] COMPETING ATTRIBUTIONS CIRCULATE
15
+ in secondary sources — Monarch Marking Systems and Pitney Bowes are both
16
+ cited — so the credit is deliberately NOT treated as settled here and no
17
+ single originator is asserted. Long used by blood banks, libraries and
18
+ courier services.
19
+
20
+
21
+ SPECIFICATION
22
+ --------------------------------------------------------------------------
23
+
24
+ AIM USS-Codabar (Uniform Symbology Specification) is understood to exist,
25
+ but no document number is asserted here because none has been confirmed.
26
+ [TO VERIFY]
27
+ Also known as NW-7, and in the United States as Code 2 of 7. [TO VERIFY]
28
+
29
+ Specification TEXT is copyrighted by its publisher. The SYMBOLOGY it
30
+ describes is not — an encoding scheme is a system, not a work of
31
+ authorship. This project implements the symbology; it does not reproduce,
32
+ redistribute or excerpt any specification document.
33
+
34
+
35
+ PATENT STATUS
36
+ --------------------------------------------------------------------------
37
+
38
+ The originating patents date from the 1970s-1980s and are understood to
39
+ have expired long ago. [TO VERIFY]
40
+
41
+
42
+ TRADEMARK
43
+ --------------------------------------------------------------------------
44
+
45
+ No live trademark restriction on implementing Codabar is known to the
46
+ author. [TO VERIFY] That is a statement about the author's knowledge, not
47
+ a finding that no mark subsists: no trademark search was carried out.
48
+
49
+ A trademark does not restrict implementing a symbology. It restricts
50
+ branding — how a product names and presents itself.
51
+
52
+
53
+ IMPLEMENTATION BASIS IN THIS PROJECT
54
+ --------------------------------------------------------------------------
55
+
56
+ Codabar is implemented here from published descriptions of the format,
57
+ which are systems and facts rather than works of authorship. No source
58
+ code and no constant table from any other barcode implementation was used,
59
+ consulted or copied, under any licence.
60
+
61
+
62
+ CONCLUSION
63
+ --------------------------------------------------------------------------
64
+
65
+ On the basis of the references below, Codabar is understood to be freely
66
+ implementable and redistributable, and this project's implementation of it
67
+ is distributed under the MIT License with no additional restriction.
68
+
69
+ References relied upon:
70
+ - AIM USS-Codabar [TO VERIFY]
71
+
72
+ This is an engineering assessment, not legal advice. Items marked
73
+ [TO VERIFY] have not been independently confirmed by the author. If your
74
+ use is commercially sensitive, obtain your own legal review.
@@ -0,0 +1,69 @@
1
+ Code 11 — format provenance and usability
2
+ ==========================================================================
3
+
4
+ This file records where the Code 11 symbology comes from, what governs
5
+ it, and the basis on which this project implements and redistributes it.
6
+
7
+ It is an ENGINEERING INVENTORY, NOT LEGAL ADVICE. Items marked [TO VERIFY]
8
+ have not been independently confirmed by the author.
9
+
10
+
11
+ ORIGIN
12
+ --------------------------------------------------------------------------
13
+
14
+ Introduced by Intermec in 1977, primarily for labelling telecommunications
15
+ equipment. [TO VERIFY]
16
+
17
+
18
+ SPECIFICATION
19
+ --------------------------------------------------------------------------
20
+
21
+ AIM published specification for Code 11. Terms vary. [TO VERIFY]
22
+ There is no ISO/IEC standard for Code 11. [TO VERIFY]
23
+
24
+ Specification TEXT is copyrighted by its publisher. The SYMBOLOGY it
25
+ describes is not — an encoding scheme is a system, not a work of
26
+ authorship. This project implements the symbology; it does not reproduce,
27
+ redistribute or excerpt any specification document.
28
+
29
+
30
+ PATENT STATUS
31
+ --------------------------------------------------------------------------
32
+
33
+ The originating patents date from the 1970s-1980s and are understood to
34
+ have expired long ago. [TO VERIFY]
35
+
36
+
37
+ TRADEMARK
38
+ --------------------------------------------------------------------------
39
+
40
+ No live trademark restriction on implementing Code 11 is known to the
41
+ author. [TO VERIFY] That is a statement about the author's knowledge, not
42
+ a finding that no mark subsists: no trademark search was carried out.
43
+
44
+ A trademark does not restrict implementing a symbology. It restricts
45
+ branding — how a product names and presents itself.
46
+
47
+
48
+ IMPLEMENTATION BASIS IN THIS PROJECT
49
+ --------------------------------------------------------------------------
50
+
51
+ Code 11 is implemented here from published descriptions of the format,
52
+ which are systems and facts rather than works of authorship. No source
53
+ code and no constant table from any other barcode implementation was used,
54
+ consulted or copied, under any licence.
55
+
56
+
57
+ CONCLUSION
58
+ --------------------------------------------------------------------------
59
+
60
+ On the basis of the references below, Code 11 is understood to be freely
61
+ implementable and redistributable, and this project's implementation of it
62
+ is distributed under the MIT License with no additional restriction.
63
+
64
+ References relied upon:
65
+ - AIM published specification for Code 11 [TO VERIFY]
66
+
67
+ This is an engineering assessment, not legal advice. Items marked
68
+ [TO VERIFY] have not been independently confirmed by the author. If your
69
+ use is commercially sensitive, obtain your own legal review.
@@ -0,0 +1,69 @@
1
+ Code 128 — format provenance and usability
2
+ ==========================================================================
3
+
4
+ This file records where the Code 128 symbology comes from, what governs
5
+ it, and the basis on which this project implements and redistributes it.
6
+
7
+ It is an ENGINEERING INVENTORY, NOT LEGAL ADVICE. Items marked [TO VERIFY]
8
+ have not been independently confirmed by the author.
9
+
10
+
11
+ ORIGIN
12
+ --------------------------------------------------------------------------
13
+
14
+ Devised by Computer Identics Corporation in 1981. [TO VERIFY]
15
+
16
+
17
+ SPECIFICATION
18
+ --------------------------------------------------------------------------
19
+
20
+ ISO/IEC 15417 — Code 128 bar code symbology specification.
21
+ Published by ISO/IEC; the specification TEXT is copyrighted and
22
+ paywalled, and is not reproduced here.
23
+
24
+ Specification TEXT is copyrighted by its publisher. The SYMBOLOGY it
25
+ describes is not — an encoding scheme is a system, not a work of
26
+ authorship. This project implements the symbology; it does not reproduce,
27
+ redistribute or excerpt any specification document.
28
+
29
+
30
+ PATENT STATUS
31
+ --------------------------------------------------------------------------
32
+
33
+ The originating patents date from the 1970s-1980s and are understood to
34
+ have expired long ago. [TO VERIFY]
35
+
36
+
37
+ TRADEMARK
38
+ --------------------------------------------------------------------------
39
+
40
+ No live trademark restriction on implementing Code 128 is known to the
41
+ author. [TO VERIFY] That is a statement about the author's knowledge, not
42
+ a finding that no mark subsists: no trademark search was carried out.
43
+
44
+ A trademark does not restrict implementing a symbology. It restricts
45
+ branding — how a product names and presents itself.
46
+
47
+
48
+ IMPLEMENTATION BASIS IN THIS PROJECT
49
+ --------------------------------------------------------------------------
50
+
51
+ Code 128 is implemented here from published descriptions of the format,
52
+ which are systems and facts rather than works of authorship. No source
53
+ code and no constant table from any other barcode implementation was used,
54
+ consulted or copied, under any licence.
55
+
56
+
57
+ CONCLUSION
58
+ --------------------------------------------------------------------------
59
+
60
+ On the basis of the references below, Code 128 is understood to be freely
61
+ implementable and redistributable, and this project's implementation of it
62
+ is distributed under the MIT License with no additional restriction.
63
+
64
+ References relied upon:
65
+ - ISO/IEC 15417, ISO/IEC
66
+
67
+ This is an engineering assessment, not legal advice. Items marked
68
+ [TO VERIFY] have not been independently confirmed by the author. If your
69
+ use is commercially sensitive, obtain your own legal review.
@@ -0,0 +1,70 @@
1
+ Code 39 — format provenance and usability
2
+ ==========================================================================
3
+
4
+ This file records where the Code 39 symbology comes from, what governs
5
+ it, and the basis on which this project implements and redistributes it.
6
+
7
+ It is an ENGINEERING INVENTORY, NOT LEGAL ADVICE. Items marked [TO VERIFY]
8
+ have not been independently confirmed by the author.
9
+
10
+
11
+ ORIGIN
12
+ --------------------------------------------------------------------------
13
+
14
+ Devised in 1974 at Intermec, credited to Dr. David Allais and Ray Stevens.
15
+ [TO VERIFY] One of the oldest alphanumeric symbologies still in general
16
+ use.
17
+
18
+
19
+ SPECIFICATION
20
+ --------------------------------------------------------------------------
21
+
22
+ ISO/IEC 16388 — Code 39 bar code symbology specification.
23
+ Published by ISO/IEC; specification TEXT is copyrighted and paywalled.
24
+
25
+ Specification TEXT is copyrighted by its publisher. The SYMBOLOGY it
26
+ describes is not — an encoding scheme is a system, not a work of
27
+ authorship. This project implements the symbology; it does not reproduce,
28
+ redistribute or excerpt any specification document.
29
+
30
+
31
+ PATENT STATUS
32
+ --------------------------------------------------------------------------
33
+
34
+ The originating patents date from the 1970s-1980s and are understood to
35
+ have expired long ago. [TO VERIFY]
36
+
37
+
38
+ TRADEMARK
39
+ --------------------------------------------------------------------------
40
+
41
+ No live trademark restriction on implementing Code 39 is known to the
42
+ author. [TO VERIFY] That is a statement about the author's knowledge, not
43
+ a finding that no mark subsists: no trademark search was carried out.
44
+
45
+ A trademark does not restrict implementing a symbology. It restricts
46
+ branding — how a product names and presents itself.
47
+
48
+
49
+ IMPLEMENTATION BASIS IN THIS PROJECT
50
+ --------------------------------------------------------------------------
51
+
52
+ Code 39 is implemented here from published descriptions of the format,
53
+ which are systems and facts rather than works of authorship. No source
54
+ code and no constant table from any other barcode implementation was used,
55
+ consulted or copied, under any licence.
56
+
57
+
58
+ CONCLUSION
59
+ --------------------------------------------------------------------------
60
+
61
+ On the basis of the references below, Code 39 is understood to be freely
62
+ implementable and redistributable, and this project's implementation of it
63
+ is distributed under the MIT License with no additional restriction.
64
+
65
+ References relied upon:
66
+ - ISO/IEC 16388, ISO/IEC
67
+
68
+ This is an engineering assessment, not legal advice. Items marked
69
+ [TO VERIFY] have not been independently confirmed by the author. If your
70
+ use is commercially sensitive, obtain your own legal review.