scroll kinda working now

undo
Saint 2023-03-11 23:31:48 -05:00
parent e0f48e7841
commit 3811dd0a11
17 changed files with 1161 additions and 219 deletions

548
CrownOfThorns.swift Normal file
View File

@ -0,0 +1,548 @@
//
// CrownOfThorns.swift
// gloss
//
// Created by Saint on 3/3/23.
//
import Foundation
import SwiftUI
//
struct MyCustomShape: Shape {
func path(in rect: CGRect) -> Path {
var path = Path()
let width = rect.size.width * 0.1
let height = rect.size.height * 0.1
path.move(to: CGPoint(x: 5.05217*width, y: 9.63163*height))
path.addCurve(to: CGPoint(x: 4.91142*width, y: 9.41742*height), control1: CGPoint(x: 4.98917*width, y: 9.57057*height), control2: CGPoint(x: 4.93701*width, y: 9.48949*height))
path.addCurve(to: CGPoint(x: 4.875*width, y: 9.17718*height), control1: CGPoint(x: 4.88681*width, y: 9.34535*height), control2: CGPoint(x: 4.86811*width, y: 9.22623*height))
path.addCurve(to: CGPoint(x: 4.87697*width, y: 9.13914*height), control1: CGPoint(x: 4.87795*width, y: 9.15616*height), control2: CGPoint(x: 4.87894*width, y: 9.13914*height))
path.addCurve(to: CGPoint(x: 4.63386*width, y: 9.08008*height), control1: CGPoint(x: 4.85039*width, y: 9.13914*height), control2: CGPoint(x: 4.69783*width, y: 9.1021*height))
path.addCurve(to: CGPoint(x: 3.8435*width, y: 8.53253*height), control1: CGPoint(x: 4.38681*width, y: 8.99499*height), control2: CGPoint(x: 4.18799*width, y: 8.85786*height))
path.addCurve(to: CGPoint(x: 3.46654*width, y: 8.19419*height), control1: CGPoint(x: 3.63681*width, y: 8.33734*height), control2: CGPoint(x: 3.54626*width, y: 8.25726*height))
path.addCurve(to: CGPoint(x: 2.91437*width, y: 7.91491*height), control1: CGPoint(x: 3.3061*width, y: 8.06907*height), control2: CGPoint(x: 3.13484*width, y: 7.98298*height))
path.addCurve(to: CGPoint(x: 2.78937*width, y: 7.85686*height), control1: CGPoint(x: 2.82579*width, y: 7.88789*height), control2: CGPoint(x: 2.79921*width, y: 7.87487*height))
path.addCurve(to: CGPoint(x: 2.80118*width, y: 7.9009*height), control1: CGPoint(x: 2.76575*width, y: 7.81381*height), control2: CGPoint(x: 2.77461*width, y: 7.84785*height))
path.addCurve(to: CGPoint(x: 3.11811*width, y: 8.28729*height), control1: CGPoint(x: 2.87598*width, y: 8.05305*height), control2: CGPoint(x: 3.00295*width, y: 8.20721*height))
path.addCurve(to: CGPoint(x: 3.63287*width, y: 8.44845*height), control1: CGPoint(x: 3.27854*width, y: 8.3974*height), control2: CGPoint(x: 3.44094*width, y: 8.44845*height))
path.addLine(to: CGPoint(x: 3.72933*width, y: 8.44845*height))
path.addLine(to: CGPoint(x: 3.88287*width, y: 8.59059*height))
path.addCurve(to: CGPoint(x: 4.03543*width, y: 8.73974*height), control1: CGPoint(x: 3.96654*width, y: 8.66867*height), control2: CGPoint(x: 4.03543*width, y: 8.73574*height))
path.addCurve(to: CGPoint(x: 3.8435*width, y: 8.77878*height), control1: CGPoint(x: 4.03543*width, y: 8.74675*height), control2: CGPoint(x: 3.95866*width, y: 8.76276*height))
path.addCurve(to: CGPoint(x: 3.4252*width, y: 8.77377*height), control1: CGPoint(x: 3.73917*width, y: 8.79379*height), control2: CGPoint(x: 3.51969*width, y: 8.79079*height))
path.addCurve(to: CGPoint(x: 3.13976*width, y: 8.68969*height), control1: CGPoint(x: 3.33858*width, y: 8.75776*height), control2: CGPoint(x: 3.2815*width, y: 8.74174*height))
path.addCurve(to: CGPoint(x: 3.0315*width, y: 8.65866*height), control1: CGPoint(x: 3.0935*width, y: 8.67267*height), control2: CGPoint(x: 3.04528*width, y: 8.65866*height))
path.addCurve(to: CGPoint(x: 2.83366*width, y: 8.76577*height), control1: CGPoint(x: 2.99114*width, y: 8.65866*height), control2: CGPoint(x: 2.8878*width, y: 8.71471*height))
path.addCurve(to: CGPoint(x: 2.66732*width, y: 9.002*height), control1: CGPoint(x: 2.78543*width, y: 8.81181*height), control2: CGPoint(x: 2.66732*width, y: 8.97898*height))
path.addCurve(to: CGPoint(x: 2.65748*width, y: 9.003*height), control1: CGPoint(x: 2.66732*width, y: 9.00901*height), control2: CGPoint(x: 2.66437*width, y: 9.01001*height))
path.addCurve(to: CGPoint(x: 2.63878*width, y: 8.76977*height), control1: CGPoint(x: 2.64075*width, y: 8.98599*height), control2: CGPoint(x: 2.62894*width, y: 8.84284*height))
path.addCurve(to: CGPoint(x: 2.7628*width, y: 8.47247*height), control1: CGPoint(x: 2.65059*width, y: 8.67267*height), control2: CGPoint(x: 2.6811*width, y: 8.5986*height))
path.addCurve(to: CGPoint(x: 2.71752*width, y: 8.38038*height), control1: CGPoint(x: 2.77461*width, y: 8.45345*height), control2: CGPoint(x: 2.77165*width, y: 8.44545*height))
path.addCurve(to: CGPoint(x: 2.5374*width, y: 8.11311*height), control1: CGPoint(x: 2.64665*width, y: 8.29429*height), control2: CGPoint(x: 2.59646*width, y: 8.22022*height))
path.addCurve(to: CGPoint(x: 2.36122*width, y: 7.67768*height), control1: CGPoint(x: 2.47638*width, y: 8.003*height), control2: CGPoint(x: 2.45079*width, y: 7.93994*height))
path.addCurve(to: CGPoint(x: 2.28445*width, y: 7.46146*height), control1: CGPoint(x: 2.3189*width, y: 7.55355*height), control2: CGPoint(x: 2.28445*width, y: 7.45646*height))
path.addCurve(to: CGPoint(x: 2.32776*width, y: 7.61161*height), control1: CGPoint(x: 2.28346*width, y: 7.46547*height), control2: CGPoint(x: 2.30315*width, y: 7.53353*height))
path.addCurve(to: CGPoint(x: 2.37205*width, y: 7.76076*height), control1: CGPoint(x: 2.35236*width, y: 7.69069*height), control2: CGPoint(x: 2.37205*width, y: 7.75776*height))
path.addCurve(to: CGPoint(x: 2.06791*width, y: 7.64665*height), control1: CGPoint(x: 2.37205*width, y: 7.77177*height), control2: CGPoint(x: 2.17323*width, y: 7.6977*height))
path.addCurve(to: CGPoint(x: 1.5935*width, y: 7.27027*height), control1: CGPoint(x: 1.87992*width, y: 7.55556*height), control2: CGPoint(x: 1.69882*width, y: 7.41241*height))
path.addCurve(to: CGPoint(x: 1.53642*width, y: 7.2002*height), control1: CGPoint(x: 1.57087*width, y: 7.23824*height), control2: CGPoint(x: 1.54429*width, y: 7.20621*height))
path.addCurve(to: CGPoint(x: 1.25689*width, y: 7.24825*height), control1: CGPoint(x: 1.50098*width, y: 7.17017*height), control2: CGPoint(x: 1.36516*width, y: 7.19319*height))
path.addCurve(to: CGPoint(x: 1.09547*width, y: 7.35435*height), control1: CGPoint(x: 1.19882*width, y: 7.27828*height), control2: CGPoint(x: 1.18209*width, y: 7.28929*height))
path.addLine(to: CGPoint(x: 1.06004*width, y: 7.38238*height))
path.addLine(to: CGPoint(x: 1.06594*width, y: 7.33534*height))
path.addCurve(to: CGPoint(x: 1.32972*width, y: 6.93994*height), control1: CGPoint(x: 1.08661*width, y: 7.17918*height), control2: CGPoint(x: 1.18602*width, y: 7.03103*height))
path.addCurve(to: CGPoint(x: 1.38287*width, y: 6.88288*height), control1: CGPoint(x: 1.37894*width, y: 6.90991*height), control2: CGPoint(x: 1.3878*width, y: 6.8999*height))
path.addCurve(to: CGPoint(x: 1.3189*width, y: 6.44144*height), control1: CGPoint(x: 1.34154*width, y: 6.73473*height), control2: CGPoint(x: 1.3189*width, y: 6.57958*height))
path.addCurve(to: CGPoint(x: 1.35827*width, y: 6.07107*height), control1: CGPoint(x: 1.3189*width, y: 6.33734*height), control2: CGPoint(x: 1.34547*width, y: 6.08609*height))
path.addCurve(to: CGPoint(x: 1.37303*width, y: 6.01602*height), control1: CGPoint(x: 1.36319*width, y: 6.06507*height), control2: CGPoint(x: 1.37008*width, y: 6.04004*height))
path.addCurve(to: CGPoint(x: 1.36811*width, y: 6.004*height), control1: CGPoint(x: 1.37795*width, y: 5.97397*height), control2: CGPoint(x: 1.37697*width, y: 5.97297*height))
path.addCurve(to: CGPoint(x: 1.34941*width, y: 6.03604*height), control1: CGPoint(x: 1.3622*width, y: 6.02102*height), control2: CGPoint(x: 1.35335*width, y: 6.03604*height))
path.addCurve(to: CGPoint(x: 1.18898*width, y: 5.85085*height), control1: CGPoint(x: 1.33858*width, y: 6.03604*height), control2: CGPoint(x: 1.25295*width, y: 5.93694*height))
path.addCurve(to: CGPoint(x: 0.92028*width, y: 5.26527*height), control1: CGPoint(x: 1.06004*width, y: 5.67768*height), control2: CGPoint(x: 0.94685*width, y: 5.43043*height))
path.addCurve(to: CGPoint(x: 0.84252*width, y: 5.14014*height), control1: CGPoint(x: 0.90945*width, y: 5.1992*height), control2: CGPoint(x: 0.89075*width, y: 5.16917*height))
path.addCurve(to: CGPoint(x: 0.58661*width, y: 5.08509*height), control1: CGPoint(x: 0.77657*width, y: 5.1011*height), control2: CGPoint(x: 0.74606*width, y: 5.09409*height))
path.addCurve(to: CGPoint(x: 0.4311*width, y: 5.06707*height), control1: CGPoint(x: 0.50689*width, y: 5.08108*height), control2: CGPoint(x: 0.43602*width, y: 5.07207*height))
path.addCurve(to: CGPoint(x: 0.59055*width, y: 4.93594*height), control1: CGPoint(x: 0.41831*width, y: 5.05405*height), control2: CGPoint(x: 0.51476*width, y: 4.97497*height))
path.addCurve(to: CGPoint(x: 0.82579*width, y: 4.86887*height), control1: CGPoint(x: 0.66535*width, y: 4.8969*height), control2: CGPoint(x: 0.73228*width, y: 4.87788*height))
path.addLine(to: CGPoint(x: 0.90551*width, y: 4.86186*height))
path.addLine(to: CGPoint(x: 0.91535*width, y: 4.82082*height))
path.addCurve(to: CGPoint(x: 1.24705*width, y: 4.19419*height), control1: CGPoint(x: 0.97933*width, y: 4.56456*height), control2: CGPoint(x: 1.0748*width, y: 4.38338*height))
path.addCurve(to: CGPoint(x: 1.55413*width, y: 3.88388*height), control1: CGPoint(x: 1.29429*width, y: 4.14114*height), control2: CGPoint(x: 1.43307*width, y: 4.001*height))
path.addCurve(to: CGPoint(x: 2.16142*width, y: 2.90591*height), control1: CGPoint(x: 1.97244*width, y: 3.47548*height), control2: CGPoint(x: 2.0561*width, y: 3.34034*height))
path.addCurve(to: CGPoint(x: 2.24902*width, y: 2.74474*height), control1: CGPoint(x: 2.18898*width, y: 2.79179*height), control2: CGPoint(x: 2.20079*width, y: 2.77077*height))
path.addCurve(to: CGPoint(x: 2.53543*width, y: 2.64264*height), control1: CGPoint(x: 2.30217*width, y: 2.71672*height), control2: CGPoint(x: 2.51083*width, y: 2.64264*height))
path.addCurve(to: CGPoint(x: 2.55413*width, y: 2.68068*height), control1: CGPoint(x: 2.55807*width, y: 2.64264*height), control2: CGPoint(x: 2.55906*width, y: 2.64565*height))
path.addCurve(to: CGPoint(x: 2.41732*width, y: 3.23323*height), control1: CGPoint(x: 2.54035*width, y: 2.75776*height), control2: CGPoint(x: 2.45079*width, y: 3.12312*height))
path.addCurve(to: CGPoint(x: 2.4252*width, y: 3.47047*height), control1: CGPoint(x: 2.37106*width, y: 3.38338*height), control2: CGPoint(x: 2.37205*width, y: 3.3974*height))
path.addCurve(to: CGPoint(x: 2.67717*width, y: 3.66567*height), control1: CGPoint(x: 2.47835*width, y: 3.54454*height), control2: CGPoint(x: 2.5689*width, y: 3.61562*height))
path.addCurve(to: CGPoint(x: 2.74213*width, y: 3.71972*height), control1: CGPoint(x: 2.75295*width, y: 3.7017*height), control2: CGPoint(x: 2.75886*width, y: 3.70671*height))
path.addCurve(to: CGPoint(x: 2.41142*width, y: 3.74474*height), control1: CGPoint(x: 2.6939*width, y: 3.75576*height), control2: CGPoint(x: 2.50295*width, y: 3.76977*height))
path.addCurve(to: CGPoint(x: 2.30118*width, y: 3.7027*height), control1: CGPoint(x: 2.38681*width, y: 3.73774*height), control2: CGPoint(x: 2.3376*width, y: 3.71872*height))
path.addCurve(to: CGPoint(x: 2.22146*width, y: 3.67367*height), control1: CGPoint(x: 2.26575*width, y: 3.68669*height), control2: CGPoint(x: 2.22933*width, y: 3.67367*height))
path.addCurve(to: CGPoint(x: 2.16043*width, y: 3.73674*height), control1: CGPoint(x: 2.21358*width, y: 3.67367*height), control2: CGPoint(x: 2.18602*width, y: 3.7017*height))
path.addCurve(to: CGPoint(x: 1.89567*width, y: 4.01902*height), control1: CGPoint(x: 2.13386*width, y: 3.77077*height), control2: CGPoint(x: 2.01476*width, y: 3.8979*height))
path.addCurve(to: CGPoint(x: 1.70472*width, y: 4.21522*height), control1: CGPoint(x: 1.77559*width, y: 4.14014*height), control2: CGPoint(x: 1.68996*width, y: 4.22823*height))
path.addCurve(to: CGPoint(x: 1.73228*width, y: 4.1952*height), control1: CGPoint(x: 1.72047*width, y: 4.2012*height), control2: CGPoint(x: 1.73228*width, y: 4.19319*height))
path.addCurve(to: CGPoint(x: 1.7815*width, y: 4.3974*height), control1: CGPoint(x: 1.73228*width, y: 4.1982*height), control2: CGPoint(x: 1.75492*width, y: 4.28929*height))
path.addCurve(to: CGPoint(x: 1.84941*width, y: 4.71271*height), control1: CGPoint(x: 1.80906*width, y: 4.50651*height), control2: CGPoint(x: 1.83957*width, y: 4.64865*height))
path.addCurve(to: CGPoint(x: 1.9124*width, y: 4.88789*height), control1: CGPoint(x: 1.87303*width, y: 4.85485*height), control2: CGPoint(x: 1.87402*width, y: 4.85786*height))
path.addCurve(to: CGPoint(x: 2.34449*width, y: 4.97598*height), control1: CGPoint(x: 2.01575*width, y: 4.96697*height), control2: CGPoint(x: 2.16831*width, y: 4.999*height))
path.addCurve(to: CGPoint(x: 2.34055*width, y: 5.04204*height), control1: CGPoint(x: 2.40945*width, y: 4.96797*height), control2: CGPoint(x: 2.40945*width, y: 4.97397*height))
path.addCurve(to: CGPoint(x: 1.95768*width, y: 5.1992*height), control1: CGPoint(x: 2.24016*width, y: 5.14114*height), control2: CGPoint(x: 2.10335*width, y: 5.1972*height))
path.addLine(to: CGPoint(x: 1.87106*width, y: 5.2002*height))
path.addLine(to: CGPoint(x: 1.86614*width, y: 5.23524*height))
path.addCurve(to: CGPoint(x: 1.76673*width, y: 5.77578*height), control1: CGPoint(x: 1.84252*width, y: 5.3984*height), control2: CGPoint(x: 1.81988*width, y: 5.52052*height))
path.addCurve(to: CGPoint(x: 1.69882*width, y: 6.71471*height), control1: CGPoint(x: 1.65551*width, y: 6.2993*height), control2: CGPoint(x: 1.64272*width, y: 6.48248*height))
path.addCurve(to: CGPoint(x: 2.1752*width, y: 7.30731*height), control1: CGPoint(x: 1.75689*width, y: 6.95495*height), control2: CGPoint(x: 1.94685*width, y: 7.19119*height))
path.addCurve(to: CGPoint(x: 2.24705*width, y: 7.35135*height), control1: CGPoint(x: 2.21063*width, y: 7.32533*height), control2: CGPoint(x: 2.24311*width, y: 7.34535*height))
path.addCurve(to: CGPoint(x: 2.10039*width, y: 6.95195*height), control1: CGPoint(x: 2.27264*width, y: 7.38639*height), control2: CGPoint(x: 2.1565*width, y: 7.06907*height))
path.addCurve(to: CGPoint(x: 1.72343*width, y: 6.43644*height), control1: CGPoint(x: 2.02756*width, y: 6.7968*height), control2: CGPoint(x: 1.97244*width, y: 6.72172*height))
path.addLine(to: CGPoint(x: 1.6811*width, y: 6.38739*height))
path.addLine(to: CGPoint(x: 1.69685*width, y: 6.25926*height))
path.addCurve(to: CGPoint(x: 1.75*width, y: 6.00801*height), control1: CGPoint(x: 1.71949*width, y: 6.08709*height), control2: CGPoint(x: 1.73425*width, y: 6.01301*height))
path.addCurve(to: CGPoint(x: 2.1752*width, y: 6.44444*height), control1: CGPoint(x: 1.76575*width, y: 6.003*height), control2: CGPoint(x: 2.11516*width, y: 6.36036*height))
path.addCurve(to: CGPoint(x: 2.26476*width, y: 6.50651*height), control1: CGPoint(x: 2.2185*width, y: 6.5035*height), control2: CGPoint(x: 2.22047*width, y: 6.50551*height))
path.addCurve(to: CGPoint(x: 2.62795*width, y: 6.35736*height), control1: CGPoint(x: 2.38484*width, y: 6.50751*height), control2: CGPoint(x: 2.50394*width, y: 6.45846*height))
path.addCurve(to: CGPoint(x: 2.70276*width, y: 6.2993*height), control1: CGPoint(x: 2.66831*width, y: 6.32432*height), control2: CGPoint(x: 2.70177*width, y: 6.2983*height))
path.addCurve(to: CGPoint(x: 2.69587*width, y: 6.36136*height), control1: CGPoint(x: 2.70374*width, y: 6.3003*height), control2: CGPoint(x: 2.70079*width, y: 6.32833*height))
path.addCurve(to: CGPoint(x: 2.45079*width, y: 6.74675*height), control1: CGPoint(x: 2.67618*width, y: 6.49249*height), control2: CGPoint(x: 2.56004*width, y: 6.67467*height))
path.addCurve(to: CGPoint(x: 2.40157*width, y: 6.78278*height), control1: CGPoint(x: 2.42421*width, y: 6.76476*height), control2: CGPoint(x: 2.40157*width, y: 6.78078*height))
path.addCurve(to: CGPoint(x: 2.45276*width, y: 6.91391*height), control1: CGPoint(x: 2.40157*width, y: 6.78478*height), control2: CGPoint(x: 2.42421*width, y: 6.84384*height))
path.addCurve(to: CGPoint(x: 2.57972*width, y: 7.27227*height), control1: CGPoint(x: 2.48031*width, y: 6.98398*height), control2: CGPoint(x: 2.5374*width, y: 7.14615*height))
path.addCurve(to: CGPoint(x: 2.6565*width, y: 7.49049*height), control1: CGPoint(x: 2.62205*width, y: 7.3994*height), control2: CGPoint(x: 2.6565*width, y: 7.4975*height))
path.addCurve(to: CGPoint(x: 3.3002*width, y: 7.68468*height), control1: CGPoint(x: 2.65846*width, y: 7.46446*height), control2: CGPoint(x: 3.11909*width, y: 7.6026*height))
path.addCurve(to: CGPoint(x: 3.43406*width, y: 7.71672*height), control1: CGPoint(x: 3.39075*width, y: 7.72573*height), control2: CGPoint(x: 3.40059*width, y: 7.72773*height))
path.addCurve(to: CGPoint(x: 3.73819*width, y: 7.41241*height), control1: CGPoint(x: 3.54134*width, y: 7.68168*height), control2: CGPoint(x: 3.66535*width, y: 7.55856*height))
path.addLine(to: CGPoint(x: 3.7687*width, y: 7.35335*height))
path.addLine(to: CGPoint(x: 3.78051*width, y: 7.38238*height))
path.addCurve(to: CGPoint(x: 3.79331*width, y: 7.54254*height), control1: CGPoint(x: 3.78937*width, y: 7.4014*height), control2: CGPoint(x: 3.79331*width, y: 7.45946*height))
path.addCurve(to: CGPoint(x: 3.71161*width, y: 7.84785*height), control1: CGPoint(x: 3.79331*width, y: 7.68869*height), control2: CGPoint(x: 3.78248*width, y: 7.72873*height))
path.addLine(to: CGPoint(x: 3.67421*width, y: 7.91191*height))
path.addLine(to: CGPoint(x: 3.75098*width, y: 7.97497*height))
path.addCurve(to: CGPoint(x: 4.16339*width, y: 8.35836*height), control1: CGPoint(x: 3.84646*width, y: 8.05405*height), control2: CGPoint(x: 4.05118*width, y: 8.24424*height))
path.addCurve(to: CGPoint(x: 4.93602*width, y: 8.78779*height), control1: CGPoint(x: 4.4065*width, y: 8.60761*height), control2: CGPoint(x: 4.68406*width, y: 8.76176*height))
path.addCurve(to: CGPoint(x: 5.48031*width, y: 8.67267*height), control1: CGPoint(x: 5.125*width, y: 8.80781*height), control2: CGPoint(x: 5.29626*width, y: 8.77077*height))
path.addCurve(to: CGPoint(x: 5.59744*width, y: 8.61862*height), control1: CGPoint(x: 5.53642*width, y: 8.64264*height), control2: CGPoint(x: 5.58858*width, y: 8.61862*height))
path.addCurve(to: CGPoint(x: 5.42421*width, y: 8.57958*height), control1: CGPoint(x: 5.63878*width, y: 8.61862*height), control2: CGPoint(x: 5.59055*width, y: 8.60761*height))
path.addCurve(to: CGPoint(x: 4.64665*width, y: 8.58959*height), control1: CGPoint(x: 5.10925*width, y: 8.52553*height), control2: CGPoint(x: 4.93602*width, y: 8.52753*height))
path.addCurve(to: CGPoint(x: 4.48031*width, y: 8.60861*height), control1: CGPoint(x: 4.53051*width, y: 8.61461*height), control2: CGPoint(x: 4.50098*width, y: 8.61862*height))
path.addCurve(to: CGPoint(x: 4.21752*width, y: 8.4034*height), control1: CGPoint(x: 4.45472*width, y: 8.5976*height), control2: CGPoint(x: 4.29528*width, y: 8.47247*height))
path.addCurve(to: CGPoint(x: 4.19193*width, y: 8.35936*height), control1: CGPoint(x: 4.18602*width, y: 8.37538*height), control2: CGPoint(x: 4.1811*width, y: 8.36637*height))
path.addCurve(to: CGPoint(x: 4.69783*width, y: 8.23223*height), control1: CGPoint(x: 4.20965*width, y: 8.34735*height), control2: CGPoint(x: 4.5374*width, y: 8.26627*height))
path.addCurve(to: CGPoint(x: 4.9252*width, y: 8.13814*height), control1: CGPoint(x: 4.8622*width, y: 8.1992*height), control2: CGPoint(x: 4.89469*width, y: 8.18519*height))
path.addCurve(to: CGPoint(x: 5.00787*width, y: 7.81081*height), control1: CGPoint(x: 4.97638*width, y: 8.05906*height), control2: CGPoint(x: 5.00197*width, y: 7.95596*height))
path.addCurve(to: CGPoint(x: 5.02067*width, y: 7.67768*height), control1: CGPoint(x: 5.00984*width, y: 7.73774*height), control2: CGPoint(x: 5.01575*width, y: 7.67768*height))
path.addCurve(to: CGPoint(x: 5.14764*width, y: 7.84885*height), control1: CGPoint(x: 5.03445*width, y: 7.67768*height), control2: CGPoint(x: 5.11516*width, y: 7.78679*height))
path.addCurve(to: CGPoint(x: 5.20669*width, y: 8.08408*height), control1: CGPoint(x: 5.18504*width, y: 7.92092*height), control2: CGPoint(x: 5.20669*width, y: 8.00601*height))
path.addCurve(to: CGPoint(x: 5.2126*width, y: 8.17718*height), control1: CGPoint(x: 5.20669*width, y: 8.11812*height), control2: CGPoint(x: 5.20965*width, y: 8.16016*height))
path.addCurve(to: CGPoint(x: 5.25*width, y: 8.20821*height), control1: CGPoint(x: 5.2185*width, y: 8.2042*height), control2: CGPoint(x: 5.22343*width, y: 8.20821*height))
path.addCurve(to: CGPoint(x: 5.71063*width, y: 8.28829*height), control1: CGPoint(x: 5.2874*width, y: 8.20821*height), control2: CGPoint(x: 5.43012*width, y: 8.23323*height))
path.addLine(to: CGPoint(x: 5.92421*width, y: 8.33033*height))
path.addLine(to: CGPoint(x: 6.05512*width, y: 8.20621*height))
path.addCurve(to: CGPoint(x: 6.41634*width, y: 7.89189*height), control1: CGPoint(x: 6.22638*width, y: 8.04505*height), control2: CGPoint(x: 6.28937*width, y: 7.98999*height))
path.addLine(to: CGPoint(x: 6.52067*width, y: 7.81181*height))
path.addLine(to: CGPoint(x: 6.52362*width, y: 7.73173*height))
path.addCurve(to: CGPoint(x: 6.49606*width, y: 7.56657*height), control1: CGPoint(x: 6.52559*width, y: 7.66166*height), control2: CGPoint(x: 6.52165*width, y: 7.63864*height))
path.addCurve(to: CGPoint(x: 6.4124*width, y: 7.4024*height), control1: CGPoint(x: 6.47933*width, y: 7.52052*height), control2: CGPoint(x: 6.44193*width, y: 7.44645*height))
path.addCurve(to: CGPoint(x: 6.37303*width, y: 7.31932*height), control1: CGPoint(x: 6.37795*width, y: 7.34935*height), control2: CGPoint(x: 6.36417*width, y: 7.32132*height))
path.addCurve(to: CGPoint(x: 6.5876*width, y: 7.4014*height), control1: CGPoint(x: 6.39665*width, y: 7.31331*height), control2: CGPoint(x: 6.53543*width, y: 7.36637*height))
path.addCurve(to: CGPoint(x: 6.77756*width, y: 7.6046*height), control1: CGPoint(x: 6.65256*width, y: 7.44344*height), control2: CGPoint(x: 6.74016*width, y: 7.53754*height))
path.addCurve(to: CGPoint(x: 6.81398*width, y: 7.65766*height), control1: CGPoint(x: 6.79331*width, y: 7.63363*height), control2: CGPoint(x: 6.80906*width, y: 7.65766*height))
path.addCurve(to: CGPoint(x: 6.93701*width, y: 7.61662*height), control1: CGPoint(x: 6.81791*width, y: 7.65766*height), control2: CGPoint(x: 6.87303*width, y: 7.63964*height))
path.addCurve(to: CGPoint(x: 7.29331*width, y: 7.51652*height), control1: CGPoint(x: 7*width, y: 7.59459*height), control2: CGPoint(x: 7.16043*width, y: 7.54955*height))
path.addCurve(to: CGPoint(x: 7.55315*width, y: 7.45045*height), control1: CGPoint(x: 7.42618*width, y: 7.48348*height), control2: CGPoint(x: 7.54232*width, y: 7.45445*height))
path.addCurve(to: CGPoint(x: 7.56496*width, y: 7.45646*height), control1: CGPoint(x: 7.56496*width, y: 7.44745*height), control2: CGPoint(x: 7.5689*width, y: 7.44945*height))
path.addCurve(to: CGPoint(x: 7.63287*width, y: 7.45245*height), control1: CGPoint(x: 7.5561*width, y: 7.47047*height), control2: CGPoint(x: 7.58268*width, y: 7.46947*height))
path.addCurve(to: CGPoint(x: 7.61614*width, y: 7.44645*height), control1: CGPoint(x: 7.67815*width, y: 7.43744*height), control2: CGPoint(x: 7.66929*width, y: 7.43443*height))
path.addCurve(to: CGPoint(x: 7.57874*width, y: 7.44945*height), control1: CGPoint(x: 7.59547*width, y: 7.45145*height), control2: CGPoint(x: 7.57874*width, y: 7.45245*height))
path.addCurve(to: CGPoint(x: 7.78445*width, y: 6.89489*height), control1: CGPoint(x: 7.57874*width, y: 7.43143*height), control2: CGPoint(x: 7.72835*width, y: 7.02903*height))
path.addLine(to: CGPoint(x: 7.85138*width, y: 6.73774*height))
path.addLine(to: CGPoint(x: 7.81791*width, y: 6.67467*height))
path.addCurve(to: CGPoint(x: 7.54626*width, y: 6.43043*height), control1: CGPoint(x: 7.76575*width, y: 6.57457*height), control2: CGPoint(x: 7.68996*width, y: 6.50651*height))
path.addLine(to: CGPoint(x: 7.4685*width, y: 6.38939*height))
path.addLine(to: CGPoint(x: 7.51575*width, y: 6.37237*height))
path.addCurve(to: CGPoint(x: 7.93012*width, y: 6.42042*height), control1: CGPoint(x: 7.63976*width, y: 6.32933*height), control2: CGPoint(x: 7.77756*width, y: 6.34535*height))
path.addLine(to: CGPoint(x: 8.02165*width, y: 6.46547*height))
path.addLine(to: CGPoint(x: 8.06791*width, y: 6.4034*height))
path.addCurve(to: CGPoint(x: 8.42913*width, y: 5.95596*height), control1: CGPoint(x: 8.1063*width, y: 6.35335*height), control2: CGPoint(x: 8.33858*width, y: 6.06507*height))
path.addLine(to: CGPoint(x: 8.4498*width, y: 5.93093*height))
path.addLine(to: CGPoint(x: 8.42717*width, y: 5.94995*height))
path.addCurve(to: CGPoint(x: 8.40157*width, y: 5.96496*height), control1: CGPoint(x: 8.41535*width, y: 5.96096*height), control2: CGPoint(x: 8.40354*width, y: 5.96697*height))
path.addCurve(to: CGPoint(x: 8.3376*width, y: 5.73774*height), control1: CGPoint(x: 8.39961*width, y: 5.96296*height), control2: CGPoint(x: 8.37106*width, y: 5.86086*height))
path.addCurve(to: CGPoint(x: 8.22835*width, y: 5.22422*height), control1: CGPoint(x: 8.27756*width, y: 5.51251*height), control2: CGPoint(x: 8.22835*width, y: 5.28128*height))
path.addCurve(to: CGPoint(x: 8.19291*width, y: 5.15816*height), control1: CGPoint(x: 8.22835*width, y: 5.2012*height), control2: CGPoint(x: 8.2185*width, y: 5.18318*height))
path.addCurve(to: CGPoint(x: 7.82776*width, y: 5.05706*height), control1: CGPoint(x: 8.11024*width, y: 5.07908*height), control2: CGPoint(x: 8.00984*width, y: 5.05105*height))
path.addCurve(to: CGPoint(x: 7.69685*width, y: 5.05405*height), control1: CGPoint(x: 7.75591*width, y: 5.05906*height), control2: CGPoint(x: 7.69685*width, y: 5.05706*height))
path.addCurve(to: CGPoint(x: 7.7628*width, y: 4.98599*height), control1: CGPoint(x: 7.69685*width, y: 5.05005*height), control2: CGPoint(x: 7.72638*width, y: 5.01902*height))
path.addCurve(to: CGPoint(x: 8.14173*width, y: 4.83483*height), control1: CGPoint(x: 7.87008*width, y: 4.88488*height), control2: CGPoint(x: 7.99705*width, y: 4.83483*height))
path.addCurve(to: CGPoint(x: 8.22244*width, y: 4.82282*height), control1: CGPoint(x: 8.19587*width, y: 4.83483*height), control2: CGPoint(x: 8.22047*width, y: 4.83083*height))
path.addCurve(to: CGPoint(x: 8.24606*width, y: 4.67968*height), control1: CGPoint(x: 8.22441*width, y: 4.81582*height), control2: CGPoint(x: 8.23524*width, y: 4.75175*height))
path.addCurve(to: CGPoint(x: 8.36713*width, y: 4.16416*height), control1: CGPoint(x: 8.27067*width, y: 4.52052*height), control2: CGPoint(x: 8.35433*width, y: 4.16416*height))
path.addCurve(to: CGPoint(x: 8.37598*width, y: 4.14815*height), control1: CGPoint(x: 8.37205*width, y: 4.16416*height), control2: CGPoint(x: 8.37598*width, y: 4.15716*height))
path.addCurve(to: CGPoint(x: 8.36713*width, y: 4.13814*height), control1: CGPoint(x: 8.37598*width, y: 4.14014*height), control2: CGPoint(x: 8.37205*width, y: 4.13514*height))
path.addCurve(to: CGPoint(x: 7.96358*width, y: 3.72272*height), control1: CGPoint(x: 8.35925*width, y: 4.14314*height), control2: CGPoint(x: 8.04921*width, y: 3.82382*height))
path.addCurve(to: CGPoint(x: 7.80315*width, y: 3.65365*height), control1: CGPoint(x: 7.92126*width, y: 3.67167*height), control2: CGPoint(x: 7.87795*width, y: 3.65365*height))
path.addCurve(to: CGPoint(x: 7.45965*width, y: 3.77778*height), control1: CGPoint(x: 7.69882*width, y: 3.65365*height), control2: CGPoint(x: 7.57579*width, y: 3.6987*height))
path.addCurve(to: CGPoint(x: 7.40551*width, y: 3.81081*height), control1: CGPoint(x: 7.4311*width, y: 3.7968*height), control2: CGPoint(x: 7.4065*width, y: 3.81181*height))
path.addCurve(to: CGPoint(x: 7.45079*width, y: 3.66366*height), control1: CGPoint(x: 7.39764*width, y: 3.8038*height), control2: CGPoint(x: 7.4252*width, y: 3.71471*height))
path.addCurve(to: CGPoint(x: 7.65354*width, y: 3.43143*height), control1: CGPoint(x: 7.49311*width, y: 3.57858*height), control2: CGPoint(x: 7.56988*width, y: 3.48949*height))
path.addCurve(to: CGPoint(x: 7.72638*width, y: 3.37237*height), control1: CGPoint(x: 7.6939*width, y: 3.4024*height), control2: CGPoint(x: 7.72638*width, y: 3.37638*height))
path.addCurve(to: CGPoint(x: 7.66929*width, y: 3.22222*height), control1: CGPoint(x: 7.72638*width, y: 3.36937*height), control2: CGPoint(x: 7.70079*width, y: 3.3013*height))
path.addCurve(to: CGPoint(x: 7.53445*width, y: 2.84685*height), control1: CGPoint(x: 7.63878*width, y: 3.14314*height), control2: CGPoint(x: 7.57776*width, y: 2.97397*height))
path.addLine(to: CGPoint(x: 7.45669*width, y: 2.61461*height))
path.addLine(to: CGPoint(x: 7.27461*width, y: 2.56757*height))
path.addCurve(to: CGPoint(x: 6.95965*width, y: 2.47648*height), control1: CGPoint(x: 7.17323*width, y: 2.54154*height), control2: CGPoint(x: 7.03248*width, y: 2.5005*height))
path.addCurve(to: CGPoint(x: 6.81201*width, y: 2.43243*height), control1: CGPoint(x: 6.88681*width, y: 2.45245*height), control2: CGPoint(x: 6.81988*width, y: 2.43243*height))
path.addCurve(to: CGPoint(x: 6.74409*width, y: 2.45946*height), control1: CGPoint(x: 6.80315*width, y: 2.43243*height), control2: CGPoint(x: 6.77264*width, y: 2.44444*height))
path.addCurve(to: CGPoint(x: 6.51575*width, y: 2.72372*height), control1: CGPoint(x: 6.66437*width, y: 2.5005*height), control2: CGPoint(x: 6.5748*width, y: 2.6046*height))
path.addCurve(to: CGPoint(x: 6.4626*width, y: 2.81381*height), control1: CGPoint(x: 6.48917*width, y: 2.77778*height), control2: CGPoint(x: 6.46555*width, y: 2.81882*height))
path.addCurve(to: CGPoint(x: 6.42717*width, y: 2.6026*height), control1: CGPoint(x: 6.44587*width, y: 2.78579*height), control2: CGPoint(x: 6.42717*width, y: 2.67668*height))
path.addCurve(to: CGPoint(x: 6.48622*width, y: 2.34234*height), control1: CGPoint(x: 6.42717*width, y: 2.5025*height), control2: CGPoint(x: 6.44488*width, y: 2.42643*height))
path.addCurve(to: CGPoint(x: 6.51575*width, y: 2.27928*height), control1: CGPoint(x: 6.50197*width, y: 2.30931*height), control2: CGPoint(x: 6.51575*width, y: 2.28128*height))
path.addCurve(to: CGPoint(x: 6.4498*width, y: 2.23023*height), control1: CGPoint(x: 6.51575*width, y: 2.27728*height), control2: CGPoint(x: 6.48622*width, y: 2.25526*height))
path.addCurve(to: CGPoint(x: 5.93602*width, y: 1.78378*height), control1: CGPoint(x: 6.32874*width, y: 2.14815*height), control2: CGPoint(x: 6.22244*width, y: 2.05706*height))
path.addCurve(to: CGPoint(x: 5.55807*width, y: 1.46647*height), control1: CGPoint(x: 5.75295*width, y: 1.61061*height), control2: CGPoint(x: 5.67126*width, y: 1.54254*height))
path.addCurve(to: CGPoint(x: 4.99016*width, y: 1.3043*height), control1: CGPoint(x: 5.36909*width, y: 1.34134*height), control2: CGPoint(x: 5.20965*width, y: 1.2963*height))
path.addCurve(to: CGPoint(x: 4.56102*width, y: 1.42042*height), control1: CGPoint(x: 4.82283*width, y: 1.31031*height), control2: CGPoint(x: 4.72539*width, y: 1.33734*height))
path.addCurve(to: CGPoint(x: 4.43307*width, y: 1.48148*height), control1: CGPoint(x: 4.49606*width, y: 1.45445*height), control2: CGPoint(x: 4.43898*width, y: 1.48148*height))
path.addCurve(to: CGPoint(x: 4.21555*width, y: 1.43043*height), control1: CGPoint(x: 4.42815*width, y: 1.48148*height), control2: CGPoint(x: 4.33071*width, y: 1.45846*height))
path.addLine(to: CGPoint(x: 4.00689*width, y: 1.37838*height))
path.addLine(to: CGPoint(x: 4.06102*width, y: 1.33433*height))
path.addCurve(to: CGPoint(x: 4.77362*width, y: 0.97197*height), control1: CGPoint(x: 4.28248*width, y: 1.15115*height), control2: CGPoint(x: 4.5374*width, y: 1.02102*height))
path.addCurve(to: CGPoint(x: 4.88091*width, y: 0.93694*height), control1: CGPoint(x: 4.82283*width, y: 0.96196*height), control2: CGPoint(x: 4.87106*width, y: 0.94595*height))
path.addCurve(to: CGPoint(x: 4.97441*width, y: 0.72873*height), control1: CGPoint(x: 4.91437*width, y: 0.90591*height), control2: CGPoint(x: 4.95866*width, y: 0.80681*height))
path.addCurve(to: CGPoint(x: 4.9813*width, y: 0.48048*height), control1: CGPoint(x: 4.99114*width, y: 0.64565*height), control2: CGPoint(x: 4.99311*width, y: 0.56757*height))
path.addCurve(to: CGPoint(x: 4.97638*width, y: 0.42142*height), control1: CGPoint(x: 4.97638*width, y: 0.45045*height), control2: CGPoint(x: 4.97441*width, y: 0.42342*height))
path.addCurve(to: CGPoint(x: 5.04331*width, y: 0.48348*height), control1: CGPoint(x: 4.97835*width, y: 0.41942*height), control2: CGPoint(x: 5.00787*width, y: 0.44745*height))
path.addCurve(to: CGPoint(x: 5.19291*width, y: 0.78078*height), control1: CGPoint(x: 5.12303*width, y: 0.56657*height), control2: CGPoint(x: 5.17224*width, y: 0.66466*height))
path.addCurve(to: CGPoint(x: 5.20472*width, y: 0.90991*height), control1: CGPoint(x: 5.20079*width, y: 0.82783*height), control2: CGPoint(x: 5.20669*width, y: 0.88589*height))
path.addLine(to: CGPoint(x: 5.20276*width, y: 0.95395*height))
path.addLine(to: CGPoint(x: 5.3002*width, y: 0.97698*height))
path.addCurve(to: CGPoint(x: 6.03346*width, y: 1.4024*height), control1: CGPoint(x: 5.56004*width, y: 1.03604*height), control2: CGPoint(x: 5.81594*width, y: 1.18418*height))
path.addCurve(to: CGPoint(x: 6.44291*width, y: 1.77878*height), control1: CGPoint(x: 6.12205*width, y: 1.49049*height), control2: CGPoint(x: 6.31496*width, y: 1.66867*height))
path.addCurve(to: CGPoint(x: 7.15551*width, y: 2.16817*height), control1: CGPoint(x: 6.68406*width, y: 1.98799*height), control2: CGPoint(x: 6.85138*width, y: 2.07908*height))
path.addCurve(to: CGPoint(x: 7.29331*width, y: 2.21622*height), control1: CGPoint(x: 7.22343*width, y: 2.18819*height), control2: CGPoint(x: 7.28543*width, y: 2.21021*height))
path.addCurve(to: CGPoint(x: 7.27461*width, y: 2.16717*height), control1: CGPoint(x: 7.30118*width, y: 2.22222*height), control2: CGPoint(x: 7.29232*width, y: 2.2002*height))
path.addCurve(to: CGPoint(x: 6.68504*width, y: 1.68969*height), control1: CGPoint(x: 7.13681*width, y: 1.91391*height), control2: CGPoint(x: 6.9498*width, y: 1.76276*height))
path.addCurve(to: CGPoint(x: 6.46358*width, y: 1.66667*height), control1: CGPoint(x: 6.62598*width, y: 1.67367*height), control2: CGPoint(x: 6.57677*width, y: 1.66867*height))
path.addLine(to: CGPoint(x: 6.31693*width, y: 1.66466*height))
path.addLine(to: CGPoint(x: 6.17815*width, y: 1.52853*height))
path.addCurve(to: CGPoint(x: 6.04921*width, y: 1.38138*height), control1: CGPoint(x: 6.07677*width, y: 1.43043*height), control2: CGPoint(x: 6.04134*width, y: 1.38939*height))
path.addCurve(to: CGPoint(x: 6.44193*width, y: 1.32833*height), control1: CGPoint(x: 6.07283*width, y: 1.35736*height), control2: CGPoint(x: 6.28051*width, y: 1.32933*height))
path.addCurve(to: CGPoint(x: 6.90256*width, y: 1.4024*height), control1: CGPoint(x: 6.63091*width, y: 1.32833*height), control2: CGPoint(x: 6.73524*width, y: 1.34535*height))
path.addCurve(to: CGPoint(x: 7.06201*width, y: 1.43143*height), control1: CGPoint(x: 7.0128*width, y: 1.44044*height), control2: CGPoint(x: 7.02559*width, y: 1.44244*height))
path.addCurve(to: CGPoint(x: 7.34449*width, y: 1.17117*height), control1: CGPoint(x: 7.15551*width, y: 1.4034*height), control2: CGPoint(x: 7.26476*width, y: 1.3033*height))
path.addCurve(to: CGPoint(x: 7.3937*width, y: 1.1011*height), control1: CGPoint(x: 7.36713*width, y: 1.13313*height), control2: CGPoint(x: 7.38976*width, y: 1.1011*height))
path.addCurve(to: CGPoint(x: 7.40945*width, y: 1.29329*height), control1: CGPoint(x: 7.4065*width, y: 1.1011*height), control2: CGPoint(x: 7.41339*width, y: 1.19019*height))
path.addCurve(to: CGPoint(x: 7.37402*width, y: 1.46647*height), control1: CGPoint(x: 7.4065*width, y: 1.38438*height), control2: CGPoint(x: 7.40256*width, y: 1.4044*height))
path.addCurve(to: CGPoint(x: 7.31398*width, y: 1.58258*height), control1: CGPoint(x: 7.3563*width, y: 1.5045*height), control2: CGPoint(x: 7.32874*width, y: 1.55656*height))
path.addLine(to: CGPoint(x: 7.28543*width, y: 1.62863*height))
path.addLine(to: CGPoint(x: 7.36909*width, y: 1.72172*height))
path.addCurve(to: CGPoint(x: 7.77756*width, y: 2.52553*height), control1: CGPoint(x: 7.53937*width, y: 1.91391*height), control2: CGPoint(x: 7.63878*width, y: 2.10811*height))
path.addCurve(to: CGPoint(x: 7.83071*width, y: 2.66967*height), control1: CGPoint(x: 7.80512*width, y: 2.60661*height), control2: CGPoint(x: 7.82874*width, y: 2.67167*height))
path.addCurve(to: CGPoint(x: 7.78051*width, y: 2.4995*height), control1: CGPoint(x: 7.83366*width, y: 2.66767*height), control2: CGPoint(x: 7.81102*width, y: 2.59059*height))
path.addCurve(to: CGPoint(x: 7.72638*width, y: 2.32833*height), control1: CGPoint(x: 7.75098*width, y: 2.40741*height), control2: CGPoint(x: 7.72638*width, y: 2.33033*height))
path.addCurve(to: CGPoint(x: 8.03543*width, y: 2.44144*height), control1: CGPoint(x: 7.72638*width, y: 2.32032*height), control2: CGPoint(x: 7.95669*width, y: 2.4044*height))
path.addCurve(to: CGPoint(x: 8.48031*width, y: 2.77077*height), control1: CGPoint(x: 8.20079*width, y: 2.51752*height), control2: CGPoint(x: 8.38386*width, y: 2.65365*height))
path.addLine(to: CGPoint(x: 8.53839*width, y: 2.84084*height))
path.addLine(to: CGPoint(x: 8.59843*width, y: 2.84184*height))
path.addCurve(to: CGPoint(x: 8.70177*width, y: 2.82983*height), control1: CGPoint(x: 8.63091*width, y: 2.84284*height), control2: CGPoint(x: 8.67815*width, y: 2.83684*height))
path.addCurve(to: CGPoint(x: 8.93898*width, y: 2.6997*height), control1: CGPoint(x: 8.77264*width, y: 2.80781*height), control2: CGPoint(x: 8.87598*width, y: 2.75075*height))
path.addCurve(to: CGPoint(x: 9.00197*width, y: 2.65465*height), control1: CGPoint(x: 8.97146*width, y: 2.67267*height), control2: CGPoint(x: 9*width, y: 2.65265*height))
path.addCurve(to: CGPoint(x: 8.94488*width, y: 2.86086*height), control1: CGPoint(x: 9.01083*width, y: 2.66466*height), control2: CGPoint(x: 8.97343*width, y: 2.8018*height))
path.addCurve(to: CGPoint(x: 8.74902*width, y: 3.08408*height), control1: CGPoint(x: 8.90748*width, y: 2.93794*height), control2: CGPoint(x: 8.81988*width, y: 3.03704*height))
path.addCurve(to: CGPoint(x: 8.70669*width, y: 3.13213*height), control1: CGPoint(x: 8.7126*width, y: 3.10711*height), control2: CGPoint(x: 8.70177*width, y: 3.12012*height))
path.addCurve(to: CGPoint(x: 8.77559*width, y: 3.38639*height), control1: CGPoint(x: 8.72933*width, y: 3.18819*height), control2: CGPoint(x: 8.7628*width, y: 3.30831*height))
path.addCurve(to: CGPoint(x: 8.78642*width, y: 3.65866*height), control1: CGPoint(x: 8.7874*width, y: 3.45646*height), control2: CGPoint(x: 8.79035*width, y: 3.52052*height))
path.addCurve(to: CGPoint(x: 8.67618*width, y: 4.33133*height), control1: CGPoint(x: 8.78051*width, y: 3.86887*height), control2: CGPoint(x: 8.76772*width, y: 3.94995*height))
path.addCurve(to: CGPoint(x: 8.56594*width, y: 4.95996*height), control1: CGPoint(x: 8.58661*width, y: 4.7047*height), control2: CGPoint(x: 8.57185*width, y: 4.78679*height))
path.addCurve(to: CGPoint(x: 8.62697*width, y: 5.47047*height), control1: CGPoint(x: 8.56004*width, y: 5.13614*height), control2: CGPoint(x: 8.57382*width, y: 5.25626*height))
path.addCurve(to: CGPoint(x: 8.65748*width, y: 5.63063*height), control1: CGPoint(x: 8.64665*width, y: 5.54755*height), control2: CGPoint(x: 8.66043*width, y: 5.61962*height))
path.addLine(to: CGPoint(x: 8.65256*width, y: 5.65065*height))
path.addLine(to: CGPoint(x: 8.66732*width, y: 5.63063*height))
path.addCurve(to: CGPoint(x: 8.81102*width, y: 5.30531*height), control1: CGPoint(x: 8.70177*width, y: 5.58559*height), control2: CGPoint(x: 8.79035*width, y: 5.38438*height))
path.addCurve(to: CGPoint(x: 8.83268*width, y: 5.04505*height), control1: CGPoint(x: 8.83071*width, y: 5.23123*height), control2: CGPoint(x: 8.83366*width, y: 5.1972*height))
path.addCurve(to: CGPoint(x: 8.80512*width, y: 4.78478*height), control1: CGPoint(x: 8.83268*width, y: 4.87988*height), control2: CGPoint(x: 8.83071*width, y: 4.86486*height))
path.addCurve(to: CGPoint(x: 8.69291*width, y: 4.54454*height), control1: CGPoint(x: 8.77362*width, y: 4.68969*height), control2: CGPoint(x: 8.74409*width, y: 4.62663*height))
path.addLine(to: CGPoint(x: 8.65846*width, y: 4.49049*height))
path.addLine(to: CGPoint(x: 8.70669*width, y: 4.28729*height))
path.addCurve(to: CGPoint(x: 8.75886*width, y: 4.08408*height), control1: CGPoint(x: 8.73228*width, y: 4.17518*height), control2: CGPoint(x: 8.75591*width, y: 4.08408*height))
path.addCurve(to: CGPoint(x: 8.95374*width, y: 4.33634*height), control1: CGPoint(x: 8.7687*width, y: 4.08408*height), control2: CGPoint(x: 8.89764*width, y: 4.25025*height))
path.addCurve(to: CGPoint(x: 9.1378*width, y: 4.72973*height), control1: CGPoint(x: 9.03346*width, y: 4.45746*height), control2: CGPoint(x: 9.08268*width, y: 4.56156*height))
path.addCurve(to: CGPoint(x: 9.23031*width, y: 4.91191*height), control1: CGPoint(x: 9.18504*width, y: 4.87087*height), control2: CGPoint(x: 9.18996*width, y: 4.88088*height))
path.addCurve(to: CGPoint(x: 9.55413*width, y: 4.98999*height), control1: CGPoint(x: 9.30413*width, y: 4.96897*height), control2: CGPoint(x: 9.39173*width, y: 4.98999*height))
path.addLine(to: CGPoint(x: 9.6939*width, y: 4.98999*height))
path.addLine(to: CGPoint(x: 9.64272*width, y: 5.04304*height))
path.addCurve(to: CGPoint(x: 9.24213*width, y: 5.2032*height), control1: CGPoint(x: 9.5502*width, y: 5.13914*height), control2: CGPoint(x: 9.37106*width, y: 5.21121*height))
path.addLine(to: CGPoint(x: 9.17618*width, y: 5.2002*height))
path.addLine(to: CGPoint(x: 9.15453*width, y: 5.3003*height))
path.addCurve(to: CGPoint(x: 8.90748*width, y: 5.87487*height), control1: CGPoint(x: 9.1122*width, y: 5.48849*height), control2: CGPoint(x: 9.02362*width, y: 5.69469*height))
path.addCurve(to: CGPoint(x: 8.59252*width, y: 6.28629*height), control1: CGPoint(x: 8.83661*width, y: 5.98398*height), control2: CGPoint(x: 8.78937*width, y: 6.04605*height))
path.addCurve(to: CGPoint(x: 8.04528*width, y: 7.14114*height), control1: CGPoint(x: 8.25197*width, y: 6.7007*height), control2: CGPoint(x: 8.16732*width, y: 6.83283*height))
path.addCurve(to: CGPoint(x: 7.92421*width, y: 7.34535*height), control1: CGPoint(x: 7.9685*width, y: 7.33333*height), control2: CGPoint(x: 7.97441*width, y: 7.32432*height))
path.addCurve(to: CGPoint(x: 7.77854*width, y: 7.3984*height), control1: CGPoint(x: 7.89961*width, y: 7.35636*height), control2: CGPoint(x: 7.83366*width, y: 7.38038*height))
path.addCurve(to: CGPoint(x: 7.68209*width, y: 7.43544*height), control1: CGPoint(x: 7.72343*width, y: 7.41642*height), control2: CGPoint(x: 7.68012*width, y: 7.43343*height))
path.addCurve(to: CGPoint(x: 7.94488*width, y: 7.34635*height), control1: CGPoint(x: 7.68799*width, y: 7.44144*height), control2: CGPoint(x: 7.90059*width, y: 7.36937*height))
path.addCurve(to: CGPoint(x: 7.98917*width, y: 7.31431*height), control1: CGPoint(x: 7.96457*width, y: 7.33634*height), control2: CGPoint(x: 7.98524*width, y: 7.32132*height))
path.addCurve(to: CGPoint(x: 8.07677*width, y: 7.25325*height), control1: CGPoint(x: 7.99311*width, y: 7.30731*height), control2: CGPoint(x: 8.03346*width, y: 7.28028*height))
path.addCurve(to: CGPoint(x: 8.41535*width, y: 6.88188*height), control1: CGPoint(x: 8.22933*width, y: 7.16116*height), control2: CGPoint(x: 8.3435*width, y: 7.03504*height))
path.addCurve(to: CGPoint(x: 8.49114*width, y: 6.54254*height), control1: CGPoint(x: 8.46654*width, y: 6.77177*height), control2: CGPoint(x: 8.48425*width, y: 6.69369*height))
path.addLine(to: CGPoint(x: 8.49705*width, y: 6.41441*height))
path.addLine(to: CGPoint(x: 8.61122*width, y: 6.27728*height))
path.addCurve(to: CGPoint(x: 8.75197*width, y: 6.10611*height), control1: CGPoint(x: 8.67421*width, y: 6.2022*height), control2: CGPoint(x: 8.7372*width, y: 6.12513*height))
path.addCurve(to: CGPoint(x: 8.78346*width, y: 6.07708*height), control1: CGPoint(x: 8.76673*width, y: 6.08709*height), control2: CGPoint(x: 8.78051*width, y: 6.07407*height))
path.addCurve(to: CGPoint(x: 8.83563*width, y: 6.47147*height), control1: CGPoint(x: 8.79823*width, y: 6.09209*height), control2: CGPoint(x: 8.83071*width, y: 6.33934*height))
path.addCurve(to: CGPoint(x: 8.72933*width, y: 7.04404*height), control1: CGPoint(x: 8.84252*width, y: 6.68569*height), control2: CGPoint(x: 8.81594*width, y: 6.82983*height))
path.addCurve(to: CGPoint(x: 8.73327*width, y: 7.13013*height), control1: CGPoint(x: 8.7185*width, y: 7.07107*height), control2: CGPoint(x: 8.7185*width, y: 7.08408*height))
path.addCurve(to: CGPoint(x: 9.02067*width, y: 7.43343*height), control1: CGPoint(x: 8.76772*width, y: 7.24024*height), control2: CGPoint(x: 8.87106*width, y: 7.35035*height))
path.addLine(to: CGPoint(x: 9.08858*width, y: 7.47147*height))
path.addLine(to: CGPoint(x: 9.04528*width, y: 7.48549*height))
path.addCurve(to: CGPoint(x: 8.74016*width, y: 7.47848*height), control1: CGPoint(x: 8.97539*width, y: 7.50751*height), control2: CGPoint(x: 8.81693*width, y: 7.5035*height))
path.addCurve(to: CGPoint(x: 8.53937*width, y: 7.36737*height), control1: CGPoint(x: 8.6752*width, y: 7.45746*height), control2: CGPoint(x: 8.57283*width, y: 7.4014*height))
path.addCurve(to: CGPoint(x: 8.44783*width, y: 7.41441*height), control1: CGPoint(x: 8.52165*width, y: 7.34935*height), control2: CGPoint(x: 8.5187*width, y: 7.35035*height))
path.addCurve(to: CGPoint(x: 7.57776*width, y: 7.80781*height), control1: CGPoint(x: 8.24114*width, y: 7.5976*height), control2: CGPoint(x: 8.01181*width, y: 7.7007*height))
path.addCurve(to: CGPoint(x: 6.83957*width, y: 8.03904*height), control1: CGPoint(x: 7.12205*width, y: 7.91992*height), control2: CGPoint(x: 6.99114*width, y: 7.96096*height))
path.addCurve(to: CGPoint(x: 6.43602*width, y: 8.32933*height), control1: CGPoint(x: 6.7126*width, y: 8.1031*height), control2: CGPoint(x: 6.59449*width, y: 8.18919*height))
path.addCurve(to: CGPoint(x: 6.32776*width, y: 8.39139*height), control1: CGPoint(x: 6.38287*width, y: 8.37738*height), control2: CGPoint(x: 6.36417*width, y: 8.38739*height))
path.addCurve(to: CGPoint(x: 6.46654*width, y: 8.39339*height), control1: CGPoint(x: 6.30413*width, y: 8.39439*height), control2: CGPoint(x: 6.36614*width, y: 8.3954*height))
path.addCurve(to: CGPoint(x: 6.74606*width, y: 8.36436*height), control1: CGPoint(x: 6.62598*width, y: 8.39139*height), control2: CGPoint(x: 6.66043*width, y: 8.38739*height))
path.addCurve(to: CGPoint(x: 7.1939*width, y: 8.11411*height), control1: CGPoint(x: 6.9065*width, y: 8.32232*height), control2: CGPoint(x: 7.07382*width, y: 8.22823*height))
path.addCurve(to: CGPoint(x: 7.30118*width, y: 7.99299*height), control1: CGPoint(x: 7.21161*width, y: 8.0971*height), control2: CGPoint(x: 7.25984*width, y: 8.04304*height))
path.addCurve(to: CGPoint(x: 7.39764*width, y: 7.89089*height), control1: CGPoint(x: 7.34154*width, y: 7.94394*height), control2: CGPoint(x: 7.38484*width, y: 7.8969*height))
path.addCurve(to: CGPoint(x: 7.76969*width, y: 7.79379*height), control1: CGPoint(x: 7.41831*width, y: 7.87888*height), control2: CGPoint(x: 7.68799*width, y: 7.80881*height))
path.addLine(to: CGPoint(x: 7.80709*width, y: 7.78679*height))
path.addLine(to: CGPoint(x: 7.74606*width, y: 7.9049*height))
path.addCurve(to: CGPoint(x: 7.42815*width, y: 8.35235*height), control1: CGPoint(x: 7.6437*width, y: 8.1041*height), control2: CGPoint(x: 7.5689*width, y: 8.21021*height))
path.addLine(to: CGPoint(x: 7.30118*width, y: 8.48148*height))
path.addLine(to: CGPoint(x: 7.30512*width, y: 8.56256*height))
path.addCurve(to: CGPoint(x: 7.42618*width, y: 8.87487*height), control1: CGPoint(x: 7.31102*width, y: 8.66266*height), control2: CGPoint(x: 7.34941*width, y: 8.76176*height))
path.addCurve(to: CGPoint(x: 7.47638*width, y: 8.95596*height), control1: CGPoint(x: 7.45571*width, y: 8.91792*height), control2: CGPoint(x: 7.47835*width, y: 8.95395*height))
path.addCurve(to: CGPoint(x: 7.40551*width, y: 8.93794*height), control1: CGPoint(x: 7.47539*width, y: 8.95796*height), control2: CGPoint(x: 7.44291*width, y: 8.94995*height))
path.addCurve(to: CGPoint(x: 7.04724*width, y: 8.65065*height), control1: CGPoint(x: 7.24409*width, y: 8.88689*height), control2: CGPoint(x: 7.1565*width, y: 8.81682*height))
path.addLine(to: CGPoint(x: 7.03248*width, y: 8.62763*height))
path.addLine(to: CGPoint(x: 6.95276*width, y: 8.65766*height))
path.addCurve(to: CGPoint(x: 6.49114*width, y: 8.73574*height), control1: CGPoint(x: 6.82185*width, y: 8.70671*height), control2: CGPoint(x: 6.68012*width, y: 8.73073*height))
path.addCurve(to: CGPoint(x: 5.9065*width, y: 8.67367*height), control1: CGPoint(x: 6.3002*width, y: 8.74174*height), control2: CGPoint(x: 6.19291*width, y: 8.72973*height))
path.addCurve(to: CGPoint(x: 5.72244*width, y: 8.64164*height), control1: CGPoint(x: 5.80709*width, y: 8.65365*height), control2: CGPoint(x: 5.72441*width, y: 8.63964*height))
path.addCurve(to: CGPoint(x: 5.85827*width, y: 8.67367*height), control1: CGPoint(x: 5.71949*width, y: 8.64364*height), control2: CGPoint(x: 5.7815*width, y: 8.65866*height))
path.addCurve(to: CGPoint(x: 6.01083*width, y: 8.70771*height), control1: CGPoint(x: 5.93602*width, y: 8.68869*height), control2: CGPoint(x: 6.00394*width, y: 8.7047*height))
path.addCurve(to: CGPoint(x: 5.81201*width, y: 8.88088*height), control1: CGPoint(x: 6.02264*width, y: 8.71371*height), control2: CGPoint(x: 5.92421*width, y: 8.7998*height))
path.addCurve(to: CGPoint(x: 5.31004*width, y: 9.11411*height), control1: CGPoint(x: 5.66929*width, y: 8.98398*height), control2: CGPoint(x: 5.46161*width, y: 9.08108*height))
path.addCurve(to: CGPoint(x: 5.19783*width, y: 9.16817*height), control1: CGPoint(x: 5.24409*width, y: 9.12913*height), control2: CGPoint(x: 5.22638*width, y: 9.13814*height))
path.addCurve(to: CGPoint(x: 5.10039*width, y: 9.54655*height), control1: CGPoint(x: 5.12106*width, y: 9.24925*height), control2: CGPoint(x: 5.09449*width, y: 9.35636*height))
path.addCurve(to: CGPoint(x: 5.10335*width, y: 9.67968*height), control1: CGPoint(x: 5.10335*width, y: 9.61962*height), control2: CGPoint(x: 5.10433*width, y: 9.67968*height))
path.addCurve(to: CGPoint(x: 5.05217*width, y: 9.63163*height), control1: CGPoint(x: 5.10236*width, y: 9.67968*height), control2: CGPoint(x: 5.07972*width, y: 9.65766*height))
path.closeSubpath()
path.move(to: CGPoint(x: 5.70177*width, y: 8.63163*height))
path.addCurve(to: CGPoint(x: 5.67717*width, y: 8.63163*height), control1: CGPoint(x: 5.69488*width, y: 8.62963*height), control2: CGPoint(x: 5.68307*width, y: 8.62963*height))
path.addCurve(to: CGPoint(x: 5.68898*width, y: 8.63664*height), control1: CGPoint(x: 5.67028*width, y: 8.63463*height), control2: CGPoint(x: 5.6752*width, y: 8.63664*height))
path.addCurve(to: CGPoint(x: 5.70177*width, y: 8.63163*height), control1: CGPoint(x: 5.70276*width, y: 8.63664*height), control2: CGPoint(x: 5.70768*width, y: 8.63463*height))
path.closeSubpath()
path.move(to: CGPoint(x: 5.65256*width, y: 8.62162*height))
path.addCurve(to: CGPoint(x: 5.62795*width, y: 8.62162*height), control1: CGPoint(x: 5.64567*width, y: 8.61962*height), control2: CGPoint(x: 5.63386*width, y: 8.61962*height))
path.addCurve(to: CGPoint(x: 5.63976*width, y: 8.62663*height), control1: CGPoint(x: 5.62106*width, y: 8.62462*height), control2: CGPoint(x: 5.62598*width, y: 8.62663*height))
path.addCurve(to: CGPoint(x: 5.65256*width, y: 8.62162*height), control1: CGPoint(x: 5.65354*width, y: 8.62663*height), control2: CGPoint(x: 5.65846*width, y: 8.62462*height))
path.closeSubpath()
path.move(to: CGPoint(x: 6.25295*width, y: 8.38138*height))
path.addCurve(to: CGPoint(x: 6.22835*width, y: 8.38138*height), control1: CGPoint(x: 6.24606*width, y: 8.37938*height), control2: CGPoint(x: 6.23425*width, y: 8.37938*height))
path.addCurve(to: CGPoint(x: 6.24016*width, y: 8.38639*height), control1: CGPoint(x: 6.22146*width, y: 8.38438*height), control2: CGPoint(x: 6.22638*width, y: 8.38639*height))
path.addCurve(to: CGPoint(x: 6.25295*width, y: 8.38138*height), control1: CGPoint(x: 6.25394*width, y: 8.38639*height), control2: CGPoint(x: 6.25886*width, y: 8.38438*height))
path.closeSubpath()
path.move(to: CGPoint(x: 2.75689*width, y: 7.78078*height))
path.addCurve(to: CGPoint(x: 2.75197*width, y: 7.79279*height), control1: CGPoint(x: 2.74508*width, y: 7.76076*height), control2: CGPoint(x: 2.74311*width, y: 7.76677*height))
path.addCurve(to: CGPoint(x: 2.7628*width, y: 7.8038*height), control1: CGPoint(x: 2.75591*width, y: 7.8018*height), control2: CGPoint(x: 2.76083*width, y: 7.80681*height))
path.addCurve(to: CGPoint(x: 2.75689*width, y: 7.78078*height), control1: CGPoint(x: 2.76575*width, y: 7.8018*height), control2: CGPoint(x: 2.7628*width, y: 7.79079*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.38484*width, y: 5.94394*height))
path.addCurve(to: CGPoint(x: 1.37894*width, y: 5.94995*height), control1: CGPoint(x: 1.38189*width, y: 5.93594*height), control2: CGPoint(x: 1.37894*width, y: 5.93894*height))
path.addCurve(to: CGPoint(x: 1.38386*width, y: 5.96296*height), control1: CGPoint(x: 1.37795*width, y: 5.96096*height), control2: CGPoint(x: 1.38091*width, y: 5.96697*height))
path.addCurve(to: CGPoint(x: 1.38484*width, y: 5.94394*height), control1: CGPoint(x: 1.38681*width, y: 5.95996*height), control2: CGPoint(x: 1.3878*width, y: 5.95095*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.39469*width, y: 5.89389*height))
path.addCurve(to: CGPoint(x: 1.38976*width, y: 5.90591*height), control1: CGPoint(x: 1.39173*width, y: 5.88689*height), control2: CGPoint(x: 1.38976*width, y: 5.89189*height))
path.addCurve(to: CGPoint(x: 1.39469*width, y: 5.91892*height), control1: CGPoint(x: 1.38976*width, y: 5.91992*height), control2: CGPoint(x: 1.39173*width, y: 5.92492*height))
path.addCurve(to: CGPoint(x: 1.39469*width, y: 5.89389*height), control1: CGPoint(x: 1.39665*width, y: 5.91191*height), control2: CGPoint(x: 1.39665*width, y: 5.8999*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.46949*width, y: 5.90591*height))
path.addCurve(to: CGPoint(x: 8.48228*width, y: 5.88589*height), control1: CGPoint(x: 8.47933*width, y: 5.89489*height), control2: CGPoint(x: 8.48524*width, y: 5.88589*height))
path.addCurve(to: CGPoint(x: 8.45965*width, y: 5.90591*height), control1: CGPoint(x: 8.47933*width, y: 5.88589*height), control2: CGPoint(x: 8.46949*width, y: 5.89489*height))
path.addCurve(to: CGPoint(x: 8.44685*width, y: 5.92593*height), control1: CGPoint(x: 8.4498*width, y: 5.91692*height), control2: CGPoint(x: 8.4439*width, y: 5.92593*height))
path.addCurve(to: CGPoint(x: 8.46949*width, y: 5.90591*height), control1: CGPoint(x: 8.4498*width, y: 5.92593*height), control2: CGPoint(x: 8.45965*width, y: 5.91692*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.40453*width, y: 5.85385*height))
path.addCurve(to: CGPoint(x: 1.39862*width, y: 5.85986*height), control1: CGPoint(x: 1.40157*width, y: 5.84585*height), control2: CGPoint(x: 1.39862*width, y: 5.84885*height))
path.addCurve(to: CGPoint(x: 1.40354*width, y: 5.87287*height), control1: CGPoint(x: 1.39764*width, y: 5.87087*height), control2: CGPoint(x: 1.40059*width, y: 5.87688*height))
path.addCurve(to: CGPoint(x: 1.40453*width, y: 5.85385*height), control1: CGPoint(x: 1.4065*width, y: 5.86987*height), control2: CGPoint(x: 1.40748*width, y: 5.86086*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.51476*width, y: 5.84885*height))
path.addCurve(to: CGPoint(x: 8.51181*width, y: 5.84484*height), control1: CGPoint(x: 8.52756*width, y: 5.83283*height), control2: CGPoint(x: 8.52657*width, y: 5.83183*height))
path.addCurve(to: CGPoint(x: 8.49409*width, y: 5.86186*height), control1: CGPoint(x: 8.50197*width, y: 5.85185*height), control2: CGPoint(x: 8.49409*width, y: 5.85986*height))
path.addCurve(to: CGPoint(x: 8.51476*width, y: 5.84885*height), control1: CGPoint(x: 8.49409*width, y: 5.86987*height), control2: CGPoint(x: 8.50197*width, y: 5.86486*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.41437*width, y: 5.8038*height))
path.addCurve(to: CGPoint(x: 1.40846*width, y: 5.80981*height), control1: CGPoint(x: 1.41142*width, y: 5.7958*height), control2: CGPoint(x: 1.40846*width, y: 5.7988*height))
path.addCurve(to: CGPoint(x: 1.41339*width, y: 5.82282*height), control1: CGPoint(x: 1.40748*width, y: 5.82082*height), control2: CGPoint(x: 1.41043*width, y: 5.82683*height))
path.addCurve(to: CGPoint(x: 1.41437*width, y: 5.8038*height), control1: CGPoint(x: 1.41634*width, y: 5.81982*height), control2: CGPoint(x: 1.41732*width, y: 5.81081*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.42421*width, y: 5.75375*height))
path.addCurve(to: CGPoint(x: 1.41929*width, y: 5.76577*height), control1: CGPoint(x: 1.42126*width, y: 5.74675*height), control2: CGPoint(x: 1.41929*width, y: 5.75175*height))
path.addCurve(to: CGPoint(x: 1.42421*width, y: 5.77878*height), control1: CGPoint(x: 1.41929*width, y: 5.77978*height), control2: CGPoint(x: 1.42126*width, y: 5.78478*height))
path.addCurve(to: CGPoint(x: 1.42421*width, y: 5.75375*height), control1: CGPoint(x: 1.42618*width, y: 5.77177*height), control2: CGPoint(x: 1.42618*width, y: 5.75976*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.44587*width, y: 5.67668*height))
path.addCurve(to: CGPoint(x: 1.44685*width, y: 5.64164*height), control1: CGPoint(x: 1.45079*width, y: 5.65265*height), control2: CGPoint(x: 1.45177*width, y: 5.63764*height))
path.addCurve(to: CGPoint(x: 1.43307*width, y: 5.6957*height), control1: CGPoint(x: 1.44291*width, y: 5.64665*height), control2: CGPoint(x: 1.43602*width, y: 5.67067*height))
path.addCurve(to: CGPoint(x: 1.44587*width, y: 5.67668*height), control1: CGPoint(x: 1.42618*width, y: 5.74875*height), control2: CGPoint(x: 1.43209*width, y: 5.73974*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.46949*width, y: 5.5005*height))
path.addCurve(to: CGPoint(x: 1.47441*width, y: 4.5996*height), control1: CGPoint(x: 1.54528*width, y: 5.13814*height), control2: CGPoint(x: 1.54626*width, y: 4.91291*height))
path.addCurve(to: CGPoint(x: 1.44685*width, y: 4.4955*height), control1: CGPoint(x: 1.46358*width, y: 4.55055*height), control2: CGPoint(x: 1.45079*width, y: 4.5035*height))
path.addCurve(to: CGPoint(x: 1.31398*width, y: 4.67968*height), control1: CGPoint(x: 1.43701*width, y: 4.47648*height), control2: CGPoint(x: 1.36024*width, y: 4.58358*height))
path.addCurve(to: CGPoint(x: 1.24311*width, y: 5.01602*height), control1: CGPoint(x: 1.2628*width, y: 4.78579*height), control2: CGPoint(x: 1.24803*width, y: 4.85285*height))
path.addCurve(to: CGPoint(x: 1.3189*width, y: 5.41241*height), control1: CGPoint(x: 1.2372*width, y: 5.18719*height), control2: CGPoint(x: 1.25197*width, y: 5.26827*height))
path.addCurve(to: CGPoint(x: 1.44193*width, y: 5.62362*height), control1: CGPoint(x: 1.3563*width, y: 5.49349*height), control2: CGPoint(x: 1.43602*width, y: 5.62963*height))
path.addCurve(to: CGPoint(x: 1.46949*width, y: 5.5005*height), control1: CGPoint(x: 1.4439*width, y: 5.62162*height), control2: CGPoint(x: 1.45669*width, y: 5.56657*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.4813*width, y: 4.44444*height))
path.addCurve(to: CGPoint(x: 1.49409*width, y: 4.42442*height), control1: CGPoint(x: 1.49114*width, y: 4.43343*height), control2: CGPoint(x: 1.49705*width, y: 4.42442*height))
path.addCurve(to: CGPoint(x: 1.47146*width, y: 4.44444*height), control1: CGPoint(x: 1.49114*width, y: 4.42442*height), control2: CGPoint(x: 1.4813*width, y: 4.43343*height))
path.addCurve(to: CGPoint(x: 1.45866*width, y: 4.46446*height), control1: CGPoint(x: 1.46161*width, y: 4.45546*height), control2: CGPoint(x: 1.45571*width, y: 4.46446*height))
path.addCurve(to: CGPoint(x: 1.4813*width, y: 4.44444*height), control1: CGPoint(x: 1.46161*width, y: 4.46446*height), control2: CGPoint(x: 1.47146*width, y: 4.45546*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.38287*width, y: 4.1021*height))
path.addCurve(to: CGPoint(x: 8.37697*width, y: 4.10811*height), control1: CGPoint(x: 8.37992*width, y: 4.09409*height), control2: CGPoint(x: 8.37697*width, y: 4.0971*height))
path.addCurve(to: CGPoint(x: 8.38189*width, y: 4.12112*height), control1: CGPoint(x: 8.37598*width, y: 4.11912*height), control2: CGPoint(x: 8.37894*width, y: 4.12513*height))
path.addCurve(to: CGPoint(x: 8.38287*width, y: 4.1021*height), control1: CGPoint(x: 8.38484*width, y: 4.11812*height), control2: CGPoint(x: 8.38583*width, y: 4.10911*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.39272*width, y: 4.06206*height))
path.addCurve(to: CGPoint(x: 8.38681*width, y: 4.06807*height), control1: CGPoint(x: 8.38976*width, y: 4.05405*height), control2: CGPoint(x: 8.38681*width, y: 4.05706*height))
path.addCurve(to: CGPoint(x: 8.39173*width, y: 4.08108*height), control1: CGPoint(x: 8.38583*width, y: 4.07908*height), control2: CGPoint(x: 8.38878*width, y: 4.08509*height))
path.addCurve(to: CGPoint(x: 8.39272*width, y: 4.06206*height), control1: CGPoint(x: 8.39469*width, y: 4.07808*height), control2: CGPoint(x: 8.39567*width, y: 4.06907*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.40256*width, y: 4.01201*height))
path.addCurve(to: CGPoint(x: 8.39764*width, y: 4.02402*height), control1: CGPoint(x: 8.39961*width, y: 4.00501*height), control2: CGPoint(x: 8.39764*width, y: 4.01001*height))
path.addCurve(to: CGPoint(x: 8.40256*width, y: 4.03704*height), control1: CGPoint(x: 8.39764*width, y: 4.03804*height), control2: CGPoint(x: 8.39961*width, y: 4.04304*height))
path.addCurve(to: CGPoint(x: 8.40256*width, y: 4.01201*height), control1: CGPoint(x: 8.40453*width, y: 4.03003*height), control2: CGPoint(x: 8.40453*width, y: 4.01802*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.43406*width, y: 3.85385*height))
path.addCurve(to: CGPoint(x: 8.42028*width, y: 3.89389*height), control1: CGPoint(x: 8.43307*width, y: 3.83984*height), control2: CGPoint(x: 8.42717*width, y: 3.85786*height))
path.addCurve(to: CGPoint(x: 8.42126*width, y: 3.93894*height), control1: CGPoint(x: 8.40256*width, y: 3.97898*height), control2: CGPoint(x: 8.40354*width, y: 4.01702*height))
path.addCurve(to: CGPoint(x: 8.43406*width, y: 3.85385*height), control1: CGPoint(x: 8.42815*width, y: 3.90591*height), control2: CGPoint(x: 8.43406*width, y: 3.86787*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.44193*width, y: 3.78679*height))
path.addCurve(to: CGPoint(x: 8.43701*width, y: 3.7988*height), control1: CGPoint(x: 8.43898*width, y: 3.77678*height), control2: CGPoint(x: 8.43701*width, y: 3.78278*height))
path.addCurve(to: CGPoint(x: 8.44193*width, y: 3.81682*height), control1: CGPoint(x: 8.43701*width, y: 3.81582*height), control2: CGPoint(x: 8.43898*width, y: 3.82282*height))
path.addCurve(to: CGPoint(x: 8.44193*width, y: 3.78679*height), control1: CGPoint(x: 8.4439*width, y: 3.80981*height), control2: CGPoint(x: 8.4439*width, y: 3.7958*height))
path.closeSubpath()
path.move(to: CGPoint(x: 8.44193*width, y: 3.57357*height))
path.addCurve(to: CGPoint(x: 8.37106*width, y: 3.23724*height), control1: CGPoint(x: 8.43602*width, y: 3.42342*height), control2: CGPoint(x: 8.42028*width, y: 3.34535*height))
path.addCurve(to: CGPoint(x: 7.93504*width, y: 2.78478*height), control1: CGPoint(x: 8.28445*width, y: 3.04304*height), control2: CGPoint(x: 8.1378*width, y: 2.89189*height))
path.addCurve(to: CGPoint(x: 7.85433*width, y: 2.74575*height), control1: CGPoint(x: 7.89075*width, y: 2.76076*height), control2: CGPoint(x: 7.85433*width, y: 2.74374*height))
path.addCurve(to: CGPoint(x: 7.9626*width, y: 3.05906*height), control1: CGPoint(x: 7.85433*width, y: 2.75576*height), control2: CGPoint(x: 7.93406*width, y: 2.98398*height))
path.addCurve(to: CGPoint(x: 8.375*width, y: 3.67668*height), control1: CGPoint(x: 8.05217*width, y: 3.28629*height), control2: CGPoint(x: 8.16732*width, y: 3.46046*height))
path.addCurve(to: CGPoint(x: 8.4439*width, y: 3.72673*height), control1: CGPoint(x: 8.4252*width, y: 3.72873*height), control2: CGPoint(x: 8.44094*width, y: 3.74074*height))
path.addCurve(to: CGPoint(x: 8.44193*width, y: 3.57357*height), control1: CGPoint(x: 8.44587*width, y: 3.71672*height), control2: CGPoint(x: 8.44488*width, y: 3.64765*height))
path.closeSubpath()
path.move(to: CGPoint(x: 1.3248*width, y: 4.003*height))
path.addCurve(to: CGPoint(x: 1.35433*width, y: 3.14014*height), control1: CGPoint(x: 1.25197*width, y: 3.67968*height), control2: CGPoint(x: 1.2628*width, y: 3.37437*height))
path.addCurve(to: CGPoint(x: 1.37795*width, y: 3.002*height), control1: CGPoint(x: 1.3878*width, y: 3.05606*height), control2: CGPoint(x: 1.38878*width, y: 3.04905*height))
path.addCurve(to: CGPoint(x: 1.1063*width, y: 2.69469*height), control1: CGPoint(x: 1.35236*width, y: 2.89289*height), control2: CGPoint(x: 1.25787*width, y: 2.78679*height))
path.addLine(to: CGPoint(x: 1.02362*width, y: 2.64464*height))
path.addLine(to: CGPoint(x: 1.05512*width, y: 2.63263*height))
path.addCurve(to: CGPoint(x: 1.32283*width, y: 2.62663*height), control1: CGPoint(x: 1.11319*width, y: 2.61161*height), control2: CGPoint(x: 1.24803*width, y: 2.60861*height))
path.addCurve(to: CGPoint(x: 1.54626*width, y: 2.73273*height), control1: CGPoint(x: 1.40157*width, y: 2.64565*height), control2: CGPoint(x: 1.49803*width, y: 2.69169*height))
path.addLine(to: CGPoint(x: 1.57972*width, y: 2.75976*height))
path.addLine(to: CGPoint(x: 1.65551*width, y: 2.68869*height))
path.addCurve(to: CGPoint(x: 1.97835*width, y: 2.45445*height), control1: CGPoint(x: 1.75394*width, y: 2.5956*height), control2: CGPoint(x: 1.86122*width, y: 2.51752*height))
path.addCurve(to: CGPoint(x: 2.28248*width, y: 2.33033*height), control1: CGPoint(x: 2.09449*width, y: 2.39139*height), control2: CGPoint(x: 2.27461*width, y: 2.31832*height))
path.addCurve(to: CGPoint(x: 2.35236*width, y: 2.31632*height), control1: CGPoint(x: 2.28543*width, y: 2.33534*height), control2: CGPoint(x: 2.31594*width, y: 2.32933*height))
path.addCurve(to: CGPoint(x: 2.34843*width, y: 2.30731*height), control1: CGPoint(x: 2.42421*width, y: 2.29129*height), control2: CGPoint(x: 2.42224*width, y: 2.28428*height))
path.addCurve(to: CGPoint(x: 2.29724*width, y: 2.31932*height), control1: CGPoint(x: 2.32185*width, y: 2.31532*height), control2: CGPoint(x: 2.29823*width, y: 2.32132*height))
path.addCurve(to: CGPoint(x: 2.42126*width, y: 1.98198*height), control1: CGPoint(x: 2.28937*width, y: 2.31131*height), control2: CGPoint(x: 2.37894*width, y: 2.06707*height))
path.addCurve(to: CGPoint(x: 2.65059*width, y: 1.65566*height), control1: CGPoint(x: 2.48228*width, y: 1.85886*height), control2: CGPoint(x: 2.54626*width, y: 1.76877*height))
path.addCurve(to: CGPoint(x: 2.74508*width, y: 1.53854*height), control1: CGPoint(x: 2.69783*width, y: 1.60561*height), control2: CGPoint(x: 2.74016*width, y: 1.55255*height))
path.addCurve(to: CGPoint(x: 2.71063*width, y: 1.32733*height), control1: CGPoint(x: 2.75886*width, y: 1.5035*height), control2: CGPoint(x: 2.74213*width, y: 1.40541*height))
path.addCurve(to: CGPoint(x: 2.62795*width, y: 1.17918*height), control1: CGPoint(x: 2.69685*width, y: 1.29429*height), control2: CGPoint(x: 2.65945*width, y: 1.22723*height))
path.addCurve(to: CGPoint(x: 2.57677*width, y: 1.09109*height), control1: CGPoint(x: 2.59547*width, y: 1.13013*height), control2: CGPoint(x: 2.57283*width, y: 1.09109*height))
path.addCurve(to: CGPoint(x: 2.7687*width, y: 1.15816*height), control1: CGPoint(x: 2.6063*width, y: 1.09109*height), control2: CGPoint(x: 2.71161*width, y: 1.12813*height))
path.addCurve(to: CGPoint(x: 2.97047*width, y: 1.34935*height), control1: CGPoint(x: 2.84843*width, y: 1.2012*height), control2: CGPoint(x: 2.9124*width, y: 1.26126*height))
path.addCurve(to: CGPoint(x: 3.02067*width, y: 1.41141*height), control1: CGPoint(x: 2.99409*width, y: 1.38338*height), control2: CGPoint(x: 3.01575*width, y: 1.41141*height))
path.addCurve(to: CGPoint(x: 3.08465*width, y: 1.39139*height), control1: CGPoint(x: 3.02461*width, y: 1.41141*height), control2: CGPoint(x: 3.05413*width, y: 1.4024*height))
path.addCurve(to: CGPoint(x: 3.46063*width, y: 1.33433*height), control1: CGPoint(x: 3.18307*width, y: 1.35736*height), control2: CGPoint(x: 3.29724*width, y: 1.33934*height))
path.addCurve(to: CGPoint(x: 4.32087*width, y: 1.46647*height), control1: CGPoint(x: 3.70177*width, y: 1.32533*height), control2: CGPoint(x: 3.77362*width, y: 1.33734*height))
path.addCurve(to: CGPoint(x: 5.00787*width, y: 1.58158*height), control1: CGPoint(x: 4.7815*width, y: 1.57558*height), control2: CGPoint(x: 4.81594*width, y: 1.58158*height))
path.addCurve(to: CGPoint(x: 5.43307*width, y: 1.54054*height), control1: CGPoint(x: 5.18799*width, y: 1.58158*height), control2: CGPoint(x: 5.28937*width, y: 1.57157*height))
path.addCurve(to: CGPoint(x: 5.66437*width, y: 1.56857*height), control1: CGPoint(x: 5.5935*width, y: 1.5045*height), control2: CGPoint(x: 5.57776*width, y: 1.5025*height))
path.addCurve(to: CGPoint(x: 5.81594*width, y: 1.6987*height), control1: CGPoint(x: 5.70768*width, y: 1.6016*height), control2: CGPoint(x: 5.77559*width, y: 1.65966*height))
path.addLine(to: CGPoint(x: 5.88976*width, y: 1.76877*height))
path.addLine(to: CGPoint(x: 5.77657*width, y: 1.7998*height))
path.addCurve(to: CGPoint(x: 5.47736*width, y: 1.87387*height), control1: CGPoint(x: 5.71457*width, y: 1.81782*height), control2: CGPoint(x: 5.58071*width, y: 1.85085*height))
path.addCurve(to: CGPoint(x: 5.25098*width, y: 1.92392*height), control1: CGPoint(x: 5.375*width, y: 1.8959*height), control2: CGPoint(x: 5.27264*width, y: 1.91892*height))
path.addCurve(to: CGPoint(x: 5.16535*width, y: 1.98198*height), control1: CGPoint(x: 5.22343*width, y: 1.93093*height), control2: CGPoint(x: 5.19685*width, y: 1.94895*height))
path.addCurve(to: CGPoint(x: 5.07185*width, y: 2.31031*height), control1: CGPoint(x: 5.10039*width, y: 2.05105*height), control2: CGPoint(x: 5.07972*width, y: 2.12412*height))
path.addLine(to: CGPoint(x: 5.06594*width, y: 2.45345*height))
path.addLine(to: CGPoint(x: 5.02559*width, y: 2.41341*height))
path.addCurve(to: CGPoint(x: 4.86713*width, y: 2.02202*height), control1: CGPoint(x: 4.93012*width, y: 2.31832*height), control2: CGPoint(x: 4.87106*width, y: 2.17117*height))
path.addLine(to: CGPoint(x: 4.86516*width, y: 1.92693*height))
path.addLine(to: CGPoint(x: 4.81201*width, y: 1.91892*height))
path.addCurve(to: CGPoint(x: 4.32677*width, y: 1.81582*height), control1: CGPoint(x: 4.70768*width, y: 1.9039*height), control2: CGPoint(x: 4.54921*width, y: 1.86987*height))
path.addLine(to: CGPoint(x: 4.10138*width, y: 1.76176*height))
path.addLine(to: CGPoint(x: 4.04724*width, y: 1.80881*height))
path.addCurve(to: CGPoint(x: 3.89862*width, y: 1.93994*height), control1: CGPoint(x: 4.01772*width, y: 1.83584*height), control2: CGPoint(x: 3.95079*width, y: 1.89389*height))
path.addCurve(to: CGPoint(x: 3.55413*width, y: 2.21221*height), control1: CGPoint(x: 3.81201*width, y: 2.01602*height), control2: CGPoint(x: 3.59055*width, y: 2.19119*height))
path.addCurve(to: CGPoint(x: 3.54823*width, y: 2.41842*height), control1: CGPoint(x: 3.5315*width, y: 2.22523*height), control2: CGPoint(x: 3.52756*width, y: 2.34535*height))
path.addCurve(to: CGPoint(x: 3.66732*width, y: 2.66066*height), control1: CGPoint(x: 3.5689*width, y: 2.49249*height), control2: CGPoint(x: 3.6122*width, y: 2.58058*height))
path.addCurve(to: CGPoint(x: 3.68307*width, y: 2.71672*height), control1: CGPoint(x: 3.70965*width, y: 2.72272*height), control2: CGPoint(x: 3.70965*width, y: 2.72272*height))
path.addCurve(to: CGPoint(x: 3.29232*width, y: 2.44144*height), control1: CGPoint(x: 3.50787*width, y: 2.67768*height), control2: CGPoint(x: 3.37697*width, y: 2.58559*height))
path.addCurve(to: CGPoint(x: 3.25295*width, y: 2.37437*height), control1: CGPoint(x: 3.27165*width, y: 2.40641*height), control2: CGPoint(x: 3.25394*width, y: 2.37638*height))
path.addCurve(to: CGPoint(x: 3.20768*width, y: 2.39039*height), control1: CGPoint(x: 3.25197*width, y: 2.37337*height), control2: CGPoint(x: 3.2313*width, y: 2.38038*height))
path.addCurve(to: CGPoint(x: 2.70177*width, y: 2.55756*height), control1: CGPoint(x: 3.12894*width, y: 2.42442*height), control2: CGPoint(x: 2.96063*width, y: 2.48048*height))
path.addCurve(to: CGPoint(x: 2.1624*width, y: 2.75475*height), control1: CGPoint(x: 2.39961*width, y: 2.64765*height), control2: CGPoint(x: 2.29331*width, y: 2.68769*height))
path.addCurve(to: CGPoint(x: 1.70276*width, y: 3.21522*height), control1: CGPoint(x: 1.94587*width, y: 2.86787*height), control2: CGPoint(x: 1.79429*width, y: 3.01902*height))
path.addCurve(to: CGPoint(x: 1.62894*width, y: 3.60961*height), control1: CGPoint(x: 1.63681*width, y: 3.35636*height), control2: CGPoint(x: 1.62992*width, y: 3.39439*height))
path.addLine(to: CGPoint(x: 1.62894*width, y: 3.8008*height))
path.addLine(to: CGPoint(x: 1.54035*width, y: 3.88388*height))
path.addCurve(to: CGPoint(x: 1.39665*width, y: 4.02202*height), control1: CGPoint(x: 1.49114*width, y: 3.92993*height), control2: CGPoint(x: 1.42717*width, y: 3.99199*height))
path.addLine(to: CGPoint(x: 1.34055*width, y: 4.07608*height))
path.addLine(to: CGPoint(x: 1.3248*width, y: 4.003*height))
path.closeSubpath()
path.move(to: CGPoint(x: 2.46555*width, y: 2.28228*height))
path.addCurve(to: CGPoint(x: 2.47047*width, y: 2.27327*height), control1: CGPoint(x: 2.47835*width, y: 2.27728*height), control2: CGPoint(x: 2.47933*width, y: 2.27327*height))
path.addCurve(to: CGPoint(x: 2.43602*width, y: 2.28228*height), control1: CGPoint(x: 2.4626*width, y: 2.27327*height), control2: CGPoint(x: 2.44685*width, y: 2.27728*height))
path.addCurve(to: CGPoint(x: 2.4311*width, y: 2.29129*height), control1: CGPoint(x: 2.42323*width, y: 2.28729*height), control2: CGPoint(x: 2.42224*width, y: 2.29129*height))
path.addCurve(to: CGPoint(x: 2.46555*width, y: 2.28228*height), control1: CGPoint(x: 2.43898*width, y: 2.29129*height), control2: CGPoint(x: 2.45472*width, y: 2.28729*height))
path.closeSubpath()
path.move(to: CGPoint(x: 2.56398*width, y: 2.25225*height))
path.addCurve(to: CGPoint(x: 2.5689*width, y: 2.24324*height), control1: CGPoint(x: 2.57677*width, y: 2.24725*height), control2: CGPoint(x: 2.57776*width, y: 2.24324*height))
path.addCurve(to: CGPoint(x: 2.53445*width, y: 2.25225*height), control1: CGPoint(x: 2.56102*width, y: 2.24324*height), control2: CGPoint(x: 2.54528*width, y: 2.24725*height))
path.addCurve(to: CGPoint(x: 2.52953*width, y: 2.26126*height), control1: CGPoint(x: 2.52165*width, y: 2.25726*height), control2: CGPoint(x: 2.52067*width, y: 2.26126*height))
path.addCurve(to: CGPoint(x: 2.56398*width, y: 2.25225*height), control1: CGPoint(x: 2.5374*width, y: 2.26126*height), control2: CGPoint(x: 2.55315*width, y: 2.25726*height))
path.closeSubpath()
path.move(to: CGPoint(x: 2.64173*width, y: 2.23023*height))
path.addCurve(to: CGPoint(x: 2.69193*width, y: 2.20521*height), control1: CGPoint(x: 2.66339*width, y: 2.22322*height), control2: CGPoint(x: 2.68701*width, y: 2.21221*height))
path.addCurve(to: CGPoint(x: 2.8937*width, y: 2.12913*height), control1: CGPoint(x: 2.69783*width, y: 2.1982*height), control2: CGPoint(x: 2.78839*width, y: 2.16416*height))
path.addCurve(to: CGPoint(x: 3.66142*width, y: 1.68368*height), control1: CGPoint(x: 3.21555*width, y: 2.02202*height), control2: CGPoint(x: 3.37402*width, y: 1.92993*height))
path.addCurve(to: CGPoint(x: 3.48917*width, y: 1.67568*height), control1: CGPoint(x: 3.67323*width, y: 1.67267*height), control2: CGPoint(x: 3.64272*width, y: 1.67167*height))
path.addCurve(to: CGPoint(x: 3.08563*width, y: 1.76176*height), control1: CGPoint(x: 3.27264*width, y: 1.68068*height), control2: CGPoint(x: 3.23228*width, y: 1.68869*height))
path.addCurve(to: CGPoint(x: 2.72736*width, y: 2.11712*height), control1: CGPoint(x: 2.92028*width, y: 1.84284*height), control2: CGPoint(x: 2.82677*width, y: 1.93594*height))
path.addCurve(to: CGPoint(x: 2.63091*width, y: 2.22422*height), control1: CGPoint(x: 2.6811*width, y: 2.2012*height), control2: CGPoint(x: 2.6752*width, y: 2.20821*height))
path.addCurve(to: CGPoint(x: 2.64173*width, y: 2.23023*height), control1: CGPoint(x: 2.57579*width, y: 2.24324*height), control2: CGPoint(x: 2.58268*width, y: 2.24725*height))
path.closeSubpath()
path.move(to: CGPoint(x: 3.85531*width, y: 1.70571*height))
path.addCurve(to: CGPoint(x: 3.83661*width, y: 1.7047*height), control1: CGPoint(x: 3.85236*width, y: 1.7027*height), control2: CGPoint(x: 3.8435*width, y: 1.7017*height))
path.addCurve(to: CGPoint(x: 3.84252*width, y: 1.71071*height), control1: CGPoint(x: 3.82874*width, y: 1.70771*height), control2: CGPoint(x: 3.83169*width, y: 1.71071*height))
path.addCurve(to: CGPoint(x: 3.85531*width, y: 1.70571*height), control1: CGPoint(x: 3.85335*width, y: 1.71171*height), control2: CGPoint(x: 3.85925*width, y: 1.70871*height))
path.closeSubpath()
path.move(to: CGPoint(x: 3.8061*width, y: 1.6957*height))
path.addCurve(to: CGPoint(x: 3.7874*width, y: 1.69469*height), control1: CGPoint(x: 3.80315*width, y: 1.69269*height), control2: CGPoint(x: 3.79429*width, y: 1.69169*height))
path.addCurve(to: CGPoint(x: 3.79331*width, y: 1.7007*height), control1: CGPoint(x: 3.77953*width, y: 1.6977*height), control2: CGPoint(x: 3.78248*width, y: 1.7007*height))
path.addCurve(to: CGPoint(x: 3.8061*width, y: 1.6957*height), control1: CGPoint(x: 3.80413*width, y: 1.7017*height), control2: CGPoint(x: 3.81004*width, y: 1.6987*height))
path.closeSubpath()
path.move(to: CGPoint(x: 3.74311*width, y: 1.68468*height))
path.addCurve(to: CGPoint(x: 3.7185*width, y: 1.68468*height), control1: CGPoint(x: 3.73622*width, y: 1.68268*height), control2: CGPoint(x: 3.72441*width, y: 1.68268*height))
path.addCurve(to: CGPoint(x: 3.73031*width, y: 1.68969*height), control1: CGPoint(x: 3.71161*width, y: 1.68769*height), control2: CGPoint(x: 3.71654*width, y: 1.68969*height))
path.addCurve(to: CGPoint(x: 3.74311*width, y: 1.68468*height), control1: CGPoint(x: 3.74409*width, y: 1.68969*height), control2: CGPoint(x: 3.74902*width, y: 1.68769*height))
path.closeSubpath()
return path
}
}

