Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Grouping rects in a <g> #27

Merged
merged 4 commits into from
Sep 15, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 62 additions & 28 deletions src/QRgen/private/DrawedQRCode/print.nim
Original file line number Diff line number Diff line change
Expand Up @@ -36,30 +36,55 @@ const svgHeader: string =
"""<path class="qrLight" fill="{light}"""" &
""" d="M-5,-5h{size+10}v{size+10}h-{size+10}Z"></path>"""

const svgEnd: string = "</svg>"
const svgEnd: string =
"""</svg>"""

const modulePath: string =
const moPath: string =
"""M{x},{y}h1v1h-1Z"""

const modulePathStart: string =
const moPathStart: string =
"""<path class="qrDark" fill="{dark}" d=""""

const modulePathEnd: string =
const moPathEnd: string =
"\"></path>"

const moduleRect: string =
"""<rect class="qrDark qrRounded qrModule"""" &
""" fill="{dark}" x="{x.float32+moSep:<3}" y="{y.float32+moSep}"""" &
const moRect: string =
"""<rect""" &
""" x="{x.float32+moSep:<3}" y="{y.float32+moSep}"""" &
""" width="{1-moSep*2}"""" &
""" height="{1-moSep*2}"""" &
""" rx="{moRadPx}"""" &
"""></rect>"""

const alignmentPatternRect: string =
"""<rect class="qr{m} qrRounded qrAlignment"""" &
""" fill="{c}" x="{x}" y="{y}" width="{size}" height="{size}"""" &
const moRectGroupStart: string =
"""<g fill="{dark}" class="qrDark qrRounded qrModules">"""

const moRectGroupEnd: string =
"""</g>"""

const alRect: string =
"""<rect""" &
""" x="{x}" y="{y}" width="{s}" height="{s}"""" &
""" rx="{r}"></rect>"""

const alRectGroupStart: string =
"""<g class="qrRounded qrAlPatterns">"""

const alRectGroupEnd: string =
"""</g>"""

const alRectDarkGroupStart: string =
"""<g class="qrDark" fill="{dark}">"""

const alRectDarkGroupEnd: string =
"""</g>"""

const alRectLightGroupStart: string =
"""<g class="qrLight" fill="{light}">"""

const alRectLightGroupEnd: string =
"""</g>"""

type
Percentage = range[0f32..100f32]
Separation = range[0f32..0.4f32]
Expand Down Expand Up @@ -90,27 +115,36 @@ func printSvg*(
drawRegion 7'u8, size, size-7, size, s
if moRad or forceUseRect:
let moRadPx: float32 = (0.5 - moSep) * moRad / 100
drawQRModulesOnly moduleRect
result.add fmt(moRectGroupStart)
drawQRModulesOnly moRect
result.add moRectGroupEnd
else:
result.add fmt(modulePathStart)
result.add fmt(moPathStart)
if alRad:
drawQRModulesOnly modulePath
drawQRModulesOnly moPath
else:
drawRegion 0'u8, size, 0'u8, size, modulePath
result.add fmt(modulePathEnd)
drawRegion 0'u8, size, 0'u8, size, moPath
result.add fmt(moPathEnd)
if alRad or forceUseRect:
let alRadPx: float32 = 3.5 * alRad / 100
template innerRadius(lvl: range[1'i8..2'i8]): float32 =
if alRadPx == 0: 0f
elif alRadPx-lvl <= 0: 1f / (lvl * 2)
else: alRadPx-lvl
func drawRoundedRect(x, y, size: uint8, r: float32, m, c: string): string =
fmt(alignmentPatternRect)
template drawRoundedAlPattern(x, y: uint8): string =
drawRoundedRect(x, y, 7'u8, alRadPx, "dark", dark) &
drawRoundedRect(x+1, y+1, 5'u8, innerRadius 1, "light", light) &
drawRoundedRect(x+2, y+2, 3'u8, innerRadius 2, "dark", dark)
result.add drawRoundedAlPattern(0'u8, 0'u8)
result.add drawRoundedAlPattern(size-7, 0'u8)
result.add drawRoundedAlPattern(0'u8, size-7)
template innerRadius(lvl: static range[0'i8..2'i8]): float32 =
when lvl == 0: alRadPx
else:
if alRadPx == 0: 0f
elif alRadPx-lvl <= 0: 1f / (lvl * 2)
else: alRadPx-lvl
func drawRoundedRect(x, y: uint8, s, r: float32): string = fmt(alRect)
template drawAlPatterns(lvl: range[0'i8..2'i8], c: untyped) {.dirty.} =
template s: float32 = 7-lvl*2
template r: float32 = innerRadius(lvl)
result.add fmt(`alRect c GroupStart`)
result.add drawRoundedRect(0'u8+lvl, 0'u8+lvl, s, r)
result.add drawRoundedRect(size-7'u8+lvl, 0'u8+lvl, s, r)
result.add drawRoundedRect(0'u8+lvl, size-7+lvl, s, r)
result.add `alRect c GroupEnd`
result.add alRectGroupStart
drawAlPatterns 0, dark
drawAlPatterns 1, light
drawAlPatterns 2, dark
result.add alRectGroupEnd
result.add svgEnd