Lamp testbench in Rust around the HPCS 6500
lampbench station / export / label / tm30 / calibrate replace the Python lamp_station.py, lamp_export.py, label_printer.py, tm30.py and calibration.py that lived in HPCS6500-py. The driver is a submodule (HPCS6500/, like mppt-testbench). Workspace crates: tm30 (TM-30-18 port of colour-science 0.4.7), brother-ql (raster protocol, byte-identical to brother_ql) and lamp-label (QR + ID labels for the QL-820NWB). Bundles are byte-identical to lamp_export.py's (golden tests); the station runs end to end in a test against the simulated instrument.
No files matched your search
@@ -0,0 +1,294 @@
|
||||
//! Comparison against Python `render_label` (qrcode 8.2 + Pillow 12.3).
|
||||
//!
|
||||
//! Golden data from `tools/golden.py`:
|
||||
//! * `qr_matrices.txt`: module matrices, versions and masks;
|
||||
//! * `label_*.png`: complete Python labels;
|
||||
//! * `text_info.txt`: Pillow's chosen font size, text bbox and draw origin.
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::fs::File;
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use lamp_label::{Bitmap, LabelFont, TEXT_HEIGHT, qr, render_label, render_label_with_font};
|
||||
|
||||
fn golden() -> PathBuf {
|
||||
Path::new(env!("CARGO_MANIFEST_DIR"))
|
||||
.join("tests")
|
||||
.join("golden")
|
||||
}
|
||||
|
||||
fn load_png(path: &Path) -> Bitmap {
|
||||
let mut decoder = png::Decoder::new(File::open(path).unwrap());
|
||||
decoder.set_transformations(png::Transformations::EXPAND | png::Transformations::STRIP_16);
|
||||
let mut reader = decoder.read_info().unwrap();
|
||||
let mut buf = vec![0; reader.output_buffer_size()];
|
||||
let info = reader.next_frame(&mut buf).unwrap();
|
||||
let channels = info.color_type.samples();
|
||||
Bitmap::from_fn(info.width, info.height, |x, y| {
|
||||
buf[y as usize * info.line_size + x as usize * channels] < 128
|
||||
})
|
||||
}
|
||||
|
||||
/// id -> label png file name
|
||||
fn label_files() -> HashMap<String, String> {
|
||||
std::fs::read_to_string(golden().join("labels.txt"))
|
||||
.unwrap()
|
||||
.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
.map(|l| {
|
||||
let (id, file) = l.split_once('\t').unwrap();
|
||||
(id.to_string(), file.to_string())
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
struct GoldenQr {
|
||||
id: String,
|
||||
version: u8,
|
||||
mask: u8,
|
||||
modules: Vec<Vec<bool>>,
|
||||
}
|
||||
|
||||
fn golden_qr() -> Vec<GoldenQr> {
|
||||
let text = std::fs::read_to_string(golden().join("qr_matrices.txt")).unwrap();
|
||||
let mut lines = text.lines();
|
||||
let mut out = Vec::new();
|
||||
while let Some(header) = lines.next() {
|
||||
if header.is_empty() {
|
||||
continue;
|
||||
}
|
||||
let mut parts = header.rsplitn(4, ' ');
|
||||
let size: usize = parts
|
||||
.next()
|
||||
.unwrap()
|
||||
.strip_prefix("size=")
|
||||
.unwrap()
|
||||
.parse()
|
||||
.unwrap();
|
||||
let mask: u8 = parts
|
||||
.next()
|
||||
.unwrap()
|
||||
.strip_prefix("mask=")
|
||||
.unwrap()
|
||||
.parse()
|
||||
.unwrap();
|
||||
let version: u8 = parts
|
||||
.next()
|
||||
.unwrap()
|
||||
.strip_prefix("version=")
|
||||
.unwrap()
|
||||
.parse()
|
||||
.unwrap();
|
||||
let id = parts.next().unwrap().to_string();
|
||||
let modules = (0..size)
|
||||
.map(|_| lines.next().unwrap().bytes().map(|b| b == b'1').collect())
|
||||
.collect();
|
||||
out.push(GoldenQr {
|
||||
id,
|
||||
version,
|
||||
mask,
|
||||
modules,
|
||||
});
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn qr_matrices_match_python() {
|
||||
let cases = golden_qr();
|
||||
assert!(cases.len() >= 28, "golden data missing");
|
||||
let mut failures = Vec::new();
|
||||
for g in &cases {
|
||||
let q = qr::encode(&g.id.to_uppercase()).unwrap();
|
||||
let same_modules = (0..q.size).all(|r| (0..q.size).all(|c| q.get(c, r) == g.modules[r][c]));
|
||||
if q.version != g.version || q.mask != g.mask || q.size != g.modules.len() || !same_modules
|
||||
{
|
||||
failures.push(format!(
|
||||
"{}: rust v{} mask {} vs python v{} mask {} (modules equal: {same_modules})",
|
||||
g.id, q.version, q.mask, g.version, g.mask
|
||||
));
|
||||
}
|
||||
}
|
||||
println!(
|
||||
"QR: {}/{} matrices identical (version, mask and modules)",
|
||||
cases.len() - failures.len(),
|
||||
cases.len()
|
||||
);
|
||||
assert!(failures.is_empty(), "{}", failures.join("\n"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn qr_region_of_label_matches_python() {
|
||||
let files = label_files();
|
||||
let qr_rows = 202 - TEXT_HEIGHT;
|
||||
let mut checked = 0;
|
||||
for g in golden_qr() {
|
||||
let py = load_png(&golden().join(&files[&g.id]));
|
||||
let rs = render_label(&g.id);
|
||||
let diff = (0..qr_rows)
|
||||
.flat_map(|y| (0..202).map(move |x| (x, y)))
|
||||
.filter(|&(x, y)| py.get(x, y) != rs.get(x, y))
|
||||
.count();
|
||||
assert_eq!(diff, 0, "{}: {diff} pixels differ in the QR area", g.id);
|
||||
checked += 1;
|
||||
}
|
||||
println!("QR area (rows 0..150) pixel-identical for {checked} labels");
|
||||
}
|
||||
|
||||
struct TextGolden {
|
||||
id: String,
|
||||
font: String,
|
||||
size: u32,
|
||||
bbox: (i32, i32, i32, i32),
|
||||
origin: (i32, i32),
|
||||
}
|
||||
|
||||
fn text_golden() -> Vec<TextGolden> {
|
||||
let text = std::fs::read_to_string(golden().join("text_info.txt")).unwrap();
|
||||
text.lines()
|
||||
.filter(|l| !l.is_empty())
|
||||
.map(|l| {
|
||||
let mut f = l.split('\t');
|
||||
let id = f.next().unwrap().to_string();
|
||||
let mut kv = HashMap::new();
|
||||
for p in f {
|
||||
let (k, v) = p.split_once('=').unwrap();
|
||||
kv.insert(k, v);
|
||||
}
|
||||
let nums = |s: &str| {
|
||||
s.split(',')
|
||||
.map(|n| n.parse::<i32>().unwrap())
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
let b = nums(kv["bbox"]);
|
||||
let o = nums(kv["origin"]);
|
||||
TextGolden {
|
||||
id,
|
||||
font: kv["font"].to_string(),
|
||||
size: kv["size"].parse().unwrap(),
|
||||
bbox: (b[0], b[1], b[2], b[3]),
|
||||
origin: (o[0], o[1]),
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn text_strip_close_to_python_with_arial_bold() {
|
||||
let arial = Path::new("C:/Windows/Fonts/arialbd.ttf");
|
||||
if !arial.exists() {
|
||||
eprintln!("arialbd.ttf not available, skipping the text comparison");
|
||||
return;
|
||||
}
|
||||
let font = LabelFont::from_file(arial).unwrap();
|
||||
let files = label_files();
|
||||
let top = 202 - TEXT_HEIGHT;
|
||||
let mut report = Vec::new();
|
||||
let mut layout_mismatch = Vec::new();
|
||||
let mut too_different = Vec::new();
|
||||
for g in text_golden() {
|
||||
assert_eq!(g.font, "arialbd.ttf");
|
||||
let (rs, layout) = render_label_with_font(&g.id, &font).unwrap();
|
||||
let py = load_png(&golden().join(&files[&g.id]));
|
||||
let (mut diff, mut ink_py, mut ink_rs) = (0, 0, 0);
|
||||
for y in top..202 {
|
||||
for x in 0..202 {
|
||||
let (p, r) = (py.get(x, y), rs.get(x, y));
|
||||
ink_py += usize::from(p);
|
||||
ink_rs += usize::from(r);
|
||||
diff += usize::from(p != r);
|
||||
}
|
||||
}
|
||||
report.push(format!(
|
||||
"{:<16} size py {:>2} rs {:>2} | bbox py {:?} rs {:?} | origin py {:?} rs {:?} | ink py {:>4} rs {:>4} | differing px {:>4} ({:.1} % of ink)",
|
||||
g.id,
|
||||
g.size,
|
||||
layout.size,
|
||||
g.bbox,
|
||||
layout.bbox,
|
||||
g.origin,
|
||||
layout.origin,
|
||||
ink_py,
|
||||
ink_rs,
|
||||
diff,
|
||||
100.0 * diff as f64 / ink_py.max(1) as f64
|
||||
));
|
||||
if (layout.size, layout.bbox, layout.origin) != (g.size, g.bbox, g.origin) {
|
||||
layout_mismatch.push(g.id.clone());
|
||||
}
|
||||
// glyph rasterisation may differ (no TrueType hinting), but the text
|
||||
// must be essentially the same pixels
|
||||
if diff * 4 >= ink_py {
|
||||
too_different.push(format!(
|
||||
"{}: {diff} differing pixels for {ink_py} ink pixels",
|
||||
g.id
|
||||
));
|
||||
}
|
||||
}
|
||||
println!("text strip vs Python (arialbd.ttf):\n{}", report.join("\n"));
|
||||
assert!(too_different.is_empty(), "{}", too_different.join("\n"));
|
||||
// chosen size, text bbox and draw origin must be exactly Pillow's
|
||||
assert!(
|
||||
layout_mismatch.is_empty(),
|
||||
"size/bbox/origin differ for {layout_mismatch:?}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn builtin_font_fallback_renders() {
|
||||
let font = LabelFont::builtin();
|
||||
let (img, layout) = render_label_with_font("L0006", &font).unwrap();
|
||||
assert_eq!(layout.font, "builtin-5x7");
|
||||
assert_eq!(layout.size, 44);
|
||||
// 5 glyphs of 5x7 cells at scale 4: 116 x 28, centred in the strip
|
||||
assert_eq!(layout.bbox, (0, 0, 116, 28));
|
||||
assert_eq!(layout.origin, (43, 162));
|
||||
let ink: usize = (150..202)
|
||||
.flat_map(|y| (0..202).map(move |x| (x, y)))
|
||||
.filter(|&(x, y)| img.get(x, y))
|
||||
.count();
|
||||
assert!(ink > 500, "text missing ({ink} px)");
|
||||
// long IDs shrink
|
||||
let (_, layout) = render_label_with_font("L0123456789012345", &font).unwrap();
|
||||
assert!(layout.size < 44 && layout.bbox.2 <= 194, "{layout:?}");
|
||||
// same QR as with the TrueType font
|
||||
let (img2, _) = render_label_with_font("L0006", &LabelFont::system()).unwrap();
|
||||
assert!((0..150).all(|y| (0..202).all(|x| img.get(x, y) == img2.get(x, y))));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn png_roundtrip_and_preview() {
|
||||
let label = render_label("L0006");
|
||||
let dir = PathBuf::from(env!("CARGO_TARGET_TMPDIR"));
|
||||
let path = dir.join("lamp_label_L0006.png");
|
||||
lamp_label::save_png(&label, &path).unwrap();
|
||||
assert_eq!(load_png(&path), label);
|
||||
println!("preview written to {}", path.display());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn instructions_for_two_labels() {
|
||||
let data = lamp_label::label_instructions("L0006", 2).unwrap();
|
||||
// Python output for the Python-rendered L0006 label (brother-ql golden data):
|
||||
// same length and identical command bytes; only raster lines carrying
|
||||
// text pixels may differ.
|
||||
let py = std::fs::read(
|
||||
Path::new(env!("CARGO_MANIFEST_DIR")).join("../brother-ql/tests/golden/label_L0006_x2.bin"),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(data.len(), py.len());
|
||||
// preamble 4 + 400 + 2 + 4, page header 3 + 13 + 4 + 4 + 4 + 5, 202 lines of 93, 0x1A
|
||||
let (pre, head, lines) = (410, 33, 202 * 93);
|
||||
let page = head + lines + 1;
|
||||
assert_eq!(data.len(), pre + 2 * page);
|
||||
assert_eq!(data[..pre + head], py[..pre + head]);
|
||||
for p in 0..2 {
|
||||
let start = pre + p * page;
|
||||
assert_eq!(data[start..start + head], py[start..start + head]);
|
||||
assert_eq!(data[start + page - 1], 0x1A);
|
||||
for l in 0..202 {
|
||||
let row = start + head + l * 93;
|
||||
assert_eq!(data[row..row + 3], [0x67, 0x00, 90]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 747 B |
|
After Width: | Height: | Size: 516 B |
|
After Width: | Height: | Size: 569 B |
|
After Width: | Height: | Size: 575 B |
|
After Width: | Height: | Size: 549 B |
|
After Width: | Height: | Size: 584 B |
|
After Width: | Height: | Size: 574 B |
|
After Width: | Height: | Size: 548 B |
|
After Width: | Height: | Size: 592 B |
|
After Width: | Height: | Size: 584 B |
|
After Width: | Height: | Size: 535 B |
|
After Width: | Height: | Size: 529 B |
|
After Width: | Height: | Size: 569 B |
|
After Width: | Height: | Size: 591 B |
|
After Width: | Height: | Size: 550 B |
|
After Width: | Height: | Size: 567 B |
|
After Width: | Height: | Size: 598 B |
|
After Width: | Height: | Size: 553 B |
|
After Width: | Height: | Size: 573 B |
|
After Width: | Height: | Size: 574 B |
|
After Width: | Height: | Size: 573 B |
|
After Width: | Height: | Size: 614 B |
|
After Width: | Height: | Size: 661 B |
|
After Width: | Height: | Size: 807 B |
|
After Width: | Height: | Size: 592 B |
|
After Width: | Height: | Size: 547 B |
|
After Width: | Height: | Size: 651 B |
|
After Width: | Height: | Size: 705 B |
|
After Width: | Height: | Size: 506 B |
|
After Width: | Height: | Size: 934 B |
|
After Width: | Height: | Size: 637 B |
|
After Width: | Height: | Size: 604 B |
|
After Width: | Height: | Size: 532 B |
|
After Width: | Height: | Size: 680 B |
|
After Width: | Height: | Size: 617 B |
@@ -0,0 +1,35 @@
|
||||
L0001 label_L0001.png
|
||||
L0002 label_L0002.png
|
||||
L0003 label_L0003.png
|
||||
L0004 label_L0004.png
|
||||
L0005 label_L0005.png
|
||||
L0006 label_L0006.png
|
||||
L0007 label_L0007.png
|
||||
L0008 label_L0008.png
|
||||
L0009 label_L0009.png
|
||||
L0010 label_L0010.png
|
||||
L0011 label_L0011.png
|
||||
L0012 label_L0012.png
|
||||
L0013 label_L0013.png
|
||||
L0014 label_L0014.png
|
||||
L0015 label_L0015.png
|
||||
L0016 label_L0016.png
|
||||
L0017 label_L0017.png
|
||||
L0018 label_L0018.png
|
||||
L0019 label_L0019.png
|
||||
L0020 label_L0020.png
|
||||
L0999 label_L0999.png
|
||||
L1000 label_L1000.png
|
||||
L12345 label_L12345.png
|
||||
L123456 label_L123456.png
|
||||
12345678 label_12345678.png
|
||||
LAMP-7 X label_LAMP-7_X.png
|
||||
lamp_7 label_lamp_7.png
|
||||
https://example.com/lamp/L0006?x=1 label_https___example_com_lamp_L0006_x_1.png
|
||||
L0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 label_L012345678901234567890123456789012345678.png
|
||||
LABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ label_LABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHI.png
|
||||
L0123 label_L0123.png
|
||||
L9 label_L9.png
|
||||
L0123456789012 label_L0123456789012.png
|
||||
LAVA-7 label_LAVA-7.png
|
||||
WWWWWWWWWW label_WWWWWWWWWW.png
|
||||
@@ -0,0 +1,704 @@
|
||||
L0001 version=1 mask=7 size=21
|
||||
111111100000101111111
|
||||
100000100010101000001
|
||||
101110100010001011101
|
||||
101110100101101011101
|
||||
101110100101101011101
|
||||
100000101000001000001
|
||||
111111101010101111111
|
||||
000000000100000000000
|
||||
100101101011110100000
|
||||
011101001011010101000
|
||||
111111111101001110111
|
||||
110001011000111110000
|
||||
011101101011011100100
|
||||
000000001010011011011
|
||||
111111100001101011101
|
||||
100000101010001001011
|
||||
101110100000111000111
|
||||
101110101110011100111
|
||||
101110100011011100101
|
||||
100000100001100101001
|
||||
111111101110010101100
|
||||
L0002 version=1 mask=7 size=21
|
||||
111111100100001111111
|
||||
100000100010001000001
|
||||
101110100101101011101
|
||||
101110100110101011101
|
||||
101110100111101011101
|
||||
100000101010001000001
|
||||
111111101010101111111
|
||||
000000000000000000000
|
||||
100101101001110100000
|
||||
001100010101010101000
|
||||
110111100111001110111
|
||||
000010011010111110000
|
||||
111101110011011100100
|
||||
000000001000011011011
|
||||
111111100001101011101
|
||||
100000101100001001011
|
||||
101110100110111001111
|
||||
101110101100011100011
|
||||
101110100101011100101
|
||||
100000100111100101001
|
||||
111111101100010101100
|
||||
L0003 version=1 mask=0 size=21
|
||||
111111100110101111111
|
||||
100000101111001000001
|
||||
101110100111001011101
|
||||
101110100111001011101
|
||||
101110101111101011101
|
||||
100000100101001000001
|
||||
111111101010101111111
|
||||
000000000000000000000
|
||||
101010100010100010010
|
||||
001111010011010101000
|
||||
010101101011011100101
|
||||
110110011011110111001
|
||||
000101100011011100100
|
||||
000000001110001001001
|
||||
111111100010100010100
|
||||
100000100000001001011
|
||||
101110101010101011101
|
||||
101110100101010101110
|
||||
101110101101011100101
|
||||
100000100111110111011
|
||||
111111101101011100101
|
||||
L0004 version=1 mask=6 size=21
|
||||
111111101000001111111
|
||||
100000101101001000001
|
||||
101110101100101011101
|
||||
101110100111101011101
|
||||
101110101010101011101
|
||||
100000100111101000001
|
||||
111111101010101111111
|
||||
000000000011100000000
|
||||
100111111100110010111
|
||||
000000001010101010111
|
||||
101110111000011011101
|
||||
100110011111000001111
|
||||
011100111110001001110
|
||||
000000001111100100100
|
||||
111111101110111110111
|
||||
100000101111110110100
|
||||
101110101111101101001
|
||||
101110101101100011100
|
||||
101110100000001001111
|
||||
100000100100011010110
|
||||
111111101111000000110
|
||||
L0005 version=1 mask=7 size=21
|
||||
111111100111101111111
|
||||
100000100101101000001
|
||||
101110100010001011101
|
||||
101110100001101011101
|
||||
101110100101101011101
|
||||
100000101110001000001
|
||||
111111101010101111111
|
||||
000000000110000000000
|
||||
100101101011110100000
|
||||
111100010011010101000
|
||||
001011110011001110111
|
||||
100100001000111110000
|
||||
110001111011011100100
|
||||
000000001100011011011
|
||||
111111100001101011101
|
||||
100000101100001001011
|
||||
101110100100111000011
|
||||
101110101010011100111
|
||||
101110100101011100101
|
||||
100000100001100101001
|
||||
111111101010010101100
|
||||
L0006 version=1 mask=5 size=21
|
||||
111111100110001111111
|
||||
100000101010101000001
|
||||
101110101010101011101
|
||||
101110101101001011101
|
||||
101110100011101011101
|
||||
100000100000101000001
|
||||
111111101010101111111
|
||||
000000001101100000000
|
||||
100000101110111001110
|
||||
010010010010101010111
|
||||
011111110101010010100
|
||||
101011010110000010111
|
||||
000100110110001001110
|
||||
000000001001111100111
|
||||
111111100110101100101
|
||||
100000100101110110100
|
||||
101110100110100101000
|
||||
101110100100100000100
|
||||
101110100110001001111
|
||||
100000100000000010101
|
||||
111111101111010010100
|
||||
L0007 version=1 mask=1 size=21
|
||||
111111101100101111111
|
||||
100000100101001000001
|
||||
101110101010001011101
|
||||
101110100110001011101
|
||||
101110100010101011101
|
||||
100000101110001000001
|
||||
111111101010101111111
|
||||
000000000111000000000
|
||||
101000110111100100101
|
||||
111011011110000000010
|
||||
110100110000001001111
|
||||
110110011110100010011
|
||||
111100100110001001110
|
||||
000000001101011100011
|
||||
111111101111110111110
|
||||
100000100011011100001
|
||||
101110100011111110011
|
||||
101110100100000000100
|
||||
101110101110001001111
|
||||
100000100010100010001
|
||||
111111101100001001111
|
||||
L0008 version=1 mask=6 size=21
|
||||
111111101001101111111
|
||||
100000101100101000001
|
||||
101110101010101011101
|
||||
101110100101101011101
|
||||
101110101110101011101
|
||||
100000100111101000001
|
||||
111111101010101111111
|
||||
000000000001100000000
|
||||
100111111100110010111
|
||||
011001011110101010111
|
||||
100110100100011011101
|
||||
110000010111000001111
|
||||
101110100110001001110
|
||||
000000001011100100100
|
||||
111111101110111110111
|
||||
100000101101110111100
|
||||
101110101101101101101
|
||||
101110101111100011100
|
||||
101110100100001001111
|
||||
100000100100011010110
|
||||
111111101001000000110
|
||||
L0009 version=1 mask=6 size=21
|
||||
111111101011001111111
|
||||
100000101011101000001
|
||||
101110101001001011101
|
||||
101110100100001011101
|
||||
101110101100101011101
|
||||
100000100001101000001
|
||||
111111101010101111111
|
||||
000000000011100000000
|
||||
100111111110110010111
|
||||
011010011000101010111
|
||||
010110111010011011101
|
||||
001101011111000001111
|
||||
010110110110001001110
|
||||
000000001111100100100
|
||||
111111101100111110111
|
||||
100000101001110111100
|
||||
101110101011101101101
|
||||
101110101111100011000
|
||||
101110100100001001111
|
||||
100000100110011010110
|
||||
111111101001000000110
|
||||
L0010 version=1 mask=7 size=21
|
||||
111111100000001111111
|
||||
100000100111101000001
|
||||
101110100010101011101
|
||||
101110100011001011101
|
||||
101110100101101011101
|
||||
100000101100001000001
|
||||
111111101010101111111
|
||||
000000000010000000000
|
||||
100101101111110100000
|
||||
101000011101010101000
|
||||
000110101001001110111
|
||||
001001000100111110000
|
||||
010101100101011100100
|
||||
000000001010011011011
|
||||
111111100011101011001
|
||||
100000101000001001011
|
||||
101110100110111000111
|
||||
101110101010011100011
|
||||
101110100011011100101
|
||||
100000100011100101001
|
||||
111111101000010101100
|
||||
L0011 version=1 mask=2 size=21
|
||||
111111100100101111111
|
||||
100000100011001000001
|
||||
101110101110001011101
|
||||
101110101011001011101
|
||||
101110101011101011101
|
||||
100000101010101000001
|
||||
111111101010101111111
|
||||
000000001011100000000
|
||||
101111100010101111100
|
||||
011010001010100100110
|
||||
101010101011010010100
|
||||
001100010100000110111
|
||||
100011111011010010101
|
||||
000000001101111000111
|
||||
111111100110101100001
|
||||
100000101101111000101
|
||||
101110101100100100100
|
||||
101110101010100100000
|
||||
101110101101010010100
|
||||
100000100010000110101
|
||||
111111101111010010100
|
||||
L0012 version=1 mask=0 size=21
|
||||
111111100110001111111
|
||||
100000101010001000001
|
||||
101110100111101011101
|
||||
101110100001101011101
|
||||
101110101111101011101
|
||||
100000100001001000001
|
||||
111111101010101111111
|
||||
000000000110000000000
|
||||
101010100110100010010
|
||||
111010000101010101000
|
||||
101100111111011100101
|
||||
001110000111110111001
|
||||
001101101101011100100
|
||||
000000001110001001001
|
||||
111111100000100010000
|
||||
100000100010001001011
|
||||
101110101100101011101
|
||||
101110100001010101010
|
||||
101110101101011100101
|
||||
100000100101110111011
|
||||
111111101011011100101
|
||||
L0013 version=1 mask=3 size=21
|
||||
111111101010101111111
|
||||
100000101001001000001
|
||||
101110100100101011101
|
||||
101110101001101011101
|
||||
101110100110001011101
|
||||
100000100000001000001
|
||||
111111101010101111111
|
||||
000000001000000000000
|
||||
101101110100001001011
|
||||
001000010010100100110
|
||||
111111100010111111001
|
||||
110100001000110000001
|
||||
111011110011010010101
|
||||
000000001110010101010
|
||||
111111101010011010111
|
||||
100000101111111000101
|
||||
101110100001001000001
|
||||
101110101110010010110
|
||||
101110101011010010100
|
||||
100000100011101011000
|
||||
111111101011100100010
|
||||
L0014 version=1 mask=7 size=21
|
||||
111111100111001111111
|
||||
100000100000101000001
|
||||
101110100010101011101
|
||||
101110100111001011101
|
||||
101110100101101011101
|
||||
100000101010001000001
|
||||
111111101010101111111
|
||||
000000000000000000000
|
||||
100101101111110100000
|
||||
001001000101010101000
|
||||
110010100111001110111
|
||||
011100010100111110000
|
||||
111001110101011100100
|
||||
000000001100011011011
|
||||
111111100011101011001
|
||||
100000101110001001011
|
||||
101110100010111000011
|
||||
101110101110011100011
|
||||
101110100101011100101
|
||||
100000100011100101001
|
||||
111111101100010101100
|
||||
L0015 version=1 mask=4 size=21
|
||||
111111101111101111111
|
||||
100000100000001000001
|
||||
101110100101101011101
|
||||
101110101100101011101
|
||||
101110101111101011101
|
||||
100000101000101000001
|
||||
111111101010101111111
|
||||
000000001010000000000
|
||||
100010111110111111001
|
||||
100111001110111000101
|
||||
111101100110110001000
|
||||
111010000111100101011
|
||||
010011110111001110110
|
||||
000000001111100100100
|
||||
111111101101001111101
|
||||
100000100000011011001
|
||||
101110101100111000011
|
||||
101110100010111000011
|
||||
101110100000110001000
|
||||
100000100001100101001
|
||||
111111101111001110111
|
||||
L0016 version=1 mask=6 size=21
|
||||
111111101100001111111
|
||||
100000101000101000001
|
||||
101110101011101011101
|
||||
101110100010001011101
|
||||
101110101000101011101
|
||||
100000100001101000001
|
||||
111111101010101111111
|
||||
000000000001100000000
|
||||
100111111010110010111
|
||||
100100000010101010111
|
||||
011111110110011011101
|
||||
101101000001000001111
|
||||
110100101000001001110
|
||||
000000001101100100100
|
||||
111111101100111110011
|
||||
100000101011110110100
|
||||
101110101111101100001
|
||||
101110101011100011100
|
||||
101110100110001001111
|
||||
100000100000011010110
|
||||
111111101011000000110
|
||||
L0017 version=1 mask=3 size=21
|
||||
111111101101101111111
|
||||
100000101110001000001
|
||||
101110100100101011101
|
||||
101110101101101011101
|
||||
101110100110001011101
|
||||
100000100110001000001
|
||||
111111101010101111111
|
||||
000000001010000000000
|
||||
101101110100001001011
|
||||
101001001010100100110
|
||||
001011101100111111001
|
||||
100001011000110000001
|
||||
010111100011010010101
|
||||
000000001000010101010
|
||||
111111101010011010111
|
||||
100000101001111000101
|
||||
101110100101001000101
|
||||
101110101010010010110
|
||||
101110101101010010100
|
||||
100000100011101011000
|
||||
111111101111100100010
|
||||
L0018 version=1 mask=6 size=21
|
||||
111111101011101111111
|
||||
100000101110101000001
|
||||
101110101001101011101
|
||||
101110100010101011101
|
||||
101110101100101011101
|
||||
100000100101101000001
|
||||
111111101010101111111
|
||||
000000000101100000000
|
||||
100111111010110010111
|
||||
101111001110101010111
|
||||
101111101110011011101
|
||||
110101000011000001111
|
||||
011110111000001001110
|
||||
000000001111100100100
|
||||
111111101110111110011
|
||||
100000101011110111100
|
||||
101110101101101101101
|
||||
101110101011100011100
|
||||
101110100100001001111
|
||||
100000100100011010110
|
||||
111111101111000000110
|
||||
L0019 version=1 mask=6 size=21
|
||||
111111101001001111111
|
||||
100000101001101000001
|
||||
101110101010001011101
|
||||
101110100011001011101
|
||||
101110101110101011101
|
||||
100000100011101000001
|
||||
111111101010101111111
|
||||
000000000111100000000
|
||||
100111111000110010111
|
||||
101100001000101010111
|
||||
011111110000011011101
|
||||
001000001011000001111
|
||||
100110101000001001110
|
||||
000000001011100100100
|
||||
111111101100111110011
|
||||
100000101111110111100
|
||||
101110101011101101101
|
||||
101110101011100011000
|
||||
101110100100001001111
|
||||
100000100110011010110
|
||||
111111101111000000110
|
||||
L0020 version=1 mask=0 size=21
|
||||
111111100110001111111
|
||||
100000101111101000001
|
||||
101110100010001011101
|
||||
101110100010101011101
|
||||
101110101001101011101
|
||||
100000100011001000001
|
||||
111111101010101111111
|
||||
000000000100000000000
|
||||
101010100110100010010
|
||||
001101010001010101000
|
||||
110011101001011100101
|
||||
010101010111110111001
|
||||
011101110001011100100
|
||||
000000001110001000001
|
||||
111111100110100010100
|
||||
100000100100001001011
|
||||
101110101100101010101
|
||||
101110100101010101010
|
||||
101110101011011100101
|
||||
100000100101110111011
|
||||
111111101101011100101
|
||||
L0999 version=1 mask=0 size=21
|
||||
111111100001001111111
|
||||
100000101011101000001
|
||||
101110100110001011101
|
||||
101110100100101011101
|
||||
101110101101101011101
|
||||
100000100111001000001
|
||||
111111101010101111111
|
||||
000000000100000000000
|
||||
101010100100100010010
|
||||
010111011011010101000
|
||||
000001101011011101001
|
||||
011111010101110111001
|
||||
011000110001011101000
|
||||
000000001100001000101
|
||||
111111100100100010100
|
||||
100000100010001000011
|
||||
101110101100101010101
|
||||
101110100011010101110
|
||||
101110101011011100101
|
||||
100000100101110111011
|
||||
111111101111011100101
|
||||
L1000 version=1 mask=4 size=21
|
||||
111111101110101111111
|
||||
100000100100001000001
|
||||
101110100111101011101
|
||||
101110101011001011101
|
||||
101110101101101011101
|
||||
100000101010101000001
|
||||
111111101010101111111
|
||||
000000001000000000000
|
||||
100010111000111111001
|
||||
111101001000111000110
|
||||
110011110100110001000
|
||||
010011010001100101011
|
||||
010100101101001110110
|
||||
000000001011100100100
|
||||
111111101011001111001
|
||||
100000100110011011001
|
||||
101110101100111000111
|
||||
101110100100111000111
|
||||
101110100100110001000
|
||||
100000100101100101001
|
||||
111111101111001110111
|
||||
L12345 version=1 mask=2 size=21
|
||||
111111100111001111111
|
||||
100000100000101000001
|
||||
101110101010001011101
|
||||
101110101100101011101
|
||||
101110101100101011101
|
||||
100000101001001000001
|
||||
111111101010101111111
|
||||
000000001010000000000
|
||||
101111100001001111100
|
||||
111011010111111000101
|
||||
110101100110101100100
|
||||
011011001011111000011
|
||||
100110100110100101001
|
||||
000000001110100100011
|
||||
111111100011010010000
|
||||
100000101110000110111
|
||||
101110101101010010000
|
||||
101110101011111101000
|
||||
101110101110101100000
|
||||
100000100001111101101
|
||||
111111101010100100100
|
||||
L123456 version=1 mask=1 size=21
|
||||
111111101100101111111
|
||||
100000100111101000001
|
||||
101110101011001011101
|
||||
101110100111101011101
|
||||
101110100101101011101
|
||||
100000101111101000001
|
||||
111111101010101111111
|
||||
000000000100100000000
|
||||
101000110100000100101
|
||||
111100001001011100001
|
||||
110001111101110111111
|
||||
111011010111011100111
|
||||
111111101001111110010
|
||||
000000001100000000111
|
||||
111111101000001001010
|
||||
100000100010100010011
|
||||
101110100110001001011
|
||||
101110100101011001100
|
||||
101110101111110111011
|
||||
100000100111011011001
|
||||
111111101101111011111
|
||||
12345678 version=1 mask=6 size=21
|
||||
111111101011001111111
|
||||
100000101000101000001
|
||||
101110101101101011101
|
||||
101110100010001011101
|
||||
101110101100101011101
|
||||
100000100111101000001
|
||||
111111101010101111111
|
||||
000000000101100000000
|
||||
100111111110110010111
|
||||
101010010110101011110
|
||||
101110100100011010000
|
||||
111101011011000001111
|
||||
111001111010001001001
|
||||
000000001011100100111
|
||||
111111101100111110010
|
||||
100000101011110111100
|
||||
101110101001101100001
|
||||
101110101111100011100
|
||||
101110100000001001111
|
||||
100000100010011010101
|
||||
111111101001000000110
|
||||
LAMP-7 X version=1 mask=2 size=21
|
||||
111111100110101111111
|
||||
100000100011001000001
|
||||
101110101100001011101
|
||||
101110101010101011101
|
||||
101110101101101011101
|
||||
100000101100101000001
|
||||
111111101010101111111
|
||||
000000001111100000000
|
||||
101111100100101111100
|
||||
110001000100100101111
|
||||
011110110101010011001
|
||||
010110011010000111011
|
||||
100111101101010010001
|
||||
000000001011111101011
|
||||
111111100010101101000
|
||||
100000101101111101000
|
||||
101110101000100110110
|
||||
101110101010100111000
|
||||
101110101111010111000
|
||||
100000100100000010101
|
||||
111111101101010101000
|
||||
lamp_7 version=1 mask=7 size=21
|
||||
111111100101101111111
|
||||
100000100110101000001
|
||||
101110100110001011101
|
||||
101110100000101011101
|
||||
101110100111101011101
|
||||
100000101110001000001
|
||||
111111101010101111111
|
||||
000000000110000000000
|
||||
100101101001110100000
|
||||
011100011111010101010
|
||||
111000111111001111101
|
||||
101110001110111111011
|
||||
001010111101011100110
|
||||
000000001000011110100
|
||||
111111100001101010110
|
||||
100000101010001010011
|
||||
101110100010111101101
|
||||
101110101010011010011
|
||||
101110100101011010101
|
||||
100000100111100000000
|
||||
111111101000010100110
|
||||
https://example.com/lamp/L0006?x=1 version=2 mask=0 size=25
|
||||
1111111000000011101111111
|
||||
1000001011000110101000001
|
||||
1011101001000011001011101
|
||||
1011101000110100101011101
|
||||
1011101011001011101011101
|
||||
1000001000011100101000001
|
||||
1111111010101010101111111
|
||||
0000000001001100100000000
|
||||
1010101000010011000010010
|
||||
1001010011010101111010011
|
||||
1101111111011011100111111
|
||||
1100010011101100100100011
|
||||
1000011100011011111110100
|
||||
0000110100011010100100011
|
||||
1000011011001011101100000
|
||||
0101100011011110010111000
|
||||
1000101010111010111111001
|
||||
0000000010111100100010101
|
||||
1111111001100010101011101
|
||||
1000001001101111100010101
|
||||
1011101010111010111111110
|
||||
1011101000110001010011010
|
||||
1011101010101100000010001
|
||||
1000001000101011010011111
|
||||
1111111011100001110111101
|
||||
L0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 version=4 mask=1 size=33
|
||||
111111101100110101101111001111111
|
||||
100000100111000000110001101000001
|
||||
101110101101110101100101001011101
|
||||
101110100101000100011011001011101
|
||||
101110100100010100110010001011101
|
||||
100000101110011100000001001000001
|
||||
111111101010101010101010101111111
|
||||
000000000001100111001101100000000
|
||||
101000110011000011001101100100101
|
||||
011111001110010001101101110000001
|
||||
001010100000100111010000010101000
|
||||
011010010011010010000100000110000
|
||||
000001111010010101011011100111101
|
||||
100010000101100001100001000110110
|
||||
001100101110100100001100101011011
|
||||
011101011111110000101011100110100
|
||||
011110101100110100001101100101100
|
||||
010001011100100010111101001100110
|
||||
101111101110110110001110001101111
|
||||
101010011101000010011101110010001
|
||||
011001101110100010010101101101100
|
||||
010001011110101011001011100111100
|
||||
110100101100010010101111010010101
|
||||
001100000000100110011100101001110
|
||||
111011101001100011101101111110011
|
||||
000000001101111001110101100011101
|
||||
111111101010011010101000101011101
|
||||
100000100000001010011011100011001
|
||||
101110100111110010010000111110110
|
||||
101110100110011001000011001011000
|
||||
101110101101111100011100011010011
|
||||
100000100110010001010010000010100
|
||||
111111101000000001001000011011001
|
||||
LABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ version=8 mask=4 size=49
|
||||
1111111011011110001001011000110110001100101111111
|
||||
1000001001010010100101010111111001110011101000001
|
||||
1011101000110011010011010010110000001001101011101
|
||||
1011101011111100100001101110010010000001001011101
|
||||
1011101010010110001000111111100011100000001011101
|
||||
1000001011110101101101100010011001001110001000001
|
||||
1111111010101010101010101010101010101010101111111
|
||||
0000000011010011001111100011000100010000000000000
|
||||
1000101110100001010010111110011001010001011111001
|
||||
1101100001001010010100100011000010100001101010010
|
||||
0010101010001010110011001010000101111101011111111
|
||||
1010110111011011010100011010000110010010011101011
|
||||
1110111011110001000010010001001100111010110001000
|
||||
1010110111001100000110000100010011101011001110110
|
||||
0100101011001111011100111011001110111100010110011
|
||||
0111000011100011110001100010111010011010001111101
|
||||
1111001011011000111001010000001101011110011000000
|
||||
1110000010000110101000100111011100100011100110011
|
||||
0110101011100100010110101001101110000001011100011
|
||||
0111110010100101100001000001101011010010111100000
|
||||
0101111001010011110101111011110000110000101101111
|
||||
0100000001111110110011111110100011000101111010010
|
||||
0011111110001110101010111110101000100010111110011
|
||||
1101100010101011100100100011011100111010100010100
|
||||
0111101010110111111001101011110101110001101010110
|
||||
0111100010000001000011100011101100100110100011110
|
||||
1010111111100101110011111110110100011000111110011
|
||||
1101110111000000010000011100101111100111101101011
|
||||
1011101110100100011110111111111110110010000101101
|
||||
0100110011111101000001101010000110100011110001110
|
||||
0110111101110111001011100000011110001101011110011
|
||||
0011010010110010110110110111111011100110111100110
|
||||
1110001001100110000011101101100100011000110100111
|
||||
0001100101110001001111011000111110110000010101011
|
||||
1010001100001100110011001000011100100101100011001
|
||||
1011010001110000100101111111000010101010011111000
|
||||
1111101100101010001010011101001011110000111111011
|
||||
1100110111100111001011001011000001001110111100010
|
||||
0100011101110000001110011110111000110111100100110
|
||||
0111000010010001011100000111001110110010101110010
|
||||
1110001111101110011110111110010000111010111110110
|
||||
0000000010010011001001100010011000010000100011011
|
||||
1111111010101010111011101010011000111111101011101
|
||||
1000001001110010010101100011000011000010100011011
|
||||
1011101010100000100011111110111010101011111110110
|
||||
1011101001001001110111000000111100100101100011100
|
||||
1011101000011110101100100010001100000111101111100
|
||||
1000001000011101110000001111110110000010000101111
|
||||
1111111011101010011000110110001101111100100010101
|
||||
@@ -0,0 +1,10 @@
|
||||
L0001 font=arialbd.ttf size=44 bbox=0,8,125,40 origin=38,152
|
||||
L0006 font=arialbd.ttf size=44 bbox=0,8,125,40 origin=38,152
|
||||
L0123 font=arialbd.ttf size=44 bbox=0,8,125,40 origin=38,152
|
||||
L12345 font=arialbd.ttf size=44 bbox=0,8,149,40 origin=26,152
|
||||
L9 font=arialbd.ttf size=44 bbox=0,8,51,40 origin=75,152
|
||||
L123456 font=arialbd.ttf size=44 bbox=0,8,174,40 origin=14,152
|
||||
L0123456789012 font=arialbd.ttf size=24 bbox=0,5,188,22 origin=7,162
|
||||
LAVA-7 font=arialbd.ttf size=44 bbox=0,8,152,40 origin=25,152
|
||||
WWWWWWWWWW font=arialbd.ttf size=20 bbox=0,4,189,19 origin=6,164
|
||||
lamp_7 font=arialbd.ttf size=44 bbox=0,8,152,49 origin=25,147
|
||||