44
Seg.swift Normal file
View File

@ -0,0 +1,44 @@
import GRDB
/// The Seg struct.
///
/// Identifiable conformance supports SwiftUI list animations, and type-safe
/// GRDB primary key methods.
/// Equatable conformance supports tests.
struct Seg: Identifiable, Equatable {
/// Int64 is the recommended type for auto-incremented database ids.
/// Use nil for players that are not inserted yet in the database.
var id: Int64?
var seg_id: Int64
var line_id: Int64
var book: String
}
extension Seg {
}
// MARK: - Persistence
/// Make Seg a Codable Record.
///
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
extension Seg: Codable, FetchableRecord, MutablePersistableRecord {
// Define database columns from CodingKeys
fileprivate enum Columns {
static let id = Column(CodingKeys.id)
static let book = Column(CodingKeys.book)
}
/// Updates a player id after it has been inserted in the database.
mutating func didInsert(_ inserted: InsertionSuccess) {
id = inserted.rowID
}
}
// MARK: - Seg Database Requests
/// Define some player requests used by the application.
///
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
extension DerivableRequest<Seg> {
}

44
SegDenorm.swift Normal file
View File

@ -0,0 +1,44 @@
import GRDB
/// The SegDenorm struct.
///
/// Identifiable conformance supports SwiftUI list animations, and type-safe
/// GRDB primary key methods.
/// Equatable conformance supports tests.
struct SegDenorm: Identifiable, Equatable {
/// Int64 is the recommended type for auto-incremented database ids.
/// Use nil for players that are not inserted yet in the database.
var id: Int64
var body: String
// var lineIds: [Int64]
var book: String
}
extension SegDenorm {
}
// MARK: - Persistence
/// Make SegDenorm a Codable Record.
///
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
extension SegDenorm: Codable, FetchableRecord, MutablePersistableRecord {
// // Define database columns from CodingKeys
// fileprivate enum Columns {
// static let id = Column(CodingKeys.id)
// static let book = Column(CodingKeys.book)
// }
// /// Updates a player id after it has been inserted in the database.
// mutating func didInsert(_ inserted: InsertionSuccess) {
// id = inserted.rowID
// }
}
// MARK: - SegDenorm Database Requests
/// Define some player requests used by the application.
///
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
extension DerivableRequest<SegDenorm> {
}

