Quartz 2D编程
四个应用方向:
绘图
应用内图像编辑
创建或显示位图
PDF文档
画布Canvas
页Page
覆盖式绘制,无法修改,绘制次序非常重要
绘图的destination—图像上下文Context
PDF文件
位图bitmap
窗口window
打印机printer
图层Layer
CGContextRef是一种不透明数据类型,包含了Quartz绘制图像至各种Destination的信息,这些信息里边包含绘图参数、设备特征数据。
Quartz 2D 不透明数据类型
API是CoreGraphics框架的一部分,故以CG为前缀
CGPathRef:矢量图形填充或描边的路径
CGImageRef:位图对象
CGLayerRef:图层对象
CGPatternRef:用于重复绘制
CGShadingRef、CGGradientRef:用于绘制梯度
CGFunctionRef:回调函数
CGColorRef、CGColorSpaceRef:用于颜色解析
CGImageSourceRef、CGImageDestinationRef:用于图形数据I/O
CGFontRef:绘制文本时描述字体
CGPDFDictionaryRef、CGPDFObjectRef、CGPDFPageRef、CGPDFStream、CGPDFStringRef、CGPDFArrayRef:用于访问PDF元数据
CGPDFScannerRef、CGPDFContentStreamRef:用于解析PDF元数据
Graphics State
State中保存了绘图所使用的一些参数。
绘图上下文context包含了一个state栈,刚创建context后栈是空的,当调用CGContextSaveGState函数后,当前state的一个副本被push到栈中,当调用CGContextRestoreGState函数后,从栈中pop出一个state作为当前state。
并非所有绘图环境方面都是state的元素,比如当前绘图的path就不是。
state包含的所有绘图参数:
变换:Current Transformation Matrix(CTM)
路径:Clipping area、Line:width,join,cap,dash,miter limit、Accuracy of curve estimation平滑度
上下文:Anti-aliasing setting反锯齿设置
颜色与颜色空间:color fill and stricken setting颜色填充与描边设置、透明度设置transparency、rendering intent渲染意图、color space fill and stricken setting颜色空间填充与描边设置
文本:字体、字体大小、字符间距、文本绘制模式
路径与位图、遮罩:混合模式
Coordinate system坐标系统
坐标系统用于描述图形对象绘制的位置和大小
由于不同设备的成像能力不同,图形绘制的位置和大小必须使用一种与设备无关的方式。Quartz使用一种特殊的坐标系统——用户空间坐标系实现设备无关性,使用当前变换矩阵CTM将用户空间映射到设备空间坐标系统中。当前变换矩阵CTM是一种仿射变换矩阵,通过平移、旋转、缩放操作将用户空间中的点映射到设备空间中。
有些技术使用不同与Quartz的坐标系统配置绘图上下文context,这种坐标系统叫做修正的坐标系统,当执行Quartz绘图操作时,必须调整坐标系统,这种坐标系统用于以下三种情况:
Mac OS XNSView的子类重写isFlipped方法并返回YES
iOS中UIView返回的context
iOS中使用UIGraphicsBeginImageContextWithOptions方法创建的context
内存管理:对象关系
Quartz使用引用计数的CoreFoundation内存管理模型。
谨记以下几点:
如果你创建或拷贝了一个对象,你就拥有这个对象,因此你必须负责是否这个对象。也就是说,如果你通过调用名称包含Create或Copy的函数持有了一个对象,那么你必须在使用对象完成后是否对象,否则会造成内存泄露。
如果你通过调用名称不包含Create或Copy的函数持有了一个对象,那么你并没拥有对象的引用,你就不应该是否它,它会在合适的时机由它的拥有者取释放。
如果你不拥有一个对象,而你又要保留它,那么你应该retain它并在你用完它的时候释放它。比如你可以使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和释放CGColorSpace对象,你也可以使用CoreFoundation的函数CFRetain和CFRelease,但你必须保证不要传递NULL给这些函数。
Transform变换
当前变换矩阵Current Transformation Matrix,CTM
修改CTM
平移:移动坐标空间的原点位置,比如x方向平移100,y方向平移50:
CGContextTranslateCTM (myContext, 100, 50);
旋转:坐标空间以原点为中心旋转一定角度,比如绕原点旋转-45度:
CGContextRotateCTM (myContext, –45.0*M_PI/180));
缩放:缩放坐标空间的x、y比例,比如x缩放0.5,y缩放0.75:
CGContextScaleCTM (myContext, 0.5, 0.75);
创建仿射变换CGAffineTransform:
创建平移仿射矩阵CGAffineTransformMakeTranslation
平移仿射变换CGAffineTransformTranslate
创建旋转仿射矩阵CGAffineTransformMakeRotation
旋转仿射变换CGAffineTransformRotate
创建缩放仿射矩阵CGAffineTransformMakeScale
缩放仿射变换CGAffineTransformScale