为什么coregraphics支持PDF,为什么格式对Apple如此关键?

时间:2018-04-14 16:23:05

标签: core-graphics

有很多格式直观地更接近图形:它可能是矢量图形格式,如SVG,各种PNG,JPEG格式等。为什么它们的PDF都有专用的库?

注意:这个问题不是基于意见的。我对PDF在xOS中有这样一个中心点的原因感兴趣。给它一天看。

3 个答案:

答案 0 :(得分:9)

我的真实情况:我将我的PDF查看器授权给Apple for Rhapsody,然后将我在Objective-C中编写的PDF库授权给Apple作为CoreGraphics的基础。我从1988年开始为NeXT系统编写代码,并多次担任NeXT和Apple的承包商。

正如Rob所说,NeXTstep在Adobe的许可下使用了Display Postscript(“DPS”)。当Apple从“经典”Mac OS切换到OS X时,他们绝对不想继续向Adobe支付每个Mac销售的DPS的每个座位许可证 - 已经多年以来他们同意支付每个座位任何人都可以获得Mac许可。

同时,DPS并未反映现代图形趋势。它是一种图灵完备语言并在其自己的进程中运行,客户端应用程序必须向其发送进程间消息,这意味着昂贵的上下文切换并且不直接共享缓冲区。 (它还打破了客户端进程之间的隔离。)

因此,图形团队(由Peter Graffagnino领导)需要更换DPS,但也不会破坏所有现有的NeXTstep应用程序。事实上,Adobe的一名工程师(我相信它最初是Sam Streeper)已经编写了一种比PostScript简单得多的图形语言,并没有图灵完整,但仍然拥有PostScript的大部分绘图惯例。 (显示PostScript是PostScript的超集,因此任何PostScript程序都在DPS中运行。)

PDF最初是为PostScript驱动的打印机而设计的,因为许多PostScript程序(又称“打印作业”)最终会降低内存和处理器的时间,而且往往太大而无法在任何单独的打印机上运行(RAM很贵)然后)。将PostScript文件转换为PDF使它们更容易处理,并且由于PDF没有控制流,因此您无法将打印机发送到无限循环中。 (Adobe使用PostScript程序处理PDF,并将它们发送到打印机。)

PDF也是一个开放的标准,因此在Apple编写自己的实现时,他们不需要向Adobe支付任何费用。 PDF快速,简单且免费,并且具有完全相同的模型,因为它设计为在PostScript打印机上运行。

所以:Apple必须转换为适用于Mac OS X的新图形语言(néeNeXTstep),并且想要一个具有相同语义和Display PostScript的图形语言,因此所有现有的应用程序在很大程度上仍然有效。

首先,他们编写了对CoreGraphics的函数调用,实现了PostScript / PDF的所有约定(例如:剪辑路径如何工作,路径如何填充,如果它们自我重叠,分辨率独立,状态堆栈等)。他们重写了所有现有的高级图形功能(例如,NSRectFill()),因此它们位于CoreGraphics之上,因此99%的现有NeXTstep程序可以在不进行修改的情况下从DPS切换到CG。 (到20世纪90年代末,大多数NeXTstep程序员已经意识到深入DPS并尝试通过编写PostScript创建效果几乎总是一个坏主意,所以我们使用了高级调用。)

但最后缺失的部分是给程序一个他们可以读取和写入磁盘的格式。在NeXTstep时代,我们使用PostScript和Encapsulated PostScript,但前者现在是Right Out。 PDF很自然(由于上面提到的原因),所以他们添加了PDF文件的阅读和写作。

Postscript(双关语):今天CoreGraphics中的PDF代码不是我授权的Apple - 他们使用我的代码作为更多的“工作参考”并提出了他们自己的API,因为CoreGraphics不能使用Objective- C和我的API从未真正用于一般程序。

答案 1 :(得分:3)

Quartz 2D使用的绘图模型基于PDF规范。

广泛宣称Quartz"内部使用PDF" (特别是Apple在他们的2000 Macworld演示文稿和Quartz的早期开发人员文档中),... Quartz的内部成像模型与PDF对象图很好地相关,使得将PDF输出到多个设备变得容易。 / p>

https://en.wikipedia.org/wiki/Quartz_(graphics_layer)#Use_of_PDF

https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html

答案 2 :(得分:1)

继续Mahal Tertin的观点,专注于绘图方面,这不是真正以PDF为中心但历史很有意思(我将在下面的文件格式方面)。

Quartz是在1999年之前开发的,并且是NeXT使用Display Postscript和QuickDraw的一个相当自然的延续,它在概念上可以追溯到Lisa并广泛用于OS X之前的Mac。

SVG可能是一个合理的基础,但是它的工作甚至没有开始,直到1999年。它从来没有适合OS X绘图的基础。即使它早在几年前问世,它仍然是一种未经测试的实验格式,而不是Apple已经拥有广泛代码和经验的既定格式。

当iOS出现时,它继承了Core Graphics,这使得OS X开发人员的开发变得更加容易。将所有内容转换为SVG DOM等会使iOS更难迁移到。 (我在OS X上有复杂的自定义视图,我逐字移植到iOS,添加了一个翻转翻译和一个hacky #define,用NSColor替换UIColor。)它还开发了iOS因为Apple可以重用大量现有代码,所以首先要容易得多。为什么用其他格式替换整个绘图系统?为了什么目的?

Quartz / PDF / Postscript都具有复合在一起的独立对象/图层的概念,并且对文本和线条有很多支持。当您构建窗口系统并希望轻松地沿着屏幕拖动窗口,重叠其他窗口以及最小化计算时,这很有意义。 PNG和JPEG用于压缩单个静态图像。它们对这种用途没有任何意义。特别是JPEG是一种可怕的方式来尝试管理一个充满清晰,直线和文本的窗口系统,这正是JPEG讨厌的东西。

这就是绘图方面(无论如何都不是以PDF为中心,但它解释了为什么SVG DOM不是Core Graphics的核心),但为什么PDF会得到自己的框架而不是PNG?

作为图形格式,PNG 在iOS中获得了很多支持(而不是OS X)。 iOS经过高度优化,可以显示PNG,在iOS中转换图像非常容易。确实不需要PNGKit。除了内置于UIKit中的内容之外,它还能做些什么,其中PNG和JPEG在UIImage中被赋予了自己的特殊处理权(处理PDF无法获得)?

PDFKit的存在是因为PDF很复杂,而且它解决了其他格式没有的打印问题(处理多个页面;最后一次有人邮寄给你SVG打印文档的时候?)虽然它看起来似乎已经到了通过获得自己的框架获得了很多特殊支持,PDFKit并不是非常好,并且不支持更复杂的PDF功能。因此,虽然Core Graphics内部有很长的PDF历史,但作为文件格式的PDF实际上很难被Apple IMO支持。 (比较PSPDFKit,它更强大,几乎所有以非平凡的方式使用PDF的应用程序都是必要的补充。)