55
SegDenormRequest.swift Normal file
View File

@ -0,0 +1,55 @@
import Combine
import GRDB
import GRDBQuery
struct SegDenormRequest: Queryable {
enum Ordering {
case byScore
case byName
}
var book: String
// MARK: - Queryable Implementation
static var defaultValue: [SegDenorm] { [] }
func publisher(in appDatabase: AppDatabase) -> AnyPublisher<[SegDenorm], Error> {
ValueObservation
.tracking(fetchValue(_:))
.publisher(
in: appDatabase.reader,
scheduling: .immediate)
.eraseToAnyPublisher()
}
func fetchValue(_ db: Database) throws -> [SegDenorm] {
print("WOOOOOOF")
var sql = "select seg_id as id, seg.book as book, group_concat(line.body, ';;') as body from seg join line on seg.line_id = line.rowid WHERE seg.book = 'bible.john' group by seg.seg_id"
do {
var ret = try SegDenorm.fetchAll(db, sql: sql) // [Player]
print("SEGS DENORM")
print(ret)
return ret
} catch let error {
print(error.localizedDescription)
print(error)
print("Error")
return []
}
// if book == "" {
// return try Seg.filter(bookColumn == "bible.john")).fetchAll(db)
// } else {
// return try Seg.filter(bookColumn == book).fetchAll(db)
// }
// switch ordering {
// case .byScore:
// return try Seg.all().fetchAll(db)
// case .byName:
// // return try Seg.all().orderedByName().fetchAll(db)
// return try Seg.all().fetchAll(db)
// }
}
}

