From 2eb3f2eaadccb232f5e29fd2b54882940a9a4225 Mon Sep 17 00:00:00 2001 From: u8array Date: Sun, 16 Aug 2026 22:55:15 +0200 Subject: [PATCH] feat(fonts): Labelary-calibrated text fidelity for Font 0 and device fonts A-H Snapped bitmap-cell anchoring, one shared device-font resolver, and a reproducible font patch pipeline; every measured glyph lands within a dot of the printed output. --- .gitignore | 3 + package.json | 12 +- packages/core/src/lib/customFonts.ts | 20 + packages/core/src/lib/emittedAnchor.ts | 2 +- .../core/src/lib/labelGeometry/deviceFonts.ts | 44 +- .../labelGeometry/textPositionTransforms.ts | 12 +- .../lib/labelGeometry/textRenderMetrics.ts | 15 +- packages/core/src/lib/zplParser/flushField.ts | 16 +- packages/core/src/registry/text.ts | 4 +- packages/core/src/registry/zplHelpers.ts | 22 +- packages/mcp-server/package.json | 2 +- pnpm-lock.yaml | 458 +++++++++--------- src-tauri/Cargo.lock | 68 +-- src/assets/fonts/NOTICE.md | 8 + src/assets/fonts/PrintLabZPL-Bold.ttf | Bin 140640 -> 117676 bytes src/assets/fonts/PrintLabZPL-Bold.woff2 | Bin 63512 -> 54608 bytes .../textPositionTransforms.test.ts | 27 ++ .../labelGeometry/textRenderMetrics.test.ts | 26 + src/test/deviceFontBoxMatch.test.ts | 109 +++++ src/test/fixtureIdContract.test.ts | 32 ++ src/test/font0PlacementMatch.test.ts | 69 +++ src/test/textBoxMatch.test.ts | 93 +--- src/test/textVisualRegression.test.ts | 40 +- tests/fixtures/charSlug.ts | 34 ++ tests/fixtures/deviceFontBoxMatchCases.ts | 96 ++++ tests/fixtures/font0GlyphCoverageCases.ts | 26 + .../labelary_devicefont_images/fA_m1_5.png | Bin 0 -> 6600 bytes .../labelary_devicefont_images/fA_m1_M.png | Bin 0 -> 6562 bytes .../labelary_devicefont_images/fA_m1_lcP.png | Bin 0 -> 6605 bytes .../labelary_devicefont_images/fA_m2_5.png | Bin 0 -> 6810 bytes .../labelary_devicefont_images/fA_m2_M.png | Bin 0 -> 6741 bytes .../labelary_devicefont_images/fA_m2_lcP.png | Bin 0 -> 6857 bytes .../labelary_devicefont_images/fA_m3_5.png | Bin 0 -> 6974 bytes .../labelary_devicefont_images/fA_m3_M.png | Bin 0 -> 6948 bytes .../labelary_devicefont_images/fA_m3_lcP.png | Bin 0 -> 7098 bytes .../labelary_devicefont_images/fA_m5.png | Bin 0 -> 7080 bytes .../labelary_devicefont_images/fA_snap.png | Bin 0 -> 6605 bytes .../labelary_devicefont_images/fA_w1.png | Bin 0 -> 6667 bytes .../labelary_devicefont_images/fA_w5.png | Bin 0 -> 6937 bytes .../labelary_devicefont_images/fB_m1_5.png | Bin 0 -> 6767 bytes .../labelary_devicefont_images/fB_m1_M.png | Bin 0 -> 6660 bytes .../labelary_devicefont_images/fB_m1_W.png | Bin 0 -> 6794 bytes .../labelary_devicefont_images/fB_m2_5.png | Bin 0 -> 7004 bytes .../labelary_devicefont_images/fB_m2_M.png | Bin 0 -> 6928 bytes .../labelary_devicefont_images/fB_m2_W.png | Bin 0 -> 7543 bytes .../labelary_devicefont_images/fB_m3_5.png | Bin 0 -> 7236 bytes .../labelary_devicefont_images/fB_m3_M.png | Bin 0 -> 7221 bytes .../labelary_devicefont_images/fB_m3_W.png | Bin 0 -> 8305 bytes .../labelary_devicefont_images/fB_m5.png | Bin 0 -> 7289 bytes .../labelary_devicefont_images/fB_snap.png | Bin 0 -> 6787 bytes .../labelary_devicefont_images/fB_w1.png | Bin 0 -> 6785 bytes .../labelary_devicefont_images/fB_w5.png | Bin 0 -> 7090 bytes .../labelary_devicefont_images/fC_m1_5.png | Bin 0 -> 6814 bytes .../labelary_devicefont_images/fC_m1_M.png | Bin 0 -> 6752 bytes .../labelary_devicefont_images/fC_m1_lcP.png | Bin 0 -> 6838 bytes .../labelary_devicefont_images/fC_m2_5.png | Bin 0 -> 7166 bytes .../labelary_devicefont_images/fC_m2_M.png | Bin 0 -> 7148 bytes .../labelary_devicefont_images/fC_m2_lcP.png | Bin 0 -> 7369 bytes .../labelary_devicefont_images/fC_m3_5.png | Bin 0 -> 7404 bytes .../labelary_devicefont_images/fC_m3_M.png | Bin 0 -> 7598 bytes .../labelary_devicefont_images/fC_m3_lcP.png | Bin 0 -> 7804 bytes .../labelary_devicefont_images/fC_m5.png | Bin 0 -> 7699 bytes .../labelary_devicefont_images/fC_snap.png | Bin 0 -> 6875 bytes .../labelary_devicefont_images/fC_w1.png | Bin 0 -> 6879 bytes .../labelary_devicefont_images/fC_w5.png | Bin 0 -> 7357 bytes .../labelary_devicefont_images/fD_m1_5.png | Bin 0 -> 6814 bytes .../labelary_devicefont_images/fD_m1_M.png | Bin 0 -> 6752 bytes .../labelary_devicefont_images/fD_m1_lcP.png | Bin 0 -> 6838 bytes .../labelary_devicefont_images/fD_m2_5.png | Bin 0 -> 7166 bytes .../labelary_devicefont_images/fD_m2_M.png | Bin 0 -> 7148 bytes .../labelary_devicefont_images/fD_m2_lcP.png | Bin 0 -> 7369 bytes .../labelary_devicefont_images/fD_m3_5.png | Bin 0 -> 7404 bytes .../labelary_devicefont_images/fD_m3_M.png | Bin 0 -> 7598 bytes .../labelary_devicefont_images/fD_m3_lcP.png | Bin 0 -> 7804 bytes .../labelary_devicefont_images/fD_m5.png | Bin 0 -> 7699 bytes .../labelary_devicefont_images/fD_snap.png | Bin 0 -> 6875 bytes .../labelary_devicefont_images/fD_w1.png | Bin 0 -> 6879 bytes .../labelary_devicefont_images/fD_w5.png | Bin 0 -> 7357 bytes .../labelary_devicefont_images/fE_m1_5.png | Bin 0 -> 7021 bytes .../labelary_devicefont_images/fE_m1_M.png | Bin 0 -> 7031 bytes .../labelary_devicefont_images/fE_m1_lcP.png | Bin 0 -> 7060 bytes .../labelary_devicefont_images/fE_m2_5.png | Bin 0 -> 7602 bytes .../labelary_devicefont_images/fE_m2_M.png | Bin 0 -> 7648 bytes .../labelary_devicefont_images/fE_m2_lcP.png | Bin 0 -> 7726 bytes .../labelary_devicefont_images/fE_m3_5.png | Bin 0 -> 8253 bytes .../labelary_devicefont_images/fE_m3_M.png | Bin 0 -> 8216 bytes .../labelary_devicefont_images/fE_m3_lcP.png | Bin 0 -> 8377 bytes .../labelary_devicefont_images/fE_m5.png | Bin 0 -> 8553 bytes .../labelary_devicefont_images/fE_snap.png | Bin 0 -> 7119 bytes .../labelary_devicefont_images/fE_w1.png | Bin 0 -> 7268 bytes .../labelary_devicefont_images/fE_w5.png | Bin 0 -> 7959 bytes .../labelary_devicefont_images/fF_m1_5.png | Bin 0 -> 6979 bytes .../labelary_devicefont_images/fF_m1_M.png | Bin 0 -> 6927 bytes .../labelary_devicefont_images/fF_m1_lcP.png | Bin 0 -> 7093 bytes .../labelary_devicefont_images/fF_m2_5.png | Bin 0 -> 7421 bytes .../labelary_devicefont_images/fF_m2_M.png | Bin 0 -> 7582 bytes .../labelary_devicefont_images/fF_m2_lcP.png | Bin 0 -> 7804 bytes .../labelary_devicefont_images/fF_m3_5.png | Bin 0 -> 7938 bytes .../labelary_devicefont_images/fF_m3_M.png | Bin 0 -> 8117 bytes .../labelary_devicefont_images/fF_m3_lcP.png | Bin 0 -> 8486 bytes .../labelary_devicefont_images/fF_m5.png | Bin 0 -> 8250 bytes .../labelary_devicefont_images/fF_snap.png | Bin 0 -> 7123 bytes .../labelary_devicefont_images/fF_w1.png | Bin 0 -> 7153 bytes .../labelary_devicefont_images/fF_w5.png | Bin 0 -> 7746 bytes .../labelary_devicefont_images/fG_m1_5.png | Bin 0 -> 7610 bytes .../labelary_devicefont_images/fG_m1_M.png | Bin 0 -> 7852 bytes .../labelary_devicefont_images/fG_m1_lcP.png | Bin 0 -> 7964 bytes .../labelary_devicefont_images/fG_m2_5.png | Bin 0 -> 8580 bytes .../labelary_devicefont_images/fG_m2_M.png | Bin 0 -> 8995 bytes .../labelary_devicefont_images/fG_m2_lcP.png | Bin 0 -> 9491 bytes .../labelary_devicefont_images/fG_m3_5.png | Bin 0 -> 9591 bytes .../labelary_devicefont_images/fG_m3_M.png | Bin 0 -> 10324 bytes .../labelary_devicefont_images/fG_m3_lcP.png | Bin 0 -> 11052 bytes .../labelary_devicefont_images/fG_m5.png | Bin 0 -> 10496 bytes .../labelary_devicefont_images/fG_snap.png | Bin 0 -> 8064 bytes .../labelary_devicefont_images/fG_w1.png | Bin 0 -> 8241 bytes .../labelary_devicefont_images/fG_w5.png | Bin 0 -> 9336 bytes .../labelary_devicefont_images/fH_m1_5.png | Bin 0 -> 6796 bytes .../labelary_devicefont_images/fH_m1_M.png | Bin 0 -> 6887 bytes .../labelary_devicefont_images/fH_m1_W.png | Bin 0 -> 6843 bytes .../labelary_devicefont_images/fH_m2_5.png | Bin 0 -> 7018 bytes .../labelary_devicefont_images/fH_m2_M.png | Bin 0 -> 7286 bytes .../labelary_devicefont_images/fH_m2_W.png | Bin 0 -> 7160 bytes .../labelary_devicefont_images/fH_m3_5.png | Bin 0 -> 7221 bytes .../labelary_devicefont_images/fH_m3_M.png | Bin 0 -> 7689 bytes .../labelary_devicefont_images/fH_m3_W.png | Bin 0 -> 7444 bytes .../labelary_devicefont_images/fH_m5.png | Bin 0 -> 7526 bytes .../labelary_devicefont_images/fH_snap.png | Bin 0 -> 6779 bytes .../labelary_devicefont_images/fH_w1.png | Bin 0 -> 6950 bytes .../labelary_devicefont_images/fH_w5.png | Bin 0 -> 7277 bytes .../h30_mixed.png | Bin 0 -> 10605 bytes .../labelary_text_default_images/h50_1.png | Bin 0 -> 6673 bytes .../labelary_text_default_images/h50_2.png | Bin 0 -> 7554 bytes .../labelary_text_default_images/h50_3.png | Bin 0 -> 7770 bytes .../labelary_text_default_images/h50_4.png | Bin 0 -> 7129 bytes .../labelary_text_default_images/h50_6.png | Bin 0 -> 7867 bytes .../labelary_text_default_images/h50_7.png | Bin 0 -> 7197 bytes .../labelary_text_default_images/h50_8.png | Bin 0 -> 7952 bytes .../labelary_text_default_images/h50_B.png | Bin 0 -> 7403 bytes .../labelary_text_default_images/h50_C.png | Bin 0 -> 7730 bytes .../labelary_text_default_images/h50_D.png | Bin 0 -> 7382 bytes .../labelary_text_default_images/h50_E.png | Bin 0 -> 6671 bytes .../labelary_text_default_images/h50_F.png | Bin 0 -> 6628 bytes .../labelary_text_default_images/h50_G.png | Bin 0 -> 7758 bytes .../labelary_text_default_images/h50_H.png | Bin 0 -> 6629 bytes .../labelary_text_default_images/h50_I.png | Bin 0 -> 6502 bytes .../labelary_text_default_images/h50_J.png | Bin 0 -> 6908 bytes .../labelary_text_default_images/h50_K.png | Bin 0 -> 7463 bytes .../labelary_text_default_images/h50_L.png | Bin 0 -> 6545 bytes .../labelary_text_default_images/h50_N.png | Bin 0 -> 7167 bytes .../labelary_text_default_images/h50_O.png | Bin 0 -> 7870 bytes .../labelary_text_default_images/h50_P.png | Bin 0 -> 7074 bytes .../labelary_text_default_images/h50_Q.png | Bin 0 -> 7966 bytes .../labelary_text_default_images/h50_R.png | Bin 0 -> 7354 bytes .../labelary_text_default_images/h50_S.png | Bin 0 -> 7898 bytes .../labelary_text_default_images/h50_T.png | Bin 0 -> 6558 bytes .../labelary_text_default_images/h50_U.png | Bin 0 -> 7030 bytes .../labelary_text_default_images/h50_V.png | Bin 0 -> 7909 bytes .../labelary_text_default_images/h50_X.png | Bin 0 -> 7917 bytes .../labelary_text_default_images/h50_Y.png | Bin 0 -> 7347 bytes .../labelary_text_default_images/h50_Z.png | Bin 0 -> 7158 bytes .../labelary_text_default_images/h50_amp.png | Bin 0 -> 8074 bytes .../labelary_text_default_images/h50_at.png | Bin 0 -> 8323 bytes .../labelary_text_default_images/h50_bang.png | Bin 0 -> 6885 bytes .../h50_colon.png | Bin 0 -> 6560 bytes .../h50_comma.png | Bin 0 -> 6694 bytes .../h50_dollar.png | Bin 0 -> 7900 bytes .../h50_dquote.png | Bin 0 -> 7101 bytes .../labelary_text_default_images/h50_gt.png | Bin 0 -> 7352 bytes .../labelary_text_default_images/h50_hash.png | Bin 0 -> 8173 bytes .../labelary_text_default_images/h50_lcB.png | Bin 0 -> 7346 bytes .../labelary_text_default_images/h50_lcC.png | Bin 0 -> 7422 bytes .../labelary_text_default_images/h50_lcD.png | Bin 0 -> 7386 bytes .../labelary_text_default_images/h50_lcE.png | Bin 0 -> 7448 bytes .../labelary_text_default_images/h50_lcF.png | Bin 0 -> 6745 bytes .../labelary_text_default_images/h50_lcG.png | Bin 0 -> 7601 bytes .../labelary_text_default_images/h50_lcH.png | Bin 0 -> 6830 bytes .../labelary_text_default_images/h50_lcJ.png | Bin 0 -> 6736 bytes .../labelary_text_default_images/h50_lcK.png | Bin 0 -> 7195 bytes .../labelary_text_default_images/h50_lcL.png | Bin 0 -> 6501 bytes .../labelary_text_default_images/h50_lcM.png | Bin 0 -> 7036 bytes .../labelary_text_default_images/h50_lcN.png | Bin 0 -> 6815 bytes .../labelary_text_default_images/h50_lcO.png | Bin 0 -> 7568 bytes .../labelary_text_default_images/h50_lcQ.png | Bin 0 -> 7422 bytes .../labelary_text_default_images/h50_lcR.png | Bin 0 -> 6745 bytes .../labelary_text_default_images/h50_lcS.png | Bin 0 -> 7514 bytes .../labelary_text_default_images/h50_lcT.png | Bin 0 -> 6769 bytes .../labelary_text_default_images/h50_lcU.png | Bin 0 -> 6845 bytes .../labelary_text_default_images/h50_lcV.png | Bin 0 -> 7514 bytes .../labelary_text_default_images/h50_lcW.png | Bin 0 -> 8176 bytes .../labelary_text_default_images/h50_lcX.png | Bin 0 -> 7442 bytes .../labelary_text_default_images/h50_lcY.png | Bin 0 -> 7721 bytes .../labelary_text_default_images/h50_lcZ.png | Bin 0 -> 6992 bytes .../h50_lparen.png | Bin 0 -> 7511 bytes .../labelary_text_default_images/h50_lt.png | Bin 0 -> 7356 bytes .../labelary_text_default_images/h50_pct.png | Bin 0 -> 8920 bytes .../labelary_text_default_images/h50_plus.png | Bin 0 -> 6647 bytes .../h50_qmark.png | Bin 0 -> 7343 bytes .../h50_rparen.png | Bin 0 -> 7495 bytes .../labelary_text_default_images/h50_semi.png | Bin 0 -> 6752 bytes .../h50_shipto.png | Bin 0 -> 11188 bytes .../h50_slash.png | Bin 0 -> 7103 bytes .../h50_squote.png | Bin 0 -> 6690 bytes .../labelary_text_default_images/h50_star.png | Bin 0 -> 6981 bytes .../h50_under.png | Bin 0 -> 6499 bytes .../labelary_text_images/h20_n_num.png | Bin 7060 -> 7062 bytes .../labelary_text_images/h30_n_alpha.png | Bin 7499 -> 7565 bytes .../labelary_text_images/h30_n_date.png | Bin 8259 -> 8296 bytes .../labelary_text_images/h30_n_decimal.png | Bin 7237 -> 7245 bytes .../labelary_text_images/h30_n_num.png | Bin 7426 -> 7441 bytes .../labelary_text_images/h39_n_long.png | Bin 9775 -> 9836 bytes .../labelary_text_images/h50_b_mix.png | Bin 7806 -> 7800 bytes .../labelary_text_images/h50_i_mix.png | Bin 8185 -> 8186 bytes .../labelary_text_images/h50_n_num.png | Bin 8011 -> 7994 bytes .../labelary_text_images/h50_r_mix.png | Bin 7783 -> 7784 bytes .../labelary_text_images/h80_n_alpha.png | Bin 8952 -> 8983 bytes .../labelary_text_images/h80_n_num.png | Bin 8891 -> 8950 bytes tests/fixtures/textBoxMatchCases.ts | 23 +- tests/lib/boxMatch.ts | 39 ++ tests/lib/darkBBox.ts | 36 ++ tests/lib/drawKonvaText.ts | 50 ++ tests/lib/inkCanvas.ts | 14 + tests/lib/konvaBaseline.ts | 15 + tests/lib/printLabFont.ts | 18 + .../fetch_labelary_default_text_fixtures.ts | 61 ++- tests/scripts/fetch_labelary_text_fixtures.ts | 7 +- tests/scripts/report_font0_glyph_drift.ts | 125 +++++ 227 files changed, 1205 insertions(+), 421 deletions(-) create mode 100644 src/test/deviceFontBoxMatch.test.ts create mode 100644 src/test/fixtureIdContract.test.ts create mode 100644 src/test/font0PlacementMatch.test.ts create mode 100644 tests/fixtures/charSlug.ts create mode 100644 tests/fixtures/deviceFontBoxMatchCases.ts create mode 100644 tests/fixtures/font0GlyphCoverageCases.ts create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m1_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m2_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m3_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fA_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m1_W.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m2_W.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m3_W.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fB_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m1_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m2_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m3_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fC_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m1_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m2_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m3_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fD_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m1_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m2_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m3_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fE_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m1_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m2_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m3_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fF_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m1_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m2_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m3_lcP.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fG_w5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m1_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m1_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m1_W.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m2_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m2_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m2_W.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m3_5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m3_M.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m3_W.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_m5.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_snap.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_w1.png create mode 100644 tests/fixtures/labelary_devicefont_images/fH_w5.png create mode 100644 tests/fixtures/labelary_text_default_images/h30_mixed.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_1.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_2.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_3.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_4.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_6.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_7.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_8.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_B.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_C.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_D.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_E.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_F.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_G.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_H.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_I.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_J.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_K.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_L.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_N.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_O.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_P.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_Q.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_R.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_S.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_T.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_U.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_V.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_X.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_Y.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_Z.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_amp.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_at.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_bang.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_colon.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_comma.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_dollar.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_dquote.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_gt.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_hash.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcB.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcC.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcD.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcE.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcF.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcG.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcH.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcJ.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcK.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcL.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcM.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcN.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcO.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcQ.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcR.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcS.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcT.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcU.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcV.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcW.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcX.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcY.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lcZ.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lparen.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_lt.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_pct.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_plus.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_qmark.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_rparen.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_semi.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_shipto.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_slash.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_squote.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_star.png create mode 100644 tests/fixtures/labelary_text_default_images/h50_under.png create mode 100644 tests/lib/boxMatch.ts create mode 100644 tests/lib/darkBBox.ts create mode 100644 tests/lib/drawKonvaText.ts create mode 100644 tests/lib/inkCanvas.ts create mode 100644 tests/lib/konvaBaseline.ts create mode 100644 tests/lib/printLabFont.ts create mode 100644 tests/scripts/report_font0_glyph_drift.ts diff --git a/.gitignore b/.gitignore index 30833808..b50c9489 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,6 @@ CLAUDE.md # playwright test-results/ playwright-report/ + +# Local font build tooling, kept out of the repo on purpose. +scripts/fonts/ diff --git a/package.json b/package.json index ad4e40bf..bfd2599b 100644 --- a/package.json +++ b/package.json @@ -59,9 +59,9 @@ "@tauri-apps/cli": "^2.11.4", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.2", - "@testing-library/user-event": "^14.6.3", + "@testing-library/user-event": "^14.6.1", "@types/babel__core": "^7.20.5", - "@types/node": "^26.2.0", + "@types/node": "^26.1.2", "@types/papaparse": "^5.5.2", "@types/pixelmatch": "^5.2.6", "@types/pngjs": "^6.0.5", @@ -70,18 +70,18 @@ "@vitejs/plugin-react": "^6.0.5", "@vitest/coverage-v8": "^4.1.10", "babel-plugin-react-compiler": "^1.0.0", - "eslint": "^10.8.1", + "eslint": "^10.8.0", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.3", - "globals": "^17.9.0", + "globals": "^17.8.0", "jsdom": "^30.0.1", "pixelmatch": "^7.2.0", "pngjs": "^7.0.0", "spdx-expression-parse": "^5.0.0", "tailwindcss": "^4.3.3", "typescript": "~6.0.3", - "typescript-eslint": "^8.66.0", - "vite": "^8.2.1", + "typescript-eslint": "^8.65.0", + "vite": "^8.2.0", "vitest": "^4.1.10" } } diff --git a/packages/core/src/lib/customFonts.ts b/packages/core/src/lib/customFonts.ts index bd0bf9aa..29911dba 100644 --- a/packages/core/src/lib/customFonts.ts +++ b/packages/core/src/lib/customFonts.ts @@ -113,6 +113,26 @@ export function builtinFontFamily(fontId: string | undefined): string | undefine return fontId ? BUILTIN_FONT_FAMILY[fontId] : undefined; } +export type DeviceFontLabel = Pick; + +/** Font id whose bitmap cell grid governs a text field, or undefined for a + * scalable face (^A@ TTF, or a ^CW upload aliasing the id). Single resolver + * for render metrics and both anchor boundaries, so they can never disagree + * and anchors round-trip byte-exact. */ +export function resolveDeviceFontId( + fieldFontId: string | undefined, + printerFontName: string | undefined, + label: DeviceFontLabel, +): string | undefined { + if (!fieldFontId && printerFontName) return undefined; + const eff = fieldFontId ?? label.defaultFontId; + if (!eff) return undefined; + // Only a usable mapping shadows a built-in: FontManager's manual rows + // start as { alias, path: '' } and the export still emits the built-in + // ^A font for those, so preview and anchor must keep it too. + return resolvePreviewFontName(label, eff) !== undefined ? undefined : eff; +} + /** Canvas-only preview TTF name; emit/parse ignore this resolver. */ export function resolvePreviewFontName( label: Pick, diff --git a/packages/core/src/lib/emittedAnchor.ts b/packages/core/src/lib/emittedAnchor.ts index 524da144..2b821dc0 100644 --- a/packages/core/src/lib/emittedAnchor.ts +++ b/packages/core/src/lib/emittedAnchor.ts @@ -18,7 +18,7 @@ export function emittedAnchorDots( box?: BoundingBoxDots, ): { x: number; y: number } { if (obj.type === "text") { - const { x, y } = textZplAnchorCoords(obj as Parameters[0]); + const { x, y } = textZplAnchorCoords(obj as Parameters[0], ctx.label); return { x, y }; } if (GRAPHIC_ANCHOR_TYPES.has(obj.type)) { diff --git a/packages/core/src/lib/labelGeometry/deviceFonts.ts b/packages/core/src/lib/labelGeometry/deviceFonts.ts index e4e327ae..b5236654 100644 --- a/packages/core/src/lib/labelGeometry/deviceFonts.ts +++ b/packages/core/src/lib/labelGeometry/deviceFonts.ts @@ -24,9 +24,11 @@ interface DeviceFontSpec { capInkPerMag: number; // visible cap-ink height per magnification (Labelary) capPerEm: number; // substitute font cap-ink per em advPerEm: number; // substitute font advance per em - // Canvas position trims vs Labelary, as fraction of fontSizeDots. The - // Font-0 em-anchor lands the substitute's cap-top slightly off; these - // nudge it back (both positive = down / right). Labelary-calibrated per font. + // Labelary-calibrated canvas trims: the Font-0 em-anchor lands the + // substitute's cap-top slightly off; these nudge it back (positive = + // down / right). yOffEm is a fraction of fontSizeDots; xOffEm also scales + // with scaleX because it cancels the substitute glyph's left side bearing, + // which is horizontal geometry. yOffEm?: number; xOffEm?: number; // Glyph-shape width multiplier on scaleX: matches a single glyph's width to @@ -41,19 +43,43 @@ interface DeviceFontSpec { const MAX_MAG = 10; const DEVICE_FONTS: Record = { - A: { magStep: 9, magWidthStep: 5, advancePerMag: 6, capInkPerMag: 7.125, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.096, xOffEm: -0.032, widthCorr: 0.964, letterSpacingEm: 0.021 }, + A: { magStep: 9, magWidthStep: 5, advancePerMag: 6, capInkPerMag: 7.125, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.036, xOffEm: -0.032, widthCorr: 0.964, letterSpacingEm: 0.021 }, B: { magStep: 11, magWidthStep: 7, advancePerMag: 9, capInkPerMag: 11.5, capPerEm: 0.762, advPerEm: 0.602, xOffEm: -0.040 }, C: { magStep: 18, magWidthStep: 10, advancePerMag: 12, capInkPerMag: 14.75, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.026, xOffEm: -0.043 }, D: { magStep: 18, magWidthStep: 10, advancePerMag: 12, capInkPerMag: 14.75, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.026, xOffEm: -0.043 }, - E: { magStep: 28, magWidthStep: 15, advancePerMag: 20, capInkPerMag: 21.875, capPerEm: 0.787, advPerEm: 0.723, yOffEm: 0.198, xOffEm: -0.189 }, - F: { magStep: 26, magWidthStep: 13, advancePerMag: 16, capInkPerMag: 22, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.034, xOffEm: -0.052 }, - G: { magStep: 60, magWidthStep: 40, advancePerMag: 48, capInkPerMag: 48, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.055, widthCorr: 0.817, letterSpacingEm: 0.142 }, - H: { magStep: 21, magWidthStep: 13, advancePerMag: 19, capInkPerMag: 21, capPerEm: 0.780, advPerEm: 0.723, yOffEm: -0.030, xOffEm: -0.193 }, + E: { magStep: 28, magWidthStep: 15, advancePerMag: 20, capInkPerMag: 21.875, capPerEm: 0.787, advPerEm: 0.723, yOffEm: 0.198, xOffEm: -0.114 }, + F: { magStep: 26, magWidthStep: 13, advancePerMag: 16, capInkPerMag: 22, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.034, xOffEm: -0.060 }, + G: { magStep: 60, magWidthStep: 40, advancePerMag: 48, capInkPerMag: 49, capPerEm: 0.757, advPerEm: 0.602, yOffEm: 0.025, widthCorr: 0.817, letterSpacingEm: 0.142 }, + H: { magStep: 21, magWidthStep: 13, advancePerMag: 19, capInkPerMag: 21, capPerEm: 0.780, advPerEm: 0.723, yOffEm: -0.030, xOffEm: -0.117 }, }; const magnify = (requested: number, step: number) => Math.min(MAX_MAG, Math.max(1, Math.round(requested / step))); +/** Cell grid per device font. Exported so fixtures/tests derive their ^A + * heights from the same table the snap uses instead of copying it. */ +export const DEVICE_FONT_CELLS: Readonly< + Record +> = Object.fromEntries( + Object.entries(DEVICE_FONTS).map(([id, s]) => [ + id, + { magStep: s.magStep, magWidthStep: s.magWidthStep }, + ]), +); + +/** Requested ^A height snapped to the cell grid, or null for Font 0 / + * unknown ids / non-positive heights. The firmware anchors a bitmap field + * by its snapped cell, so the anchor transform needs this too. */ +export function deviceFontSnappedHeightDots( + fontId: string | undefined, + heightDots: number, +): number | null { + if (!fontId) return null; + const spec = DEVICE_FONTS[fontId]; + if (!spec || !(heightDots > 0)) return null; + return magnify(heightDots, spec.magStep) * spec.magStep; +} + // Zebra fonts B and H (OCR-A) have no lowercase glyphs: B prints uppercase, // H drops lowercase entirely (so "Text" -> "T"). Mirror that on the canvas. const DEVICE_FONT_CASE: Record = { @@ -109,7 +135,7 @@ export function deviceFontMetrics( fontSizeDots, scaleX, yOffsetDots: (spec.yOffEm ?? 0) * fontSizeDots, - xOffsetDots: (spec.xOffEm ?? 0) * fontSizeDots, + xOffsetDots: (spec.xOffEm ?? 0) * fontSizeDots * scaleX, letterSpacingDots: (spec.letterSpacingEm ?? 0) * fontSizeDots, }; } diff --git a/packages/core/src/lib/labelGeometry/textPositionTransforms.ts b/packages/core/src/lib/labelGeometry/textPositionTransforms.ts index 92430eb6..5d617323 100644 --- a/packages/core/src/lib/labelGeometry/textPositionTransforms.ts +++ b/packages/core/src/lib/labelGeometry/textPositionTransforms.ts @@ -1,9 +1,12 @@ // EM-top-left <-> ZPL anchor (^FO cap-top / ^FT baseline). Applied only // at the zplGenerator/zplParser boundary; editor interactions skip it. +import { deviceFontSnappedHeightDots } from "./deviceFonts"; interface TextLikeProps { fontHeight: number; rotation: "N" | "R" | "I" | "B"; + /** Device font id; the pad terms use its snapped cell height. */ + fontId?: string; } export const ZPL_FONT_HEIGHT_TO_CSS_RATIO = 1.0; @@ -21,9 +24,12 @@ function zplAnchorDelta( blockExtentDots = 0, blockReadingWidthDots = 0, ): { dx: number; dy: number } { - const h = props.fontHeight / ZPL_FONT_HEIGHT_TO_CSS_RATIO; - const pad = props.fontHeight * EM_TOP_ABOVE_CAP; - const bias = props.fontHeight * RENDER_Y_BIAS; + const effHeight = + deviceFontSnappedHeightDots(props.fontId, props.fontHeight) ?? + props.fontHeight; + const h = effHeight / ZPL_FONT_HEIGHT_TO_CSS_RATIO; + const pad = effHeight * EM_TOP_ABOVE_CAP; + const bias = effHeight * RENDER_Y_BIAS; const isFT = positionType === "FT"; // FO I/B anchor at the far reading end of the field: a single line ends at // anchor+inkWidth, but an ^FB block ends at anchor+blockWidth (the frame). diff --git a/packages/core/src/lib/labelGeometry/textRenderMetrics.ts b/packages/core/src/lib/labelGeometry/textRenderMetrics.ts index c762a21c..9402d30d 100644 --- a/packages/core/src/lib/labelGeometry/textRenderMetrics.ts +++ b/packages/core/src/lib/labelGeometry/textRenderMetrics.ts @@ -1,4 +1,4 @@ -import { builtinFontFamily, resolvePreviewFontName } from "../customFonts"; +import { builtinFontFamily, resolveDeviceFontId, resolvePreviewFontName } from "../customFonts"; import { applyDeviceFontCase, deviceFontMetrics } from "./deviceFonts"; import { getFontFamily } from "../fontCache"; import type { LabelObject } from "../../types/Group"; @@ -89,16 +89,11 @@ export function getTextRenderMetrics( const defaultPrinterFontName = label ? resolvePreviewFontName(label, label.defaultFontId) : undefined; - // Device fonts (A-H) preview as their substitute face at the snapped - // magnification; a custom upload aliased to the same id (the field's, or the - // default when the field has none) wins. Canvas-only: gated on `label` so the - // emit/parse path keeps PrintLab metrics and the round-trip inkWidth matches. - const effectiveFontId = fieldFontId ?? label?.defaultFontId; - const effectiveCustomName = label - ? resolvePreviewFontName(label, effectiveFontId) + // Canvas-only: gated on `label` so the emit/parse path keeps PrintLab + // metrics and the round-trip inkWidth matches. + const deviceId = label + ? resolveDeviceFontId(fieldFontId, fieldPrinterFontName, label) : undefined; - const deviceId = - label && !effectiveCustomName ? effectiveFontId : undefined; const fontFamilyOverride = deviceId ? builtinFontFamily(deviceId) : undefined; const fontHeight = fontHeightOverride ?? p.fontHeight; const device = deviceFontMetrics(deviceId, fontHeight, p.fontWidth); diff --git a/packages/core/src/lib/zplParser/flushField.ts b/packages/core/src/lib/zplParser/flushField.ts index 254b2d8e..a9389bdc 100644 --- a/packages/core/src/lib/zplParser/flushField.ts +++ b/packages/core/src/lib/zplParser/flushField.ts @@ -19,6 +19,7 @@ import { decodeTbContent } from "../tbContent"; import { zplFdToModelContent } from "../gs1"; import { dataMatrixFdToGs1Content } from "../dataMatrixFd"; import { zplAnchorToModel } from "../labelGeometry/textPositionTransforms"; +import { resolveDeviceFontId } from "../customFonts"; import { blockInterLineExtentDots } from "../zebraTextLayout"; import { computeTextRenderMetrics } from "../labelGeometry/textRenderMetrics"; import type { TextProps } from "../../registry/text"; @@ -265,10 +266,23 @@ export function createFlushField( blockLineSpacing: s.defaults.fbSpacing, fontHeight: s.field.textH, }); + // Same resolution as the generator so anchors round-trip. + const anchorFontId = resolveDeviceFontId( + s.field.pendingFontId, + s.field.pendingPrinterFontName, + { + customFonts: s.result.labelConfig.customFonts, + defaultFontId: s.defaults.cfFontId, + }, + ); const modelPos = zplAnchorToModel( s.field.x, s.field.y, - { fontHeight: s.field.textH, rotation: s.field.textRot }, + { + fontHeight: s.field.textH, + rotation: s.field.textRot, + fontId: anchorFontId, + }, posType, inkWidthDots, blockExtentDots, diff --git a/packages/core/src/registry/text.ts b/packages/core/src/registry/text.ts index 65cb4fea..2d080390 100644 --- a/packages/core/src/registry/text.ts +++ b/packages/core/src/registry/text.ts @@ -207,7 +207,7 @@ export const text: ObjectTypeCore = { // Serial mode: plain ^A field whose ^FD is wrapped by ^SN/^SF. No block, // reverse, ^FP or variable binding (those are cleared on switch). if (p.serial) { - return `${textFieldPos(obj)}${resolveFontCmd(p, ctx)}${serialFieldData(p.content, p.serial)}`; + return `${textFieldPos(obj, ctx?.label)}${resolveFontCmd(p, ctx)}${serialFieldData(p.content, p.serial)}`; } const mode = resolveTextMode(p); const fontCmd = resolveFontCmd(p, ctx); @@ -233,7 +233,7 @@ export const text: ObjectTypeCore = { const fpDir = p.fpDirection ?? "H"; const fpGap = p.fpCharGap ?? 0; const fpCmd = fpDir !== "H" || fpGap > 0 ? `^FP${fpDir},${fpGap}` : ""; - const anchor = textFieldPos(obj); + const anchor = textFieldPos(obj, ctx?.label); const fd = fdFieldFor(content, ctx, undefined, encodeDefault); // ^FR is the spec-true reverse: it knocks the glyph ink out of whatever is // already drawn (e.g. a black ^GB placed behind the text), so we emit it as diff --git a/packages/core/src/registry/zplHelpers.ts b/packages/core/src/registry/zplHelpers.ts index 3dadfc2e..f154e8c4 100644 --- a/packages/core/src/registry/zplHelpers.ts +++ b/packages/core/src/registry/zplHelpers.ts @@ -6,6 +6,7 @@ import { hasClockMarkers, markersToTokens } from "../lib/fcTemplate"; import { hasControlMarkers, resolveControlMarkers } from "../types/controlKey"; import { classifyField } from "../lib/variableField"; import { modelToZplAnchor } from "../lib/labelGeometry/textPositionTransforms"; +import { resolveDeviceFontId, type DeviceFontLabel } from "../lib/customFonts"; import { getTextRenderMetrics } from "../lib/labelGeometry/textRenderMetrics"; import { blockInterLineExtentDots } from "../lib/zebraTextLayout"; import type { LabelObject } from "../types/Group"; @@ -117,6 +118,8 @@ interface TextLikeObjForFieldPos extends LabelObjectBase { props: { fontHeight: number; rotation: "N" | "R" | "I" | "B"; + fontId?: string; + printerFontName?: string; blockWidth?: number; blockLines?: number; blockLineSpacing?: number; @@ -164,8 +167,13 @@ export function resolveFontCmd( return `^A0${rotation},${fontHeight},${fontWidth}`; } -/** Numeric ZPL anchor (cap-top/baseline) for a text-like field. */ -export function textZplAnchorCoords(obj: TextLikeObjForFieldPos): { +/** Numeric ZPL anchor (cap-top/baseline) for a text-like field. `label` + * resolves the effective device font (^CF default, ^CW alias override) + * for the anchor snap. */ +export function textZplAnchorCoords( + obj: TextLikeObjForFieldPos, + label?: DeviceFontLabel, +): { cmd: "FO" | "FT"; x: number; y: number; @@ -174,10 +182,11 @@ export function textZplAnchorCoords(obj: TextLikeObjForFieldPos): { const metrics = getTextRenderMetrics(obj as unknown as LabelObject); const p = obj.props; const blockExtentDots = blockExtentFor(p); + const anchorFontId = resolveDeviceFontId(p.fontId, p.printerFontName, label ?? {}); const a = modelToZplAnchor( obj.x, obj.y, - obj.props, + { ...p, fontId: anchorFontId }, obj.positionType, metrics?.inkWidthDots ?? 0, blockExtentDots, @@ -188,8 +197,11 @@ export function textZplAnchorCoords(obj: TextLikeObjForFieldPos): { } /** Converts EM top-left model coord to ZPL anchor (cap-top/baseline). */ -export function textFieldPos(obj: TextLikeObjForFieldPos): string { - const a = textZplAnchorCoords(obj); +export function textFieldPos( + obj: TextLikeObjForFieldPos, + label?: DeviceFontLabel, +): string { + const a = textZplAnchorCoords(obj, label); // Same echo contract as fieldPosZ (text is never import-normalised). const z = obj.fieldJustify === "R" ? ",1" : ""; return `^${a.cmd}${a.x},${a.y}${z}`; diff --git a/packages/mcp-server/package.json b/packages/mcp-server/package.json index 08264973..04b58636 100644 --- a/packages/mcp-server/package.json +++ b/packages/mcp-server/package.json @@ -17,6 +17,6 @@ "devDependencies": { "esbuild": "^0.28.1", "postject": "^1.0.0-alpha.6", - "tsx": "^4.23.11" + "tsx": "^4.19.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 360f12d8..7dc578de 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -95,7 +95,7 @@ importers: version: 8.0.1 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.8.1(jiti@2.7.0)) + version: 10.0.1(eslint@10.8.0(jiti@2.7.0)) '@napi-rs/canvas': specifier: ^1.0.3 version: 1.0.3 @@ -104,10 +104,10 @@ importers: version: 1.62.1 '@rolldown/plugin-babel': specifier: ^0.2.3 - version: 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + version: 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) '@tailwindcss/vite': specifier: ^4.3.3 - version: 4.3.3(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + version: 4.3.3(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) '@tauri-apps/cli': specifier: ^2.11.4 version: 2.11.4 @@ -118,14 +118,14 @@ importers: specifier: ^16.3.2 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@testing-library/user-event': - specifier: ^14.6.3 - version: 14.6.3(@testing-library/dom@10.4.1) + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) '@types/babel__core': specifier: ^7.20.5 version: 7.20.5 '@types/node': - specifier: ^26.2.0 - version: 26.2.0 + specifier: ^26.1.2 + version: 26.1.2 '@types/papaparse': specifier: ^5.5.2 version: 5.5.2 @@ -143,7 +143,7 @@ importers: version: 19.2.4(@types/react@19.2.18) '@vitejs/plugin-react': specifier: ^6.0.5 - version: 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + version: 6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) '@vitest/coverage-v8': specifier: ^4.1.10 version: 4.1.10(vitest@4.1.10) @@ -151,17 +151,17 @@ importers: specifier: ^1.0.0 version: 1.0.0 eslint: - specifier: ^10.8.1 - version: 10.8.1(jiti@2.7.0) + specifier: ^10.8.0 + version: 10.8.0(jiti@2.7.0) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@10.8.1(jiti@2.7.0)) + version: 7.1.1(eslint@10.8.0(jiti@2.7.0)) eslint-plugin-react-refresh: specifier: ^0.5.3 - version: 0.5.3(eslint@10.8.1(jiti@2.7.0)) + version: 0.5.3(eslint@10.8.0(jiti@2.7.0)) globals: - specifier: ^17.9.0 - version: 17.9.0 + specifier: ^17.8.0 + version: 17.8.0 jsdom: specifier: ^30.0.1 version: 30.0.1 @@ -181,14 +181,14 @@ importers: specifier: ~6.0.3 version: 6.0.3 typescript-eslint: - specifier: ^8.66.0 - version: 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + specifier: ^8.65.0 + version: 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) vite: - specifier: ^8.2.1 - version: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11) + specifier: ^8.2.0 + version: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1) vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + version: 4.1.10(@types/node@26.1.2)(@vitest/coverage-v8@4.1.10)(jsdom@30.0.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) packages/core: dependencies: @@ -224,8 +224,8 @@ importers: specifier: ^1.0.0-alpha.6 version: 1.0.0-alpha.6 tsx: - specifier: ^4.23.11 - version: 4.23.11 + specifier: ^4.19.2 + version: 4.23.1 packages: @@ -832,8 +832,8 @@ packages: resolution: {integrity: sha512-OlI657a5XXvKGFX7kNeIzJ8rO7IXt87Mqu2H8rXE46viAuOfum/JA7ysX7+eBhxNKznT+RCZh418mndlcFX3+w==} engines: {node: '>= 10'} - '@oxc-project/types@0.143.0': - resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + '@oxc-project/types@0.142.0': + resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} '@playwright/test@1.62.1': resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} @@ -857,92 +857,92 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@rolldown/binding-android-arm64@1.2.3': - resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} + '@rolldown/binding-android-arm64@1.2.2': + resolution: {integrity: sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.3': - resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} + '@rolldown/binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.3': - resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} + '@rolldown/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.3': - resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} + '@rolldown/binding-freebsd-x64@1.2.2': + resolution: {integrity: sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.3': - resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.2': + resolution: {integrity: sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.3': - resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} + '@rolldown/binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.3': - resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} + '@rolldown/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.3': - resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} + '@rolldown/binding-linux-ppc64-gnu@1.2.2': + resolution: {integrity: sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.3': - resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} + '@rolldown/binding-linux-s390x-gnu@1.2.2': + resolution: {integrity: sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.3': - resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} + '@rolldown/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.3': - resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} + '@rolldown/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.3': - resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} + '@rolldown/binding-openharmony-arm64@1.2.2': + resolution: {integrity: sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.3': - resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} + '@rolldown/binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.3': - resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} + '@rolldown/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1189,8 +1189,8 @@ packages: '@types/react-dom': optional: true - '@testing-library/user-event@14.6.3': - resolution: {integrity: sha512-6dBq67jT8lE+JTE8Exm02Kt6ze43hz1jdiSpSJwtTZiT1xQQ6b7nZYTTQ9njdArdU8XklOwaDp/AbT/eYSKF4g==} + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -1231,8 +1231,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@26.2.0': - resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} '@types/papaparse@5.5.2': resolution: {integrity: sha512-gFnFp/JMzLHCwRf7tQHrNnfhN4eYBVYYI897CGX4MY1tzY9l2aLkVyx2IlKZ/SAqDbB3I1AOZW5gTMGGsqWliA==} @@ -1261,63 +1261,63 @@ packages: '@types/react@19.2.18': resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@typescript-eslint/eslint-plugin@8.66.0': - resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==} + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.66.0 + '@typescript-eslint/parser': ^8.65.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.66.0': - resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==} + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.66.0': - resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==} + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.66.0': - resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.66.0': - resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.66.0': - resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==} + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.66.0': - resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.66.0': - resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==} + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.66.0': - resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==} + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.66.0': - resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react@6.0.5': @@ -1380,8 +1380,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.18.0: - resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1440,8 +1440,8 @@ packages: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - brace-expansion@5.0.9: - resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} engines: {node: 20 || >=22} browserslist@4.28.2: @@ -1632,8 +1632,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.8.1: - resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1731,8 +1731,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.4.4: - resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + flatted@3.4.3: + resolution: {integrity: sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==} forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -1771,8 +1771,8 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@17.9.0: - resolution: {integrity: sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==} + globals@17.8.0: + resolution: {integrity: sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==} engines: {node: '>=18'} gopd@1.2.0: @@ -2132,15 +2132,15 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} - minimatch@10.2.6: - resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2243,8 +2243,8 @@ packages: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.25: + resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} engines: {node: ^10 || ^12 || >=14} postject@1.0.0-alpha.6: @@ -2320,8 +2320,8 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - rolldown@1.2.3: - resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} + rolldown@1.2.2: + resolution: {integrity: sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2474,8 +2474,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.23.11: - resolution: {integrity: sha512-Ry2oTEUnhBdeEdWIztY8kf3/nBGnPnjMLVGL0YfdRXMORuPER5NlKmayqxtxRxwB1xBN+RivRaJfe7PM1rtiyw==} + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -2487,8 +2487,8 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} - typescript-eslint@8.66.0: - resolution: {integrity: sha512-QlEbBPz/RuJ1XUHj29nm3t0F/O/cSlEnntozqPOYHnnTGAXFamnMBu5i9Vn6vhUPHGAjR+Vl+5J8vPN/BMUrJw==} + typescript-eslint@8.65.0: + resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2528,8 +2528,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@8.2.1: - resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} + vite@8.2.0: + resolution: {integrity: sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3050,9 +3050,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.0(jiti@2.7.0))': dependencies: - eslint: 10.8.1(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3061,7 +3061,7 @@ snapshots: dependencies: '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 10.2.6 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -3073,9 +3073,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.8.1(jiti@2.7.0))': + '@eslint/js@10.0.1(eslint@10.8.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.8.1(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -3249,7 +3249,7 @@ snapshots: '@napi-rs/canvas-win32-arm64-msvc': 1.0.3 '@napi-rs/canvas-win32-x64-msvc': 1.0.3 - '@oxc-project/types@0.143.0': {} + '@oxc-project/types@0.142.0': {} '@playwright/test@1.62.1': dependencies: @@ -3274,56 +3274,56 @@ snapshots: dependencies: react: 19.2.8 - '@rolldown/binding-android-arm64@1.2.3': + '@rolldown/binding-android-arm64@1.2.2': optional: true - '@rolldown/binding-darwin-arm64@1.2.3': + '@rolldown/binding-darwin-arm64@1.2.2': optional: true - '@rolldown/binding-darwin-x64@1.2.3': + '@rolldown/binding-darwin-x64@1.2.2': optional: true - '@rolldown/binding-freebsd-x64@1.2.3': + '@rolldown/binding-freebsd-x64@1.2.2': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + '@rolldown/binding-linux-arm-gnueabihf@1.2.2': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.3': + '@rolldown/binding-linux-arm64-gnu@1.2.2': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.3': + '@rolldown/binding-linux-arm64-musl@1.2.2': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.3': + '@rolldown/binding-linux-ppc64-gnu@1.2.2': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.3': + '@rolldown/binding-linux-s390x-gnu@1.2.2': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.3': + '@rolldown/binding-linux-x64-gnu@1.2.2': optional: true - '@rolldown/binding-linux-x64-musl@1.2.3': + '@rolldown/binding-linux-x64-musl@1.2.2': optional: true - '@rolldown/binding-openharmony-arm64@1.2.3': + '@rolldown/binding-openharmony-arm64@1.2.2': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.3': + '@rolldown/binding-win32-arm64-msvc@1.2.2': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.3': + '@rolldown/binding-win32-x64-msvc@1.2.2': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))': + '@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1))': dependencies: '@babel/core': 8.0.1 picomatch: 4.0.4 - rolldown: 1.2.3 + rolldown: 1.2.2 optionalDependencies: '@babel/runtime': 7.29.2 - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1) '@rolldown/pluginutils@1.0.1': {} @@ -3394,12 +3394,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))': + '@tailwindcss/vite@4.3.3(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1) '@tanstack/react-virtual@3.14.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -3499,7 +3499,7 @@ snapshots: '@types/react': 19.2.18 '@types/react-dom': 19.2.4(@types/react@19.2.18) - '@testing-library/user-event@14.6.3(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: '@testing-library/dom': 10.4.1 @@ -3543,21 +3543,21 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@26.2.0': + '@types/node@26.1.2': dependencies: undici-types: 8.3.0 '@types/papaparse@5.5.2': dependencies: - '@types/node': 26.2.0 + '@types/node': 26.1.2 '@types/pixelmatch@5.2.6': dependencies: - '@types/node': 26.2.0 + '@types/node': 26.1.2 '@types/pngjs@6.0.5': dependencies: - '@types/node': 26.2.0 + '@types/node': 26.1.2 '@types/react-dom@19.2.4(@types/react@19.2.18)': dependencies: @@ -3575,15 +3575,15 @@ snapshots: dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/type-utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.66.0 - eslint: 10.8.1(jiti@2.7.0) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.8.0(jiti@2.7.0) ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3591,58 +3591,58 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 - eslint: 10.8.1(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.66.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.65.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) + '@typescript-eslint/types': 8.65.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.66.0': + '@typescript-eslint/scope-manager@8.65.0': dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 - '@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.8.1(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.66.0': {} + '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.66.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/project-service': 8.65.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 - minimatch: 10.2.6 + minimatch: 10.2.5 semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -3650,28 +3650,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - eslint: 10.8.1(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + eslint: 10.8.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.66.0': + '@typescript-eslint/visitor-keys@8.65.0': dependencies: - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.65.0 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))': + '@vitejs/plugin-react@6.0.5(@rolldown/plugin-babel@0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)))(babel-plugin-react-compiler@1.0.0)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1) optionalDependencies: - '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.3)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + '@rolldown/plugin-babel': 0.2.3(@babel/core@8.0.1)(@babel/runtime@7.29.2)(rolldown@1.2.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) babel-plugin-react-compiler: 1.0.0 '@vitest/coverage-v8@4.1.10(vitest@4.1.10)': @@ -3686,7 +3686,7 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + vitest: 4.1.10(@types/node@26.1.2)(@vitest/coverage-v8@4.1.10)(jsdom@30.0.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) '@vitest/expect@4.1.10': dependencies: @@ -3697,13 +3697,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11))': + '@vitest/mocker@4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1) '@vitest/pretty-format@4.1.10': dependencies: @@ -3734,11 +3734,11 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.18.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.18.0 + acorn: 8.17.0 - acorn@8.18.0: {} + acorn@8.17.0: {} ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: @@ -3804,7 +3804,7 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@5.0.9: + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 @@ -3957,20 +3957,20 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@7.1.1(eslint@10.8.1(jiti@2.7.0)): + eslint-plugin-react-hooks@7.1.1(eslint@10.8.0(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.3 - eslint: 10.8.1(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) hermes-parser: 0.25.1 zod: 4.4.3 zod-validation-error: 4.0.2(zod@4.4.3) transitivePeerDependencies: - supports-color - eslint-plugin-react-refresh@0.5.3(eslint@10.8.1(jiti@2.7.0)): + eslint-plugin-react-refresh@0.5.3(eslint@10.8.0(jiti@2.7.0)): dependencies: - eslint: 10.8.1(jiti@2.7.0) + eslint: 10.8.0(jiti@2.7.0) eslint-scope@9.1.2: dependencies: @@ -3983,9 +3983,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.8.1(jiti@2.7.0): + eslint@10.8.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.7.0 @@ -4012,7 +4012,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.6 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -4022,8 +4022,8 @@ snapshots: espree@11.2.0: dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: @@ -4129,10 +4129,10 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.4 + flatted: 3.4.3 keyv: 4.5.4 - flatted@3.4.4: {} + flatted@3.4.3: {} forwarded@0.2.0: {} @@ -4170,7 +4170,7 @@ snapshots: dependencies: is-glob: 4.0.3 - globals@17.9.0: {} + globals@17.8.0: {} gopd@1.2.0: {} @@ -4455,13 +4455,13 @@ snapshots: dependencies: mime-db: 1.54.0 - minimatch@10.2.6: + minimatch@10.2.5: dependencies: - brace-expansion: 5.0.9 + brace-expansion: 5.0.8 ms@2.1.3: {} - nanoid@3.3.18: {} + nanoid@3.3.17: {} natural-compare@1.4.0: {} @@ -4538,9 +4538,9 @@ snapshots: pngjs@7.0.0: {} - postcss@8.5.26: + postcss@8.5.25: dependencies: - nanoid: 3.3.18 + nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4629,25 +4629,25 @@ snapshots: require-from-string@2.0.2: {} - rolldown@1.2.3: + rolldown@1.2.2: dependencies: - '@oxc-project/types': 0.143.0 + '@oxc-project/types': 0.142.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.3 - '@rolldown/binding-darwin-arm64': 1.2.3 - '@rolldown/binding-darwin-x64': 1.2.3 - '@rolldown/binding-freebsd-x64': 1.2.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.3 - '@rolldown/binding-linux-arm64-gnu': 1.2.3 - '@rolldown/binding-linux-arm64-musl': 1.2.3 - '@rolldown/binding-linux-ppc64-gnu': 1.2.3 - '@rolldown/binding-linux-s390x-gnu': 1.2.3 - '@rolldown/binding-linux-x64-gnu': 1.2.3 - '@rolldown/binding-linux-x64-musl': 1.2.3 - '@rolldown/binding-openharmony-arm64': 1.2.3 - '@rolldown/binding-win32-arm64-msvc': 1.2.3 - '@rolldown/binding-win32-x64-msvc': 1.2.3 + '@rolldown/binding-android-arm64': 1.2.2 + '@rolldown/binding-darwin-arm64': 1.2.2 + '@rolldown/binding-darwin-x64': 1.2.2 + '@rolldown/binding-freebsd-x64': 1.2.2 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.2 + '@rolldown/binding-linux-arm64-gnu': 1.2.2 + '@rolldown/binding-linux-arm64-musl': 1.2.2 + '@rolldown/binding-linux-ppc64-gnu': 1.2.2 + '@rolldown/binding-linux-s390x-gnu': 1.2.2 + '@rolldown/binding-linux-x64-gnu': 1.2.2 + '@rolldown/binding-linux-x64-musl': 1.2.2 + '@rolldown/binding-openharmony-arm64': 1.2.2 + '@rolldown/binding-win32-arm64-msvc': 1.2.2 + '@rolldown/binding-win32-x64-msvc': 1.2.2 router@2.2.0: dependencies: @@ -4798,7 +4798,7 @@ snapshots: tslib@2.8.1: {} - tsx@4.23.11: + tsx@4.23.1: dependencies: esbuild: 0.28.1 optionalDependencies: @@ -4814,13 +4814,13 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 - typescript-eslint@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.8.1(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.8.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -4849,24 +4849,24 @@ snapshots: vary@1.1.2: {} - vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11): + vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 - postcss: 8.5.26 - rolldown: 1.2.3 + postcss: 8.5.25 + rolldown: 1.2.2 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 26.2.0 + '@types/node': 26.1.2 esbuild: 0.28.1 fsevents: 2.3.3 jiti: 2.7.0 - tsx: 4.23.11 + tsx: 4.23.1 - vitest@4.1.10(@types/node@26.2.0)(@vitest/coverage-v8@4.1.10)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)): + vitest@4.1.10(@types/node@26.1.2)(@vitest/coverage-v8@4.1.10)(jsdom@30.0.1)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11)) + '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -4883,10 +4883,10 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.11) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 26.2.0 + '@types/node': 26.1.2 '@vitest/coverage-v8': 4.1.10(vitest@4.1.10) jsdom: 30.0.1 transitivePeerDependencies: diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 241bbb33..9b166ef2 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -261,9 +261,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64" -version = "0.23.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" +checksum = "b25655df2c3cdd83c5e5b293b88acd880332b2ddadd7c30ac43144fdc0033da9" [[package]] name = "bit-set" @@ -464,7 +464,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.20", + "thiserror 2.0.19", ] [[package]] @@ -2128,7 +2128,7 @@ dependencies = [ "jni-sys 0.4.1", "log", "simd_cesu8", - "thiserror 2.0.20", + "thiserror 2.0.19", "walkdir", "windows-link 0.2.1", ] @@ -2430,7 +2430,7 @@ dependencies = [ "once_cell", "png 0.18.1", "serde", - "thiserror 2.0.20", + "thiserror 2.0.19", "windows-sys 0.61.2", ] @@ -2503,9 +2503,9 @@ dependencies = [ [[package]] name = "nusb" -version = "0.2.7" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ef13beb3b3a8fc16fd7aea912ebd3d45dde00a9a5b968d0742297468065845" +checksum = "36a27f8bd2cea8b09029d2d3fa51e7aed1040c76e35a9a77de38d587849b0179" dependencies = [ "core-foundation 0.10.1", "core-foundation-sys", @@ -2782,7 +2782,7 @@ dependencies = [ "objc2-osa-kit", "serde", "serde_json", - "thiserror 2.0.20", + "thiserror 2.0.19", ] [[package]] @@ -3090,7 +3090,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.20", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -3112,7 +3112,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.20", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -3202,7 +3202,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.20", + "thiserror 2.0.19", ] [[package]] @@ -3993,7 +3993,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "smallvec", - "thiserror 2.0.20", + "thiserror 2.0.19", "tokio", "tokio-stream", "tracing", @@ -4061,7 +4061,7 @@ dependencies = [ "sha1", "sha2 0.11.0", "sqlx-core", - "thiserror 2.0.20", + "thiserror 2.0.19", "tracing", ] @@ -4095,7 +4095,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.20", + "thiserror 2.0.19", "tracing", "whoami", ] @@ -4119,7 +4119,7 @@ dependencies = [ "percent-encoding", "serde", "sqlx-core", - "thiserror 2.0.20", + "thiserror 2.0.19", "tracing", "url", ] @@ -4362,7 +4362,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.20", + "thiserror 2.0.19", "tokio", "tray-icon", "url", @@ -4413,7 +4413,7 @@ dependencies = [ "sha2 0.10.9", "syn 2.0.118", "tauri-utils", - "thiserror 2.0.20", + "thiserror 2.0.19", "time", "url", "uuid", @@ -4464,7 +4464,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-plugin-fs", - "thiserror 2.0.20", + "thiserror 2.0.19", "url", ] @@ -4487,7 +4487,7 @@ dependencies = [ "tauri", "tauri-plugin", "tauri-utils", - "thiserror 2.0.20", + "thiserror 2.0.19", "toml 1.1.2+spec-1.1.0", "url", ] @@ -4508,7 +4508,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.20", + "thiserror 2.0.19", "url", "windows", "zbus", @@ -4549,7 +4549,7 @@ dependencies = [ "tauri", "tauri-plugin", "tempfile", - "thiserror 2.0.20", + "thiserror 2.0.19", "time", "tokio", "url", @@ -4569,7 +4569,7 @@ dependencies = [ "serde_json", "tauri", "tauri-plugin", - "thiserror 2.0.20", + "thiserror 2.0.19", ] [[package]] @@ -4590,7 +4590,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "thiserror 2.0.20", + "thiserror 2.0.19", "url", "webkit2gtk", "webview2-com", @@ -4653,7 +4653,7 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.20", + "thiserror 2.0.19", "toml 1.1.2+spec-1.1.0", "url", "urlpattern", @@ -4705,11 +4705,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.20" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.20", + "thiserror-impl 2.0.19", ] [[package]] @@ -4725,9 +4725,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.20" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", @@ -5052,7 +5052,7 @@ dependencies = [ "once_cell", "png 0.18.1", "serde", - "thiserror 2.0.20", + "thiserror 2.0.19", "windows-sys 0.61.2", ] @@ -5479,7 +5479,7 @@ version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" dependencies = [ - "thiserror 2.0.20", + "thiserror 2.0.19", "windows", "windows-core 0.61.2", ] @@ -6003,7 +6003,7 @@ dependencies = [ "sha2 0.10.9", "soup3", "tao-macros", - "thiserror 2.0.20", + "thiserror 2.0.19", "url", "webkit2gtk", "webkit2gtk-sys", @@ -6257,7 +6257,7 @@ dependencies = [ name = "zplab" version = "0.3.2" dependencies = [ - "base64 0.23.1", + "base64 0.23.0", "calamine", "chrono", "dunce", @@ -6277,7 +6277,7 @@ dependencies = [ "tauri-plugin-process", "tauri-plugin-updater", "tauri-plugin-window-state", - "thiserror 2.0.20", + "thiserror 2.0.19", "tokio", "tokio-stream", "windows-sys 0.61.2", diff --git a/src/assets/fonts/NOTICE.md b/src/assets/fonts/NOTICE.md index a1ce4cb3..3af02800 100644 --- a/src/assets/fonts/NOTICE.md +++ b/src/assets/fonts/NOTICE.md @@ -15,6 +15,14 @@ Relative to upstream Roboto Condensed: - Vertical outlines scaled to align cap heights with the same target. - TrueType hinting tables (`prep`, `fpgm`, `cvt`) removed so the modified outlines render unhinted. +- GPOS (kerning, capital spacing) dropped and the GSUB `liga` feature + removed: Zebra's firmware lays out Font 0 with fixed per-glyph + advances, no kerning and no ligatures. +- All outlines shifted down ~0.04 em to match Labelary's vertical + placement; individual glyphs remapped to CG Triumvirate's measured + ink spans, ascenders of `b d k l` trimmed above the x-height and the + `: ;` top dots re-anchored, all via a local fonttools pipeline + calibrated against Labelary. - Family and PostScript names renamed from "Roboto Condensed" to "PrintLab ZPL". diff --git a/src/assets/fonts/PrintLabZPL-Bold.ttf b/src/assets/fonts/PrintLabZPL-Bold.ttf index 207665432f158be2227ca5a393c327b3cb2ab8bd..ada2e1b118fe0c7a3f7a24d21e4a1909b81fda37 100644 GIT binary patch delta 30458 zcmaHT2Uu1|)Ard@9uOP7caRR!Q924rwE%)Nv4DywA}ZLi7wjJ8U;z~?sEEBQc4MMZ zlV~(1F?nN+QInWh;5q#Fo(D|c@B6O*GK4*|Gqba^v$M0ayF9wCy;ssIX9&YEU6|Pn z#|-To9n)v$pW7BQF&EhI`Euf$Y@XvO-YSP z9n#!u07E_>fbYx^g96SQxNE~JTNvk$!>&KBhj#F6Y| zE!ggC4!ev!%-&&NvNC7Jd2%zjO70szj32`v7xV>hVXM%h(pDL&LRA^6IjXO;rfMC~ z*3}-YU8Vhn_WKTfJ51=Xpu>R<|Iy)edg$cn)a(4v(ZA!gjt@G1?Bv>MK&Mrm&UE^z zvu0KY|+UUmU&eUzxy`<-$m#eo!@1uTy z{rUP24LTe2F&JymXz-n(kzsGc3d2o?zZf|f#TsoldSg7$xXSpjNgtDmCcm0SnI@Tz zG2_e(&H9=Zne8xV&5g}7%%_;IF+Xkom4%*#m4%l@gv9`hT8p=q`j%rYcUW;&<+awF zb%^yU>nAqRHf1(TZO+;}x7D`oW4q2yuv=kw#9pvZvp?q0)uF$`Mu!WIog6(J6C6_< zCp)fkY;ydyn{&6AZYA9ocH7WxTeq9tUOH(xSvaLTCC+uutuA3M zHLe|83tiW{@ot4~XWZVqr?^jdzu^&H?lH~dGfyMW0?&<}Uwb)ujrO|L-K+cj?tgpt z@~-rL>l5Zv?z7Y9xo@QJGT*m;W`2YG*7!a4*Y%I}FY@2&|3iRfz<_}5f!cw60*?ln z1^EO`4Z7CDv&X<5^Lw1@@w%s3�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 diff --git a/src/assets/fonts/PrintLabZPL-Bold.woff2 b/src/assets/fonts/PrintLabZPL-Bold.woff2 index 6e8b3985bc18f1b7510077628949190570548722..b6cde60c360384fc5d4c24889b36182ce90511fc 100644 GIT binary patch literal 54608 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 literal 63512 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 diff --git a/src/lib/labelGeometry/textPositionTransforms.test.ts b/src/lib/labelGeometry/textPositionTransforms.test.ts index 9fb729b7..f34ef446 100644 --- a/src/lib/labelGeometry/textPositionTransforms.test.ts +++ b/src/lib/labelGeometry/textPositionTransforms.test.ts @@ -174,4 +174,31 @@ describe('text position transforms — model ↔ ZPL anchor', () => { } } }); + + describe('device font anchor snap', () => { + it('off-grid ^A height anchors by the snapped cell, not the request', () => { + // ^AGN,84 snaps to mag 1 (60): same delta as an exact 60-dot request. + const offGrid = zplAnchorToModel(100, 100, { fontHeight: 84, rotation: 'N', fontId: 'G' }, 'FO'); + const exact = zplAnchorToModel(100, 100, { fontHeight: 60, rotation: 'N', fontId: 'G' }, 'FO'); + expect(offGrid.y).toBeCloseTo(exact.y); + }); + it('snapping up mirrors snapping down', () => { + // 156 rounds to mag 3 (180). + const up = zplAnchorToModel(100, 100, { fontHeight: 156, rotation: 'N', fontId: 'G' }, 'FO'); + const exact = zplAnchorToModel(100, 100, { fontHeight: 180, rotation: 'N', fontId: 'G' }, 'FO'); + expect(up.y).toBeCloseTo(exact.y); + }); + it('scalable ids keep the requested height', () => { + const dev = zplAnchorToModel(100, 100, { fontHeight: 84, rotation: 'N', fontId: '0' }, 'FO'); + const plain = zplAnchorToModel(100, 100, { fontHeight: 84, rotation: 'N' }, 'FO'); + expect(dev.y).toBeCloseTo(plain.y); + }); + it('round-trips at off-grid heights', () => { + const props = { fontHeight: 84, rotation: 'N' as const, fontId: 'G' }; + const anchor = modelToZplAnchor(123, 456, props, 'FO'); + const back = zplAnchorToModel(anchor.x, anchor.y, props, 'FO'); + expect(back.x).toBeCloseTo(123); + expect(back.y).toBeCloseTo(456); + }); + }); }); diff --git a/src/lib/labelGeometry/textRenderMetrics.test.ts b/src/lib/labelGeometry/textRenderMetrics.test.ts index da9a9bf8..9dba1a28 100644 --- a/src/lib/labelGeometry/textRenderMetrics.test.ts +++ b/src/lib/labelGeometry/textRenderMetrics.test.ts @@ -47,4 +47,30 @@ describe("getTextRenderMetrics — device font resolution", () => { expect(m!.fontSizeDots).toBeUndefined(); expect(m!.letterSpacingDots).toBeUndefined(); }); + + it("keeps the built-in device font when a manual alias row has no file yet", () => { + const m = getTextRenderMetrics( + textObj("B"), + undefined, + label({ customFonts: [{ alias: "B", path: "" }] }), + ); + expect(m!.fontSizeDots).toBeDefined(); + expect(m!.content).toBe("ABC"); + }); + + it("renders an ^A@ TTF field as its printer font, not the device default", () => { + const obj = { + ...textObj(), + props: { + content: "Abc", + fontHeight: 30, + fontWidth: 0, + rotation: "N", + printerFontName: "ARIAL.TTF", + }, + } as unknown as LabelObject; + const m = getTextRenderMetrics(obj, undefined, label({ defaultFontId: "B" })); + expect(m!.fontSizeDots).toBeUndefined(); + expect(m!.content).toBe("Abc"); + }); }); diff --git a/src/test/deviceFontBoxMatch.test.ts b/src/test/deviceFontBoxMatch.test.ts new file mode 100644 index 00000000..d2595853 --- /dev/null +++ b/src/test/deviceFontBoxMatch.test.ts @@ -0,0 +1,109 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import * as fs from 'fs'; +import * as path from 'path'; +import { GlobalFonts } from '@napi-rs/canvas'; +import { PNG } from 'pngjs'; +import { deviceFontMetrics } from '@zplab/core/lib/labelGeometry/deviceFonts'; +import { zplAnchorToModel } from '@zplab/core/lib/labelGeometry/textPositionTransforms'; +import { builtinFontFamily } from '@zplab/core/lib/customFonts'; +import { deviceFontBoxMatchCases } from '../../tests/fixtures/deviceFontBoxMatchCases'; +import { darkBBox } from '../../tests/lib/darkBBox'; +import { drawKonvaText } from '../../tests/lib/drawKonvaText'; +import { inkCanvas } from '../../tests/lib/inkCanvas'; +import { expectBoxMatch } from '../../tests/lib/boxMatch'; + +/** + * Box-match regression for the bitmap device fonts (^AA-^AH) through the + * production metrics and placement chain; position is what validates the + * yOffEm/xOffEm calibration. Bboxes, not pixels, for the same reason as + * textBoxMatch: the substitute faces differ in glyph design. + */ + +const FIXTURES_DIR = path.resolve( + process.cwd(), + 'tests/fixtures/labelary_devicefont_images', +); + +const FONT_DIR = path.resolve(process.cwd(), 'src/assets/fonts'); + +/** Bundled TTF per CSS family name; the face choice itself comes from + * builtinFontFamily so a production face swap fails here loudly instead + * of silently testing the old font. */ +const FONT_FILES: Record = { + 'PrintLab Mono': 'PrintLabMono.ttf', + 'Vera Mono': 'VeraMono.ttf', + 'Vera Mono Bold': 'VeraMono-Bold.ttf', + OCRB: 'OCRB.ttf', + OCRA: 'OCRA.ttf', +}; + +function faceFor(fontId: string): { family: string; file: string } { + const family = builtinFontFamily(fontId) + ?.split(',')[0] + ?.replace(/'/g, '') + .trim(); + const file = family ? FONT_FILES[family] : undefined; + if (!family || !file) throw new Error(`no bundled face for font ${fontId}`); + return { family, file }; +} + +const FONT_IDS = [...new Set(deviceFontBoxMatchCases.map((tc) => tc.fontId))]; + +describe('Device font box-match: substitutes vs. Labelary bitmap fonts', () => { + beforeAll(() => { + for (const fontId of FONT_IDS) { + const face = faceFor(fontId); + const p = path.join(FONT_DIR, face.file); + if (!fs.existsSync(p)) throw new Error(`Font file missing at ${p}`); + GlobalFonts.registerFromPath(p, face.family); + } + }); + + it('has device-font fixtures (run fetch_labelary_default_text_fixtures.ts if this fails)', () => { + expect(deviceFontBoxMatchCases.length).toBeGreaterThan(0); + for (const tc of deviceFontBoxMatchCases) { + const fixture = path.join(FIXTURES_DIR, `${tc.id}.png`); + expect(fs.existsSync(fixture), `Missing fixture ${tc.id}.png`).toBe(true); + } + }); + + describe.each(deviceFontBoxMatchCases)('Box: $id', (tc) => { + it('bbox matches Labelary within tolerance', () => { + const metrics = deviceFontMetrics(tc.fontId, tc.fontHeight, tc.fontWidth); + expect(metrics, `no metrics for font ${tc.fontId}`).not.toBeNull(); + if (!metrics) return; + const face = faceFor(tc.fontId); + + const model = zplAnchorToModel( + tc.x, + tc.y, + { fontHeight: tc.fontHeight, rotation: tc.rotation, fontId: tc.fontId }, + 'FO', + ); + const drawX = model.x + metrics.xOffsetDots; + const drawY = model.y + metrics.yOffsetDots; + + const { canvas, ctx } = inkCanvas(); + drawKonvaText(ctx, { + text: tc.text, + x: drawX, + y: drawY, + fontSizePx: metrics.fontSizeDots, + fontFamily: face.family, + scaleX: metrics.scaleX, + letterSpacingPx: metrics.letterSpacingDots, + }); + + const localPng = PNG.sync.read(canvas.toBuffer('image/png')); + const labelaryPng = PNG.sync.read( + fs.readFileSync(path.join(FIXTURES_DIR, `${tc.id}.png`)), + ); + + const localBox = darkBBox(localPng); + const labelaryBox = darkBBox(labelaryPng); + + // Floor 2: device substitutes land within +-2 dots once calibrated. + expectBoxMatch(localBox, labelaryBox, 2, tc.id); + }); + }); +}); diff --git a/src/test/fixtureIdContract.test.ts b/src/test/fixtureIdContract.test.ts new file mode 100644 index 00000000..5eb75421 --- /dev/null +++ b/src/test/fixtureIdContract.test.ts @@ -0,0 +1,32 @@ +import { describe, it, expect } from 'vitest'; +import { textBoxMatchCases } from '../../tests/fixtures/textBoxMatchCases'; +import { font0GlyphCoverageCases } from '../../tests/fixtures/font0GlyphCoverageCases'; + +/** The coverage list deliberately shares ids with the box-match set so + * both read the same fixture PNG; that only stays correct while equal + * ids imply equal render parameters. The fetch script keeps the first + * job per id, so a silent divergence would compare one list's render + * against the other list's fixture. */ +describe('fixture id contract', () => { + it('cases sharing an id share their render parameters', () => { + const byId = new Map(); + for (const tc of [...textBoxMatchCases, ...font0GlyphCoverageCases]) { + // The fetch ZPL emits fontWidth || fontHeight; 0 and an explicit + // width equal to the height are the same fixture. + const params = JSON.stringify([ + tc.text, + tc.fontHeight, + tc.fontWidth || tc.fontHeight, + tc.rotation, + tc.x, + tc.y, + ]); + const prev = byId.get(tc.id); + if (prev !== undefined) { + expect(params, `diverging params for shared id ${tc.id}`).toBe(prev); + } else { + byId.set(tc.id, params); + } + } + }); +}); diff --git a/src/test/font0PlacementMatch.test.ts b/src/test/font0PlacementMatch.test.ts new file mode 100644 index 00000000..6df50841 --- /dev/null +++ b/src/test/font0PlacementMatch.test.ts @@ -0,0 +1,69 @@ +import { describe, it, expect, beforeAll } from 'vitest'; +import * as fs from 'fs'; +import * as path from 'path'; +import { PNG } from 'pngjs'; +import { zplAnchorToModel } from '@zplab/core/lib/labelGeometry/textPositionTransforms'; +import { charSlug } from '../../tests/fixtures/charSlug'; +import { darkBBox } from '../../tests/lib/darkBBox'; +import { drawKonvaText } from '../../tests/lib/drawKonvaText'; +import { inkCanvas } from '../../tests/lib/inkCanvas'; +import { expectBoxMatch } from '../../tests/lib/boxMatch'; +import { + PRINTLAB_FONT_FAMILY, + registerPrintLabZpl, +} from '../../tests/lib/printLabFont'; + +/** + * Font-0 placement gate: size AND position of the calibrated glyphs vs + * Labelary, through the production chain (^FO anchor -> zplAnchorToModel + * -> Konva placement). Guards the font-patch results that the drift + * report only measures; a rebuilt TTF without the patch pipeline turns + * this red. + */ + +const FIXTURES_DIR = path.resolve( + process.cwd(), + 'tests/fixtures/labelary_text_default_images', +); +const H = 50; + +// Representative subset of the font build's calibrated glyphs; '/' +// also guards the kerning strip ('///' collapses if GSUB/GPOS come +// back); 'b' guards the global vertical shift; '5' and 'M' pin the +// chain. +const GLYPHS = ['_', '<', '>', '@', '*', '$', '(', ')', '/', 'f', 'j', 'Q', 'p', 'b', '5', 'M']; + +describe('Font 0 placement match: patched glyphs vs Labelary', () => { + beforeAll(() => { + registerPrintLabZpl(); + }); + + describe.each(GLYPHS)('Glyph: %s', (glyph) => { + it('bbox and position match Labelary within tolerance', () => { + const id = `h${H}_${charSlug(glyph)}`; + const fixture = path.join(FIXTURES_DIR, `${id}.png`); + expect( + fs.existsSync(fixture), + `Missing fixture ${id}.png (run fetch_labelary_default_text_fixtures.ts)`, + ).toBe(true); + + const { canvas, ctx } = inkCanvas(); + const model = zplAnchorToModel(200, 200, { fontHeight: H, rotation: 'N' }, 'FO'); + drawKonvaText(ctx, { + text: glyph.repeat(3), + x: model.x, + y: model.y, + fontSizePx: H, + fontFamily: PRINTLAB_FONT_FAMILY, + fontStyle: 'bold', + }); + + const localBox = darkBBox(PNG.sync.read(canvas.toBuffer('image/png'))); + const labelaryBox = darkBBox(PNG.sync.read(fs.readFileSync(fixture))); + + // Floor 3: sub-10-dot punctuation boxes carry +-3 dots of AA and + // rounding noise; the regressions this gate exists for measure 4+. + expectBoxMatch(localBox, labelaryBox, 3, id); + }); + }); +}); diff --git a/src/test/textBoxMatch.test.ts b/src/test/textBoxMatch.test.ts index 84cc36da..191c7ec3 100644 --- a/src/test/textBoxMatch.test.ts +++ b/src/test/textBoxMatch.test.ts @@ -1,9 +1,16 @@ import { describe, it, expect, beforeAll } from 'vitest'; import * as fs from 'fs'; import * as path from 'path'; -import { createCanvas, GlobalFonts } from '@napi-rs/canvas'; + import { PNG } from 'pngjs'; import { textBoxMatchCases } from '../../tests/fixtures/textBoxMatchCases'; +import { darkBBox } from '../../tests/lib/darkBBox'; +import { drawKonvaText } from '../../tests/lib/drawKonvaText'; +import { inkCanvas } from '../../tests/lib/inkCanvas'; +import { + PRINTLAB_FONT_FAMILY, + registerPrintLabZpl, +} from '../../tests/lib/printLabFont'; /** * Box-match regression. @@ -31,62 +38,16 @@ const FIXTURES_DIR = path.resolve( process.cwd(), 'tests/fixtures/labelary_text_default_images', ); -const FONT_PATH = path.resolve( - process.cwd(), - 'src/assets/fonts/PrintLabZPL-Bold.ttf', -); - -const CANVAS_PX = 812; -const FONT_FAMILY = 'PrintLab ZPL'; - -/** Per-axis tolerance in dots. Cap-bound and digit content lands at - * ≤3 dots once the font's per-glyph advance and vertical scaling are - * applied. The 6-dot allowance covers ascender / descender outliers - * where Roboto's inherent vertical proportions disagree with - * CG Triumvirate's by a few dots, visible only for `i` (dot above - * x-height), `p` (descender) and `.` (baseline edge). A real layout - * regression (wrong advance class, wrong fontSize) produces drift - * >12 dots even at small sizes, well above this ceiling. */ +/** Per-axis size tolerance across the 20-80 sweep: calibrated content + * lands at <=3 dots, 6 leaves AA/rounding headroom, and a real layout + * regression (wrong advance class, wrong fontSize) produces >12 even + * at small sizes. */ const BBOX_TOLERANCE_DOTS = 6; -interface BBox { - width: number; - height: number; -} - -/** Scan a PNG for the smallest rectangle that contains all darkish - * pixels. Returns extent in pixels (= dots on our 8 dpmm canvas). */ -function darkBBox(png: PNG): BBox { - const { width, height, data } = png; - let minX = width; - let minY = height; - let maxX = -1; - let maxY = -1; - for (let y = 0; y < height; y++) { - for (let x = 0; x < width; x++) { - const idx = (y * width + x) * 4; - const lum = - 0.299 * (data[idx] ?? 0) + - 0.587 * (data[idx + 1] ?? 0) + - 0.114 * (data[idx + 2] ?? 0); - if (lum < 200) { - if (x < minX) minX = x; - if (y < minY) minY = y; - if (x > maxX) maxX = x; - if (y > maxY) maxY = y; - } - } - } - if (maxX < 0) return { width: 0, height: 0 }; - return { width: maxX - minX + 1, height: maxY - minY + 1 }; -} describe('Text Box-Match — PrintLab ZPL vs. Labelary default font', () => { beforeAll(() => { - if (!fs.existsSync(FONT_PATH)) { - throw new Error(`Font file missing at ${FONT_PATH}`); - } - GlobalFonts.registerFromPath(FONT_PATH, FONT_FAMILY); + registerPrintLabZpl(); }); it('has default-font fixtures (run fetch_labelary_default_text_fixtures.ts if this fails)', () => { @@ -99,22 +60,18 @@ describe('Text Box-Match — PrintLab ZPL vs. Labelary default font', () => { describe.each(textBoxMatchCases)('Box: $id', (tc) => { it(`bbox matches Labelary default within ±${BBOX_TOLERANCE_DOTS} dots`, () => { - // Render our font locally exactly as production does. - const canvas = createCanvas(CANVAS_PX, CANVAS_PX); - const ctx = canvas.getContext('2d'); - ctx.fillStyle = 'white'; - ctx.fillRect(0, 0, CANVAS_PX, CANVAS_PX); - ctx.fillStyle = 'black'; - ctx.font = `bold ${tc.fontHeight}px "${FONT_FAMILY}"`; - ctx.textBaseline = 'top'; - // Mirror Konva's scaleX: ZPL `^A0,h,w` with w != h stretches each - // glyph horizontally; w = 0 is the Zebra shorthand for "match h". - const scaleX = tc.fontWidth > 0 ? tc.fontWidth / tc.fontHeight : 1; - ctx.save(); - ctx.translate(tc.x, tc.y); - ctx.scale(scaleX, 1); - ctx.fillText(tc.text, 0, 0); - ctx.restore(); + // ZPL `^A0,h,w` with w != h stretches each glyph; w = 0 means + // "match h". + const { canvas, ctx } = inkCanvas(); + drawKonvaText(ctx, { + text: tc.text, + x: tc.x, + y: tc.y, + fontSizePx: tc.fontHeight, + fontFamily: PRINTLAB_FONT_FAMILY, + fontStyle: 'bold', + scaleX: tc.fontWidth > 0 ? tc.fontWidth / tc.fontHeight : 1, + }); const localPng = PNG.sync.read(canvas.toBuffer('image/png')); const labelaryPng = PNG.sync.read( diff --git a/src/test/textVisualRegression.test.ts b/src/test/textVisualRegression.test.ts index f98e7ca4..5a90433b 100644 --- a/src/test/textVisualRegression.test.ts +++ b/src/test/textVisualRegression.test.ts @@ -1,9 +1,13 @@ import { describe, it, expect, beforeAll } from 'vitest'; import * as fs from 'fs'; import * as path from 'path'; -import { createCanvas, GlobalFonts } from '@napi-rs/canvas'; import pixelmatch from 'pixelmatch'; import { PNG } from 'pngjs'; +import { inkCanvas, INK_CANVAS_PX } from '../../tests/lib/inkCanvas'; +import { + PRINTLAB_FONT_FAMILY, + registerPrintLabZpl, +} from '../../tests/lib/printLabFont'; import { textTestCases } from '../../tests/fixtures/textTestCases'; /** @@ -31,10 +35,6 @@ const FIXTURES_DIR = path.resolve( 'tests/fixtures/labelary_text_images', ); const DIFF_DIR = path.resolve(process.cwd(), 'tests/fixtures/__text_diffs__'); -const FONT_PATH = path.resolve(process.cwd(), 'src/assets/fonts/PrintLabZPL-Bold.ttf'); - -const CANVAS_PX = 812; // 4x4 inch at 8 dpmm, matches the fixture canvas. -const FONT_FAMILY = 'PrintLab ZPL'; /** Diff allowance. With both sides loading the same TTF the remaining * delta is anti-aliasing edge variance between the renderers, sized @@ -52,10 +52,7 @@ if (!fs.existsSync(DIFF_DIR)) { describe('Text renderer-pair stability (Skia vs Labelary, shared TTF)', () => { beforeAll(() => { - if (!fs.existsSync(FONT_PATH)) { - throw new Error(`Font file missing at ${FONT_PATH}.`); - } - GlobalFonts.registerFromPath(FONT_PATH, FONT_FAMILY); + registerPrintLabZpl(); }); it('has fixtures (run fetch_labelary_text_fixtures.ts if this fails)', () => { @@ -71,32 +68,27 @@ describe('Text renderer-pair stability (Skia vs Labelary, shared TTF)', () => { describe.each(textTestCases)('Text: $id', (tc) => { it('matches Labelary within anti-aliasing tolerance', () => { - // Local render: PrintLab ZPL at fontSize = fontHeight, anchored - // at the same FO origin as the fixture. Production sets - // `textBaseline = 'top'` implicitly via Konva.Text's anchor model, - // so we mirror that here. - const canvas = createCanvas(CANVAS_PX, CANVAS_PX); - const ctx = canvas.getContext('2d'); - ctx.fillStyle = 'white'; - ctx.fillRect(0, 0, CANVAS_PX, CANVAS_PX); - ctx.fillStyle = 'black'; - ctx.font = `bold ${tc.fontHeight}px "${FONT_FAMILY}"`; + // Deliberately NOT drawKonvaText: this is a pixel diff against + // fixtures rendered at textBaseline='top'; the shared helper's + // alphabetic-baseline offset would shift the render off them. + const { canvas, ctx } = inkCanvas(); + ctx.font = `bold ${tc.fontHeight}px "${PRINTLAB_FONT_FAMILY}"`; ctx.textBaseline = 'top'; ctx.fillText(tc.text, tc.x, tc.y); const localPng = PNG.sync.read(canvas.toBuffer('image/png')); const fixtureBuf = fs.readFileSync(path.join(FIXTURES_DIR, `${tc.id}.png`)); const fixturePng = PNG.sync.read(fixtureBuf); - expect(fixturePng.width).toBe(CANVAS_PX); - expect(fixturePng.height).toBe(CANVAS_PX); + expect(fixturePng.width).toBe(INK_CANVAS_PX); + expect(fixturePng.height).toBe(INK_CANVAS_PX); - const diff = new PNG({ width: CANVAS_PX, height: CANVAS_PX }); + const diff = new PNG({ width: INK_CANVAS_PX, height: INK_CANVAS_PX }); const diffCount = pixelmatch( fixturePng.data, localPng.data, diff.data, - CANVAS_PX, - CANVAS_PX, + INK_CANVAS_PX, + INK_CANVAS_PX, { threshold: 0.1 }, ); diff --git a/tests/fixtures/charSlug.ts b/tests/fixtures/charSlug.ts new file mode 100644 index 00000000..4bcd8ed0 --- /dev/null +++ b/tests/fixtures/charSlug.ts @@ -0,0 +1,34 @@ +/** Case-insensitive filesystems would collide `A` and `a`, so + * lowercase gets an `lc` prefix. */ +export const PUNCT_SLUGS: Record = { + '-': 'minus', + '.': 'dot', + '=': 'eq', + ',': 'comma', + ':': 'colon', + ';': 'semi', + '/': 'slash', + '+': 'plus', + '*': 'star', + '#': 'hash', + '&': 'amp', + '%': 'pct', + '$': 'dollar', + '(': 'lparen', + ')': 'rparen', + '!': 'bang', + '?': 'qmark', + '@': 'at', + '_': 'under', + '"': 'dquote', + "'": 'squote', + '<': 'lt', + '>': 'gt', +}; + +export function charSlug(c: string): string { + const punct = PUNCT_SLUGS[c]; + if (punct) return punct; + if (c >= 'a' && c <= 'z') return `lc${c.toUpperCase()}`; + return c; +} diff --git a/tests/fixtures/deviceFontBoxMatchCases.ts b/tests/fixtures/deviceFontBoxMatchCases.ts new file mode 100644 index 00000000..de0fece7 --- /dev/null +++ b/tests/fixtures/deviceFontBoxMatchCases.ts @@ -0,0 +1,96 @@ +/** Heights are exact cell multiples (mag 1-3) plus one off-multiple + * case per font that must snap to mag 1, proving our rounding agrees + * with the firmware's. */ +import { DEVICE_FONT_CELLS } from '@zplab/core/lib/labelGeometry/deviceFonts'; +import { charSlug } from './charSlug'; + +export interface DeviceFontBoxMatchCase { + id: string; + fontId: string; + fontHeight: number; + /** Width parameter of `^A{id},h,w`. 0 = derive from height. */ + fontWidth: number; + text: string; + rotation: 'N'; + x: number; + y: number; +} + +interface FontPlan { + fontId: string; + magStep: number; + magWidthStep: number; + chars: string[]; +} + +// Chars per font: a digit, a wide cap, and where the font has +// lowercase a descender ('p') for baseline reach. B is caps-only and +// H (OCR-A) drops lowercase, so they test 'W' instead. +const ULD_CHARS = ['5', 'M', 'p']; +const CAPS_CHARS = ['5', 'M', 'W']; + +const FONT_PLANS: FontPlan[] = Object.entries(DEVICE_FONT_CELLS).map( + ([fontId, cell]) => ({ + fontId, + magStep: cell.magStep, + magWidthStep: cell.magWidthStep, + chars: fontId === 'B' || fontId === 'H' ? CAPS_CHARS : ULD_CHARS, + }), +); + +const MAGS = [1, 2, 3]; + +const magCases: DeviceFontBoxMatchCase[] = FONT_PLANS.flatMap((plan) => + MAGS.flatMap((mag) => + plan.chars.map((c) => ({ + id: `f${plan.fontId}_m${mag}_${charSlug(c)}`, + fontId: plan.fontId, + fontHeight: plan.magStep * mag, + fontWidth: 0, + text: c.repeat(3), + rotation: 'N' as const, + x: 100, + y: 100, + })), + ), +); + +/** Off-multiple heights: 1.4x the cell must round down to mag 1 on + * both sides. */ +const snapCases: DeviceFontBoxMatchCase[] = FONT_PLANS.map((plan) => ({ + id: `f${plan.fontId}_snap`, + fontId: plan.fontId, + fontHeight: Math.round(plan.magStep * 1.4), + fontWidth: 0, + text: '505', + rotation: 'N' as const, + x: 100, + y: 100, +})); + +/** Width sweeps: explicit `^A,h,w` with w decoupled from h exercises + * the magW path (untested by the w=0 cases above), plus one high-mag + * case. Two chars and a tighter origin keep font G inside the 812-dot + * label at mag 5. */ +const sweepCases: DeviceFontBoxMatchCase[] = FONT_PLANS.flatMap((plan) => + [ + { h: 3, w: 1, slug: 'w1' }, + { h: 3, w: 5, slug: 'w5' }, + { h: 5, w: 0, slug: 'm5' }, + ].map(({ h, w, slug }) => ({ + id: `f${plan.fontId}_${slug}`, + fontId: plan.fontId, + fontHeight: plan.magStep * h, + fontWidth: w > 0 ? plan.magWidthStep * w : 0, + text: 'M5', + rotation: 'N' as const, + x: 20, + y: 20, + })), +); + +export const deviceFontBoxMatchCases: DeviceFontBoxMatchCase[] = [ + ...magCases, + ...snapCases, + ...sweepCases, +]; diff --git a/tests/fixtures/font0GlyphCoverageCases.ts b/tests/fixtures/font0GlyphCoverageCases.ts new file mode 100644 index 00000000..a05008ac --- /dev/null +++ b/tests/fixtures/font0GlyphCoverageCases.ts @@ -0,0 +1,26 @@ +/** Measurement input for the per-glyph drift report, deliberately NOT + * wired into the strict box-match test: measurement precedes gating. + * Ids reuse textBoxMatchCases' scheme (see fixtureIdContract). */ +import type { TextBoxMatchCase } from './textBoxMatchCases'; +import { PUNCT_SLUGS, charSlug } from './charSlug'; + +const ALL_CHARS = [ + ...'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + ...'abcdefghijklmnopqrstuvwxyz', + ...'0123456789', + ...Object.keys(PUNCT_SLUGS), +]; + +const SIZE = 50; + +export const font0GlyphCoverageCases: TextBoxMatchCase[] = ALL_CHARS.map( + (c) => ({ + id: `h${SIZE}_${charSlug(c)}`, + fontHeight: SIZE, + fontWidth: 0, + text: c.repeat(3), + rotation: 'N' as const, + x: 200, + y: 200, + }), +); diff --git a/tests/fixtures/labelary_devicefont_images/fA_m1_5.png b/tests/fixtures/labelary_devicefont_images/fA_m1_5.png new file mode 100644 index 0000000000000000000000000000000000000000..4c97cc2d1cdf6445d7bc371e24dd0473808fa274 GIT binary patch literal 6600 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T_~)TJ8y)wbTV2F_SVMxWw z{h)?KRYPYZ-vfT;!?A^J_B=f0MPB0R1R^UoLoGqnMO4-b&v!?ftYXkH#I!$!;Q z(JF1UDj#jajJE7XTePDs`Oyx}Xvc1}Lp$2fA06Kq9oHEh?iwBD8y(&p9rYa@?H(QF e$3FSNz)1 zRFNJgrGpu1lB|mxJPc+(0;s%Y;Y&lvSjh51*wbN*=Jla?pZKRDh zPDk79qkWapKH6y4b+pSqI#e+_L^C=>GaQF#M#nrx$2>;IJVwVns5$1r$l#`ut-rvt Sgb_HE!rTqb{bXQ}H1>3H45^rt{KKBh?VyGNmw{nVQ=kD?2h-x2 zsUkg0N(VF2Bv}_Xco@uz1j!5aq)h`!vy4iQ2Fq|x4i{86->KdBnUneOU2*IA1_ofx zVGRjZX91v;iTj-oyU$*bDLnk%%(?go@BZ67ixWh6Y#pYbIW%F~{QVOe6?N_F6`7r* z>i#*k0W(aS+yei!i3t;GP99J=sPJ=AqhpifCsnX{{1?)Buz}zcADqc^_VKc@Yl}?_|GjBLfp3E8SBD zz$|=$ndkpYhDm*Y*qfFp|8G=ydE!6FdX)v5+9%+w3xlVtpUXO@geCxP6Q^zf literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_m2_5.png b/tests/fixtures/labelary_devicefont_images/fA_m2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4ebf4e09dccd8cbcf649700c2fc01eb3c5cd62 GIT binary patch literal 6810 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T0N!G;;9tN`_LGnU9Y12T`ETht+!7?0^gTwqYlQbCFvLzc70-1QO88J96 zVv$&rD#5xq;RExplxg4f*XA@h^e}SV+rMQKBaDIdq%t(8W;Yy|#>g{mEhAHO8!*?f*)IqO<)(xa%vGt=^ry=k9XK%kG{0oRgVRsj zc@`&#@Nhb;KclpAxx)S#j7%zDMV^QoJ2Whr*Yqa|q`i$H;fFuJfaq0A!+A3kf7L5= zbiJA*asG_KUwZ);*HXWp^t2iO>P32*4)VX49Qp4bd(+(>ruhFr@ZDbEO`6D$UqI&m z|BVUeiw|7?53;Tb=vyYnbv(cSA8yb-{O`ZPgHs#+|JRUUZI&}IyuiQ0U{6v5qi9<= zkHLaNAG#8OMmzGqm>DT&$YFfofHGSmn?%JCg);`gl4AjT$w{5~e+CQ(m&WdS#>0b^ z3AXaUhxvR7yHo!499?R|Bm58OqFAH)V~>L5+BkvEyRSFXKDkhn|8NV~fprek&lI_} zF>5T=FlS;S1JlWy|J{K>&eWhc^XdQp?92ILet(x|lAB{y@b-Q^ zM@7M_16%9CD!3Z_KxJ9eLjD=xNMdzqym-cl%Z+hjg2`rJY3HCKaaITDHUUmIAPjf2rf(P&$7w2eI4HyG_Qjdm4ByU3#>2csh< jqa#J518Bow;E*BtpOf*l3d<7U6cU4{tDnm{r-UW|d}a!m literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_m2_M.png b/tests/fixtures/labelary_devicefont_images/fA_m2_M.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7dee684a90c02eabd569f7e641a34176136c28 GIT binary patch literal 6741 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T0N!G;;9tN`_LGnU9Y12T`ETht+!7?0^gTwSQi*yAKFt8*Fo#NrSCB(?% zAfUGJ%z*`P!Nmz8JXJttpFW*^Hl2qj|N8#QlLtQF;urw4)dKdClR7+6N!bz-*En7n zFf>lPA;s2a%4Egkut0TNTVrBx1K(i{3D#!$3+kHeLVF1eEEDUpvxRYP3n(BClC*gp^uB=o6V`d41wsldGN6vs8Ex=H6N{8p+ z@&0y02ge^DA1Cqz2-N+lkN`Q}ci5fe-Z}K;s-l z5|SiXfhq-9-HcBIZFXt82-3hfF~MXrNM1$atPV(;b5wdXSVoh>Xf_xv9Y#yV(b{0N zk{oRuj5dl!+lr%Y8%6_%3}W#MAIoMdX#i(` O7(8A5T-G@yGywqSHq>MQ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_m2_lcP.png b/tests/fixtures/labelary_devicefont_images/fA_m2_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..17912fe1fc3632ab5f1ae918dacaea73d48cc20f GIT binary patch literal 6857 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T0N!G;;9tN`_LGnU9Y12T`ETht+!7_r917obw>BpSu=Th6Y)g>@A9Tz?~ z=QL05-vbOR{pxcpr%T@Y)tD&K)1=5C@$WL@o3w)T(D3wts*nHw|G&%gZq2J#JYM?$ z{{P=U`{3Nr*tw1`kNyW{A~ySkqy^kJEMFh%mHe(H;gIlrjkI~%oz)2pjdM5W-I-Ci zz6oUJLH-w0BDV-hNL&&L|ChkPw3daf&E)7*dx-`I?Z!q$-@>Q-Z6MQZ7X+tmOixHi z*z&iomyzR*q=bY-?*8~>2BvB@Ha550@2^V$bFjph2EUoEa~L^}NZd1EXtZD!=rG)q z$iP&{rXY}9ao7M@3M^nRIi+)7vf+U>vo^CpO*%uo;I*qAVNlfK`+`PHRXi<#re-?B2>!1<>bm@49PF$gKxcJ7 zc$nQDZ)VWYh|T~xoP}Yo5jS)5vR(ydo{U=@Mh6;z%)=TItj>%VbT@-kTmeQkx3M)h zGmpXM%?1Y;fK0GFtHB?6R-i)!SZ9F4k=3Q~;u#|@H^zwxCLoOtDiUXPK=Pb!#;1V> zx-^YSj|R(Vav049qou=WsW@62j8>APjf2rf(P&$7w2eI4HyG_Qjdm4ByU3#>2csh< kqa#J51875N;E;)7W$7*c#uZD8fHO`Ep00i_>zopr0BQ^kJpcdz literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_m3_5.png b/tests/fixtures/labelary_devicefont_images/fA_m3_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad0d835f5d4fd6248064677afa1448f4edf8dad GIT binary patch literal 6974 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+z5+eB-^>_?W zsKp5)Ja!J-&m>)C0Lvj$FgYWj2?6YAc?zhfNblxByP{j{Y%CVj-z3OezGY@+n&Vxz zp?}V|#zc{xrh^<3|1LBCNo!#G_w&Ev19N7P59j~$GwzpM&`|&HKQN=RDJCQ>;D1oy zbMljL!jBmiQyIA|WP&&SVUe&?^Gj`D;yXS?$DXmRzcW}8n7t)x8Xnr)9=N~q{eR|z z*NxcNu37(geDMCt_y3I#vL%_BU(fxo@S*(G@Ba=Tw)QkOemw`aLUw_FT4OU0Tic%h z8Vb#gitp{YP9!9p_zfyi7BKtpl(3re@a&chaNuP=oW~{-aQMK6*&xR|vI8A2e!{Te zk2`A-kIetTMj7Vg5EFrp)_;)r^fITDI!T+GJv~qZUrf5dv!Ke0I7H1AT_$1FNla^5M6XudH4BsUb9(da^ zJ6kYw+(~X|(ErK9^N>fOpr4Ux-xFhl7GqH1_k!VYeHBCC`JdPK|F7QYGPlw3{q=eQ zfvkDS~`rDileo`XeBw?I2dgdjkXm>+sLDR ygV8S2XjgHxi#$4VFgju~I#M(`fHtTG4jDop?RXp1A-R_U2s~Z=T-G@yGywoM0#VWc literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_m3_M.png b/tests/fixtures/labelary_devicefont_images/fA_m3_M.png new file mode 100644 index 0000000000000000000000000000000000000000..110234adf4c557280d30744b3a5bf116c0ef9005 GIT binary patch literal 6948 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T0N!G;;9tN`_LGnU9Y12T`ETht+!7?0^gTwSQNsAXO_%xA`WnZ?2hJ>Mk z!3_AmZqO0}6ls|F5rPV{2>u@0cLU%-sCpKQI@uNhc&N;C_%0agu>a zTf#y@p`kfZm6>Br!h?hc2EMkbJPI3{8k-YEdYTThznBuK^Rs+E(2gH_dT&o-WWvpZ zYq-Hww;rhB#*f48-Hc4Qd2kI9ha|&{3=GyJaHKah762W-umA5@ULE+Kbu4WRyJH|BJZ!weTjGT?fKXw60ounN;%Raj&5jDoWsZn zbc!L!Ar1`%ZJ}Ui0LveVo`$@cM+4s+c>4FxJ06Y)8f6bY)zy`=u@s0{7gXBsw+2Ut z;04{y2JHWPe@h=Y*1&M)VEyBNY#R&}7>YmK-?5)Dhi7qu2#=e?_A`eB&J{E&_ApAe z7{?@VBs;J@phLzg;XHNx%q$B5x>5&piYAVJHnr3jGEe67*a7O`G-B1+d&NlE(61!ra%L(4yMI3 zQ$>21ln!R3NwO|(@GzJa36dA;Nt*_eW*L4g z=9&jAUry@W6x{n?J$qyEj5EK^Gce-jfix(v@ce(txJ2@gvcv&}59jL*CZv7nPhe<1 zVE_N1!>oh$O^iHD|NqFdE>8HssK)lI!B#uRJpN|Fp$+>cGID)ev*B({YBT5IUv6v~ zH#Q$C`#hCbjpwzrBrtnQ)HFP_w{0+CZhpG{|NsB>SCbOzf6B8gk(AJ>{|gjYEyn!& z^nV3~vj-A>z6SE+w@TcI{|B<@0^_dKX?y=WCa5wWUIJFJ;k!M@nv{eYU%>jm{bO&O z%EL4HUq7&Pc)=jdT+1-umYJi%&{!s|fx)htP2fXPn#CCg#+q+D3J;E+DVUKc($nO~ z{$gt6m6?(b4erw(N-?vnFg9*r=+`-H%El3pp2ol^7ulB0vp7M7$I4;-86}|ZLp<*# z6&z+TGPOwFGj?b&U}oVk-jgl?c3@Sim>3&JLgJ6342(KF0tXI#=w@V!kWgr7eJFld zLxQ!L?}GN`nzV+7^E@>?0v~2FGT9k_FmyPO&c^ZM%z@*efM3A;<&@5Mi31P*GqYK; zaqKwG!1iC>-~>>SEt|oQ{|%0Pa97LSPiJT}zAw=usqo-qEt`PF=iY-rcOis9!Clf2 zH?uWSiJ8MEErBDkp{bKc!C+>iVhbaeno+}n6t*^jHeg}NCc7XyZKlar{loLu9p&K@ z;|Vaxd==kjAKNV{qa(2(;nJ1;JoUT8j4dJzKxOX>hP_7JYg77KCRSKB-^gLp*f90X zL<1rHbb;At8CbVXvJ`TA^pq!QGjfDC|1Y&=Q`oTUqdXHZS*?F<$k2GT_rHL`*$4Hp z{fr!I^1!J{fJu$bim|tQxtRX`s*t&id?tGHqW1iG6iloI28lyGIXbn2ruo!JnjW#4l+t;K0iqZbmXg71T zdp$a=Fgn^YI?6OUx;8qhI6A600!I}`heSq)L`H{12IG(jBg2Aorrwk4m+xQz0#8>z Jmvv4FO#syAw=Dnw literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_m5.png b/tests/fixtures/labelary_devicefont_images/fA_m5.png new file mode 100644 index 0000000000000000000000000000000000000000..014c8b9a98b96bd161fa5bfe9b78420dd171b0ca GIT binary patch literal 7080 zcmeGg|4$or^m-pCT{*VOI=nKa=VTP6!l%7a>TvXs4%SQw6B3Ii^9rQ{$3|t{1{tGQ zHoMIdvqkNI;YK9!D^p@K{4yigmZ*#Z$`my*TZg#lFs#{@*d>K}SC;(=#vksI%iX>A z?tS}w-ut}wPE=J^q)9WS2!f=Uwi%y85TNF72?s#l_@lj)dt^DbnjO_G`&;W9kY_A) z4b7I;c7n_&^WhUvQ&*@bt+vJQJC-=gJf5sOnMr8RB+^-+Vg+@DKGp{BcQ2b3O12YVaj-RK5? zqfL=K$ZUgswLCt(+verbN&h99DfDH(z)))edZ(752q1scJRmZ-IX&FPY+r5uxg^(P zPDPl$Ws>Qqk>sMvcU=3hL0XO-&7EET3DnLB}GG#NR=#6{4NuT5k2#2f; zvkt>_Gd#4rnIV1fC<&XR;|S`U)xx6*e+ER0p>%dC@`?&b{ysFx$^*OrNy_JB>S!?t zJ}#D-{Vc8W--njzLGWEAhGC<#j4N(t-(V6ghU6U@g^t&t*Medtta6EuR|J3W%1)Za#7tR}t zBU0WML1lPCUGf`tbp$pq1=#d4CM9;2{<6m+@9wg!i8N$Xz9e?Ph2`ORzY!l6l^+mG zq7M|E;L+Dsb7;3+?A|jyqT#e10Obo)OP|DJ(ayso8-YZwq+&c-tk(e{rY`<-IXlN~spcf4B3V$ws1!=L}RZbx2*|=+<*X1f*Ht6hL zk4WN;DLIa9AV=Im^ox=Lcmy3hASTQq-h&Zwl=Pe-001u{pz~z@C6=|%7bT3$3{R_v zT%2F`qF7XPF_m-W&$|=rxtlTgpfy{idJxJ`F-ApROIV&Jv1VL;a^H15DMJGs)O#N~ z#}%GbAkPzHL zRodFW@`x1b{xOzid!|=Rn74XQFXs5JK+3-mOA-^uf3)y_w}Dn|DhU4SFnL1b+jZ){ z?wme1h9upnR&e2oUuUivGUyP?RxK;nZ6YE3E}nAaGWI96JR47h3tcyWMoQkh#LKX! z%v&=iO}Zh>&d!e<^vDt(%7QUfYKKAhS;>|h{f3V^Zy$^E8(Tuz_(VX@i*oqDD;Mpc zH~F|!L1p8UYK}m*s+^qQwvn;xhme*-pAyi5TZHW(gn^J9gsdo>2ErjJ6bC|4B-DyR zjV$yALdztyib9JlOb&#Ji7+V=257?IP#Bp0Z|2BI#aLC}M(6L12zQybRvJHkn(q1+ Duf$_S literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fA_snap.png b/tests/fixtures/labelary_devicefont_images/fA_snap.png new file mode 100644 index 0000000000000000000000000000000000000000..2383e48937af83e042ae26234410d98f3553de0a GIT binary patch literal 6605 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TQ5r<_hk1 zRFNJgrGpu1lB|mxJPc+Flbe0XIqu&3r{J;)M{7n4C5SAwmf z6J%+igNVdg9iT}9oNmUafws9cT|8sN<;FNM!DKT?T4hvvG+0KH!)P`bEgeQn#nIYe zw2~Zc9E>)KM%#*`ZRF9u!DyFhw5vGUMIIeF7#%Sg9Vr?eKpU|GhfEB9^6!iu6zos} P&C__g`njxgN@xNA5Vf1 zRFNJgrGpu1lB|mxJPc+(y^e$7pZXn# z{y)9?-~AxafPw=@8dwefrv5m5#sK7V2et^~(_n*z6VB_riN7fU6qI1qV5m-;XsLPj zz<~|7AG1Mh=Gu@hc60G29v+_MWy_4f!L@+FJ^nn8jPivmoK^<6-GEEq$N{ziN zOC}M?AwNwIb3gs>5D@XVUIeI{fzgNOMngw~1T)8r{Yg-D-_9JmaN-05)1P=rusZ}A zls7*yY+$@D-v$hRH%68RCv*Zn%UW)(>mZ_RXK1397+mY0}=lN znf6BQrhk4P4fD}3A0$=JXi^+aila$!KwE#KS#UH9j%LBpEI0ri&(Wf1wCEWvdPa+$ v(V}Ot3bE>j6<1NOEZ?Ln`JZ|FGwBJE)<+WnkFT6llQJ!L)d0 zsz?u$(!q>0N!G;;9tN`_LGnU9Y12T`EcBFaFx~t^v%x`vnQ4h;Ljy0f$PjNWZP zceGh2{OD(uFm5<_?Y}`m4u;sJ*6?8C7-Z}tjXZ?8?3U|pQR!qE0VqQQ`v+4<-H z|K&F%B>Mi?pF44&4q4KmP|jIN!iy!Q}r(9;o^Tvl`nS2g~V=3qQmktZ#Fv zW#dtJEiiZ9Y?%dzj~w`ryw~+hIyi7FA%O$5_dgIcb1*wAFf*V33}l-F9dqJ;dy}j7 z{6FnY<;7Pe8ywz${tpUK^8>RZ|M@2}G(P+9aN*2>0}B7;rGE$>XJFy{?|x82;$A~1 zqrAuUl!Sx{nrR2PZ#;ixU|^tAdl2Z=gB#d>7;~R~^XJc>$~ing7`;t^LGk`G&*B6T zp6mwu%?1(vGYk$+Z4?klV`$=s2s49XZ!a{*6p=3JbCjIFyvn^2>|=t9N}|!*0Vf3 zJfHp_d|<*XVqoOZcy{G~kc-L>9C5Ikz!RRB#?bhm$Kk+|;F?bxG$9GY;Ey`@pMBLO zpD+E~{A}HgqL;rxLF2}vV7wWW20k$egVZf<&=|;EF={vcOQO**9}V+CQYnrm#nGfV zniL1LT{@ZtN3-B)797oj1JETNEqX?ap3$ObwCEWvdIrlN21ln!R3NwO|(@GzJa36dA;Nt*_eW*LwFlTh&d19uxRd$kEI z2u>^9I@#;@VFs3UWkH$s5)B8g`f0u8hg-VAVo9a(xxA!=ghG$cX>;x#IdI_7glA_h zc6TO<^fWDGmiTv>@z0s8s<*yb&( z|Nmdx(7@n>$=}})yGl;#{Ewfr|I254jy)FjFQ3;7R22TZbRKMgs>A#1elnbhKi0lxB2vYIM+U qbg*)Ckal$JdUVWw#LiVPFnqdb{5~M>%X#3u5QC?ypUXO@geCy}%sW&7 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m1_M.png b/tests/fixtures/labelary_devicefont_images/fB_m1_M.png new file mode 100644 index 0000000000000000000000000000000000000000..9057c25f2c758584f23edffb613ad1d30cccd89c GIT binary patch literal 6660 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TEt&v(l*bKJQ9Gw(Q1LHWMh;JnEQ5vy5C>|Y z=4Ot6RmT|En)c5#Y-oJ2J{@eBs>AX#MnLymU`Na52R_t`0Luplk%S}(R$zz-u(}za z20G29=^{u2(Moc(aWL8_8f`0% zwvk8s2BTf3(XQfX7kPB#V06S}bfjo>0B!gW95OJp@0%@~R=l+aI9bEs>FVdQ&MBb@ E0MpCC8~^|S literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m1_W.png b/tests/fixtures/labelary_devicefont_images/fB_m1_W.png new file mode 100644 index 0000000000000000000000000000000000000000..599bc4def3a1730d4a1469b91949c92e20fc60bb GIT binary patch literal 6794 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+V)BX2(96mf}Ka5UmNU%Dy zT~OWJvD=Wr(dfB#p*fp^$FmyscgGl5PR@BR0n8W@S`82FWgDhlt5^8&@W=Y4U*$P! zEdFI@{$*#9@B6im$FZu3%N`?MWgb-Mj!}K#szu&E2 z{cb%_(WdwRcD?#n1ylqVf-Cy`|Ks2L*Y9~6p7>K=^Z)zSa-f<2=A69zID46OeJ zgVZ*(-TXK|hzD-h>4Jds8TQR0%{qr2Z5RLL0lJKb{cF!RV-Ij?k-~7e-l~D0hevj{ zgv7VM{|_9vu(7i-@&13fkUZG3T`AN4@8P*U&%of$kN@+hC*BrjYm@%}|Fcm}^`Qd= zkN<;RZD4qT`Gmm>&u*aM1{e%b;RLkqKd=mPV+?HQOcVi%IEYA`)d4zIfYZ(RG|&*2 zri*8cfbtU)Og4k0RYs*pgJm>1jAnz;(qXhz9IXvTE6LHu!Dypsw5>SWMjq`OjCPqu vyNaV-0N!G;;9tN`_LGnU9Y12T`ETht+!7`kZ17obw>HGQ|ADS6i{?$1)$nz+C z_|DDrCqaUBal!}2T`AN4?%@zP#K82sQc$6Vk>%TGB?pef8WOC{{1;R=gR+dw0ccKf z*nVbF8V}Kco6iX zz73ec*<=^^rwN{osC@YCVpJR(Tiai02?qz0&$Eux$iU#ofA*$+`+v;`O&!_T*#7@_`0(*~y}=H( z69*1F_+Jm!@M2Qrg9XivjgC+3jb0=qBnbTM=dqHIkZ}3e5A@>;24QB~MqOs+!?*2u zJPu52Y<&1uo=qj;^nn8(zVU+tj`xE3=0Ax*ok>X!O!YvWGiFFkI3N$SPfZQ%7wLo_ z{{9z$Rx13Jmox#o%HzK~TQ3g}&!zwF2Q?&08af;K9&j+T%y|p+NI?QalQNG$!M5p* zjRzYUIr6K@*&?zAy@d!fSDZ#%N(aT8WL;?W1j) z(YD-Z6L+*}KiZ`k?dgs7a7TOgqXQnJ13jYyT%!YfqXT=xX literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m2_M.png b/tests/fixtures/labelary_devicefont_images/fB_m2_M.png new file mode 100644 index 0000000000000000000000000000000000000000..d56a969bce32765292a811613007efb2a2c0cf14 GIT binary patch literal 6928 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+V)8Ya@jx(_A-^Xx}pRG+_ z;X^+oM_nyrlROVkyu$-|W`RGym{{y3fZ0GIr9p3It2j%T5rZRxzQ7R!gAYvyyx0^t z9&aM%Ets}z_^PU<9V=x%I$cwLcA1)b3b%uj5}3*ysmo;`4& z;Egu3&kn{D-}hg?fT-^|v;?|E#7ylfU5(i3j%o$ct;%*gi!==S$%0+$mcSQjS< zFzreeOU`R+{Vtg!DR5xM?8Jw)Y|(5i2G7zWD&`-Y2J-Piju+D+Bi2aFGXh$oz|bvv zIGByinvEr4V^YPb0}01Lu1a7jIjsY9l|#bu29`IH4F~!dId2#d$ze1bjFt|grQ&F9Fj`5DHV#G` zMWb!S(KhmE-(a-MG}=`h?IMqk9E^^bjE)qI4xkOHfkOrc&F<@WrR=%B0w=B*JYD@< J);T3K0RaCTDpddg literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m2_W.png b/tests/fixtures/labelary_devicefont_images/fB_m2_W.png new file mode 100644 index 0000000000000000000000000000000000000000..531832c794e35e9d5139c5803432661b711cd3ec GIT binary patch literal 7543 zcmeHMe@sR!h{HVp3bn3E}3dF}bf73M15I8)WkbE#{A0zLY71ywmsc7R?&kT8<%!%AMmFb zSFcu6*WI)fW1!S35QjiYEVQ`fv$BVIKM<=#s0gXe7&oswGU(TUo^8L*&W6B7I)5u2 z$;v(ntDjQYubrJK2q1evu{9|+V3f))D|I-)5PxcyM^{JG>{FB>zuStCdWB68az4nq zzR|S6P?x~-{@d(zjH?+dt&ru>z$Gupj=9s3dYm1WW3fg1IwL~#gLKmn0%@}frvDb} zrU%<^qLdcPU~{ow`@2vGA2=B2X;g*+vXwH=jcz#7ui4cptV1+LHH`ScK(d|>idA$|Wvexx@E zXto`-Mt)%d^eJ!*K!d@qr#0+O1oSJq6HTt=KA{jAvumaw1v2X#ne(Es_adb=6A|?; zq@G-e8rPzapTfA9DdGX;ko2bS(0j_YXr3Qn`i{?TSzYmoUGC{{_WW>KYgZN9aC*#l zlsdk*{8YU`F7#_Hx8fsTBBY~AxOLo0kJ#nBF@3@EH)8raSC_FybZT zj+N#}oB|vC>CbpuHpb(+%fXpKsysvKOSQ)kibm==_7Pbqka>*v{oBAUIHv}=*DQTz zB+9`%m)aX7KAh3n8-O_=dTBOpfIFhn{}k4sw3?ms|vBSqc6$vrLvh zza1YwhY+%80=#<%`1NUbOpPqdgCmT&=Yrr8rU!Ht1axx79!0V3QWT#D+9p#t#3va6 zEQYU@WZXYJ`P)Ebk|-SWxfnd%8}^}Qob$&0#<m@V C1ZpP$ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m3_5.png b/tests/fixtures/labelary_devicefont_images/fB_m3_5.png new file mode 100644 index 0000000000000000000000000000000000000000..073ad54e90485be0e27e2f5f709bd288b4ebbf58 GIT binary patch literal 7236 zcmeHMZA=tL7@pld_KtJuUF}KsihA3YrX-$pxh+Bn^_I$KinLP8nGw;0b=lOYAQQGIV0D!2R?DTg5z|8Weks3hD)SfgcTkg!TIoFl%tSl}C zxkdKUkBchzP)s}%Pp_mC?1{-tiR0!-RY>Z&LhiYyvb4y#rF(EYj zsi6UV(et6h7|{u{>7xa*d~t*0h%8nqVg;6`i4MqK%W!Yfbij%ke)@FZGXleU!qxsb zG6KV=TMB+iAN6G6aU+W})FxvG`<7u@RS6l<$?-rMDRt@xPf!hZ&}$Dgs%*w4m&>}C zD`jz9$cA4Q85(L4%;`1%7SjZhFv~?hRP`8}((d4~ypNWY5h5vJUHfbm=`(k727P2E zBTtlGJLJn6`{^*;}0^9LeYW&WW z6|G|^#Pj2;VwNY4%;qn!yMlc~)6v)`k7i*2G&t2w(-W3+7a;a9l~>8TkYCJ%3H4h7 z;9)ACAsnoB?;rE_kJYvy=*^ANRGS%H;i5cT(^Ke!s@=ZSs+Gw`Do~xcfH5gt#_D36 zo9FJDG}ZAfWdOUP7GGc|I%a=AC$hmE?o^CCz51RGxr%=^CWO?r?ZbZ>dHAnKlnx|Z zJMv0*+ni2q@*4S$>sHm{%c8uS5z=lpd6?z6z9Q5ZdHfa);q{u_V8a1KwMlH0R-O+9 z_f!pzY3js5)IzfCyfwPX1JJ8spyFhpxB-Bc3k-*@!1cRl+mYvN36MV~5;EF)3GH2{ zn-QW<7*xd=`GEBIg{n#73*w{N4@_2G6aiS%PU=!>4vWoU|@u$9lzzpzRn! z{3WROb?p)-17}uYq&K9)KbR5vJ;hsbx^-@0GN-h4ZLZlaK@df;z5drKf}`dqtt4H6 zU+R4@CpFf@zc-rzUBLq)$MeSInSW-aM)9o8Hwf_aCSd`s)$RzDZD2!5GRbw^wW??c zzUetgs4?QUZ~)+XZpp^xNe;UFqKppNQRqlRj-M0P01OY#hfF9*!@p-1WSpJUaNS4u zBkI!yzVi?p|JG3yRx+L~i9T^KG(n6b>jtW~;Wyw(yEQ3H9JNFo#C+(B5{UV|?~BiJ z+YiTLOM?#ogGNx_8EXu{q}eNBju=K>?gpM~zLqyHUt><4XuCgaic0mTo_y`~)tw&= zxvksJU`MDu#h#FDZ7SVjnBd2IaY=T$0M`S@9Yu z-V()$q&UwMr=j93Rh*?yle1I_3Mj!4B?$EY#>N0J>Gr;~cGGvwQm_x?WaOoHy}{M~ E2fn%llK=n! literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m3_M.png b/tests/fixtures/labelary_devicefont_images/fB_m3_M.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6649483bb83de12d437c3538ecd6ca75a6ae21 GIT binary patch literal 7221 zcmeHMZ%kWN6uxkdR2jeGm zKfJu0-?{JHbIv{I+mnARS5@MJ42uEt^%O!Y_q$eb70DUd!MN(Z4*qQV=Ue-nohCP ziGXE{-H{Flt;T8fka(s`=RY(SoY2_@%BF7lKZOI+?OZA=xs3s{@2ZUVA~dqsd{blC z;cqmxkK?#LVFg0N`XFSk@+1*>v;0wJhlw%8tT@?iVSnR!-u zF@#2bC+sL^lQ*ZQ6$>XMUk&8)3=XWLLqeYxK%M77HK$ zpqe%#MN$a?TN|1fioHqn%{!e*_AL?+_apU!sjB0N#;!Bk>il)xn9E#PzCWcKvMcE) zhJ=VAk+(H1J(n}fgxwIDS(awRyhDedO8E(jT9ieAqMUAkE%{pTQV1}f4ua+YJM{@S ziO(~Jn$}`4wTU3HF!e4|nwM1d*)k%4jD4eeL#}Hk{K6%umBL4odlt4CJe*g(Y^gKX z6hkAWUQE1m>-u)#(*S1q3x9$5%gC7IZhDhXZIh1Ly&Vl`jzF%z!&829%yd#xG(Nk;(r6Ah=KY5 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_m3_W.png b/tests/fixtures/labelary_devicefont_images/fB_m3_W.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef5f9a3b775c0b942ed931ad85cef6d4a612325 GIT binary patch literal 8305 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 DWYPl@ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_w1.png b/tests/fixtures/labelary_devicefont_images/fB_w1.png new file mode 100644 index 0000000000000000000000000000000000000000..5b34f65d176b98c605bdd43fc63e34ee99610268 GIT binary patch literal 6785 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+mpZuk;(J?Kh0O1rB$IJMjSR>|s)Au-#lxyst*{6x7@s#@x*>x~DIKNo#N3gOJ=| z+|9wv;q&d*L9l8DrkI&ek9r5P3B0)duDmr-1nBSs2O6|D+te$cVqn}qTLR)?o*hP~ z=k8y`6R_c-@?l^IEN);7Py2aT;SdAsetrY6ZzT#+#n{*a*%T5A1(OpjPJ+!(I50nw zrT?wn(W3=ZA%-^?Z#LjIGB7ZiZFIuj$R-66au3evIQj7K@Gt@KIbaY%Y_%}rwx4gp zEV9D52Bz+W4v+kKV~0kA!~T#^WnOotiD3=T|9_Bl!;wC1K97zM#P5e@J~d^whPbz} zAZ_PCg(GlRturt%$Vs07GxxlXowy|5`ow@FsDsYy@bf;E`DgF~Vy?u8bg{Po{r?RO zZa@V%Qp5xVHYY%o3rvhOnhACF4`Xi~X69x$O{m3<5AEYNC~yAu_CGio2nd|e0Y{uf z0>mx>RyX6*z%X@bx_HJ2m`)}pm}~}ysDp~cS&%{j&Qa;nU>QvgquF4zbQmoaM{9%8 zN^-PuFxn^@Z7Ytpkw^Omqg|%auHtAHd35Apbi`zIq-b;iZFJypbij15jw3T9#oky} UCs`K{oGD`PboFyt=akR{0PrH#z5oCK literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fB_w5.png b/tests/fixtures/labelary_devicefont_images/fB_w5.png new file mode 100644 index 0000000000000000000000000000000000000000..6b17350aec035dfaa304f0cf3b1148ea489a8366 GIT binary patch literal 7090 zcmeHM|4$QV9Dds?2ja_Ykhx|%HFoXh?8+3j57H$2FYM^qotHD+6^q|AVEBe zVi&t1vJr47MuJ;(2n!o?bD7swu}YDuiNrawvV}0_vNgD{Mrdz$o#9V_{ct~AF86*u z@B4n<=bq=eH}AdwYEDK_;M0KsfS^oO+G_w{GX4tS8bJGWeF}FAuT3wk&9B;L(CR>z zrbMUL80tx7tTGmDMe>sPL}h8&pN<9(ml?xn?l9;ywUt%xk_DCT=s>=vRz}L>$&`KN zqyi}tNR+Tmp14h}Br~!LDz48Q03eLWOiL-K>(;uH17EgmAp?=zY|KM}CUI|eoxF(1{{G9&9e_;KP#T2#fC8=kQQOHosSOj48&EdjXGd+Ync%3qbY@fR_%= zB#U=xD13%(w&?H%<`KJv@Uvn_E)^%i0LL{x*W`CdIr`ywh+Kv!D;Iuto%E&*CP9Rz zH$Q%EE9yupr|G}$gmP;nzM)O_xjn&{L{>LSKc!mGiuS`^bqHKTCl9$0&DfuZq-&r@ zB&j2+MV|x}QepfsR?Imr%i|)Au~>lq`!OKS<9nG^Trc8;oMsMPhLmFzh=01Z)Q(CO zG}9apA^dcWlBPCA`05Fk+GJBkNIFIthUg^yED{Do)pD64gGKI^;|n&<3Bubf4_6&pPinwFkrCnxF*DGoC1VbE85^#=;BAy0FzA?zWWa;({_`JQ@^?K3c&9BFvFKH(;6Q_RP9ZE>DUjzzlUw*#PGLh zE!IzO!qzuvc~pMGe$;hbf{3w=^UHPk$BoJc5)ea2zR1769TAS`p@t{iBLK7bfWoNy zvZzV#VbO-gqW+q05$-lTo^#HA``70xy5lqxU$sK1Yxc(Rtb2nQuo|VC|0{QC@sWw+ z0OLpwFj#G}or}(#Q=D#^XL(kxrmotJPrCYj0(OBc_@(6Yy%Sa+lf&tbuJnt)cvGW% zxUV|BeMqlAs&Hy4|6K_|8O6gpmAu;Zzk+I+upYsBmhFI7uw21%10m~hBQ!yfw9);^m_S(5B-cBb$=O}>v_#tLxQzg{(|~u1B3MD1}e|TWl-~T`@&aCiE_T`jLKY#qM(+sT0lmRd+1~Bmaf62H; zvcVzcSiQi8GzO-LlK&kK%wptlN&6!YbQA}J8e0{^%BGo{FWaa2q%tsJV?tct_P>O= zT9S3&|MsT6JxuriJ0Fa5YkdFT{h)@#mxjKXPxsp%zWCoD;e5dtd!8G{GJiou!2)(4 zo-fQ^Joyp{4xJBqnRzq}_auUhyTDwPHjSM}iO1kWgJTOLo18(10jS7$!5C|Fx_v*7 zL&1{;6AYOTV`GBDL=G4x%n>@#Hnnkl)`#c(|Nmcqn(jP1{r0(u=YSmX(_;Sfryo9N z@EjCYz~EKg{AOwb1Jg~_|BVUjS(pV*=>6npsaBO}a40+ZA6OQ(F)Z*-`}zOQ4uH>%soyYOn*9XHAI=GbDiJm;|d!f`|a8oAGIobknHxXt0bXhtX^>S~`rDileo`XeBw?I2dgdjkXm>+sLDR zgV8S2XjgHxi#$4VFgju~I#M(`fHn*U4jKG*mmORD+{p+yjl|&T>gTe~DWM4fbpQbB literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m1_M.png b/tests/fixtures/labelary_devicefont_images/fC_m1_M.png new file mode 100644 index 0000000000000000000000000000000000000000..b28a5e3058bfb86923b11212936a22683f8efb45 GIT binary patch literal 6752 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+V)BW=G5)BW|_s{3yv9J4+ z$k1eOUuR_S=f}r(Mvi}few;J_W|0N#B`0;}%=yRTkZ@Y_%z*th6w&%5^MA(T81BOP<_f>3dqDE3c^AGKw*O=Ja z!**Chg0)%xg8JqSZ0k}IA|y|pU|?C(s14N7W@N;`nEk+ut!?VU9-hSsB0O~t^UoX- z*!KSH+s}zS2^b8J5=MvRXCA3+$lJNcl3Bunb4|2f{y7FVKc?5yPR}+5WquZhxklXH z7fwxG$Rlt-XiHJ51~bbBmbEdGr$7!4U?@4I!}IX>`c^{+#~=T)6L|sz_Wh5N0J+kc z@q+f|8{L|-j2s&G&RC?$ECS|$3>9J6YsCGzyPC(~z@JBQ%sdABcN_;9H-X{HDIJir zDshxBjEDaN3miAbz=qC55uiy9A`)jo8U#4qj86mYbZNSH#t0}sF~MXrNLpo7dNf!@ zlf!5>7%d$}OU2RJV6>7PZ5)g?ibmUtqiy8TzQJghX|$_2+C?56IT#%=867Da9Y7mK c1BVO@=R=pD+iN^`259QY)78&qol`;+0KAvvQ~&?~ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m1_lcP.png b/tests/fixtures/labelary_devicefont_images/fC_m1_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5a81fa139cf7ea2028d91bd21884150208d2ee GIT binary patch literal 6838 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+V(?@50j%J#BD$bbUAT}l_ z->@(M)jhrT=)m{;yL{t~3=CrObopxjuf6?6m6`c4LIR}r2hdDz=EDbT+5OH`MI2>d zV*f5{VfZ>xl$k^3PWgi)YuZD37AJ`C)Hy6a^C;`|feAX>ADJ@??6_rQpmKWckFyLc z>$dUmoGj9=GX@#=f^n`x3qj?+>4j(vhAm!s*F=l}q20##5v-_w4FpDo> zFFB>Nh{r+U*oSG194?X#4m}TbnFTtG7#bxGN4Ej?H0AR+e3;reHBqFe$&vrXlt?)PhJ(&*tZWJu2N+oRB}F6}9xyTs*rWs`NU$zW zxWH_cI?Z&yq{KYAD^pS!ny@k9>b^HtZ~ygoZ6ZS>CJUtK1IVyj;(B)ByBA3~Ecn*i zeg5h?4K{%lwGST^Z`JMsx#=LtO)BSOtUhg;!pMWp0I5)90IHCXC|UbcGQr{ctoe*= zASSR>li+H|1C@473;EoPPisi9x-hl<2L^o)(;^1p!$AJx29443Z?xPWtqw<<0i(^I z(N^JTYk0I5Fxoj9?G%o7hDXN;M#n}*$Am`5!bZo!M$lN;=#cQ}Q26K+!0?|LVPJ?6 XxuTZlSEK=)USjZc^>bP0l+XkKB7Z_= literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m2_5.png b/tests/fixtures/labelary_devicefont_images/fC_m2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c40977263802ea1a5fe82a9d8e7d97cac74656 GIT binary patch literal 7166 zcmeHM|4$ob7{BYa2XqG|gpez+wG!M&f((#-Ay*;S8=tOr2chRHtmo-=gU;04+9IuOe%FB1=uGL->|Ckl zN~2T;WO-7MtCY)>xhJJ(Dry}CTUQYzNncv1sqGkT@T-Ky?lh?oWcOLCf$#&~nB5TH z$4hZH8O4GzssxPGvG%w=;}C1+b7l^f|5G`jH)M-8(Sj!lBM$r&F_TTx;oG@1Qh;gs)lirw7k|bMXTHXm9zxD|+O!rzW>&L_E8;wg{3ozcaj^@i?m{t;42sl_$cz%h5 z+K8gX_!DXX&DZKln3B_t=!Y7iX9_Xw5o1_SBzC-Go~EU<0M1F>gD#{;h)FU>4BQ$V z$1CviwtkC6GpK{>Yr%I`(jC9b0hj_>s_J*>S5E?Zd>;;%87`?Dt-ngt=G`=t{>S$q zE`LaPF~I{7rV7FtOovX>pE?+wXIui~t}*NiB(I)uDazJHnE=H5H@N{~`0Ad7H+uWx zG7}W>nO!>seBx$6gf4%VyUBzitmZ&DjC+3NIlwn$M=%Vt+0RW30xWVVBoZvcYzmBT zyDMi2DF~?I6)<1laHk+YN>0&F!gW;Oe8*_Pp1#cJXgeC!mbEX!mSJ6Y-4Ex4I;)Iz zEpxMopkBPk%(>f>67V$7gDFN5GxYrgP^0JOgMXEy+Of3FFn1fulouCA?i}6Umk7G^ zCvUkXKWlz8;9#oh7ffadpd0mm%r+x(o9bl&tyagA-=xFJj*a>c=5Xdi1%-o!g9SFM zzxxYU4qQ2K<&etJfTICN1C9oVe}r-Bz^MbL4xBo0>cH-Gai0#{zQZ9qm0XkLnk1(V d|1?SDjk6=~-K*CR!QXU9X;Ee2=dWq4e*)T{ny~-? literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m2_M.png b/tests/fixtures/labelary_devicefont_images/fC_m2_M.png new file mode 100644 index 0000000000000000000000000000000000000000..184700f1cac836a64d9602f7748c028f654a5ba6 GIT binary patch literal 7148 zcmeHKZ%i9y7=N$VUXSjbW7y0)WZR92FpJyuZjfd!;kq&gZX#^RN}}Pe&~_x#O#&I1 z3GHDn8cEi%FxD}l3m-H}mf~VGF_S{~CyZ|3mx+mJiD5w#1^wWf0M_^LPc+d_#xLf* z%cFE!h?T!1{{v(!&6dh5AjSAK=`4yAwUOwCs1c968b2 z+~5U=6p#0~(%jC8JH?&+lf2zi6 z#5r62oWKjk9AC6Y6!-8vci@?thYsd^4#1;_D@vU;ZI>ESC6=tJOSkq9ToWEG7%d@(D=XJ3Wi!m(!r*t4*5GKu;sVQLUECFNr6qf>qG#g1S znz__%XjFc>?4P?XzVjCf}*2c2JJcpG1slNKO*hgo8kg zKTYxO32q?)%tQj(SQJB7L?m;Jyg1wlx_Y5{7Y@l*xEER9*y?dV=qKobEeb6+1jy=q zt#yE{|_HG)^ zt$8s>A11P{-;VYm4S{}27PFIWz>eQE_@v$*ceBXR9Lc=-@K7P$4M5`RvsdYsxF z`}#(7?g>}H!+)6LUlUgpnQn-IIoQcC;|z~r*h*>qT4d&k-}l3PpBx(T#lV+eKq%aU zOsu~@=)8GxZKA|NxbCCVEVGYcdC<3ubkW;MD*2;VrjO`PdOIF#V`?O}7%EU>8SE>4GLa>w(XXV{j zb@^k=n!C&lEXJ_lbig#gy93@8aW%k25+4q%mP6S^Wjv251-n literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m2_lcP.png b/tests/fixtures/labelary_devicefont_images/fC_m2_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..d457a4b44ee9d4f9995494defce8f3996b53efc0 GIT binary patch literal 7369 zcmeHMdu$X%7@xhln>#K`dodTfM;dNXLk@bBxm^ksl)FlwqHU3aZ4lXOxhn`l0|$Lj zxZPH%LZcY(0NF^=wdd`A^{^LLXyOV4- zJKs06-}lQm^S$0E%+Hx@o@xdFOwP;Ad>#PkR38(a0L_Ed8T2(RkX0O5wrT6;G9P%> zTk6~3-CWI!sbVUgja{W_>Easy@cG&p-i%$1bxX1NbzNtx&)TSa zG_=-lGjz(ixUEE`Kho%LQOSCZtiht0gMQ>2r~9kgv3?S*EMMI>usF_HB4_r^xoYDk zhHre>T03Niy7AFlg9~B!>cJgp&55xx&d@0pf?e?uFwC+S3WD259LlmR(}A@T+z+?E6I=*COzqE-U0Rk7Dffsj?9!CM>~FkHz- zIgU#e)O+r{ys+k#g?>poc?Q$F(F41DQy9cq zBuN@Q3!sk0JRu~ymqB_?^2myE?Xj>5#pI!ul5|dz>*-7iWGgTMMhL?%ATA=wOahhZ zlLumsg#dI@Y0_;{#0c4Ox_4xatk_u`rOTCOueGsGL4h8pos%Mv4m)IPC0R+N+SF1e zg+Yrj#?gD1wyMnFg-ytDvWJik0^nOaMNeoILdbx)s*(MSd04>Mf&W%~@b?nrNbe>@ zqUr?C37*hQ%DWhGquW~;bG{2>?g2=zd1piY_~o;tV^$w9uD9`#tJw%GUx(6*djJ!k zC*UK`i1#<%+3Ndw3&O=U4a)QuhVd^d2lXFRa$Kp+B0VIinlZ+a9%nmz34_pk8xRVy zNI#k!tz%3HJ`tPz6yNJ|66>jO>{l{y{rwdbi%$<6o-5ASdUxRtzcgg^$*`n^hy%L?qByV5>}$;XaU#Fn#x2OQQO8A%E!sYfT4kta24suI8<%zn3G38ts@+iknKLqQT1^;RkMBJalX#mKf&L|FiNn_fzshSpP@RsfuyO zJ>~v^r#OTR@807vWGWYW1#>pDSDO171=I65*XN`bZJCrU_E6Kxtow^BUsDfVr|cl7 zRnw$yTXV}=w4z06T6C%f?OL*;C23l6swJmda;nv6w9=JUveQbHS_N0DTx%73t&yQM gaJ0tN|Lo^6;CO4^P{GAjYXKd3S^1eCKP}b$3Bq{}0RR91 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m3_5.png b/tests/fixtures/labelary_devicefont_images/fC_m3_5.png new file mode 100644 index 0000000000000000000000000000000000000000..d5330fce1229839729b29b67cd589fe6bc25b92a GIT binary patch literal 7404 zcmeHMYfuwc6yDt%mKcMiYIUP1JLs_dDkh6Xff)+;sHB538`6LXsDr4%B3ZDt zKG4+apjb*W(2-VcX^Yco9h8moQW!%!J}8Vfh)$KZ5TrtoknJw`qtl=L+1VdEckVss z+`ad__B&^fBqzrD$>zu)2=a@Mi`f7{AXIpy`~r09NkKF}%+Ft|%ip+jPoBXDCFs+Q zIr_W;oLovSC6*AX^ktFcdl~&5h2uPDh`{+)o>8BlwQ~o)DJ$0qZPe$7;;LnM^qx#S zoCsIr#Iltnxso99*ta*u|DG`gf&wCF=>dzh;#1>^y#G;Wdd0ul0~)rpWFey8s1jByb}U4_X~6`O~DNhX&|qrXLii* z2&v1N(S%~jta^P81N%%&_+YTDwxtNcLAM_KsXbh_4n9do)bY_nEwW{2==a3}`B~<{ zJU@a)_U?;d37+9kcq@6Vby@_=Oo`cRgV6;1JK#qMBJWf8g)QvK=zj~Wj^%YxX&?7z z>H{k@y=su?GDTmpet2Nl%hGOnq`lYYS<$Rv`!jL}DZDI4QX1e^;&qQ*=!?0IEzl)QlrQ}heLe$KZViYI)aEA%+16lmG19J1(H32Ja1L)n&zMDao?xQ8&5K+E+TgR-AvBje z$u@9b&@zBs9uMRXd5=je_W`F#hG}(hCTazc9`<-FzONR9oiMpBV{~x~g!pp3u=WW? zIi2PxXH5W*26*@s3Lm#K#xib(lCpWV8sa1@>En9A#FP_mfF{U+PdzUc2{g_o2x(Ee z;4oAXd0TLgh~9L@+9pSdy25mbC)7J<0ELTm`dBfBvFiB@ zKj$Fa9$Jer)M+@()C5VY>~bYV-!eyqkQyO7iitg1(z)%+~&| zZa*?WVA#NKxB@7G&O4%BJZ@`98rhsVsAAx;Z#ltD0yx~o zBWSIQ*BT7!FQ#Ks_~AP$`3KOz1#H4h{^-&=UF8%bE(vvf5UxPVGS^JT6zxv(cMZf< zP6y%iVCP7npJ&x4HI0m17d1Q{3%C=H7prhE%W{B=5_WG z#eIcd%j@-BKc^}lZ8zlf%uBu6J7m7(yj%9LM3FMrFm<4_Z=RJCfCYab86nmm#FPJZpMNlMyA`ujc gVIYE{Nl*kOn>)IW{Zg=k|0xN@uT6~kdJSFjHxl_+YXATM literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m3_M.png b/tests/fixtures/labelary_devicefont_images/fC_m3_M.png new file mode 100644 index 0000000000000000000000000000000000000000..3bee870c4f26fdb6a2513cab97c1dbc71aa93bec GIT binary patch literal 7598 zcmeHMYfuwc6yD{MONbYfD#Avrt`C$M5N@)f6cGa=f>y^?MHpWjNPxW)!m?o zg+9R1io!G_eM6m8oT;@`H%YanL7+}+ZEM>w9j8b;ZCZ6?@ImiJ#uSMe&_7HHwRX(SQ4R`sG%q-A~z@NS&9M)@}njb)WK^N8RTbj+2Z`NRV6!0i>%bs z=0fXMb7=+3C31;)HZ~L{r*IbAAAME#h-SR3xv11?F56PFon5_Uo0VE+E=yny$!x}s zV%CU_b6K36%5kZ94!dOe>N~zOdWw27GB+z@b$N5q&_YeNJC4<0L%rh}tf>uYZL&tz zhfH&Cw&_)^LJmG!Aj`+q+YZa(P(`f3@?W9@y}{^mBgf-dpa-v@s7n;Jc)g{K`JnyF9ah<_wV473j6*Z0 zYhV;=@d|KC0l2V^pWYZu%022N7C(!eDZr`5B>&X=t-)Q;XRDWipJ*zkN(}*X^ex z2HH5h{^JXj>bKn-F8>RYrexY>I@j&d^#mi+iibzTGR?ZzG^_xyVp5}vwJSvt~MVoGSpB!8WywwL0s+x@Q zGi2=EA3;dF!iWPE_<@bK`y5V7>5`;h-Ey28s100QV>s}(l2tMycdzJOA+h6O&5~Jq z!Z?hFJ|y0k&P3={Vy4}~^MRsKE}v-HH&xC&7I-y;X?8d%2*hKCGL;9wz_9`kLky3c z+aZb>(#v$1y2!%k-y6BCf{>m^Ow>1s=367{q8TRiYVf6Loh7ygu9z>cw8+U*F<>lP z+#>~Uej$6M=E6y)o@TNCdV|a3NvgUF!uZDxWDr`Y7H(PGbl`P7 zhfroBO38TKKyDP_eNT1dtmAN%mFLwKs}%m`2YTi#K`Qj5(I0y0GD4dOjv)nlnLFd1 zFUX9esxeGsn`z`>0)%i_T_m@Ijlxe&v3n2D>a1omt(ys1-SdSK$UMRbrq2!p`wd-L z92LF`vg$&!1ZMoM7uec;wDvVuG38*Rf{>~PS_&8s5!BO3#E}ETPU1-I31S!H+-1uh z(T4V*@{HjH_P}ZA35<+YKmAwPLJ4Hpj=~PGL$QV_Y_*J)&fZxE+ z>5%z5gSjY2qYKaGe6rY~h!t2AIw)nJbO)s?DqjQTBdKf-luePcS5)@M%Gp3UGATzz p<%q1@94I#?%1zP#@B%G_GEdFF757PfC;3~I%3Zu7>qI8+_y;1D0RjL3 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fC_m3_lcP.png b/tests/fixtures/labelary_devicefont_images/fC_m3_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed234353781a2f38719bc020f886d2cfb37f4ed GIT binary patch literal 7804 zcmeHMeNa?Y6uRUm@0NXURbSu;f`jR!RP=VKdI5N&8GyT~g?~k3m_nqH) z_ndRjIrF>sZA@A)_da!~8US$Lyo6a#0YFAbKNWrew*FWUkN-yJ&Nk;RT)8SI!wM49 z(yhzWatc^eq$!e{#2M0KrkXNsSA1)FF!CV@IWxzamYcOQn@!GIVFe4*awAwn3>&}7 z&Kf!6WR{DGHJM_$7&MC+C-Ebj7LXc=fEBGi-7_$*DIG72B-A zn~1UAWj3v{0wr)|izNB5O|}wAtdPZWSmbmVs0@5@wU2y#Ag%q(_jJD3eQ;D>YELT~ zdFN4uCD=EF>wbSw*Xuz-e25f0RK*wzzbR00vb(Ay%MsH0!t}sv$Mi@$yZbvfc)q7sM15CpdpSElO*WoWXa0 zVo^6%IIua=WPzv0#c_f+yP}yk3)h>1Xh+S34r7C!QRaf{EfIw|qKS2uMiw!g@Qz=k z6WVq)kE3XZ{_i+)SpLs{Y)Hcm;yn4Ht>pE?H2vZ4$92zK7K{?q_dZoqKLy;~o?6?l!N-y<}Ms(|ek%w;@-#PV~09)TAon zRuQPydf4{kYq>hl5kNHejuW1v^i4Oe>gdQy4hehv918PIsU6=_=se(}dG^|`abfr^ z=v|R>q-=qz%vX8}-REe{mg_p|irNUAE!BNWp;8o@60HdC8cnhJd)+X6;F;v&V)8Rv zNzPDe>V`M5BNONjPq`ZoP5)7gEQ85deY*v@%>@)|KEkQzz>nc{(~uXUNup*w_VA~r zbR~MY3_^1QMqi7fl7+BV1U|Y*^EEd{N|BDHaHLCIbb_!Istzr+^U8rH3~s~6(2i|K z%c1ryBNCKUvgIVA6SaIBK~CiCJoO$<0H5grS-e8i@SW;7OzM42WuTv));{|sNc9l1`n#Hd7%NR?=_TSz8S~7IfV)i zY=){XZIbt1!#hqCoIpgX0YDu&G5;RJ{w?{G+2R$a(Y!}M>TCn+7FRQfcft^VI!}q6 z9B>l-&~q5t&`I+a9E~arE&N`Kge@>+Nd`{^9X0{yn11L>y||*jrCAGp>tEe=o;aZ8 z1q4HWyYU55jg!*D?KbqbG23bW0u_Z8kpvmpLUoT$A zb;$DFC)esL?ZDY4ssd$@Xzc7RbiGJvRJ~G}-Yu5a2*dR?ygs_@+IFbA^6F$GfGIli zf&8rK_GzTXKX^qZAgX3iiGfqgPOhfdy5Z+>k}Y|;&%7|HDdx8V;yb+I?Zb4>HUiiq z7UR;_1Z;qqQQDO>j#71qMT%4$t0|-=u)nb|)WGwi*w;vKE=P74J?Im$sV#<7E%8}- zm?ai_v3{MW84;&?rQSJ6XyoIBgEI>uWOmy*3vnepmR1So>25gO(dkR$!LeVoefB_~ zsg_IF9&yQnh}{j7HqmDE)rqk~DSb_>|40*3-Yt?`hd8{PlFMVyX3DYfpq!8FSTC&*RTNHG=Z(nuZ zZs)i~kl-x_r!S+N<@~b6i1WSJ5?w2)jb~aT@Uoi0b4<;W*!ADU=%R?x6-X~M;_8t| zpG@jxt}AnV`D`N}`Q)Rne8iWpHsq@f`D$aJs|}ee%3M+AiZWM}xuVP!Wv(c5MVTx9 czquj+S=&Y}D=;+8l|C!ao4sIG)uR^IKL{MieE5|o9ZM!r;KY31}J+O-LWP+AnqL639= zW`byBIebxzMo@#g)zftq58Cy(RtAcS5CONlh+le$U(j{C>qcuWY9c!`xcet`f0>+< zlXKp^dG~Yg{oHroyIXT}GDGFB$^ihO*;&T-0Khc-SH>-X?c){c+)q^bVpI9@l67UP z3&2uqenGLdtb)+b)z2m8klOtD2EEPxV0dGI(@fws7nK!Q%Zp0Z5_v^y3czw}xrWfr zC(_py5;{`%7D2wXKx(7twR-5h8{ zuzyyb~J8kN5w^2l?30Qo{8 z0G&?kFr#KQWr@JhjW;+0Bku_YVyXB}*=Zfko{xs59WUZA*(N=2U_WU0^e6@ay6;bV zwp)%XEOI;Vfe~@IX3={P$@@B%z5X>MEO9~roqV45EyQHSPtODCCojnVdKRMaOnJ60 z1XCWd0pzabWggqieuIj#%)%sR41E9%+YgO3Nr%2Vy5eNTSANao+Z@I5tn?`t z`G!VFbv#PrO*e(7?)W5H;9VaQqYGJNz-0bwERZCqDSCbrGrjc6(LH<`+HvPa&8ieg zbZldon-A2uqI8BqfG?!r>vnOXsn z#5tfj>VU*>)pkUZGNF<&fzTK@N?&U?;D%j(rw|&9Q#!(MRCjXKqL!g{{1^0^bPWdm zyZeRMAiV`Vg(cp{1#UnNYOOSroTlc>N=Ns3ZpHS1puH(@2l#5S2Il(K&J$e26)v;M zq4E-KjLz-q0oZH*`v*^B?1NOObiAE`#~Y>!8tJu1{`ONm-gh_OtvKu=sqTM;3zUnX zitW}gJMAdN>zHs%>F?^}QRVV~;84lD5A)qB6UnlR1e(Z+1)ZZ=TAB%u!_HAP2p%Pr zPae4Js=a@|nluek$xU`{yPsa}UT$xnZMmCIJ4&V&NWxXi)FARI9ba~NENg4o2Xk4W zsB#f(oB2g$0gcX`GNx+sJo3-Ol(Lt~w5??&Bnjc@6qIxHER6~Qk-{wd)j=R#`q@i6 z3fK74X?XnbtpdJU4%1AZ=G#evMlR*Ae827Yk3Q70$k02H zQyP|uMk$9kQ0@2XG3DrFCVmZOQ9Z-IB6Xe%dG$yHc`U#;!X`9vNMiuE&rI@1$Q-tp zB%y?GpNf)W}@+=;Rqlvn8>U%R3dTx}@RIDuOfg16)5aIz+J;7Lg8O z8HlHYcq)qBKx~rY0N!G;;9tN`_LGnU9Y12T`ETht+!7`kZ17oex>GkpnANm=2?BuOK&Sm7O z`^(T=&$Bo|gs1Mnhxu{`W-;=F{bz5q(_>@XxAVUvgfGv!IN<}c8rv?0XE_1^i409s zUA?lyJC?plU|P;mmj@xZUYI5EC^4ltod;%o=w2wbix@1mNcGpNrwj?A9~kI0<)n6SHnYl+Xho+ zfsQjj_*r;)jQ_{)`?`Pj!uS9G|G&oLpkVa)zlH>>GlPNQ1!fP?GjrztGfdWEWM%J7WU_xWr+g+Gcr!Kg*?WoYwg8_y2#PHr4W*74!U)Gk)>2R!g$(`w#Nx z1!k+XY5%|Rxc~p3pD^R+|C6Wx-{qdCYv&wM8yGxLk3`3p8qcy?*0GC&(c1# zrS8xF|M9JFFG7L}=%;_@>lG}{sC)r?t6A=X>Smp3y7TPx+vg^pt5=9PxL|YHQm)6} zfGYLj;$SD)FYr#gseO=vWs~>6=7TJ9Y;6B_{%=fJ&%!KlLhmQYT>=axCw2b+ziV6h z;Mo5E0Uw?oIr;wo!3X#6PG-;h^BbfhfZ@wY9Z))8K5zu&R$wVPS_+O<4x^RgXk%cs zjWpUe9BmVi_60`!0>h~F4FqKU5{MQrAAp8NMt7=c6n0fT$m#J`^&8aC^| z6r_r^9q*S+kx)q382nHi>>jHFb0g(8dKfeuJip_wu+4w44-YZ+ojIiZ;mJl5VP+Yb znWus7KF9&|D0lOl$H$F$JQ9pRCMwH3IH|LV$K$~#Q>fRbMyANwPfBfQ*rC4OSyJK~ zG$_`cQTqL3BM-BLi~ba`NR{&iQy^hqkT$J4K1K3?!sN!rM&;&*Qeac1ADq#tmrRiq zIMDv^nmyQLlLIp&B_vWL1RQ3+z8(z~0$L_<iU zD+1e>19XUH8Yn5WFgMLSdbxp-L+KAVnLKQGXs`GoxoLOq?f3sdiMYhUVly}`9BAkS zrxyniiL*LD839f=bZNSH#)!*}abkiANTGwusPt&Cj3$TCY%p3njFyU{wZUj5 zIodcFZ4`~R6-V31qkV(XF4JgNakPs(I&v^NVlp~XG&+DbI&e5TU`qXQWCn)x`Y#VF UzD=kA&O^0J8oA@UM7+tLOi`>OoB^SfBF}#G{P@G3d>x^jxuNLlX)d}n1pxy$# znB7Sx5r?vAyHB0InKrZj4>NSvI?eH{)SIDEyy`==z&5woXp{GaV(d7cYEW`CN%15Y z*>o;P=*g0rp!75&-k=uN8JDup=|x)miB@Q_Bl{LX;j+Li`GUU3-DsA=wX=qbKS6}I zW$!v5QyC8yqMa&X9YMa+MMz2W>~0h@&B_r0Ar-)vCnKts&JSlBl!!h-@l;1W0QgG1c)$5rG>Q-RyJ2u)mTW=X z0&hf6c~+$$?}ekd%J(`AFbS@f?Tu$6TuDqn@c1TBOp@p8>BttcxjIpeCX$0YHd_Fa z`5Qqhsv~Jk!90Og60iitODfrjP&lUp@IL-)Zd$Ujpl~YYM;-{ab#xHG%2G7G%6qw} zX*sJqrzI0XsXH;$l50*W1kuXj^oz>{HWcD^zPt7;kU|e{B%Mpy1_XAdXv6NKES0ZV)7$mCv(pu%s!ja8%C^i0gP!~~F zLV(^ee-5YSLJEqT4qsD1j_&BJ!Wo0xM}#lyviQkJ^X0uL`g}^PFdb~I5}GX}e^U8i zM2E3ERY{PBBJOwuB6t<1x%gfq#JZd-t_8XJlOqHC(TbTT_j&@01CMOJBMSS01c~Uk z1f7Q_&}Wd45O2a2*DK)=_s4qyEV<{5GrvZK?p*%S+{-{Dx5y`-L{7ZvN~F@dj=X4{ z&a8)6)tDK786&LBC*d(yf$gCoz;iw9^!HAhiP$*9!s%uBWb4`w@uO=33SloRt;%;BAzsu2ER^LFiKf~oLfj%|3n(rA&K8@^%c`q1g6jau$7m(KO^#cG zo=wJJ0eVwFfn2WW4R#aD!=t)V7ZHCEieA6@25i4|dMXSN+GR998D>)3{M3M%6#HnY zb-wC%NXt#w-Mg9t5$-E3x)jwa;PLkCtBGeQf}U@6cR@`` z{mC4A8|3Hcxufz$ge6~V^XdFqK#sOKWzR;A?$nf2W%S$jtg=X|fX4Lh$y~#y`a#CM zBkG&$Zix#&;E(K@o%HB?IJC0pkCrd;@z&2ihd5gAXg598|0eYpkB4HDc_v0StXCj) zXbb-5h>O;oP^B>;jvh8>07o^B@5;h?UG2f0(7mhVYld(@r4 zim0?k_d?)-Id5}ceb-YQTb#1#*o9M94xH>be|)z=Gt(6Q!Z{a6fvJTL>F71IX0b{` z|6M3xC&&k=85wW<(JJF5Kn`sbLklAZW*RW71G6eJy8*LFGKT}^ zP{f=SnKLqTH(;(z%vF)OA~Tf(reeZWikJc#Q#fP_rvH5%8Gs-tJK{^Q3#W(w}UA&uNGD;XH1SUg=ELn`JZ|FGwBJE)<+WnkFT6llQJ!L)d0 zsz?u$(!q>0N!G;;9tN`_LGnU9Y12T`ETht+!7`kZ17oex>GkpnANmi#k`*Yh}h zc+D>HCs~4Zal!}YUnyeheg+Z88Cd-0By8wov3h|GX$(vgCI34fn8nE9lJ-X)=qL^bHMS~-l}$4@U$#&4No8Qd#)P=O?SBb# zwIu7l|LskCdzkM3cRm>B*7*Lv`#}wfFAaS&pYFFkeDS|Q!uf(P_B=O?W&VPSf(7h8 zJYSf-c=9C@96BHJGV^E{?nwk0cY(PoZ5lg|5|6=$2FDggHaUY115lCif-%yCKxgw#>NDPi5xIYm?LzeZEEBAtPjum|Np=KG~Ic2`t5TQ&jC5&r^Wo|Pd|Ll z;5jI)fWfP}`OVY>2Bw>;{~Ht5voH&s(EG{HQmrb{;81q*Kd>xnV_4vw_VfSycPE+6 z|NUiet}pkO+wt+ey~Lm0)t?UZ)`R`Y)nErI&zce$W=H_bF$q?e#*1f+xZD^gCYWpn zI^RJ>;;hc%1Q7vFH{;VF>84TX(O?-(4x`y%v~(CP6-R4>(Moc(aWL8_8f`0%wvk8s z2BTf3(XQfX7kPB#V06S}bfjo>0Bsly95VRrE<3jPxswra8i~Qv)z4*}Q$iB}se1u` literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_m1_M.png b/tests/fixtures/labelary_devicefont_images/fD_m1_M.png new file mode 100644 index 0000000000000000000000000000000000000000..5414eb29fa7d47c82afd2d6555a6c59b5cc6a52c GIT binary patch literal 6752 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TQ3#<_hk21ln!R3NwO|(@GzJa36dA;Nt*_eW*Lm@Gv^?RY-~;*V_?C?1Sx#L{^g{O+Md^v5@9DY3>X?Y-&e7$#Wf`MgCqc%`Sn~@O%WA+0twzjDYdw3Qni15@o%s+ET zVB7n%Z$BsUBw#Q=N*EoMpLwLRA#dj%OJ)fR&Nb0``R5qe{Fq)(J3ZSNl=)d0<{EK( zUpO^&A&st*S9Dn@FPUHy?*!Mq50^~|( z#tYh;Z**(UGID6#J7bY1vj~_2GE{_NuMzj>?rI)`1AiXLG4mMg-*Fsd+ysU%r*uHh zs>D&kFdqI7EO6Wy0~Np)1~R+86%+l!~~PgAZe9R>Cs>r zO%9{kV6=1?Efq&=gV9QIv~e)nC>m`mj<%6U`v#+3rqQnAXcu{OQ3#77FgZA$Hc`5)2GdGM+AuAr*6yf7o-m9n?_ZGBE6E3N+yAU|Kvg zRiuYW>0m~hBQNlfic$T^wC+LqnYNOiZf<7h>Z!# zH!KW5bx*H7I`IAeF5h?~1A~}6UA~(CYj1y1WoAB%kN~Ou0W_1F`S8J7cE2-K5l0!A z*uTqK7`{#vW#*8%Q~uz{n)Xnh#R(!jbq>qVJjyzKV1mx}N9N1|J8l^nsGMH=<17Qq zx@|l>CyTV}j6ue|V4Q2z&CATpJo)JMXdZ`z!v_u=Ncs3yj9K7@0T4vi>^^D$%;F2! zOHS!5;&D(o_F)<$hl^x`L(fB9W`PbPhDM3Q(QUxI&1SnGIPK>#29|iq2+4*A(#!%i zsR^kJP5C?yAEq`=O%&;Aa^!z8B~s3S;h-}cE1N>a0R|R+NfC*L2aL=DHYouK60D08 zE-+iAPBYyvDKSs(%9Ip_CTvW&y6=tE+kgFCo5;|J$pR_*05a^BxSn13?nM#~3%<2> zpTD|JgH2#X?ZZdKTeZ7DZaN5ZlgjxRt52JzF!G=?Kq?d&fGQ*;O4k0AOmMh9Yd#|z zhzTs!B)A&#K&4&NLOwU+(;5=2E=+CzfkEHHw1`3YFp$5vL1VQ18!h)otHaS|z-aSl zv{g9T8XoNhjCPJjJB6d2;n6XI(Xo-yF`?11u+g!w5i}MyIwU+g6h1lyF#Kmm7#Lzi XuBfH?6=?vcml!-<{an^LB{Ts5!*oGW literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_m2_5.png b/tests/fixtures/labelary_devicefont_images/fD_m2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..a072510814c004dc921918b229c0d512ed49a0d4 GIT binary patch literal 7166 zcmeHM|4$ob7{BYa2XqG|gpez+^;~cxkuNVTkgnj`I$#jK$slehYCGBj*#t&91A(m9 z5*JA@fJ{P>jT*M$4@QYi7(Woaf?;eRpudpK7>kN@$s7$Ll$G{;uTHZV{0GeaaJetf zbMN!KpZEEEp4@v~ua=#T6vvAZ1c@vv%sYc1SPFN9!v{$JdYcxWj+pb$nJb$vx6~Su z68(AOMSV*frASkxfmD!jK1-=En4YY31fb_joad<)qu$)m)JRn|ykkTv_2v{RBa6~r zuA}5Yo=t%)l|rEcC#chK1GlOLs6c#s&%;5rxq8uk|{CB=(be=@%w^NyD_#~ zaMV?Al8Q#@LNHX#*<-p*1DsjNn|WCNPvwAKmoM~4=G_SxvG1da=?sPm-OeVHB241B zRvjX86%gB~I2y=i!%#QC%#N>!{=yqVsfqyC@eIpndced%ib2u|%&C*zT<9 z#8^!9RAg8s3F$+&YQ9>WxhV*XAqwdtQB)Gyi}Z^V3jxPDFMJVF&h|o7fnoth&9gll zP?zb1c1@C_*3>pRe(Sd7=XTueZPpi;vU9tH$GtW)Fckb?Q_2NMq}SAMYEEDT*t-$v zLDmVt{L;Ro7F<&>NdM*omdhAtzSh)vo1E3@Slsg`ZmONgO1jhgx(|Q2B?n+X^^rj% zn2MXWPD~L5VJTKgdyy~RYjUKfW7zDEAC_H(T7Vw``(uad@1NY+R7dYWaNJ`U#=NbL z%{0pVyRz`$#TA22r&B$ZiHE-I3HT*KOLjdR8ypUBl0#!EW1P_U6MV_NEyFr4LEq-5 zJ?OL&x+nuOh%AHtpjcp6J75O8Y%TroiynyG3LUhsTTa5HhS@=C#A?+qSxS1B83t^y z+yX`plAfqxk|Z1DI>B)qzxpvT$aGn)YsW(C8;MiSc^Gd>&j{r(OcM#L1RN|OG{1O4 zV?xma{4w2!=I9J0Ov&Lw3bFbB^?bpNgwc^{$DI>os0GI?iy8L(OS3?43Y!42X7AmPsov&Qd?Afr8zDIW< zE`P`bQGtC4rVhXvOa)IdpNz12_m~XEU1hlyNL)GYR2Huevwn#8Zwe#C@a0{ZVEERB zB{m=tvO9JN`1lRK1YPw%igIiR$W*ax_x+WPbTWf znYihk_^jb!-w0d5JZG{%09~l(Bd!^dTXYu(XoV)0{3Zofc67vlFo!oEC@4HEJS?zb z{oP;qa^TB>FNY+a20RUT8t^nY_#=#02VNa`b>P*3R|jsdi~n@s_Z<${spOj^-z0f; d_@_xCubmls_il}00RE;!it@|yK7U1L`xBiRnc@Hd literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_m2_M.png b/tests/fixtures/labelary_devicefont_images/fD_m2_M.png new file mode 100644 index 0000000000000000000000000000000000000000..147919ff1f194fec996096f1077accf0d82c1575 GIT binary patch literal 7148 zcmeHKT}&KR6uz^wJ3DM|(=Bf54EAS45$a+)J5$J}Het3)DQHD#kuHgbnT6dgNwt+g z08?RiFcXa=-O^A>sj!9zjgn@uF`Agl!uBVWZNZnygXj_iK@$aiu$!>B-oc+}qEE&b zb0?Y1&pG#;bH97Od+vFos`Bt=OO6Equ(_hV^e6yip?=fo2ROgj;X;p{Er&cU$4<32 zH~7F2#p^q%GqeojBoVO(Vf_{!*PT&+hSG(8We9#<2XK(t&tEm^NEeGr-hU0w(e)E(Hu3Hj-R1 zbE)gVxJycwkhb(XFb*?_2aGKBCvs_nnT^Opob_D?2yyiG#-Q4vN|BqusB)*ngk>qq z5Xy-cFeVZ%_twSaJkmBQON1Q_GLaU~6foI0jKN^%fbY9{if``-6Qo^-sezR2r#gxF9R1g zycnd964}>pM|+WmKtCyRA+A>ILxX!=a|1+{aZEr#seN$r*PwLu+~wQRg?uvJeIB|B zVYxKhr^KJ7G;=$sYFSr~nO zic_Y8RNBebUTF+ReG=Ju8QPBv<#U2QwF0n1+;sNAxb{AL`v^P{y!ECMe@?4|&TnhDR{$qBMRZGIJ#0|6$25hsXRe@Z}c}3ilur z8ypO|ZeH4$D6u?H_wgB)Imoa)=-*4a=|@N^`J+#!l}3H#PlH$d+qA_@=DsKs)0xal zAZECb$$T}#qawl)Eq4m_r1Jf{nh{&=LZDYmHrcEDv{_AM;xxjmRQ)U=SjvcV^1iFO z{847Zoiz)KF)TP8Fb(kTfOkb)4RDdfhXWg?0j2?_0j2?NnQ*I!I%wP*;NAfD2ABr; dQ1ss&iU8Pl3pRbK7B&HNRUE1;y>d`ie*qo)Y3%?2 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_m2_lcP.png b/tests/fixtures/labelary_devicefont_images/fD_m2_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..83348051a418e0da2318f00420f04d222f52222c GIT binary patch literal 7369 zcmeHMdu$X%7@xhln>#K`dodTfM;dNXLk@bBxm^ksl)FlwqNPZ|Hi+!C+!X|&fkGb? zZnssc*l0<$SYE9*hKHz$N`j4#S&s&^4?q(Pg5fZ&)QI&Um9)_7ISUHg&J>Mv;iiDUV(rEaeBs&`0${1X!p(cq_>3)O zynux{JWiV@it{`IpYv4Vm*4MC1|WG>US>vN)&9~EuQgkB@mB0{q1NKJ4 zgX)@~!_*nbh7?=;kmk(@DYfg-na;6Tc0PKtpgCUkZAD^4+k>#Gf@$yI?kz%2G zJG7iWHkxSu7qLUKvxuDZ&BAk|4rqCF!V$j@ZH8?gnKU;|Myu~nYrES(XP~9w)A;Cj z)3)C7i1?GfQlI?a-`cVW6AsmYO2p&pn@&r@bpcyGk0mlgtWUae&1*~kDInQuZaWQ^ z95U&@5aQEMb`yU1X57V@V8Y;@;;Mt==K3y{W#5laB?lBmx%x{87xfTw_LjDYr zqq?|qO`)dLE`XNIVA(|u8^3ZF!@g6$F2I^9aW7fF>JZV!|Q}jd)bV&u&wJ zS!Hdc{|qVr%>45i?}R=-!dlvf^ZMlrC4A{r1K>1yyvrotzYbbT}bfE6GYC)uxs* zDGXYGF^=B3v^8Z0&TT}l6WxTg698Y|A^Oyn2q6>Vs)qM5)*%677yeuEf!~XfE4_;l ziK-JiBly(mly@QGMz*yu)_f1f+&z$9^3R0Ev5Tik`;1;-UgzK=m$MOCwicxqbps|o zN5F@l5btihqc!mJW`v7s8kDIm3=>>X2I}9fk(2} zWE@G3)-jfZfQT(Yitkl9iS?Dc_9+>-{_YBj#Yg)O%@(I^xjlb-P#UxcWLVs{bg!ei zGj?Esh%0spL~&o8-rJb><9L3XgPWJ-ppJ_gTeNKowMw;S8e|K{8kkCier;uO!F4C1 zwt1{fAil0Rb!~`|O4^fhSIks_K}fmiXv+BE`3cC@RD7XNX1`s&2-DO0&DNcFINMhR z{g&#_jvqQ2iia^OwB4v$w|H56yur^N=KHUoKX`OJmKf%=|FiNH?_=_OSpP@Jt%-5V zJL&F$r#Pslx9;$mGL>^Zf;F4jEzSOzg6Vsh>vdC$woS+uyQyhq*8N46uV{y^Lw1pq znrTwEt-EDCTG694Jv!Bcc0F0qlQca!)ss^_In`@4dg)3p+3BT9y@IP(uJww&-pJ4! gIC|sifA;ejaI7_NaPj$-YXBX2S^1eCJTBG!3Aq3cNdN!< literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_m3_5.png b/tests/fixtures/labelary_devicefont_images/fD_m3_5.png new file mode 100644 index 0000000000000000000000000000000000000000..48143b6a5170d956de12d97f9d65dfcb0319d650 GIT binary patch literal 7404 zcmeHMYfuwc6yDvNEHMU2)#^sk?5NWsplnz~R7@6&f-@BGQAr17Hqd|wsDr3rkt}Gf z4>YwpD3+28bfi^V+G1Z0%0_u98ACfhD2z6UPL*jPNQEFF+g%*DS%Kc4y$B zL})lpELl#H%QYk(^Y+G)AHKT;LH_I4Mn`STuSj$2hmq=XZHMFgEX$J)4?ic86nt~f1(m+v7Pj8>w z9#oe-tqH{v+3gKj9ZN)VV>@w`X3T<>7y z(`!6#^OSp}6=_j;V7}S)6Sp^*8g6)Z)B{$D{HW-17oe38;>Ji$bDnHISEb%AHELud|n zl5OBVr{w^j3Lm#I#xic2in4ljTH+)u>E(LB_>>cFfW|3+w4RrW09t1ggtVw! za0sf5xGlKHarg!YgDM4O<ds zNp@g@-ZdC&zwUq}7R-edp}4z|ndu@S+na*9wklAft}qqi3H8otK^sXfh=ys&!@jr=ZTSKm8&TFmMJ3tzPDQ! zsBg1F$cAyB&7v&!=M}}ZZo5h1);G68NUn~%VcUgXdqi@tInz}0fvk1R8U`Nyh7;Vxzg<&Dmo)MIwF|vO5AZHm0SDIoNwDK!s1hm5STzw-v^&Ai)gN0q z6@=0Q9m8s0&x((08X1K?a%e0Da3>xw)Zk!-c|RA!dxD=eAssGGO5Qhl)#jYiMfGVH z_ZE81uh)0}lB|5REiJoyPV&{BLDMDY-Li)z%B0z8llwb*=U6x)=tHQ6@ie6Li4$^P zDN@CX-+vMJh*3kjdjjvu(n3k(rAmQ zQ%&=1wj0zfLN-2@FU!Z(*$>O&5JjxO@?W9@y}{HKtr_wPsD)ysG)lThGB9|l4mJ| za2cG#dnAe29h+;yIFBqE17Y4d5T=o|xP075=e6HK8?+Hex%_Z6FHS)p(7c1RPQJh*wgS{NaZC1fK z0U=}wVn(Bt_VQ0(7samq55>Z_cMQy#N(P&g0q`w_nz9E9a%L%1iam1nHduW;${_K# zHbFQg0V3C%7bVAyX@F_F-zE8d=LP!oX#=x;qm`=qW{-iXJj0Og=mM@nyJZvw7-wJ@ zFXJAKke9I|5srCOEUyZ6?X>5gr&PVKU>qnj@^n85zLhcizk340$%!zYZ4yPx1fWTs z@0Fxq&ddB;KrP^EkEH?Mj~p_)2d99l#91KH^;WOsxQ&3mZTNG^-_@&_F5Z-}B$sl(W=25Y{D$0Dj`_$k<;Hx@_P~~Kl zmo8)X-Uvdv6($@g#}90@-sf;?a;GHy>XGBzKyBb^8^VCEg{+bhxqHRnR>h2m)k|g> z2;(pw`ha*}IuoH+iJ3Ml&j$)exqPy5-&8sC7~smf8bW#=F;Q19T5gT3i(;6NtHGD1a~0d`xgx%-!YU_EMT4-93H=&eCgh4#&B$3d>GC#mW$2;(0&kU?msnz?1M(}BBFf1|1|d}sH0Lv3BB-Mii6bY59mJ8w8^kW!wacC} zq6_IkW$D9vSchF2b7=&KoLuUqptLuhB!t%dD|-igcZ!;L)2ollkumB_@vCkV0l%J~ z(=PLO26Iu4Mjw{Nb;)9zb`0U|E~H_~qf9Z$u$W;r!{uXlr4lzng1)@F zo1!xs(g!4=ZbKH61}IHoQoR*Y46sd8E4M=XfWBl+D@@>ZAC62j$xMIt$NS^WyZ4^o zefOMm&pGqE_iavFx@fF6QVReWyEtXReE`rg@}nUG;Dzr?lF4gw;a%3k``4~3$gzXe ztZe%uSp_AWCDszl&*Dwl33DvDj`M-11_<&N8F^=cJ*zNpZ9bQtx5f_c&nk@JObJ}_ zIwxo5&9`!VLZZczNJbXjlRoxO0Ra$wZt;TT^y2EAz9j8Jzme1OrY)Xjymk{+v)vxP zg_`PL?a-@ha0*|wT$YdD;;4|tDn+cgMG1$I(jbu3c>CuEv${`ygNps$_irr99O%T8 zt_{`L!UJRY{x?STJs(EZOVaw~Q`!L)gma}Dcid$z^p_-6M(jtN7~OC&De_;SGS4!> zAnfY+tqQ90rBzczFsklesRo}$oa>6Dh0Gk+(|;M%%?{u`BV}lK(f#uYNnVrYO@SLy z%lgTLgIi-QHh5xM5-%q>P%T?j69#FQ3D7S3H6TgLL@t3e5+ zbnR}R#vqsR&m?+$@sGc4$|42gOZo{%#q%E`^yaTe3=f_ef8-cY)o1H@;pi%cIr+!8 zWp!&d=Qx2UV;^FD-^J11hpt>$bo!mveHP%~W8Fw<$?7n6@C4oLz@BP@DDoBj zn#8*@wn0tqGXtgG(@3}Nl7Ts|H3N4?{m`UH*$Zu{b_{nq}N(@VsV8K}os?S~iXgbl@ZNpw`3By?r@!Ey(EjZ6I=COF1YS>6D{9zTU z#kW;KXl)_ri*Zc47}bfv-m^$(xI9VrbUZ^mUEx6~;tNpo!78Vq9;w5UGJF{C-2PED z)W2-TqMAv!9m6P9FLY7#Ox`Iluaf|9%Nj?LO_`X$P&pULNRoXrtn zGZI4OFd}5~flP+$Ys1<;HVwqlx~Fol>9^q(sCE(CZzjfeVya1xyC%>xyBq=xlF6Hg z^_$3qiys435}O9c&{~@vcnri@8=$(u4E$lk%6(w+;d&&9Em(WKrtI^r#OLi9On7K3 z)b#1o{MTzIk&-8$A}c!HAVP0u%P31-PdSL!TTZ8TA$7Y~-td^g9LWpk5F$ zjQHj9Csnxj&1Y0i2R1-WHXBHuO;f?(A)qoLxdKE65*qi;>j0zd5{tPC7(G(wYTR#>E|EOs zg#KgejkQkT?vga2DoC~V_Lq8|V04;6IZgj5me+_P`8A3n#dG16cw%{F8o29~iJS z@+muF&e<@vr)Aa_WW}EyojQ&&HY5fQwPE!?MY8FTxR-bRK7Z#9oAZ(AQ;+^wn?M(d zC$AJ2d3NkuXFamJ<`nuIX7qmh#pt5Lr?R3epIc!ebW4~dhIUPsH4YAzgP%c>W+KkYD+crUlbH_Fqdvz;+yS>5P`mUda}`EO!;RwC#cY!q8b_Q<49 zA$1DZRXDzKwo#6J%28K2;wx7h%GHK)wK3AwhQbvUuBdQDg)1stQQ?XTS5&y7!WIAD cToHi0?KiG2F|{p{e=9G(Yw3czJ8Yi60Yaq5ApigX literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_m5.png b/tests/fixtures/labelary_devicefont_images/fD_m5.png new file mode 100644 index 0000000000000000000000000000000000000000..85309bf32d5cc8d7d92be182c638fef8bccc2611 GIT binary patch literal 7699 zcmeHL|5p=N7JoC73?V!qYM@EGm64*bCF&%>8kB{hM!>3+R!&c%U7KJMN{d1{=#j3# zOc0GMhc8Oe2x?HbdRkZUpk0sa%0N*OBH(rx@kVcmIUlUnb|| zKrKlk1D?zWul%y9XuasWX1k}Tu<0AL#aE8`Zxj|mKS&t7OPDI@fA^mEABq&9D!L2q+B7}^x%G!uEvMJ0A?X+hCCBDY|z9jvgHY6$H- zB7J>6p(Ax~5#(D7w1x#bEs?oAw`tG$4gg*+TVhPl-PpQjJWZa_l|aZzZLRY?Qtm8*${4d1Fu(u>6^o)f?9uUkS__6Qu>rUUyZxd9~ zMRLm}%~x4$4YJVCRwLQ39->>`Om7$@IVT!WlRiv$sOn) zEgblaXd<>Fkk6tKX=_x{0~Q<7?H+sh8LqJid%pn{0~(m9Cc8#Y!UGm%ElC+2=3qU7 z{iFOGzn=^<+M4feRg>&H_$|<)%O(Uf4d_PwZ(p5;$&T2lkj^W5n#Qpip0bemUF;+* zPJA$&69@Zge8bs%z>or(2)4zn>Q+;}zan^2yAy%kDlXEhWKih{wK@Rv1w8D#Fbh|Z zJM($8cR;|s*t-{z32M}4q7Qghkv7%W}nQ3 zmiA{cJUT_l^vBO@w(WktdF%7!g5rx?pNv|0WG=MZT|J`}k(@2c165IwV5jy_%2WGI zC&uPsFlFV6gI~@6DNG>X6h)(X(<#BWEG3n5GP@fZnNIjOUrAlzm3Mi3Tc&e7D}KsF zzOEip?T^xU(+!cSO`paHyz50`bzzGPm@IIO1(HNHMbB$srWRj0x`$6g8}7QOS)Brj z_U#OF^MM*y6i=~vWP#uJjbGsTG=%opq9f99#mJ9!jCCfa+N{r!JH8ZBdje=D{iryW zZ!vWNv=D(tY)SdTeJ*1D+I4s?*}0duF+=L=(>w_9Hf}z%a~5vr6S#lNvQ+<*tJPI4 zJCA)|Hul|5_g8yimZxmK;CCn)xPYoW?29yIkCp~Me!T!EO@SCRRZlU&$|TPK>pp$^ zUS*O$u6_@K#EnkGaB-C(v+z8M_w?6)+>S^_f+`tu{8?tljjO65`f<+B$jH_f!FgzBH(AU}wxM5eoC4>g!l#VbQ)m>b*sAZ@F{{_7^U4y~E z?mi(lNROSTu*CP+?g8Y0)=D$UX==W#bab!xR$Mm-*_#5Jz&DFEFvq`cuHYK3aGOm| zm5*p;bRKs%z+U_BKX@8rAErX3^X&{g!7y3SNRK1>H=p4N{=0b|#bGx|b^S9^pj;GH z=&(jOXlF5A!$e}rKxZ$HDu@3Ahf3yqnCDTMNS0kB&_qrw=orb;(oAGLc8;n-@aaPN zihRANz(w8+~DB0`}yVWrH-~)mb-bhvuJXGB;3_Z6(X`t{F;#>2QD82nl)Y4@ZOyA7NeD-$pq#B|X;cV^6lOWD4gl%0&tKY6 zxW}GO!4rmV+4*WYOf$Wj?R1=kdw5A}naxRk&0!}i}j`bf(ngYQI7 zYFNhWr5xU1Wx%J$lp_%((a@#k34 zL?%bvK6;q%$WAM^OXv?$BXilSlV>1}mZT0Y?^K-Xl7>U82+h#u}O-T1MyNM-WA0=viLR-pG@LYQG6nclLK*LB2J3L0h%~C{67p#0l0Jh V+`+m*Y7O8%OBQDvkG^ej{u?lJQ~Lk_ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_snap.png b/tests/fixtures/labelary_devicefont_images/fD_snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d3172ec02a388aa522bc7122a7186e1998cedba9 GIT binary patch literal 6875 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T0N!G;;9tN`_LGnU9Y12T`ETht+!7`kZ17oex>GkpnANm=2?BuOK&Sm7O z`^(T=&$Bo|gs1Mnhxu{`W-;=F{bz5q(_>@XxAVUvgfGv!IN<}c8rv?0XE_1^i409s zUA?lyJC?plU|P;mmj@xZUYI5EC^4ltod;%o=w2wbix@1mNcGpNrwj?A9~kI0<)n6SHnYl+Xho+ zfsQjj_*r;)jQ_{)`?`Pj!uS9G|G&oLpkVa)zlH>>GlPNQ1!fP?GjrztGfdWEWM%J7WU_xWr+g+Gcr!Kg*?WoYwg8_y2#PHr4W*74!U)Gk)>2R!g$(`w#Nx z1!k+XY5%|Rxc~p3pD^R+|C6Wx-{qdCYv&wM8yGxLk3`3p8qcy?*0GC&(c1# zrS8xF|M9JFFG7L}=%;_@>lG}{sC)r?t6A=X>Smp3y7TPx+vg^pt5=9PxL|YHQm)6} zfGYLj;$SD)FYr#gseO=vWs~>6=7TJ9Y;6B_{%=fJ&%!KlLhmQYT>=axCw2b+ziV6h z;Mo5E0Uw?oIr;wo!3X#6PG-;h^BbfhfZ@wY9Z))8K5zu&R$wVPS_+O<4x^RgXk%cs zjWpUe9BmVi_60`!0>h~x literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_w1.png b/tests/fixtures/labelary_devicefont_images/fD_w1.png new file mode 100644 index 0000000000000000000000000000000000000000..89754b49f3de885002619c951f2df06a4ab36e00 GIT binary patch literal 6879 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TCKh;6iA}*nXli;w!Ur+dW?!Dg2_ii?4W^q73~bUEnvR3{Ocn>GN6JC`^nk%X z?dRtvkO6@V>=s6++x2;P&i^xNV4Q5t;b8#s_a??~XOxb7XlZ;X*lfVevEdy9qjVe4 zziws+=0&DR${7QVo|YoP3bg6~15oLK&odeyZd5TotN|2bVB3%`#&+{K4^MxpBrvcf zSPL4|H``1~g{Wtocji;XG^p)AjJkOsn)nJ*#AY7nxqttJ5jf-@Fu12p{QK#lVY3cQ zL8@5W@qWn^35A4>!4Jj3?y)*BH&Sk+he5-^^E>_u+x!Rn@DO9)nM2ASo@_J`W|one zc^c^MgB(DQayP$ueB6k~Bf$t{qO#0`lRBGtJRW>9g?epjWQv^qq|}Cn9qQ|yB_+N= zgJRtorQbg`@-R!d=uZ)gR5@QT1rqiJY169XQzQ>4Om1v!RBnDK1vXXs!5N);$rMR} z1MLs5*@I0sIWRL)LLx;%z+v|5>(Njlpk)#_jz|hL1kQaZ3f3w0;FQiBrAs|L9u7?p zb>Tuhn~Zo)IJ7)uhl-rhdCq63z+BcA502T42II{O7{g#Zhn%#ZXAc|$dAWn_NZPdd zJZ~V%fD)Cb4;+L`Oy@ZSm)Ln!;T%N5C2iX5`IapbplG|;kdU_X&um7HZH5^J;7D1- zc<@Zo#+Js$hu?YFVj-cXFe6ezP1WYlgtG2~ZIFQBNEd5sUH|$-{<+_KF{pn|9~ke*Yhoh)WzSHiOf`frd_S zdT|huII9Dc5#V$)J`IdQm!^wnjJVtwCnlJH6gsGkN{OGL3c>N4vJQRbctDnm{r-UW|c6Jw2 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fD_w5.png b/tests/fixtures/labelary_devicefont_images/fD_w5.png new file mode 100644 index 0000000000000000000000000000000000000000..02727bcf1036d9c7412568e9eaa07da2d878fa5f GIT binary patch literal 7357 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fE_m2_5.png b/tests/fixtures/labelary_devicefont_images/fE_m2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..1427dc608e384181f088a5f97b98265a8130c2c5 GIT binary patch literal 7602 zcmeHM>r)d~6uEd}I@-cD%KuGHRo}%T8#bw-zsEqV>;UNF*7^4Q>sy3FIT78V z-II?m$^(`PVU%SJNtZq{L~FJq_`@O5){=m&;h4;$RiHMC;c6`k??r%ClA>zJNI@Wl zd)RkMj(ciI+R+8@{lX|~F+sb1u&y9OARMdWC&FbRElbn_#DFDvwjnaF64n&E%KjnS zlQ+yzy<$+qj0|?59pF9^cg}mItb@uelc=D6tiMBTqd51f+xz1yO7w2*{}!S*BYBT4 zk@*w}#c$2b_O}J4Q*Nfa`RQGA);~n?Q+uIbQ+6XtNA;?~+NiBM8gn@o3dgWzL_R-e z!#x3>JC%Uv&LW$*lMip0i@7bxTMpOIU~Py;V@F+QvxRx^gWk1gu*Y(l;FzQSJY)sg z$KUzctmZ#MqV}F26x|VvH0v%;2qH}Op~r@pGlzLD^n}6RhVO}>x-HM!0wGbrkobgk zgYIAVEh#y8^O|yeJ3ySmF;4Z>8wZ;Q?(}{gbs*YGDil7|Xzzc-L@T20@3Tp0cHw+I z=j;_WI&UbilR1t7!)i}?^;C>1_KT)G;FNKU2 zp`RHLP2EleUk*JxOb}gm0>gG@{@$wLEbiklaOWsOqo{nYnzAvn1rXM&{#uCWnT*i+ z#8GWS&=vl+;BhXGp5Z$LFW)j|Ga*|!ARaRYJKI@UMjqsOg?da8+!ZFK* zEV7AzdL@7rK`O(@sK7xQZpzG y{-lAYH0YJ)-*6%(HAPZWBsE1+8oX{z5dhUqMe>GaClbUzV^dQWCx1IT$ND$wY@HGS literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fE_m2_M.png b/tests/fixtures/labelary_devicefont_images/fE_m2_M.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec72f6b4bd74745227708b683abcb06e08d3050 GIT binary patch literal 7648 zcmeHMc~BEq9DXmmEFmm3N?JBb&5n4WMBHRGATrJ30oW?VW4wyGTmdaAMX+iWHc_mM z2U@&Pq)|s(hpAGrPDib7ILZ|yomxw^+SFretyQ$vW+alngtjy7Xl?)BKQhUCzxRIE z`@V1AY)Vs-6N41}6aavrNl6o?0f1?}A32%;^ET$}}_rxj>v-Do<#Fq_sh zdIQajj%C?cy^c0w_rYnI{L)fZwB0$)>m}=dVL|HPK!r#{@E~u^a9Zv-1H%eB}qCHMBT{nzWs!4!XJW1S6 zNL0D~*S3+2wObR=tQW;{51&^7i2_fVWhxggHgNu3Wsoqif-QldTulPrqZ36F!E`nQ z%tLJzjRe(+Qtz+kotpYTqsVJ2AZgGm!Ctk8&ixF{akt*$D8xJ**NKm+OG-u!qFOvUwy|^P|xh#s6WO_7q7Y z$8v)nz=KiPOlupE?NtjXo|3t(=l%X>_HH_XqfK*%BPYLVu=-tVNRHPw3NPjyVSw#o zF-b0Xqyy%URmjt!I)K07(J`yPX#)7?(|lR=b&RZKTqw)xa*`Zdqz7gV7VK;T__1U? zbH~*J@FFrs7>Oy*#I}ev*N0+Cmsd`?>D)bgT}`PuEd-Oh^iFUVW&QL~@9HLddSo-I zo$6VV1!Q9|B21jQ6;-KoUqQ{vCs2@&XiS-#?mE2#%5RVql4k2LYlbQ9ekQQI`CIV0 z3?N%TqzaAYP=55vSoanvU#-rAFTGCCpDw@GHI|^evM40$CxtB)CAKn%8y05*Xe27d zr~Y1#BtIwcR>hpSIjFf`4k2h~Auk3zd(`W@s-mQ$3d)1OMcKSyAS#7tj{XWjxhcVE zL|xK3VG+r7y$^9W)dh?M?dkxsBHt-c4r8qVYeTUC&L)7_=aVZ04MsBW_*$L8eQh6j ztPS{G9Eax5L}9Agfymc`Q-}#88W=?a+zjWjfonCG3dQg%B2%1ALZ}Oo$OqjM#2*hf zxQ5+$WDrK>e5iN&9e$7Gt@~Sr(A}@<1@rphJ|qzj+qIisA$hc4!#rjLgoPsURy`nk zvkY@YBdqAW(-7r}W^t4z)e8tO1+LX0cpun_rUOGU<%YS4Dp9Er6LBp$z!!Pe#s#^N0V?IJzb=i_Ji z8N2b)S3Lo{RFquyN%fPEs9}r}Uo@+GXzDcHdq$6hs}&{jXXphMvz(s4b)=2Ml_Q&X z`E0?$UGEjZvR{$Fwjt_FuzX?Hqs+GPqiVe{9YnQj5ml7||1b+t6(yxmzMFD@5JW>A z4G~`WbPk(La$mNKnm6`#RO!9#2~93 z;J3*f4)Oeg+Kco)*4Io&va|V=)(j47L=A8UkxAC7edhRKWiUt;$TD5g3~gSuoFERx z5u;MHc2WFJ^qoDZFJ2{7PYE&hG=YxT%bK1h=3az0YZfWPU12q_#+H`R|${p+!QAgqG($c_o%eERk3u zvE=FZa!DN|b&%9SQU^&L{>RG?LmLUf=LsTCmbEe GTYd+Ngd$G> literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fE_m2_lcP.png b/tests/fixtures/labelary_devicefont_images/fE_m2_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..aba3549ec7e21a05b28140b11c9f7907e8ada385 GIT binary patch literal 7726 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 PFaY!CESz08lP~%=y9=E5 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fE_m5.png b/tests/fixtures/labelary_devicefont_images/fE_m5.png new file mode 100644 index 0000000000000000000000000000000000000000..e6cf67928834b1eaadbb3adc655a8e0b7face58b GIT binary patch literal 8553 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 M_g9vU>|?xt1J*f%dH?_b literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fE_w1.png b/tests/fixtures/labelary_devicefont_images/fE_w1.png new file mode 100644 index 0000000000000000000000000000000000000000..45e21bba76724db6e4b9bb093b3808f408db887c GIT binary patch literal 7268 zcmeHM|4$QV7=N#KJrE9PN@K2*!8zH)Q1tCxFja9-1u2^|RoMcGo7Y0yp>8mO2-Dd+ zm=$NE;4-8RQG>~T&~0FUkR?VBaDD+4<~FC1xOM@zMF#~p(?z7~U70S~KOo69X_~vw zz0do3p3n1q?%M7%ugi~%c_9V>5LaNz-2ecp6W`I{6X4U)T4VSlxhk)yYGe8K$`Tt` zYq8q4St@HOW-+rEWxEK9e$T zcThB>mr`))a=l?WO;h=A6n?+*TnPa4`U-N5g*B}u!R(kd-Dy+|)Vu4}!afdJw6diBb5sh zpk5WXPA>>$u5co2lG)(FxCgh-g?@HY!LvIa@*#7e4T)bHIv6g)B)BM&OZNi3NL2H?Aeg>TQR%1RkvK=-Lo=okciz!}|j zMeubd6YkhEn2TZlfwJ9G#0H`wuoqF>+gvK9ld9O{ z$vedRZ!0mroG zrLs-}t!K}E|B6V@HZ~RCBB!4Ld;CixfbY8Q20`2)ZV5Z^>PQ0%M~ir`MoS4|ku;@5xkTS0o)xSShY7-Q9cUgUs9wW%GXV3hMqsY9jeu26kNvVd8jjwR= z#^%UGn+A3HTCy|}gBux`+_?~~PnsdwT3mghgdLhGKL%+<7 zsG8~TPsMS3t3;ZjGQ7hTyDkcX?{Y-Wu$3gHtN;9(fiPf@oKb;Hcx=tKk)F*&j_;~O zFB-e(XnvD0H%dn)@hFy19UmVMW0nWHK&E_09t$*p4Mn-EaAX{c$+-SoC$1GEAa6;2#f(mItZ%UUB@-Acy#%{o=|y0MbDrD#%-x`_(G8?jIGx@FxHO literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fE_w5.png b/tests/fixtures/labelary_devicefont_images/fE_w5.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0ec84add3dbaa4d6e185e968655ee6753f81a3 GIT binary patch literal 7959 zcmeHMi&GPK9^cI-D~|>w?54GxP71LHKRfPDcf{^U}HnqK*xqm=!l9|kJXTP8Q z{=U!8_m@ps+_D88Zj;;~2=Z7ci&+6dh?x7jfE&=RzPxC#_~*nXANTDRS|+ZMkd*p$jQCRRXR@0e~rbOfQEskSAR@R3G^~-O}N&ZiUS7*neSOfb8Z!O zfTw%V%q}nm>qGHj^ONN|H5O+t0Xn1G@ehIbsRoKCtI*g-JiLioA) z%GYMbHQ}W_6=|-+4bYAnwv7K6yT|C+I=OcbA@3AFBn+B~>@1BMyyx;MbE%5|ttLQO@Liq`vA>4Lq)LM1*)tEznK2 z3`xOc%%=CE4I}O6xJ@ufoUgi>L2cc#+~sEB{dLA8QoDOX_A0~ zlnY{%Iw}(lw5Ci#{AP@$(Y%vWF(u=RwbR84@A6`kTWP!a^DwMk|L~89cXE=6!H(R- z+o5jacWZ?^67fZOgw}X;Di#;VR=}>ofl@89Mnb~#KP~}rM&BWW8eHy6NzLGNOujB7 z1fdQo(#Ua5a+=p7#<(D^qL-)?!9S(bysV&5Ci+eh8mRZ{ragzB?15bi#=CASUAUy< z@Pqv)3Wm0IJDvzIT1D>b(rNSz%N_^I+*&(g%0Rsh7M8t(wUeV!Qi~7bZ>;lO-7x&% zt|L{bv6aSxy+NRcf+#5ZErg2uR6)8o$&JW`I7@*wxff$?>ap4CaDI=y)ueaR}|&~JrU*V zCBk|W9eH-==Zz&?GGJb-%4cu|s_e-tg^3vwsn+$ZXRL%0jvw3-9;xK=O+zQDKKWD9 ze%N&^g+^bRFeP%iZ+6o8MrB`oZuu8Akw`$mTwZ}+d3+23IzyA+fdksXUH%hIO|%GE zX0S)$11cK5$xh`pi)xZr`yOj$1T$(jml7j{+eM-E;P_eOPm-;z#_+uVI%{jjt zL9SrtQ3h*qQPA^g^WbsNPH0v1l3_gDwlUZ7G9UHmJz7f~Y z#BhC?dKo=qD@+WeaXfZ`Ibd!P9&BMyKR=>hFh*!iuCMSNVsRt37T`0DTVNtN{a5%Y z0RQ4EhPVGCq91Jy!?nhUS9r77oQnkm{C1`qR56zypuQF04|g*Brh2@8+~#Ib@=cDg z_-gkhR{A`a8r8Q8(C}j9ccOSEIH2-D>#lZTahAfEa`kq(7eYy1?S9YPqCb6q)rY(5 z7Are0g`C84_|<15Br^L~8*qCnJczYho)-m}GEt@0R(r&JtA8=;a z1<*imJ36t)7u#Vzd2LJzw&-$L+$EPOb>lPM7vWm?##|qVUaW*xjr1O;s$qel{)&oo ztXJNXu3PX+c5D_A2R%*Ba^O7C4XQlp)z}k1dmz&+H@({c=fF0TrBgh8wrPtxlpBJr&oj=d9q`dOaGVFS{OM{bCq*cP8yBry5lY=ooyjURGamf|)n8xY7>$8S*aSfG)LC1t%uo#zN_GlwEa_oa7d=B*J3PwG z7er8rqh3uLJbOoWsbzY}FVX()j;0r&vl?0-rITKgFU99-E;%UD2y+U3fx;I+VFgUw zvrTb%Un+Dx^tfp9_m?`FJUE5N+BLLaK~ zf;ypbOFHZmJQfi`qy2tS3t0h2#ko8T8*@xO4G)YfRH0G_T=7U~lWK%z3$`6pA1my79>p%?iSA!oy|%h!S-!niwk|Ab zPZ^BiH@ED;1`1Obzg*?lWP8Lpuko;aBhKMBuW8PIF)}*jAjV9I3)KN+^N|087$ za&nsXrk!=28FOar&G=R3tW;;EIxF>cesALJP-llaJJi{sZ`=!CCviE6%Sl{L;&Kw# k8}bjGldzqH4G0^84)tYkxiJ*+2MBx?#x9FFHdkK!Z%e5<4gdfE literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m1_5.png b/tests/fixtures/labelary_devicefont_images/fF_m1_5.png new file mode 100644 index 0000000000000000000000000000000000000000..59bf7dcfb368401341fad169e42b65d6ba4f48f1 GIT binary patch literal 6979 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TQ4g<_hk21ln!R3NwO|(@GzJa36dA;Nt*_eW*L=Il9dcAXtRcbLEOJ40Gbqc*Fzhw* zzEQ-{k>1d-;i-VYc?QPB(~1i75=DBN9JyXhjVw`CI52^c37LY+0kf9Grvwv_K@KVs zXLS}QhzM{3^^{qhIvqXjequwTY~QC()1H<~BqX#i-m@q5r)(QA8?xyp{P1W0Fo%(A z#_NB7*_)p81RRL@{@z}|CcS~_*{=Hk?m%;wG;}uVIcV)#X6V}YFhAIoS;E8hy2-K= zhJSKbr7W=8TX}*Ge3;Mo;Pf^7|BVm)*_oLS@BIJ&fBns0&+P^N zyi7<)u=oz->qr0p!`@^s%frL-{9ixN^A^D1L{qq}N+Y9|Te*VB$ zkhX)IFJ?!6Gd8#Zbjoi@i8ue18~^g~d;@En0}Knk2W-qNHK)=OI)L8Uagc#={wGNZ zB?$?MJOhUV%WK%$IKV-x4hq@>Pi+6+dVatExwf%E#{WP6|JzUg{wI5Wz5TrPXAUg* z`xzJ(KKDMaul@J8VxJLn^SAT=L1F0UF#XIS2KH0m|1&c(%V^yH&(FeBu%PDue^`29 zDK>0ijQ`mFUqRr^Q3ke}qw@cn9Sp>oB|eDOgA3vW){>Jt|Lfy#ZArM+CA|N?^TGGt zv&GIt6+Zf2ukoWc^Kw(9w%?zBpfdXb>z9+D^uoh@;D`aF3?D6{N2{*UDtol4GTMS0 zZMlxN*hhORqdk@3)KeMlk&li$c+v}j*iccj!Tb@$B#}^4FBmF28Nof V3l}c^hyc%ydAjQ4g77FgZA;q7+2{SNAm3q23hE&W+{$bDMc2Gls%fPUwDbRqcgK6>1 zRFNJgrGpu1lB|mxJPc+V)9w87`wSZnzUP;>`;+$L z!^6YoYz9C6K0MrhpGV%V=EpGxw*B@sKR(P(6zOR?$nj!QBnvC6uf%}`fdK&p%FPQF zEZ}68FyZ3j%1aRt5iv<*Xm)dSJlM;#I6;KR&0+c(CYI~#jT;U`v1#n6o6E>@&B)>4 z*VjA>8>WHH<9abA@`vO#BZh-hrT_3G95}yW8Y9QLI}g$snCsfM@;DScWwSr5A;H=# zazS(R4}&$S3{9py`*;!_90n=8X7IzPp^^V^6q`cC;RmM;fSFl=wd9lzmz(%IBLjmq zX&gxm%&d#K%Oxcw!i-rA8ycG~w(jQP;aM%&BmvCW5=$EVX0|G}B+4=$?#({d#Umha zXhUD)!(*n&u526}i4n&S6g-}_Q3>h-?aeI4Yf=*;&I+7iU_Ho_EeSHz*ul{N=zzAX zJO{yk4s%$4X3?_ZSDc5X+7j3_0xnyAZAs*HHeeQ6@p4Ypp$%<{GoU`78Y$8AfBoKC zPxoF%HcS>&)$~Y-YwOZD(i)l*+O`7SE%`uUM&jG7wuCldiNvP6AUf@0sI^tU;tWQ< zlB<2^l7T9jW4A8;EYTzh^5K?-JfIJM+>Z^7WnP<6D}}W zrHQe%39zXMoH-zHsDY(PQo;!wG6XfGyQu5TBN~ zA}1ixfo&?U7SD+Vn;cuguH}9)15{p0+)6On3@lI`R3y&o0Mmg0rCY>-^{*G2GqxJ1*J7ctcHQMYPZElZtGe&z~qrJ}2-uCDy!{{i(a2jP89Zee@ sMI0SH9UW929ZVmcL>ReqD~t>;Os;t^`{u9%IB&(^>FVdQ&MBb@0C%Zi8UO$Q literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m1_lcP.png b/tests/fixtures/labelary_devicefont_images/fF_m1_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8895003bc16712b9e0608d2cc00b1ecbfc5e23 GIT binary patch literal 7093 zcmeHM|4$ob7=Q1seW}fhZ3fw{V;i?+vJr4z?}mI)M=KrQf(;5=#t$UdLg}V#t5_l! zlxxQr9VEiGC`=r47#H^gx?v*GO|RA{LMOOs)cJ+h1aMih5L8yQ^t{7we}mb3$>nnI z^U0Iv{oMP!@AG^vP-!no*00wC0Fui}ZBGC|WvjPN82~3|Tdm4tlXv$%Z`I-EraBj> za5!C!j;2WhQh89i(6@juS$yU5`IS85Nr zCAh!Aq#YJZ+0!+ueN9ipOR8Ce&6t+Ea5-2$3@_eF{L+p}BVVt~%XF{w)*n;yYRf94Uzkgxbp8GBw3V-`K5^p0a*$P$P0%9wCZOqa zznUcJr^$9k5W23p0oDD0>=S*P%ZCV*{XslkJ1q2)8Sp)E&$^V6=kw>Udd_taXm4%B z*wXA^ZYZz@viq9N(Hk#6^CQ|;PAf@Dzb-}#Hv)<(inTMbgP%)YS-B8GQP~%HH=nw` zqP+4f+aV|UXXa4F9r;Bi<@1Ou+~if6c{|{HO$8|UT=|HU0Xvuef`1=3kgw46jla<; zRIPYvJ*6AF#BQhqgewOcJuXMyCxD!I5;2j9k32n&)E@-PY(U~Zubo)7x zIQDQT85*bS0d;R{XBrw7Qjy(qKD=cd5Pp*Nk;^{h?ru*ITWqGvE7hIOr38k{;X>H4byX$7)E50=B1e76x z%#U1r4hCwF5D5-#eq-C-DaPEbMs3y8iR%Q*ZXK#}1M>avWUI1>mIn(c<2OGf3?xFI z&3|bUrQ1ugvVX%Y!FkreUVfo5dOR&@4}Dfz`2FJ1tV0{B9U>XJ_37G?v8OAKu9ESO zTe$=(KIA@vDq381@sQwDKTN7oTg*=?;oAIPggJdN(I@O2RpxBjD&R8(AC|a=z_k;u z8F49%TL|1b;f@k_(pW*j$_Z9Z?n31R3y4@a#dIq^ NK-q4)ZRAnG|0npJu+{(o literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m2_5.png b/tests/fixtures/labelary_devicefont_images/fF_m2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..459c14d74501194ad5fe99d89d3a8e5df16746cc GIT binary patch literal 7421 zcmeHMYfuwc6uz5HmJotO!LkUFOp8Fr2uq^EI7mW?fR6%I+oEFK1cErW5EQ3^KsHzr z6ity%d6c2FI3v{-Q>inE9a#pHj(}k8R65ogu_E;W;h{z#Z109YOn>&Lvp;t3+TKY(Tz60)D&hCuar`P7}$;y;%-SdeaY|-Y(Wnrsi(Fbow6^57wsIRifDTV3~*rD=T`B5S8#6s`XxF zyf@o3(tQLCR6J3$jkPZ-OaGEJ^EoqDme&amNP(jJyvqPB#c=y`;A`&yXq!KY8gYpF z`nT#6(=VMaagWqerj5r2Xip4paZYhajgwRqOO+xmh*fq6;{r|5%^rm)7AdDrRv!t& z-3`imaE)9^_fkCk@J$fj0r%wab9&^P_V!c3sEFKt7}NM9fm=&f%B~a8aVfIYd7~KL z|3@};U(a~jM@8rAOdB=bV=D0gU6JeBl!t{ZT+zi4B$_z1tmUy!i{>Xkrh|=l7wItO zQMbg6RNHv3G0jkeEVg}k<&{~SpseT3UJqyDUg?>(deonW1(c5k}3Z^C= z-flkeiYF#5XOAPU@u%exFaPPQ+|{>w$c>=d&xT+DvhoYoKhLOk6|TKg6-oo_T2Ye84fP^2JFL}7xneR}BO!empI;Js$7ss%(Pj3S+p z!Xz_EO3`iHfk~>yq}~=iF!?aqh;wR$D%y$!7Mqa8VwuH^csG*3R3L6q3sB+HRJK5w zWWD0Jrwb~nC22uz1WsA`Xo$759q@yksriz2m6|R>gagb2{u^R7Ju3~ekbw7sX&}A& z-Nni2W4nQ=4+b=168ntQ+vc3IUGs)rlhJ*E_cd-n3Zb==a;0Dv&0_)z&x}z@$O5I~jAw5uG=S-KtIc3<$SQU<8lLSRAM??BM0Ivzw z18!YV%VscjqTm^eXKF6`N;ivL9< zV-}s9fZ_f!3WIZJrHlO@X@TiyXN5famo*cXGyXHv(glT+7s4oTdxDYBbX}fp)EHsE z*?kT0Qu>$}fF63>-p1Uw#)bN#Lc>~y&C~%36mF9Ez=Wu&;ahE?=GB!YN;Q3qNumM& zRB44dYHD({yP$x3+0jFFHd99 z(nQ@?Ev1iaSP_c_&>0s;?im9N-)uf!j<^!rf0%wLbxmpfO_!$Tm3{DJ*1->Vy0xU=>CGo#q1z5UssA$*7De)I6J?paJK<#9RC>*(b_YN`%tDl-pG zv%sA~^YrX_UmOX6B!F;}2>v5-rD#r-}$i1C9o-7Y*P~% literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m2_M.png b/tests/fixtures/labelary_devicefont_images/fF_m2_M.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3820bf4c2deaf2288d3e25ff39537cddb4347e GIT binary patch literal 7582 zcmeHMZEO@p7~Z|zn{KaLxF9XFMRdWBG;ol)T`NbSa)t8IfTdc*D-oQ#-d!Pw*3^Si z0(AF^XR#$YLc|seG(i(%kTfDmgTd}uK65Qpqpc=Fs6=PYwKlojyea;M(#j?M-7H=_HVySB4^Ra#kC=SbYsoy^6HJRg_sI|)FrzM zoj98V zT|4)%>;S^reM3(^w2#|G`639cs(csvd7>H2O~ zLJB(S*BWovNw5_r*uOeye}%TuQ0^=cUr`4!Ny#(Fdh!EiH8l;;>W0%5BSmYXOGf#B;gjL8N?S;Q8p_ZdW8_3!G*H7#rouTl<~ z#`j;A;HERQmC53t0TkpmTVXg?QbGLMCFsQkCdj;my9#^mwXpmeq8tK}9UovaX^)cO zBp}m+s%GQ?aMlZ=&R*kILlGw&^3R@xJOE?49%_=_{@e4M_kjehRE~KJ?kFFKhTfSJBv& z(`JGuQ&`++c)t^Xc)_YN1#Q@I#8Om^uJLJHQP(ltc5m#!sK)wotZi9n^~}51TsU3afLg z?7%664Ynl*dgWF&1FgY~j!ohw47XRpm}#CO1c(*9A~&&oOd_jx$NY}EaHgNJNfpGp zixq+^r8jgZkQ43@1$~TBk&1r9iq(o>h(ZA|d2&H@RGsmd_ zpM-rBjWctpnxgKQ<+f+N8@6|L34S|qK_fwd{J_KMaX**Y6oM<(m2XdRKQ ln*-~{#JVZ^A6}r@nEFr3=DFMnh5U`mlrAYNIkpJL{s6?V=i~qY literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m2_lcP.png b/tests/fixtures/labelary_devicefont_images/fF_m2_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..650a17ec5268eca38d394bfedd630346e3da675e GIT binary patch literal 7804 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m3_lcP.png b/tests/fixtures/labelary_devicefont_images/fF_m3_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee1af654526451e43ab8159f1391e07e85ffd60 GIT binary patch literal 8486 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 Hi_88eO|-bD literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_m5.png b/tests/fixtures/labelary_devicefont_images/fF_m5.png new file mode 100644 index 0000000000000000000000000000000000000000..04ffc573c8e77ccf6595f43017e949ff840ebb16 GIT binary patch literal 8250 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_snap.png b/tests/fixtures/labelary_devicefont_images/fF_snap.png new file mode 100644 index 0000000000000000000000000000000000000000..b535ff9b9189ec76a9b9eb452b4371c856a9f401 GIT binary patch literal 7123 zcmeHM|4&m_6o2h21?p2eY{u&rW<^ol3f}gC1Ksx8mGUJ+CQ8h3Uwq|D(L`tmb)gIL z-ovGcBMM_fI#|Fk$r7_=8SWRBX}hri!hkJVa4w55K`_pVpwe&j?!C_a56g0YczMY= zpL^~-=bn4dm)pFrFn7J;DFudM>+|!n_hT5Y6~7pPfVIy%jl%C4hxs+f0o(DKvI?xg zQd)7$QsdN6X;d0W1-jCVOsd@a*HrzQfP79wnrbR6j-$3}P4UsH3haQzq1EUzG{)nV z8a>eO(twQJRQhf}X>#`#o6>Ab40}2&KigPb*InkL6*=A%jRNRe8jFD9l(f%Xp=yyP zd5>7tQGHw<__##m$G2EJM79jEky-vv?jU(nKL+FMOP@#-m#cfep3~y85X7Qys0FVl zKjmiWL{F_ea|Fi8*{(X0Gpt-=m30$Xv>)b10L>PIq4f8JZOKo#?z|I>j7s9(awi|l zk_}Ou=MOV+efr+zLnDFhp^Z5CUTPCp=MoN*djo^w%J=JM1d|D**ad+ z#(O&@L;*>r0r5C*#lF>#ZOC;x$CmdHjJ=C5IwK+G)MT}=vVX~ajEXqqS?bv^lZC6m z^ja`ZmPC99A=^E86T&KjFhfXJa?)Fa>|>P+-R5Tp`*r3sJb!+fR@(I=VQBlo0~TO| z-1Pv$9xBf~o!&p91E4s(Nmy{Jbg;Z*=j$*O-AE@A1hF6}IXTq(048j~O>?l1Al??{ z`!%pYD?_&#hRIxIRV|I)*u@V@W_nxs&7w`-AoLIhDPZ$m>ESo8(NdKj3_(%4T^g`< zoNFPz5>N>ir6@c68-%tpCM9qd+o@KU!?S`dG9@RdG1e*Xry;xpKsXd9uT_(S;VqH~ zP29~7xe2$qou3s(^91ocJZVhDzjwhrLxd)7NOG^u>K~r;JQU{2k-IKHuSei{S(#5H zK3;WK$s-C}6A(~_n-*E6Z^YaCa8vA`mCTn=ylrP>j#2G2Gckj~5 zbUkp0x(3)7-)F-fum)4esFNF~k_Uiu^2#Is>P`Pug1AmY+`C^c|7Zomf=WxPFC-Xm z+dcpEOR(XE!*1RfT!=W&_TE>l77m{eLa(Nc=Z)Q6Jb!nJ)i4p-Ki-?>PVRhPLikS8 zp(c(^loAHU9-w1nwK`66_K=`T$ugE%S_|nM6bu~ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fF_w1.png b/tests/fixtures/labelary_devicefont_images/fF_w1.png new file mode 100644 index 0000000000000000000000000000000000000000..058f538b7e71c5dd0a8fc3867618a04cf7f28e97 GIT binary patch literal 7153 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 JixCR_e*i8fvc&)Z literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_m1_5.png b/tests/fixtures/labelary_devicefont_images/fG_m1_5.png new file mode 100644 index 0000000000000000000000000000000000000000..2b2b2380d24c3a6c52dcb68c85430f876b703df3 GIT binary patch literal 7610 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_m1_lcP.png b/tests/fixtures/labelary_devicefont_images/fG_m1_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..02cbbd75e51eb2982c0416dd6611409b30e0801f GIT binary patch literal 7964 zcmeHMeNa?Y6uC9%Iao

XR(LkVLM3$VPNX~aV^GnyPUq|PxS?dJL^Gi*%Ihju1 zSWH_O%WRrSPPJN7t#jz?r*pRTkXT;dyD%d?XLEf)$fnEcNThX)d6#!7qkDsBs&g84 z5tBPgii}}R`~v1cp28outEfg{YgD!hiy991nFesga=Im+4mLvV;Ul4v1*aa)T3pt} zKRi4H3CYNdo57ar=+}MN@f=3evZRp9?q@gr4F0{J(k46}u8#~efBZg;okMt;JC4*zu z(}ylgWHYyD3W{?*ddr5U*M51D4_~!tw1?NdlVp+W2^+;;^DhhT^?1_T3Z$zq9_>Cv z3BD_Ow9bB?lbwlFSPmeiD`9@4kAGjXX)1a+fJSW62VetE`yd^k+`&j_QQYwCx`Q%6p zyK&YunJi&zq2@`m2*x7s8uz1vMHfgqxC4fZV~}?(i+mi#in52Q$P_RZdE2tShCIp` z08@~5*eSrVNX3iGIYO3*laMwj?{d8{Af#cvSRlZQ7N2JmNed?w zhaHj~*83oeZ9fBupJXME;Uw2VsOd7g_?7anXCv(!cU(mU{qEPHhNSK=qLG$jL~w)( z2$Qg$;qKb*_QDAl%6b5S<;5a!j_a2v?nq9f>>Uk*B+Utbsr_~}HncX#${tY`-DI>2 zuVB4?KPSL-KR8)<-pI16ynkWbnJPvZ3oZuc=-63u6}1M|*RrJzzus z#Hk8W&9Lw7Jjz{lo)JLPxm(k-@Gw2t9)(DzyrIQWD8&4Ybz7e3Ys{k-M>igJFEzXw zi2n6h+lu`jnweAaad+m@jCpCzgJ+*zjlII<;FakQWj+vb)ps#%<;L5YFpdj7GfUae zIca>P-^hwXl@8Awq+KN`2XTQvZmJ3a2SUjo;Sq@5+B-gN2z( KG7itsX6$`u2N?Y4v@l{_;Q0fa56&Ig?f{*G}A__zanZ2QV_8-`@$DTd;A?Mzi@BMsV z_w%{)og_u7c{ANyhPfaJ;x>C$)B*&-WcH5}+(5S8&xr)%zjk`u+J&pKRxeLM<|Zbk zWF)T6p%mj4B3bjaDR%%O$J!&Otxic?o4#r#6`Q^y1zDK5Rz}GuQIT1x zR0th1nW86!D-_`qX=-M4?Dm`Smk@+{JUc2fHoJ7WMd>ob6im6$@=f~rv`e9&Vpob} zlVGGNO(PXmu(Rkd7TepsHfc)i%|b`BV_W{O=zt`bqrg{H&(jc^&`IO)+ZS;^7 zB3FoHY=&qgD;XSsRb2S3e}gFz{|UXCHR4K$|}?nPv;p5 z`)s20mm5M{W}u&|C)R+VnZVc5OedFgwH%)C&-9Fp(nH#-^?gLMxb24(3D@sjzaE-* z_raV1vdZIR{H;UP$M)~f{H1Q(j);&=`b1aKc69_vQ(V`C3pK<}sgW&Dy>qCGe+ykg zXt@{s^D6{48V{s8m(_Nh$^R4Ug86B!{DIJAWuK$YPW=;~TA$@hh?z9EtA6uV)V1Ax z@v9Ey4W<}%C-cI{YUE4vP$j?BEtYI&>v!*gfKQk9JmG`Mzo=P->pW^vpH;bwDb_hr zmo4|e`xv|%-H#za!xklK_3uTW?@5rRiQ}8cPRUCxACVnjar>1aQ9_KR;}ovgsl%gt zdWea_geTXgD4INTf4F@6A|%M0JihB=-Q9H6gLU{Y{h5z`R+4E>{@K2^Bp{fWc+gPC z(Wk6$VdG4a?;Zl24~na`H{rz7hC1zy$2hd)Jh??25T@?yf+Brafahouvy<0s*Oj!N zY>dX2=->XwI_V4(jT+vmp^x|Eo@eHm&v%Fb=i1joRH(CA-9_1!LzlzcDAkZB)Oprz zYOl49i7@_Dd~OAz>n7I^!86)*EmQDr-L|~B@tD)LGuNFJYHZz!d>Yb%{+~jGp@JzA_~H=$P4h)H~T4u+#&>+Sschb4JXU2Z6RP81zEZ}Uk8R(M4sEstp=8VPfz7_w zmFh%B)X2{?(FkT-e3B1xa(9xKBcF-+B5@nT&^j<#>{#9V^;m}S~|EGlZY1&F2v5LX(yd6@?m;%VuIh(KTPY`x$G zi^1bx0&#PIMi=<$M6mjo{4s_wu&rRz!JdOLI!)z`GX4~4)LqU0z<}V%?a#_?a>c0B zG64Pi({f@_Q)4|VbgxY<4|&v~W(568g-SYCy_^xOKMBP7n>%UqSfV=15_D6@46%!_^% zlcm1E3T3v1BX%k%^cWA(U8i#tndiT_#|xNc&O>8P30G56Ug5IYwQ3f%Up^&Yaw}WxZ_!xoCa2S zT3Y4q4}eVkTf-S*7E}7~C0>Ze1IsxkOAA{T3`@M7%m`fUOT-FzgKut95+m3P={~+3 z?)%yuHG{VdZXUiya|3uowhio^e7%kp?oh8;AOMZ^74-OctEA3RWPFMf8?q?vF$nI2FcG>rk<2i6Nu zuD1LK?hh+{)X1cmYj>c|bdFplwRQn#WnaSVtL(EMx^FpyKj6P{TSQaXEuc*?h~T+h z5~%knN)+HCHAXsN+fB!yU(Y(|=x8Y_-2j#A4G&=a0?+d-5t=Ztcf7@yV~OlmyZ5A# zB`iw2F#VgtYDz6JfmLb-P3McSAe*=IMpDIG%)iGK@lkp|kn{@>XCCvgVdTARi&9=* zf{N$_KE|(oO;~T4lljL|R8-yi60Wt%mvDW!5U$^Wb9F&P`8rLax_Vh(pAt2P6`(_t zZ9!gUIUSl|=`TYpl8dZMH}CBnN|L2h2Kr-=Tqg}9`f9NJytpJIh>a^Y^BtIY8>!MY z?dGEd5jdrKn%x}`aJ_G#Rm;D%Q;<6{nzXG%ck!m@^HdvE=%J~2)3zY`|dV=rg+M+EGf<0gbrjJ zm*V4Td_Jc1csG|vhgKgL6<371s(33P&ai^c6C1zY7p@H;dMBj2E>LrV1GToGVOqKz zncnsHZ@%+r73K;;Q>f8bZ9vgP6rWtMhX5`mu6`pZf#7kZ6ze&30Aa$R|(#`dj_X3dQ`gjqg9`_CsKIfdnaDT z;Fc3_ZQHFQsrmg+mD2W>0`+)2iH$wg50!8y8lLJyS@tX5D?^p)HOrnoSN`1I-)M*H9y?Cc3SjSqQ=zHj#u!=yN} z8r2LmXC>GcI<>CMaKEC~aCqE{tCMpFfS#ksoecuCuUD2fcCI%{?McPbhlB^i>7MF z5>a189j+^ktfnToi|q#OVYEQppN;LKs_lERSraq|Y56V5fxKt#t_iv3NukNXVRFod zvuNzy4JdqA_;n zSvX?+_F@&0Dg8&P!q>wL!|=1(7RlPAmL5lFrpXhs`nK7s!HuNwK%=GxGH*b`n43y| z?m^Lw_j;v~{daegNm=(^S0=drJ&9iC`fgmCkKDu%bJEY#4!$vxAeS z6w-LN5AH3Bzu5D`3p5?;dQEwJaMJ^UMqvVOz?~$C&blqOD0Je5|}@0^sSsUx3P3 z0Qx%v01&%KRSQN}ii|Pq9E!<3-9wOxX>0)s0QD{B3G#dLS3q+gLDp{u!uKJvEAh}G zmMa~aPG`Ctq`rPG-$~f2Sz|4)9Ba+^o{pS*1@Z223Gy=_$ z6_#51YOg`?^vz&OJl=T5sLK~Z-sVk`dTa#SueKz!R<0c)7{)t$TDc2^Ho@RhUO3JR zC>be<_kmpz0JI(a1^C?`0r+eyuo^8|>*Ds+k<=@*>?)OMmXrpL&K4@R0nevpKN2zy zklmQ*Gd4exk^;<5k)7rpCuRX}&-S9w;bTCp$ozn+qX2oP4Ul*3e&nsmfMj<7a?}P0 zkXxckg`+D=edLB_%#;zazKk)arP7g&d8%gXL9;|0Nuuk7dQzWhk{z3lfx8_$z}>N; zTo+fhg`_fO$tsaxaH@-uvWRPi@XSAGmeC&8>N(dYJ)|ovK!{EWpS70P-gOSkh`%S$d%QI|bK)Cw#XNnLJo5biP z9+NF;a~`!w2t5MvOqU7Ejz=G%HMyrQAfFVXBWSHqwTGlGd|4=wnC;hhDHPWOYwYBysQp))G*Xw3sqK`n7Xh`mWT(zgZGr3Cv9v~a66%Gob`Cvnmee1+*#(%|p;D7o zL-j+lTv^Oa#MIuM&Ks$;M4SkfeVi+Zq}q>e7Lp>hx{r?yMub#gvJw~q53 zd^?)If`DvVW@=OEPa?hoKh(UF)VK0RZSw)&6__t?`h0&(aVFqcA|>S|?EC$KJ>Hi+ zs@i@NSpCK=nf!tkUBieIVXXSYLog|Q{}fk9u~xWUcQP`gal@DrzfSI{(n z*@4Bmo1Xn5arp!et>n-e5XsIRtPDZX zJL>#vQGIql#XF&ouK816CS4++c;mQf4#fCaeU6A-jq4LZMbrd*T_q#%73a-Q9fW3u zSCmj~82zL#lm633Xd1lW{RujNeG&+BY0aSC%A9X_oK{bxwi;a1b5FMVtJRP~_W7&TjXUpn zA-1dfq-0zVRtz5n`7K|;yyNruUKtQ#+=mGXVP-e=FBB#9v(s3Q`|6bE)a(k9S{9oN zDSoJ$T}t1eSZ?rYCl&=}f@5E{+rnY(*?S9oZE-hBabpG00VRBLixJ$UqQfG0y^dxry=`XSV z;p3aKIxSAbr8DnPIg^=4u1k8xV{Athp5CP?9}m-;olx7qqyEByxm|ijeemqB%@r1b zo*u@;mzOdH&b%I}5T<9Rt^@aB_=Ki?MvI_W)0ues582E_n0}=^={(Zl=?Af0tS|}K zd%9f&bGx)sjcom&IjPCG-(-z}E@(eVUrys`>RK_5P$)CsZnEa1a&U~c%wtk@Mb6o- zy-?~(@spL?)0xN)u%$2`4WSMJ`G!;L0aY=N@cJp*!sXXsI7^Fpr$YJwGI$51&l-dhE5< zUf;DBd(Y;iNeNy2Uh~5+tjqYs_^B9%RGvQt3}8ENXUD-;$cnMaE2d?vT$Y-KP0-Cx zTclf-&1!~dhH!6iQS*mIYxIVehMX6`8R6l4ds&)p#lnmw?DU0;)39l}6)HAr7#p`T zomF${;Vd_7q((DxsD@3LIQ`$N!$L7EEPH%>-1Mx%)b?1van^9wkBiDRP2v1D$w~^+ zf^ud3tP2c`yhKRk_M~{|fw_h}51H_iyI%LPaQr{cjl#RG2^1}iYW>})=7W)J(X#;j&PNQxVHs`v+19eLXEdub>tgehPN1#{=50 z=Rf{b3@nRkjzA%fZw5XHMFX^puYE|y*e8!|Gj5o|Es_L7p60Vy#$jInFC$&;bFsfs zWA|Ae=u%q(x+b`FQozA4oT;EyPU#KVy_{P`Wpawd56|lHY#%(%y#$XTZ97F}{;Vp_ zZ-YNwZQIeYN#ycJ?iA-*+IERtb5T7%u)WA>g2%a+fXA1XY$wu&q26WR{ZRUI0HJxb zl4;;u81j+y&#hFZbaTpgt7DZD>aQ4hRM3;IMiJj=B>YhNi#;!%KmBuW-k}G4QijNK@5ZzfYHg;b59*~`y4H=0LvG*aP`<45Cx zI6oxg)RNF*I_ADz8%^ zvLM^z?%ri8&Ef7-M)wry?MO1Hp`%mMQ84!ABO}#NTPYCNLS2J`^-)^v_6P1LzE^h? zXwP|8lx(RG@T*H)7qP9mRHE>_$~}eaEeYwtx9_-*3mq`V-iDi@?J=$N@e}^iBWc9h6?7(6;+o07liItISnhRAyFS&1w-(`7_yP?w+qKV zIcs1McZai+YLQZ8IuK%nVSDirNe&$^eD496#Ru(4DV$C_JdkbwZnsF;zm^1_&tdXE z7gKsHV<8#CuE+7UEdZIfL#PD?-&DzGQ5CJ!Mj(dG#X~cL=JUc=lwRP-9BKD996t>y z*EfJvpXB6fJF=aHiF3sj(y#SGK-p?AGm88-zBdw$mRi95guiSkNO>GjJ7ftEfi^+Z zYr`a=XSAA?%;{7Z(u9!Z(smqgDK~%(eE?uf^-{on+9E9_cZmJbTJ1%F_(Wr&dNU3* z3fwT7bV1Zg&Qeg7i^p1aYkA>gj~dd+r)q>GbtB-R^YzsL5G!kv*MPN++q}2X%256Vv=KtE1~Ikt%LY&EY? zaI83s3X{cwwBV5jr+ZU>*edEPAyHvU6HJMrz;+woPpM}K0;WuVHDy{yHACg=27dUKiyCj>mWCx zp$I=Ri^}$=9!W4ImR5-K+{|B69zqS2GDzaic#h_jvLaU$iw%P55bEm?ao);Oy|AS&rZ;_u;?vAW$COacVZRp3Yf$RvQ5s!N~{ z7C&Y_j}6zo3SokgQ3yVif;|swljSH9u`Efz{7S))=U@mTi6nyu6TJZw9ZUC$*qI6e z`-A%26!{bcBPd029shckd)+HSiT1F^Q0i0q6;*wvlE>!icx)xP!#aR;+TA@sX?iEl z^oBR9gwU8Zu>3z$VdiO6yVX1bbk_3fXdpDYARm8*(s3k9GqXTId$m170VKvZMDH48{Al5IN5b)r{&(s`p= z2yj9n#(uYf1;6ZN9OAh-j8fXMUDP{Ld!f;eHIR|XfcC#?U8zCx`DAoDk9|n0rGJn) zcIg9>$V_LEhtO8;AwXSpj6yi5nlz%TvAyrB?RYDsWK9uR zoy`>&-2QVq*=VozBZ-D-P|KbBF9^NLlc73YH~}TMNJD3u2lb+r(il(4^9ZchUGOIh zi=X=-**c9yez4pi`HnP3v3xX2(f&FLNG}3BB=9qU9DXwANSY)MnFwotT2G#k4w2+s zd(%*ouqWzS|MCojBwtcz;IWoyF#fSsG6Zk<_B*D`>>eCTE7{~iF^2mML#rH-9X&y* zKkRk`L(`6Y*5a(X^B;StTzkWslEl-_hM>KKp@ zmH>Iz#m;@$ZmV$EetQcAmz^lYecKB(7XOenYxR;W?<&+N<=f;kD>_zBB}>kMWSH{E z`Inn_MP}9SqY;_Uv_eGl=P=biJr{+lwL*=r2eDtQ7jrT%wD=;j`P~=w0=8(Pr(?u6 zxL3&KR6f6;$vE9Ha04#ay9T`mjfw2$Soaj`(L^%H;x1YMeTi>n-iriz1F8kt^s}Jub54u$?it-1&4X?` zf$_KJoeD5Ro)Ti+*o$M?%0m^ z;6k5Gj!A?q$0N3_`NryI*AFi)UwVUXz*--=OSD-6fb8f#dK3PJdpriMU70mcq#K?T z5nw+yr16pdNpW>I(^=}kmrOM=VR<&AFt<-7)p)CH30c7o^CVz**m2g! zE$!PK^|eQRDlRG>xox|sbQIL^!yEFepk@%0(q6W_I!BSjW5kkMS~hgu3XKx`?A|p9 z|CFyNg1`FuOh|;e&_V}qXdFL*YUf?A4=3N@mqvC+AyV>*!rfwE(oc2Of)6)CWzc~} z5?XUz^$ix9bwz2BRKYXhvuo?&$KpQ>hGJ@ZsXa~djX!-#1Ms_v$mo+?`}>deQrG;Q z83dO^nTDKEYkh1BN954qq^@Tnv}bvxz4m)nTNLY5)UxZR_i$QS+u`NQE1APs(5l61 zy+quP>S@@bPQt?h*(Xqw^wCLm0#eZoykO8PLfW>49@%RqqE`+oa2%w0FB<{>vDsUb77X8)Nx z_dKnzRa>K)F7qtx-Pk98F~T8EFm$`}5^a!DK2CEvoR-I%{$*49jl;KVhn|F^9X^b% zRe8w1|Apk@<%Z331#BR7)#tdsQWC^x>{49T425{RoQ7QOJeZmQYX>J&2PE&wl=no= zdlKnApiS|@zzYK}47@P#-b;C}>%7;L-s@TKt+n^I-usq<_vH=mODq4qFY92~)2hm$ UaSx4)G5CxhJ1PF_F0(2B5Fbb$qn*;?%#sn2bMMY&4cTgLIz|5e=H!5p7Ao0bD zZ$Z)EV@JoCPqTxoado5vsGuN>_aS?}$Z-PZAUEciCFv>4zFo9Xp7`y8bk2;FWeR!tFnP@K z47rk24wsX|zEr8cjEInrpPWejsZ+$^^m{mAY)oQy$^1^WaGW(vE+oSXa;K5P4cx=U z>Cysjur*UF;~%Eu$i1`O@SX+Q-EJ_i8{BP{|0s80(s%C>9phaHPvD==*7UdUHw?6O zp#u#j{4o6`Wm8Tn2;Rjk#E#SA*nx&hJP{eSDUlm08;2}sU@F9fks#_6hbgJpbDZjG z7{MQ#`&+G2I1brHMU+8IY5M)|f~`AeuXq*em85FG$k(BwB4q=nYYi1WR~2wy(g4ir zQ_T&=Be*_KkQnS9Cq&TBQCEhQ`VjH%z|M{F{(q73|I`Hk4RPz<*>gu(mT-6{qC2Ze zg4rzCBchp`0uzCu*)H34L~MC)Q-Mt+RHr(D$w&I+up;iPXWCVnI;EVmK6mNr`Yn;{ zxA@Pp22Qh{v_y=ooU=aUGMn&!_WPvwPH zo?B8k8PD@LKj6kcuaO&=s{s#xg#dX;#cBO8qreq&Qik=gH2c2Uk|H+j8?rc%7>De# zit7|O-m?6(5)Uy?&xov~xSN-YNO08LpnbE6xm`2a`NUY;*^EZLF@|@*vO-zFJ)V0I zK&~_VoOA#!`tzNY0CFW(InoGzB5zDo8A)cH)>o26Ot0TR;CY^k<)5lZ;W2@6nKmWr zd$uHnG&D~EVI)yc+P9=g6TIJTA_E^pDH_Mk{Z~ zYJCO~Z#&gA6%_7I-cWf}-mTUH^?<@p^}xy?{XBk5>2)S1ZgETQf=?ezXZ7i<>!DY# z>0iYX9)`iY@KfAqEFAaIzO$fTNJn0Un}R`icmHP?Xvt`r-$D8o1Q)U zY0vw%rV%HD?tZ<&AWpho1M;JUOC;5$Xt3Z5-uq0>%iIGC2Hv6=FCvmXih&PcscR>H zbAW~MEJZ>(<5jf6c@zT=!nV5x-=F8W%!VG^|zQxC#uyfx+m$MK!gwZ=y4h zAh&Hq24#L!lchVhA%mW~)WR@q%-}MIsjiy#_E_sulavyjDSz)|8F~ozv*wvw$N|KX z;-~td=uEPUj zC+|agM|J3FCUh88T8N zFI&hJS`%s&te4EpxvPiqG?GG&vjV&d@K%4GAE(_dI)o=NXJPtWFC~TCW<}EMOIK-r zG!%(p=on?0qfN_j@3}-oCJ_C|iil&-Y8`?6ok)oBpvUxVg0%KEBB(3?FQP=1v_UZw zi#M-_FvP&WCv2^xJuP}Rklb2Jd#-ai14;2k+Or=BcZGpekpZ%+K%{^ahI_&lNSgN{ zUX~Bw6+C06w(BHAdum~>eO4|aQFN&(+Ziz$lJw~_{5$Ocis6l51wKbqRPJ>a6+9-$ zn1^8W9#kr^m)Va2LqjZ;q>d>- zBo9&uz7#RCW2DDOit|Gt5ROw(ocHDM;Q=52gar#G(^QiPG$h-ux6wnP?Sj?|4e5Lb zB5{idV^~5O!>gBJK4D5K_jeo>NM)pTDP$5);+Nvs1Bm2&DiI~Gr#ZsZ>f^LHQ;M+y-lhSuL0df>bw+INA0O3eT zkUacuZTlWXLV|RiS82~8AnZtIc=3?;dxGv)Be8hq3aPX8MnkA{BFg?3L}G>vK9Sj4 zr)ZLqNbgF<(1sV$e@U@1D*^WsDGWo#3@^(8BIkkO1trCu3k>H0?$CcT1moLPctG|g z+Orc(7d@ZhIsVOXJ{B*p0*2veh!{*~FG3_9;ckZJD~jzvu&;{ZP5^?1GSblR4}wcJ zBa%4Kz;cmBi2gwFK`O&hq`FBmcKrtKGz^!+0y6VP!3V4$Gt>veOWjMzGk&LC1x^>w ziUKU)IIS*GK-6X0^8xtlCXS@CffovVdV!KV@FI;{$q86|sar|zm|Ta(m)B#H+!r9e>QwGKW_hgY{xX;?9;D+IyKBet#R%yT}2H zBE*8rU<2~3&S0>p18it-cPDN>gISs!pF2pW|7A$QIZ#W5@zHIw-?gX#5TT;@#cYkB zSDneV!}~a4&OO9FK`(9@%GO}{cv4Kq=M=x8_7Ee#<9MN-ZJRd$oyn|V)m@sB7)$e2 z{V$9u8T*-Td7*Dd0`rpU&#-BRrXTSnq^$)~K`KcW=Nn>?lO(lP0vF{ir2n1apl)I+^p~n z*A9;@167pZaUeT`(@ALPuO3zCds^4>VPAUI0z$htJ}wV)4s}UHqh|d=+Bi#HGq_c< zQYP(s3tN>}*uNH!Vy?40Iis*J()97Y`i*T)UkU1CehvP@B^qig80K+VYoq=UQ@=44 zx6qa4fV>!sqTbHy=u%I!jXy)8Lu_wM!OUfjpw;?)xg%7Vv%o)%;d7z7{EkMhDKyNp z=tr;hqirdFm!eY`)~1ftlpr$mxhZE^li2c2kd>BrsGU=L*yd}nfWD1^u29~>U7M6P zUeA-CX&CAi@>20v9ToZ#+by1d2o_CU)L)^a&@U6V>|gsrJwjIbDU4oC23)w4f%;vhag<6F(=r71xsaEFwHgrpHWye9c#T}4T=s5 zvfj1E?=^UcU2UIkw0|4X?-E%=H?IwX0yg@6JN*AU zZV1{xyJDp$l-uGn`wO8IzESr8GTmy*Bg606d*2c$;LYy`r)3ah=>_)`ey}sdlFL+^ z9~gu{Ln`uziKQ!|cffAq3(0?b&TqyPF>lsWWf8Vc4CHOb^kbg4U_I<&S8)(=uT(~3^}C{&F*^1iU%g@@(8v(pCUPrw z>SdersLXQDUtXo@)$siv|C}f-V(7heiDH#(1GnVFoZGI(Udj7*Ex1;xk=mBDo$WB) zvbDcc%vgvW;+&bq?g#02LuKnlJVA{WBEhbiA}f#IXbPP zN>$D_dL_@fzw32yJs`CuCVAS>d-l?duaFgaWUpOZpL@c%eO;6w%415{>!j@GHDDTla)Z)+){xh` z``oVkyt4b8w)=d#`&_>JT>d}mT)zAMsr%lo`@XUJ8n*lTx%=9^`!z!MD~#^fC*6;7 f{)dl|IGk$VqKe1EmVe=XQ8giU%GeX5soehp{4+WS literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_m3_M.png b/tests/fixtures/labelary_devicefont_images/fG_m3_M.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4612cfaa3f8a73b00c87109259b84f29d57fbc GIT binary patch literal 10324 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 L=gs+K7FYV;0lf)H literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_m3_lcP.png b/tests/fixtures/labelary_devicefont_images/fG_m3_lcP.png new file mode 100644 index 0000000000000000000000000000000000000000..786800d6ed70bf43b3a262860ce9393bf1090c6c GIT binary patch literal 11052 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 R@TgTZb<*_cLlc?2{{Rv$8{Gf^ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_m5.png b/tests/fixtures/labelary_devicefont_images/fG_m5.png new file mode 100644 index 0000000000000000000000000000000000000000..68cf1ee6540b3bbd0d7e1e31629d56dbbb74f93f GIT binary patch literal 10496 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_snap.png b/tests/fixtures/labelary_devicefont_images/fG_snap.png new file mode 100644 index 0000000000000000000000000000000000000000..69e6399ba54a2cdf1107e75ed730248cefd9a3db GIT binary patch literal 8064 zcmeHM|63Ht8K1p9mh;$yi=f?8(%Y(0G#A<96sbyXuYLgy5n`wYQ^O$w(x{+C1ts1d zXW};!u#!YX11)}OY>TH@i>-xSL?Pk$7Hc)B%GE@~Hp)o>4?K1oRo#)m%JtI7R9oTb%iU)UA}eWmtYlbiiUwt$&WZA>uYbkg9Jn<$%n49u|3o93Er=4httA} zi|oKLw|4$M-zA_h2({b#j`Un^0*X|JnUNF;xPO^PxfonEFjVdM72E`}2&S`PL{Bc8 zZsaUJ+t=(7Ou79@mv904J?%8t`ou)T4HqC5SBeXSpyvp!b^c@h^V%$6?}l+gMAaDU z8tP)z0Zf_ykNzmu?wv87puOEqjCwIPD$wnQ<_?Bq-&Ww^)JcZpPXtO3bUsVoah>JR zn0~61{b?w!^}X(rM%)tIZ3Y;PMo^LX*reP{V4wYTz-`y&p>eoMX{_Q{LR&XbhN4w$ zcL)_J!BHHjjm6c-+Trk9Pb85wie#XGO5zSj;HvO+3ZR*~!2{g|>wLW<2{p{xIK{K^%-JNRajc+Lc=Tt^_(vFrg%6M+JG z5<=GT-IG_R{AO8=W%z2l&;Nz(-{HF_inqTu^e(L9w-QXuuwL_rG~n0|jcAQk-}Old z2O)&3z=>nm;TgvT(wYm+6JlBb@lTkp*hG+g*}w=yKK>m`AaS+Wc6FYM8+S1a;Av>m z+jAZeIHfXi!VcoMd_%$Z-4aWx)Rf!R$a`*XnT$t!KElX49p~QR{Q0KyD?~FvyOA4@ z$%RGtY9{)v39C2JOt&MlEM5Fw^r}WOm*3fI9-qVm#V??RF2~4ULR^?gFulH#F--M)e3&HCJE$_O0|UF6g1)?lDXzB1#KK^`UD`9Dp`Dzp)7r;guqU z@Bl`x5~ZlNmSo@C=?ipJ)D}}!Z2urcM2-j?a2ckq){B!J4?ZKcr5=6gF(b!y+UOgN zARrD6hwo$LzY!`2YeL`wVQV&_ikCJU>@N3F`Q1L-EYGKhG4fE2*bF`94=JpH|XSre{OD_Y358BPA2d4_f5TYT+ zEQVk!b-eYy?G8TyEy5Ei!qi zB~>1`@}~VXuJT#gKy@)m=T>5x`Bs2o7%|E2ZYpKYj(Ql&BIkwe9hn}LV9G- ztgdSV#C{k$roPt1v5ik5KAJLw5?8a0%q_ym^Dqv(s^i^{Y?Fi+5n6tNNNBw@9;d#B zC78GeWtJ~&VeTtHF&FL)NFl9GC<&~r2x~VaevbIvch8nk+6WYdsp4e&?gWzV^j5}u z%8p`6?@rMl0pl#cdpZ)QrijgoU__s0+Z2gD3EN<3pg0o6S?>6KBL-RxFPs*u9kxZJ zHusS^+KQH{OcUvX{==!rgzq}qy2h?xO)1X3=TZ{ z5j=w<4m0(Gdb0gv&UtevPPJToQliNNlpF_cnSuyw zD%4NA(d6Q=x0BzsbOn;*)c&d6FIG`tyf>dWxFvg5m&!VHt<1w$lgZ~b%KucRa=T>InN zjy{%K3}nq2yG^4Q`x$!j21^z#TUhfmYtc8>=6P-a literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fG_w1.png b/tests/fixtures/labelary_devicefont_images/fG_w1.png new file mode 100644 index 0000000000000000000000000000000000000000..1237c7db12d2d0f4c51983799d708687771e678f GIT binary patch literal 8241 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 Sq6`v&uNhNjN1cw8W&IDW3XxO* literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m1_5.png b/tests/fixtures/labelary_devicefont_images/fH_m1_5.png new file mode 100644 index 0000000000000000000000000000000000000000..55abc5d989580e9b5b518f142049f48652354cf5 GIT binary patch literal 6796 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TQ4A<_hk-o%oGwS4Sq9O8SUmK zIk3<7GhEQ@zgz+$TsQNmmK;ykV~Ga`P-%$tL;KhRS!``L{|6pKrrd!>E@|jY6anT$ z2N8+0I*SuT1UTJ{Pisi9x-?xpW5nggI5ELwGe}xxL42B~2qTl>@5ekG0UAs!N#Bl3 z3M>d<;W+Z9-x!pYZ!jFL-_>xH$Kb&47xpY`(i#}=x&K#8FlFZXVD}4@=@pnuPU%$l zDmwHwCLXKjxRK4nn8m|m{LlG7Trx*Ma>9&{^+1<6vb~rRnUG-4?EJevWW(&ng@5g} zZk#=E;U7eD2H3}}E{$l;gSr02q{v%5ujd;sXfiweE1hS>g0ma`Ngf7zs9DV5&vNDm zsR;=ii`f{R+1ghAcWjv6*m(4uBnywE#Ik?vjB#viV%F&b1}OgTe~DWM4fMv3_L literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m1_M.png b/tests/fixtures/labelary_devicefont_images/fH_m1_M.png new file mode 100644 index 0000000000000000000000000000000000000000..9585966ac6c77b6a7313e82260190bdbb2e278d5 GIT binary patch literal 6887 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TQ4A77FgZAxl?@@-Z+-`FgrIhE&W+{$bDMc2Gls%fPUwDbRqcgK6>1 zRFNJgrGpu1lB|mxJPc+V)05Tx_Zc)CysYkTXWVcA zHxHCUPB0v=xGzcE3Knc4Ywy+A@jg2A7!@*HV~1_oRHvooSd{|Dw9Hpzsf z1^gEA#}6DR*xtd&IcI%xLc)&dBMmI)t^@Vl(M^(IU7R4mRFx{$woaL+K6$@^LNhu8 zWIYGtTqADl!~1uf&pj@=L*hZh+=uaZo^N~16T?$*;M@oOcg430+4R~#R?063PTTk~ zWrzHgGY9USVqiC$$Md~;mgJ3S$p;6HO@3GxV9Z>teON<+wVD5d=4OL4!ihIN&t4eY z&dB(z)8Ng|vlrGKZeaNABJu4{TE_K6ko!I`0^QenlZS`LkCn&6A<2xHxjC4TS!lwH zvj+}52svN?EJ_quzMRtGVVuXqb6HYyf@6a^^WhRVwiJN}Cl46RotP-n)8xqUVp^oc z7Kt6A5&?~3%-flmwJsz*2ulFjV8HY%b=t0Tb8~oBELc~pF3qg9;`N=A$3O-ruzWeK zQXf_xv9Y#yV(b{0Nk{oRuj5dl!+lr%Y8;k>oObj*Cj@(z8USGoi1fH&bF6*2UngD_n7Ha?i literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m1_W.png b/tests/fixtures/labelary_devicefont_images/fH_m1_W.png new file mode 100644 index 0000000000000000000000000000000000000000..986578daf9fe8437085826cd778c681d225859e2 GIT binary patch literal 6843 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TQ4AmJ05^Au~?d>|UN<%}rmyo!m!-4n&HD;DQ!IO5JU|{;kWGt!hVD6+N zu5G~l!6upT!=L@Yi3h*rnZ6krl>B37bYr{zUtq)Z#)Y5lISh<;{A+L6%fmDGzxzQA ziIfJtnXQcnf7-LWNlVE1&(FlebMC)lf;qGE?|OlRgo1zkjJqWzZvF2E=FAfe!XU>i zZqPu_ktJtz%J&;DXx@Ea^1{Kp?|Bv{i12th>_1}^d-RDtv(}7tNuTC3iu!~b{yc90 z%)G1=^Q?Ga&wRKZ>@(#B@t_hR zp`-cY86z$?#)%0gn}J1!gNnpi9iWv0oNmUafev(OLX%$LotBtv@%7VVKDM^0Jg+4r zZb&*b^gg_Dy5CwtBFtz_aza8n1EX16u)h7fgoKEb8~Pd>=O&8uG&!b0)*br w9&PQ7w)RF_d!qxuqvPVE^8v$u9)ywMM#lX^rN`SVfOAX?p00i_>zopr01z)hQ5rh6?V!A<55{++tvmy5Q;J7*a7O`G-B1+d&NlE(61!ra%L(4yMI3 zQ$>21ln!R3NwO|(@GzJa36dA;Nt*_eW*Lut9=09d z=QGOQv2JF3_cvVvm;shGJhb2IV8E=lq2i-FFN<*kQ@8m4i%@}jU`~l*Qfq5uQRkBA zV1N<846{I0;>MXn1(O;jAUF}EvWfAW4ja!A24=RT2FAl060BQTm}f_ps2K<_!U$j{ zbntd~erC}&dC3?X{o@V1E8e=ZiJw1hn82L%d*Z>PpNn`FCx~1SGWfGxoFk2a>G6LS zpko9i{;M-INj4n#@gHdH7Zx9oq8_G22dJ8hFIaAl32bEMz3yo*xuIEGt6;%HtC#A` zWd*LRd?qpKe^WpKwhbC!Y!|9N$jbr)jA1SN|BH?W%pd_!fXxC17$eK|J^PFW*bpSx z;|2?6wm!Ti!lra!t0s?2Lw2wPJSaCzYm|Usa8NS+N)?-)60+bp0}H?8g$8dUtqaKv zP3=4x2UI0RUl=kRbZ!F{R~eiV|M*2T(ixZ@0)xqtS%3o=Os6Cp9KgY}g-XH17;AKT zf2JeratV&c`pZpReue@}|Ch0f&Pf7=$G-->nM<{*|GE@^K58%dp=s5dufk`~ivLeJ zz`bhIb$=7{_&<|DUb13t`(MJK#FL;9b*Yy{2I$B)_DmfH4UHL|=0XK23``sUb0{2Q zU|Xbm*Ws`WdAY4croc+!-9%Vh%j8XW}q=z{K|79h3$Wk`^#`q#t12 zBO#zLk5T+Xl0!oUP*FD|2zRASdly&8w#H#m2P5OI>Z6hym^zi%SYEsnO+Ub;(gg|o zgdhImA8KcDF{=q!|CVR1nZN8%1Lu)*|J)hxFJEbpz_f8Q*ecBh!D&DL|9{_SBAdsi zazJPL=RfvVKXxnow$EndG&ud#=6^rmzjq#&AEr4lohhu8-dT9uDBVMd#7qb=Iemi%ZBX0+!v+H)IDJ-5*jiqVmo(GjW9fx6KF%F%(@(edih iar)8ui4i<)!^p6KdrQazFXl6#NixBaqJ81Zu4Dd!$UzbLX=FcHW_QnEtPa$d4&n=G}dZpZ7iLuCSRI}5Qr@%ai^7|O7c$e5^XmFbR+Cie_HbIoXxp2%GphZvp&nCUyKIZS z%uM+Vp>0fWzQ_+~H+PC`xx|*#@_%v%__}VEVr&jX%pHf;gM_jQC!$!oxu%qJZNX&y zuz8l4aV=14+YF;hhmr7dV*KQJbz;cUP#~e!-xfqiT8O#Y7=CZ!E#T2(Fq-Azt?RcZ2W8<9=;lK{}6ntuID=N zxl}SK#wMrW<{eX`#wbi4^S+Vyi*uL|y2=tZd)oyOSlSUxB@EkE@2y})zqt7uXS6IYv#c4w!KaWEG zc_y0q2N=Tork+Z|h`<+hF4-sR1e1Gb2Kj!p#`4^mXT-hKf)$5`ICq7jx$~_szB_Ub z!0|}I9DClxmCg#IsF_eS(xa~p#mLcUV=3>K_MH~N2LW&43)}{AL#ovtaSX}}R!BGe zEL%|4=Ow&iLPv3f`i>2o1>w=S+HK(dCrFNOhDq*X0R6pI!j}8<>qriD!6cUvz#{xt z^d6MgQNqDJ=s#Fv)&>dob#|8W{_T3f>SMPkH&(J8$MK5#-`9U}nk^VEr9s_a2I3BL z&|FWeeeLS}H>Zde^wXh%YcEqu_>57 zymSLg$U{P05)hRDxRiKE`IwZ4O8K``mXOLZQW;9B&Pi2CsTwP!$Py@$K#>HBq%e>` d(VsvO1e@;%2K?L`Dg0FgAXA@{Hj-j!`VHaj?+O3_ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m2_W.png b/tests/fixtures/labelary_devicefont_images/fH_m2_W.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9bbb4749eae8f846fbff984cd86667da7df057 GIT binary patch literal 7160 zcmeHMe@q)?82+x;o?UmNbrQY8w5KR(w8Lw=;$*rWtfLTcA`k=2uq&+Xrfe8IoNNNu z4v8k+nz6_aA<~4nkR_NUbCbX{*Wlcitx^q9l);LIABh7inewxI-ffGCf0~TNnET^$ z`M&qfm-l_{d7kg?z7O(t**B;XQ~-bt*;%%H08oQ?DTN7ea-t?(xIM=1EMf~PtE;UbrP;Rh!go5#7p$txpq^AwMxXZ;O7*_1tIZkj zlRXjK=h7;=xGd_UVllqa=V}(iaw#mq@_(WOQfs<;W293{1>2W#edM>9LA*5*s>R}? z^MAUr-00-?0X?DkOu=3;{4g}su&fQId%Bw@axi)CsZ+_<2e~+v?L)&J6UkdFmhn1_ z%_C3mU2Jj)8Y+=BLKd9Iaop#IUEUs?*8HwRDzpSa46fQ0yR{tovsE^1qA2R)m|u0? z1k%5Pg2?u*n{Fx|COGE1`og?RK%NgD46i&(NU_8Y_ePXw_#2^n5Jd(KF$gkX@< zU4NsTS!jnx#U++Nn!C9j3Ru;Rxq0=$RX4*d)N~@&-o;LjXMC!*Q2=Tho$e@JHF5kN zY$ft6s$6mM>f6J=gMxJteax1#g16C65+Q@oyk=dd`KnNc&HL>&lPVKAac{$7Mbw>& z)ORZqhj%M#DgNFFg1MNc^&-zlkDzGknd6AkCA46`u*MsS#2Jt9h^do^+-0Pwl`)g(^-(#&$byod*~{L#@RToVb8UJL=*2=ogu=FlzI<_3MpwrI>R zUu`oo4}1wv@K!T+lb?qIu3JQ@K)>0>yFC>7`7mV+E7+)!MvkmU@ykP0z#F$6(=(M04rxok3d6xmKyh<3 zPLTxzB0>iQgqAooEf=Tx?sHS{h37F1liGhv_voguqYTJ0dtQW7SBxAu`{O5YI>N<0 zgleeQXBMq5A4lY^p_G^i&evS2xb=A-SGN)(ZxlAqnlNNd=_f6|2AY;Yl|a2;`-j9e ziE9$q*7hAu(wL+%Nn?`6*5dn5@)pTkByW+tMe>&W_RCGOT*-3(Tb3&m&hf18MN8hi QARg&u@7!hkG=uT}1^3^ey8r+H literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m3_5.png b/tests/fixtures/labelary_devicefont_images/fH_m3_5.png new file mode 100644 index 0000000000000000000000000000000000000000..ada5d851248bf67bbd20b8f2cd8d1624944ed273 GIT binary patch literal 7221 zcmeHM{ZA8T9KWXzy+S<(BIfot>o%l!wbP3=7Q6NL!0xFcvj`VF0UpQjsb=B26pxrgg=;$~GIZ_Y8T) z?S`@nO0!tAm|jGy^5PRT`2{a~DqjhiF(`9InbBa{T3ke}-@3zytuvTnDOEg`x~q^< z)9NJ@9iODpB*n*3x>f7H#$&$1uz3xcX{qbW8#j+><>{?al$=)8Sl7_<{gRXQ#?Ttc zg4QhsVbYUa27NpS#Y1Wej-s%i7#7R&f1(4}r0K+y+3P#;2P}+i?n{J4%^>LBP@_Rm zK?v4nPLkl2T=d9O^F|IR*qfel#az}Yv#ZTsg`kfubh&y4TyYykwHXt(8MI55$?F8g zgwrY_k{(pT3ijbDeAxLz196fK4W5CoD=;LqF-l*f<>}xIn{Awvf~$c7)^j#AZ(b{V zGuHYB@ff7a@L|pY+oDKmyEXMlj{fPex>ovcFNl_jC2PADMB4&>Z96Da2TKkQ+nHqp zh3OS+Vtyr|kfOJi#Fk_mv zw@WR=53zAAD7D>MHWO6-!xX;Kc@h5*a^QFCepL(8ebKnBsExX|tSM(3lq)9vBjK+|1pI zCLUW}cWB>1`04_K{_H_Za&!KC0l1E&y~ydssNFnB$y3GZA{X8OaFDg7Y~7mNL~K@CF?$J3{vOUMEEcHmTnYg=?4%CqQ7DDp>mY zXjl*98}P*i@pFn?qMf_K_q+DZg(}COHfik9HHPSSBNp{?i|e28{COqeXL;7m+u73r zFqNGc(JJ-Zt}?-Pug8~_g|a?5NQ_yYxA6MbEFJD)Mt?Vd!+!Y|ta3~Y@JQY8vhgU- zcc<;7U3hLW-zO>jERigMP2cgQ7ENyianW-3K4L>H)^E@8^87jF{k2Cv00r&2%6d92 zMVx!;ZCtFmSo5j6GKgFgxh8ULT5s*51Vsso5)>sk4Id0d>k+L-v>wrVMC+NdZ?vN2 c{&$uu!FE)6Dt{xK=m#N|xiTy5+vTkFACP>tNB{r; literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m3_M.png b/tests/fixtures/labelary_devicefont_images/fH_m3_M.png new file mode 100644 index 0000000000000000000000000000000000000000..1b0300c444b34ade1a0fd3a41c3da1b3e21b0b48 GIT binary patch literal 7689 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_m5.png b/tests/fixtures/labelary_devicefont_images/fH_m5.png new file mode 100644 index 0000000000000000000000000000000000000000..41fa208f3f038b8efde704852f2678c8aca53d0b GIT binary patch literal 7526 zcmeHM|5p=N7Jrio116Ig0XY-D(2->U>0l=b3I!^OB9*0ubfsI;x@;mLVpqkoxQa$H zAq9hrY)}^(w+O|x=Cy9 z27cTaiH8}d{~SWMq1SAIyVd1bMc1v&M%HdG@ZIwT5{M8KyhJ#WcjGlabpKvrBJ8xg zWi!F=#Lx6_z51$yNXm5N{bu_y-(T+hzLww8gxtwdnVYIqKJl6P#Dw(ND#(O(m)2}C zrT%W1k#-vTwPjsnDSbTn6xMHvs=eKZU-xw5*jdN?`vlKUTMC)hJ##S7&&X!-_jt9o zNwY1{cn5j!mnhnI=cO_{fo*@0XQ|pG z3)>u3`{*d1;CotvqHC`zu}Jouv*vrBbC7EPgHowyo80)or%Ju-MQUSiA&--f70?^1e>CE8JMn4l zCQ<;6Rx}%k#Mg-(==*ho)ND`$MVyzB(vOUl!2M05F&e33Bn#Wv*53qC769iEh1cou z>vmm)z!IWpF%Xs`_Hd6d0!G;T+t5gN=OTrFMO z9EYYU3fVzEWu8I6C%NIoR=m`BfD&-Uu0sX_|0|)_?M@a9A+93^;#Xf0F8fq6%w#rB zCUw&*RiqbpQh=&Lm8X#K&v8@5Sf2Xlo}^M%%EOokL|V~HV(r$;d_TjS-U$*TSt zyX_aL3;EHhlP^O#FB4;N-PXi~r*~8wDK82%L)$ANEVesCedk*ah`+0jOfM4hm&|I- zO|9osh&JB~C$`QgA)&P*!pW&W3r9sW8_mz3AB%^na75!-76Zpf^4`DrbfyW)-Q_?A zslW=l&GF2(1FP$%J>i&{P4^kNvengaADWpz@ zk=y{*b!{h9}(*Be9J=0CX@aLuVKM|+~c-P zDN0P-4CH4_k9h!c#^#TZow~MIrH~aKZWUr-Km+&Rz@7t%hn;<${|e-YPCnMJj4W;l z#LM1$cEk899+0W_Je~@<^!L{f9E-%P=kn_2Eq6lg& zsI{Qh9_T}Tumpo87%ahH2|j@LiNV$rY(2r&6Kp-f*2BM-nw!6Hf-N`La_35G2xuQ+ V-@fsi!hL}M}F{eNv*XZ`>H literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_snap.png b/tests/fixtures/labelary_devicefont_images/fH_snap.png new file mode 100644 index 0000000000000000000000000000000000000000..51b55902c3a8f38d398ef27ccd06d30716b9b351 GIT binary patch literal 6779 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T21ln!R3NwO|(@GzJa36dA;Nt*_eW*LL;8P- zga^NcC4QVU0OpGXW}g2qnZk?@Fx+qbukhi@JVrJau|MriS9uH$lt28hA;H?rV_}p0z|G~_;Be-j1=tz9Kxfoca`6bsIp>_ife^N~?{GOI zpzAKM<0ud=sBYdOdCfjqf#Vj>>-pfqC4=#By%j?o8=IJQx`07S!i-2H@+sgm$;K0$FxwLgEBcH{)KkSVjY%C9Ue3oa4ijaKJ@c7(+ zU~$AIxxhQ^=l>NhQ>QYrNSJQ_&)!@<(S}Fhz>1xJ?OANJ0#j2N7~Rgk1)G-BU7%d$} zOU2RJV6>7PZ5)g?ibmUtqiy8TzQJghX|$_2+C?56IT#%=867Da9Y7n51BVO@y_O&9 VLhTej0q2MqJYD@<);T3K0RZI%?%n_Z literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_w1.png b/tests/fixtures/labelary_devicefont_images/fH_w1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d05a654035653bcae3fc29e51eeab2f9fef73ee GIT binary patch literal 6950 zcmeHL|4$ob9DeVvJ!-wh>KbxIWS4c>Fm!nB0ahfT2&2PIG8_O27q#CKNAAL#g)N2bSoLy*D-Lo??nGm z2^a8pBF>#6CZ*;;dBvXnFP&Tz1WH=iS8QOO!6 zcP8JEZN`|gpZ~a1i$4*TC$+HQVT6fWnQLMy^bG^!Z>2&%F_yJnim8FDF$N7}DAxff zs(vG2nVD17<@-Cxc0pBcewT|uYq&<8Rh}xAz)+02t$vbbbWABryn1E{7`$vexV{Db zQ@e;DTRiyn7Q`2e5S|)5OO!#MHrQR_+vtjkdWZX-Mr%*0P+zHeca^tP1>0~0YO(9f|K%d zH~k-Ip%zf!c8!-(si`S1%igsi#aW|8u_sp7oP2S0QiUmvL8$_YqoY5(KP1k1Y5GZ> z0b#f^?_jDJ<~Np|ZDTik?n!{5$`pD@44C~=;oI#r7Z*bPPrjP(r-H@I&d(NAxR7T;Oh-qP6GKTQ&!3tR9u+7` z$d5@k3TZTW1Nn1w^wLn|!d9Dc^Dz0Kjo(*TK>O&5<>Q3m*1FDo3~AzA{ZjH!e>IcI ztJja|96ieO3ErA^LSx_yT|1KaG!xwZyR1#fK=!-R3!C52(=3bbrToY0mL?yd?egFz zIO{8n-Lp(AscT~zr%1uMCC7_4%bk?ErjyhG%{2ap;(Nw$5aaw}e)ov4MW0;z}i9NmYuh2sVx1J)t zttVtB-sJ&yin3ECx056G=3fM}7mR*aHg{HuG0er>u)4jDc28_*>w?M9A&iqK*Gw}h zHNH{He$}lE&+D1yQ7RK7E=Tq;A~(X8pw1OEdwV^g`#dgB9(ixa{rbALeoGW8fZrY$Sb3d!Ah`?kP}1oE0^7rWpjZzyxXg`21c$LKXeGgRz*&M< z2b>0Yv%s4q-VN}f2p@{@p$OLoxMb4)Wx%xot_^T)fYSii2DmoByTSjjHXy;%pVwbY S&uyFp=xW;6+;HUu82k@LU?6z_ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_devicefont_images/fH_w5.png b/tests/fixtures/labelary_devicefont_images/fH_w5.png new file mode 100644 index 0000000000000000000000000000000000000000..942a10c589cf8ffa429d982aeba50b63494e4cfa GIT binary patch literal 7277 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 aut(Z^0m~hBQvgquF4zbQoTx;)gRj|Nk*CGOPXg z&dwoWaB#o9!vO;>H^w*v8{=+HZ2_Ca0}N_w96q!#GSAq+bWperSQ~t3Oq?0nH!uAF z7mSbqRv8KseKViNGct#LSl_^?{UaP~Orn8|vG+$wwlxcW@Gyr3)U+i6E15$HKT@Zy z*A$l6(1;*GwG9)`<};tZ*X(^1!{+k=g$7yM!N~K!onK?)m6T+MhU5PiE;tf2xtEbq z?tgoekhiZH8%xEXdZ6hw2^Ohh>1-k&e%Omx7%u>+JTQ}y)#e|t#$&WQa0KW(P{jwU z*bZxM_Bi3pV9l&GVM04Y8C!^gB0u9Bp2Z0w0*r0JX_228m~e6)aj1e%fCMKAGy{IB_ zRtF@_IVwFGEP)QA$ze2?jFt|g*8&@S*rNc`rlc=L*LyCzym|c`i$1Tu`nL zJ5iJfI7OI^&*os;!G0EAY2MPdMaIkGbozr9hhYGcLvvdZ!zD_CPG zv~IJM?_~5T`V{s}HnlJ1+HIqfncgwAoimhd(jCt#JD_C!-&@!oMOlIX4 zM#t*jV%TNNS#~*_&Y0GkuYGVG0TBP&>a0w2Ra?=xL7DB=FiJMH-kHZL_sBY1t+Dm8 z`R)>%TG7epuwUhi@|pFvW>GAc#8OzKa*${sb%*~~SG0Sz3BQbxHvrrZoPK}Ge(!*L~ls5YG%THw*pigD;cL-GuBd8!eXUFbvhz}E-%L1k5PMtHX? z=Flc8SNQPhQzU8%T?5*fG`f+$KZbE>aI3(M)>R`a=A?k zGL}J;26`H5aOUxG)Hl8Z{XAJ6c4f{d<_0EW$U3S-cp#eSakB&39cs0}Uw0qf4Q2a7 z5ze3LDNgv^f7t_IUzl)j&L&x|(*D50^F_$y)(BCxdA3DGfH=JZp>w)o;5v_txxIia z-w{R*Yd;|CP)$cYq=p{{5gKTO)J!C9V;0rvJAMU_A0xt@NwSTh82Kc{b-ggC;)?-s z0~tI1DZ~dWT*p@Hyc=w!%0CfGkPp*>|2aYht!g9xV9cRvECQ}82wSuP*nSUX8uvpg z10^Ur!5liHbwo+fgTV+Qf@FITLbFM>3;R8T;_P^pOmW=v1S%f?Vi@6r*$$Ixhh%s4 zd`&z-vwGfLM%Io|9McC#AH@ZZ)C|2%(EX`A)Dv{jMo*i-s{mF`CRr87jr#x@#L9ai zC8y~OJr4~8eWnl)u=b^eTI5k|vjJBSF@g47P%aPS=(R%X8FC4qy+*23<9K5>lI=$^ zvM2ep(dZZRlkN^&)Sleoa$iCW+W@IHtb{&YM&Ay`$ez=JFoBo<5>G|?n9oU_)#&)l zF^4&@stHm*qE6?My%cvfzk?L#LRtd{;!Pz>Ngy1CUl zpOBl8Nij>!bW9o+xAX&e{bl;2Tj<(^jq7oqe?CNMxV7^LI%k8fgHPLqBewY>ixXEW z1RR4kquVG|SJ0pwyxa?*7j^Pefaq405b$bupQagR!k|p|T>$VR$`dRpWMocQ%zOs> zNaxM}oQ&)Wg%i|mBU^ZI>j`Rdzk);`s<|F(bKG%C)q%nWUC+D$04JZI1+G`nODk^H zt9@@o%^1i2bQA~7?NC-xfK22oNX&e|HFPNdtXgN}Uwnu9{YT~z@{)6t4b(J*DW(FR zVHKBGNf@Fh6`k z$JboFgEanz#RMIBC)6ODhC~x2X0Z=bs&^FSxmRMo-3}+reg$C4F)~cy;{$-)g|6}V z`>|mY@h!#Wj*EdP6flMR)PnKhUk03Ok; zY?#N_;kCF&`jS?RVpO)?EBfTT=F?$$6SuTm6emhzDJ)VsNHmbTgVYtJ(?B{TrQtvt wilkXlnvtcufple(u8PtXS$cBtUr$Uxb1ByzcW-i~_~+{CRqL{Tc!zWT4P!5D_y7O^ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_3.png b/tests/fixtures/labelary_text_default_images/h50_3.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6cc78f15cdf3ea6544f42cac8708b6c5ac2ff8 GIT binary patch literal 7770 zcmeHMZ*UXG72nlKYa`Z?0E17a!772oZjHT?Z0t~KiN?VY2ip)QF|DCzEXgoKu)>(c zo_eA?tNh8-jlei|Ar5Hj)=8%w!o)M+rcOB_C8U)^}sMyeSD|bliC5vz<;4 zeD(ZZ8c>$^9)#wh$})9t=;UwvaE-iaa-3=_<>MFfo37jTi+5tQCh)=$IBTn0wU{1? z`i0B{jO7ikoYUxm({37y&U2v52%U2C4@KdQ_2NSOPW+r`+~18+iH9#qphDzQ}_zdCXOpr5-_Ty!Z)PXu1}`T+M)4y}mh%Cq*Y z_vdW^-0n0=k6vp8p=DHx?1MOSkxGMagdsk`lq^Q1rd6Tz$udMPPX^hc*eCG51(k@@ zP35F#^KxX;ZLM>P(ZkepNe1XmD#=|Cf6QJ*h`g(^gB4cEXGpz#Y6{!s&qslAGZq2| zC29QAHe^lw(+3QNhzy;VW##rtE8_W5fC!nk7z%k={*qGK zY?I|1?(|^+aOc?Y6x&fhwJRMEe}igqnnxTsOF01X5}PMc!tw1*f{+{ms0-Vbw;=w# zi;#9N;MO8*@*+T=+Stj?Vo~iMe<>~GMb_3c01ab|hi?k|K+WwBS1q?3>0E~ak| z$16_OBrq##PEUmCbJBik2O=YC7=2)q?Nb^YrEp#>U_3QIL}?lKtz_|Th_~BnqVMHl zK^P@7AyI-!DcJP3P4*g`>Az>SYRz-W_y8~J#yAa;CC=R~4) zl_E3`&o*kk_;QK+7k9_?z#J##84-lA=a}vwxDHQlWhKA zz$KVA{ds1;+@6>Hzq&m=CT9HQ)q71c`r>yfm$s{g_*#7O!{L2!VRG~4Gh#-2Vc`}H zh!O@wT<#WrSXqX0FW<>|WWe~<_a_~m=m{DiOE3SmD-6vi?&WBZ@vj^*8DDFzZ2%mL zMdI%2`3yc9Harw*P8nm)L6y?(UWjj{DooXFHaT%CSgYI@XlkoDKP$diXi>qQNW0@Cgr-Tg~J5g{I8o}_WH|31=Ee@Ir&=f{~c=KpI> z5n4Eop{M#l=qMKCm@LNu3Nl4cFtQLWth4da_~}tbHs;PeCUg;nrA!GTNk%r6agFKv zDa2(C5xT!NpfX`M#ETrFL^#gP@hh2u3M|;;vOES*H8a52m_CD>W?(Uk#{?4=ar_Mz zS>q6+ZHSaIice$Ab{;qaag|Gy%Dy)6I2Mji%;&7_e`DD(fbstrYrq*W-J4OvipD!9 zDGg>Yj0dSF!ZuOW%u+G?G(dhTd0vOO?@Ef&;vYjCPtD{c?vMW|4q$y%fr_oilWuE~ z%L953&USOg{FKFbk=3f}e?L72;7{)7Fk3&_)eAFjsH(+S*v4S~;~4cQ4@5Ing>*Vc z>GSwq@$P3qQg>D~w>GEJLiYufwdsM-c=yKCn9%4kJTpO`isI#HNu(v^&Wt}0X^y4g zU&kkDU(RD(rt;#4)RH!#^0tV0>Wh29($a}@Bfz9Se|yFy3x1ESq%qSW>5(_Sx%4eJ zt$>y+FIrK$r+a%!%`vU4-*3B-;5WSguPM#E5*qK(ZVeHeprw$IX*I2OjWYI>cYG9g zGTI#wiUt`uJWKeC`P%d>eOeETP6s^=^y;8jMg26;4@tc_(3>K?SJZoC{cfONne?lo jenr;59Q@}O6R>-@=v-d#@k{J4V6gV-s`6vs6FUA4SE99j literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_4.png b/tests/fixtures/labelary_text_default_images/h50_4.png new file mode 100644 index 0000000000000000000000000000000000000000..ddaa86bd87c33c1b2234db8dfce789d44db6044f GIT binary patch literal 7129 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 a3DvxRvTxha-8K4G>7v4tMJEG@pw5B$;G50}gP z<(@B}=X3Wy&vSj%+udeUjtL=TuH0Jw5<<98y^Jt{j^61kgIivEMP2)jef!%Qy=a@K z!Q0|#>*R}zii_wvYHwIyQrzVG=jJ<$u(Lqj`COaV)4pflUcP3}n_jfT(_YBi*Yjoj zck>SFc#5YRHd4CL?%>@o)Kq_+w}4P?Pi1*oO~=W`IhScm)W(~ry+80GHTCKu!`{q( z-J{WFpVbhNw$cyk)%8dEeaF>hy|%2uqR~Nn4YaSr|LdzbGg_#mL`Jca)M8YZDyGSW z9z$|BF+@-{DIGrDo3*^zE7}?^>t3;v_v*foYJ+edwECxxs^>%4PHq%N#7xUWTZ+eQ z#84g>k2_3Tm;rIFX;tlkCiyyIt2l0C`kFMzaK{L#n;c*YFtMqpj@A04lw3tKDvQ)SzL4Cj~3Q)MpWI~AkMi~ zmpy@vXOx8yTV)l5#oOJ^>g!1Nr;<{o=W=85dwr)E{o{%opPI7@;=OL?%+f?Y2*@DE zhfjwX{l!wS{#}ljXYaales4s~*-+Yg9BlN>e{NXRt!N~{fr{(8s zS&MBx#O^xpkc3gN?#LjcuS#2=&BfwB#SptziTLwaS~8z+z7NVq6;-++MlTS%Bu#g> zi^R^2bCCi%Zu=Y(wr#5*GnRT86((JUVc?b%==9~Nhv3o)7a(EKdt^>7KRJ9Df z}6@SN5ChnvT#rp9T1%t zB*_$0fr!$v!U-Y^1B`iRBf=G|v-J?eWu|d32J3yDU}*p>wPRv*g#A}Jk-w(mP)6g9 zv0|1cyaN7_$kGX*Jv_fl#oid08mv!!+W?NW*p&w>vMHmTE8@<1|cHZtg)&G8#72C_tZWaUo0vV>o2mk;8 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_8.png b/tests/fixtures/labelary_text_default_images/h50_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8860499ef8e560f72bf28f350749e6c0500d042b GIT binary patch literal 7952 zcmeHMfp1gC8NcUepH23N-Il?*p!%umS_5f0+YL!+8o!i~5S2nQvNb6!Jd@agi3TgA zl&DdBw%ZUOlmJag7;T_ww@P#@T2>LQh`fiXwk8C^w6U_W;jGPCq>crWc5dSMcF(}H zRoni6=~=R#@4mb5?)$#q@B8kaca^R#o}F=T1^{4o$;!g-0>Ec!UkmF12ge!;*yFzX z6&3Ysx4u|cpk>Ha%iAyz$3$rb(%hfA<1 z71IvbbQX)C>aQV`xGP3L>-)4=bt>lO?*&RWO59KAF>x1X`gv++&D(N4L|qQW{$B!kNs!{_0JPd!WmRT1mjxPz0K8j}L?+v6C-H}Q zv=W2x0v?_6gUCri7FA%ZW7;}=+8Q$Q&)v?f@Bu?6Gm1U_dy7RZZN`ejoN(F=R4c@7 z8-Zan#EC&*^dd#t%~{^IEAhp=Ehz(jVYBAnh>!UfDe-*XmgfWf6Hpwf0?}zf8h?co zCJ~YLal&;EQ15|wq$<4x1H~5QrS;I(GG#T^3gXeP9mdlWZX*4LIjahA!&Dr9;}Bb)`@yNNyL&6s?&>neC9L5&*B?pcv z#8}_WP&Pk9SSkJeTFBXdyGz@N6@9;JjIMhM=8n^wj?6zj>sG?_5DkuBI>2Qn2a?(t zhc>2z=M5MRB&?>B3y_Vt5+5=}V+w<{x+JwPQbx?ekI&T=5YF@~@01nJGon(G?4fe- zcGo}QXw8P$cBB52D!}gy(Qtg{y*z5!@rxS_EU^J9jW6HJ359uoOdv%Wy_yES7L}zmGbKHqFW*R#sJN4#@IuBjeb7}$EkeuLtywbWuL)8U{I+l?ct1P zwRU?uXN=Hjm<6%rHfQp?#u##6pE2_rAl@-S>0=N(r>*cb1Mpuc-6qJTUpa(EhPmOi zUEG7sqlWt!3zzW7;wEYpY%UgLg;65HW^{%}@8Z!oBeuw+ynqI_d5A6H;SpwY9_LY` zPfjp4tzvT+AT}VB?;+ehJnChHo0o=jc=TXpifLZMP(KVHwWI&h(l}{qUK1E)h+o1s z5M^n>j#wPx-{O%*ktPW9nW8fQGWw8ijgrsFiR!r=vzBe(f?bhFn1x$-lWkxdi?S@+ zSi1O(={mv*Ms#O^G9QQ@7v$g%Ib;7jc2v$*Sj3|%0l?L6hLEMJ{y_jw+9k5?aC!|g zN_)8jj1H4=ukE>N!2f|t;zz)+%9`TU6%hB%SdITKz7<7h-&st;6FVvGKI|q1Ga<2s zar!eWLs7OLM5m}^ivf7vk)oj=uob^dr)MoIJ$43gjVHePf;l#s@Y)vm2*`itWi8h< zB^{R6umrk~KfwZky(taWtF?6`(2nPcazc8(Eb|-4KR)}Ybp?u1& z$YC3wQF^TgL`_c$PU)Sr7q2i2vEk6CsEwq0XlbzIHE!1Dj76q9U79^yY*Ak_)P6w) zrsV7mshE1aF%vrDTN8}7>&LcXi3`OJrFqZC7WXk`)IPnwH@bGyM;#Yvnest)gPOVe z*mu_D(_-##mp(N;p8IOYmamgqVoA#Ve(jF433h5RLZ-s-#dB_E*nauZK6W{h9zerc zYzwwoMV=u|9MQ$PTXZ<+G|;nyo)z_KpchH~aG)QG^s}OVM%M2J`jtt)D(Y8c{msEQ d-k2D`Pm4O=Yrp)3S^KNIWX0;j6Hm&Ke*lo*-eUj& literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_B.png b/tests/fixtures/labelary_text_default_images/h50_B.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c789f3e584d1639fff67ecedaac95185849c41 GIT binary patch literal 7403 zcmeHM>r)d~6u);jSs|>NK^_~Cvc4k(yJ5ixT8RoGHKn3-#&no*LrBmTg#uPliZ`fH z3NyvWU_@J~ph6vA#i=;sV?(UA@{n3*s8d?fTCLV8jU77>3#NCWI_-!41D*Y_XEW#A zJ$vu({?6lWDwe0Gj#iCV0RTp)Elpkl0I8F%0IUFe@0BdXx0i}jRu!+z-%x0=0;4(G znrAL7VfmT-OfHtwXD7_zb8LNGr9*gRj5Km_q19ZxHh(>vxptiutTY$vSbYM!a6>K| z$HmQJxmk$`a})LPZ0c*7%TB-L2Vg=*TJploO@}N4Nvb6-Evw@6Rpl9+Y8O#|z#39T zOmeNUX_WP7DOYQf?7>yG8p*7X%`z-99po^Ov%~)@D;C_)%?@Y9A3IVP#Ig2+L2BXg z{mD@pwdX#eSas3&MXCd*|1*Tc?;d5$H9(`IsBCDb{UNPIUlw$p_Alo?gi21+>HA|V zt{z6NiVspdFFhTr{94mxzjMN`#`Z|8z|{s)LN?Rs+1J0C${LmvBq_P?a(O#-^zq}I zM>NA{r%NIn3p0L4JV*1DSw%&Q%XOrp=h6*C|5ST0A~;9Gdivg= zrm)>TJ=JU*fE!Q8Nlqw-*|z&+Q`6zCuT(=KUC)wtYHOeRx=B1fgbc3!hw1rnNcJ`5 z(So-Mk_E3@Enr(N{Qzx=jv$%&7DibQM$_Hxt!&d(Kt*XddqXhEl;((F&#U;6-6J#1 z5E61F0sGz=u}$p#D0!cmsjgz&4A3GF$_6y`+p#h@dEfb)jv^4Bq{agCsFj@id2`@ zFv>`~H36sgTScX!yDiQG${$%ZxFs-*a?fkt_pRQexc4sIVz?0L)-p;)*pyrIenS#g zq}+<4Ce%%OI9Ad>!1^$UPf5>l4H8tAPzFb|j4f=8)jD+|rFCvDhnfOyOiZBO;JQ7I zUWyi*OliBI>exrZ2-xoS?9!h*zdL_^5yRGf05weSg`)mnPpYYa2NnZyZDU{0ds||* zL*gkT&5m?)&B*>s^cITy=J&lYvhmcXxnNstlBNqiS4vQ3a#?&3X@Pj}l5Qf%1TmuL z&l0LwTqOdk_vSE`D#tpT`AiN%^Ju5I2NHdp0G3e!Ep85zIhwhAAmz{wNPn*vh!#d)kE z@L$m*__BnL^l;5}Ki+mH95?^jbwIV!jOTF@W{pk4B$V!LFLXlU9K*THR6tj@2zF{% zL*>ZA^7yvi3e38b*ARS`o&(7B2~@Fn<0O(PI3YEANaa{-^KG5si6@yBp0Bg}_Y>(n zvd`nm=z$mNk%4C0+!IHRh{vz&fW#tAwaXM5s$4J>ORLp4kfQUGMy>Z@z8RtA|DqJ( z>-D=ZrKVN;hoTgiQj$WV6p1Mnar-O|^9?%8l*k}yv1JU4#0*3EemMyI? zl77_Q+S`m^xaT*Mh)8e0ZkP?E6nfDO;mw{5{bVvseDQOd5PGZ97ZU;yo1Y~520t_4|0F?LN_z6CMMC*s7TxMO literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_C.png b/tests/fixtures/labelary_text_default_images/h50_C.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e1266ca7786a8d830037c0cdbee41e8733b06d GIT binary patch literal 7730 zcmeHM|4&m_6u+4B-F+wv?oU|W4^8vV=e={z z{hTlN-1oMpr%mmvAE*Za^qoE}c@6+dNwD zyK>hFwh^`wcsRCXjT&Qfd)rzzbkRG9DR)lJ^|^Lf!I@6ioJb4xXrqb!jNzS$9OFHfPlwiD|$Cko^*;v1gsVeit7BZg& zmwAoaDrp+tm#N?%6?#h)Sfj!!EowTbWuSJ4|3_D>vz!QTT>bRPVsy0i>5=t0#457B z#kbeL+3TX)z@O4xg4y-fdAw0_jNNp-f*clS{iq+z8saY=d);ByKECX9xdC&(bDl3! zR4`jIaVHvcgC!6;Pm-z3fNZ0|;d$fJ)QAld_~I5(Zt2e*YdpSrKQ!W*uVbPX)EIZc zYX=FgekY>)5gd(=S{qz($SLQw+G9WQx*XcnsK{jboruKq+6;N+m4w<+e2f3t9U_Jn z1fVINbj2_|qAD>~EV#QTbH2^t-?!7s#y;+hK}U?0j;1MPP@f-;@?YoDD<2$a1lsZ4 zo=0z)>up~G*dJ~aLMko-Xdywl2y$!l>9ubVtEmr1K|8{&zjsl=I?iC|@KJ_RaiO&# zXAr`rVYB8OFFT&tb>Rmt5V%Z|ghI&u7GZ<$!HV;xBJU~b;6(X(n_ZXf2JD4d#NRrB zG?TsoPa&kS+mNz1tP7OuRN4T>dX#O_J4ytuXhEZB7F0eS@)|^7GBylI*Sy%O5HnTlae0$bcQSt_?}D+#>*g;t3zifhc2Xx z9}&flMZ(&P0G;Cu=?gzVxg5tmr395iW=BKN@tu-ioE-Aq1hWu6+*K4k!6;Y0w4;z4 z1pXj2eg;O-7tR9g2$UMy3Aq{`%ZW4sSv;Lg417x2{X~|pwuuF`l*+3Tj94W&zK-(y zt&FcE5K7}_*e|>kuyKeBRX{F-S4J7lmf2oElY+{nVmLr_zty#=d+HhJzq>axVrkV7 zex={Xb^B0NrsX2aaOBWY?$2EUsMd(#V3rSiWl+e8q5aB2Ceet-4W-s+LPgGl_;2M-FUjgWj5rbhYzhP<5GHB*=XDtqSVH94L1(+374GrcuCb@FE z-|z1Y(kHr8;9N66W~0y=Ny0VffhJ7dD27a%Srb@5S$^+QDFn&2Co`Ew+Qe$YG(7o8 zFnB;<4QB|^1ixwI`QG3bI_F`9Kr7W+0GYEk$q!h=B`gK|AYJEGfEa3{H>gm~D+KgM zxTYDvL>lFCsB=;tCbF6{B4Ae`gnEPj#$MV=o%qYnKcw3C5l3hjWEOQru_lBwI%tZ$ zhxV)_GJ|p%Cc?@h$gChya5^nMV%D@#2A>dza2cQu5|F>7)zQ_R|G3;bVEB-G6SmRh+D-&R6F@u65jH87<)?*}I_t+BYCK*7ndhe_Of)qCSVn^4 za8~m$XWfQz`ygYb2EIbNmOIZn^G327cckZ;XESy{6J8XKLA3|@7I^PG5kl`oN@E+! zrk%m(wlD3l&j_&&N4%l!%`3Ap;aZji@1Ct7 z#d42OVdkh<<0+wS=EdiyZ;jc!_sQ#av#I>ijQmrp^oh4#+_MiHb7Sx0758EnoqTkW zP~$5lS{}57DnF!-YL)8Hrq~*2@RJLEX|&Si6^kQJD3vmVZ%R<$XcbmzQPV*!1GPJ- zT~XZ))J;+y4%DGYofXv?Sv?!5M<(^Cs2-8kHwXWHV*)CN?*BmAoRmsG?Sko3(vp9g HBo_Pwz>RiW literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_D.png b/tests/fixtures/labelary_text_default_images/h50_D.png new file mode 100644 index 0000000000000000000000000000000000000000..10746dc3b202b67681b6fe6ebb11b294361c15a6 GIT binary patch literal 7382 zcmeHM?{8C87(S<$9^mebE)2F?N45qOC#&POmAMhaIvx8VI2jvcGobg5^;VMU>eygp zNKZGnL8!p|F;=LKuo$Nz7D>!72)7gn&{5zEPMNV&mysB;GBusR>ba{U@q_<>xgUCZ z^Sp2G`@GLR=Y7w)-Myx)IFWsb1pp+LmK3f9fH5kcSrh(_j-DH`l*vsNDRD4OEDYMuTaY zp`gibF!Sad1D~^eS>AF}j-mLuN>hDaF8~XkDlIIiZ1!%7=CeiqOasfC+^yw2yGzsO zvCVU97W!Y7^x8gB!XK~q~xw_={5npIiU>7XtHwL1L2s-okv(Vi;HXKg?0zMBXV z9LgrH_TY_-FUJo+t#>0}5)OQt-#E53kjZH|G7^ixQJhHvpO4&j=4RTha6xzCw%8(T z9>a!xbpv;uw1-skZc9QEf8q3`PCJTk5!0W4I63M&(|!E2*uK_sf_u0QOZ3c8bOnt1lYJR+n`-FK0*T{R-9G5jF)em~?oEWZKS#Y&SS0LMCYnRd{2D<=5f?1h@_ z$(gPO#P6Eap_@^?A^d}r|F=1VMx8^+W<@px0c_FpuCW);tf3&$HXpMQ@|8kZ_D8N5 zacD0V9IY_Hv9%VoCF3D-ViCi61%>vUj@KkHQUlsPp>Qh0ZLrDgDNYVAQ6zQnUdtX6 z!wriva_i;r9A>>R2+%f;Heb><;;pWvo?~gqXl;jh=V|H{2Rdj|7KB`TN@)?|oBc#v zVm1?h0;;pV)dlg3Jk1v{fxHvGh=urzk&(3bLcGE(FvfdWh;%8!aa_pL?m9$ai@*$1 z)C04^5@@?Rm6hxZ88=X{4W@-D_Y7PGDffF*8KI6QNu-|ncnDZ1D9UUP<*ri_;`zDe zU_PoN9*8GRf_9MJV_!Vn4bSLOhV$_P@G2#@t_P+yUjXRn**IrM$hb`} zTi@@32?I2fJ8nvFBjWelYvZ)HNGC4?w1lGT5Wj|sbj(a#?DSI)mLr}QWVDxpkXi3| z2Vxw5>Y}$g{g)cRR8ZR2v#FO&MsYx)9TuWe_xC5ya8`1u3nt$S-9HaBtM}q6`Pbo> zutEOmBF`4V1^Da1JNC};#fbN%)>>yex8~N?$-&wtVo2qDG0(Y)|Q|fH>C` z_z0k3d8863_(fqzN-3-U@Zk8}CeEjMaK%ht(KTX)I9BYZ&V_KX5~B!~3s0P&v)}qK zcg0BAB+V|e1QmPh^+7W=cd2Go7IiwP%RsFTYE@Lbf!ZY1&4IcpQum7L9$7sbs7EIC ksHh&1)i($K^~MAMQ`xsI6NgW&QvR?kU0GIm>}jF(Z)Nr6(f|Me literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_E.png b/tests/fixtures/labelary_text_default_images/h50_E.png new file mode 100644 index 0000000000000000000000000000000000000000..6691ea30404ab429978ec2d9fbcb04c706598b51 GIT binary patch literal 6671 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T0m~hBQvgquF4zbQoTxV!@60D0EtR>oJJ`GW0vPpAbT5crxz>rzU zVrnNtza+4RJHXeL2u{;x2_~C?j&o3vII9Enya1=0G01-|O^Guidv*yr%wpt}C{=DS zVHPrY<;IZN2CNk~Gy~;KyagPlFmh&0Q)tj&7P_G0$PfsZ1Dd~p7u~#zXF&d&h|4;3 z>9(1vi@Ah$oNHi^4xMnIl#S)aiYAtI#-MN%1$z3^Q$3*{CmR^z-zhcD=i&GO=7J(9 z%zy{%fh~+UBFNy6JS)hftTQBl?gaX@5#4IEfEbm=nm$H@Wi(ijii^?YFq#}jlS9*J zHW7z_i<%d2%8HUQ^s7(8A5 KT-G@yGywodJg{>B literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_F.png b/tests/fixtures/labelary_text_default_images/h50_F.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb3cbf0e75f1706ac8f5dded5799f25f572ac10 GIT binary patch literal 6628 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+Tn~y*ynULn`JZ|FGwBJE)<+WnkFT6llQJ!L)d0 zsz?u$(!q>0N!G;;9tN`_LGnU9Y12T`ETht+!7`d0Mzg_a=`g%X#e!2h>Ea1Zzj+)A z${5vloM&Kxa2F?tB(NUV+`Pu`2#dO8Lqe&Nn#D;5mesHNu9bhf_c`!~#u; zvpPV<0-SEfr!^#4U79YQG2(J#oR}byCiXW?Wx??VhF@nr9Qqj#*(ZF4PwkpFRmys>O#y-oB=kM7nivvn}Ic!g9^GdP}{vZ4h_~k9uLlP zvg|nAzyjfdJi>n1VDpsu~yVU@5IGP1* ziD`j7ZVb_EDhnif8Mg6wI2cMX=12nlet-`sw=t@T;U9&(O|)viARHFG+2hmJXw(!)WO+S~`rD4#>kn!>v?gVrXjM`!bES+y*!q O!{F)a=d#Wzp$P!5R;Psk literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_G.png b/tests/fixtures/labelary_text_default_images/h50_G.png new file mode 100644 index 0000000000000000000000000000000000000000..f02e5889fefce4a567dc75ecb5ddcdf23971b8d5 GIT binary patch literal 7758 zcmeHMe^3wOFd%u_7D+bSQI0q5lH+|oiKF|xKlf4yb7@z z8Sfzp;7AMpOfVX5h9ugS+MAHhkg?T0k0=5G+G#q@V3Tcrv?lQf24le9-RoP%#{S!X zJNw7YzI*Sp?|r}D&-Z=bzVCN`McJy9+NqxEr$bQ;JNJG`E{t=pd$*KXbB z1#3KY*`jN)SoFeXQI_OfQOeC!pU09&M(!>4~VynIvsq}A4avnV0OVTgmygm0qIvyJq*(V@7{A*uIE%K?4lo&Haaca zw9&VVJGo~T9`S3pG>7Dtwh)G z#DK9xyA~eE94ZF3%3A|xzafMy`5Ch52?r{Z6+HGw+Hrn= zH3r`hTi_7GUcDKoJ*zVz*Gn9hF2FRc@%_LH;9w^y(mQ_$g+MHp%D#zIb!wu}8k?X) zzw9KD&=Ce@2NOvR!E;E}ZciAi2I#5>Tu|`eOJ!cMi~3~HCiy_)YBE=sA(u%~`HM&m ze_qH{`Y`^)Fb!_>9ND<{Z5e}!S4c%@2=KKD7%5-R+tkEYj^rbDO&t!}CNB>Fc4$*# zMS~25p(%R4GnuGsXvaYY{Us5_g;01Wp0w`(QbTtge9W$eZWLN8YXJN`k@OM3Pm_S* zf+i2V>B0?Ru(Qi}iK@o^wYfp-WSBg=raPf+ zgM(*-{G-}sz;Ci+?Vex*{z;Cy!dI4muE*yD|7bb@>_mZILk3m%b05%Nx5emzIYzuXWS_->} zxjrh;QVN^abb7WZ;8TfPiKO#fy9YEj6MKkKpZ1^~rSx8-Jj`B4RomIdB;S-oypRfZ z_7brCoQ94EZTjV@BvCs1Z&ShM^48w*V+`}@Bo)mDxyoIGnES6k1|j)|t^Y**?jN$E z`Kg7rP>-y&i)t>E)f_6$yT~TJW*8Sqt@4b*GLRrW6FvI@2r~HX!&wc!_X2#A*it^&!%cnN~sGdk640vnF$P-g{ z{QGY?nrNJoK$Lj6ZXw)ohp6g%IOPq}44k}Qj8AWVtxsxI+;Cw~9^BP%^jTD)?~Ie+W?n2IsnGeR5YlekBV-sU z?Fq-s^-sB!hOw^+IcdlDWt6VUgXH|4r!L%Bc6dQyqRkTf+nTiJZ*}BM-46QoTdyAq z>=}9Ea@%xNx1h5_##Z<(NH+-X!dd3c!Mrh<7fJI1Z6*%Pe2SSzGV^C(^9RL6T literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_H.png b/tests/fixtures/labelary_text_default_images/h50_H.png new file mode 100644 index 0000000000000000000000000000000000000000..18730b9f1dd84816e9f8c43591e9393ff2a7d78b GIT binary patch literal 6629 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TdX9@h#6bq; z$j*d2a0pY9xRW5kx|o5fEf}0?mL-^M239r> zDiUXP7AJ@ZaJm_v1{&znbn%Q4mmA|m3Z*5|rm3nKd}w79)-h~s)aQvfAS5jD92i5SSHTY=5X0$;!+K?S>-;efdM*DL(>iE%0aoo z*u=nd&Yg)yt? z;u#|@H^zwxCYwRxDiUXP7AJ@ZaJm_v){tOz8FA7Q|N0>nst*q^9D0}*9T=@qM_Ur3 zEvV6kmdKI;Vst08@0RN&o-= literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_J.png b/tests/fixtures/labelary_text_default_images/h50_J.png new file mode 100644 index 0000000000000000000000000000000000000000..81617157c95d4f7f1c19b4d326bb3ad5433d76b8 GIT binary patch literal 6908 zcmeHM-Afcv6rb7AXZe5$ME7U68Ho)odn;SYU9HVFi72&Lr3Op0n=_;v z()lz#!jk-dADyQQ!d|d~5-C51xWhvgLN%kLgu(5-3F@L2> z)vxh6dQ^1`R^wyA>41L&d^;?yTXASaeC8)vf1XN0`C7Jy76ir7v#9aEFRJbBstZP{RNf z19MDBU_t^D5}1&{gv8P!Bo+^yfbkf{V;GP9kH<(N*Ky~r&AF{leby@3yT9P}Zn5hR DbeUzp literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_K.png b/tests/fixtures/labelary_text_default_images/h50_K.png new file mode 100644 index 0000000000000000000000000000000000000000..029b635366b9eed33c9b9086b0cebd15938a5921 GIT binary patch literal 7463 zcmeHM>r+!l6yM8DE+H&7BdD8J?QN@o5^6IXh?1 z@3-gd*}W-VvM9k%{kj?e;FpvbyA%LcM;{eYfRfvrW5{cAe%$i>l$?!u8CI~sY_VpW z^EUIwP-7^bf%TT~S;kD;gZ9D~WMl{(IWNy@&R>_aflpnx-U?F8`8r-7&c|%b;tkjk z!Q+Ui@Yzv@Fg{^nYTLUg8GwmuvX1 zn^svZCgOu>)IN5%t(2M-vRS4@P6xRR;G5&~mJ&x9VZ4_f3ZBvy? zfH^iYGBPs@6!ng1u$}Q*F|yZ@EP9nAXUO0+H{jH95OuBeW>Ii}-c^({2@0+y7qB{> zQKNGe*1NtO?(G&Nkg^7gF_GSERQWRp1M6oa(vM6`V?pWBVyR^{hZ7B% zChs@5XeIu)eH36APB+f)+`?(PKDJ7V&mU?{;*SRy_R-laz?@s=BptEcjoWk&14)R- z5X%)r+8Ov!6N%)s4-}S!G*dWH=-Y~#=l-nf`&)X!@nA9JUHe-^raoFPiXTjF3`R;M z6xd2TO0<%zY!Abpsqz5sY&PuedYnl(ux8L$S$N5Fx&Hv8NFPEtrsYFUliQymfk|t$ zCaGyJjdcOm8C(Ck19|DjCDEs9F$uAIDP!dB1aCx;ou<&DJ2^-Y{6 zvBNBZ^_^N1ziJ0{q7!D>N?Yo*CR1%O<3FdW4R|>gl4a`8<}{jY3ytIr^kqfO?I2ba zrZNhS(j$;>=RG2`Vyi(k6=4eJ4+(p813g9pZ#)}#GWrOkNc|aM>BUnDy@_(N>}BR; z@`F#K#|CGaILDEZcTBTcgJx)G8wup7SZqG&7^u_cjtV>ZMb=$XJ9BL2^1dBR5ET=M zpiyTFD62Ff1m!xYuoFSYa?Vd|=3blRS5KU5po>*&zgd|UdS8%ys8A9?0r{fRinyi{ zl3NJdzX)PczFq+178B}6@%j?H+t;o3VbQ(lMsZAe_W>-rhmCNp_)19u1(H!yJFX>> zOsq%kF~^UUjHixV_VkrOGhVs!hmD?Zt~N{i8Ugp$1B1(}CW3QL`GQu%CPVmI-&flT6Q0^FaYaXM}uN>fym$%lxZM?~MV z$>?I;!5p5|aEQhkfD4Vj^Fmn#SxrYer|KnBor0S7(ezWJ=8CvWr3`#hnI(bGPC%iy zXAT?HUS|bG@Ac43GjVVv!A+7mmI@-wos|lYCW_ugLP3ga7(s0zk+8$j+F1 SOUKfGK$GGY#U7t4IQ|9kcJ?g* literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_L.png b/tests/fixtures/labelary_text_default_images/h50_L.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed847d5b65ccc88dbcf41c25460506c42de43d4 GIT binary patch literal 6545 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TDEkOk^`D zC}Wh6NpoNZbK5|LKI37{&1?KvnrHH4B$O&ioJnzDUM+kuLG7@H1nZH8hf_c`!~#u; zvpS0tL6cGDV9aLmqez_71}F*Ug2Jz$A#nychqMhxQ;=l1RYtZ-*PSVfMjzGGVB(j zN71^?I>$_~B}Ar}_zPkajPnPgSMV$C9K=LfVzO>TesE-IWYJFN;`6pOF(&>4=6>j> z&GWopKF{-c?)`E-)!MQ@-*k@&A(Y?T^*d zSQl>-Y&&>iM_ujCI{2~wv9=3;9Izs^+1u=FX!DPCr1zK_W0kx~u!aJU3#OC0iHNr- zq`NQHEt?G!N|P|^BL4Lud4#z2np;bYRu0-@psf!7uT{}EZ|U0PP(`NllNp5TZHju? zP?!o)rt0lz=nX9S`YHXx9ZDdcrzXqhDmg=;FlLMY>@60h)Khm z8TKI66!glMZ=RtFmH_SraKlD*SZbF?#^YQ{AutF)nljMT9loR#zzBIOB5Z9+KE9Ob zy3-`(pz^*y5s!d(<^@TUKcTEC6SiKpXIPiC<1s(WNPX zdH~WpEQRIbpaDqhm>G%6nmD<5H^VReewx~~(18LUe8~Aw)EkcjBttNW9nsbM>3%6^ zB8g&x9kLrb27cRYjt+G)y#KRdip?1yxej{HHtl>~K(PU4l^-1)QDQ z(yy7LH0xz}(2}-S!cZBFT4Nwv=oEJNu5V^Evi*s+oy-8R+TN6_fgcjr%DzdGxjO16 zWtECvwBQGD+F_!fJv&PhQ^$Q8sR+GA6&RPjDm&{Zbr1P|XxjIxn52HZiqq%?JE7Mt zrT*L_ln+x#ViyvhY)hC9ja`qS zp##xM3UY`&F%(KnLTeW{Gt7h}4DL)i$s{@1U_R^w=%gvhcw#vTt!XD6*@0q%r0t%A zJ97IUwD*HXr}x==-@Rv__u0MC{_^!@Gc5O6001-AtSqccJv4DflA-IUFQ?UTf3(h@XX>J>rPnGoJiFC@M1zewtka^)L2m=y9sW05vDej| z*uD4G%_<>3cIof$zr$QgM&Q|@y~$U-d>c4Phna*n{33alP`Yv1t}B;VU2M%e9}#4e zF7_4Pp0MBh==GbkYJj2i^Q)^otSz*W!bqim_iy_8C^+5C=7#^eeFrv+kKFNOKR*@J zMrB2w_OF=ROD)-fWOLZRs5K_{^so7p02T`e%f-r@r!#y8*3)A+pI|c?OvB{e=(U^3GAaA=fFx z=A$hZlv9_;2(QBBs`oF)dw}V_$$XIKt8mKlg>#HC`=)A2ds$R{85*8gnc|W5Y-G$& zSq)ENTlv^151czp#8{m1ZSg=&H7OkWB}WW<4_7|rrts@S%yys$2%oVcWho-k$_Xo6h!rJiH&2JP=N5V$-J9Js_({M~ z@i7nvSyAU}5I3cYqdyU(SjuYr6IMFEvs<(~Z~c3EUaZ)XcFS{4S^bX5wmu+SVZV*# zBIBd{Q33>!64o5rf^G2xa}d*Ny5D=1&fa-1O8iA=epaGE1Ijt?cG2ieL5NI) zHMz`FE>P-hFODW7IrAMz>5ovI$U;!eDS`hMJMLi49F+R~l!QgN@ zNVt^l!CeDm9S~RKDRdviDG5Xaf~5E;%;gn(RW+Ut@{jE-nzv%g+Mg$5`y-i}CbI-W>}C>2ftNJR?Yd7~2mG>zy>1tF6p=?uDnIov(({ z7m&u^;_bSQ6~z$eV_@7WeDowyJFk0edo;o1v1sgF3nELBnvvyc>Kkf>xWt~w2|TFi>nX|UE9wbC)y53R_!dhL6+N0fYikw{vF$FNOwUjJKH_-FiL z^p?kbLz3y4-@VzE)#v0FLzB-J9zI<8WrI@*eZg$;NDG|#X(}W9&{o{u`A@C69m;aw z5q1+3Iq_}4ablYazN%-%@?%J_1@362bEK25{>58_CFVpa7QK*rW<_EZ-UWQ z?$h2#>bPjQ3W%vBcxAxF&EepGHKMy;gF`wz-Jf(?bhV^ySGpW@Ip}gI)!RUC1HBFO wHqeif>F=_-E9$POyQ1!jx-0%4xuOAl@acmKGIyLL+8@(vR;@32`*9`oFB@LCZ2$lO literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_P.png b/tests/fixtures/labelary_text_default_images/h50_P.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd0aa6a613d1b14442cdcfb96ba15f416be7fbf GIT binary patch literal 7074 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_T.png b/tests/fixtures/labelary_text_default_images/h50_T.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad74fc0cd6c0c428bff7f1b21128c4636df29ee GIT binary patch literal 6558 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+1jAnz;(qVX&iXTquXp1MX>Pv*_ z9pH*HSQFDAx+g(`buojqgxyS4dqM3T2Pe$$5WSOd!v6?Yo&m73XyE0Uf5wQ*jjJdp6czC_^+ z1KaNZibog;}*mZO?dUO)>Yy?fbc)I$ztaD0e0sx~hxsU(= literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_U.png b/tests/fixtures/labelary_text_default_images/h50_U.png new file mode 100644 index 0000000000000000000000000000000000000000..e27028d66ad451c52d8f349afdae8b207b99d3de GIT binary patch literal 7030 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 aRJul6{>{jeQ}AyzTC(u=>Vpf+=Dz{jS*ptb literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_X.png b/tests/fixtures/labelary_text_default_images/h50_X.png new file mode 100644 index 0000000000000000000000000000000000000000..2f920b325ec7fa03971e743302d7c5c12be63b90 GIT binary patch literal 7917 zcmeHM|5Fs_8GrZocsY&@TmdycV(2<*a-0-)cc70iG z$yK9fdvC^@UTft>ltj=>(R((BMABUF9)s|1}@_B2w@BF!?bosODT|^vI6FKjM6T%`yWqin%Dn zo5U@c8-JMya2lm^_4Z-15gW>)W=0vXi|&65mQ$6Y_&Xwxx7uj76vnx5n9_ZrBnF*l z8Qv3DyOnY+_TeW}Fc*%b;-6+pV)U|LsT-6LUO;4i1|Ohd=nEr_~QnH#c^URDzS zE(<1q1qvP}{K1bAE=pB`Vj9i1#S#NH%<(UU&HCf4)OCXZCN+GXuRUsm*`sE|JJ}-j z<$l8ZPrO1gFA`c_4ZEqIH0!_ajI>AlMC7vp3@Agl;sSIX$wg^AN@4!Y=l`O6kX5k2N(6 zw=jGUwAHt|cV#o$KFjZL+A=h23qHizU|M6)|y9^wvA`m&)+s2U{1 zkfw|t9}50$EyEv-n3KjJbpKj_xx!d0dY9ox`R=l)PVp#s{s`+5&mX3e zN;y&f^9I<%)_NqQsM=ST--hd4_naPO)Z7?px|! zdji+m%azU5B6TU5T#;%q%lC!N8Aabd0Qe-__3qDV&(nSjxK}8B2eA4mm092M5z-Ywq=rQOV?|y>Eyi4pj|K82^AYFUu19G0O{+shfBh9H z>;fh})t2cJCqEVRHNd%aAMm8_u9}KPT%UcodLicC{|wUaLGs{uuZd>2{sRKuO#I>U zW{O$48xrH<4AkL;@)O=kE`8q)Yt^+gKDQ(^kz>rk^i$L^m%*@`6kW^8@;@O6R zeJUxtg4f#0-*Sjl|83$L4I#Ysj1rVAKX(H zIgicny!jriGD}GetoaJmW!kLYyBx5(E|}^<(BUWvjL&YMBA%m)-;b~%4lY*%{)2V?+mi{!oSJ-~5D}s#e7aLq>(F&y=;T9n3D1x!;q8f z8m^4k!F@<`Yp`f^(9%Ft2Tc{V(?B~Uwc}^Z?w!Z^hW`Ml^X+N? literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_Y.png b/tests/fixtures/labelary_text_default_images/h50_Y.png new file mode 100644 index 0000000000000000000000000000000000000000..d84294c828a9a667f995e969e909ea592868b588 GIT binary patch literal 7347 zcmeHMZ%hAzheEh;M3#t_r!S)%7{-i@BkHKJpVV-9=)+RAgCj!NI%-r6J?Ia?jMc(d12y`gH8SiIp)FIeNLwu-h~ z(YClE1+NysWjB7SD$<2_&ER40 z0gl~Jey%|>KB%MEw=)%S$KT(`_X8(T18?koWH!9>fepEPFwQiIZFgK*BiR)o9Q{YD zUCL@h*Y}hzN`ok<1T1~00M$Q=u~h~vi$9jq7+vcyE=3g2k1kfSSHR{ zX5D#W@E{grU4T7~RSVh38egJ{XgrC7F?}Y()hFZQsmHvuYuLXQkK12Y(5Zt}g*3SJT)_Y))z@>1^~W_q3t1^W(>_FH!3zJy7c?^Qa^ zSn)4{Ed4~fw+i{_;iG^he)vbgE+9TQ)(Pm=V|cOb%4K2SAkq9hYmC(hVBg6r> zdC540aSaQ*Q?g&2LQAg>7G?OI09;I}b1M5mo0lM*Bo~#ZDL~y5}*nyNYKdk1(*pONOWP|#` zBuh8TX0pcn!zvOvg0JP~`~?gbzgG#uVZ2-3vW>{Dod#?wp88}%1zaB~^(79;fZn)> z7o`X0lxYxw1LGMkI#S5$c~QPaAjrXmibbX)ulY`PA>G=MLTaC|OMV}B$1<3Vl0g*> zt8~KKjF0ku5f8g&`MroqT*Ir-Y-VCN9#zfCh6DDq+gRuC!%ghh4%vMzP~35l8u#be z!c6DC>3L9gfHK4vB@0up@GIq^+pY<{K16^2>e$?Dq|DdS2~wtGn>>-VSQ1U+Zoz!_ zY1M}vbWY?tTi#`o(ex&Y>8f`i>g7pHUi~xc0MooMGB$)jIBqWqu!jL_TOEl9ToKA( zp?}P@ZE_bJ04_%GLx~#UC0RlGIMEhXbHIQkj1j{1%u>f$;>3c`#U4BPpWV{je*!W)$z<)wqR~=~j%&LVZFi>aN=aJOHtX6Ug?2cjg@Hzj vG*YBh1C11Eq(~!0+Rcr2WA$$?@&LFp^U`6Za{g8IHgfrrqJpC@Nuj?0JG3R+ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_Z.png b/tests/fixtures/labelary_text_default_images/h50_Z.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1689f528c7b90185f9ef5c52a13708e9f4e714 GIT binary patch literal 7158 zcmeHMZ%i9y7=N$VUa`IvHke+!#a>VbakyRofQ2wyT%iyv>!dL-O}qjvptyB}5lF~- z?PA$7u-jNVIu}Rm2g!`42`2hM<5iY{1C(x=S>n_(SGUY*iZ0`iUC;M!@uOe-Xzs)1 z^4#;@`+J|?^W6JB&vQqeO?I_Ps{#P18yjpd1AvzcR~~u*#?phe==Nk^T}xl{{)4^k z9^i1dd3xNvgOqW*aXbAit#7L^8#}zeFAhCGBew}7clCPQeck)_QLgT{JfPX#S5E0G zsM>>_lz}!>Qgmf?MOC%2in71t%B|$r0kHYCMq90G;B5P7{&^_Q!e#s|!M9;S{H8_QG7GR5bFqLZ@@VdBSmCr!{^cDF zXWelU+mt=u3Ggo(2v_FA_b_;`Sc48I?lCf#Z>Nu9vP#~LkC7Dfr{DBY)G1;>Nk*dS zV`iLeLE6_ZXgF@&qFpWi1`yxzcJ#I)1cT(ayntOw zhN5Y`5+`k0J07kgIqHT*J20OB#0C*t9ddgc+W;Q<9)WMf$@ukLm^evtZ2Gpt4Z)~@?azQa)rUPkbn=OJ@EC&1S*tDXo$(5azyomy^Wv0GR8E@~Wu=5sj#KA-H5 zrcJo~)B`*Ifrgs6Ytfn)0Ok>~mE&YcGsyrv*Grh3Xi3>L?3xH-aCJ^(Rf$;L5g*26 zdyzkO!h*#=bn3fqmW}WzE>a2yoPN}0U;_gfuAS@v__7Sm@--lCD4?i^{P3n01U80N zd=(bZYsk5x7!K}Xb+jIqWcuO#HN$pq-9(tHS>#^0R)_jcm)ZOT14urJ~Um-C<@Hvfvq98{E!JPpviVnyinO3=2_!kgFiW4cxbA zXVI{WQzAAD?e-3SbrBH1%$!Kf@cg+rim=k;*Fn56H zVODs4MiUSG!1KCJj_4PoYa7!>DiGNPih85)9omA)c>{Xs1Y?>K2zZ)YC>PX^kU2!U zkl;B4-;BuK=cEiz%50^KUMh5?0#7PzrFviLb4dLisqH1T`=mCf)cuvZ-cq+8mB><3 hBqc@vAt?f&ohK{-#SC;N_3DfySMj&&H&TD zp!0s%**TxjId{)H=iGD8efz7twX0?tzHI;i%*s;ar7%;hNGv9nZIzvB%T zc*RkkCS<%QWbG;zETUzJApT&fC@!^FgjGLT|HYz`4Rrl*Zg$rC-HqFy*bF(r6u}^7 zR8{7ShQn-2y(_VbeJ=P~ktwD{UM;?7SNVjhqFR;KX|xs=tsJy%pmm4;ude9sN%QpX z-1OmBOJH1hXzY~hW~nvAK84y-_!wU9CvLdz;;>1Q&fgpLtO?I=Xkv7?_g*F)>`CX> zR$1QMJ49M=VsoYAxV^$)QRM!1avz@-AmV>KR?R$vR28|u*8ZD|RzV*5BRLaFSq9lN zfzfL28AMeCpQF~ke}Pr-Jt8Tg;}&RHO{xt~foFWJD0_c)Ne}h@wn#OaBC(StddM*e zd{O=Pe$D7kMG0AclF@A(TgBxgL3~We>_H^>|7kNEE(G592?^8`1Me)dDwra%?P;wA zqO9B_gbZ0_>7K`lgMe+K;;ml5o*?;h4Ak$VOL}ZjUmi8bw163621*V47~N&7D7vZf zPR==1Oq?Pfqz7w_B6g>}OT9Sa^*ZK2{c5WKb2;OUPDSy*!{~lz%9H0qeTfs}8&?4P zIZ^|_93<_Azh=nt-!G75yb`+WaprXZ_UD1<0}Ol(BwzY2)Sror1bhrCo$w5`_LRNL zpy#*VDF#dnjq7~KuW9R|Pm)9OgSnhoxBD1PYE`tlGG9gq?M1^ED7V~zuz$q1u#Xze zjp4+Ch#zY%P3gy^DbfZc@!9i2^f3^FA)BqyZQ5TZNozCeArqZ1(a$ z;xcQtC~{okBR(WmFluq7(Bcx|O%s-G4|y2`}w9kp+LTNL0|+X#6zLsq(o6y9`zF}+4c zNPw2;#%Qef`g5pL8of@)23i$^ga!$Vjh2@=s9QW@k+Zr9If4ZDfX(O>C8^~F$X^;G z=1&3J5%o#amBy`=kHr$@Yz)GE8?N{M1+a@gGOeY>lK^4+|3Zyzn-sup*%cX}5h!cu zPlWmubw&gnB8O(ybph@OeaZ`k0CwC&g7Vm`KSkZTO|i4QqC8vz_3lWl_kDzo!xUS{ ziSD+mfZePHT$UY2?fZC1{&$d4flj)KlcByK63d!7BiWp@x)o%gmBG6 zGaBHHp#i$2hx&ZQBl@>Xax3wMz7KilSS(z|=`u$>bPU$h(oGLpAs-gyptFeMMN1*Z zPkI3NLxjcpdWNg2;^k=yJnaE2AB~?KKEa^nWQCLj(Yeuh-7S+MJhJJW8H(};B1|FG zZIXzZdIp;s7~O%(B-Z!QpOFy{J+SHBbffhR5gguF$FKv@NGvSnjK-0u8GUK6O7cGf zYRi>^VprM~np#?_r>v4vPcWuVM#x;e6zUp>l1n;(+O*MP`2aN&V@2@4dx0%XdEa7=N#H0&ZYd@yU~~ zCl$(U?aL$>V&_5L|7zo&z31(R8ACyOMD34;gZV|n=8xrB1(DHsHVYMauLTG;P5^2o zbm(-?pmcyqt$S?NB_9@XOl#B^gx}=O;V&iW4~mq+5+$pSY?P?zJ; z*`7gCgYjw_sC&frMrZuRU%XS2IW}rb3h!94zvjg2&i4LW zeRCLb?urCUv!&tFZWAvey*v3Ao2kX`v% zkA>1lG+GObRu0-W(7J=x6}8hqJ0!K?KpTp*Sy7vjwY!0KWzw#S+7(%Qb1?ml2>>e> Wcl0F3J>u0r*>hK}%|5>zSN<2H$vDdZ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_at.png b/tests/fixtures/labelary_text_default_images/h50_at.png new file mode 100644 index 0000000000000000000000000000000000000000..a4509c2c4f6334766cf536892264d5c0787f57c3 GIT binary patch literal 8323 zcmeHNeNYo;8h>{;SwmQlR8!qpm93xj47y2FJh+JSwvZwsOsUz# z6Qv?St$;nKSbDuF;|c2BncjG?A(Wg4e$bmLRw_ZO<)#$lIcgvw@4azuoc`09&fR}^ z`6Joc=Xu{J&&TiiJ?}e{^0c+d84`eF_ev7cV|wB8ErlEM zcNb(E!5TxB@eM;k38R~@o6p9wnyf`jbUCKsYo%jo<-E|!Wd%k<;g0+~CVj`7MzFz9 zsAe>an8e+=jF#0dX4trRmW|i3O!6<&bI%S{0TBIst&0oVRbkyVK{`_Aj}T`7p&-7e7^6sEmKVS zryKJJs{78}C5XM|orWE?e>q#(y8rcpuF5FN=luQt-x{8D#*a?QyA+$Sl&!G6K+wUc zWN%Z(5lq$MXddxLPcGir{8xe6(sv^;W{)0X81qY-VC~1`twk2o;;rfOmk|c*AjHLzsON-KL!z4uk2)`=F zB!BqeoQ`G95av695-v|UXf^`O=xR}jhQK-`O)>Cgq6S8fO{BA(LOL5*xO#1U2fbAyBI^RL*z5F1W zpkuVaneg1zBAp;MLw&KT3Ot3dgyPc1qNPJ7V9kUUua?1(eVN@^gMFnUJLXVNd z`yl)VmF_Vr-4Hg><;73Zf>3jOU@(_t(wfW$0nZ~DU#EaC)c|b4JXgYCshLXN&9|G?obJyms~OQ6W(F0UO;i;CDD8wlhr=G@ZgD20E>~i z%L3lY0&Fhf+DJ0|?f%wVH5lGY3!XSa?rR5 z5VpiM3YNhv1z>QB*tiYiAsSWH!$$Otf@nBz2?vpLXOqf>^TSvb5QcniRR1dMqZgV?S~Gg=d_U%i3p+GDnVtJm%U1#Ik6vQB&cQC z(p*#mY6}WU5is(+?}{LCs9Nw%C`nzS=&i>h%(@DjA*yVrX}|z%dytz~QGVkH*B+Ab zm_&Io%Gxx7aP11EHMBt%+CQCSirr{`9VXkWLq7uWybw&B<}URbO2MGs+I(9Z_!UY} zTZVQU5AfxrQtSZOdWtjOi*@zyMz#HRwo8gIki%g=u;n@MHtB$M5JESC?flnjFzVtR z)Whu-Wy|}RED1tAqNakLKU2KtMTGRps5ic#IA#>Ww-8Sqx^4tS^AgnM-e*M6r|nvc ziU}dK(*%{mib8uEjN#`JiWVeGuE5AyG|vt6BkRX7Suc{!>;%LFif!;dK+N?FbQ3AY zi@?5@jPdsW4G_D6jkX^nvfBot%3e2>I05cPb~iiQ0lxMmyr&VcowqCtL*0&;05;q9 zW0Jb1uqzu7*Z&kEK|(ea$ukid%9gwntU(QX`c0VZlmS=l`9Mt$uzdhIbADDvQCF)4 zE!3}54oBDl+Z9o_hGUL!#V}=ZxL$SQ^Ei=6Dui3jJxZ% zEb%!W>3>qy0q{~?D?G5zo&fKH?<1Ewh%T&)FV+dOIS?bM_JM9l+kF6hn;!|ixW4bKUG}2}*$EKN~ zTe_IlG!VnkA(C^*LJ`ff3L5p!kN{U@kRMu~e-1?I|2OAGy@hYw^1k+;&aUC)l4O+vXriLR@hl72=4iij1u zt{7UHWb5hH%2!}V_=V>~>RDlRI4xl~gxes@4q;XdPlND~3?B}{hobOVF?>c2-wnc7 mrtnoUd_`9N@3#RC60g4T`SI&t#E1S}uyXm@q%*(ZZT|xB^|xgJ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_bang.png b/tests/fixtures/labelary_text_default_images/h50_bang.png new file mode 100644 index 0000000000000000000000000000000000000000..e62113e7791d173687339112b2314ec50383f4ea GIT binary patch literal 6885 zcmeHMO=uHA6rSBpmTkJVsR_F2L6;~c(pV-NtDy=_Z2E^bR#RyU9(LO%TBtU}R9g_b zO+#!k_=6x#sT#~tP@z!pAZDA3)++TPJql9rAQGWy1noMzX^)W|3Z{9F7@6FHm z&Fpk%ptZtOZ2|yPw72=s06;mlk3j|C?%J3S!Jb%iPb@e*673IxlTu%3NQ#c}?mBlJ zJP2KV^&a;?`0L8G->7D-RUmb=?A&Cg#l_7s%9x;bExJ{y%6Uz5d92C4j2bs`8Yq>@&Hm1N)iutTwC$G@v z6}6K1!txn)TpJr<$wP9H<@rTmECHbdG_??Eu_v^viZ+`inJfX&fkVW060+_akg`re zS%#EBhrEL`4#cIIUO$)dCJ2L{<4d41poM+BY+nYbuTEYEa|yDd^>$hEY`97SL>28Y z>%i!+nIJgNxV;k$#UPM%(8J=A>E;As@^fC)38_OV+gr^0mjRMVHP0Lq0r_2p1({%0 z)h30ac~M17PCS>VB@T^)H;3g-K%pZ`i}_rxFzz7&G)=!yBe~bPT;|7K+GFFm^^IF7 z(RE@U7x2zZO!#Jq9SKyNu!$v88&^~*EII8g%i7rpznIIRgi|F`%RqUuJ6vX}th^eM zCo_dYq?_g#-Q4Qes>N(YJs44SvoRSA|E#6x1=d{Xrr9A|?&DLITNO%)38dH5ARK)M z2=!rHxlF^NYGog|x15?jnT@|+7Eru*#6$Y>+t0mqY7LjQxZj{z^rIvpGetfE7Hw9u zvSXX;6U!hh|F9~?n+V^6@Z}I+it%Fr(iZrQ1dAdpitskTq6mv3%m!E#{imV`fNu-z Usn$=^GWr_@+M5IZC&$J3A3Dw(E&u=k literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_colon.png b/tests/fixtures/labelary_text_default_images/h50_colon.png new file mode 100644 index 0000000000000000000000000000000000000000..986b3a9ee8a88e89f9564851db2b79a71d9ca84e GIT binary patch literal 6560 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+1jAnz;(qXhz#915gtUi;J&cxKm z6OaI=1R&Jn1d$1xZJ}wFt zs{<4l;B+%Sts%kc(sc2R5tkd|#Ds{{Y1QW)ABZuF+^Obc+Ag8+;9jx7j-v)Z$(aog z{{z)7ZqPVz1jq-~ZM3Po));l~;^D|Jc4&l94PXl7Y&D6nnNKxY3>*#yb0jo0EEhNc zb{NRjz&bPo!#8N2mH5{Wsfv9-fzrdY=)h=QJlX~sZF`M2Nk^OFqg{~Ep4n)RbhIZv zIzTZxFf%$JH9Af=IzBl%E;~A0JvvNJ-VhH1Lsa9wv-K59n?X}Ap00i_>zopr002|I AB>(^b literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_comma.png b/tests/fixtures/labelary_text_default_images/h50_comma.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e0ae96c04edcf8bafa817e6cd1904b9a0950f1 GIT binary patch literal 6694 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TFn7)c?DKZQFk4 z(~QQ(&)4fMD$X1@@bk4jk4;*_gFj#Ef%WjG0|lpb{_^nj{TEy?zwzKldzmlB1{VM1 zfmO55fg=WM4t(`vYZGC!*m3XVfeD8gn6Fz)N(6x&Ds1pa-t9r*N(ScUyYv4CeAp4v z(0K6O`Ff6u7_9>b623qGuOY#j(v&zgGR@e)V8)(5{LGsrB_w>}{7lk9H$Qdsm~q%F*8R=pe)B;L7Nr(&$** p=osVZ*y`w*^5~fI2p&^rV7MP-bADHdXEkU7$kWx&Wt~$(699I^3pfA( literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_dollar.png b/tests/fixtures/labelary_text_default_images/h50_dollar.png new file mode 100644 index 0000000000000000000000000000000000000000..6c17ab7e56695c702ae8113bfa44ffab38919b6b GIT binary patch literal 7900 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcB.png b/tests/fixtures/labelary_text_default_images/h50_lcB.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0c3de218eeb0e2d729a7deab1f89c90884e23f GIT binary patch literal 7346 zcmeHMZ%h+s9Dd)s<0$oj#-O`yFwU)tb5*WA1%?|QiV7JT6*e^vxdLrrB31;VOyMn! zfUX&AZW9E<4AHq|nw-5WW+=r&u z_j#`U{ds=R`?lS-WbwjC?c-ViKx9^C#xej%qw>(;1+e4$P3idQ$%^?aDst9UmKRz< zwxz&YYAN5u2{VKl{B+(_Fe^nUvR&)jd>1pHRhaY2t(J;rFv20dGdhW*d!l60Z1>UKgmN&WUmh#$0qO;W+ z<0hW+7Tfe;ohXyvwNk;yyKV0(Fr~t3SyVZwW1zaj|H~B}-NscDkvxTF4qBn6v_J-- zm-UM21K%^AnT9$sj--n-DQ7Cp^fhaUN~Tka(ZTwhkQDYwGd*|*5e;mQQCW{zAe@=X zhGo=!={IW^z&9U+>#eq1N8dM2+xx>Lk{06`k*hI6%crWBuYo3>5~j6pG2T7=yIA!%|R0k1W@-J+$0Xp|5Ut01ryNyp zu?@^QX7{a)qxp+nh#G3Te#x<_0Wwu44vu{LT2lW73vlHr^_0SWyeGGf=Nk_R$Qwx; zmaIJ?b7y-2oy<0iha*T==4_Jfmy{4@v-Pc$8=4=JO^C^J69U? zve*u(VmMKHv;X9Bzpmo zKbCvG&0+;)6~=rBe1x%HK-982^bTY$;<%%g-d*$#o>5fOr+M(0f!Bkq1JyDq@|-a( zCVGZ#z;zin?KA?%^>QGY)bM6bUPtpoJ%DhJl`+w?xp0)`Mc^_UqB(dDClaE?-lySC zHQ{&bK_DK}o+dR8fs?~A?KB|z@6&GMzz^s})COVN7CUf$HF{6SF1>AS*o8aP1S1Z8ZIOn~`2k%$7AWue{6h2_OOMNdD4l^n{&0=MeLIZS zNgFI8ao~ol@LVE~wLUIXcIXQZkZyfndZ3o)ZDP1H=#^Vw95oWJC|oLF%fwa~)zYSK zMrJaWPZl_6rBkG`P^!uVOy0L0($$Cc&0_WhlKK5rfpfM@quHzH?=iOSsf>yyHG}?c zy9httu#pv!{pB=LTfE!n1H|*5UqdnpV@IOr4c5$kYkB{7%Y!EQPDIw~^*i$Ko&whs z44b+Z)!eAXhths&Md%b-3|m+{SlC^hf8#EXFdr3us3)ssQOokrcW_lLs#;XFJnEdQ zPKi1t>XfKc^6+oLsynFept^(V4yrr+i=Pfv)BNvDlK_QbF{#z5i3#|xMUXXramFWe HrMf==&ZfP1 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcC.png b/tests/fixtures/labelary_text_default_images/h50_lcC.png new file mode 100644 index 0000000000000000000000000000000000000000..26199e7a162eb0ef02de6ff0a2e61b7cce5b1745 GIT binary patch literal 7422 zcmeGhZBP_t_}zP9-MM)k&m!CN>(*@YW+dCY4J4&*F%_K5Aozie<=(*^+NcnrfvNj) zmxMxy)u5!76Eph9k{M@A(}6uM1O(Kk8g*jeNJwf-Pt5>Xa`Rd)*})3%3Y48#jAFw!0)za3l$7TMGoI z=u8&Gpi;%961^~b7xb^3Cgv23Wta0ep{jK72NSN!*B(Btg9?`?gjzy8fO;t&Ei zJNMpbk5G3HqpG2nU4EOk!e~(E-%PC2i25PzO@A~zb_=AV8}j$ z(q#I+un_lZ+uFist2_z z7gX`gB*I3IFAKk>zV!$b&+Q`9Ot+C;j*O|6q5_%m_mO@6EE%ANuHvfw3|hVOx>Zv; zRN+i(J7AAB-9k#^fXmY3$pihdY3287bESOk7G7mM?%DH=%zfP&|Bc zcs}GJ5-8^(x5Eeg`;eer25}xFMCuvtB_{?hXsL8yt)N2Z0V+s{9iqGcq6!%WAaI9D zaMcT#RwCD40&E`zPj&*+UQ#X`VNesHY=A4q#s;|}5v2XJQB?92Wuy(5W+ORs>r8Zw z=lQ4ugDKFGbA*M-I-dyC`D~Cd?p1S+b_3IPl2x7zxuKZcrP_C57m#4G)`h2v63sy5 zRDN6i?mf&b#iOwYc|G-*i_Ud9smpw&HFhQvYhyV<*ECh%ymCrt(W!Aa@V}p~g>4Z1 z*JFqpVI)Z3Y_{T~KhHo-4oxd$g`v~&fkGrk4l&%fn}gw5lVsFZC#b#x47W?dj07QE z2)S_u`1_Eeb!nP*5tv*&4ljm$Oj>NC{?kI$^aVvqkZ*K|V#JBH1*|aA1=vjpq4RXV zJyid6zey%ch`8YnYTZ#?<#Vhu9(GwqL=5ihI$uidbcfp84VYh>Dg0hOV0uY|l3)QL z`>6yc4o*<)E7WcmRKcDP0%H_BK#4vgawhfMVG2G+y<}!AJU~U3Z!HxhiI6*P5C{{w z@gRfVj*`9*V1uMwaX|jZank%DgZz);;a>G_2Hl!}mc~PiDwJMm0qkGD_6?fvMM+R3H@g4E)Wev17*mh`IrRV_v1;HfNw4XkV@j}U#hT?`FH`(~1KST*eE3%rFv`xhd1@(5d|B+?EW@T&y#OEVzko%c>T-_jF*gn7AeTYq>v~ z=HBP&`#$gUexC31wynv{P9Mun;Q#<*Gc!_O0)UQDUo05_dv9z_A#c-MY5A_alFgge zIzX1az_G!;X{%_RZ=H{xL*|0Gcx$2amx~oc#4}p;e14O|?pj|`EUsApssrTNT`{6L zPE6UnPP8D)LJ=)Yh+CWxYZ235T+uLN+)V%?rOecn73EE912%4{caF#*bDd{7;&xIk z`yCN=)C_Nt(-_u*Gthxms(nJ8vr#qcG_#f#4F|0ZGpYxf)>EYfB4@az|s-6z|h3eHqL1&tPU(kuGQT;;1xxI6Wo)aCp+j8+8$Hr19$fpmSb(*D40|+8I+-$ld!F;I@pd)jx{g~!_n~l`(A-=RO-~4n43e<% zWE3QFYqp#S#g110M%>Y^sH=t4hB3rB)_ z&(FMJ@UG1eX$RE}A*t;kq>@8=PZTfL-!ZYDSS6)DMD{J~v-nQtiUZIq8L{-bQ^F^C z+1~|p#aDQ?^c~2rHe%(ichzim$bzF$&&$ncfi5e7X9qFlKNc{~+yUVCEoz_}_GgC2Xss#8`BZ8Xag+ZG1-*8w=4 z(FJ^f3G$+N1`!a}pgK$Uc*Y~J?=26iKq)JotwL0pGfy7T%nW@hsvgAmpNY;wR>ff-t8ySL+4 zi{$MOiOq!DW5d@v_*?=VTSR#Nuqu859Z@k%?uW1pHCbMm^{^P`84*EG%)NkNa>ztx zOOy+QWO467IPQqCUV1i>j?A!%?yNEwm`_i&^CuXw!f5~i literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcE.png b/tests/fixtures/labelary_text_default_images/h50_lcE.png new file mode 100644 index 0000000000000000000000000000000000000000..74acb10008b764d58359bd8b08a2d806399b56c5 GIT binary patch literal 7448 zcmeHM|4$T06ra7l8xCAxOG&fWD7RWGHk>$jCrZ_N3*~D>Jd`w=m~;>B4o%S`1VJt3 zb~%f-&|nKOprmL>S{qYCVw%!M!yeZ**uzR&lUl3gnucnVN-tmq@nAX&Hm2>rus>`z z``*0wWvh^BUgGCDmEe*8YLE9DoUkz^A!npPO$zO-QJ6-Ru z6ezs5G~B*qtMBIAJCq?dn7zi4X}P>_dP57TB~iKshvH+WKfD4AxmjcLq2S=*Q;d@@ zpStH*`h?uxTqY$m=SL=ktyKKoEwN;S`4V?Rnh0TM^f8H)Fe(l8*uoAUOckS#99(S5 zD^PF{2ZE1Dcr|Aj2-bXUnc_y3W-Ow1D$z2N3>QE9#MB5ZVM1{wUO-d+xJ-z44FlL= zQUqm8Zl#!KY*Nq-5gToYRDi&n%z^-ek0lO#3E<~Gj0Zm+20F{wJRMvE(dZkGFy5aJ zS@Gcmv+;mck|%z`*q33GK=@Ov%IZU_FIqexa23m9Ce8K4lJ#3nia6!xyTSmbV>-A4 zq8l-@@i$`l%AyFFAKW7Xs-O_^{bUxK7@ zsS@?yko1sc=aY4Rnv^q-9PCOYNl`z0=o)~xvCI<{M{z)T9iqGQDv+hh7pPiEhirt{ zN`i=t)Aw?M6rl9koDzA7W*aM1hRP32FCd|=rqK)JACmaUR{)Ngq==n1UaAMw28d?9 zA@U|6@(FDmuu8!O)%7(x;(C~E7o{F7L`Ed4cAl2)G#q~T&kTBke)vbkLDxrnU8Ei9 z5f4?V{l__DOPSZ@R+2bVKV6`zDx!#SWS6A-4J(mM8M{n^FuN(GO9A>3hUe#&#g~Yj zp%0{sGmdJ>OdE@EVO*2SF)y335;07a9H&)qqc%zL!8#=jbc3c*YAtPyd5Nf$joNIj zEctQ+`PEh8C;=pw;iDatzNuTvanP*MDk<9`JLA#8xkW(K(AZlA0=-y{B+}gVxwz(f z0>wkK@nn#EryQyGfDSDPyNeiEN?S%_Ky( zEP&YT>fC*wxCGE_H6cC^`O!)cpc$c`sOjV+p`BuqNK|+sa#k#0z!h}oZ#zoqZ}wWz zt=}%^CArCXpmh`caV^(DJY|jaXU;q62C+7Q=O;f0>z5+Zp)+7Hi(466@yFrEcI# zyT|<&I>Cu!W?hBJDb3!&EE|?|*By9qz$@M3RYp4H#AmbSgr*k6Q{CtB*~nv(p9I8a zahK;L_TPEIDp0QtoyRrNhWAtG)c#eMW|QNdkkwqHLm3xi7*Ch@j+`qjdN6bcmnmcR z%fFvZTmIvcUR+4|uigLP*pZ{|wT<(t>XG~)@AT3aIf z7l{dta?C~-l0kOG81NW#vojk#NN`}20h_?xmIzMBW(hx1#8T&puo--K@^I(T1!pE7 zVqlwRW3ydiN@bA5fdiALX}oyG2x!g31e47mTU21SxEY@YNjD7w>4t}(fM498 zao~snq*XE6Y8Y)yjW!}j8_%PCiqXE*XdiO4?>yRf9_>4i_MJ!j&cmzkJUUc5Iz&7= hG(I|GK*yO921|y6XG>zuuYl%^JYD@<);T3K0RXP(72E&- literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcG.png b/tests/fixtures/labelary_text_default_images/h50_lcG.png new file mode 100644 index 0000000000000000000000000000000000000000..355afca58134ce7b92361abb60c389bdfbe757c4 GIT binary patch literal 7601 zcmeHM{c{vW8t&en^lp}h9WVv6itY&UOksrHT@nyHb^;*@7UmM6FesJGhTRQl2q`XT zC<8m2oB6s@QeA`nCHI7_Wq3T(~;bE3FvX%<{&t|zEJ=znlE zKTJ(cf4u#^Z$Ho5Pw(z5D$Ji~ztIi=n7FJU_dWnnrt#QV19o-=3E7xxbf))On zOwpYs=4`GIJ=Bve((DCUcP*HkE#}|5(*KVGY_*%GEz8YWS=+ug;j`!UWr%j_ZmKV) z_8pe4{lT;*%Z$EtA!kaLQb1c*8~sz7LVJyF&g?eRV#2|sfmt2Qs`$s#V90Z->zSuV z56&dfSn*%(srh&^ULHSi`)zN1W$VunQaISJk8lsH79{njk?_nazB=hhIh096`RDk% zljqsyYuoErO~riA*2MW8H*wST=K5j^D7+xL-EQjd z6p3}qIv_W6eK2(sSM}jmXg~MXJ8LD&*g~cgj zz|RwjSE)S@Zlg_}Q+Hsx+Yc;TaeDj-NCJW)JquHN%K>s?@l1sgvd?h$W+cSDAd<#R zoCG*YB=NYyopUSDhxh_R0VpogHT3=Ckd!zTWfx4X^8>UBi?MRaQYNTM3$z^-m>y6a zjm4oW%>O1LsV5X}8&%*;#P_(xh>OVT0N^T#kx6TR#*w67g&K{4urX1*#jxKDt%;Kg zO0G5XSZnyt!0}qj@3lpfXTl9=lKP&4#?^^*Hw)qM7D%>vL0=h8R|f%p*Qvzjpeb?? zG@K_=e4ml)q$~udR$*HEPr$jHyTLpp^j3iSW>TQEL2`~w&TnK|Cf?wGdUdX##;4SB1slL4|wHsmk*ZUm5&0 zze_tHxmZ>qAEi&i)B|i_@)9A_o_C9IGp5mSM`YyK-0`JRquy`b;Zfkm0I(u1s#{Sp zrm-hUOjf`Tx-7ELdiTKTg#QH#^8Dc55?mu|E>iA1!_Y%_1SRW5J)i9bj0%m80a-zh zl;ZT=eZcy4FDVck;H2R#;{i-)ToHO@Fr-*6UMMF8>Z~?skM7&WoO-bmXUL_qPZ%gF zrR|;x{qNP~F+88WA<+go!70k+i)J!NUrtS)29_qmQ}?q5s>e7j1Yn*KNi|@R*w?&} z`s3-6D_`hgKjy2iI?(+OE#B%~r6u&TDCF9;ezm2w=zLR)Pt&Kdncde})}MJqRb79= zyzN@^B#pWiX*66D-@X%ai+>@0_t2&hYHQaVY%A2xfBS?r^NFQfM|~SGJ&%X zx-pt?S$^_%Mt17A%Hy8~ch?yErE4TZ96cY-h*wB3N7t4_e8_IQI(B_PNpSC+XNXNL zNnG-gy6*xKIB~2@_s4eKjx2Plc9rRJSV&*;oYM7&-+q%hwdjkl!hxPo+IB(mAMeXr zKK`v)H_)v3_pa7-{jo1cKlpP+sdf^Czny;e%`b;e=|b$=j;@7c?OU!GD<|dQpdsbg zr9=%v3Msjfe+_xqVteGdM_2`r(uLERjJtelp4XsdZoS!Urp1JVNdvPwm{rj{4a`H* x6bGg#GPRmC1A;e4;%l*E?Zid`|@JB{(tkVHLd^v literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcH.png b/tests/fixtures/labelary_text_default_images/h50_lcH.png new file mode 100644 index 0000000000000000000000000000000000000000..37777e4b8a373c038e8263b930f8979a9ef1f1d3 GIT binary patch literal 6830 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+1jAnz;(qVX&iUp^1s>K@)c(L(p zC}-qYlX8Fo%xwb|`V5CPH-AxYae6)aj1iX`<3x1nw$!wrn|3KEZTzgp%=QC=br`632jk)Y z51IE!Iyn5fFOtY6kZ|h9PkAQ%{CZ&B6_fBIRqUY#o5Y9T-{pBg>Mgn$+5Y_d%g&t7 zCLqw4)WEpE{=fS{jRTBr@oA21-2a;!&6%wtet;BTIC$tk(ESe>e0UB^`Xn7-R5N_Q zFj)dv2Le?mr#<{ql9bHQ{8?Ud0^{=K!qUtVbN-)b;IXisdqd*DgFo(|@Y>LvI3rSI zectWrj%G%df3|53OkLsI-`XBI$iVbp&RBu*=<3_wa z(ixa)fwJct7<}IGI4n5N!1f<%XndOBgCqtfMK&IV14kKHoOmQ08oC)dTEL#+26{a) zm4Q)=jpx8A1|}UIiH50+ED>-yP%Y<%9%%&PlqS*%qb-!trq^hTbhITt+5;Kwn2mNw zM?2!9;}fIfGNa>BqvLR+<8Y(naHHdJqvLSHYaDI>r(GBs>RnsySHAmG44R1YboFyt I=akR{0NKJWGynhq literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcJ.png b/tests/fixtures/labelary_text_default_images/h50_lcJ.png new file mode 100644 index 0000000000000000000000000000000000000000..56948450e55cee63630e46954bf965e16b5aa343 GIT binary patch literal 6736 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T5>zrSOEB3C ztVtYHB+lvpH3@LK8K2gWV0CGFI3@B>UUMTSGe^r^HfCWq0gm0gY-$j_694)km5&dI z-@~-%K*1>;?#crXESNcTo-j5)=26%%ft{z%7-X`Ygx}1k-@^@loMvF!zrX2VJe$Ce zzoI<ac1Vj{g+ou9%$%pY))HYfSVn^dse%|y4x`CoG&u~TcFSlj2yXa}mTRNs+Gx2pTCQR57LS$=qou=W i=`dP45LG%bFl>+!Hf2A~B@CSSVeoYIb6Mw<&;$UVRqH(f literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcK.png b/tests/fixtures/labelary_text_default_images/h50_lcK.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee6692de234248eccfdcbb76093f8d4456edf72 GIT binary patch literal 7195 zcmeHMZA@EL7(VyYyY`UPr9#W5yCY7)6}a5;9UPa9F~|^c)Cq3Ew$S2~4TfM?GT3d0 zbpur9bgq*LhDbuP8J0#vaE1#tKh35;&Hd5S^nKr+ z`<&-I?{nIFPvqzA4AF#Z001F5*_pcmpiKD1p#V5FbvOgPJygA;u)3h4rmDmNa&2}; zxvlCjZ;mm?2+=~EJt5g#>YTZHWD!+v!Ij&q9JcEH6$g3C{sRtBV5>IqaS41zO&Ko= zVj?djrY5AM#;5Q*pRjy4myW)+-j$P?VX18`nNQbb^+)m=A+Fi|l%P3Ic6c57W-_Ax zd8d)-kh6ueML55%*?AhLX*I3VqRK&S1Jxb=U#?g=V%icWD+gIicNM|?4{iALvmU?XHN!nG+T3XsT@>AGh)$2k$1!#F9c*dkosfa)02>XR-VY{YDc#Vx*e-kepu`shWHS6u5x8=r{Rl&C|7_6o#hy4> z+L%O%Js&p`^zS{!mi~{PhWypRQ31g#7ShbS7Smb2a*abGepxce%I3ESW_+mxkniMU z5@wItyhSk=9Duwz3?nD5Kg;sgb3vJ04dFEdzvvrZDg*9_5LTbR)JAZP@rHb9@hHnj zUbiB!GBCXEom$9Z`Iatpom)xE7%5G1-${ZieZh!NTG~_M?E2#hpzFSdk?k|-l4A$*H=ba$v#Ff`@S3lbXGWC)ypg|tRNK(_1>uzifip1mdW?b zveNY~Dp(0%#%#iZsHGR$`ekNySPAblYyAVaVWF}*U}k84qVLjksCIS0wHd+&a}%Vv z+%ky~AupUG9vBj2r5e-Cxou~PE^KnBtU zOc{WEL6SZM`Pl=TD9!N_;HuCX^Q8?GcVzDnhD!)0bJN=*#RaVrv1bGUM%)!fA!^_< zVi^gU(vo9SY6M>Hca}0HMuO*GmZ4^Az65<6LraQ+yJnV46EQPZ|!w7^;|CFR8@=AoL0Y96Y2sOEug4czM;KGih;&NNBj{yg+TUerW4dWHvbcI0J#xXtSR E3+XC;2mk;8 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcL.png b/tests/fixtures/labelary_text_default_images/h50_lcL.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8912a9d3f9327adb2120e6d03b0a455e71667a GIT binary patch literal 6501 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+T1 zRFNJgrGpu1lB|mxJPc+1jAnz;(qVX&iUp^1qQx2xsIeK` z*u=nMX4r6W8mq#F&O~5cz;ys9$=j(AaGZe+nKIyVV`NRRNCj048C-70r!^#4U79YQ zF#?KDOfcCDtWX?OB+lwAP7o2`9BI-CqZR9Di(#}OHQIn2Z8(qiCr0~Gqy5LxZuRJJ z!ssx{=}=<62hE>&y85}Sb4q9e01`Q) A(f|Me literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcM.png b/tests/fixtures/labelary_text_default_images/h50_lcM.png new file mode 100644 index 0000000000000000000000000000000000000000..0f96f33d79ba8d877adbdd2239f75b1055c27d38 GIT binary patch literal 7036 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcR.png b/tests/fixtures/labelary_text_default_images/h50_lcR.png new file mode 100644 index 0000000000000000000000000000000000000000..17885a19586f228a74293acb4a3ff8a64c073050 GIT binary patch literal 6745 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+Ti8QlB&3`T? z`+x0u$r8XiD#c)q5x2;hTL&As(%vRGFm5h00M=y=RuXkHpGNC4YyAj2-N3Z(su4(# z4JerUHk&PE!#7iAu87~W5`h*O9r$os=f1>+1LkZYA9_I|MIaG{0~%WA&ouBzxIUdJ zIe}sE3L9gDS1ODh8ovDb{{P^C*^Ep}p6~z9&vcJRK*9F^-~YgR(u389=P;kgJWqiH z2ewJ+LM##!8lKE#VQd4-9X8l3;$^U)$%&IqBtYY!0hb%&%LIuuF@83a2S88QNPucw zW}f|L4y`!Xz$I~2GJs*R70Bw8hKJK5cifZ+U^JIz=6a9@_CAlnA0uvYW~m2B4y-Xe zixWg9Ft^30C8jtq_wcM}me6`ej1kat6BA4} zg92Yg;;arxp3}|vG)TH>RC+X6Mw7#6HW)1(MoY!f+F-Pj9BmwoHi|~uilc4h(Z0cG omua-CINC)X9XY@;V#2^+xN&vS(X%-rz!@M0Pgg&ebxsLQ0O`c(E&u=k literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcS.png b/tests/fixtures/labelary_text_default_images/h50_lcS.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c0d70aa57db19a81d68c8e971c9761af3a595f GIT binary patch literal 7514 zcmeHM>rWI{6u+}Gds(-mj6%{`tL&6ExJ?m<-SSWycUI*U5f&w_N>g`NcG092LNS66 zcX-5trP4^E(ilOAsZCmAOB0Q?G6)rUSomNoO{?I8phe2Mym5DL@1Sj(nD#H250jZW z=Va#IbAIQZdw-|OnwGRsyHpDRSeTN$aSH%sqREyvaf<>6B@L9-L0J`FtOh;CZWI#oZBw}MQjIT1 z5YdW=?4*S30{v{S2vB_g3GB<8!OY$9pst(C|72VY1y>*08r=noWJ<3|82_$%) z32<>E?0mJcI}&Dcv-c4~&8)TbK@EQBbqMOC=0HtZhQQ!2IIaSCGV0v#wC%iX7D3yj zNB6pJ0Jt`QQ0~8#23AeAdO9QPbvi+q_z9u?4|GDqJ^aOLn&S=(Bed2_bJiya@5AegGv3ETuiS+vdS*J~n7qVN!*3#`;IXJ%4eptKJ) z*+LmAm2Ok}oS=Mw7HnNW)vIFzMzJ*)a=a6i4%4(-Ck@7t%n73?eRK%dXieGO+U>9F zBwOGm2;pML6n0BoCxGKSd7iK2MJWry6v&@IWu>K-3WB<0#FbxQc%MF2s3qu|d+~&a zqcv}1FSJCE?AhBsJhfd+Ar`wgL*DxREJF1ioX3aeJ;8THZl)Q@#=LKTAy#+&o z3nD}F(tS_$+C_g0*M|LSk^nk{te)$q2sjhx)8k!@hQEw~+Ty=VTcwK==1|}0uv1iBJA?n6YhFc$ z@=^Y0$dU1k($}*M;{7f>_9a(=dfB^p?6nLu3|{og(<`&}JC9)yykQcAJ~!2WrUwuf zwAgmsNK%wv{u{@xs~ZYrGyQYerMX{XWKB&Xe@|Z+v6J#nKpuB_j z(VXWfK{c|{V00S}U4?`}yoBcRhL)2|Nj4xO-~z~8^d2EJ>+l#t$|+LwUQq|2^mv3- za>lL~@1pZWBh4{$LkPvKp>27C$ejThjo*vVE6X7t??EjFQd4mdW8~9CB)e=L^snL! z+@vAdWEeDV5{Zsm2yI{`!5Dv{o}lBe1dtx**U{EiA9l@?Nf}lZ5(Y#u+b2B6E}7;V zO8fDB%r21M%%{BOP=;%EtXou7grOkSP8iBf%$S)OV*@zd@!Vjmt0?E1NL8fyf=c(h z=w#txyPGL|E|R0dvuPM7HA^kfVEg3YlwNi4rp71`Srg5O@iZlVMrivR>*wRA;lGk$ zu=Bz%?Q;hbLsu40>WM3Rzpk2`tTybJ`opX$xxFJ~WJH(o-Q%Cp{2sb3vRTflwNg9( zYUx;S>}uMd6SX4oTsV6b?z@kQ5H-MGi@6I4F%4rT?V#-Tt@V Z2td{-c&j@R22oS6Us literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcT.png b/tests/fixtures/labelary_text_default_images/h50_lcT.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d20d225954adf0414942b48fd266c861bc71ec GIT binary patch literal 6769 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcW.png b/tests/fixtures/labelary_text_default_images/h50_lcW.png new file mode 100644 index 0000000000000000000000000000000000000000..12033469201faa451fafbb82ac3bc9e8849dde38 GIT binary patch literal 8176 zcmeHMVQ>@272dl&oi5H%A5_zx(txhePMyJ+l@xGD3@t90 zV5TK^Co^_vHKx=Kwuv&haq9jkP26}oWy%kqsyH#&VA9YbNgXUF)J=vK>}0S-ENlBj z{xma?8UEi7&CTw6+Wp?Q-+Q-DI$E`({OM0YbPq{}EsUwf^f+IXo8C zS8S`_y!XJqnlRcB42Aau_Z?FFCH@k!jCez(W&Ya8jZ43n1J9*-&&T(LgY{4D{i(9$ z$)AML=3srX;w@Fm4@4Co@vTtE%2kA{B3`9(ATQG92ZbPFl2obdWVi%vv<~p3>~`P?!*MVO^HN=|kiFuz($}cOOH#Iw zZFj5I?SN1nMUAbr5*FDYrW_qU!X(u=W>h$3@V zRIHv6?L1;{j`>ltf|trh5If^mjg6;*uJ|5nQa@wNiCW!6Kx*?E$wsP@=NN87j*g8W zKAOYjZY;0P6mpvZ!!=6p=6WnP|4SWm(}N@uLgv{!h{TItlmtX1tlh_~>{#+J$$D0( ztqk{W4x1d7FK3-Gjh8xRDAhOe((c(pZh@#(ec};fZdJQVDJ^xYUH=V8>xfZ)L05zb zG7kYqf-_ar_nOyGKL(dwUe&mwE2I{gLohs6gG>m8_J<7g3RSg1#J0oG^9Ewi!BZbV z%uZ@rzh<}+>d8a$ieJ-SN9;kjESLCH>)X6?W(0AgJ48{8h)P|%X^t<(T%rcWW<}Nd z=0?l6wn!z*~D;nP-gd;xYPq8fl@ zdqlNs&G>}0xymV%Y_CJO(_G9T$*#88>ZOuBF`!xV# z3xP4uXB0fME2?ReAr#yH*@kh38;0B|N!`2-?Ck`xw3y?MVWGoo7;Y?#hBJp>FwNwz z7~!Iqi~@?~8e&)S%5GYS{|3@OXIa**e^Xk(D|L{j)08N8bIx}Tljn;U ziB%8*lorV5^N9O7O&Lz?+6Ic#=V7TA!oEsLI*A-#0jFIl#GQuNW@wS@NG{H7p zVBX_XnGc#NsTx9#P8jQh$PxGCQtC47s?EW~*RhK{bEjE>EuWXWv}s+DY7BIX*7Y7` z3L@0WdU>IW7CJv??ABb_Xh_~;`xG3r5iFXrQOlMlqIqbJ;@fmMD>r z0_>pAV6Kl)wQ2-0t+^$iH|K+)&D$dngb;3|N^d8_w$MsL;R(qUvd_DfbVlcd|2KLZ z-RZ!WQ@v1Xw0ud0hZV96^hHCEI)hU*=$Ix(@*35YA;dP(=vRg&FMYexAxW_LhEPCWmZQEbk T(Nhh7%%k-co7TMiT`l%ML}okd literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcX.png b/tests/fixtures/labelary_text_default_images/h50_lcX.png new file mode 100644 index 0000000000000000000000000000000000000000..a63a1aa62af8c42243de795b93fd6efd6077896f GIT binary patch literal 7442 zcmeGhTTB#J^xnP8>~y`z#--`3Ze-LbTWj&|ZdIybnN<{Mw#EnXkyJaou%L-ngKL8Z zWp-Bq4Ha7-RjV?JH752!qaST*WN@i5ij@ydOxjvZky?^kW3evC?(H4=(WD7}^m{%g zGw0lUbIzQ{J+D1W78hq)$6EmanWZH~%K$(#^oM5%aNxlM?R-t&xu7~6jI7`Eo>;biV;C$CMrMfaS)zYy zmFOX!*&>-Umyo%{D;B?9c6N8~BLJK=rA7X-n&aikLhGUqmuMyKrr1(qZ8WtW4QDr* zCU>l>bY!$DCFIy@eSKV0+mO^h!%H1$Ks?;UhV z@>rDEz}Tn|M$RM)Yo#ejcxUL^O<;nwgKfikJ9;ZYRH1VBHNbuBtM)3AMpZ1Q^sh$#H34KFTI{+?xNtA1rl{1TvhnLT!fD({xJI$GIBQ&E_FN6^AI( zR1ug~AI$Jfb!f^rC*eyKZ+R5Br2vh)cCZ4VzU}pTY5_29cx7EVi1$#J`T@i-+N#Xv z2%pv&a4UO)HPN52ym??A^4z@%xZ-xN82<;67@<&46IQ3J#O~3O9)Pk3(#0l=psLUQ zrQh#R)jua7(`~Qh|8)*$K3Ap0zTbpf%g>;o|1DB z-?rDINI#4y*~A24?srJq9Hy-8KCdJdAU=7Pt>3ER_;XbN{#?e{9u9WtE-{I@L{iy^ z<+k4^PC@(|)Dj;J&~4PlY}BWogy!BKUtS|f>L2XPZLgvn|Mv74#1HJK0PH7h`?su& z1VQw2^T?0uQqR2G3Am?}ei;JsAu6@)fw-U2cfZq-QQ3}!+myEN)secP0OH0Ix;0=5 zlwu4+SS0rg5L$o`Po}zwxzVj?yPjc;Gnotyc4{{9Dlpmad6|tUIm|}#t0JXcy2H~UgQG0 zOqxumH6!~qvVNo5F^WK=_%(`tqZeZIfQ;Uk(GoOTp+*bX=!_c^0b>$k42X=u*#8>{ Z0$`t?S`|wDm8%asOBXIK`eMEu`x}_%8Ib@0 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcY.png b/tests/fixtures/labelary_text_default_images/h50_lcY.png new file mode 100644 index 0000000000000000000000000000000000000000..22e2acdea04826e6887add82ce1f6ecb2c7b7d69 GIT binary patch literal 7721 zcmeHM`)?Fg7`=C9Iy))1u#^U8v34gmU?Zi@Zh2Hq*{Kv40yZKt=M+Be%zD$bYF>*tGf0?mZ`a| zTz8khU=R0j-`ap9r<*QP53VxH^Y;Wg&0@hSwq&vFV0{MG>R_#k|GFEHL-CEfZG@8* zqs1ota6L(@5HAcTsdnk1B305Uda%geS}*5xqsR1dPc5zBrA295v!{?K>dn*t@y1Hz zoNax{v!(A4J^7nQs%=Ego7e(}k@zKK?>&#itC`(y+V?F}f^TDTKJCmx)X8PW5lqTl z)bNY;#8>q(XtsnX!7eO}|0<6{^L$>a4In(fvIVxeB-g_Fb872Q^I}#NZNb7N#!e3) zu_M#0;^DsmU7NF4q@RSFgbb-ajSvJJYJd&*d7R<$k^}((Z2Q` zV9n*FrnE^AgOWS41OvL>JAj0xUqk;Uw8Ml(xML3VpOw;t){KU8YPMN2G)_B+5(TVK zm8e`~lf*|Hnr8Bh5G~4_q{dAtV6hwr)tG6eT}E)Q^z?R_(!2MWmni$joMh)1=r?wU zwac1v)gz~__+UbAFsF-Z=NXto3XinSMoq3|)b4Ctgna7>HPHlK`_*N94Q9Qu%&98u%V z4lI?GgL%2tVu^aW0Y!!Ym>QkFY=aRN45Nvp;*tY?T^CFy7lvahj~@lX&UUJ#)&c)Kl)EouYkF1LAJ7 zVC*Os@0BZ$yzTL<9HOrj8OVw%4R!%0NJd znGoiuuww8US(<7`Cy1)v%+4B~(jVit5>+3f=|hHJBD2v49y*@r)aggYP6#MSv_D({Qlz*ZA5&{Cb0pGD;~aLe(iP)oE}Sd zVsbdsO-~X%@vAfElppc$GqaQjn>?Tg5N{I;j5rb}k`mg5Nug}YA(9W`w{CoUdxxk7 z0~!r|fBb4W4VUv=>i*WsqtIhkG!eKxtsKF*13Q_QZWBxF_tQ@NgCnYq-Z7oqikFi9 z$pas&I)1s7tkeo8^aG~>>g!rn;g(})FA+;=akJ@@V@51qnjVBor``P2iyy^JX_x78 zU}|%ogB&pQ1tLE~9p2Yx#$To*Oy$}quK(`T*xAtR*tr_g+2UWBv!ccwtTT@u&32?}SE`+5i9m literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lcZ.png b/tests/fixtures/labelary_text_default_images/h50_lcZ.png new file mode 100644 index 0000000000000000000000000000000000000000..db798be31575f28f7ca373970c4b4502d2e33e92 GIT binary patch literal 6992 zcmeHM|8Emz7=N$VUb=GAW;A*?B0XJ$1iJaQbz_2|t#(}(zHLxV35j0Ybz^RBWQ=5x z#k;mTFqzrdBBD_?tr{Sxm>FY&;(JtO8)HDs%zn_=EvSeF7m_K)x!3m&;}1svgZGDf z-{hX>ect;#@AG+{C+|I9zqPj5R%!zP6xT&U+W}zR`eP+8z|eR5gJfFSRTJyl(Xp>H znF5>RiBwy>bHC)P@KwNa=t)#o`x={WT<-akXs*>YAMH%VyIMNhrD)63DX=5n<(52^ zQgC0hZU2HF?W#3u~(-8}#&L8ldfvDfe>9 z(Pz3(+ubBua%u#=vQw9r^fevP#bzp|ZlU2oX+X0B&5Hk94fx^7x$!Jl1-oyKq>Fj} z*u%SJHosc1gwnG^JI^XLtRmbV|DKEzL{@oiVdjN@N>86}*$S4ElgQl0=VXW7(z~tc z#L+t~;ysPFePcbxsotAeDH zHTArc0?Zd1dyOi{q`)k`vfG-`Aw5D z$R5HGnPY{J0nb6;^`IXP5O~*QHG64+z`LTUVE88jFPGKfZ3hG%ds09n*ZrobM-5IZ zu6nY|V+On;0&m6qo5PIRwMHxy>in!V67@=G=o!vFaJ*3mxGL#0C29ySr2DDeCJ#v`RfYN}{fYN~89Q^l<2>?^S49IVvh(Y~VSzXQ6(7TVw GnZE#l)J=l` literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lparen.png b/tests/fixtures/labelary_text_default_images/h50_lparen.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5748b19059b750425be04ee591d06ab331aab8 GIT binary patch literal 7511 zcmeHM|4$QV7=Pd1ah&y?y=lekbZ`@gEL6R=I+$VWF+h}|0mWIO8P`I~TpSRBMiZ55 zodwhgM#jXiWVo3{MHUk!nU1Rz#{`YjEODEgWz#T?QykMl_;P!%Ap0N8{m{I9`n>P+ zdG7N*&+|U-wK{u6#!LEF^Z@YMKQ#UU?7z1q1rO2X>5lSMB^%2M+#t*8 za&K^!ZQ*S5ZS(ngyv4OB$yVrjbbadxo|&M|Of7Re%h#6_bGhq3c7s*Uax-UH#HDO3 z;;g*&O^#1o%=3%!myG4Pv8S(m3c#$3%hFPEHyml0AaW=b=tJYRv|!~2?m4TpeE5+3)xXaVyH`&<$v$l z(SVib`?d`lBECfkZOtF8@#P2dqZ0B@7>nwUt?v&NKCwbS9v>6vAdF@wfRicOaS7<6!kk57&SFasK{9E(QYrm{IQhwt zoxSY=aPOUQ(};|J>=;$ljhu9V z^&46{0hNiE(tQxsv2tiO!HzFwS2Wy%1Y5-mGC}c-6YPjYB6o?$EH{Wr?)nTQ%2xrb zVP)wMM9~%rCbp~2`g-c}j;aztCKmvrnBq5I2Gs3wUsrhsy8*Qh?|1`5tr*Zou%%@GWE12>iVtBoOH_ynz++hY9zeTEmi9xm-73Mk6Mznr99lq-EmkRzPw}D~>}Z<+ z>~Vn|cMv0Y0IChI-Hq4U!sKAUot0R!2*5zF!!AHXQ~W^3bHJ!Ku+$0QN+kASc8+6b zVoq*Ve z*%_l$>QQ*zCB$VvjnRK%5*i=aN!lg}KZbLL#5qGdcnR-Be2WOYk%$okKxbgpgqem; zcK?neZ4KKf?}TJCwmzAl*E!XY&f-s5chAI<(g9#G&Wn*51lwwn&1Yl^g9QR|VlyMcCP k(yofy75PPca{$1XA012Xzj*g=^&it^=_}Hj-xYoT0V}=pDF6Tf literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_lt.png b/tests/fixtures/labelary_text_default_images/h50_lt.png new file mode 100644 index 0000000000000000000000000000000000000000..c47da2b02cffa7d6e00c076e0b043856ff211d03 GIT binary patch literal 7356 zcmeI1|5Fo36u|c`U&NaLB2h2O$Z08{B0UlTQR)San6x4VX$6bp1xTo^0>c+4%vf`T zf?%V95hUUOGr`stN0~`GDms`n+K!SGb*i=1j`4 z_p|T4-F>^)_};cH!PsI901&KFDzX9K#RZ-qSO84Vs?*?WY31hJ%I&39<%JrsRb8Oj zt1ho5Wbv|iay6MykhoS>q#e6`U>0hw3TSRB*QhJ^l$H=Vd-iF-c6DVOk&sBFRTUFb zQkq1N$?HgRoh*^ql96*EtI!QV#B!A)Ek}2{&_iMA_E-WV6O4u|5^F#$W{ud0F1LTA zl?W`1l020ckk2=2TLWS~C+5t;g#$MYxYdDM6&v_(#94imL%!Ujudh)|up&n+-byPp zt&!G5nM8?F+E297CjLR^ePH6xpnWFmJmF;b)rY_l4F-zR_tI;sl}ol(%xLhq@iR%J-KbUx!af<+{=GjJepEN82V4Nz`*M*#oHzEoTqXw} z`s!E<9mS~I@{S%NWpYO8nqsdrPnS7G^N8#zA2g;eNXFwg{FKVVR6&T>o9hlC=$hh# zGno-?H3MAc$Num+I-HPKJiiE=>ITvEYD{!-SH{yKLV%ZCIraTbIYvI(pLoQi78}Ln zUfIBzx-W4h@8rUc0wOqnr|vK;kANe=9BMq_pzng)YLBJui`dGHB=_G=-Z8{2Fm>N3-UHH7o0$mu2RYMo1 z3=KmUj@rvyaV)DJKCWfZsRh?ypBpMwGI@>n@ME?SMD}${x@-q-j6)OXYM->{`C0bc z+)e}=>Z5!Rb?3Q3ASnMW(jSf-Tz$WoK`)PmLVz-%BL$+CgbHKbH?K^=cz9TgV7kdM zUyN|{Z#bfktLvfKgusysIrS+uM<6E}ItxQ>8(qkNFKnA2=gIH~IKix#xD7e;?Y)DL zlj;!{F{tUxHP~Ut`8*rN>mmF|O5tl1+ sIWl)P;Eqh(QIR_$b2kV7yD>q*(rTyq^QK*;@FycsZQiChzmYcl16rCO*8l(j literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_pct.png b/tests/fixtures/labelary_text_default_images/h50_pct.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f2c653de84eae54367cae0f75eed4be0071376 GIT binary patch literal 8920 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_qmark.png b/tests/fixtures/labelary_text_default_images/h50_qmark.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9a5f37ccb596ddb4bdbbb2008fb883b4dbc9c9 GIT binary patch literal 7343 zcmeHMe@qis9Dmol9+f?$ZZNM()|)!lg$`e@h)g3b2m*1MA{_&r@d_5_f`d8CBqH2V z=+GDoabYlx!I5Q4W(-T0OgEEVhd)p>!z^=VBL<9$$u@VHKT@#e?HypUWLftAa(`Sd z-yivYzwh(D?|r}DyZxRGg-MAE5&-~7#YOoW0if;LV>(vBQ7BJ~73dz)dB;sMfA&x6$Uo^S{SK0B5zf3qY(edqWL(2smh|IFEjWf0? z=#t%BDQ8iQ z;$=}?&*}>@1+U!@MX~!5U^Bww*+`1~ybwZIYEcybqqGDTmG2GsNU@7aW4Mlb-JWlnV5_kYxVW4i|03E{G?gI#3Pq8a&1cOWv1G$fB&a(W z?}t1;VP#G_CHV>_1y`k)2FDCJPD#q7O(usFna>8lCpuSvArFdbn>^+u)`-|lbB#W3 z)Ok#p1*E04>5LE1IV@YU(>%Nl$Sa_zTtEb}CPi(|ZYh9bhiWz2 zD?y+Y+r)V^wDa?~rWClN;^LzY95jRR!2qLKc~_W9SG5(p>L!m0ja z6w|$r>xi^HguL?Gz!U3Hx%O*e>`|>2uhZ?0X!w}qu@5WC9B%2}SGb7a%-n5y z9Aah}TDBMlGQuO{Rem zhDDL$gVQboV_g+lPPcLZ4~kBjIS~!P8B()P1vgiJQ3V1YW1Dh_f(NGhz$zBmCbhsF zVz<9*I~02#-ggOm&I5Ln3oj1LFtltxEBU%A$^;sk$*kGqa~oZp+uf!m{7nT7*)gHIsnl2%pnR-X4N*+1MQiou!tmvrA0!zj;b+QA z3z-KNk6fB%y6YtUp*v0dN543b9&S8L(Ftsdx}Jq;oJUz6EbdXKEn2KvaPkBa(;tbaN9moFv&%-f`F V`X>4P4Dw$Q6c=pBKba@C`~^|(-oyX^ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_rparen.png b/tests/fixtures/labelary_text_default_images/h50_rparen.png new file mode 100644 index 0000000000000000000000000000000000000000..38069774ada1c64f44d3f7b0354065629f003ba9 GIT binary patch literal 7495 zcmeHM>rWI{6u)=wFs$pfyOs^k8UiD2k?M+<-HO(#4DwJKd=+cg`oS4sL0eQpvGGB} z?5+ikAT(7AJ}Rwg{a|Z0Y7L~R&blfp2&5kxYfZ%ZYEz0U)VL}zy|X0#5$$}~++@!^ zkKZ}xo;mm2UCWm)nqZ!61^`URU!3y}0LY>LO!N=%`Ms@KbV;nrbypQ`+FV)e0R?iA zr(CYwD!9^IX=DaTFPb&SRZ=?8TRlQ|PS03>{$pOdw6%c0^(ra3Q|Dws)ny>A6E?_`d)cx?4d za&TR#J?5ygm>gKG(_gMH-LI2bgKW6PNC)E>7}epwRTTqQ93Alvcc2cwv}cApAXyMj zSQC(fiM6!sr!t|GQ}dP<6#R2G1W;pKT-;9&i5R?d;X=;CxA0NPww&QdEpg$(y_ z0={V+KenVsm#B7twYmw*i-E5}lf?#T${4L%7=^sm2t!NKKnP>JQG$;H+(rbkR;- zwD#C8NGt{P%n^rB@vnWOBH55#d8h7ZCD5#l%uSHtB$v^ zP_YA=_fiEW#HOYz>cl7{mO`4?+ygiZ^+YvCwuF=LeU}pS>tSe$rD2%ZR1Ew>*eY}Y z?txtu_dwk3qRoMr$ggV2ZH9P&hzddcO_}8P0heS~mBSD(a7GnM zk<3Hj6=ZUc)G>LSHSo*=>#-m`j>a9tg(?^a7Q%jLc2k(Khz$@$wM1be9cH8xaPiud zzL|)356Ak?VM&Vmc960XW-V2<8!~5|3Y>)aY7anZW2~WRr>ctq+Q^wAmjHK@qG^D* z&91jW7JR&Ga3934@IsDS%P)L-FA?#7I7M|nM|wTLza2}hont=bOXEM@z?s@Q0Mma1OBIcfz5c_P zA!IlyPpE}#ftH94^hN<$d(`j?-tH9=R9B@MMaO-MYnbX_69w~ zhoR}TmhGL3tm`yApUX+TvyxthWW)&^PeEy1ENIRxNA zUJ>7@)${!%3~4fQ@CrSK*iAszZ#Ag_3HZ)LQ`%CythBucu)nVz%?^G-g=m9G%zz7c zBVW9rulE4o6-{p42Tdtjoo^KgHO|WPtTEX(o4VGeehse#DYE?92%NB ztOHLb<<3qjYq{CZBJ@0}n&cWKUvg_7@I(BUBn literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_semi.png b/tests/fixtures/labelary_text_default_images/h50_semi.png new file mode 100644 index 0000000000000000000000000000000000000000..049442f91177368202308a57d877e9c09800e5b9 GIT binary patch literal 6752 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+TSs=!8&cNYd>t=<5Hby4BIjoJwJTOU6@j5NRWHYcja!`>t zs{<4l;B+%Sts%kc(sc2R5tkd|#Ds{{X{XOSKG0+qiK*jb@|RS2@Tpj!;*YHAda@c_j8EG%(mp8dMx)V5>7q_|TLHtUNy**lq(qR!g9l$i*xE$cBrI&FHY&D)TxrC3_b`?cI+KdW;VC(59m> t+R_|tX^yruM_ZbsEzQxECY4*73?A%-@+RAt?*vU9dAjE&u9OE{qO^H zJ?}mDob!F$hV{u)C-n%92u29?n4C0z20~11;Kv9T(6%3zC&I^oB@ynIqz@*|~Qc^Pj?#LjzC#ZgEb=lDP{P@H6MWk%Lk)mc;Vr z5q#p(Jl-N$M)Ja_F&6U}^Jsq3l$pmz81BPc5tGL!&UBPywc3IwdSm!t!CY7{T?k&M z+gF?uR;c@pcTO%Bv` zeZJB0Bq})Ww80gkEt0F|?frq3<%<>9PC40BbJS2rho))Pmg(w-zl3xQRIDv#b+5)l zTqN~@ru`DrK zB%hIS69hDxA#h`M2_D*{Iit~FlJ2?qV;mFNK6~z>%}TKE%Hz=ODKxsE{6P6iGp}C# zdjAy~t?awOC94BBK3qtX{h!r*-;)U|vF>Vr4+mF1Otoe5`Zz)K&LxL@brVR8W6@3p zrMB->*v8vScjBHMM?S9jQXEr}lIeG6gt@6bcSqV%jdOeNlwF}SaYM;8i(4Oe(Uu_w zwPbNgSPN#8)o0uK(InrW>-rJFaqF=gcT4}d?YM|a^5lYZG}XJliVF5s3UYk1Q85aC zylZ1D75yLXR;c~lU8W|6@8dfaySasJR4=Y1x8z|TUEz|DGqcj-acv(8hsX2SWYNoz zFu$+`)2*+WJ@Ur>RIdgRW9y1NcxZezGE8EP%4539do_U!w|`QqMEYYkL-@h=oE_&& zsibDyRBI4Er&*H?&3jIWy401$SQlTPK9lu$6lIQoM2?OLuJ}~OG_`;8a#oe<77@PU z=tfNA(<9S3RXR0|wENDFB0|NJcVNm>FePVHrrcwV1^+yOo7wSvHX9VJi!A=(N(2$g zDpxGfQk;+(yIV>3Txo7@o*7f0NTZt;aj_bT#g5h>?n2{UX=bJG|1qN5n&(aSY*RQu=05IM+| z6;wUT%A&Fb8y6hS;nB*tEMDL7VFqG;{QSm4+t1MQ1_LL1_Hw!kR^{L4bYYxNtm2Fj z<*%^3@7@fO?YUBjde9`eh$C2b$gXE(NJQwaXT&WT(P)j9>K#o4>5E5E#>#aTIkC+t z{9iZ{)^&uCBhPWX?};-~EW&h|w$|0RkV@`{QFOs#vz&O*S?xJCW7|6z575@4w~3J2 z7G>;dk(Jv{zAPKLMrevh!E}h0g&$I0jXR0-=QLO17{(L>Z$ELy$JZd;q79TU`^iR+ zS>?o^oI*^VjQ43$;~7LQXjuhsLjB*mXEWvZ%0aG&TGB6ZOp+Iq&hVUdEU&iN*mvRO z2hJtQ@YY%FBV7g&nw~nN@n8T-PllZnV?p@e5yO_`c}(kKB?zrI9q+2qI8pv+6Q*D9 zWmR7clVR^@{dqQJeV6(WlkcZ2q#HY$m>lh^mG7=Bhbs?qkZu?>(Mh>qkrjED6CwUI z(qE@HeMZK}-ZIN-FY2UQ~7s zX4nLYk4Tpg^Tu3av_qA<(`yB7PEJ(i)mZ;7gx7mIF8 zMl+`Ljyk08yV8o_WDLMdUr3%%-hSP{JX3aU6tmL58356qfp8iTT5H9K72_y4(F1Xv8*cY1PV6Vv%}XUkeH%5%M|5x=_zznV-_C) zrDWm=>jNB>(rjI?zCtpLb>uXad|sJ$l(xK8i*(hM)FB527B5My`P*QDY@@dqF$tMc zV;)knG|n$)6TY>46}Hu8$p!0k`?9sn?q!0kJPW$g3v}h;E}CpVd8nf=6JB;qPbvkI zq2rCDJj6^)A$z?*%TkVv!y)(@G04556zk(NIiKh3_*u1%VGR4RU-&fv&=0q5gplxo zWVrwC7yzq9xCwA=`y+LTZp4`C^VE<(jo>`Kt!Yn(kr}FHb9S^lKC=zIX=9AFtF652 zlGWsUjtQ-Jp23$bh4ba1<@O_eA?hnr)*R#nZ(X_I->I15_qg4r?|w6&6=0RFXOn_n zrh*E@u5mGjZP$ULK8j}|n{6xZFpNGsTktX8CQwQjmI^{iF48?e74+}6jWH!{um!MC)%P!`?AJ`A{OKzAcu}8P|W!UIRf)sS6ZX-1Gn;`$H z|2poZMWr;46;&AY0f5w-(zy`h<%QWiI<`62qI&VUp)^~r8$1ute-cg0&G40cGWlIh z28>P5^$>~LhE$6|YOTn{-)MOU)AE%YEKi{g8@N6F)p z2rwpkzC>ga=U3+RBz#eWXtYng6nzRYoBPLE-FVNMGg)lVeqDa?YQ_6#v5}!ie|}sm z)5Vu-P!w}k9C4>T_%&itZG>&DLnM}lDZ2+majNL-ZD1_5ua*C`>C!txsMJ_1ha{bX z5;bcMXp?%DYXk{0nUb@S4%9flS`IPlL8%TOqhH(WPqs2 z=?RQejhNZ2DsNVF?zi_~I{eWFi)8pcY!0^JC;@bN$}mn=3vrKh=a(|>*dwV1wl^pH z&YMYzbX6x*G^i^7$%o)$$KB22gQAlxvN!A38UL%d*B1>Nw)0S)Sg<9pxk0q`mpFUDt?@!U z_^-kdKU0%^jS{BLhm=MAs(2Z|EkWk0k8SM<0HY7w;mInd<`O-S&y$9!wQoHcaQMDKU1A zg4K^^!ioSm(@8t9`Y^z)>kB75%0pvW-TGAMisj&g%rMfy6jqc@6{b-??u|h znhl*O`Nz@uZUHFUe#O9{W1Q-VdGw&Ayf_VV_(6?;_(DuyoAq+#!`9^d9^k}M0Uaqu zi64+(=|wtiLaIr9Pf-%n*JFLKV37;J-Ej?Wi2694wvK0mTAx|XzUU92SiN5KB0{vlY;T*8dWd|U}s^8|$ z7;NnTHSadC2FZHpKgX7X&*fFE!@3#8Y;Dku4$$t|*(%bnr&8Ip^A}%v9Rj{)F`?_7 z*&v$&HtkKq3YoBd90+l+!O1b+1PI zw`GiHB8ykQpR@t@zxk|{>P>MuD*8SMQ2Hf}7b60(U;6Y0b6`fEKUDv>s#E(s zSUQwl9$SK=Vzy?Ah9@WKehkgzc(5CKnb>o}-w%qVABa+qu{E;%`YbYB{bI&CWxjt6 zHkfwT$-#~be}ZxMZuq;ORX8RxQ21U%2i+89`Zu*&4%VM9v%1MOV5SS*pr#S(_B1yA z)B9$g*?x5hWth}Yg9H!S^87=34K^he;!Qe|M0=Jby`%6zpP=Bw{g3pFQP^csmESUK zv!hOqN}Xf&F^6Y8X5GrEMSV!9G7^O7L3Dc9n;<)Sw&N-;{p6Ji%fEF@ym0Snhg0^}te)WA^!o*8e;8Y(9USDS z;H`~b^Zx9X8=5OT|J&d9`C;x=?$xSCZQ68kl02%s^UpM<0B^vN7{;EC-6w^ax=pm! z#jru+3(nSCf+ylF((u58VszK-uC#QuLl+FX*rAIRyVRgdB)iN(mnrJS+v!0>`cj@;h$^Kecgyb_Ydg( zp=n;vz2|$*y`OW>ed*b{+Um8^MhPLbw&pB%afxx47}) zsB?hZoO-#{Wg904v`dZDzHXp(h?)gvX3N5GU}eBghyT{8n9O(zHW1^u=IcXd8?&zc92Q#43S+zI7+ive zgr6d3_3mEF5wd;ZvZlW6e=zk2a_fc<2E7~Jb(My&MQI(L%d8jG@E%a#c|;-PyFn~p zZ_*LhRnZ4+YZ}XD|N3kOaW9x-;hhleQa||&0=plF{60m6=_Hp^kt`KnC~iaepfz=+ zA!->f)_@@D`UWY;p7bBI?S=zGTuH7?mv=M^*8E%9^AJ-(mlVrpT4?73*l;wgall@q@VpgO!!ICc*;MZVv|1jyYa%FwG zkW0d8B_Y~_Um&~q4VqUjX&(W7lYjM z9cxBh?dzZ&JCE(b`yhThAgZ%>+AJ5Ko+Za%cm6Dqy1az^9Jgnu5O>W|F9P)+ z)PYosJ395`!`q5HdSl+)0`mq%{ulP%Sk2z<;kmn=R`7(p^RkMExFdW$FkYHuN%7B#tD}x8G66|uoE(d>mvt&3h92gD? hD+5*r|GzTe&`W{$*UgM+Z^Hj0N!G;;9tN`_LGnU9Y12T`ETht+!7`d0Mzg_a=`g%X#SN!)s>K@)TC;K7 z*v-Im&#>X(J=TN|eTl%j;L`!1|IfVvOtm+IDUhRU4AvN(26}D_iw_Ubq#mY42S)4G(Kf|s zTWYk4Ioh-y?NW^Pv_^ZFqdn`<0S7|u=h0j;noCA=$!IPa9flnpogN*PA1<>Ij0_uj X%x*J1yPp7@%3<(y^>bP0l+XkKd;bJp literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_default_images/h50_star.png b/tests/fixtures/labelary_text_default_images/h50_star.png new file mode 100644 index 0000000000000000000000000000000000000000..a98d49359debad90ac3af570862cec7e0f990f8f GIT binary patch literal 6981 zcmeAS@N?(olHy`uVBq!ia0y~yVAcU)4xj+Ti_j~2}vGs`1Sce(9jRf52rX4_UoY{z zrT+iKgMy+f&4I@7Kc4g9y}gmeBBig-fZW76!vFq)B0^sxZ|2kg*R}sQKKQ%#f5wB? zQ~x`B_;;<|fDHgm_OAHLtCv_Glh+L2YN^X*3pRpN=4;yf~ zF`6CtP%i@1>L8MkB*6+)Ccx@ud>W|DrRm}sBcOtb2_~CC@+uN%L8b_Bj!KUP%V=^K z%?6{T!)U2ES{sa3lB11-(MHi|TXD3FJlZ!H?J|va6-T?sLvrMRVS?k;%PvthYQVV= N22WQ%mvv4FO#ogqeR}`^ literal 0 HcmV?d00001 diff --git a/tests/fixtures/labelary_text_images/h20_n_num.png b/tests/fixtures/labelary_text_images/h20_n_num.png index 2aef4d3a99bee43ad9af492989869dcf9446c27e..62f04335073ae5525a7246b90fcf0ebb60940eb8 100644 GIT binary patch delta 897 zcmXw2e@s(X6n^camj-Uq&Z2vrCVj+B>&Eo*I#k$3t5cX}Qw9VyTgWTaz7WF?u_{@_ z*JsE>5}M#tB91AF*tG@Pn%d-2&`Qzq0 z=R4nb&N;cEXG6EU6y?_zY;^hj|K2{Fq$ujGz}8)X4_fwk1NBXfY-N4J9;)I%V;-Bo zp51gnU^&FCC!wg|og(s6`f+8uu&#=tUekY&E#L%iFpDv6c;p%MXcvB&_%4}E)6pMu zmY=)Y1bK~HxpJmBdSwaPHHxxI43~maSTjVbin!C5yek>B^^us2boCm{feD-`eGY&e z#T9mieSw{f>7sF!JY_7dywN@*P*VG=(9^u{ZpT6dc0pKu#vYs;ejQj_RWV(rh|VU8^12i0tFaIei~E0jM$Ss$9BtHamN{q%=I8Slc#0^G=a2PC=ch4t zZ-);cgdK4X4TTZP(H*9NpbvfI8g8osUoR)nLq48ArYA8j2l9LxI>>pH-|zsR)17si zk>7CY;z;*}Ta@A9S(n~ahi>zfakk{e$?ReX!}b!@$u32@qolu2QgydEM!ZO94)czN zke}D|NT-xLjmX6Qv0!PEq3JmOPbC)~|ErcSOgfA;970zu-r&(`f>=wSgNxi|!tF>b zoekwqi0zWMy7bywkPBoy*lO>eY}usx5}7p;j~ge!qR1J<%sLd@whma9WI^G<|9wiI?Z zL6aK?zC~Kc{e%U$L!r|oxRh9!37^I|vM_fjTa+y3 yK+uWK>`r^Tq|4tE&NJ3$5O{&<|FDc+Mp65o2>raJCqyoc+O~DamhU(7M_&SOEQlHa literal 7060 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 diff --git a/tests/fixtures/labelary_text_images/h30_n_date.png b/tests/fixtures/labelary_text_images/h30_n_date.png index 444234e876ccee48e4118e8fc5de005cb71a4e01..1ecefcfdc2bdd38b3dc7b5ee75dee35e218456b5 100644 GIT binary patch literal 8296 zcmeHNjZ+h68sE)^WeKZ9w6gKEtRIzFqb!L~2hoIz_*qd=&u^BL1f8RmQyH;->?U|Y zEG@mFs4WVPW3|-^)z&hjJvO3O#Q=7kdi3-(cB<8Sg=j^Bggo~|&$&P0W;)4Cb~o>{ z@AL6{e$TV-yOXkcbEo&y4ABq-(QoFAj0FTi8A4wM2Z+i$o6_<0@`h-mDQn_=!pxL21 zw9huETs6YI+OCT@B+n2&S{jnamfNdBVs%&?h9yjga2bTV!|$sr`kD<;bF;@I6Kx$q zt3`&a&MkHe-Pk$V#?xtMdf&~(rvmMQrpUn2xO`C*Ry>MV-5p~R3J-tN8$+6ZxuD}X zc2A(x@oUF%)(uf5o0?g6#hT7wiDi2V+Yn5kZyeM2#Ha@RQ}8~O2C++pa^vOcvuWlc z4!**QwOvol%$6_nWVsqdUvf3cIANgrzXI(=lOhKsr?)LLE7Ro#o^K}7XYla%FZ3YYZZd}Ly&UEMABL&n8g%48@4E|p(#=Fk@t+OMH`4$x9dbp5cJ$h z(VthflI0Z-p+1djUK3@Ko%WZVM(5+tfjC^ibuuWbubg>+tK$sc2O*R3g-PJb0P?xmlZ|X`qZ3zzQDT`q@tm~J{T_u!fKY6zM|!g&th zIwyO7f+KU#DZA6oh*4uRX6Q-fn4-*wuahinx2o1wW?$0Hz~QVUrzuC5Uo%J>wx` z)rtJwTOs<81DkxR%56!4Fv=(d^05lpdBXiTikdotY8ps$4JnmmqQ6ZhK(`7x|KShp zC^?Q5>hn^XLNwlMtIF@gEDT9!m$*-DLwDcfX;%en;S<{k^>3WTdps(&-6Kbw#n8pC zcUuYP`+)4ZrXE&cS5&J^h}QL4Nksa$l54)O&>iXt*?&U}=h*EE9XztdCW?DK9>w=D zron%$XeCX%-t9yd{I+z1uZoPG*f1umyZzuK7y8hhi0S+J)IIMwYH(p;_JNKsrfy^r z_>P=BE@J9SY@Nqwn}mT?MN^A~7gy@yQ-A&h=PjatBx^d)&(374m!f}Fj$-BKNe@39 zK;;jnwAHp}3XXZ!9p2?|q<>vXGD|qEyqi>?*oD5{dm<3zNUVmDR7n!0P0LpzpNlmU zFgatWOO{HKIbbYz9@Mz9?L7m!Djkl^!xAX14`C13MgIjtore4x`AY&;RO(!s_aa*U zHbp@U&75r6oSa%H64Vq7{uawNamg%?y0^wk(@4Qn-X}>fIX}N?-_nZrt40W-b%x7&U z*#Zn;)e3*(ex$)phvW7l6{Y>D3=I!N^^Pov3pw(@u^oj^2v6KrB-7gN@ijiU6jg>x%_StMBX0Vvav=2wFFxUgpMdA9rG> z{|r0*U>mL02cdBvso5nVmO1-KawkBdD66WD!NU?et)CY}i?+oyx3{;3UxI0OgTrea zOR=85Q1cb7+$XgeH6**_?nyzE2U9e&`g^MqGwZQVk!|CnsghR1XqsVWiI3y0zMr4{U>$!*w=XV~XCX@WD zIN=oT2Q8zx7DGrJ6&8nK3DY552I1}y?uy~3LHHpVUL1rMMd7t#c#Rz18-%w^;jLnL jiyVG)@c(>cLJ&QVUuCoxok{qI0Al8}xfv&37oGnBz0;zj literal 8259 zcmeHM{ZkWX9)C8w2`MhJDta5wfo;!IRH~aqk@1BD!M9cgt+jCH>4xy4Qv?M&qHWD? zutB_7?NJeHD>zO&>UqkQ`Zi-tqBw$r@#cD-NCzY1scr8h2+{Ff`g zJkRre_WSmHzMtoLcB`_MEsTjC8;uZ(S-dD?1wv#}>zNDC2xqd@FT2Q(^ ziPO*EmRh!Q2Hud2+q3k^vkWQR!lf&ZW{fC7DB;-RjI@>IA6o;a=mnlcE}GXn?aTS- zovI@T^5dMUmptnVbm}AGBL1VCh8+a=%clD#&*IbW=3gN2?f_2tCI3&uPVo%s@^`YJ-@ycmkIZ*kC!`^@(yw(oNT zN|SB#o=E^q9}>fpVIq=Gl;sKnwttx3*bsz7_PD_2k1=W3y+IkkqG6kZvD9{&=X%2? zW~EWYN>o0cr0<6S?$$(fTphONbc;cB+xUk6IWw{G-xj1=Wz{g*VQ`HinRShNo^O~l z0Jd0?X&7r1-QNPhsXRnh^#djTe8$>+Lu#YOw(B^bi9Kp?dmg|M;i&yybX z8m>7AI|ywErsX30V}Q#)8;36wNhYv5oT;6IeE|3)E7lK!EncH>$X5k_*p%vPLu&Ad zm6CKA^z1ueigrw9QxD9ql_Uwg&`6togSHVQb7BxGDkRC%3pR^JqmfPEH6W=Qpp7=~ z?dvwBHS8p`x5D7@xZS=W7)hpRAd~VJh<4!o2MBF)I6<90jy~A>;Sf~h zYdWz$?25t$@X~)mXj4O#_G7g9rtI2JXmi_HmTk(!Xqbb;!$u!tEtb(FlhL5(?;Hwb zvX8Jr8T6F+)exi_pM%>)ZusNY|oD^FYEK=Pb7PM zYLX7^f*a;J0C(r*d`p`f9wnr!enVZb zaOidp%ciVY(T*$h&|h+eMZykoCQYH)!$@-BE0brFl8%*mBxGBhRnSxn4`ZM( zW+q9JQ%EXQh*ZfMuDte=+wE?29K^Es2vr|mD>WJKzJ>_UiQ;ZTm7R~hJfz=CKWjv? z#LBS={*FHp+EsFtq{T{PaLvVP|L(#i3}^8A?SnLTHKDy20#hZS-3G36F@#OFiqB8Z zs&B!@2XIApF#d<8RrOv(!3WX=tm-?6#J%xaQa)zB{%(`@Lp}0*3UC^Gb6+OYbeJW> zgRv?dM%5#LsT!`fHz79BitMifyopoQ96mK^>eQ3i9~X`Ffo!d?O$62;bx&A{4_3L%)Oywm*IM!MaDljEBj_gN5_-h z_d3dOwf~2lXrA#utHdQz&TNvZJ*yYczR^Xr;6A^=NlfG4EEG{Mj`p+D+i0eK#zBd4f3a#0 zq57f#SL2Jr92*KOiN8;}f zA|9`Zm9!{uP|84I2Za@t-9XtSmBWE@C{oUf${AU?8z@&M<*KM$k(DY=Xz~1I87Jon_WuHP(YA{K diff --git a/tests/fixtures/labelary_text_images/h30_n_decimal.png b/tests/fixtures/labelary_text_images/h30_n_decimal.png index c0104bdd7cd1ff84f9426164fe0285fb7e5ceea1..d2a64f6e3f60600f4401453308bce9eb77ebb5b7 100644 GIT binary patch delta 1122 zcmXX`e@t6d6uz(T@!E6`=oIK{Hp3$hELk0o7O>*XYjGP>5kZJThV>QOl0`Q_VSu82 zZMCor#|8qen}dbL#BGw8l5~G8_-dJR3^soPe{9f2WE%#2b72|M^?FPE=jP_#bH4L^ z-#PbQGENzfam8$IZNAZ9bFBQ-{s;iDy=iw<(+ls}txfyu4>Fbe57li(&FF;FSeqNzIk12kovel5}17J(wTd$n#Et4sn4cByVaBgi-p=oL$T8z(xjWk`gwIJHz(Ka?V{(b-!hqPj{x7x85___CZ#zRik zK57$$lTgb)DaVO3a6K6d`e=b)gXOGJ@>u(-PZdnCz$`f#1uwV~;c?NKSW419DP8s& zZTdeB&+=OF75UW}&MLTXZlMLik10OT95dZ-AsOBQ++Ph+jMS77r#dcJKd;^~vK|KV z3dGZw#HCqz-uR#oON!Ok@_fX&IxVW%1pKAi|6sRt+Y2VK> z6gU%h0pzywd>wE{U_%7miLpO8axWs!w>^LmCXwXPZ6s3_bEb63qQYUT(KGWQ(t2`M zQzqW->5JrC!5t)N$?>9&bzOf zoUJjh*%9*AR5C?cq*NE*=2g6n=UX#FasTh}vyT4dUK*vpOqYd{DwwKqQCi|~9Pik+ zF)*H6UsPK%(GZ?e;8abGv++xp%X}D9q&;%@E(79h>0cr71g209#ElfxY&89K{&`$Q zpiXd|81e8E^Uw;~e?(DTM`93Wi~}OeTtb-|A{?=RCgUH7%#Fyy`2nqgG2KI<%ScQS z3Z0(-@LiW|BE?2{Ha+0Md5q8@f5?&(xuQja`Y o29L+{h6QcFr5xGZYm%u_K~d16(Hcv1=nDZa?k?RmQpCIe12d7os{jB1 delta 1111 zcmYjReM}Q)7=Q1h*Aq`#Cc~?9wrb|ctmb+JR?*lZTDDjj7-w)}*%ba)%thu{C<_ZLnPHHcO|!|a97_oDmFW!2+$>?n%n>ZX0oAte-tvdpf6w#g`TG5S z&-0GhezrB+^D+ z3&%yZ(n%kqSH4@Y^F?Yuz@o3lbES2Jei0fq9l*}!UwQC$tC{f9Q7vYt*yc#wh|L_c zDB^Sr6nZXUWE3{Zg`$z^82)8&6kt#ibcDWVwN+FeLAv=CAlG!d7za0HXKlPFLRiQp zg^7(mH<2InIK36S78C8__ zc_V$;ViBePO_9{LT(6EijUGbbUp@h9FBqNt^muYQaJw;KmQxxSpZ#PWftTUKy z!nvsNfCFX6)nFQBIC&() z+vzP4=n7WTA+p?6>z>)os6MlY$}o)qeC|CjAN_1lQU1QgB{?yRV5_)%{5DF;sAb24 zkJMTj+4(L{(Gyt;UYJ5^MW4<26CmrvN!WuwWgKB6zLw@WE?gXIT2Z%35Cm_*)2@Dz zOkUawBZAl+dh4%R)b++Y%mipiAqe%Ru4xI~YUcj%zSCbwQqcSPRf)X)nVU1KL>238YagK1h?eTW(F1#(l*mhSGfV@?o$TP*k~=10$(Pzq+BY%x1<5^pxbkzvptxB P{tfWv?)+WdI|cbaO>)2v diff --git a/tests/fixtures/labelary_text_images/h30_n_num.png b/tests/fixtures/labelary_text_images/h30_n_num.png index f9385069dc3b7868159455f18f0bd9406672d106..e2cd1f8baba0758cb9065a46089d045afad58072 100644 GIT binary patch delta 1335 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 cf8mP>D9%mI|LRsTmS$7 diff --git a/tests/fixtures/labelary_text_images/h39_n_long.png b/tests/fixtures/labelary_text_images/h39_n_long.png index e05cc267b773026729ecd444bf49506f94f95d82..13cbc8028da8e50ec0a4283b29e1ee3a6ba3b123 100644 GIT binary patch literal 9836 zcmeHNYj_mZ89rxcax%mr83WN-1$G3403n&(HCk+D1rBSSgO3maBZNxx9qSEY4 zRud>lf>0n3A$?F#L7SE$SfD#gz=RNzR0~FpvXqAOf@BG|4cYAJw+Jde?Z5u&vp=#k zXU_S~<^A68{l1wetJ3F8?;mwv6hf%~BQvHxju4X&`s3gMTHotoLJwDlk56xY+ zC_%DLkW!ZwNH*Cv0e&WpA2-Qnm!{8tqH(}SD-n9|qerHuK2cnq<99?&^TbP0vUN@A zV{+6=(~hdVfon`dJqz;95j(UQ@|Jm_{@6A78$;b}xH}9>m=57E2&=>Yrz%dipXeIf zWv(=?<~!zQlH>!=T+BavhOWi^suPOFUE12c3dhY~fJ)zsaGNFXiyv%##Yt1h@S?-* zCy%)4U?%n(gXmz_@!yYMG9#0gJ(M)xA)ULUc}RKOL6+x=As_Q zp!RE7$kaj8eFs;r!z_EcuUxO@_24ph*E12dg0;wJc$@P9j4#EhF5((4(_N;!5{yVrVA%f#H`&k zEj57|D8CzwArp_8Rqb+vlRe;RKx8|08M7A?(L1@@!Y=xi-9Vk|=nhrZvNq1!w!aZJ z1ZR^g)?t1FO*1BwWbZGpSlHksn}IL?nR1m42yds1=T--Q-fG~k9aNPoaCEVyFS4{{ zG|x%BUpWR1w<$&^RebYa!8q65M=9MK#h4mOdL2;&i*u?v&U~4E4~ahzu$ZE2Wku_D z%Kj0}8X84Y)kG$?HF()VhWuU*O+u-2K!KudpptKPHO7wzUB<-4gq_h7!{+e~>Ss=| zxZ%jneWjWi+vaOvU?aKmR{$fcCg*L;CoC+(PdQ=J@UFC=Q_eVwOx>6E@QM)(hGriK zJ{s$K9kWjY(vwNNKLAf3<|WC}(umj#U2x!`M5wGN$U~-U*Qu`F&2SC%du<5!_ELIg ziA~ey-Iu~}$$@Xp_gC|hy79wiWQwNL-I0s%-f_* zmZ%kGP5Z}rI)Mlo-LU)*c*$7NNpp$dyAczS^pIHNy$p|k`JGV~?z=X3wkVxNg!G$nOPW80QOS z&4AtP;-$(ECV)aw52eEfFhXq!O!{M9_Cecyh*wm&&LzT(5TKdQ5UCc%k7Bst(4U*C7tGk-i7)X4;T`39es(N$9$Tmx{a&afP=)(_6qf-y8OvRZ~vG zum|B_ez@)z73p7aeGN_!pl-r&7r>=%#BlRz46*pl>P^_ki;8*%hDC^q_lC1S5!$W; zZ!i%K1Vf;y+2S;9Y;kYhQZl@@6mxAq7rov@hMQrRI{@ta+murtYUevV2vo%txguJkKu&T5i$x)Ge61D9eX{LZb*FKq568 zxfWW?m7bYkkgcj}0m387HUVLe8HNFro5k-?y`G}RgtINDi)Fi{C)JCZkygBH&f}eS zA{4`r04!kQ72l;4rfwv7zd%*JSx5&@`wnl{bFx-gcX5i!&i-2KkSwj zHSf9Qq^uJd+5!hM5NmPU3)^E%-8}F9(yD19!>#Co3FSP^^=fabvQ0nxNeU5!oVEiN z_HSmf=e%RDZn|6|@>gJqVa^9GPZXtg<{+R!b{Z1J_@}(NhuusTqJiXVf+)B#D)t zFHZ4o+7N~-47M1)N=$;w;2gCt+tT}Aab_da?0bpi|HK2QiEY&S-EdfuzVj|-(5=4P z6J?qWrDZMVH(FKZ8f@)TbA;NvLQk!wAWdc1?+7 zgsE0lqi<(IXg{U;=dD%weY zroa8UsA(_V0}3#?9?p8UMZ-H6V_%u!T8K-%x>$8 z)Vux&0`Ir*YvmeOJrpnpLA!>EBMBrTx=macn;SYgQtOqi}j6PsQ zch8H@KB>120Q9w)|<)_FJ)2q3fV^B@iEhY=ox}@(dCD#|^^=8}Ng22W*V+ z_aEgU*BHJnwI`2At=k(>WXC46rZ`8}#f!tgD-`i6(tiQFPl5%G(TM;hNH(1f3tx7` zwn1P`q4c?2C9>j$F05g2+I+qO*Zf0E%-ik-UKz)90e0UUzbB4O;XN8d>@* zuh#ZD1{LNY*B5lUN5!-FI`J(C@0pWQW}>5o({$(ojEA=>4&Y;W7@&hH>jDFfKw4Sn^f- z&Gg5PG%Gcbu$)U^jw>`Nnn*=ADD4li5}dA;fXMbiZcQUgeg1nPB9eguWtbfbho!4s zn5zy_C-8P%sC~?X*f~H6*mXmweHpUK7xXvY2bf94kh~p9L~iS|kl+hI=8I4xwrW|g z&nvkLeEknMO%WBP1B~W`il~3mLSWl93;8n6s-=bsHd9wo=%1h~?%JMjrT0eMfGv-7KR8+qhwYHE~Yp$Mi#AcifRlIPPD$MQ~8D&TK z+&QYq|Gh<%_QG<1u(IQ5x$9J@vIgr-pMtb~CYrX;%=`kxEX?5+1fhx>!gn<-Szm>5 z+qO_`G5{tjWN;u0sQ%skwjMa{1!O-{=3nAAzb+MVA0Ti_ouR~ zfxO-DIXCNLdQ{&92Y-Rzp#GX`@3BM&6Boy2Z(5x~EzuKdXC7QWC0KzI|K{>kz+2Gr zRl9|Q^V@qU_aAT7+VPgS1R4{0Z@0%=4|wfAzoWF{*6(zW;mX<+`XE>n2gO*#4t1aq zG0lD=UW}Mp`sXHF)HJ+K9k&<0Br3zjlL?{je&OygEMYo?!yv2 A=l}o! literal 9775 zcmeHNeN+_J6@RlcJceZ=W3_RX7p_x5R^oxb;sO~CS5P5 zqV}Hqytvm@$uZiQch^)K0|!;+FV|k&8}Q92n=PdyH#r|UW!CX?oyMrZyj<@=P3su2 zGAlkFmXCB_wbc=uui)1b%@=+|Ds?6ANQhe2W0(B%$9oX-f!9jhTF;v{Eb^}fdyRPC zsb~vw6kcy88AXT6S5s`w7tI4Ruywkis(CF*F+TBLjq90XL+&&WNoSVjFDBaywX0JIHthEuT zVasYt59f2F;nBy4k>GeZmdz8Y zRJT1@%2Cxe=-V&m$+{0(;fbuRrlMArgr5GXF5;mLSFK!)NtUnMMK)We&IC!!t){Zn z5$TTG708!WFB$2p983!bm%X>Vv)#&j@)33AO!Z1ZRt~^wYYej7ltZ`s6fDZ1@JcyFjV0d(248XLdrjg%icM``7U_`y0Q#ZY{-__kC>3MUGOE z(NIn4w}8ss!#xIrEMDl3O~ZT~)Jb>*cim&IqquJxgXKCS=4);c`zV@i3J{XDiDG_F zNOJ*l>?9e0fCw)v*JDGDnczyZDtn;&HW>dWLVm`HJXmZ0{t9&(((P{rSHdyB{nr9_ z4-XM!+22pdQBL#)>_fQ}C0m%UZl(-@b~r};@)tS2g9tR6Y?1a@RBbjc>#sD(+Ioj; zHN|uTOg=xyvHzw){wT=WW{2xtiut)&3Ru5Hx}zL-jT4JDoDVJax+GY+gxKZ*I`Lq!!7vo%=|;tjHIj5|&!);jE`)mDys=aE@01{u&IC3}!AWjuuQ zb6E1jCAR*#BDlt+ z$|2wO!{uJJGO3a#hpyf$$n_!Y4RB(8cPkk7N|2D&W~6%s0#kF^Hp~k$?SXz`eT-%o z1Y_{$oLF^}G<(+=gHFwadEY<`^BXwzO|k;>ReiA1eOM~?8<}g8Ns?Ge4ebKHQhTg? z132Wwf9?#o^O-%cz)vtQ!A{F+1VLcHJUB3!7!(_>L3@=Gm4Nk+M&=|0P$M|Mg4_nb zjBZ=F1yKCy)Kw10p`N2K13;u+w2Qog98OXoscHz}R*UMoLd2>sHLbqjDAIvr7Ud%9 z5RpXyROEl@xTlV$+0;O!GXY~fc?sqVgO%I^fcI~#x>Uex6PYb_sH<&)b9@rm{>l0K zX?LS{`!GS+XHijzV*z1F_!-RmJt(r(p!zON!?-LR(g@h`6enwN^R0I&m$h@E)`S=j zCwBad!X?)fMBN8C`n<~F7`cub5;*HZx z-~A0dlj%mf<5sgIrAkU^%PFwrlQL>hepUg}eHjbclhqoI#hcTa?kS#w58!ZIiFrldo{i%F? zB)I#9cnvY+_kt>xQgnh5GWGTYItcg`t00lz8x8mDLS=8{0~1qeSd@T4cX+r$b)&;! z+cJU{B$KKNR`=IuIJx1p`$8?8;$gGx(hn zf-x2i;P_;e?EV?~CmF5pE3bfwWvLx{Zf)0Z4UxF_`d#NKZ@8=dm0LaSJ&w2p@j>x zbA$-D9xBHD+P-Xu88VvDn}g_HOUqVR@1>)h&U!5W=-GiwR1ET_eCZJs~31@s-D{Povf< z3A^CypFCRd#&1)G@=3Du!Q?!(R^mr(aBTXwugY;DwDpu7&^WLNlj7llt3fO6lJLWeqDX diff --git a/tests/fixtures/labelary_text_images/h50_b_mix.png b/tests/fixtures/labelary_text_images/h50_b_mix.png index 2844a0459ac9649277bb466028a8b26d2e5d943d..48f194252a577c47cba6fa87ae45a8c9f2e532cf 100644 GIT binary patch literal 7800 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 D6gBD? diff --git a/tests/fixtures/labelary_text_images/h50_i_mix.png b/tests/fixtures/labelary_text_images/h50_i_mix.png index a20a04db31b309218bcd081a7fcd9fac2bf285a4..6d603ef8a5bd0d005120bdc2ed6dcf43743af1ea 100644 GIT binary patch literal 8186 zcmeHMeNa=`6~Fi0s+rQ-o!MQ@w%RhgT3^5lyDH%NQ96q@wPU4gt8x9{JFhp`?o9vd-<|xC zWG45Vd+s^E^Ks8TwbqpxleN)W0Knws%a*PN0L2A98u|w~cyD_u{h3~#mQ%i_Y}=On zLXer8S6Gs}Wjk-0Z<;U66B6>c44_UP7o>*QhB-B-B3EKCV z*5<;9I%cM4W079nN|p&n*9O+7)D<-bmQ}&!pjm?M5DbH0b_iz0U^NI9$>8N6cqt0r z6@z!=|E)J@sJ6ru-#T*kRMjOxiziF8`@l0Q8|HNZ*!VzMA||3p-OS*X@v6K)AL@xofC=($yYL9seF-2es$>Owa@lKSdp`+kPq))c>Hk<47EvwY-O#! zQ6u7fM~!t%zqH^t?4pJX2cWwD+2|j{u%Us9dN|jXJ3(g~jzV1D$HKqqlH6OPQMCDw z9b(w~=Q_zWvmnZAajdxqz88sPI;Q8vk?hnjW^BWnzN@m;9)iE(T;fM3V0d2#fagqQ{TJ*Ps^KIvHSkAas+K%} zGUn{bA|b+N4fj+30Q@BUv2?#{)*MOho&Rd87{#KFPtzExQatqcQaqcEnGTWMB7RV zLOXz8v!eWpfyED5oA1-ZkZE~~^Ep;2dRcTHhA*3q5?p}s&Wdp)1 zIIr|L1q-@$7cY|Vu|fjY<2bpQqFBJGD+3v+L_7qUMS`T>@D9gIzg>XV%a;MPaBlEU z5zh2dH}F+cC+Z_%NY!5;YY#j!k<_*BF_=n7GFuc9vDNy}uHl9u#z+(IqNcAJF$;VXbyH-!RW2>=mp zD{KB7Ad9|1yk^0|#>QM;dt+K;o~)iqPsO4RJr)8usAP)6Ztt~B%t`qo*%`vg;=-Rf z%)Vr08k#R%x(b;4dagTxI7}U}JfJ@8MXO5U6J%gO%+mx>ObJC<-eaR{aSOTH2vyV1 z<(oSJQ}>*0C14_;#`acT0XTDUdwVr?psF_!*Y&PR7m_sJL>%JEojcFZMbWlA;M}V8 zBoMM+7ZAhw>#I|7q){Y~9w@O=5>hSjXN25lbuPa_KNd+1uzyr>1Tx7sX@-D2=6!BqGcXR^0R?GI0{XEjNym1-eZhA!BgwrOs z$pGIOW8e4AM4aY_2|93slfAQ%Du?=JW(CXJ9>yV!yN@QE#V?}25i)1EUO68N)}jJQ zYU@PsGj_n+5z(56g|?G_WizG6O zS)IEUzA2UG5fm1>Cri{##76{;%D=vj_b78|c4>4tQujf2*FOrSp|b}d+q9Xpp|`On zC*_F&eb;*tgxs3?jZn@l5YGp{=&`J*r%~||LQa}#4katigNGnHRjs$7AK}=phBH65 zHFXm>Rqvfp6|+i)hez{StK9w>P;XKEiejmU+9osSk~-|dK#_>6R`{2YBorx(TbM4B zEPt%D5@Ev8N+cQFRvg}x7!)n|M-A*JdYxSP{D@)|Xz6J38{ibqMIH?*St9o$65lYo z;MqqsT{gj2+{cH*;cY6pxpKt9jGZl(Ro7{P&BL)iTFl-96a}9nW;Gj22JhO1p${o) zC&z25OR><~@|03k{_-+`CzT8m!&-X>?GZXiV})1!E}Ls01GS3PmT?@yra9v^4vHVX zVrpMVYMc%6Yv+urz`Tm{Z zK})G`%=^{5PyXV)WS?!z_a7P=xi$PHm6;ci8F)twl--GkM!H+@Au;&A8hlp{hCy)5 s5FD=rt3hzu7MwB$FGc@nLuUYvoc?xJfpBm^V5q-5ZROHai>2y+0bi$9{r~^~ literal 8185 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 A!2kdN literal 8011 zcmeHMe^e7!7M?egOk$YAP$JG$lxd}!(<)37e_(3Os0g^Ct1iot>bet10K2S2RxzyD zyaa1SQ&4LKEVi6t^|bZaTDR3b>&isHWe?%Uy1TWjwZx-VclBt%il`xPUp!}b|K5Ll z@<&cGdH3Bn_j~vI&bjy2tyrG(jP5xdK@iU@$<10t5Y+VOM~nX;-nmh|0Dn#1w0QNV zpH*zGEOroiwjxKlt+HA$r<>Eo8MEeyreaf3=8!+`IJSH_YPqP=VcWF6VuO&s{?`s7 zyK?<>!8l7;W~&xVqG>k%Z86Tan2bWsviy(oe=`~TKd~fhLB6Y{c+{%P_8SD9X!Lnk zin^U-TeCy&BVX{BmGJ5|m@6JEjIKZHD>)EdR>hWMu*A|KMuV6-{5VvxWA@4LKZYUT zzdg2PU(&vrJJ*Hk0AKTql#i#p@Zp`c+gd=}t#ZQi=eYSs=)a`C6@0bBz|DnM(dVj+ zHFmB5<-iGvjHq0WJh3w2yUBJ4#wMY^_&3sq(_^WOiXZUbKyC7MXlpL4|I-&nQ9Kq& z&`j&%_rUv&hz)&R5BTe2j~a9&*BTsgv!i|p(ow2}bOq=w?-mnNCP&~BK{z@+_Fn?&^@j^md1mr9x&gFGAj=PEisp=xG@(o3ix){CN;hojv<8(b$20`NE@wt7pMHaV;I>i)v-uE+{~WXwTOL%Tm{ z6ea(1dPnA@NJl4wPA(h26NBDLI30jw0n*gES7EE` z2qD0*!3PL!#(;+L<78U92P614qjf&9Y7d*>f=g(nXaY$cPR*(JjSy_nQdDgMrJ84# zT>%1EEDXc!W!TUU6DWPn2LTw5jXWa0#b$Zbk({`Z);sF}nfDFPaWgp~h&PwdQt8cv zM~|J<6hUuw1vlW2qeZraQ%^}^P6p21`eL|l9Hn!065uC{Bq#*H(9L{J5IjJY$qNws zi)_M3-(+N=Q`BWo@1wAx=Ys}Hdm1%jAD59wo=;ht!fw4UP3aW93aX;DxpoKi z+^ZNoJ9eG`g>?)&&_|Goj3GFevKTUZFmf!nvf0t4rbYQ>JFLBjiMIOHHvxIP!att-M z!RD(TH36pcS3C=w0ezh7wGp*BOL7r_0J|zs$=%(9xc&=Vaq1n(?n?js>{;#J_n1}`Olxl6b1BcJZqt-ic4n9B9 zz`U`>D8ar)#0A@?QK~ddhW5RHDTqYI*6hNNpve8y@wuX;{1NL-Cro^&@DrSh56`=& z2ggsNIA_fxw73bxIU^0a051e@;Up=-NzzShz04_aW1WRc7GCcsXluP#zO_eE1&bm4 zDdsbFwXbm9VpK}hnymCOX*VF#%}x_bMa+_tu>*Tiy1S>NqID+dk=0a{&`p5P_%v=O zuwuyH#sb2LCezY~8)&T|QHGxLtTwZYAQ9$TLM=yCIkQQ!oR={1RMD(Yq_VS0=B~q8 z_+d5Ube7Cewb%&H6NXj#g+4e*Y~K!dBh1x^Rffci(c_5@WYe7C1^I#7;5w=h>TM`d zI0VRf5z3!2j@GUYq4pD&6jAcD{PrB0!>n-r3+u=PEJoiWtmSf={eVCl_BWfMSWqtf+~fI}>0?%~YuhuA z)B`gAcf8Zf(%Ns>vonjQQmXAH%w+0+L|FtmDtQ2BN)k2o)>s317~jQ+TW~4oV7wlM z|KmN>2wo|3VDaA7%$)Yr7%5AcEt=*U9}IZoR_o2J;44Q9ZMR!(NhKl1Lp=3 z{gBMO_?j4`?p*fqdpuW*Fh={7+`j37r4tJ|R=U@eK)oT<7~TZn%!m%tc&{qEvcx8T z@`rs&7eV`G@9yVCmRx(X;gQJzc%xNwFqcta%vgsm6NAu^xJCv=AGq p#70T65n61778{}cpCdGah|GH9Y@Gh)Ky*sJWbyK>;|pc)zX9$;8nOTY diff --git a/tests/fixtures/labelary_text_images/h50_r_mix.png b/tests/fixtures/labelary_text_images/h50_r_mix.png index 07f027f6492149caf26f685d99dd7a8ad10c0cb8..cf67c655cd6848f11018c4e172adde0474ec352c 100644 GIT binary patch literal 7784 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 c08Gn5=JQAcu#YYv73X{;H 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 UG%d9j9#A2sO`ef(Xrf^I4~u}7PXGV_ diff --git a/tests/fixtures/labelary_text_images/h80_n_num.png b/tests/fixtures/labelary_text_images/h80_n_num.png index 29cbddb57718b91599495fa28fc154a7daae2c10..71bd0ffd40b638dd6b4e87d34ed681e1ddde11b8 100644 GIT binary patch literal 8950 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 literal 8891 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 diff --git a/tests/fixtures/textBoxMatchCases.ts b/tests/fixtures/textBoxMatchCases.ts index fe2b1539..9fbd842d 100644 --- a/tests/fixtures/textBoxMatchCases.ts +++ b/tests/fixtures/textBoxMatchCases.ts @@ -13,6 +13,8 @@ * Sizes cover the common label range: 20 (small fineprint) through 80 * (header text). Skipping intermediate sizes here keeps the fixture * set focused. */ +import { charSlug } from './charSlug'; + export interface TextBoxMatchCase { id: string; fontHeight: number; @@ -41,17 +43,7 @@ const CHARS = [ '-', '.', '=', ]; -/** Build a filesystem-safe id segment for `char`. NTFS / macOS HFS+ - * default to case-insensitive filenames, so `A` and `a` would collide - * as fixture PNGs. Prefix lowercase ASCII letters with `lc` to keep - * the test ids one-to-one with their files. */ -function charSlug(c: string): string { - if (c === '-') return 'minus'; - if (c === '.') return 'dot'; - if (c === '=') return 'eq'; - if (c >= 'a' && c <= 'z') return `lc${c.toUpperCase()}`; - return c; -} + const uniformCases: TextBoxMatchCase[] = SIZES.flatMap((h) => CHARS.map((c) => ({ @@ -76,7 +68,16 @@ const stretchedCases: TextBoxMatchCase[] = [ { id: 'h30_w60_alpha', fontHeight: 30, fontWidth: 60, text: 'ABC', rotation: 'N', x: 200, y: 200 }, ]; +/** Long multi-word lines: char x3 cases contain no spaces, so space + * advance drift and per-char accumulation over realistic label text + * only show up here. */ +const longTextCases: TextBoxMatchCase[] = [ + { id: 'h50_shipto', fontHeight: 50, fontWidth: 0, text: 'SHIP TO: 123 MAIN STREET', rotation: 'N', x: 20, y: 200 }, + { id: 'h30_mixed', fontHeight: 30, fontWidth: 0, text: 'Artikel: 4711-XL Gewicht 12,5kg', rotation: 'N', x: 20, y: 200 }, +]; + export const textBoxMatchCases: TextBoxMatchCase[] = [ ...uniformCases, ...stretchedCases, + ...longTextCases, ]; diff --git a/tests/lib/boxMatch.ts b/tests/lib/boxMatch.ts new file mode 100644 index 00000000..d8be046a --- /dev/null +++ b/tests/lib/boxMatch.ts @@ -0,0 +1,39 @@ +import { expect } from 'vitest'; +import type { InkBBox } from './darkBBox'; + +/** Proportional slope (5% of the fixture's own bbox) so + * magnification-proportional drift, e.g. a wrong capInkPerMag, trips + * on tall cases a flat tolerance would swallow; the noise floor stays + * visible at the call site. */ +export function toleranceDots(labelaryDim: number, floorDots: number): number { + return Math.max(floorDots, Math.round(labelaryDim * 0.05)); +} + +/** Shared 4-axis gate so "systematic drift" cannot diverge between + * suites; textBoxMatch opts out on purpose (size-only sweep, no + * position gates). */ +export function expectBoxMatch( + local: InkBBox, + labelary: InkBBox, + floorDots: number, + id: string, +): void { + const wTol = toleranceDots(labelary.width, floorDots); + const hTol = toleranceDots(labelary.height, floorDots); + expect( + Math.abs(local.width - labelary.width), + `width drift for ${id}: local ${local.width} vs labelary ${labelary.width}`, + ).toBeLessThanOrEqual(wTol); + expect( + Math.abs(local.height - labelary.height), + `height drift for ${id}: local ${local.height} vs labelary ${labelary.height}`, + ).toBeLessThanOrEqual(hTol); + expect( + Math.abs(local.x - labelary.x), + `x drift for ${id}: local ${local.x} vs labelary ${labelary.x}`, + ).toBeLessThanOrEqual(wTol); + expect( + Math.abs(local.y - labelary.y), + `y drift for ${id}: local ${local.y} vs labelary ${labelary.y}`, + ).toBeLessThanOrEqual(hTol); +} diff --git a/tests/lib/darkBBox.ts b/tests/lib/darkBBox.ts new file mode 100644 index 00000000..a60eb635 --- /dev/null +++ b/tests/lib/darkBBox.ts @@ -0,0 +1,36 @@ +import type { PNG } from 'pngjs'; + +export interface InkBBox { + x: number; + y: number; + width: number; + height: number; +} + +/** The luminance cutoff is the shared definition of "ink"; forking it + * makes the gates disagree on glyph size. Extent is in pixels (= dots + * on the 8 dpmm fixture canvases). */ +export function darkBBox(png: PNG): InkBBox { + const { width, height, data } = png; + let minX = width; + let minY = height; + let maxX = -1; + let maxY = -1; + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const idx = (y * width + x) * 4; + const lum = + 0.299 * (data[idx] ?? 0) + + 0.587 * (data[idx + 1] ?? 0) + + 0.114 * (data[idx + 2] ?? 0); + if (lum < 200) { + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + } + } + if (maxX < 0) return { x: 0, y: 0, width: 0, height: 0 }; + return { x: minX, y: minY, width: maxX - minX + 1, height: maxY - minY + 1 }; +} diff --git a/tests/lib/drawKonvaText.ts b/tests/lib/drawKonvaText.ts new file mode 100644 index 00000000..646d59a9 --- /dev/null +++ b/tests/lib/drawKonvaText.ts @@ -0,0 +1,50 @@ +import { konvaBaselineY } from './konvaBaseline'; + +interface Canvas2dLike { + font: string; + textBaseline: string; + measureText(text: string): TextMetrics; + fillText(text: string, x: number, y: number): void; + save(): void; + restore(): void; + translate(x: number, y: number): void; + scale(x: number, y: number): void; +} + +export interface KonvaTextDraw { + text: string; + /** Model-space top-left, device nudges already applied. */ + x: number; + y: number; + fontSizePx: number; + fontFamily: string; + fontStyle?: string; + scaleX?: number; + letterSpacingPx?: number; +} + +/** Single copy of the Konva-equivalent placement chain; a + * half-replicated variant is how a placement regression slips past + * one gate but not another. */ +export function drawKonvaText(ctx: Canvas2dLike, d: KonvaTextDraw): void { + const style = d.fontStyle ? `${d.fontStyle} ` : ''; + ctx.font = `${style}${d.fontSizePx}px "${d.fontFamily}"`; + ctx.textBaseline = 'alphabetic'; + const baselineY = konvaBaselineY(ctx, d.fontSizePx); + ctx.save(); + ctx.translate(d.x, d.y); + ctx.scale(d.scaleX ?? 1, 1); + const spacing = d.letterSpacingPx ?? 0; + if (spacing === 0) { + ctx.fillText(d.text, 0, baselineY); + } else { + // Konva applies letterSpacing between glyphs; canvas2d fillText has + // no portable equivalent, so draw per char. + let x = 0; + for (const ch of d.text) { + ctx.fillText(ch, x, baselineY); + x += ctx.measureText(ch).width + spacing; + } + } + ctx.restore(); +} diff --git a/tests/lib/inkCanvas.ts b/tests/lib/inkCanvas.ts new file mode 100644 index 00000000..0fcb13b5 --- /dev/null +++ b/tests/lib/inkCanvas.ts @@ -0,0 +1,14 @@ +import { createCanvas, type Canvas, type SKRSContext2D } from '@napi-rs/canvas'; + +/** 4x4 inch label at 8 dpmm, matching the Labelary fixtures. */ +export const INK_CANVAS_PX = 812; + +/** White canvas with black fill, the ink convention darkBBox scans for. */ +export function inkCanvas(px = INK_CANVAS_PX): { canvas: Canvas; ctx: SKRSContext2D } { + const canvas = createCanvas(px, px); + const ctx = canvas.getContext('2d'); + ctx.fillStyle = 'white'; + ctx.fillRect(0, 0, px, px); + ctx.fillStyle = 'black'; + return { canvas, ctx }; +} diff --git a/tests/lib/konvaBaseline.ts b/tests/lib/konvaBaseline.ts new file mode 100644 index 00000000..5e07389b --- /dev/null +++ b/tests/lib/konvaBaseline.ts @@ -0,0 +1,15 @@ +/** Konva's (non-legacy) line placement: alphabetic baseline at + * (fontBoundingBoxAscent - Descent)/2 + lineHeight/2, lineHeight = 1. */ +export function konvaBaselineY( + ctx: { measureText(text: string): TextMetrics }, + fontSizePx: number, +): number { + const m = ctx.measureText('M'); + const half = (m.fontBoundingBoxAscent - m.fontBoundingBoxDescent) / 2; + // Ink-box metrics are no substitute (a different quantity, ~2.5px off), + // so a backend without font-box metrics must fail loudly. + if (!Number.isFinite(half)) { + throw new Error('fontBoundingBox metrics unavailable; cannot mirror Konva placement'); + } + return half + fontSizePx / 2; +} diff --git a/tests/lib/printLabFont.ts b/tests/lib/printLabFont.ts new file mode 100644 index 00000000..fd678d26 --- /dev/null +++ b/tests/lib/printLabFont.ts @@ -0,0 +1,18 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { GlobalFonts } from '@napi-rs/canvas'; + +export const PRINTLAB_FONT_FAMILY = 'PrintLab ZPL'; +export const PRINTLAB_FONT_PATH = path.resolve( + process.cwd(), + 'src/assets/fonts/PrintLabZPL-Bold.ttf', +); + +/** Single home for path and family so a font swap cannot leave a gate + * testing the old face. */ +export function registerPrintLabZpl(): void { + if (!fs.existsSync(PRINTLAB_FONT_PATH)) { + throw new Error(`Font file missing at ${PRINTLAB_FONT_PATH}`); + } + GlobalFonts.registerFromPath(PRINTLAB_FONT_PATH, PRINTLAB_FONT_FAMILY); +} diff --git a/tests/scripts/fetch_labelary_default_text_fixtures.ts b/tests/scripts/fetch_labelary_default_text_fixtures.ts index dce40cb1..42b5bf2e 100644 --- a/tests/scripts/fetch_labelary_default_text_fixtures.ts +++ b/tests/scripts/fetch_labelary_default_text_fixtures.ts @@ -12,8 +12,13 @@ import * as fs from 'fs'; import * as path from 'path'; import { textBoxMatchCases } from '../fixtures/textBoxMatchCases'; +import { deviceFontBoxMatchCases } from '../fixtures/deviceFontBoxMatchCases'; +import { font0GlyphCoverageCases } from '../fixtures/font0GlyphCoverageCases'; const FIXTURES_DIR = path.resolve('tests/fixtures/labelary_text_default_images'); +const DEVICE_FIXTURES_DIR = path.resolve( + 'tests/fixtures/labelary_devicefont_images', +); const RENDER_URL = 'http://api.labelary.com/v1/printers/8dpmm/labels/4x4/0/'; const RATE_LIMIT_MS = 1000; @@ -32,30 +37,60 @@ async function fetchLabel(zpl: string): Promise { return Buffer.from(await res.arrayBuffer()); } +interface FetchJob { + dir: string; + id: string; + zpl: string; +} + async function main(): Promise { fs.mkdirSync(FIXTURES_DIR, { recursive: true }); + fs.mkdirSync(DEVICE_FIXTURES_DIR, { recursive: true }); - const missing = textBoxMatchCases.filter( - (tc) => !fs.existsSync(path.join(FIXTURES_DIR, `${tc.id}.png`)), - ); + const jobs: FetchJob[] = [ + ...[...textBoxMatchCases, ...font0GlyphCoverageCases].map((tc) => ({ + dir: FIXTURES_DIR, + id: tc.id, + zpl: + `^XA^FO${tc.x},${tc.y}` + + `^A0${tc.rotation},${tc.fontHeight},${tc.fontWidth || tc.fontHeight}` + + `^FD${tc.text}^FS^XZ`, + })), + // Device fonts: width stays 0 so the firmware derives it from the + // cell matrix, matching what deviceFontMetrics does locally. + ...deviceFontBoxMatchCases.map((tc) => ({ + dir: DEVICE_FIXTURES_DIR, + id: tc.id, + zpl: + `^XA^FO${tc.x},${tc.y}` + + `^A${tc.fontId}${tc.rotation},${tc.fontHeight},${tc.fontWidth || ''}` + + `^FD${tc.text}^FS^XZ`, + })), + ]; + + // The case lists share ids on purpose (see fixtureIdContract). + const byFile = new Map(); + for (const job of jobs) { + const file = path.join(job.dir, `${job.id}.png`); + if (!byFile.has(file)) byFile.set(file, job); + } + const missing = [...byFile.entries()] + .filter(([file]) => !fs.existsSync(file)) + .map(([, job]) => job); if (missing.length === 0) { console.log('All fixtures already present.'); return; } - console.log(`Fetching ${missing.length} fixture(s) with default Zebra font...`); + console.log(`Fetching ${missing.length} fixture(s) from Labelary...`); - for (const tc of missing) { - const zpl = - `^XA^FO${tc.x},${tc.y}` + - `^A0${tc.rotation},${tc.fontHeight},${tc.fontWidth || tc.fontHeight}` + - `^FD${tc.text}^FS^XZ`; - const png = await fetchLabel(zpl); - fs.writeFileSync(path.join(FIXTURES_DIR, `${tc.id}.png`), png); - console.log(` ${tc.id}.png`); + for (const job of missing) { + const png = await fetchLabel(job.zpl); + fs.writeFileSync(path.join(job.dir, `${job.id}.png`), png); + console.log(` ${job.id}.png`); await new Promise((r) => setTimeout(r, RATE_LIMIT_MS)); } - console.log(`\nWrote ${missing.length} fixture(s) to ${FIXTURES_DIR}`); + console.log(`\nWrote ${missing.length} fixture(s).`); } main().catch((e: unknown) => { diff --git a/tests/scripts/fetch_labelary_text_fixtures.ts b/tests/scripts/fetch_labelary_text_fixtures.ts index 5254fdb9..206ca199 100644 --- a/tests/scripts/fetch_labelary_text_fixtures.ts +++ b/tests/scripts/fetch_labelary_text_fixtures.ts @@ -25,19 +25,18 @@ import * as fs from 'fs'; import * as path from 'path'; import { textTestCases } from '../fixtures/textTestCases'; - -const FONT_PATH = path.resolve('src/assets/fonts/PrintLabZPL-Bold.ttf'); +import { PRINTLAB_FONT_PATH } from '../lib/printLabFont'; const FIXTURES_DIR = path.resolve('tests/fixtures/labelary_text_images'); const FONT_UPLOAD_URL = 'http://api.labelary.com/v1/fonts'; const RENDER_URL = 'http://api.labelary.com/v1/printers/8dpmm/labels/4x4/0/'; const RATE_LIMIT_MS = 1000; async function uploadFont(): Promise { - const file = fs.readFileSync(FONT_PATH); + const file = fs.readFileSync(PRINTLAB_FONT_PATH); const form = new FormData(); form.append('file', new Blob([file]), 'PrintLabZPL.ttf'); form.append('path', 'R:PRINTLAB.TTF'); - console.log(`Uploading ${FONT_PATH} (${file.length} bytes) to Labelary...`); + console.log(`Uploading ${PRINTLAB_FONT_PATH} (${file.length} bytes) to Labelary...`); const res = await fetch(FONT_UPLOAD_URL, { method: 'POST', body: form }); if (!res.ok) { throw new Error(`Font upload ${res.status}: ${await res.text()}`); diff --git a/tests/scripts/report_font0_glyph_drift.ts b/tests/scripts/report_font0_glyph_drift.ts new file mode 100644 index 00000000..9f2a8072 --- /dev/null +++ b/tests/scripts/report_font0_glyph_drift.ts @@ -0,0 +1,125 @@ +/* + * Per-glyph ink drift report: PrintLab ZPL (our Font-0 substitute) vs + * Labelary's default CG Triumvirate render, over the full coverage set + * (tests/fixtures/font0GlyphCoverageCases.ts). + * + * Decision tool for font-pipeline work: advance widths are already baked + * into the TTF, so what this surfaces is glyph SHAPE drift. + * + * Run: pnpm dlx tsx tests/scripts/report_font0_glyph_drift.ts + * (fetch fixtures first via fetch_labelary_default_text_fixtures.ts) + */ +import * as fs from 'fs'; +import * as path from 'path'; +import { PNG } from 'pngjs'; +import { zplAnchorToModel } from '@zplab/core/lib/labelGeometry/textPositionTransforms'; +import { font0GlyphCoverageCases } from '../fixtures/font0GlyphCoverageCases'; +import { darkBBox } from '../lib/darkBBox'; +import { drawKonvaText } from '../lib/drawKonvaText'; +import { inkCanvas } from '../lib/inkCanvas'; +import { + PRINTLAB_FONT_FAMILY, + registerPrintLabZpl, +} from '../lib/printLabFont'; + +const FIXTURES_DIR = path.resolve('tests/fixtures/labelary_text_default_images'); + +// Production placement: ^FO anchor -> zplAnchorToModel -> Konva line +// placement, so dY reads as real on-canvas position drift, not harness +// offset. +function renderLocal(tc: (typeof font0GlyphCoverageCases)[number]) { + const { canvas, ctx } = inkCanvas(); + const model = zplAnchorToModel( + tc.x, + tc.y, + { fontHeight: tc.fontHeight, rotation: tc.rotation }, + 'FO', + ); + drawKonvaText(ctx, { + text: tc.text, + x: model.x, + y: model.y, + fontSizePx: tc.fontHeight, + fontFamily: PRINTLAB_FONT_FAMILY, + fontStyle: 'bold', + }); + return darkBBox(PNG.sync.read(canvas.toBuffer('image/png'))); +} + +function main(): void { + registerPrintLabZpl(); + + interface Row { + id: string; + char: string; + dW: number; + dH: number; + dY: number; + relW: number; + relH: number; + local: ReturnType; + labelary: ReturnType; + } + const rows: Row[] = []; + const missing: string[] = []; + + for (const tc of font0GlyphCoverageCases) { + const fixture = path.join(FIXTURES_DIR, `${tc.id}.png`); + if (!fs.existsSync(fixture)) { + missing.push(tc.id); + continue; + } + const labelary = darkBBox(PNG.sync.read(fs.readFileSync(fixture))); + const local = renderLocal(tc); + rows.push({ + id: tc.id, + char: tc.text[0] ?? '', + dW: local.width - labelary.width, + dH: local.height - labelary.height, + dY: local.y - labelary.y, + relW: labelary.width > 0 ? (local.width - labelary.width) / labelary.width : 0, + relH: labelary.height > 0 ? (local.height - labelary.height) / labelary.height : 0, + local, + labelary, + }); + } + + rows.sort((a, b) => Math.abs(b.relW) - Math.abs(a.relW)); + + console.log('char local WxH labelary WxH dW dH dY relW% relH%'); + for (const r of rows) { + const flag = Math.abs(r.dW) > 6 || Math.abs(r.dH) > 6 || Math.abs(r.dY) > 6 ? ' <<<' : ''; + console.log( + `${r.char.padEnd(5)} ${`${r.local.width}x${r.local.height}`.padEnd(11)} ` + + `${`${r.labelary.width}x${r.labelary.height}`.padEnd(14)} ` + + `${String(r.dW).padStart(3)} ${String(r.dH).padStart(3)} ` + + `${String(r.dY).padStart(3)} ` + + `${(r.relW * 100).toFixed(1).padStart(6)} ${(r.relH * 100).toFixed(1).padStart(6)}${flag}`, + ); + } + + const outliers = rows.filter( + (r) => Math.abs(r.dW) > 6 || Math.abs(r.dH) > 6 || Math.abs(r.dY) > 6, + ); + const moderate = rows.filter( + (r) => + !outliers.includes(r) && + (Math.abs(r.dW) > 3 || Math.abs(r.dH) > 3 || Math.abs(r.dY) > 3), + ); + console.log(`\n${rows.length} glyphs measured at h=50 (char x3).`); + console.log( + `Outliers >6 dots (box-match tolerance): ${outliers.length}` + + (outliers.length ? ` -> ${outliers.map((r) => r.char).join(' ')}` : ''), + ); + console.log( + `Moderate 4-6 dots: ${moderate.length}` + + (moderate.length ? ` -> ${moderate.map((r) => r.char).join(' ')}` : ''), + ); + if (missing.length) { + console.log( + `\nWARNING: ${missing.length} fixture(s) missing, run the fetch script: ${missing.join(', ')}`, + ); + } +} + +main();