ObjC drawing on window
About
虽然还是放在 lisp 类目里面 (因为是写 McCLIM-Coca backend 的产物),
但是实际是关于 Objective-C 这种麻烦的东西.
因为自己并不会 ObjC, 也没啥 Cocoa 的开发经验, 于是一开始就选择了求助 AI, 那么整理一下这段时间求助 AI 的结果记录一下简短的踩坑经验.
TLDR: AI 还是幻觉太重了, 应该会选择 CGBitmapContext 来作为最终的方案.
drawRect:
(objc:define-objc-method ("McCLIMCocaView" "drawRect:")
:void (((x y w h) :ns-rect))
(objc:invoke-super objc:self "drawRect:" :ns-rect (x y w h))
(dolist (draw-op (coca-window-draw-ops (find-coca-window objc:self)))
(with-ns-graphics-state
(funcall draw-op))))
评价: 不好用, 还得手动维护 coca-window-draw-ops 这个队列,
AI 一上来就推荐这种, 还反复地推荐, 搞的我在这个队列维护和更新的过程中累得要死.
要是让 AI 自己写确实没毛病, (虽然但是, AI 写了一个队列维护但是完全没有用,
我写了 ≠ 我要用, 你别说好不好, 你就说有没有吧).
CAShapeLayer
还是 AI 给的方法, 说是什么现代的绘图标准. 没毛病, 确实是现代,
也是很高性能的方案. 只是有一个小问题: 问题从原来的管理队列变成了管理 Layer,
因为每个 Layer 的 path attribute 是唯一的, 所以想要支持不同属性 (粗细,
颜色, 填充), 就要用不同的 layer, 那么最简单的想法就是用 design (颜色),
fill, line-style 的方式来做索引, 找到对应的 layer, 然后进行 path 更新.
效果确实很好, 但是另一个问题就是, 那么 layer 的层级该如何管理? 如果 layer 需要更新或者擦除, 那么好像又会变得非常麻烦.
CGBitmapContext
最终选择了该方案, 虽然如果你是一个 ObjC 大佬, 估计会觉得我这方案选型完全是没苦硬吃, (我也觉得). 不过不管怎么样, 最后的效果 (#1b2699dbd5) 目前如下:



注: 那么为什么不和旧的 beagle 的实现一样使用 lockFocus 呢? 因为在 Cocoa 中已经被标记 Deprecated, 并且 Apple 狠心地也确实完全没有向后支持… 还是 Windows 向后支持的能力好啊.
About
那么这篇博客就这样水过去了吧, 毕竟感觉花了我快两周的时间了.