View File

@ -43,12 +43,19 @@ struct SelectedRibbonRequest: Queryable {
// This method is not required by Queryable, but it makes it easier // This method is not required by Queryable, but it makes it easier
func fetchValue(_ db: Database) throws -> [Ribbon] { func fetchValue(_ db: Database) throws -> [Ribbon] {
print("FETCH SELECTED RIBBON") // print("FETCH SELECTED RIBBON")
var ret2 = try SelectedRibbon.fetchAll(db, sql: "SELECT * FROM selectedRibbon") // [Player] // var ret2 = try SelectedRibbon.fetchAll(db, sql: "SELECT * FROM selectedRibbon") // [Player]
print(ret2) // print(ret2)
print("FETCH JOIN RIBBON")
var ret = try Ribbon.fetchAll(db, sql: "SELECT ribbon.* FROM selectedRibbon join ribbon on selectedRibbon.ribbonId = ribbon.rowid WHERE selectedRibbon.rowid = 1") // [Player] // print("FETCH RIBBON")
print(ret) // var ret3 = try Ribbon.fetchAll(db, sql: "SELECT * FROM Ribbon") // [Player]
// print(ret3)
// print("FETCH JOIN RIBBON")
var ret = try Ribbon.fetchAll(db, sql: "SELECT Ribbon.* FROM SelectedRibbon join Ribbon on SelectedRibbon.ribbonId = ribbon.rowId WHERE SelectedRibbon.rowId = 1") // [Player]
// print(ret)
return ret return ret
} }
} }

