Avatar
ちなみに、 numeric な型だと rotatedinterpolatedBy 省略で .bilinear が使われるけど、それ以外では .nearestNeighbor が使われるとかなってる。
3:00 AM
本当は .nearestNeighbor ですらなくて、それ相当の計算だけど。 InterpolationMethod が使えるのは _Summable だけだから。( Bool.bilinear しようがない) (edited)
3:01 AM
ただの Numeric でもいけなくて、 UInt8 とか普通に足して平均とったらオーバーフローするから
3:01 AM
必要に応じて一度 IntDouble に変換する処理とかがあって、そのあたりが全部 _Summable で抽象化されてる。複雑・・・。
3:02 AM
でも、実装は複雑だけど、 public な API はシンプルに保ててるはず。
3:03 AM
他にも↓で COW と box 方式の type erasure を使ってたり、 EasyImagy の実装が( gyb や protocol extension 含め) Swift の技の見本市みたいになってる・・・。 https://github.com/koher/EasyImagy/blob/dev-0.4.0/Sources/EasyImagy/AnyImage.swift (edited)
EasyImagy - Makes it easy to process images in Swift
3:06 AM
AnyImage も元は要らなかったんだけど、 image[-100...100, -100...100, extrapolatedBy: ...] の結果を ImageSlice で返そうとすると、 ImageSlice が内部に持つのが Image だけじゃダメになって、 ImageSliceAnyImage を持つ必要に迫られた。