复制和序列化Quartz引用的最佳实践

时间:2010-10-16 17:33:27

标签: objective-c cocoa quartz-graphics nscoding

我在Cocoa中有包含Quartz-2D参考(描述颜色,填充图案,渐变和阴影)的对象。我想在我的对象中实现NSCoding协议,因此需要序列化那些不透明的Quartz-2D结构。

可能的解决方案可能是:

  • 在我的对象中定义一组属性,允许在需要时从头开始设置数据结构。那些可以很容易地序列化。 示例:为红色,绿色,蓝色和alpha存储四个浮点数,然后使用CGColorCreate缺点:信息重复,因此潜在的一致性和(迄今为止较小的)空间消费问题。我需要手动编写属性设置器,以便在组件发生更改时重新创建Quartz结构。这会大大增加我的代码。

  • 使用Quartz函数读出属性。 示例:使用CGColorGetComponents颜色。 缺点:它似乎适用于颜色。但是没有其他结构的等效功能,所以我不知道它如何适用于渐变,阴影,阴影等。

  • 直接从原始的不透明结构中读出属性。 缺点:正如文档所说,结构应该是不透明的。因此,如果发生了变化,我的代码就会破裂。 (Apple当然不会提供类似CGColorGetComponents的功能,如果应该这样做的话。)此外,CGFunctionRef内的CGShadingRef之类的东西真的会有问题。

序列化Quartz结构的最佳实践是什么?

1 个答案:

答案 0 :(得分:5)

答案几乎因一个班级而异:

  • CGImage:使用CGImageDestination制作它的TIFF文件。 (相当于NSImage的TIFFRepresentation方法。)
  • CGPath:编写一个应用程序函数,您可以使用它来描述路径的元素,例如PostScript代码。写一个简单的解释器去另一个方向。
  • CGColorSpace:您可以导出ICC表示。
  • CGColor:如您所述,但不要忘记包含色彩空间。
  • CGLayer: Convoluted:创建位图上下文,将图层绘制到其中,然后转储上下文图像,然后序列化。
  • CGFont:对于大多数应用程序来说,该名称应该足够了。如果您真的很喜欢(即使用变体功能),您将需要包含字体的变体词典。你必须分别保持你对字体大小的了解,因为CGFont没有,并且CGContext不会让你获得你在其中设置的那个。
  • CGPDFDocument:从快速看看,看起来CGPDFObjects都是不可变的,所以你只需归档原始PDF数据或你从中获取的URL。
  • CGGradient,CGPattern,CGShading和其他大多数类:是的,你搞砸了。您只需要单独维护您创建对象的所有信息。