79
VisibilityTracker.swift Normal file
View File

@ -0,0 +1,79 @@
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Created by Sam Deane on 27/07/22.
// All code (c) 2022 - present day, Elegant Chaos Limited.
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
import SwiftUI
public enum VisibilityChange {
case hidden
case shown
}
public class VisibilityTracker<ID: Hashable>: ObservableObject {
/// The global bounds of the container view.
public var containerBounds: CGRect
/// Dictionary containing the offset of every visible view.
public var visibleViews: [ID:CGFloat]
/// Ids of the visible views, sorted by offset.
/// The first item is the top view, the last one, the bottom view.
public var sortedViewIDs: [ID]
/// Action to perform when a view becomes visible or is hidden.
public var action: Action
/// The id of the top visible view.
public var topVisibleView: ID? { sortedViewIDs.first }
/// The id of the bottom visible view.
public var bottomVisibleView: ID? { sortedViewIDs.last }
/// Action callback signature.
public typealias Action = (ID, VisibilityChange, VisibilityTracker<ID>) -> ()
public init(action: @escaping Action) {
self.containerBounds = .zero
self.visibleViews = [:]
self.sortedViewIDs = []
self.action = action
}
public func reportContainerBounds(_ bounds: CGRect) {
containerBounds = bounds
}
public func reportContentBounds(_ bounds: CGRect, id: ID) {
let topLeft = bounds.origin
let size = bounds.size
let bottomRight = CGPoint(x: topLeft.x + size.width, y: topLeft.y + size.height)
let isVisible = containerBounds.contains(topLeft) || containerBounds.contains(bottomRight)
let wasVisible = visibleViews[id] != nil
visibleViews[id] = -1 * (bounds.origin.y - containerBounds.origin.y)
sortViews()
action(id, .shown, self)
// if isVisible {
// visibleViews[id] = bounds.origin.y - containerBounds.origin.y
// sortViews()
// if !wasVisible {
// action(id, .shown, self)
// }
// } else {
// if wasVisible {
// visibleViews.removeValue(forKey: id)
// sortViews()
// action(id, .hidden, self)
// }
// }
}
func sortViews() {
let sortedPairs = visibleViews.sorted(by: { $0.1 < $1.1 })
sortedViewIDs = sortedPairs.map { $0.0 }
}
}

