[{"data":1,"prerenderedAt":1638},["ShallowReactive",2],{"content-query-bQizpsqj0U":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":7,"date":9,"aliases":10,"body":13,"_type":1630,"_id":1631,"_source":1632,"_file":1633,"_stem":1634,"_extension":1635,"bodyHtml":1636,"year":1637,"month":46,"day":46},"/archive/2016/01/01/functional-edge-approaches","2016",false,"","Functional Edge Approaches","2016-01-01T00:00:00.000Z",[11,12],"/blog/2016/1/1/mx65i5h8wp8qdwlte5ecl25sznvtuh","/2016/01/01/mx65i5h8wp8qdwlte5ecl25sznvtuh",{"type":14,"children":15,"toc":1627},"root",[16,25,31,1564,1569,1581,1608,1621],{"type":17,"tag":18,"props":19,"children":21},"element","h2",{"id":20},"because-unsolved-problems-bother-me",[22],{"type":23,"value":24},"text","Because Unsolved Problems Bother Me",{"type":17,"tag":26,"props":27,"children":28},"p",{},[29],{"type":23,"value":30},"I'm working on some code to intelligently remove arbitrary border colors from an image for reasons vaguely related to a project at work. I'm close to a solution, but there's some strangenesses I'm hitting in the core image filter stack that eludes me, so I don't have a full code dump to share, but I'm particularly proud of how I structured the edge insets code to make it more functional.",{"type":17,"tag":32,"props":33,"children":37},"pre",{"className":34,"code":35,"language":36,"meta":7,"style":7},"language-swift shiki shiki-themes solarized-dark solarized-light","private extension UIImage {\n\n    static func cropEdgeInsets(filterInfo: FilterInfo, startingSize: CGSize) -> UIEdgeInsets {\n        let inputHeight = Int(startingSize.height)\n        let inputWidth = Int(startingSize.width)\n\n        let topInset = filterInfo.calculateInset(1...inputHeight) { row in\n            return CGRect(x: 0, y: 0, width: inputWidth, height: row)\n            } ?? 0\n\n        let bottomRange = ((topInset + 1)...(inputHeight - 1)).reverse()\n        let bottomInset = filterInfo.calculateInset(bottomRange) { row in\n            return CGRect(x: 0, y: row, width: inputWidth, height: inputHeight - row)\n            } ?? 0\n\n        let leftInset = filterInfo.calculateInset(1...inputWidth) { col in\n            return CGRect(x: 0, y: 0, width: col, height: inputHeight)\n            } ?? 0\n\n        let rightRange = ((leftInset + 1)...(inputWidth - 1)).reverse()\n        let rightInset =  filterInfo.calculateInset(rightRange) { col in\n            return CGRect(x: col, y: 0, width: inputWidth - col, height: inputHeight)\n            } ?? 0\n\n        return UIEdgeInsets(top: CGFloat(topInset), left: CGFloat(leftInset), bottom: CGFloat(bottomInset), right: CGFloat(rightInset))\n    }\n\n    struct FilterInfo {\n        let maxFilter :CIFilter\n        let minFilter: CIFilter\n        let context: CIContext\n        let maximumDelta: UInt\n\n        func calculateInset\u003CU: CollectionType>(range: U, rectGenerator: (step: U.Generator.Element) -> CGRect) -> U.Generator.Element? {\n            var inset: U.Generator.Element?\n            for step in range {\n                let rect = rectGenerator(step: step)\n                self.maxFilter.updateFilterExtentsWithRect(rect)\n                self.minFilter.updateFilterExtentsWithRect(rect)\n                guard let rowDiff = self.minFilter.differenceFromFilter(self.maxFilter, context: self.context)\n                    where rowDiff \u003C= self.maximumDelta else {\n                        break\n                }\n                inset = step\n            }\n            return inset\n        }\n    }\n\n}\n","swift",[38],{"type":17,"tag":39,"props":40,"children":41},"code",{"__ignoreMap":7},[42,72,82,137,176,210,218,275,348,367,375,445,479,546,562,570,621,687,703,711,774,809,875,891,899,990,999,1007,1025,1038,1051,1064,1082,1090,1203,1230,1254,1291,1323,1352,1436,1472,1481,1490,1508,1517,1530,1539,1547,1555],{"type":17,"tag":43,"props":44,"children":47},"span",{"class":45,"line":46},"line",1,[48,54,60,66],{"type":17,"tag":43,"props":49,"children":51},{"style":50},"--shiki-default:#859900;--shiki-dark:#859900",[52],{"type":23,"value":53},"private",{"type":17,"tag":43,"props":55,"children":57},{"style":56},"--shiki-default:#93A1A1;--shiki-dark:#586E75;--shiki-default-font-weight:bold;--shiki-dark-font-weight:bold",[58],{"type":23,"value":59}," extension",{"type":17,"tag":43,"props":61,"children":63},{"style":62},"--shiki-default:#CB4B16;--shiki-dark:#CB4B16",[64],{"type":23,"value":65}," UIImage",{"type":17,"tag":43,"props":67,"children":69},{"style":68},"--shiki-default:#839496;--shiki-dark:#657B83",[70],{"type":23,"value":71}," {\n",{"type":17,"tag":43,"props":73,"children":75},{"class":45,"line":74},2,[76],{"type":17,"tag":43,"props":77,"children":79},{"emptyLinePlaceholder":78},true,[80],{"type":23,"value":81},"\n",{"type":17,"tag":43,"props":83,"children":85},{"class":45,"line":84},3,[86,91,96,102,107,112,117,122,127,132],{"type":17,"tag":43,"props":87,"children":88},{"style":56},[89],{"type":23,"value":90},"    static",{"type":17,"tag":43,"props":92,"children":93},{"style":56},[94],{"type":23,"value":95}," func",{"type":17,"tag":43,"props":97,"children":99},{"style":98},"--shiki-default:#268BD2;--shiki-dark:#268BD2",[100],{"type":23,"value":101}," cropEdgeInsets",{"type":17,"tag":43,"props":103,"children":104},{"style":68},[105],{"type":23,"value":106},"(",{"type":17,"tag":43,"props":108,"children":109},{"style":98},[110],{"type":23,"value":111},"filterInfo",{"type":17,"tag":43,"props":113,"children":114},{"style":68},[115],{"type":23,"value":116},": FilterInfo, ",{"type":17,"tag":43,"props":118,"children":119},{"style":98},[120],{"type":23,"value":121},"startingSize",{"type":17,"tag":43,"props":123,"children":124},{"style":68},[125],{"type":23,"value":126},": CGSize) ",{"type":17,"tag":43,"props":128,"children":129},{"style":50},[130],{"type":23,"value":131},"->",{"type":17,"tag":43,"props":133,"children":134},{"style":68},[135],{"type":23,"value":136}," UIEdgeInsets {\n",{"type":17,"tag":43,"props":138,"children":140},{"class":45,"line":139},4,[141,146,151,156,161,166,171],{"type":17,"tag":43,"props":142,"children":143},{"style":50},[144],{"type":23,"value":145},"        let",{"type":17,"tag":43,"props":147,"children":148},{"style":68},[149],{"type":23,"value":150}," inputHeight ",{"type":17,"tag":43,"props":152,"children":153},{"style":50},[154],{"type":23,"value":155},"=",{"type":17,"tag":43,"props":157,"children":158},{"style":50},[159],{"type":23,"value":160}," Int",{"type":17,"tag":43,"props":162,"children":163},{"style":68},[164],{"type":23,"value":165},"(startingSize.",{"type":17,"tag":43,"props":167,"children":168},{"style":98},[169],{"type":23,"value":170},"height",{"type":17,"tag":43,"props":172,"children":173},{"style":68},[174],{"type":23,"value":175},")\n",{"type":17,"tag":43,"props":177,"children":179},{"class":45,"line":178},5,[180,184,189,193,197,201,206],{"type":17,"tag":43,"props":181,"children":182},{"style":50},[183],{"type":23,"value":145},{"type":17,"tag":43,"props":185,"children":186},{"style":68},[187],{"type":23,"value":188}," inputWidth ",{"type":17,"tag":43,"props":190,"children":191},{"style":50},[192],{"type":23,"value":155},{"type":17,"tag":43,"props":194,"children":195},{"style":50},[196],{"type":23,"value":160},{"type":17,"tag":43,"props":198,"children":199},{"style":68},[200],{"type":23,"value":165},{"type":17,"tag":43,"props":202,"children":203},{"style":98},[204],{"type":23,"value":205},"width",{"type":17,"tag":43,"props":207,"children":208},{"style":68},[209],{"type":23,"value":175},{"type":17,"tag":43,"props":211,"children":213},{"class":45,"line":212},6,[214],{"type":17,"tag":43,"props":215,"children":216},{"emptyLinePlaceholder":78},[217],{"type":23,"value":81},{"type":17,"tag":43,"props":219,"children":221},{"class":45,"line":220},7,[222,226,231,235,240,245,249,255,260,265,270],{"type":17,"tag":43,"props":223,"children":224},{"style":50},[225],{"type":23,"value":145},{"type":17,"tag":43,"props":227,"children":228},{"style":68},[229],{"type":23,"value":230}," topInset ",{"type":17,"tag":43,"props":232,"children":233},{"style":50},[234],{"type":23,"value":155},{"type":17,"tag":43,"props":236,"children":237},{"style":68},[238],{"type":23,"value":239}," filterInfo.",{"type":17,"tag":43,"props":241,"children":242},{"style":98},[243],{"type":23,"value":244},"calculateInset",{"type":17,"tag":43,"props":246,"children":247},{"style":68},[248],{"type":23,"value":106},{"type":17,"tag":43,"props":250,"children":252},{"style":251},"--shiki-default:#D33682;--shiki-dark:#D33682",[253],{"type":23,"value":254},"1",{"type":17,"tag":43,"props":256,"children":257},{"style":50},[258],{"type":23,"value":259},"...",{"type":17,"tag":43,"props":261,"children":262},{"style":98},[263],{"type":23,"value":264},"inputHeight",{"type":17,"tag":43,"props":266,"children":267},{"style":68},[268],{"type":23,"value":269},") { row ",{"type":17,"tag":43,"props":271,"children":272},{"style":50},[273],{"type":23,"value":274},"in\n",{"type":17,"tag":43,"props":276,"children":278},{"class":45,"line":277},8,[279,284,289,293,298,303,308,313,318,322,326,330,334,339,343],{"type":17,"tag":43,"props":280,"children":281},{"style":50},[282],{"type":23,"value":283},"            return",{"type":17,"tag":43,"props":285,"children":286},{"style":98},[287],{"type":23,"value":288}," CGRect",{"type":17,"tag":43,"props":290,"children":291},{"style":68},[292],{"type":23,"value":106},{"type":17,"tag":43,"props":294,"children":295},{"style":98},[296],{"type":23,"value":297},"x",{"type":17,"tag":43,"props":299,"children":300},{"style":68},[301],{"type":23,"value":302},": ",{"type":17,"tag":43,"props":304,"children":305},{"style":251},[306],{"type":23,"value":307},"0",{"type":17,"tag":43,"props":309,"children":310},{"style":68},[311],{"type":23,"value":312},", ",{"type":17,"tag":43,"props":314,"children":315},{"style":98},[316],{"type":23,"value":317},"y",{"type":17,"tag":43,"props":319,"children":320},{"style":68},[321],{"type":23,"value":302},{"type":17,"tag":43,"props":323,"children":324},{"style":251},[325],{"type":23,"value":307},{"type":17,"tag":43,"props":327,"children":328},{"style":68},[329],{"type":23,"value":312},{"type":17,"tag":43,"props":331,"children":332},{"style":98},[333],{"type":23,"value":205},{"type":17,"tag":43,"props":335,"children":336},{"style":68},[337],{"type":23,"value":338},": inputWidth, ",{"type":17,"tag":43,"props":340,"children":341},{"style":98},[342],{"type":23,"value":170},{"type":17,"tag":43,"props":344,"children":345},{"style":68},[346],{"type":23,"value":347},": row)\n",{"type":17,"tag":43,"props":349,"children":351},{"class":45,"line":350},9,[352,357,362],{"type":17,"tag":43,"props":353,"children":354},{"style":68},[355],{"type":23,"value":356},"            } ",{"type":17,"tag":43,"props":358,"children":359},{"style":50},[360],{"type":23,"value":361},"??",{"type":17,"tag":43,"props":363,"children":364},{"style":251},[365],{"type":23,"value":366}," 0\n",{"type":17,"tag":43,"props":368,"children":370},{"class":45,"line":369},10,[371],{"type":17,"tag":43,"props":372,"children":373},{"emptyLinePlaceholder":78},[374],{"type":23,"value":81},{"type":17,"tag":43,"props":376,"children":378},{"class":45,"line":377},11,[379,383,388,392,397,402,407,412,416,421,426,430,435,440],{"type":17,"tag":43,"props":380,"children":381},{"style":50},[382],{"type":23,"value":145},{"type":17,"tag":43,"props":384,"children":385},{"style":68},[386],{"type":23,"value":387}," bottomRange ",{"type":17,"tag":43,"props":389,"children":390},{"style":50},[391],{"type":23,"value":155},{"type":17,"tag":43,"props":393,"children":394},{"style":68},[395],{"type":23,"value":396}," ((topInset ",{"type":17,"tag":43,"props":398,"children":399},{"style":50},[400],{"type":23,"value":401},"+",{"type":17,"tag":43,"props":403,"children":404},{"style":251},[405],{"type":23,"value":406}," 1",{"type":17,"tag":43,"props":408,"children":409},{"style":68},[410],{"type":23,"value":411},")",{"type":17,"tag":43,"props":413,"children":414},{"style":50},[415],{"type":23,"value":259},{"type":17,"tag":43,"props":417,"children":418},{"style":68},[419],{"type":23,"value":420},"(inputHeight ",{"type":17,"tag":43,"props":422,"children":423},{"style":50},[424],{"type":23,"value":425},"-",{"type":17,"tag":43,"props":427,"children":428},{"style":251},[429],{"type":23,"value":406},{"type":17,"tag":43,"props":431,"children":432},{"style":68},[433],{"type":23,"value":434},")).",{"type":17,"tag":43,"props":436,"children":437},{"style":98},[438],{"type":23,"value":439},"reverse",{"type":17,"tag":43,"props":441,"children":442},{"style":68},[443],{"type":23,"value":444},"()\n",{"type":17,"tag":43,"props":446,"children":448},{"class":45,"line":447},12,[449,453,458,462,466,470,475],{"type":17,"tag":43,"props":450,"children":451},{"style":50},[452],{"type":23,"value":145},{"type":17,"tag":43,"props":454,"children":455},{"style":68},[456],{"type":23,"value":457}," bottomInset ",{"type":17,"tag":43,"props":459,"children":460},{"style":50},[461],{"type":23,"value":155},{"type":17,"tag":43,"props":463,"children":464},{"style":68},[465],{"type":23,"value":239},{"type":17,"tag":43,"props":467,"children":468},{"style":98},[469],{"type":23,"value":244},{"type":17,"tag":43,"props":471,"children":472},{"style":68},[473],{"type":23,"value":474},"(bottomRange) { row ",{"type":17,"tag":43,"props":476,"children":477},{"style":50},[478],{"type":23,"value":274},{"type":17,"tag":43,"props":480,"children":482},{"class":45,"line":481},13,[483,487,491,495,499,503,507,511,515,520,524,528,532,537,541],{"type":17,"tag":43,"props":484,"children":485},{"style":50},[486],{"type":23,"value":283},{"type":17,"tag":43,"props":488,"children":489},{"style":98},[490],{"type":23,"value":288},{"type":17,"tag":43,"props":492,"children":493},{"style":68},[494],{"type":23,"value":106},{"type":17,"tag":43,"props":496,"children":497},{"style":98},[498],{"type":23,"value":297},{"type":17,"tag":43,"props":500,"children":501},{"style":68},[502],{"type":23,"value":302},{"type":17,"tag":43,"props":504,"children":505},{"style":251},[506],{"type":23,"value":307},{"type":17,"tag":43,"props":508,"children":509},{"style":68},[510],{"type":23,"value":312},{"type":17,"tag":43,"props":512,"children":513},{"style":98},[514],{"type":23,"value":317},{"type":17,"tag":43,"props":516,"children":517},{"style":68},[518],{"type":23,"value":519},": row, ",{"type":17,"tag":43,"props":521,"children":522},{"style":98},[523],{"type":23,"value":205},{"type":17,"tag":43,"props":525,"children":526},{"style":68},[527],{"type":23,"value":338},{"type":17,"tag":43,"props":529,"children":530},{"style":98},[531],{"type":23,"value":170},{"type":17,"tag":43,"props":533,"children":534},{"style":68},[535],{"type":23,"value":536},": inputHeight ",{"type":17,"tag":43,"props":538,"children":539},{"style":50},[540],{"type":23,"value":425},{"type":17,"tag":43,"props":542,"children":543},{"style":68},[544],{"type":23,"value":545}," row)\n",{"type":17,"tag":43,"props":547,"children":549},{"class":45,"line":548},14,[550,554,558],{"type":17,"tag":43,"props":551,"children":552},{"style":68},[553],{"type":23,"value":356},{"type":17,"tag":43,"props":555,"children":556},{"style":50},[557],{"type":23,"value":361},{"type":17,"tag":43,"props":559,"children":560},{"style":251},[561],{"type":23,"value":366},{"type":17,"tag":43,"props":563,"children":565},{"class":45,"line":564},15,[566],{"type":17,"tag":43,"props":567,"children":568},{"emptyLinePlaceholder":78},[569],{"type":23,"value":81},{"type":17,"tag":43,"props":571,"children":573},{"class":45,"line":572},16,[574,578,583,587,591,595,599,603,607,612,617],{"type":17,"tag":43,"props":575,"children":576},{"style":50},[577],{"type":23,"value":145},{"type":17,"tag":43,"props":579,"children":580},{"style":68},[581],{"type":23,"value":582}," leftInset ",{"type":17,"tag":43,"props":584,"children":585},{"style":50},[586],{"type":23,"value":155},{"type":17,"tag":43,"props":588,"children":589},{"style":68},[590],{"type":23,"value":239},{"type":17,"tag":43,"props":592,"children":593},{"style":98},[594],{"type":23,"value":244},{"type":17,"tag":43,"props":596,"children":597},{"style":68},[598],{"type":23,"value":106},{"type":17,"tag":43,"props":600,"children":601},{"style":251},[602],{"type":23,"value":254},{"type":17,"tag":43,"props":604,"children":605},{"style":50},[606],{"type":23,"value":259},{"type":17,"tag":43,"props":608,"children":609},{"style":98},[610],{"type":23,"value":611},"inputWidth",{"type":17,"tag":43,"props":613,"children":614},{"style":68},[615],{"type":23,"value":616},") { col ",{"type":17,"tag":43,"props":618,"children":619},{"style":50},[620],{"type":23,"value":274},{"type":17,"tag":43,"props":622,"children":624},{"class":45,"line":623},17,[625,629,633,637,641,645,649,653,657,661,665,669,673,678,682],{"type":17,"tag":43,"props":626,"children":627},{"style":50},[628],{"type":23,"value":283},{"type":17,"tag":43,"props":630,"children":631},{"style":98},[632],{"type":23,"value":288},{"type":17,"tag":43,"props":634,"children":635},{"style":68},[636],{"type":23,"value":106},{"type":17,"tag":43,"props":638,"children":639},{"style":98},[640],{"type":23,"value":297},{"type":17,"tag":43,"props":642,"children":643},{"style":68},[644],{"type":23,"value":302},{"type":17,"tag":43,"props":646,"children":647},{"style":251},[648],{"type":23,"value":307},{"type":17,"tag":43,"props":650,"children":651},{"style":68},[652],{"type":23,"value":312},{"type":17,"tag":43,"props":654,"children":655},{"style":98},[656],{"type":23,"value":317},{"type":17,"tag":43,"props":658,"children":659},{"style":68},[660],{"type":23,"value":302},{"type":17,"tag":43,"props":662,"children":663},{"style":251},[664],{"type":23,"value":307},{"type":17,"tag":43,"props":666,"children":667},{"style":68},[668],{"type":23,"value":312},{"type":17,"tag":43,"props":670,"children":671},{"style":98},[672],{"type":23,"value":205},{"type":17,"tag":43,"props":674,"children":675},{"style":68},[676],{"type":23,"value":677},": col, ",{"type":17,"tag":43,"props":679,"children":680},{"style":98},[681],{"type":23,"value":170},{"type":17,"tag":43,"props":683,"children":684},{"style":68},[685],{"type":23,"value":686},": inputHeight)\n",{"type":17,"tag":43,"props":688,"children":690},{"class":45,"line":689},18,[691,695,699],{"type":17,"tag":43,"props":692,"children":693},{"style":68},[694],{"type":23,"value":356},{"type":17,"tag":43,"props":696,"children":697},{"style":50},[698],{"type":23,"value":361},{"type":17,"tag":43,"props":700,"children":701},{"style":251},[702],{"type":23,"value":366},{"type":17,"tag":43,"props":704,"children":706},{"class":45,"line":705},19,[707],{"type":17,"tag":43,"props":708,"children":709},{"emptyLinePlaceholder":78},[710],{"type":23,"value":81},{"type":17,"tag":43,"props":712,"children":714},{"class":45,"line":713},20,[715,719,724,728,733,737,741,745,749,754,758,762,766,770],{"type":17,"tag":43,"props":716,"children":717},{"style":50},[718],{"type":23,"value":145},{"type":17,"tag":43,"props":720,"children":721},{"style":68},[722],{"type":23,"value":723}," rightRange ",{"type":17,"tag":43,"props":725,"children":726},{"style":50},[727],{"type":23,"value":155},{"type":17,"tag":43,"props":729,"children":730},{"style":68},[731],{"type":23,"value":732}," ((leftInset ",{"type":17,"tag":43,"props":734,"children":735},{"style":50},[736],{"type":23,"value":401},{"type":17,"tag":43,"props":738,"children":739},{"style":251},[740],{"type":23,"value":406},{"type":17,"tag":43,"props":742,"children":743},{"style":68},[744],{"type":23,"value":411},{"type":17,"tag":43,"props":746,"children":747},{"style":50},[748],{"type":23,"value":259},{"type":17,"tag":43,"props":750,"children":751},{"style":68},[752],{"type":23,"value":753},"(inputWidth ",{"type":17,"tag":43,"props":755,"children":756},{"style":50},[757],{"type":23,"value":425},{"type":17,"tag":43,"props":759,"children":760},{"style":251},[761],{"type":23,"value":406},{"type":17,"tag":43,"props":763,"children":764},{"style":68},[765],{"type":23,"value":434},{"type":17,"tag":43,"props":767,"children":768},{"style":98},[769],{"type":23,"value":439},{"type":17,"tag":43,"props":771,"children":772},{"style":68},[773],{"type":23,"value":444},{"type":17,"tag":43,"props":775,"children":777},{"class":45,"line":776},21,[778,782,787,791,796,800,805],{"type":17,"tag":43,"props":779,"children":780},{"style":50},[781],{"type":23,"value":145},{"type":17,"tag":43,"props":783,"children":784},{"style":68},[785],{"type":23,"value":786}," rightInset ",{"type":17,"tag":43,"props":788,"children":789},{"style":50},[790],{"type":23,"value":155},{"type":17,"tag":43,"props":792,"children":793},{"style":68},[794],{"type":23,"value":795},"  filterInfo.",{"type":17,"tag":43,"props":797,"children":798},{"style":98},[799],{"type":23,"value":244},{"type":17,"tag":43,"props":801,"children":802},{"style":68},[803],{"type":23,"value":804},"(rightRange) { col ",{"type":17,"tag":43,"props":806,"children":807},{"style":50},[808],{"type":23,"value":274},{"type":17,"tag":43,"props":810,"children":812},{"class":45,"line":811},22,[813,817,821,825,829,833,837,841,845,849,853,858,862,867,871],{"type":17,"tag":43,"props":814,"children":815},{"style":50},[816],{"type":23,"value":283},{"type":17,"tag":43,"props":818,"children":819},{"style":98},[820],{"type":23,"value":288},{"type":17,"tag":43,"props":822,"children":823},{"style":68},[824],{"type":23,"value":106},{"type":17,"tag":43,"props":826,"children":827},{"style":98},[828],{"type":23,"value":297},{"type":17,"tag":43,"props":830,"children":831},{"style":68},[832],{"type":23,"value":677},{"type":17,"tag":43,"props":834,"children":835},{"style":98},[836],{"type":23,"value":317},{"type":17,"tag":43,"props":838,"children":839},{"style":68},[840],{"type":23,"value":302},{"type":17,"tag":43,"props":842,"children":843},{"style":251},[844],{"type":23,"value":307},{"type":17,"tag":43,"props":846,"children":847},{"style":68},[848],{"type":23,"value":312},{"type":17,"tag":43,"props":850,"children":851},{"style":98},[852],{"type":23,"value":205},{"type":17,"tag":43,"props":854,"children":855},{"style":68},[856],{"type":23,"value":857},": inputWidth ",{"type":17,"tag":43,"props":859,"children":860},{"style":50},[861],{"type":23,"value":425},{"type":17,"tag":43,"props":863,"children":864},{"style":68},[865],{"type":23,"value":866}," col, ",{"type":17,"tag":43,"props":868,"children":869},{"style":98},[870],{"type":23,"value":170},{"type":17,"tag":43,"props":872,"children":873},{"style":68},[874],{"type":23,"value":686},{"type":17,"tag":43,"props":876,"children":878},{"class":45,"line":877},23,[879,883,887],{"type":17,"tag":43,"props":880,"children":881},{"style":68},[882],{"type":23,"value":356},{"type":17,"tag":43,"props":884,"children":885},{"style":50},[886],{"type":23,"value":361},{"type":17,"tag":43,"props":888,"children":889},{"style":251},[890],{"type":23,"value":366},{"type":17,"tag":43,"props":892,"children":894},{"class":45,"line":893},24,[895],{"type":17,"tag":43,"props":896,"children":897},{"emptyLinePlaceholder":78},[898],{"type":23,"value":81},{"type":17,"tag":43,"props":900,"children":902},{"class":45,"line":901},25,[903,908,913,917,922,926,931,936,941,945,949,954,959,963,967,972,977,981,985],{"type":17,"tag":43,"props":904,"children":905},{"style":50},[906],{"type":23,"value":907},"        return",{"type":17,"tag":43,"props":909,"children":910},{"style":98},[911],{"type":23,"value":912}," UIEdgeInsets",{"type":17,"tag":43,"props":914,"children":915},{"style":68},[916],{"type":23,"value":106},{"type":17,"tag":43,"props":918,"children":919},{"style":98},[920],{"type":23,"value":921},"top",{"type":17,"tag":43,"props":923,"children":924},{"style":68},[925],{"type":23,"value":302},{"type":17,"tag":43,"props":927,"children":928},{"style":98},[929],{"type":23,"value":930},"CGFloat",{"type":17,"tag":43,"props":932,"children":933},{"style":68},[934],{"type":23,"value":935},"(topInset), ",{"type":17,"tag":43,"props":937,"children":938},{"style":98},[939],{"type":23,"value":940},"left",{"type":17,"tag":43,"props":942,"children":943},{"style":68},[944],{"type":23,"value":302},{"type":17,"tag":43,"props":946,"children":947},{"style":98},[948],{"type":23,"value":930},{"type":17,"tag":43,"props":950,"children":951},{"style":68},[952],{"type":23,"value":953},"(leftInset), ",{"type":17,"tag":43,"props":955,"children":956},{"style":98},[957],{"type":23,"value":958},"bottom",{"type":17,"tag":43,"props":960,"children":961},{"style":68},[962],{"type":23,"value":302},{"type":17,"tag":43,"props":964,"children":965},{"style":98},[966],{"type":23,"value":930},{"type":17,"tag":43,"props":968,"children":969},{"style":68},[970],{"type":23,"value":971},"(bottomInset), ",{"type":17,"tag":43,"props":973,"children":974},{"style":98},[975],{"type":23,"value":976},"right",{"type":17,"tag":43,"props":978,"children":979},{"style":68},[980],{"type":23,"value":302},{"type":17,"tag":43,"props":982,"children":983},{"style":98},[984],{"type":23,"value":930},{"type":17,"tag":43,"props":986,"children":987},{"style":68},[988],{"type":23,"value":989},"(rightInset))\n",{"type":17,"tag":43,"props":991,"children":993},{"class":45,"line":992},26,[994],{"type":17,"tag":43,"props":995,"children":996},{"style":68},[997],{"type":23,"value":998},"    }\n",{"type":17,"tag":43,"props":1000,"children":1002},{"class":45,"line":1001},27,[1003],{"type":17,"tag":43,"props":1004,"children":1005},{"emptyLinePlaceholder":78},[1006],{"type":23,"value":81},{"type":17,"tag":43,"props":1008,"children":1010},{"class":45,"line":1009},28,[1011,1016,1021],{"type":17,"tag":43,"props":1012,"children":1013},{"style":56},[1014],{"type":23,"value":1015},"    struct",{"type":17,"tag":43,"props":1017,"children":1018},{"style":62},[1019],{"type":23,"value":1020}," FilterInfo",{"type":17,"tag":43,"props":1022,"children":1023},{"style":68},[1024],{"type":23,"value":71},{"type":17,"tag":43,"props":1026,"children":1028},{"class":45,"line":1027},29,[1029,1033],{"type":17,"tag":43,"props":1030,"children":1031},{"style":50},[1032],{"type":23,"value":145},{"type":17,"tag":43,"props":1034,"children":1035},{"style":68},[1036],{"type":23,"value":1037}," maxFilter :CIFilter\n",{"type":17,"tag":43,"props":1039,"children":1041},{"class":45,"line":1040},30,[1042,1046],{"type":17,"tag":43,"props":1043,"children":1044},{"style":50},[1045],{"type":23,"value":145},{"type":17,"tag":43,"props":1047,"children":1048},{"style":68},[1049],{"type":23,"value":1050}," minFilter: CIFilter\n",{"type":17,"tag":43,"props":1052,"children":1054},{"class":45,"line":1053},31,[1055,1059],{"type":17,"tag":43,"props":1056,"children":1057},{"style":50},[1058],{"type":23,"value":145},{"type":17,"tag":43,"props":1060,"children":1061},{"style":68},[1062],{"type":23,"value":1063}," context: CIContext\n",{"type":17,"tag":43,"props":1065,"children":1067},{"class":45,"line":1066},32,[1068,1072,1077],{"type":17,"tag":43,"props":1069,"children":1070},{"style":50},[1071],{"type":23,"value":145},{"type":17,"tag":43,"props":1073,"children":1074},{"style":68},[1075],{"type":23,"value":1076}," maximumDelta: ",{"type":17,"tag":43,"props":1078,"children":1079},{"style":50},[1080],{"type":23,"value":1081},"UInt\n",{"type":17,"tag":43,"props":1083,"children":1085},{"class":45,"line":1084},33,[1086],{"type":17,"tag":43,"props":1087,"children":1088},{"emptyLinePlaceholder":78},[1089],{"type":23,"value":81},{"type":17,"tag":43,"props":1091,"children":1093},{"class":45,"line":1092},34,[1094,1099,1104,1109,1114,1118,1123,1128,1133,1138,1143,1148,1153,1158,1163,1168,1172,1177,1181,1186,1190,1194,1199],{"type":17,"tag":43,"props":1095,"children":1096},{"style":56},[1097],{"type":23,"value":1098},"        func",{"type":17,"tag":43,"props":1100,"children":1101},{"style":98},[1102],{"type":23,"value":1103}," calculateInset",{"type":17,"tag":43,"props":1105,"children":1106},{"style":68},[1107],{"type":23,"value":1108},"\u003C",{"type":17,"tag":43,"props":1110,"children":1111},{"style":98},[1112],{"type":23,"value":1113},"U",{"type":17,"tag":43,"props":1115,"children":1116},{"style":68},[1117],{"type":23,"value":302},{"type":17,"tag":43,"props":1119,"children":1120},{"style":50},[1121],{"type":23,"value":1122},"CollectionType",{"type":17,"tag":43,"props":1124,"children":1125},{"style":68},[1126],{"type":23,"value":1127},">(",{"type":17,"tag":43,"props":1129,"children":1130},{"style":98},[1131],{"type":23,"value":1132},"range",{"type":17,"tag":43,"props":1134,"children":1135},{"style":68},[1136],{"type":23,"value":1137},": U, ",{"type":17,"tag":43,"props":1139,"children":1140},{"style":98},[1141],{"type":23,"value":1142},"rectGenerator",{"type":17,"tag":43,"props":1144,"children":1145},{"style":68},[1146],{"type":23,"value":1147},": (step: U.",{"type":17,"tag":43,"props":1149,"children":1150},{"style":50},[1151],{"type":23,"value":1152},"Generator",{"type":17,"tag":43,"props":1154,"children":1155},{"style":68},[1156],{"type":23,"value":1157},".",{"type":17,"tag":43,"props":1159,"children":1160},{"style":50},[1161],{"type":23,"value":1162},"Element",{"type":17,"tag":43,"props":1164,"children":1165},{"style":68},[1166],{"type":23,"value":1167},") ",{"type":17,"tag":43,"props":1169,"children":1170},{"style":50},[1171],{"type":23,"value":131},{"type":17,"tag":43,"props":1173,"children":1174},{"style":68},[1175],{"type":23,"value":1176}," CGRect) ",{"type":17,"tag":43,"props":1178,"children":1179},{"style":50},[1180],{"type":23,"value":131},{"type":17,"tag":43,"props":1182,"children":1183},{"style":68},[1184],{"type":23,"value":1185}," U.",{"type":17,"tag":43,"props":1187,"children":1188},{"style":50},[1189],{"type":23,"value":1152},{"type":17,"tag":43,"props":1191,"children":1192},{"style":68},[1193],{"type":23,"value":1157},{"type":17,"tag":43,"props":1195,"children":1196},{"style":50},[1197],{"type":23,"value":1198},"Element?",{"type":17,"tag":43,"props":1200,"children":1201},{"style":68},[1202],{"type":23,"value":71},{"type":17,"tag":43,"props":1204,"children":1206},{"class":45,"line":1205},35,[1207,1212,1217,1221,1225],{"type":17,"tag":43,"props":1208,"children":1209},{"style":50},[1210],{"type":23,"value":1211},"            var",{"type":17,"tag":43,"props":1213,"children":1214},{"style":68},[1215],{"type":23,"value":1216}," inset: U.",{"type":17,"tag":43,"props":1218,"children":1219},{"style":50},[1220],{"type":23,"value":1152},{"type":17,"tag":43,"props":1222,"children":1223},{"style":68},[1224],{"type":23,"value":1157},{"type":17,"tag":43,"props":1226,"children":1227},{"style":50},[1228],{"type":23,"value":1229},"Element?\n",{"type":17,"tag":43,"props":1231,"children":1233},{"class":45,"line":1232},36,[1234,1239,1244,1249],{"type":17,"tag":43,"props":1235,"children":1236},{"style":50},[1237],{"type":23,"value":1238},"            for",{"type":17,"tag":43,"props":1240,"children":1241},{"style":68},[1242],{"type":23,"value":1243}," step ",{"type":17,"tag":43,"props":1245,"children":1246},{"style":50},[1247],{"type":23,"value":1248},"in",{"type":17,"tag":43,"props":1250,"children":1251},{"style":68},[1252],{"type":23,"value":1253}," range {\n",{"type":17,"tag":43,"props":1255,"children":1257},{"class":45,"line":1256},37,[1258,1263,1268,1272,1277,1281,1286],{"type":17,"tag":43,"props":1259,"children":1260},{"style":50},[1261],{"type":23,"value":1262},"                let",{"type":17,"tag":43,"props":1264,"children":1265},{"style":68},[1266],{"type":23,"value":1267}," rect ",{"type":17,"tag":43,"props":1269,"children":1270},{"style":50},[1271],{"type":23,"value":155},{"type":17,"tag":43,"props":1273,"children":1274},{"style":98},[1275],{"type":23,"value":1276}," rectGenerator",{"type":17,"tag":43,"props":1278,"children":1279},{"style":68},[1280],{"type":23,"value":106},{"type":17,"tag":43,"props":1282,"children":1283},{"style":98},[1284],{"type":23,"value":1285},"step",{"type":17,"tag":43,"props":1287,"children":1288},{"style":68},[1289],{"type":23,"value":1290},": step)\n",{"type":17,"tag":43,"props":1292,"children":1294},{"class":45,"line":1293},38,[1295,1300,1304,1309,1313,1318],{"type":17,"tag":43,"props":1296,"children":1297},{"style":98},[1298],{"type":23,"value":1299},"                self",{"type":17,"tag":43,"props":1301,"children":1302},{"style":68},[1303],{"type":23,"value":1157},{"type":17,"tag":43,"props":1305,"children":1306},{"style":98},[1307],{"type":23,"value":1308},"maxFilter",{"type":17,"tag":43,"props":1310,"children":1311},{"style":68},[1312],{"type":23,"value":1157},{"type":17,"tag":43,"props":1314,"children":1315},{"style":98},[1316],{"type":23,"value":1317},"updateFilterExtentsWithRect",{"type":17,"tag":43,"props":1319,"children":1320},{"style":68},[1321],{"type":23,"value":1322},"(rect)\n",{"type":17,"tag":43,"props":1324,"children":1326},{"class":45,"line":1325},39,[1327,1331,1335,1340,1344,1348],{"type":17,"tag":43,"props":1328,"children":1329},{"style":98},[1330],{"type":23,"value":1299},{"type":17,"tag":43,"props":1332,"children":1333},{"style":68},[1334],{"type":23,"value":1157},{"type":17,"tag":43,"props":1336,"children":1337},{"style":98},[1338],{"type":23,"value":1339},"minFilter",{"type":17,"tag":43,"props":1341,"children":1342},{"style":68},[1343],{"type":23,"value":1157},{"type":17,"tag":43,"props":1345,"children":1346},{"style":98},[1347],{"type":23,"value":1317},{"type":17,"tag":43,"props":1349,"children":1350},{"style":68},[1351],{"type":23,"value":1322},{"type":17,"tag":43,"props":1353,"children":1355},{"class":45,"line":1354},40,[1356,1361,1366,1371,1375,1380,1385,1390,1394,1399,1403,1407,1411,1416,1420,1424,1428,1432],{"type":17,"tag":43,"props":1357,"children":1358},{"style":50},[1359],{"type":23,"value":1360},"                guard",{"type":17,"tag":43,"props":1362,"children":1363},{"style":50},[1364],{"type":23,"value":1365}," let",{"type":17,"tag":43,"props":1367,"children":1368},{"style":68},[1369],{"type":23,"value":1370}," rowDiff ",{"type":17,"tag":43,"props":1372,"children":1373},{"style":50},[1374],{"type":23,"value":155},{"type":17,"tag":43,"props":1376,"children":1377},{"style":98},[1378],{"type":23,"value":1379}," self",{"type":17,"tag":43,"props":1381,"children":1382},{"style":68},[1383],{"type":23,"value":1384},".minFilter.",{"type":17,"tag":43,"props":1386,"children":1387},{"style":98},[1388],{"type":23,"value":1389},"differenceFromFilter",{"type":17,"tag":43,"props":1391,"children":1392},{"style":68},[1393],{"type":23,"value":106},{"type":17,"tag":43,"props":1395,"children":1396},{"style":98},[1397],{"type":23,"value":1398},"self",{"type":17,"tag":43,"props":1400,"children":1401},{"style":68},[1402],{"type":23,"value":1157},{"type":17,"tag":43,"props":1404,"children":1405},{"style":98},[1406],{"type":23,"value":1308},{"type":17,"tag":43,"props":1408,"children":1409},{"style":68},[1410],{"type":23,"value":312},{"type":17,"tag":43,"props":1412,"children":1413},{"style":98},[1414],{"type":23,"value":1415},"context",{"type":17,"tag":43,"props":1417,"children":1418},{"style":68},[1419],{"type":23,"value":302},{"type":17,"tag":43,"props":1421,"children":1422},{"style":98},[1423],{"type":23,"value":1398},{"type":17,"tag":43,"props":1425,"children":1426},{"style":68},[1427],{"type":23,"value":1157},{"type":17,"tag":43,"props":1429,"children":1430},{"style":98},[1431],{"type":23,"value":1415},{"type":17,"tag":43,"props":1433,"children":1434},{"style":68},[1435],{"type":23,"value":175},{"type":17,"tag":43,"props":1437,"children":1439},{"class":45,"line":1438},41,[1440,1445,1449,1454,1458,1463,1468],{"type":17,"tag":43,"props":1441,"children":1442},{"style":50},[1443],{"type":23,"value":1444},"                    where",{"type":17,"tag":43,"props":1446,"children":1447},{"style":68},[1448],{"type":23,"value":1370},{"type":17,"tag":43,"props":1450,"children":1451},{"style":50},[1452],{"type":23,"value":1453},"\u003C=",{"type":17,"tag":43,"props":1455,"children":1456},{"style":98},[1457],{"type":23,"value":1379},{"type":17,"tag":43,"props":1459,"children":1460},{"style":68},[1461],{"type":23,"value":1462},".maximumDelta ",{"type":17,"tag":43,"props":1464,"children":1465},{"style":50},[1466],{"type":23,"value":1467},"else",{"type":17,"tag":43,"props":1469,"children":1470},{"style":68},[1471],{"type":23,"value":71},{"type":17,"tag":43,"props":1473,"children":1475},{"class":45,"line":1474},42,[1476],{"type":17,"tag":43,"props":1477,"children":1478},{"style":50},[1479],{"type":23,"value":1480},"                        break\n",{"type":17,"tag":43,"props":1482,"children":1484},{"class":45,"line":1483},43,[1485],{"type":17,"tag":43,"props":1486,"children":1487},{"style":68},[1488],{"type":23,"value":1489},"                }\n",{"type":17,"tag":43,"props":1491,"children":1493},{"class":45,"line":1492},44,[1494,1499,1503],{"type":17,"tag":43,"props":1495,"children":1496},{"style":68},[1497],{"type":23,"value":1498},"                inset ",{"type":17,"tag":43,"props":1500,"children":1501},{"style":50},[1502],{"type":23,"value":155},{"type":17,"tag":43,"props":1504,"children":1505},{"style":68},[1506],{"type":23,"value":1507}," step\n",{"type":17,"tag":43,"props":1509,"children":1511},{"class":45,"line":1510},45,[1512],{"type":17,"tag":43,"props":1513,"children":1514},{"style":68},[1515],{"type":23,"value":1516},"            }\n",{"type":17,"tag":43,"props":1518,"children":1520},{"class":45,"line":1519},46,[1521,1525],{"type":17,"tag":43,"props":1522,"children":1523},{"style":50},[1524],{"type":23,"value":283},{"type":17,"tag":43,"props":1526,"children":1527},{"style":68},[1528],{"type":23,"value":1529}," inset\n",{"type":17,"tag":43,"props":1531,"children":1533},{"class":45,"line":1532},47,[1534],{"type":17,"tag":43,"props":1535,"children":1536},{"style":68},[1537],{"type":23,"value":1538},"        }\n",{"type":17,"tag":43,"props":1540,"children":1542},{"class":45,"line":1541},48,[1543],{"type":17,"tag":43,"props":1544,"children":1545},{"style":68},[1546],{"type":23,"value":998},{"type":17,"tag":43,"props":1548,"children":1550},{"class":45,"line":1549},49,[1551],{"type":17,"tag":43,"props":1552,"children":1553},{"emptyLinePlaceholder":78},[1554],{"type":23,"value":81},{"type":17,"tag":43,"props":1556,"children":1558},{"class":45,"line":1557},50,[1559],{"type":17,"tag":43,"props":1560,"children":1561},{"style":68},[1562],{"type":23,"value":1563},"}\n",{"type":17,"tag":26,"props":1565,"children":1566},{},[1567],{"type":23,"value":1568},"The first few passes at the code, I didn't have a great idea to reduce the amount of duplication in iterating in from each of the sides, which I thought may hurt later as I'm assuming there's room for optimizing the search for edges, probably involving subdividing and testing regions rather than a linear walk of the space.",{"type":17,"tag":26,"props":1570,"children":1571},{},[1572,1574,1579],{"type":23,"value":1573},"I then realized that the only major change in each region was generating the rectangle and the range being worked on. Using a closure for the rectangle generation helped, but making a struct to shove all of the important values into and making the ",{"type":17,"tag":39,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":23,"value":244},{"type":23,"value":1580}," code a function on that struct also helped me keep the function signatures sane.",{"type":17,"tag":26,"props":1582,"children":1583},{},[1584,1586,1591,1593,1598,1600,1606],{"type":23,"value":1585},"Finally, when I made the ",{"type":17,"tag":39,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":23,"value":244},{"type":23,"value":1592}," function properly generic, I also had to make the return type an optional value because I couldn't set the initial value to ",{"type":17,"tag":39,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":23,"value":307},{"type":23,"value":1599}," in the function body. This means I now added a ",{"type":17,"tag":39,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":23,"value":1605},"?? 0",{"type":23,"value":1607}," after each call.",{"type":17,"tag":26,"props":1609,"children":1610},{},[1611,1613,1619],{"type":23,"value":1612},"I'm much happier with this than the first few passes, the code doesn't ",{"type":17,"tag":1614,"props":1615,"children":1616},"em",{},[1617],{"type":23,"value":1618},"work",{"type":23,"value":1620}," yet, but all of the bits that I've tested outside of the core image black box for the filters are behaving properly",{"type":17,"tag":1622,"props":1623,"children":1624},"style",{},[1625],{"type":23,"value":1626},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":7,"searchDepth":74,"depth":74,"links":1628},[1629],{"id":20,"depth":74,"text":24},"markdown","content:archive:2016:2016-01-01-mx65i5h8wp8qdwlte5ecl25sznvtuh.md","content","archive/2016/2016-01-01-mx65i5h8wp8qdwlte5ecl25sznvtuh.md","archive/2016/2016-01-01-mx65i5h8wp8qdwlte5ecl25sznvtuh","md","\u003Ch2 id=\"because-unsolved-problems-bother-me\">Because Unsolved Problems Bother Me\u003C/h2>\u003Cp>I'm working on some code to intelligently remove arbitrary border colors from an image for reasons vaguely related to a project at work. I'm close to a solution, but there's some strangenesses I'm hitting in the core image filter stack that eludes me, so I don't have a full code dump to share, but I'm particularly proud of how I structured the edge insets code to make it more functional.\u003C/p>\u003Cpre class=\"language-swift shiki shiki-themes solarized-dark solarized-light\" code=\"private extension UIImage {\n\n    static func cropEdgeInsets(filterInfo: FilterInfo, startingSize: CGSize) -> UIEdgeInsets {\n        let inputHeight = Int(startingSize.height)\n        let inputWidth = Int(startingSize.width)\n\n        let topInset = filterInfo.calculateInset(1...inputHeight) { row in\n            return CGRect(x: 0, y: 0, width: inputWidth, height: row)\n            } ?? 0\n\n        let bottomRange = ((topInset + 1)...(inputHeight - 1)).reverse()\n        let bottomInset = filterInfo.calculateInset(bottomRange) { row in\n            return CGRect(x: 0, y: row, width: inputWidth, height: inputHeight - row)\n            } ?? 0\n\n        let leftInset = filterInfo.calculateInset(1...inputWidth) { col in\n            return CGRect(x: 0, y: 0, width: col, height: inputHeight)\n            } ?? 0\n\n        let rightRange = ((leftInset + 1)...(inputWidth - 1)).reverse()\n        let rightInset =  filterInfo.calculateInset(rightRange) { col in\n            return CGRect(x: col, y: 0, width: inputWidth - col, height: inputHeight)\n            } ?? 0\n\n        return UIEdgeInsets(top: CGFloat(topInset), left: CGFloat(leftInset), bottom: CGFloat(bottomInset), right: CGFloat(rightInset))\n    }\n\n    struct FilterInfo {\n        let maxFilter :CIFilter\n        let minFilter: CIFilter\n        let context: CIContext\n        let maximumDelta: UInt\n\n        func calculateInset\u003CU: CollectionType>(range: U, rectGenerator: (step: U.Generator.Element) -> CGRect) -> U.Generator.Element? {\n            var inset: U.Generator.Element?\n            for step in range {\n                let rect = rectGenerator(step: step)\n                self.maxFilter.updateFilterExtentsWithRect(rect)\n                self.minFilter.updateFilterExtentsWithRect(rect)\n                guard let rowDiff = self.minFilter.differenceFromFilter(self.maxFilter, context: self.context)\n                    where rowDiff \u003C= self.maximumDelta else {\n                        break\n                }\n                inset = step\n            }\n            return inset\n        }\n    }\n\n}\n\" language=\"swift\" meta=\"\" style=\"\">\u003Ccode __ignoreMap=\"\">\u003Cspan class=\"line\" line=\"1\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">private\u003C/span>\u003Cspan style=\"--shiki-default:#93A1A1;--shiki-dark:#586E75;--shiki-default-font-weight:bold;--shiki-dark-font-weight:bold\"> extension\u003C/span>\u003Cspan style=\"--shiki-default:#CB4B16;--shiki-dark:#CB4B16\"> UIImage\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> {\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"2\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"3\">\u003Cspan style=\"--shiki-default:#93A1A1;--shiki-dark:#586E75;--shiki-default-font-weight:bold;--shiki-dark-font-weight:bold\">    static\u003C/span>\u003Cspan style=\"--shiki-default:#93A1A1;--shiki-dark:#586E75;--shiki-default-font-weight:bold;--shiki-dark-font-weight:bold\"> func\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> cropEdgeInsets\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">filterInfo\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: FilterInfo, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">startingSize\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: CGSize) \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">->\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> UIEdgeInsets {\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"4\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> inputHeight \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\"> Int\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(startingSize.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">height\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"5\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> inputWidth \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\"> Int\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(startingSize.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">width\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"6\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"7\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> topInset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> filterInfo.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">calculateInset\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">1\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">...\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">inputHeight\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">) { row \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">in\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"8\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            return\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> CGRect\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">x\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">0\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">y\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">0\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">width\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: inputWidth, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">height\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: row)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"9\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">            } \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">??\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 0\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"10\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"11\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> bottomRange \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> ((topInset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">+\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 1\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">...\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(inputHeight \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">-\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 1\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)).\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">reverse\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">()\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"12\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> bottomInset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> filterInfo.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">calculateInset\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(bottomRange) { row \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">in\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"13\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            return\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> CGRect\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">x\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">0\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">y\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: row, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">width\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: inputWidth, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">height\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: inputHeight \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">-\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> row)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"14\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">            } \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">??\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 0\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"15\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"16\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> leftInset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> filterInfo.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">calculateInset\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">1\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">...\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">inputWidth\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">) { col \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">in\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"17\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            return\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> CGRect\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">x\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">0\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">y\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">0\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">width\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: col, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">height\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: inputHeight)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"18\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">            } \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">??\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 0\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"19\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"20\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> rightRange \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> ((leftInset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">+\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 1\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">...\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(inputWidth \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">-\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 1\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)).\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">reverse\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">()\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"21\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> rightInset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">  filterInfo.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">calculateInset\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(rightRange) { col \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">in\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"22\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            return\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> CGRect\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">x\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: col, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">y\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\">0\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">width\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: inputWidth \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">-\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> col, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">height\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: inputHeight)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"23\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">            } \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">??\u003C/span>\u003Cspan style=\"--shiki-default:#D33682;--shiki-dark:#D33682\"> 0\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"24\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"25\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        return\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> UIEdgeInsets\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">top\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">CGFloat\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(topInset), \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">left\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">CGFloat\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(leftInset), \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">bottom\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">CGFloat\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(bottomInset), \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">right\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">CGFloat\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(rightInset))\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"26\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">    }\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"27\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"28\">\u003Cspan style=\"--shiki-default:#93A1A1;--shiki-dark:#586E75;--shiki-default-font-weight:bold;--shiki-dark-font-weight:bold\">    struct\u003C/span>\u003Cspan style=\"--shiki-default:#CB4B16;--shiki-dark:#CB4B16\"> FilterInfo\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> {\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"29\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> maxFilter :CIFilter\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"30\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> minFilter: CIFilter\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"31\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> context: CIContext\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"32\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">        let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> maximumDelta: \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">UInt\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"33\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"34\">\u003Cspan style=\"--shiki-default:#93A1A1;--shiki-dark:#586E75;--shiki-default-font-weight:bold;--shiki-dark-font-weight:bold\">        func\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> calculateInset\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">&#x3C;\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">U\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">CollectionType\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">>(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">range\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: U, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">rectGenerator\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: (step: U.\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">Generator\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">Element\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">) \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">->\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> CGRect) \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">->\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> U.\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">Generator\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">Element?\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> {\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"35\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            var\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> inset: U.\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">Generator\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">Element?\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"36\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            for\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> step \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">in\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> range {\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"37\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">                let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> rect \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> rectGenerator\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">step\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: step)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"38\">\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">                self\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">maxFilter\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">updateFilterExtentsWithRect\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(rect)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"39\">\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">                self\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">minFilter\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">updateFilterExtentsWithRect\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(rect)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"40\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">                guard\u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\"> let\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> rowDiff \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> self\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.minFilter.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">differenceFromFilter\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">(\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">self\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">maxFilter\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">, \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">context\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">: \u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">self\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\">context\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">)\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"41\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">                    where\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> rowDiff \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">&#x3C;=\u003C/span>\u003Cspan style=\"--shiki-default:#268BD2;--shiki-dark:#268BD2\"> self\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">.maximumDelta \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">else\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> {\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"42\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">                        break\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"43\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">                }\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"44\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">                inset \u003C/span>\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">=\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> step\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"45\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">            }\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"46\">\u003Cspan style=\"--shiki-default:#859900;--shiki-dark:#859900\">            return\u003C/span>\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\"> inset\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"47\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">        }\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"48\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">    }\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"49\">\u003Cspan emptyLinePlaceholder>\n\u003C/span>\u003C/span>\u003Cspan class=\"line\" line=\"50\">\u003Cspan style=\"--shiki-default:#839496;--shiki-dark:#657B83\">}\n\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\u003Cp>The first few passes at the code, I didn't have a great idea to reduce the amount of duplication in iterating in from each of the sides, which I thought may hurt later as I'm assuming there's room for optimizing the search for edges, probably involving subdividing and testing regions rather than a linear walk of the space.\u003C/p>\u003Cp>I then realized that the only major change in each region was generating the rectangle and the range being worked on. Using a closure for the rectangle generation helped, but making a struct to shove all of the important values into and making the \u003Ccode class=\"\">calculateInset\u003C/code> code a function on that struct also helped me keep the function signatures sane.\u003C/p>\u003Cp>Finally, when I made the \u003Ccode class=\"\">calculateInset\u003C/code> function properly generic, I also had to make the return type an optional value because I couldn't set the initial value to \u003Ccode class=\"\">0\u003C/code> in the function body. This means I now added a \u003Ccode class=\"\">?? 0\u003C/code> after each call.\u003C/p>\u003Cp>I'm much happier with this than the first few passes, the code doesn't \u003Cem>work\u003C/em> yet, but all of the bits that I've tested outside of the core image black box for the filters are behaving properly\u003C/p>\u003Cstyle>html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}\u003C/style>",2016,1722847701334]