From 70056ea73c71dc191d0f21f10464c109a87619fd Mon Sep 17 00:00:00 2001 From: Kostiantyn Ko Date: Sun, 1 Sep 2024 12:25:02 +0300 Subject: [PATCH 1/2] Selectively apply prettier to codebase --- .prettierrc | 3 ++- src/png.ts | 33 +++++++++++++++++++++------------ src/svg.ts | 9 ++++++--- src/utils.ts | 20 ++++++++++---------- 4 files changed, 39 insertions(+), 26 deletions(-) diff --git a/.prettierrc b/.prettierrc index 34e457d..b5d90ce 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1,6 @@ { "tabWidth": 4, "useTabs": false, - "singleQuote": false + "singleQuote": false, + "printWidth": 120 } diff --git a/src/png.ts b/src/png.ts index 6410e56..09d00f2 100644 --- a/src/png.ts +++ b/src/png.ts @@ -1,13 +1,13 @@ import { ImageOptions, Matrix } from "./typing/types"; import { QR } from "./qr-base.js"; -import { createSVG } from './svg.js'; +import { createSVG } from "./svg.js"; import { getOptions } from "./utils.js"; import sharp from "sharp"; export async function getPNG(text: string, inOptions: ImageOptions = {}) { - const options = getOptions({...inOptions, type: 'png'}); + const options = getOptions({ ...inOptions, type: "png" }); const matrix = QR(text, options.ec_level, options.parse_url); - return generateImage({ matrix, ...options, type: 'png' }); + return generateImage({ matrix, ...options, type: "png" }); } export async function generateImage({ @@ -24,25 +24,34 @@ export async function generateImage({ const marginPx = margin * size; const imageSize = matrix.length * size + marginPx * 2; if (size > 200) { - throw new Error('Module size is too big, resulting image is too large: ' + imageSize); + throw new Error("Module size is too big, resulting image is too large: " + imageSize); } const svg = await createSVG({ - matrix, size, margin, color, bgColor, - imageWidth: imageSize, imageHeight: imageSize, + matrix, + size, + margin, + color, + bgColor, + imageWidth: imageSize, + imageHeight: imageSize, borderRadius, }); const qrImage = sharp(svg); const layers: sharp.OverlayOptions[] = []; if (logo) { - const sharpLogo = sharp(logo).resize(Math.round(imageSize * logoWidth / 100), Math.round(imageSize * logoHeight / 100), {fit: 'contain'}); - const data = await sharpLogo.toBuffer() + const sharpLogo = sharp(logo).resize( + Math.round((imageSize * logoWidth) / 100), + Math.round((imageSize * logoHeight) / 100), + { fit: "contain" } + ); + const data = await sharpLogo.toBuffer(); layers.push({ input: data, - }) + }); qrImage.composite(layers); } - const { data } = await qrImage.png({ - palette: !logo, // no logo results in much less colors - }).toBuffer({ resolveWithObject: true}); + const { data } = await qrImage + .png({ palette: !logo }) // no logo results in much less colors + .toBuffer({ resolveWithObject: true }); return new Uint8ClampedArray(data.buffer); } diff --git a/src/svg.ts b/src/svg.ts index 9e70960..503b670 100644 --- a/src/svg.ts +++ b/src/svg.ts @@ -1,15 +1,18 @@ import { QR } from "./qr-base.js"; import { ImageOptions, Matrix } from "./typing/types"; import { getOptions, colorToHex, getSVGPath } from "./utils.js"; -import { Base64 } from 'js-base64'; +import { Base64 } from "js-base64"; interface FillSVGOptions - extends Pick { + extends Pick< + ImageOptions, + "color" | "bgColor" | "size" | "margin" | "borderRadius" + > { blockSize?: number; } export async function getSVG(text: string, inOptions: ImageOptions = {}) { - const options = getOptions({...inOptions, type: "svg"}); + const options = getOptions({ ...inOptions, type: "svg" }); const matrix = QR(text, options.ec_level, options.parse_url); return createSVG({ matrix, ...options }); } diff --git a/src/utils.ts b/src/utils.ts index 8c1b47e..6c83607 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -25,24 +25,24 @@ export function getSVGPath(matrix: Matrix, size: number, margin: number = 0, bor const topY = y * size + margin; const bottomY = (y + 1) * size + margin; const rectangle = []; - rectangle.push(`M ${leftX} ${topY + borderRadius}`) - rectangle.push(`L ${leftX} ${bottomY - borderRadius}`) + rectangle.push(`M ${leftX} ${topY + borderRadius}`); + rectangle.push(`L ${leftX} ${bottomY - borderRadius}`); if (borderRadius > 0) { - rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX + borderRadius} ${bottomY} `) + rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX + borderRadius} ${bottomY}`); } - rectangle.push(`L ${rightX - borderRadius} ${bottomY}`) + rectangle.push(`L ${rightX - borderRadius} ${bottomY}`); if (borderRadius > 0) { - rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX} ${bottomY - borderRadius}`) + rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX} ${bottomY - borderRadius}`); } - rectangle.push(`L ${rightX} ${topY + borderRadius}`) + rectangle.push(`L ${rightX} ${topY + borderRadius}`); if (borderRadius > 0) { - rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX - borderRadius} ${topY}`) + rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${rightX - borderRadius} ${topY}`); } - rectangle.push(`L ${leftX + borderRadius} ${topY}`) + rectangle.push(`L ${leftX + borderRadius} ${topY}`); if (borderRadius > 0) { - rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX} ${topY + borderRadius}`) + rectangle.push(`A ${borderRadius} ${borderRadius} 0 0 0 ${leftX} ${topY + borderRadius}`); } - rectangle.push(`z`) + rectangle.push(`z`); rectangles.push(rectangle.join(" ")); } } From 66a127d9bba86d4c2695084d015a093a30cacd81 Mon Sep 17 00:00:00 2001 From: Kostiantyn Ko Date: Sun, 1 Sep 2024 15:12:48 +0300 Subject: [PATCH 2/2] Clear the QR code underneath the logo --- src/matrix.ts | 21 +++++++ src/pdf.ts | 40 +++++++----- src/png.ts | 25 +++++--- src/png_browser.ts | 45 ++++++++----- src/svg.ts | 59 ++++++++++-------- .../golden/browser_qr_logo_arraybuffer.pdf | Bin 18864 -> 18716 bytes .../golden/browser_qr_with_border_radius.svg | 2 +- test_data/golden/browser_qr_with_logo.png | Bin 1229 -> 1273 bytes .../browser_qr_with_logo_as_arraybuffer.svg | 2 +- ...rowser_qr_with_logo_as_arraybuffer_jpg.svg | 2 +- test_data/golden/browser_qr_with_logo_jpg.png | Bin 1455 -> 1390 bytes test_data/golden/qr_logo_arraybuffer.pdf | Bin 13586 -> 13438 bytes test_data/golden/qr_logo_arraybuffer_jpg.pdf | Bin 18864 -> 18716 bytes test_data/golden/qr_with_border_radius.svg | 2 +- test_data/golden/qr_with_logo.pdf | Bin 13586 -> 13438 bytes test_data/golden/qr_with_logo.png | Bin 2177 -> 2063 bytes test_data/golden/qr_with_logo.svg | 2 +- .../golden/qr_with_logo_as_arraybuffer.svg | 2 +- .../qr_with_logo_as_arraybuffer_jpg.svg | 2 +- test_data/golden/qr_with_logo_jpg.png | Bin 3130 -> 2901 bytes 20 files changed, 129 insertions(+), 75 deletions(-) diff --git a/src/matrix.ts b/src/matrix.ts index fa6da66..96e0bad 100644 --- a/src/matrix.ts +++ b/src/matrix.ts @@ -391,3 +391,24 @@ export function getMatrix(data: Data) { return matrix.map((row) => row.map((cell) => cell & 1)); } + +export function clearMatrixCenter(matrix: Matrix, widthPct: number, heightPct: number): Matrix { + matrix = matrix.map((x) => x.slice()); // avoid mutating input arg + + // TODO: Here's a homegrown formula, perhaps could be simplified + const mW = matrix.length; + const cW = Math.ceil(((mW * widthPct) / 100 + (mW % 2)) / 2) * 2 - (mW % 2); + const mH = matrix[0]?.length ?? 0; + const cH = Math.ceil(((mH * heightPct) / 100 + (mH % 2)) / 2) * 2 - (mH % 2); + + // Given the formula, these must be whole numbers, but round anyway to account for js EPSILON + const clearStartX = Math.round((mW - cW) / 2); + const clearStartY = Math.round((mH - cH) / 2); + + for (let x = clearStartX; x < clearStartX + cW; x += 1) { + for (let y = clearStartY; y < clearStartY + cH; y += 1) { + matrix[x][y] = 0; + } + } + return matrix; +} diff --git a/src/pdf.ts b/src/pdf.ts index 799bfb1..5bbc0e0 100644 --- a/src/pdf.ts +++ b/src/pdf.ts @@ -3,12 +3,18 @@ import { QR } from "./qr-base.js"; import { ImageOptions, Matrix } from "./typing/types"; import { getOptions, getSVGPath } from "./utils.js"; import colorString from "color-string"; +import { clearMatrixCenter } from "./matrix.js"; const textDec = new TextDecoder(); export async function getPDF(text: string, inOptions: ImageOptions) { const options = getOptions(inOptions); - const matrix = QR(text, options.ec_level, options.parse_url); + + let matrix = QR(text, options.ec_level, options.parse_url); + if (options.logo && options.logoWidth && options.logoHeight) { + matrix = clearMatrixCenter(matrix, options.logoWidth, options.logoHeight); + } + return PDF({ matrix, ...options }); } @@ -17,18 +23,14 @@ function colorToRGB(color: string | number): [number, number, number] { const [red, green, blue] = colorString.get.rgb(color); return [red / 255, green / 255, blue / 255]; } - return [ - ((color >>> 24) % 256) / 255, - ((color >>> 16) % 256) / 255, - ((color >>> 8) % 256) / 255, - ]; + return [((color >>> 24) % 256) / 255, ((color >>> 16) % 256) / 255, ((color >>> 8) % 256) / 255]; } function getOpacity(color: string | number): number { if (typeof color === "string") { return colorString.get.rgb(color)[3]; } - return ((color % 256) / 255); + return (color % 256) / 255; } async function PDF({ @@ -44,15 +46,19 @@ async function PDF({ matrix: Matrix; }) { const size = 9; + const marginPx = margin * size; + const matrixSizePx = matrix.length * size; + const imageSizePx = matrixSizePx + 2 * marginPx; + const document = await PDFDocument.create(); - const pageSize = (matrix.length + 2 * margin) * size; - const page = document.addPage([pageSize, pageSize]); + const page = document.addPage([imageSizePx, imageSizePx]); page.drawSquare({ - size: pageSize, + size: imageSizePx, color: rgb(...colorToRGB(bgColor)), }); page.moveTo(0, page.getHeight()); - const path = getSVGPath(matrix, size, margin * size, borderRadius); + + const path = getSVGPath(matrix, size, marginPx, borderRadius); page.drawSvgPath(path, { color: rgb(...colorToRGB(color)), opacity: getOpacity(color), @@ -67,13 +73,13 @@ async function PDF({ } else { logoData = await document.embedJpg(logo); } + const logoWidthPx = (logoWidth / 100) * matrixSizePx; + const logoHeightPx = (logoHeight / 100) * matrixSizePx; page.drawImage(logoData, { - x: page.getWidth() / 2 - (logoWidth / 100) * (page.getWidth() / 2), - y: - page.getHeight() / 2 - - (logoHeight / 100) * (page.getWidth() / 2), - width: (logoWidth / 100) * page.getWidth(), - height: (logoHeight / 100) * page.getHeight(), + x: (imageSizePx - logoWidthPx) / 2, + y: (imageSizePx - logoHeightPx) / 2, + width: logoWidthPx, + height: logoHeightPx, }); } return document.save(); diff --git a/src/png.ts b/src/png.ts index 09d00f2..b244d8e 100644 --- a/src/png.ts +++ b/src/png.ts @@ -3,10 +3,16 @@ import { QR } from "./qr-base.js"; import { createSVG } from "./svg.js"; import { getOptions } from "./utils.js"; import sharp from "sharp"; +import { clearMatrixCenter } from "./matrix.js"; export async function getPNG(text: string, inOptions: ImageOptions = {}) { const options = getOptions({ ...inOptions, type: "png" }); - const matrix = QR(text, options.ec_level, options.parse_url); + + let matrix = QR(text, options.ec_level, options.parse_url); + if (options.logo && options.logoWidth && options.logoHeight) { + matrix = clearMatrixCenter(matrix, options.logoWidth, options.logoHeight); + } + return generateImage({ matrix, ...options, type: "png" }); } @@ -22,26 +28,31 @@ export async function generateImage({ borderRadius, }: ImageOptions & { matrix: Matrix }) { const marginPx = margin * size; - const imageSize = matrix.length * size + marginPx * 2; + const matrixSizePx = matrix.length * size; + const imageSizePx = matrixSizePx + marginPx * 2; + if (size > 200) { - throw new Error("Module size is too big, resulting image is too large: " + imageSize); + throw new Error("Module size is too big, resulting image is too large: " + imageSizePx); } + const svg = await createSVG({ matrix, size, margin, color, bgColor, - imageWidth: imageSize, - imageHeight: imageSize, + imageWidth: imageSizePx, + imageHeight: imageSizePx, + logoWidth: logo && logoWidth, + logoHeight: logo && logoHeight, borderRadius, }); const qrImage = sharp(svg); const layers: sharp.OverlayOptions[] = []; if (logo) { const sharpLogo = sharp(logo).resize( - Math.round((imageSize * logoWidth) / 100), - Math.round((imageSize * logoHeight) / 100), + Math.round((matrixSizePx * logoWidth) / 100), + Math.round((matrixSizePx * logoHeight) / 100), { fit: "contain" } ); const data = await sharpLogo.toBuffer(); diff --git a/src/png_browser.ts b/src/png_browser.ts index 0a31dfe..691d007 100644 --- a/src/png_browser.ts +++ b/src/png_browser.ts @@ -1,23 +1,31 @@ import { QR } from "./qr-base.js"; -import { getOptions, colorToHex, getSVGPath } from "./utils.js"; +import { colorToHex, getOptions, getSVGPath } from "./utils.js"; import { ImageOptions, Matrix } from "./typing/types"; import { Base64 } from "js-base64"; +import { clearMatrixCenter } from "./matrix.js"; export async function getPNG(text: string, inOptions: ImageOptions) { const options = getOptions(inOptions); - const matrix = QR(text, options.ec_level, options.parse_url); - return generateImage({ matrix, ...options, type: 'png' }); + + let matrix = QR(text, options.ec_level, options.parse_url); + if (options.logo && options.logoWidth && options.logoHeight) { + matrix = clearMatrixCenter(matrix, options.logoWidth, options.logoHeight); + } + + return generateImage({ matrix, ...options, type: "png" }); } function dataURItoArrayBuffer(dataURI: string) { - return Base64.toUint8Array(dataURI.split(',')[1]); + return Base64.toUint8Array(dataURI.split(",")[1]); } function blobToDataURL(blob: Blob) { return new Promise((resolve, reject) => { try { var a = new FileReader(); - a.onload = function(e) {resolve(e.target.result as string);} + a.onload = function (e) { + resolve(e.target.result as string); + }; a.onerror = reject; a.readAsDataURL(blob); } catch (e) { @@ -26,7 +34,6 @@ function blobToDataURL(blob: Blob) { }); } - export async function generateImage({ matrix, size, @@ -39,14 +46,16 @@ export async function generateImage({ borderRadius, }: ImageOptions & { matrix: Matrix }) { const marginPx = margin * size; - const imageSize = matrix.length * size + marginPx * 2; + const matrixSizePx = matrix.length * size; + const imageSizePx = matrixSizePx + marginPx * 2; - const canvas = document.createElement('canvas'); - canvas.width = imageSize; - canvas.height = imageSize; - const context = canvas.getContext('2d'); + const canvas = document.createElement("canvas"); + canvas.width = imageSizePx; + canvas.height = imageSizePx; + const context = canvas.getContext("2d"); context.fillStyle = colorToHex(bgColor); - context.fillRect(0, 0, imageSize, imageSize); + context.fillRect(0, 0, imageSizePx, imageSizePx); + const path = new Path2D(getSVGPath(matrix, size, marginPx, borderRadius)); context.fillStyle = colorToHex(color); context.fill(path); @@ -61,13 +70,15 @@ export async function generateImage({ reject(e); } }); + const logoWidthPx = (logoWidth / 100) * matrixSizePx; + const logoHeightPx = (logoHeight / 100) * matrixSizePx; context.drawImage( logoImage, - imageSize / 2 - (logoWidth / 2 / 100) * imageSize, - imageSize / 2 - (logoHeight / 2 / 100) * imageSize, - (logoWidth / 100) * imageSize, - (logoHeight / 100) * imageSize + (imageSizePx - logoWidthPx) / 2, + (imageSizePx - logoHeightPx) / 2, + logoWidthPx, + logoHeightPx ); } - return dataURItoArrayBuffer(canvas.toDataURL('image/png')); + return dataURItoArrayBuffer(canvas.toDataURL("image/png")); } diff --git a/src/svg.ts b/src/svg.ts index 503b670..e248b4a 100644 --- a/src/svg.ts +++ b/src/svg.ts @@ -1,19 +1,21 @@ +import { clearMatrixCenter } from "./matrix.js"; import { QR } from "./qr-base.js"; import { ImageOptions, Matrix } from "./typing/types"; -import { getOptions, colorToHex, getSVGPath } from "./utils.js"; +import { colorToHex, getOptions, getSVGPath } from "./utils.js"; import { Base64 } from "js-base64"; -interface FillSVGOptions - extends Pick< - ImageOptions, - "color" | "bgColor" | "size" | "margin" | "borderRadius" - > { +interface FillSVGOptions extends Pick { blockSize?: number; } export async function getSVG(text: string, inOptions: ImageOptions = {}) { const options = getOptions({ ...inOptions, type: "svg" }); - const matrix = QR(text, options.ec_level, options.parse_url); + + let matrix = QR(text, options.ec_level, options.parse_url); + if (options.logo && options.logoWidth && options.logoHeight) { + matrix = clearMatrixCenter(matrix, options.logoWidth, options.logoHeight); + } + return createSVG({ matrix, ...options }); } @@ -36,53 +38,56 @@ export async function createSVG({ imageWidth?: number; imageHeight?: number; }): Promise { - const actualSize = size || 9; - const X = matrix.length + 2 * margin; - const XY = X * (actualSize || 1); + const actualBlockSize = size || 9; + const matrixSizePx = matrix.length * actualBlockSize; + const marginPx = margin * actualBlockSize; + const imageSizePx = matrixSizePx + 2 * marginPx; const imageWidthStr = imageWidth ? ` width="${imageWidth}"` : ""; - const imageHeightStr = imageHeight ? `height="${imageWidth}" ` : ""; + const imageHeightStr = imageHeight ? ` height="${imageWidth}"` : ""; const xmlTag = ``; - const svgOpeningTag = ``; + const svgOpeningTag = ``; + const svgBody = getSVGBody(matrix, { color, bgColor, - size: XY, + size: imageSizePx, margin, - blockSize: actualSize, + blockSize: actualBlockSize, borderRadius, }); const svgEndTag = ""; - const logoImage = logo ? getLogoImage(logo, XY, logoWidth, logoHeight) : ""; + const logoImage = logo ? getLogoImage(logo, marginPx, matrixSizePx, logoWidth, logoHeight) : ""; - return te.encode( - xmlTag + svgOpeningTag + svgBody + logoImage + svgEndTag - ); + return te.encode(xmlTag + svgOpeningTag + svgBody + logoImage + svgEndTag); } function getSVGBody(matrix: Matrix, options: FillSVGOptions): string { const path = getSVGPath(matrix, options.blockSize, options.margin * options.blockSize, options.borderRadius); - let svgBody = - ``; - svgBody += ''; + let svgBody = ``; + svgBody += ``; return svgBody; } function getLogoImage( logo: ImageOptions["logo"], - XY: number, + marginPx: number, + matrixSizePx: number, logoWidth: ImageOptions["logoWidth"], logoHeight: ImageOptions["logoHeight"] ): string { const imageBase64 = `data:image/png;base64,${Base64.fromUint8Array(new Uint8Array(logo))}`; + const logoWidthPx = (logoWidth / 100) * matrixSizePx; + const logoHeightPx = (logoHeight / 100) * matrixSizePx; return ( `` + + `x="${marginPx + (matrixSizePx - logoWidthPx) / 2}" ` + + `y="${marginPx + (matrixSizePx - logoHeightPx) / 2}">` + `` ); } diff --git a/test_data/golden/browser_qr_logo_arraybuffer.pdf b/test_data/golden/browser_qr_logo_arraybuffer.pdf index 98e75ab1d525427e1d29a554870fc08789fdfb0b..562ddf31718f32c8fd63b434fe2dd7de518d9bbc 100644 GIT binary patch delta 3971 zcmX|?cQ_kd8^-NDg4kMn)!USYR?J#a-WsL0nkBTT)tC`mVzs0#V%2&}L&Yo&Ej3#N z)mpJ?1r=MVqF?&G-}U|XJNJ2>=Zxpv*TG|G3$kgSKNRVUpWhX4N&w=ts z<$j6&;guI?sC+`qnZ4A66a@+pb9-PDVd9k~Zqw9?I6uLiS0jI){i@yDf8+XluU2=3 ztXs7Gj9lD)PB_ktfnyVdsNnfmMqO!^2T7%0yW1FPqJct4$=3$BcKe5*#s= zIRNsUffrw-Hc9pGpmow=WYKYi9`12x9Elo0O@R+M1eU zn^Q=|*a7DMEMXv6DiU)oHLCe&2bk#doL#hM!^nY$drc^g+b>^#;mEn~xHJr@X{<(u z2GlGsRj!IX(-qMrETkB;DF}qCjyQRz#`~$aa-}eV28?$9G4Du$?uCg-Y+;3Y6K_l7 zA1ifh>Uz}ON&W$mQ6{1enkfcr5mV&;{rI|{I%h&x``}w;%RlLsisJaYFOXU-Fl3U@ z5l6K|(M>N8apvAadl^Tql21sP8id;*>%6&AXm2#7aPc6v@G_9U9{tE8Fb0ImKx6>;61`3r9NOZ8VNPw z;FpD1d{UO$!TZN|bcS5;?BWVgzpl5i5Yc(;VKGx8L#A#lO*_cyDRNnBzBl{=x|}j& z%z$$EwG$-H3BMrPM`Um2+AXzMP}$cJex6qtHt7gTRiRQ2lao>pK>RHuh*K`7aMA2d>oe~KmR%5=(OQPUfj zUYI82G=-&Jul3eF4WRTpfl|933L#}6av}?x{rWR%WilOx^sy_YLf|r)KwldC9?hVdxc>K$DTCc?2?hx@K5^#bp#f`}4$H`=_{R z2)-Ni+v}fjvJD_A!*7$6G&$uK!$A7V(y_!g8p(y8eEy6lyg4NZdZWAc;r#17vPQ2R zLl3pf4_1TRX2AIP7EjHvAuX=-6y`1*QH<1zqx?@d$SdiKtBYbeHOquNg&~@y8l8bPNjoq9mMnYu!PIklnM^h&5cN8yiT#-&W{V96~@WN!=vhW)Qa*0s}k z7oX|sS*d<*90XE6p~1h_Rd&wxO%@N77qrs|s`YQ3foJ^@0xg397tq<=`P^{>n`N;H z+2kPE6y~5j6njrDje-=I)``|1aP6^@KjGO1@6eK9X{5wdqQZDlNFaF`Rq(-ETWvuT z;%Hri$Jw^kAeo}&`|M~@U6qELL2l8Vmlk>h#xxwk=<80@cMJ)UyUn9<(4AT)*gYgO z{Y)6RQ-N;D>yGedV(jqI_mSI8zP<1{apcw_XIV#u9v zg}G;4pI$wO<}>_TI))^$QOF)=Assj%uz}&E!g7>;WiVM4g$OaT{~)q-$TfNl?s|tz zQ-%x}xwr3J-O29`@r8c}jB9pl&VP8}%XP24;bhsUMK^!xtThsLh)x(;52;2tZdd!k zk!Wb~Y#;UmzELR=p>zA;DbtYxc2>v4#|{-%&e%ByB*K%{U|jf)3dK|k+pc*!6;3E@ z?)&)csjxhMm05nek30G#f=GGzz?Rt5FFjdM}GB z%!9aG@Uv)$-#?T8cInHz4i2>AYsjCSRe42lFB=DIwcsrvQxvs^L4*D21cy}E0bmf& zZadAewI(^o!S0N`p&f~$&u6Y1%1`Mej~cXP3C5POR+P!d0pk^4Lc#3D!yATA`|lWt zUdakQsMhggE5!bUMB0j9OEMoi71PFvRv2;3q9K@&)u?NBKn(=(-dh7CB3wX2EhO@w zJQ|+HB~^fhXh+&6RmUE6i6q3$M%DZ7s_vmhl5-OIvzZ^dNJy$1 z;{?T$R<9BYW68pcOqbNzxVMFv%E`hWvAoe6D{l9D{V6J6&}@>;%-A^Ag#E#dgbL-K zSnJ3l2Lymm&MG8$7zxI4gLL{bE9qz7Q8>N^-q=BD)GP_MQjAe~0G`+viVbHhyU9j? zU^A07V^o;NnR&QU(viMe#PuM}9~a$l$-i#C;w6b3Eh|1YJd(!ob$Wc#ZpT`GeVh~N zDRJxBDxNA@m{KpmT z0*Ha5V!B;a$mE?P%K#i^JaQL%HL6L*rG>>Ao7LiIg^9`-(h!U5{#t)kJ+hJa+X3X) z>^FGw$ql*0KC&~5g_U@JqIt0=x#w$r{gm_VHN#gt6XgMkxny%=&8y!cn{xCESObhL zf^i>jrkntgu_L}Ar_OI3t#tC0s0~Z|cHe=2Ifd+GoOYGJ>udcht#r#fIoB^HydoqE zq15rJPgTbrO_a}7vLUc}j$nO+5C7Gbkj;+P2e#rr5@mc>mtH#v!|Xzpvn~%oTBxF2 zqWK@Na{V9ts|dIKJ5`Jfk#ICYoEb!3=JoP60X+pbhZe@Rk9D)CMEo3Mad_pORans5F}7Y*~%`z|I4dZCZ>lgBgGgd_&~!Q3==-Q;xWr{YSm9A@22 z1(;z-y#_vEAv!x`4`OUv9Lb}hHm3bAATkSMLhc<_36}8Pldv?IMG0Gs#>uBzQwDdf z)a8$1+quc>R-@A$}EV0TI4hnv86F-B`LPB=*43pN6th z;?vfb565x7XmmintHS<%=O4B{0Ri5vWJ&klPj`=nrxowaahJr=SBk}_Dq(8 zVTX!BC1YgOZrQ3&%U@Ahzq2~`rihlDL5t$TE~;2lcTEF?sWl6jHv=Jms3F4uA3vF)FbJ8`i+SK7kel1l~`sJgnv_&r-IH4#foC*T%7b)yE?* z>AbBwkZd$T(D0X*38Sb5XfB1`@2xtl)`?ABDnq|q;^?gYO!&nXRYlSUJ_Ip>8c407 z1(G5(9i8K+e7Ull&Kg7jbMWJYnxB~Izb7N$1(N28>*6e>4fb;PXY*k}v-{Cr(AP(;0e7LnMNjrkSz1B-BR!ozk@x3jD`3RmF yd2~BCP!;{2hOr(qaI*$LW|5hZqhsY3XJVr9R-!+`piIPB)s)rQWMz#kp#K5az_@t; delta 4135 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 \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/browser_qr_with_logo.png b/test_data/golden/browser_qr_with_logo.png index 2130aa2aa08662a26b60066f1ace503541a99098..1402e88c1b8370b5138d1969a8ebe97ff9c1b664 100644 GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^?I6s-1|)5sdx0bvi-X*q7}lMWc?smO6gzo_Z~#FK zM@k2fyV%pkF{EP7+q?VoMcgHheJn3j`K~bWTB?rLgH;^6c}x_Rx&-{-_i%sxzio1m ztKgCaj3=+j`Lcv)w6l14h?ppd3%V)UoAEN9p7;EnZJLeo^PhDp-q)(~%gerIeEWLm zU5+`=;RJ^RD=+an?B!rrImFmm;P6Xr%ZAsx{^$zs`C7E%tl`$OSH%KZ-fy4JoX0Hm zu))PbL6FbmV3Uc;afemg9Zm<>c2LZi=i$&#Hg9oVzTUkcdX7dEvDe@mdC&CdES6*Z0E;fpUNq_fL?T2elLGz zrN>MOd2U6hQ&)c8XJvBy&s;^r-x9vZi?{#J_`B@S?XB72x%v6|&z`GKZZH16aEeyJ z-q)tqtcU&6&)>c_v)K6h&g$>x#>TgA?3l7Lv^4YECL?_b_OE}B=*8@)So3ye;N*uh zN;L!L*;Ll(QXaXp?$_?tYx!Fxwu&A8`0Mff zrL#Af%;G-Yum4^qvTVb?1L9{}onQX$T)Sq?lsvc4O?!aey8cA-&6_u~bR*KI>`FIl zSF7%;Jp8KG{$bGNEQ>Qg_j=#=&nYc6^{&pkl4J2E*kN1T-Pt?O{r%0qY3p(`-}b|2 z-n?utH=EV>_U(Q7Csu3YlA0cV=v#2K=9={;38{zPwoTb-Wlw+V8|#~9XJ-c<-`z9o zy(OQt@9}ScH_z|a*I260j!4@SKchBIcqDsR`c7`z2&y~4|jPa z{-`&QTYG=Y{p(`=jl_| zWBk5-|K7h;cWbtu%;J|f*6sUIy6}9=zCVXIZe5;swiW2+v+?h9O=NHXxGQgb-MV6R zLU$9tsqW+8M{$<>tokk4O}8#RIgi;6mWEa9gM(LY7kR4DQY_>CYFmrJTj52(d;yjY zxjK7R64$;N?cIK-R%E_1LrQZeZ4K)*S9U*^5q|spMqFR`(o0C`@$?q|I7_wD=QqZ$ zzY?5TdHwS?Vm?mYYQ@TIn%(p$iJ^s4Xp4qtwVOr3qN{`|d zD+TyIip^TOtT;(7$VC~N?lpe|2q%1znb8W(=}Z1IB!0R0X>F*_bYStt;OXk;vd$@? F2>@-ORGt6; literal 1229 zcmeAS@N?(olHy`uVBq!ia0vp^?I6s-1|)5sdx0bvi-X*q7}lMWc?smO6gzo_Z~#FK zM@k2fTkh%N7*a9k?Oj8EX+w!)h4Nb7R~bW-G?bl{qs&$r34E(-)-(9jX=QY2Yy2Wk z=~#`W9)CF&a(hqry57j<_=x>px9siC|Mr?fOP`#J=$|8gf9~BaxwowjB&(J)2k0GQ z>@09ll9@2?=f0aJzQ3k%T&ucy{n>;l>oWNtw}Ptdjf+6C9PBEG7*9q|__bt)$5ycn z%`X3JM#?x~Bv}Zp#GL%$$wscGH&@q&@+e1lAN3;20G&Q8Y-WO-BD)b+F9& zu8B~KfYQ&Jwk%OUwASezb8qdQ8?41#Jy1siee+3diR#&!Uq|XVG|jUAPrY{@Nseol zBCqC;B=PQ@T?cOD`W4z_%Nrp1aF0Pbo*MI+YGMR_%F#G?wwtvO3dN-Fx>^EMb8(UjlTv4r4 zu5sQ_s`pNYNzv`w`FC&Knq@O>sjcR`Tm5&xht{p>X-+IH{CJqReR*-V|H@T7>^ZBV z_qg^-{r>%T_xk?6zGeUR-@iXQd$-q-6NZ93&*xa%*_HkMH!nIi_UyG~LMk_{Opg1! zI`_2m=ibQ=C2rrXwJ)xomo@)a+=*K&V>Y=Pfnw%^PtwD%(uX_#{XYKt@4*BQ4>gds zqp3x!`S(lyZFwyTVDIu+Oyj05wH90ZNd85ud8eApI4juCRerI z+G$g1q7oh+{_K8bWQcu{4^W^`Kkikvd6tufP1RxlowEa24l%AgRZy~5cum;7f+KoA z)*S!*ch1&=w?QJ?a;;6hr6zCP@NJ{mgN^4O2H!pLaqIVw?_O_S%bf4=OmdEE(B0go z^Wn?hzuVN3SX^A}r>hlSs(gHnnOWS^Jg1_ot%t2r>*9OO#do__JUV+kNFjRJk>m2} zuPUwu_{3FnzHGiR{bTd3O=}(o1l`NAvWpQc#aFUx8HLY{wjodV(mozEqLTYs)12!1Hn6kgQtoJj=>ENdla6ff?#v`z(gzCmN3nK=bPt{`E|aA0ED5^bS}gF?hQAxvX \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/browser_qr_with_logo_as_arraybuffer_jpg.svg b/test_data/golden/browser_qr_with_logo_as_arraybuffer_jpg.svg index c116a1f..6f00f54 100644 --- a/test_data/golden/browser_qr_with_logo_as_arraybuffer_jpg.svg +++ b/test_data/golden/browser_qr_with_logo_as_arraybuffer_jpg.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/browser_qr_with_logo_jpg.png b/test_data/golden/browser_qr_with_logo_jpg.png index 4ec7593fcad989cc01c6375c2a0af9334da31fdf..8753ec7e536232d8ddf730f3cc2013b42c6e4625 100644 GIT binary patch literal 1390 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 diff --git a/test_data/golden/qr_logo_arraybuffer.pdf b/test_data/golden/qr_logo_arraybuffer.pdf index ad41297d9e79a26bd1c6c193e1e0b4ba5df4cd27..558c7118521f70a1e8113366b088a8a4bc432d93 100644 GIT binary patch delta 3973 zcmX|?cQ_kd8^+b%g4kMn)!P)I6?;Z`Yn0k*me8VBV@7O=)uJt8)p|=q#Vif2O^cvf zD^{(bVk=ejOTYKKzW;vbKF{-<@tpfQSr0C}pF(I(?Dz30;W9ru64PkW{jw;OW&UijsYcgNJ(X)se; z{w3Zd4g~hbTLPXx_KD2zmoR7=m}+T9Ci}fBdQSu-lZnv4kst7dAk_GcM`bOr$mVuuT(JlMoMJ!@h&jI`vr?o@1~(WC&xN}EQfEt-r})S|4C^mQr$>}1of|3 zS*~0Yey%O3jbBXGZQyz8nN{RDTZDmiU2MrqT{bSaV4BZbE7Tv}Oa3$Q4z&(-g zQP*~_yPNa_BB?+?9X6Bo*Tbht0|#++Kef*JmHOe^Wh+0amy2R~dM*=N&9g~F{$ti^ z(V|ADf2NE9sCI+K|= z)$0CZNb6}b+Q1?WT@4np8Ia$?)7xGV^}S-t)iUIqc_Sr`me*^PQCxMzKipV>*x%=?9t8cuXn%)VD@zNmPhCGaAzRCGMrpk;7txEok1KK`5&tom^!=uX=PFQBq> z#Z0j09=L*Ah_NY z){}A{d7Or1Q*Ze;8$eyxAG?>>)S}O{dJsne)dWf$Lm!)zC{MBl)9Os}6Co3wt1nIB zbDBa^Zq|BfpZSvq96>4FkNA<25NW~1tpUARl`_c=1DcrCQhsomWPlG9Zl7vT*JANA z6>M5=o{?E$j0)B&>o6jVE-95H8PoO&h@weIlRP|$B~3kapyC>ehvh{=uH7^23&uKvo<~@n-x2GhOxN$tA^lk?&Ssk7~n7_y} zzm#V!Z?APz`HRo+@%}CW*>_LSy3q+(Lwd&r)B8AZK-V|Sn9CU|`_Yb&=jBRwiBAw6 ztsyqQ#kh~n-23w?y>xyY+u(}F95@n}-+1G<3HNG8y!{fp0w=5Pg_7P(!Ws#B-@;D) zBHJ+@>NTwvs+0rj&ej#;%_t4kq>)GUI|zIv(Jg0a28nH3Ap4>rFwB1~vZ0yEwe(zD z*HZa&;}DSi2@U?Wp}2dYXS{T%u&9}eSFV5O1Uw%I=WQACzl_f6$>)e2+$xKS&msj% zB{Kx(p;&rzsbs~$mmDwo0d72z_rpKmc|GA?^mHBGdfw7|Np}`MCyd@+Vk_&Y&?OYux48malsRu^^Mk>%RHpF-knFH- z+3%4PG=|)bX@DFCMudg3-Wbz038n=Qrew0`7i~OjUpk z8oIUbD(&X?1pC0h118ja)EBy5`mo<`Z#Z2sY|+kNK5vbH9iih#H-f7X4m;Jpa3mU9 zJlBuu!Zpe#Ahhm0I-@_9#ms3Ld)uNy%jr7DfdqKsI*c9HQ6ZN?X5KSPqrfSd+3f(A zH65Dgr#Qz${c%^1h}Q}{aCRks+Uz+mn^-)A@NH{UWtieJ9mjyTZ#T+gh3;pvhq@D1 z3Vs$1^Y~@(+$nu^&))vh#5(e4XH{Mi+|%0LN+oC;NFPb5q2FM4Hpwa;dI%T-wA;+k zZm)~Yv$8m0bTlJSH2Dm5!}-abq%r-rOum>hriwC|SYVvoD=3)7Xk^pi*}z?Wq3f9; zht*oX%!QbrkO&)*8;NGaXTq9Tp$bFxIW#0YcrEgVEl>?Xxc^Qci3sCWQwfeZERTYx zvWpjBAes?2iPbU3-GcG43*kwwHXBXZ*f ziEB#u!Wfdk68%+GW{w?x`f`$hdkk09=Bn$1K0mVJ7c{e2GXo};DgIz+GrmIMC&ntG z$Q}XUmbMHI8bN}w93ZX!j7plh_hiGD7LR}pCYcd8f}Eb3s4$OQ~eV*(@b@K`g&OzQ};c`<%zqmio=`o;ULOLAzh)dML5 zk9GeU^7RV*l1~%Yl1}w*&S!G_lGIrhWn_>`n0nPN)h=H|b5%@DJmGEm+tBo!-B(j4 zjQODr!CNY2RkTp!C2L!~EtQ-uS$l-Z-|L4EHn-cGR!AqkS8JsLQrINieh2*3T9%L$ zmZr{gZ*KkCt3RB9syp!yNn^{?OR3!IcwhD~E$fSuciDZFn7>$lKzCGmW@L>KEH3N+ z6_4bi+`@f8t*fj@a_)Ov<4(a~+KrOQ;)fC_aF38r!>?|?#YaPcizr7l!z^=sQIKW> z@^n-p2#>Uzye&7CL`vzv|5|LnrSdH*HDluCB zQt(Z&;ZNRX>XSTc{p$E<8|73_A$mgwY2oDA%V8#A8G!V<7N57lp^HA>AbP@68icuT zBdpim`qzZT%(i}|35ELVeis%4z0^bc%HZf~f)fIKVXo?XuF_gG)3GHOR?{B(g6t7U zy&5ilF)Ax~A7W%v9KorkGOqbAATkQ0gYO?z@s)7j7qu{+LkXCV#mb~uk%#syRb@_K zJGs@m69i%V^p6m^3Fr9gLP*x>ME%p~VIDEWzcV}crwJBpflDF+&dL}QH+6l4i4`N5D;*(oBqt!2iwPhSEJV%{ z%}jCrH!9zsAk}Sn6nB%|2MeuNe>zIgXQ*9TpyYS#{@hyP@Xp?iNX%slzchkjthGh; zA?6y1Wiyg(&SLXT;sHM5|H7g@_qQYFKrwPy0Dcz!hT)&cS9kxIbf)#n?v_A_mMg_p zV^~`o8Ou(F4})Y_2-Vxd6400H1n-VACS*ckti>P44)cGN$9~esLQT%@kUJ`!?GYWo zekiw5O>!>NU%I8r6>p9Je5FakHb{6xtp!f9N2lYgB`D{g!{#D`&UWAoIfVF$&^Xa> z>M9X(Dy%;4F!ISO*s#P3Y)}LH`V?B=AMhZl@~E1gb#}DOZQXNhSR&~(f|J-``Ek2}jwSyBf%#jsHyv1gxNOuQU1LK(YS%^CuxR{i1$1q_-#F{ z#jYCMmJ%}r(iK9)Bp6fVWR#I}OeR-!cJ8L}o6FhKm0$Iaie8jvKp4veT8+q2+in7i zH%}crPm)fs#lBr9v(1KNRwtk>bz%=|*{!Dr8qS}0)=kMmAJ2~qfzvHXqC(a)72?X# zg@IVw{KW?L)y#bH6!3l!xHuNG+BpXAh(u?dHtig>*gbnak^nF|<_KlInIidR$2yea`!wi&*7XGqvm3_>Q-mu*rvT z$&;Aj%A|?z+B1%evj-PnDb9vwCIyuasQ1q(^9zG3?k?D@?m`%w zc>pAY`kTaJ=2F=LHW%(geUcHLQm^1CSn>^%N5J^7+)#@^*W!&!ZIgI+gJM{ZTkD`y zuXfy{d7Ary6H^b#@5`zF{v`@oef8aboJ|Uynw712f%CE^?4}*PUT|5rRLRH;MRI=b zE?b`f!V|Q1oF=xjr5xn^zXGc{fs2DM#A(~NPvW~QSp0=_}^z+E}9)!{I*%9x!U zj}OuWwUJIb0lRHq1nu?F4P$*B?!rpNJWu4}LA!N)prfGOxzvqCxQ8dCAJInh_$}r` zdjTH+yQ_Fvr~g9=9SFAajd-7X6D}H)%Bja|pJ%ury?-BEkeZwQxkZD}zxnqldv5OM zWH1cg``y!c)AJJDnBB80OpE2IcgO>|o%K1pU^4G1-q2W9cY^pEs3n<13p4BsEmgB= z5=jO57MMn(M3Qdsa%o9jWzM-=c?9nc1HiLxlJLN(jaI^g>)S@ClNP&KJV&?@{St}E zrpjLgUCl|~|KYAiuT5?0_(NvJpmN{ou%lukrD-h}{yS(_E8$@-`Cy+!r#0+0g`Oj$(F zoWk#ap?B{NGC?t>Ct+&6>>|g{NA)Tv@5cFIol5&d?~U8Nq#7O9ZrxxQ@illom6Qzj zE(~|qKy}96_`04-D&%_bB1v(?zM|A0k!LH@aTpug?vBK7))*2$claNlQ#!oSI)$J< z&w_YBpPaVX0amQ=j%VfP>AlcQ9)5G%FYdx@(-PWZovJ9Iym2;%t}JwnwaYjq1f#@X z8K(KqCk$gyhU{y4`DY))=A^9I$9p?2oPpW*Be(vDvwh87G%31C#m*`^08Fw-^cqB* z0t0f(FdHs~vi85A+6bQc zYI?q6`JTay6%=AlH7KxsZ*aV@f|3~73hwkM8~FY!$bE^g7W4uNc&KCu-CAHIb?+x4 z>asm9D;vt~kcN(YzSN$2_7ie^j?!8DDZ6kXvHiJd-P8D|(4@tJOyibzlJIjRm1MOF zH6#i038tXj)30g+%_I-_>;Fq0t+K=!j3@(wC1MHhKwWh!kXdPXZUKHelluoR#Kok{ z&AjXwsQVMt(}2Q_U;i;-+tr0`$erIe2+OyRt z3rZS-4%I4IBQu8ggujh;p;rOCS4eGUMNZhzgn2^SnUQNmiWrVpAkZ*xv!BCBOWO#I zZNFhzv_Bw4$53Y6?r_P0JvuwUFMn3}x}lkpcF?-xn8!3~%bCufJ2bt{h+mNk$wXzQ zTJ#Jf(fLY&vH*`g^$maQKZLI^lxvr5NM%1o;uP^36r*3#nx(;KtQ_8)tM6=fr18$$Kzoy}! z$@gV4NF{U*>1ZC&oF2sBSYpwL^0eZNG=IqhyFE^tkq4x9h`5^5MRlYOv`nNFJ!wo( zmG<|tsJ6MJS>n_PR8=Y6I9N^~FGPzLz)aO6wY9pC8+Uknb=Ea9@ouea(ws6$rdm}5 zU7Jc`+SC(sGx;we>_DN@Jv#@a4M*=wzw+^lG|IZp(Sqh zt&hstdu6g}{8|;%rf9A+VBO3MpYpr4@OccR#o}(aw;H_+C{>TpYOz$-r;r)x_wXU; zlR%p{zxr6ST~8MukNF6~{2j-K!1c-HbVu_Zs{UTJc$ucTI>vZ7Qhh3m9WDlM=3%^Y zzdOf;F?}85&>C7FeT*txM#Fv0vNYKg15E`@97v}OHRxpQjz*+m*cB0Id~Oc%Z*fm2 z*M>Z?r4c|mZ@BowT1@6$!Q;pC9d&VeZw6shtnVk0u2ZNLu>FpX+REeg*ZYi>FWygY z?Gt}s7uRwLt(TB00}juBO~Hpi@w*t2 z24T3qzVV*sBa@$PKInrr-5e7SemzW)p)G@sW-=hXmXACOx(}la2Gbopu+@HxUMKBf z`NTIGM`?RL1jB_vegrSn=x+p+^9yR)o2wRyem`ZkFTB?pB&tXPD|)IyX!vRT*ur?{ z5?qvAOQou0vygl8yGShRNC?NG*uLi^c~|9T?Lz^HCeT@>#S`w|3HHGDDnbG~$E#%EzMEkkB%j(?UB|IJLU}7MqkI!iRYg60qsutW z`}=ZzG;`SAYuY3>#M_rE@hYv;PXag>1|LxZ@65U`6IyYskUYd7YS(McNykTa2uczu z4Cipyh`;a>g3eO2uZRyB08n)Zp72gyr3oWj+iH?9b$UCZ z8CW*+zHOE@aaj>jAc)m@nWnosHY;n`TOwFyg`X?_u#}lF9ynWd;yTNxbNwi(R8gjT zxzT;JBThU&qK{)!$<;qwL{9#TNtJJa1kYjjR_xegL!I@RW6~|q^dtSao3rlCa>~0w zqbyO5r_z5TON;+0bRNK)w8+XI-uQp4W?YvyJ$%H+(rJ_4i{-kw57&(yslE{s%PdN>@4cc*V)2 zvy;hWf`nKf+E~8eS6)SCg0LS5j`dzgZInAideYs$_kthTe8~V<-u%S2*x58haQnnj z6C>71Z5pvfR+sIiEC`ulonltD9I#X(>NrWs#q+osAU`FJ2ZE_qg3}X+b{`$Aapsu7 z=7_!Pqc>26pQhI3GfRASC6xcx@nk)GIlmkWa75~pHa{}mw(Eu9}iBSVGbO*az-C=?^gn# zx#+R`C4nglQ{Ihbe9Em~hELBymWhXeL%W+2Piuf^ke)u_I;M!_991ZKkCVsL_BSss z5_0S@w=`Jt?5r%FQY$0i2BwI{?)XaZ;#X;bZwCz0m-i?#V=tFAx z?1k}Ep`T3~Ce*EZxSj5u?Ou3=ksfc#+HY@|Z+|wOpGbrfQc#U$uDa7{6TW8r&LIY| zm2zbVr4oN;u$=msuNjj==Q>Rx8i=?*w5|%Kf7pe1A7Zj$VZF)`bl2Umw=aB5^nlzn zA_gr$T0mJu8uf(})u&`vV`4=!V_;Oc+dE&(?-e%8saJZ4yQR)eyeBe_kdblJE!T$? z;Jw!1>X0G?DYCu!wtb?S$msr;K4!pU>zc+T2qq$i@uVfFQMPu_Jq*ATx_Jx@S_*97 zgTi&?B$fApbe*l2B9Dw=S)WqJ!@XnI-Ugc}WaKCowC%WkFo7kL*if$!Px)D$+j{&M zvn)wgMOGLW?C^1>aZd%hAQpx*e6yf5bd1_3Tnuk6J^i@kj|2!Q1;>^{{1-MC2S*pj zF0+`%%!!JXl^urjy_U8Mior)eG7|#@*{ao;_k{o{1|*Wf!}FQL0~ZGG^zl3Th88VCrJj}$5YirYHHlB)&W z5m4hXiqj@fq$j@M-{ClRX|A*Eu8`m2;1iF+hlq81)Nd$9PkZ*Y5PY^a%w+BH|1PTCE967|Ireoc~!A@uSm;e^l1>7zTVE?aXKysoPN zvB6gCcjXFx9{+uwhK12`S+~)vu_dRL*4}0bs?M3P`|I5b=M1CZM_-{e=;-ZyP2u9e zpR24k+h_hu>SwCy6`I^I^=Zxpv*TG|G3$kgSKNRVUpWhX4N&w=ts z<$j6&;guI?sC+`qnZ4A66a@+pb9-PDVd9k~Zqw9?I6uLiS0jI){i@yDf8+XluU2=3 ztXs7Gj9lD)PB_ktfnyVdsNnfmMqO!^2T7%0yW1FPqJct4$=3$BcKe5*#s= zIRNsUffrw-Hc9pGpmow=WYKYi9`12x9Elo0O@R+M1eU zn^Q=|*a7DMEMXv6DiU)oHLCe&2bk#doL#hM!^nY$drc^g+b>^#;mEn~xHJr@X{<(u z2GlGsRj!IX(-qMrETkB;DF}qCjyQRz#`~$aa-}eV28?$9G4Du$?uCg-Y+;3Y6K_l7 zA1ifh>Uz}ON&W$mQ6{1enkfcr5mV&;{rI|{I%h&x``}w;%RlLsisJaYFOXU-Fl3U@ z5l6K|(M>N8apvAadl^Tql21sP8id;*>%6&AXm2#7aPc6v@G_9U9{tE8Fb0ImKx6>;61`3r9NOZ8VNPw z;FpD1d{UO$!TZN|bcS5;?BWVgzpl5i5Yc(;VKGx8L#A#lO*_cyDRNnBzBl{=x|}j& z%z$$EwG$-H3BMrPM`Um2+AXzMP}$cJex6qtHt7gTRiRQ2lao>pK>RHuh*K`7aMA2d>oe~KmR%5=(OQPUfj zUYI82G=-&Jul3eF4WRTpfl|933L#}6av}?x{rWR%WilOx^sy_YLf|r)KwldC9?hVdxc>K$DTCc?2?hx@K5^#bp#f`}4$H`=_{R z2)-Ni+v}fjvJD_A!*7$6G&$uK!$A7V(y_!g8p(y8eEy6lyg4NZdZWAc;r#17vPQ2R zLl3pf4_1TRX2AIP7EjHvAuX=-6y`1*QH<1zqx?@d$SdiKtBYbeHOquNg&~@y8l8bPNjoq9mMnYu!PIklnM^h&5cN8yiT#-&W{V96~@WN!=vhW)Qa*0s}k z7oX|sS*d<*90XE6p~1h_Rd&wxO%@N77qrs|s`YQ3foJ^@0xg397tq<=`P^{>n`N;H z+2kPE6y~5j6njrDje-=I)``|1aP6^@KjGO1@6eK9X{5wdqQZDlNFaF`Rq(-ETWvuT z;%Hri$Jw^kAeo}&`|M~@U6qELL2l8Vmlk>h#xxwk=<80@cMJ)UyUn9<(4AT)*gYgO z{Y)6RQ-N;D>yGedV(jqI_mSI8zP<1{apcw_XIV#u9v zg}G;4pI$wO<}>_TI))^$QOF)=Assj%uz}&E!g7>;WiVM4g$OaT{~)q-$TfNl?s|tz zQ-%x}xwr3J-O29`@r8c}jB9pl&VP8}%XP24;bhsUMK^!xtThsLh)x(;52;2tZdd!k zk!Wb~Y#;UmzELR=p>zA;DbtYxc2>v4#|{-%&e%ByB*K%{U|jf)3dK|k+pc*!6;3E@ z?)&)csjxhMm05nek30G#f=GGzz?Rt5FFjdM}GB z%!9aG@Uv)$-#?T8cInHz4i2>AYsjCSRe42lFB=DIwcsrvQxvs^L4*D21cy}E0bmf& zZadAewI(^o!S0N`p&f~$&u6Y1%1`Mej~cXP3C5POR+P!d0pk^4Lc#3D!yATA`|lWt zUdakQsMhggE5!bUMB0j9OEMoi71PFvRv2;3q9K@&)u?NBKn(=(-dh7CB3wX2EhO@w zJQ|+HB~^fhXh+&6RmUE6i6q3$M%DZ7s_vmhl5-OIvzZ^dNJy$1 z;{?T$R<9BYW68pcOqbNzxVMFv%E`hWvAoe6D{l9D{V6J6&}@>;%-A^Ag#E#dgbL-K zSnJ3l2Lymm&MG8$7zxI4gLL{bE9qz7Q8>N^-q=BD)GP_MQjAe~0G`+viVbHhyU9j? zU^A07V^o;NnR&QU(viMe#PuM}9~a$l$-i#C;w6b3Eh|1YJd(!ob$Wc#ZpT`GeVh~N zDRJxBDxNA@m{KpmT z0*Ha5V!B;a$mE?P%K#i^JaQL%HL6L*rG>>Ao7LiIg^9`-(h!U5{#t)kJ+hJa+X3X) z>^FGw$ql*0KC&~5g_U@JqIt0=x#w$r{gm_VHN#gt6XgMkxny%=&8y!cn{xCESObhL zf^i>jrkntgu_L}Ar_OI3t#tC0s0~Z|cHe=2Ifd+GoOYGJ>udcht#r#fIoB^HydoqE zq15rJPgTbrO_a}7vLUc}j$nO+5C7Gbkj;+P2e#rr5@mc>mtH#v!|Xzpvn~%oTBxF2 zqWK@Na{V9ts|dIKJ5`Jfk#ICYoEb!3=JoP60X+pbhZe@Rk9D)CMEo3Mad_pORans5F}7Y*~%`z|I4dZCZ>lgBgGgd_&~!Q3==-Q;xWr{YSm9A@22 z1(;z-y#_vEAv!x`4`OUv9Lb}hHm3bAATkSMLhc<_36}8Pldv?IMG0Gs#>uBzQwDdf z)a8$1+quc>R-@A$}EV0TI4hnv86F-B`LPB=*43pN6th z;?vfb565x7XmmintHS<%=O4B{0Ri5vWJ&klPj`=nrxowaahJr=SBk}_Dq(8 zVTX!BC1YgOZrQ3&%U@Ahzq2~`rihlDL5t$TE~;2lcTEF?sWl6jHv=Jms3F4uA3vF)FbJ8`i+SK7kel1l~`sJgnv_&r-IH4#foC*T%7b)yE?* z>AbBwkZd$T(D0X*38Sb5XfB1`@2xtl)`?ABDnq|q;^?gYO!&nXRYlSUJ_Ip>8c407 z1(G5(9i8K+e7Ull&Kg7jbMWJYnxB~Izb7N$1(N28>*6e>4fb;PXY*k}v-{Cr(AP(;0e7LnMNjrkSz1B-BR!ozk@x3jD`3RmF yd2~BCP!;{2hOr(qaI*$LW|5hZqhsY3XJVr9R-!+`piIPB)s)rQWMz#kp#K5az_@t; delta 4135 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 \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/qr_with_logo.pdf b/test_data/golden/qr_with_logo.pdf index ad41297d9e79a26bd1c6c193e1e0b4ba5df4cd27..558c7118521f70a1e8113366b088a8a4bc432d93 100644 GIT binary patch delta 3973 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 diff --git a/test_data/golden/qr_with_logo.svg b/test_data/golden/qr_with_logo.svg index 926310f..31b9276 100644 --- a/test_data/golden/qr_with_logo.svg +++ b/test_data/golden/qr_with_logo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/qr_with_logo_as_arraybuffer.svg b/test_data/golden/qr_with_logo_as_arraybuffer.svg index 926310f..31b9276 100644 --- a/test_data/golden/qr_with_logo_as_arraybuffer.svg +++ b/test_data/golden/qr_with_logo_as_arraybuffer.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/qr_with_logo_as_arraybuffer_jpg.svg b/test_data/golden/qr_with_logo_as_arraybuffer_jpg.svg index c116a1f..6f00f54 100644 --- a/test_data/golden/qr_with_logo_as_arraybuffer_jpg.svg +++ b/test_data/golden/qr_with_logo_as_arraybuffer_jpg.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/test_data/golden/qr_with_logo_jpg.png b/test_data/golden/qr_with_logo_jpg.png index 927a0ce3282883b1fbe57effe2fbbb848baeac76..a92ff38fdb7d3e1ef49345f8036a7f2c7fc6f04d 100644 GIT binary patch delta 2873 zcmYk8c{mha7ssGYa$8 z`}G3VC*7tGOgbxv9&t@DVvkoW6GFo!5+V#cxp}^6pUdA|8*E> zNLP1FMU0ImnL^)1sG0yILlcwUHOV5+Ae|IU)mwFz(4L`QK;#)8W4d}^Pj*X>_<9&i zd>5iHQ^Y06DHv^N$y$ZuyAG-338>u7q$UMrXFX!lHifVl*x&=O^RUN5I>3o2GsNZo zqyd1oNw0f#SyY|l+v?p7gi5rBbTo0-vI@c80cH2tetx@}6BEMOzM}TY_b7nDn>^;4 zhF+dD8*pEoOk2}!u@1KGGA~{WkIS3N%}BSN+~9|`=_o1WHP1=hOJeClWBW9hM7`~d z;Ek!(qKxp8f{buzbW6lhz!bn1gyj9l%ubrwTWg~(5j=r+K+o`J5v;5gSkN8g`GYY- z93Juy;XIdQG&uj`qyL$-?(_J1xg_9z-4J+*RbIDTh(7^gB^!em`LEgeD9ktm&-dOE zr@Bes*w^cidoX%odXnb{n?}1NvPQ;ju!E+%o)Qsr&6P=Ovs9<>T2@wx-bxetaqT(8 z{(1{#dqrNMw?Uuwf~((4+RvUF_KAU~U?&(I!ew$EoqYjv zQT^PE&Lw80=1}KpYM$GXom`=^BkyFhZhS_6Xi)Fw@BZtAm!~IgF8|L7F0ODoUFe5h<1JM#(Th<|V|vWU`x#qcyNJ@bd=e*b zPcl+6Yg+l(NP#lqXUM74~48puyg2&S*^Ot8@Fa0qN3#VPA z=I4L5@gEJ-+#cQVaE{E#%pA=^I_^*PaLU8W!EuFOANk?2Wh)3LX_pn~%n$O{-eeBc zVu5E?7g0$93qEzq-AaV_dA(BF!QZ!o+$Y9)aQXSP3Su})GIWBHj$T@_%5zax z?g9h6X1x{MzBOoNP7aMM%Z6^M`%q+ZDSFD^@9Rd^#2$6i1H_RlU0&(#b@q{UV0ojk zb7rA)M882*Ws7bkv}%a5Yx#$Hv0<|d6X^68t3X0QR*#5StZ`rxpOgPNHISUg6IFde>B?uz5ndoRW}s)U zRY!!^^s?*4VU8%Rr#nL$r_SuY^Ob=O8a1k#w5U@!H`ad5Ln41JO~RxC3-EWPV5>vX zFzwTWv>5_)pxnVhf&C z@$ow(oA?T%HTz_dKq1U>d5HbrJfuj-@B5H?UnRZZRM($?nfXl#dB^_h4yHxcOsp|) z>~$&k=WmW`Rj*C|NMS$?rLh=%i~%_=#)xiqYfdp>!|uy>e2&{qSg8{4ZzZ4dnUxb@ zUE%vF^70Z~)T&lbcov_UhBk_3{LGC>uxwasMn#|(O5uupA`V$^ii6%%RT&&Uc|Isb zbc_3M_fk6YxK>rbJa24oQ02xowMc|icz}kP=0@@n*HRIqvA-Icn+K8uA3Bqn)q#10 zgSfi_nRWy1IZfDUuxb0llw=n*ofd)jb68EAl*moq1!=N)wWcI^u)bC4e^8z^dQjz1M#&548q-sMP7+16@FsU+-UsGRs zUQnv`h(5eg%+wp4Sz3MYg`q2~+ZFG0I~i0l|NDZKA_<@3(J?;QR>E$yZ{Oxaq9rw9 zIg!&``=Z-myU&ZSifXaBSd%~>^rKuV8lfCF(H~oSH?{evWYSH-u&_TpUd82LC?xqE zwC(ZMn;fWpgspK2^aB|o3`rBkh)wx-W;AJ4g17#bjUYSz&ycW{Lmy86g}gk<|jmWrK5LSppLOm4}} z#WGN&y8g(*ksKaI9ij*wwxjXS{3DW_VvCRtRxtOmwSL!_^7*GXs6?Yn$M#@Vb5;DW+GuJY<>lMSe-3sp0DP4Q zl5W_aWSlswC<|fs4$#~hFkJ}DS83&_&CuNhis9-8+qH-vR~|sS2AIkMzBfVaJyu~M zwf7{PgBtdjPu_c0)GRnaZKdt11JsZ}BFbN4GkttjuK4YX(F$nN`~8f3W@Y`SZbFMn zu1mHvmywEv!Ng9<2U(|w8^s;rOGMMHaSKjvhaf!ZF6G0V85)<}viMwruq0|PC%AQ^ zc~*qM*_-QK&EgzZ-{ub%495Ji=ua{?N1R{EgiqOu4pVrO9pD{mGJW;4;p<@#&Gb_c z{%98GwCc3#@SC4YgC`G^=`2+k(Jm2{-POKM)$sxbC%L59O{aiV_g0YV6o7F=9iE5+ z+DrjVoX}Gu&*igb(yg0+m4gWRgG|3`pq+d969`u0XYo%k#!qCf5*J{JIA7MN^-ZeX z(5t=rH=^a1O|PQu_KCw7Ovr(y#-aE>XeLJmo9e=4*Tn~W#Qi>5pHt8jffR7HACgNp+NqF1i9-bmk-^<522~c;j(mx3;>SEE5;+BgVj2x@bu_ zGH_An@US)_kX9X`xl~e2Q6|H2s8zXsQ2t(N{ghox7VafY* T12!0Zgf+~Kt&J)S++zL(3H*rV literal 3130 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 L8LJWtck;gg8u{RN