View File

@ -0,0 +1,34 @@
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Created by Sam Deane on 27/07/22.
// All code (c) 2022 - present day, Elegant Chaos Limited.
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
import SwiftUI
struct ContentVisibilityTrackingModifier<ID: Hashable>: ViewModifier {
@EnvironmentObject var visibilityTracker: VisibilityTracker<ID>
let id: ID
func body(content: Content) -> some View {
content
.id(id)
.background(
GeometryReader { proxy in
report(proxy: proxy)
}
)
}
func report(proxy: GeometryProxy) -> Color {
visibilityTracker.reportContentBounds(proxy.frame(in: .global), id: id)
return Color.clear
}
}
public extension View {
func trackVisibility<ID: Hashable>(id: ID) -> some View {
self
.modifier(ContentVisibilityTrackingModifier(id: id))
}
}

View File

@ -0,0 +1,35 @@
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// Created by Sam Deane on 27/07/22.
// All code (c) 2022 - present day, Elegant Chaos Limited.
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
import SwiftUI
public struct VisibilityTrackingScrollView<Content, ID>: View where Content: View, ID: Hashable {
@ViewBuilder let content: Content
@State var visibilityTracker: VisibilityTracker<ID>
public init(action: @escaping VisibilityTracker<ID>.Action, @ViewBuilder content: () -> Content) {
self.content = content()
self._visibilityTracker = .init(initialValue: VisibilityTracker<ID>(action: action))
}
public var body: some View {
ScrollView {
content
.environmentObject(visibilityTracker)
}
.background(
GeometryReader { proxy in
report(proxy: proxy)
}
)
}
func report(proxy: GeometryProxy) -> Color {
visibilityTracker.reportContainerBounds(proxy.frame(in: .global))
return Color.clear
}
}

View File

