ずいぶん手間がかかったがマスク画像の「消しゴム」モードと太/細の2種類のペンを設定作成。
マスク領域の「塗り足し」も実装(消しゴムモードがないと、一度作ったマスク領域が消せない、という理由で実装してなかったw)。
これがやたら面倒というか、自分の想定が甘いせいで時間がかかる。必要な画像は
(1)実際にマスクで使う画像(白黒2値)
(2)マスク領域を視覚化するために使う画像(確定している領域の画像)
(3)現在追加(削除)中の領域(プレビュー)
なんだけど、(2)とか(3)で使う画像を半透明にしている(マスクした領域の下側が見えないといけない)から、(3)の画像は単に上塗りするわけにもいかない。そして(1)の画像は(2)の画像から作れない。半透明画像から白黒2値の画像作るのは手間というか、作り方がわからん。そこで
(2’)(1)の画像を白黒反転したもの(正確には、全面白塗りの画像を(1)でマスクし、全面黒塗りの画像と合成したもの)
という画像を用意する。これを「半透明色で全面塗った画像」のマスク使うと(2)ができる。(2’)をベースに現在描画中の領域を黒塗りしてマスクにして同じことをすれば(3)ができる。
お陰で描画ロジックが3段階に分かれててややこしい。シミュレータで使ってる分にはどうやら速度に致命的な影響がない(CIFilterのパースペクティブ変換のほうがよほど処理が重い)模様なので、現状ではとりあえずこれでいいかなーという程度になった。
消しゴムは「透明色で描画」じゃないことは覚えてたんだけど、正しくは覚えてないのでここにも覚書。ブレンドモードの設定で「kCGBlendModeClear」とやるのが正解(終わったら戻さないとダメ)。
===
他にはDetail側のツールバーを動的に変える(マスク画像を弄っているときには、描画/消しゴムの切り替え、マスク領域のクリアのツールが表示される)仕組みを作ったり、マスク編集中には前述のマスク領域の視覚化をして、そうでないときにはマスク領域の表示を消す(CALayer.hiddenを操作)とか。