@ -11,6 +11,10 @@
8514D5BF299F04710054F185 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5BE299F04710054F185 /* GRDB */; }; 8514D5BF299F04710054F185 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5BE299F04710054F185 /* GRDB */; };
8514D5C2299F04A20054F185 /* GRDBQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5C1299F04A20054F185 /* GRDBQuery */; }; 8514D5C2299F04A20054F185 /* GRDBQuery in Frameworks */ = {isa = PBXBuildFile; productRef = 8514D5C1299F04A20054F185 /* GRDBQuery */; };
852774C129A150B100458CA7 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852774C029A150B100458CA7 /* Line.swift */; }; 852774C129A150B100458CA7 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 852774C029A150B100458CA7 /* Line.swift */; };
8528897529B2B86B003F2E16 /* CrownOfThorns.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897429B2B86B003F2E16 /* CrownOfThorns.swift */; };
8528897C29BD69B2003F2E16 /* VisibilityTrackingScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897929BD69B1003F2E16 /* VisibilityTrackingScrollView.swift */; };
8528897D29BD69B2003F2E16 /* VisibilityTrackingModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897A29BD69B1003F2E16 /* VisibilityTrackingModifier.swift */; };
8528897E29BD69B2003F2E16 /* VisibilityTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8528897B29BD69B2003F2E16 /* VisibilityTracker.swift */; };
85431A892905F4F500EE0760 /* glossApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A882905F4F500EE0760 /* glossApp.swift */; }; 85431A892905F4F500EE0760 /* glossApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A882905F4F500EE0760 /* glossApp.swift */; };
85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A8A2905F4F500EE0760 /* ContentView.swift */; }; 85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85431A8A2905F4F500EE0760 /* ContentView.swift */; };
85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85431A8C2905F4F600EE0760 /* Assets.xcassets */; }; 85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 85431A8C2905F4F600EE0760 /* Assets.xcassets */; };
@ -21,14 +25,17 @@
8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96629A183EE001EF84F /* AppDatabase.swift */; }; 8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96629A183EE001EF84F /* AppDatabase.swift */; };
8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96829A18A6C001EF84F /* LineRequest.swift */; }; 8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96829A18A6C001EF84F /* LineRequest.swift */; };
8590D96C29A92146001EF84F /* JsonImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96B29A92146001EF84F /* JsonImport.swift */; }; 8590D96C29A92146001EF84F /* JsonImport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96B29A92146001EF84F /* JsonImport.swift */; };
8590D96E29A927CF001EF84F /* Seg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8590D96D29A927CF001EF84F /* Seg.swift */; };
8590D97229A9366C001EF84F /* john_export.json in Resources */ = {isa = PBXBuildFile; fileRef = 8590D97129A9366C001EF84F /* john_export.json */; };
85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE329ACF54A00307621 /* ScrollableView.swift */; }; 85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE329ACF54A00307621 /* ScrollableView.swift */; };
85942EE729AD083600307621 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 85942EE629AD083600307621 /* Introspect */; }; 85942EE729AD083600307621 /* Introspect in Frameworks */ = {isa = PBXBuildFile; productRef = 85942EE629AD083600307621 /* Introspect */; };
85942EE929AD51A100307621 /* Ribbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE829AD51A100307621 /* Ribbon.swift */; }; 85942EE929AD51A100307621 /* Ribbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EE829AD51A100307621 /* Ribbon.swift */; };
85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEA29AD55A400307621 /* RibbonRequest.swift */; }; 85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEA29AD55A400307621 /* RibbonRequest.swift */; };
85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEC29AEA04200307621 /* SelectedRibbon.swift */; }; 85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEC29AEA04200307621 /* SelectedRibbon.swift */; };
85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */; }; 85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */; };
85942EF529B108C600307621 /* Seg.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EF429B108C600307621 /* Seg.swift */; };
85942EF729B108EA00307621 /* SegDenormRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EF629B108EA00307621 /* SegDenormRequest.swift */; };
85942EF929B1150B00307621 /* SegDenorm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85942EF829B1150B00307621 /* SegDenorm.swift */; };
85942EFE29B11C0B00307621 /* john_export.json in Resources */ = {isa = PBXBuildFile; fileRef = 85942EFC29B11C0A00307621 /* john_export.json */; };
85942EFF29B11C0B00307621 /* mark_export.json in Resources */ = {isa = PBXBuildFile; fileRef = 85942EFD29B11C0B00307621 /* mark_export.json */; };
85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */; }; 85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */; };
85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */; }; 85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
@ -36,6 +43,10 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
8514D5BB299EFB780054F185 /* store.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = store.db; sourceTree = "<group>"; }; 8514D5BB299EFB780054F185 /* store.db */ = {isa = PBXFileReference; lastKnownFileType = file; path = store.db; sourceTree = "<group>"; };
852774C029A150B100458CA7 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; }; 852774C029A150B100458CA7 /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
8528897429B2B86B003F2E16 /* CrownOfThorns.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrownOfThorns.swift; sourceTree = "<group>"; };
8528897929BD69B1003F2E16 /* VisibilityTrackingScrollView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibilityTrackingScrollView.swift; sourceTree = "<group>"; };
8528897A29BD69B1003F2E16 /* VisibilityTrackingModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibilityTrackingModifier.swift; sourceTree = "<group>"; };
8528897B29BD69B2003F2E16 /* VisibilityTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibilityTracker.swift; sourceTree = "<group>"; };
85431A852905F4F500EE0760 /* gloss.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = gloss.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85431A852905F4F500EE0760 /* gloss.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = gloss.app; sourceTree = BUILT_PRODUCTS_DIR; };
85431A882905F4F500EE0760 /* glossApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = glossApp.swift; sourceTree = "<group>"; }; 85431A882905F4F500EE0760 /* glossApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = glossApp.swift; sourceTree = "<group>"; };
85431A8A2905F4F500EE0760 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; }; 85431A8A2905F4F500EE0760 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
@ -47,13 +58,16 @@
8590D96629A183EE001EF84F /* AppDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDatabase.swift; sourceTree = "<group>"; }; 8590D96629A183EE001EF84F /* AppDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDatabase.swift; sourceTree = "<group>"; };
8590D96829A18A6C001EF84F /* LineRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineRequest.swift; sourceTree = "<group>"; }; 8590D96829A18A6C001EF84F /* LineRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LineRequest.swift; sourceTree = "<group>"; };
8590D96B29A92146001EF84F /* JsonImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonImport.swift; sourceTree = "<group>"; }; 8590D96B29A92146001EF84F /* JsonImport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JsonImport.swift; sourceTree = "<group>"; };
8590D96D29A927CF001EF84F /* Seg.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seg.swift; sourceTree = "<group>"; };
8590D97129A9366C001EF84F /* john_export.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = john_export.json; sourceTree = "<group>"; };
85942EE329ACF54A00307621 /* ScrollableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollableView.swift; sourceTree = "<group>"; }; 85942EE329ACF54A00307621 /* ScrollableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollableView.swift; sourceTree = "<group>"; };
85942EE829AD51A100307621 /* Ribbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ribbon.swift; sourceTree = "<group>"; }; 85942EE829AD51A100307621 /* Ribbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ribbon.swift; sourceTree = "<group>"; };
85942EEA29AD55A400307621 /* RibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RibbonRequest.swift; sourceTree = "<group>"; }; 85942EEA29AD55A400307621 /* RibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RibbonRequest.swift; sourceTree = "<group>"; };
85942EEC29AEA04200307621 /* SelectedRibbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbon.swift; sourceTree = "<group>"; }; 85942EEC29AEA04200307621 /* SelectedRibbon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbon.swift; sourceTree = "<group>"; };
85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbonRequest.swift; sourceTree = "<group>"; }; 85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectedRibbonRequest.swift; sourceTree = "<group>"; };
85942EF429B108C600307621 /* Seg.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seg.swift; sourceTree = "<group>"; };
85942EF629B108EA00307621 /* SegDenormRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegDenormRequest.swift; sourceTree = "<group>"; };
85942EF829B1150B00307621 /* SegDenorm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegDenorm.swift; sourceTree = "<group>"; };
85942EFC29B11C0A00307621 /* john_export.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = john_export.json; sourceTree = "<group>"; };
85942EFD29B11C0B00307621 /* mark_export.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = mark_export.json; sourceTree = "<group>"; };
85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AveriaSerifLibre-Regular.ttf"; sourceTree = "<group>"; }; 85F01DF72978787800F317B4 /* AveriaSerifLibre-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "AveriaSerifLibre-Regular.ttf"; sourceTree = "<group>"; };
85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "xe-Dogma-Bold.ttf"; sourceTree = "<group>"; }; 85F01DFA2978790400F317B4 /* xe-Dogma-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "xe-Dogma-Bold.ttf"; sourceTree = "<group>"; };
85F01DFC29787B3500F317B4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; }; 85F01DFC29787B3500F317B4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
@ -87,10 +101,17 @@
85431A7C2905F4F500EE0760 = { 85431A7C2905F4F500EE0760 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
8528897429B2B86B003F2E16 /* CrownOfThorns.swift */,
85942EEC29AEA04200307621 /* SelectedRibbon.swift */, 85942EEC29AEA04200307621 /* SelectedRibbon.swift */,
85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */, 85942EEE29AEA18300307621 /* SelectedRibbonRequest.swift */,
85942EF429B108C600307621 /* Seg.swift */,
85942EF629B108EA00307621 /* SegDenormRequest.swift */,
85942EF829B1150B00307621 /* SegDenorm.swift */,
85942EEA29AD55A400307621 /* RibbonRequest.swift */, 85942EEA29AD55A400307621 /* RibbonRequest.swift */,
85942EE329ACF54A00307621 /* ScrollableView.swift */, 85942EE329ACF54A00307621 /* ScrollableView.swift */,
8528897B29BD69B2003F2E16 /* VisibilityTracker.swift */,
8528897A29BD69B1003F2E16 /* VisibilityTrackingModifier.swift */,
8528897929BD69B1003F2E16 /* VisibilityTrackingScrollView.swift */,
8590D96A29A8374B001EF84F /* json */, 8590D96A29A8374B001EF84F /* json */,
8514D5BA299EF2EC0054F185 /* db */, 8514D5BA299EF2EC0054F185 /* db */,
85F01DF9297878B400F317B4 /* fonts */, 85F01DF9297878B400F317B4 /* fonts */,
@ -112,7 +133,6 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
8590D96B29A92146001EF84F /* JsonImport.swift */, 8590D96B29A92146001EF84F /* JsonImport.swift */,
8590D96D29A927CF001EF84F /* Seg.swift */,
85F01DFD297A4EEA00F317B4 /* gloss.entitlements */, 85F01DFD297A4EEA00F317B4 /* gloss.entitlements */,
85F01DFC29787B3500F317B4 /* Info.plist */, 85F01DFC29787B3500F317B4 /* Info.plist */,
8590D96629A183EE001EF84F /* AppDatabase.swift */, 8590D96629A183EE001EF84F /* AppDatabase.swift */,
@ -141,7 +161,8 @@
8590D96A29A8374B001EF84F /* json */ = { 8590D96A29A8374B001EF84F /* json */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
8590D97129A9366C001EF84F /* john_export.json */, 85942EFC29B11C0A00307621 /* john_export.json */,
85942EFD29B11C0B00307621 /* mark_export.json */,
); );
path = json; path = json;
sourceTree = "<group>"; sourceTree = "<group>";
@ -236,7 +257,8 @@
85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */, 85F01DFB2978790400F317B4 /* xe-Dogma-Bold.ttf in Resources */,
85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */, 85F01DF82978787800F317B4 /* AveriaSerifLibre-Regular.ttf in Resources */,
8514D5BC299EFB780054F185 /* store.db in Resources */, 8514D5BC299EFB780054F185 /* store.db in Resources */,
8590D97229A9366C001EF84F /* john_export.json in Resources */, 85942EFF29B11C0B00307621 /* mark_export.json in Resources */,
85942EFE29B11C0B00307621 /* john_export.json in Resources */,
85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */, 85431A8D2905F4F600EE0760 /* Assets.xcassets in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -251,17 +273,23 @@
85431A922905F4F600EE0760 /* Persistence.swift in Sources */, 85431A922905F4F600EE0760 /* Persistence.swift in Sources */,
85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */, 85942EEB29AD55A400307621 /* RibbonRequest.swift in Sources */,
85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */, 85431A8B2905F4F500EE0760 /* ContentView.swift in Sources */,
85942EF529B108C600307621 /* Seg.swift in Sources */,
8528897529B2B86B003F2E16 /* CrownOfThorns.swift in Sources */,
85431A952905F4F600EE0760 /* gloss.xcdatamodeld in Sources */, 85431A952905F4F600EE0760 /* gloss.xcdatamodeld in Sources */,
85942EE929AD51A100307621 /* Ribbon.swift in Sources */, 85942EE929AD51A100307621 /* Ribbon.swift in Sources */,
8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */, 8590D96729A183EE001EF84F /* AppDatabase.swift in Sources */,
8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */, 8590D96929A18A6D001EF84F /* LineRequest.swift in Sources */,
8590D96E29A927CF001EF84F /* Seg.swift in Sources */,
852774C129A150B100458CA7 /* Line.swift in Sources */, 852774C129A150B100458CA7 /* Line.swift in Sources */,
85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */, 85942EEF29AEA18300307621 /* SelectedRibbonRequest.swift in Sources */,
8590D96C29A92146001EF84F /* JsonImport.swift in Sources */, 8590D96C29A92146001EF84F /* JsonImport.swift in Sources */,
85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */, 85942EED29AEA04200307621 /* SelectedRibbon.swift in Sources */,
85431A892905F4F500EE0760 /* glossApp.swift in Sources */, 85431A892905F4F500EE0760 /* glossApp.swift in Sources */,
8528897C29BD69B2003F2E16 /* VisibilityTrackingScrollView.swift in Sources */,
85942EF929B1150B00307621 /* SegDenorm.swift in Sources */,
85431A9C2905F5D800EE0760 /* SwiftUIView.swift in Sources */, 85431A9C2905F5D800EE0760 /* SwiftUIView.swift in Sources */,
8528897E29BD69B2003F2E16 /* VisibilityTracker.swift in Sources */,
85942EF729B108EA00307621 /* SegDenormRequest.swift in Sources */,
8528897D29BD69B2003F2E16 /* VisibilityTrackingModifier.swift in Sources */,
85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */, 85942EE429ACF54A00307621 /* ScrollableView.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View File

@ -43,6 +43,13 @@ struct AppDatabase {
t.column("verse", .integer) t.column("verse", .integer)
} }
try db.create(table: "Seg") { t in
t.autoIncrementedPrimaryKey("id")
t.column("seg_id", .integer).notNull()
t.column("line_id", .integer).notNull()
t.column("book", .text).notNull()
}
try db.create(table: "Ribbon") { t in try db.create(table: "Ribbon") { t in
t.autoIncrementedPrimaryKey("id") t.autoIncrementedPrimaryKey("id")
t.column("book", .text).notNull() t.column("book", .text).notNull()
@ -53,6 +60,11 @@ struct AppDatabase {
t.autoIncrementedPrimaryKey("id") t.autoIncrementedPrimaryKey("id")
t.column("ribbonId", .integer).notNull() t.column("ribbonId", .integer).notNull()
} }
try db.create(table: "foo2") { t in
t.autoIncrementedPrimaryKey("id")
t.column("ribbonId", .integer).notNull()
}
} }
@ -117,17 +129,32 @@ extension AppDatabase {
let imports : JsonImport = load("john_export.json") let imports : JsonImport = load("john_export.json")
try dbWriter.write { db in try dbWriter.write { db in
// try db.execute(sql: "DELETE FROM Line")
// try db.execute(sql: "DELETE FROM Seg")
// try db.execute(sql: "DELETE FROM Ribbon")
// try db.execute(sql: "DELETE FROM SelectedRibbon")
if try Line.all().isEmpty(db) { if try Line.all().isEmpty(db) {
for l in imports.lines { for l in imports.lines {
print("here") print("here")
print(l.body) print(l.body)
_ = try l.inserted(db) _ = try l.inserted(db)
} }
for l in imports.segs {
print("here SEGS")
print(l.seg_id)
_ = try l.inserted(db)
}
// print("cat") // print("cat")
// try createRandomLines(db) // try createRandomLines(db)
_ = try Ribbon(id: nil, book: "bible.john", scrollOffset: 0).inserted(db)
_ = try Ribbon(id: nil, book: "bible.john", scrollOffset: 2000).inserted(db) _ = try Ribbon(id: 1, book: "bible.john", scrollOffset: 0).inserted(db)
_ = try Ribbon(id: 2, book: "bible.john", scrollOffset: 2000).inserted(db)
_ = try SelectedRibbon(id: 1, ribbonId: 1).inserted(db) _ = try SelectedRibbon(id: 1, ribbonId: 1).inserted(db)
} }
} }
@ -151,12 +178,6 @@ extension AppDatabase {
// } // }
// } // }
// /// Support for `createRandomLinesIfEmpty()` and `refreshLines()`.
private func createRandomLines(_ db: Database) throws {
for _ in 0..<500 {
_ = try Line.makeRandom().inserted(db) // insert but ignore inserted id
}
}
} }
// MARK: - Database Access: Reads // MARK: - Database Access: Reads

View File

@ -10,6 +10,7 @@ import GRDB
import GRDBQuery import GRDBQuery
import Introspect import Introspect
import os import os
let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "network") let logger = Logger(subsystem: Bundle.main.bundleIdentifier!, category: "network")
// var curBook = "John" // var curBook = "John"
@ -48,12 +49,13 @@ struct SwitchButton : View {
var ribbon: Ribbon var ribbon: Ribbon
// var selectedRibbon: SelectedRibbon // var selectedRibbon: SelectedRibbon
@Binding var book : String // @Binding var book : String
@Binding var scrollDelegate : ScrollViewHandler
@Binding var scrollView : UIScrollView? @Binding var scrollView : UIScrollView?
@Binding var scrollUpdate : Bool
@Environment(\.appDatabase) private var appDatabase @Environment(\.appDatabase) private var appDatabase
@Query(SelectedRibbonRequest()) private var sr: [Ribbon] @Query(SelectedRibbonRequest()) private var sr: [Ribbon]
@State var saveOffset = CGFloat() @State var saveOffset = CGFloat()
@ -66,21 +68,22 @@ struct SwitchButton : View {
var selectedRibbon = sr[0] var selectedRibbon = sr[0]
Print("SELECTED RIBBON", selectedRibbon) Print("SELECTED RIBBON", selectedRibbon)
var saveScrollOffset = scrollView!.contentOffset.y var saveScrollOffset = scrollDelegate.scrollOffset
var editedRibbon = selectedRibbon var editedRibbon = selectedRibbon
editedRibbon.scrollOffset = Int(saveScrollOffset)
_ = try await appDatabase.saveRibbon(&editedRibbon)
_ = Print("editedRibbon", editedRibbon)
_ = Print("ribbon", ribbon)
Print("ribbon offset saved") Print("ribbon offset saved")
scrollUpdate = true
if (selectedRibbon.id != ribbon.id!) { if (selectedRibbon.id != ribbon.id!) {
Print("switching") Print("switching")
book = ribbon.book // book = ribbon.book
scrollView!.contentOffset.y = CGFloat(ribbon.scrollOffset) Print("applying offset", CGFloat(ribbon.scrollOffset))
// scrollOffset = CGFloat(ribbon.scrollOffset)
// scrollDelegate.scrollOffset = CGFloat(ribbon.scrollOffset)
scrollDelegate.scrollOffset = CGFloat(ribbon.scrollOffset)
// scrollView!.contentOffset.y = CGFloat(ribbon.scrollOffset)
// scrollOffset = CGFloat(1500) // scrollOffset = CGFloat(1500)
var updateSelectRibbon = SelectedRibbon(id: Int64(1), ribbonId: ribbon.id!) var updateSelectRibbon = SelectedRibbon(id: Int64(1), ribbonId: ribbon.id!)
Print("Savingg") Print("Savingg")
@ -92,6 +95,13 @@ struct SwitchButton : View {
} }
} }
editedRibbon.scrollOffset = Int(saveScrollOffset)
_ = try await appDatabase.saveRibbon(&editedRibbon)
_ = Print("editedRibbon", editedRibbon)
_ = Print("ribbon", ribbon)
} }
} }
@ -103,17 +113,127 @@ struct SwitchButton : View {
class ScrollViewHandler: NSObject { class ScrollViewHandler: NSObject {
public var scrollOffset = CGFloat(10)
} }
extension ScrollViewHandler: UIScrollViewDelegate { extension ScrollViewHandler: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) { func scrollViewDidScroll(_ scrollView: UIScrollView) {
print("delegate", scrollView.contentOffset.y) scrollOffset = CGFloat(scrollView.contentOffset.y)
// print("delegate", scrollView.contentOffset.y)
// print("delegate prop", self.scrollOffset)
} }
} }
class Verse: NSObject, Codable {
var body: String
var verse: Int
}
func makeVerseView(seg: SegDenorm) -> some View {
var retView = Text("")
var segSplit = seg.body.components(separatedBy: ";;")
// Text(segSplit[0].body)
// .id(seg.id)
// VStack {
// ForEach(segSplit.indices) { i in
let decoder = JSONDecoder()
segSplit.enumerated().forEach({ (index, item) in
let verse = try! decoder.decode(Verse.self, from: item.data(using: .utf8)!)
retView = retView + Text(String(verse.verse))
// Text(seg.body)
// .contentShape(Rectangle())
.font(Font.custom("AveriaSerifLibre-Regular", size: 20))
.baselineOffset(6.0)
.foregroundColor(Color.white)
retView = retView + Text(verse.body)
// .frame(maxWidth: .infinity, alignment: .leading)
// .contentShape(Rectangle())
.foregroundColor(Color.white)
.font(Font.custom("AveriaSerifLibre-Regular", size: 30))
// .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
// .listRowInsets(EdgeInsets())
// .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
// .listRowSeparator(.hidden)
// .id(String(seg.id) + "body" + String(i))
// .id(seg.id)
//.onTapGesture {
// selectedLine = seg.id
// //Print(selectedLine)
//}
// .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
// .listRowInsets(EdgeInsets())
// .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
// .listRowSeparator(.hidden)
// .id(String(seg.id) + "verse" + String(i))
// .id(seg.id)
//.onTapGesture {
// selectedLine = seg.id
// //Print(selectedLine)
//}
})
// }
return retView
}
private struct SegRow: View {
var seg: SegDenorm
var body: some View {
// makeVerseView(seg: seg)
var retView = Text("")
var segSplit = seg.body.components(separatedBy: ";;")
let decoder = JSONDecoder()
// Text(segSplit[0].body)
// .id(seg.id)
// VStack {
// ForEach(segSplit.indices) { i in
segSplit.enumerated().forEach({ (index, item) in
let verse = try! decoder.decode(Verse.self, from: item.data(using: .utf8)!)
retView = retView + Text(String(verse.verse))
// Text(seg.body)
// .contentShape(Rectangle())
.font(Font.custom("AveriaSerifLibre-Regular", size: 20))
.baselineOffset(6.0)
.foregroundColor(Color.white)
retView = retView + Text(verse.body)
// .frame(maxWidth: .infinity, alignment: .leading)
// .contentShape(Rectangle())
.foregroundColor(Color.white)
.font(Font.custom("AveriaSerifLibre-Regular", size: 30))
// .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
// .listRowInsets(EdgeInsets())
// .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
// .listRowSeparator(.hidden)
// .id(String(seg.id) + "body" + String(i))
// .id(seg.id)
//.onTapGesture {
// selectedLine = seg.id
// //Print(selectedLine)
//}
// .listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2))
// .listRowInsets(EdgeInsets())
// .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
// .listRowSeparator(.hidden)
// .id(String(seg.id) + "verse" + String(i))
// .id(seg.id)
//.onTapGesture {
// selectedLine = seg.id
// //Print(selectedLine)
//}
})
// }
return retView
}
}
struct ContentView: View { struct ContentView: View {
@ -126,9 +246,13 @@ struct ContentView: View {
@State var scrollOffset = CGFloat() @State var scrollOffset = CGFloat()
@State var thisScrollView : UIScrollView? @State var thisScrollView : UIScrollView?
@State var scrollUpdate = false
@State var initLoad = false @State var initLoad = false
var scrollDelegate = ScrollViewHandler() @Query(SegDenormRequest(book: "bible.mark")) private var segs: [SegDenorm]
@State var scrollDelegate: ScrollViewHandler
// @State var scrollDelegate = ScrollViewHandler()
// @State var selectedRibbon: Ribbon!, // @State var selectedRibbon: Ribbon!,
// @State var selectedRibbon: Ribbon! // @State var selectedRibbon: Ribbon!
@ -142,94 +266,135 @@ struct ContentView: View {
@State var readOffset = CGPoint() @State var readOffset = CGPoint()
@Query(LineRequest(ordering: .byScore, book: "bible.john")) private var lines: [Line] @State var refresh: Bool = false
@Query(RibbonRequest()) private var ribbons: [Ribbon] @Query(RibbonRequest()) private var ribbons: [Ribbon]
// @Query*RibbonRequest> private var selectedRibbon: [Ribbon]
// @Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1))) private var selectedRibbon: [Ribbon] // @Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1))) private var selectedRibbon: [Ribbon]
init() { init() {
UITableView.appearance().backgroundColor = UIColor(Color(red: 0.2, green: 0.2, blue: 0.2)) UITableView.appearance().backgroundColor = UIColor(Color(red: 0.2, green: 0.2, blue: 0.2))
// _selectedRibbon = Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1))) // _selectedRibbon = Query(RibbonRequest(id: Int64(UserDefaults.standard.optionalInt(forKey: "lastRibbonId") ?? 1)))
self._scrollDelegate = State(initialValue: ScrollViewHandler())
Print("initalizing")
} }
var body: some View { var body: some View {
Print("rendering")
GeometryReader { geometry in GeometryReader { geometry in
ZStack{ ZStack{
VStack{ VStack{
Text("cat" + String(selectedRibbon[0].id!))
VStack{
// // Star(corners: 6, smoothness: 0.85, initAngle:-CGFloat.pi / 4)
// .fill(.blue)
// .frame(width: 200, height: 200)
// .background(Color.gray.opacity(0.0))
// Star(corners: 6, smoothness: 0.85, initAngle:-CGFloat.pi / 2)
// .fill(.blue)
// .frame(width: 200, height: 200)
// .background(Color.gray.opacity(0.0))
// MyCustomShape().frame(width: 10, height: 10)
}
Text("MRK")
.font(Font.custom("AveriaSerifLibre-Regular", size: 20))
.foregroundColor(Color.white)
.background(Color(red: 0.3, green: 0.3, blue: 0.3))
.overlay( MyCustomShape().frame(width: 120, height: 100).foregroundColor(.white))
.frame(width: 120, height: 120)
Text("MTW")
.font(Font.custom("AveriaSerifLibre-Regular", size: 20))
.foregroundColor(Color.white)
.overlay( MyCustomShape().frame(width: 120, height: 100))
.frame(width: 120, height: 120)
// Text("cat" + String(selectedRibbon[0].id!))
ForEach(ribbons) { ribbon in ForEach(ribbons) { ribbon in
//ForEach(selectedRibbon) { sr in //ForEach(selectedRibbon) { sr in
SwitchButton(ribbon: ribbon, SwitchButton(ribbon: ribbon,
book: $lines.book, scrollDelegate: $scrollDelegate,
scrollView:$thisScrollView scrollView:$thisScrollView,
scrollUpdate:$scrollUpdate
) )
.buttonStyle(BlueButtonStyle()) .buttonStyle(BlueButtonStyle())
//} //}
} }
} }
.frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading) .frame(width: geometry.size.width, height: geometry.size.height, alignment: .topLeading)
.background(Color.red) .background(Color(red: 0.1, green: 0.1, blue: 0.1))
ScrollViewReader { proxy in
VisibilityTrackingScrollView(action: handleVisibilityChanged) {
// ScrollView {
// VStack (spacing: 0){
ScrollViewReader { proxy in
//ScrollableView($offset, animationDuration: 0) {
// OffsetObservingScrollView(offset: $readOffset)
ScrollView
{
// List {
LazyVStack { LazyVStack {
ForEach(lines) { line in Text(refresh ? "Selected" : "not Selected")
Text(String(line.body)) Button("Jump to #8") {
.frame(maxWidth: .infinity, alignment: .leading)
.contentShape(Rectangle()) proxy.scrollTo("5", anchor: .top)
.font(Font.custom("AveriaSerifLibre-Regular", size: 30))
.listRowBackground(Color(red: 0.2, green: 0.8, blue: 0.2)) DispatchQueue.main.async {
.foregroundColor(Color.white) scrollOffset = 340
.listRowInsets(EdgeInsets()) refresh.toggle()
}
}
ForEach(segs) { seg in
SegRow(seg: seg)
.id("\(seg.id)")
.padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20)) .padding(EdgeInsets(top: 10, leading: 20, bottom: 40, trailing: 20))
.listRowSeparator(.hidden) .trackVisibility(id: "\(seg.id)")
.id(line.id!)
.onTapGesture { // .onChange(of: geometry.frame(in: .named("scrollView"))) { imageRect in
selectedLine = line.id! // Print(imageRect)
//Print(selectedLine) // Print(outerProxy)
} // if isInView(innerRect: imageRect, isIn: outerProxy) {
// visibleIndex.insert(item)
// } else {
// visibleIndex.remove(item)
// }
// } // }
} }
} }
.background(Color(red: 0.2, green: 0.2, blue: 0.2)) .background(Color(red: 0.2, green: 0.2, blue: 0.2))
//.onChange(of: scrollTo1) { scrollTo in
// // scrollTo1 = 0
// let target = scrollTo
// //Print("hellosdf")
// //Print("value:", target)
// //Print("value2:", scrollTo)
// proxy.scrollTo(target, anchor: .top)
//}
} }
.introspectScrollView { scrollView in .introspectScrollView { scrollView in
//let width = scrollView.contentSize.width - scrollView.frame.width
//Print(scrollView.contentOffset.x)
Print("introspect")
scrollView.delegate = scrollDelegate
if (thisScrollView == nil) {
thisScrollView = scrollView
scrollView.contentOffset.y = CGFloat(selectedRibbon[0].scrollOffset)
}
// scrollView.contentOffset.y = scrollOffset // Print("introspect")
// if (scrollOffset != scrollView.contentOffset.y) { scrollView.delegate = scrollDelegate
// scrollView.contentOffset.y = scrollOffset Print("Scroll delegate offset", scrollDelegate.scrollOffset)
// }
} if (scrollOffset != 0) {
Print("GOT THEHREHREH")
scrollView.contentOffset.y = scrollView.contentOffset.y + scrollOffset
DispatchQueue.main.async { scrollOffset = 0 }
}
if (thisScrollView == nil) {
Print("init scroll")
thisScrollView = scrollView
scrollView.contentOffset.y = CGFloat(selectedRibbon[0].scrollOffset)
}
}
.listStyle(PlainListStyle()) .listStyle(PlainListStyle())
}
}
// }
.background(Color(red: 0.2, green: 0.2, blue: 0.2)) .background(Color(red: 0.2, green: 0.2, blue: 0.2))
.frame(width: geometry.size.width - 50) .frame(width: geometry.size.width - 50)
.offset(x:30 , y:0) .offset(x:30 , y:0)
@ -247,7 +412,9 @@ struct ContentView: View {
// logger.error("hello222") // logger.error("hello222")
// NSLog("hellooo") // NSLog("hellooo")
//Print(viewState.width) //Print(viewState.width)
viewState.width = gesture.translation.width if (abs(gesture.translation.width) > 20) {
viewState.width = gesture.translation.width
}
//offset.y = gesture.translation.width //offset.y = gesture.translation.width
// logger.log("hello") // logger.log("hello")
} }
@ -270,22 +437,16 @@ struct ContentView: View {
} }
} }
} }
}
func handleVisibilityChanged(_ id: String, change: VisibilityChange, tracker: VisibilityTracker<String>) {
private struct LineRow: View { switch change {
var line: Line case .shown: print("\(id) shown")
case .hidden: print("\(id) hidden")
var body: some View {
HStack {
//Print("Here I am", line.body)
Text(line.body)
Spacer()
} }
print(tracker.visibleViews)
} }
} }
private let itemFormatter: DateFormatter = { private let itemFormatter: DateFormatter = {
@ -303,8 +464,6 @@ struct ContentView_Previews: PreviewProvider {
} }
} }
extension View { extension View {
func Print(_ vars: Any...) -> some View { func Print(_ vars: Any...) -> some View {
for v in vars { print(v) } for v in vars { print(v) }

View File

@ -7,5 +7,5 @@
struct JsonImport: Decodable { struct JsonImport: Decodable {
var lines : [Line] var lines : [Line]
// var segs: [Seg] var segs: [Seg]
} }

View File

@ -17,16 +17,6 @@ struct Line: Identifiable, Equatable {
} }
extension Line { extension Line {
private static let names = [
"Arthur", "Anita", "Barbara", "Bernard", "Craig", "Chiara", "David",
"Dean", "Éric", "Elena", "Fatima", "Frederik", "Gilbert", "Georgette",
"Henriette", "Hassan", "Ignacio", "Irene", "Julie", "Jack", "Karl",
"Kristel", "Louis", "Liz", "Masashi", "Mary", "Noam", "Nicole",
"Ophelie", "Oleg", "Pascal", "Patricia", "Quentin", "Quinn", "Raoul",
"Rachel", "Stephan", "Susie", "Tristan", "Tatiana", "Ursule", "Urbain",
"Victor", "Violette", "Wilfried", "Wilhelmina", "Yvon", "Yann",
"Zazie", "Zoé"]
private static let books = [ private static let books = [
"John", "Matthew", "Imitation of Christ"] "John", "Matthew", "Imitation of Christ"]
@ -36,16 +26,6 @@ extension Line {
// Line(id: nil, chap: 1, body: "") // Line(id: nil, chap: 1, body: "")
// } // }
// Creates a new player with random name and random score
static func makeRandom() -> Line {
Line(id: nil, chap: randomScore(), verse: 1, body: randomName(), book: randomBook())
}
/// Returns a random name
static func randomName() -> String {
names.randomElement()!
}
/// Returns a random score /// Returns a random score
static func randomScore() -> Int { static func randomScore() -> Int {
10 * Int.random(in: 0...100) 10 * Int.random(in: 0...100)
@ -113,11 +93,3 @@ extension DerivableRequest<Line> {
// Line.Columns.name.collating(.localizedCaseInsensitiveCompare)) // Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
//} //}
} }
//
// Line.swift
// gloss
//
// Created by Saint on 2/18/23.
//
import Foundation

View File

@ -1,85 +0,0 @@
//
// Seg.swift
// gloss
//
// Created by Saint on 2/24/23.
//
import GRDB
/// The Line struct.
///
/// Identifiable conformance supports SwiftUI list animations, and type-safe
/// GRDB primary key methods.
/// Equatable conformance supports tests.
struct Seg: Identifiable, Equatable {
/// The player id.
///
/// Int64 is the recommended type for auto-incremented database ids.
/// Use nil for players that are not inserted yet in the database.
var id: Int64?
var rowids: String
var book: String
}
extension Seg {
}
// MARK: - Persistence
/// Make Line a Codable Record.
///
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#records>
extension Seg: Codable, FetchableRecord, MutablePersistableRecord {
// Define database columns from CodingKeys
fileprivate enum Columns {
static let id = Column(CodingKeys.id)
static let rowids = Column(CodingKeys.rowids)
static let book = Column(CodingKeys.book)
}
/// Updates a player id after it has been inserted in the database.
mutating func didInsert(_ inserted: InsertionSuccess) {
id = inserted.rowID
}
}
// MARK: - Line Database Requests
/// Define some player requests used by the application.
///
/// See <https://github.com/groue/GRDB.swift/blob/master/README.md#requests>
/// See <https://github.com/groue/GRDB.swift/blob/master/Documentation/GoodPracticesForDesigningRecordTypes.md>
extension DerivableRequest<Line> {
/// A request of players ordered by name.
///
/// For example:
///
/// let players: [Line] = try dbWriter.read { db in
/// try Line.all().orderedByName().fetchAll(db)
/// }
//func orderedByName() -> Self {
// // Sort by name in a localized case insensitive fashion
// // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison
// order(Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
//}
///// A request of players ordered by score.
/////
///// For example:
/////
///// let players: [Line] = try dbWriter.read { db in
///// try Line.all().orderedByScore().fetchAll(db)
///// }
///// let bestLine: Line? = try dbWriter.read { db in
///// try Line.all().orderedByScore().fetchOne(db)
///// }
//func orderedByScore() -> Self {
// // Sort by descending score, and then by name, in a
// // localized case insensitive fashion
// // See https://github.com/groue/GRDB.swift/blob/master/README.md#string-comparison
// order(
// Line.Columns.score.desc,
// Line.Columns.name.collating(.localizedCaseInsensitiveCompare))
//}
}

File diff suppressed because one or more lines are too long

1
json/mark_export.json Normal file

File diff suppressed because one or more lines are too long