iOS 核心圖形之CGFont

weixin_34253539發表於2019-03-07
前言

UIFont的底層實現,用於繪製文字的一組字元符號和佈局資訊

資料型別

1.CGFontRef :CGFont 的引用

typedef unsigned short CGFontIndex;

提供指定字形識別符號的附加方法。等價於CGGlyph,可以交替使用這兩種型別的常量

  1. CGGlyph 等價於CGFontIndex
typedef CGFontIndex CGGlyph;
kCGFontIndexMax // `CGFontIndex`最大值
kCGFontIndexInvalid // 無效的字型索引
kCGGlyphMax // 與kCGFontIndexMax等價

繪製文字時,指定一個字元序列。不過,Core Graphics還允許使用CGGlyph值指定符號。無論哪種情況,Core Graphics都使用Apple Type Services (ATS)框架提供的字型資料呈現文字
為函式CGContextShowGlyphsCGContextShowGlyphsAtPoint提供CGGlyph值。這些函式分別在當前文字位置或指定位置顯示符號陣列

  1. CGFontPostScriptFormat:PostScript字型子集的可能格式
kCGFontPostScriptFormatType1 // 以`Adobe Type 1`字型格式記錄
kCGFontPostScriptFormatType3 // 在`PostScript`語言參考
kCGFontPostScriptFormatType42 // 在`Adobe`技術說明5012 (Type 42字型格式規範)中有說明,
  1. 用於字型變化軸字典的鍵
const CFStringRef kCGFontVariationAxisName // 用於從變異軸字典中獲取變異軸名稱的鍵。使用此鍵獲得的值是一個`CFStringRef`,它指定了變化軸的名稱
const CFStringRef kCGFontVariationAxisMinValue // 用於從變化軸字典中獲取最小變化軸值的鍵。使用此鍵獲得的值是一個`CFNumberRef`,它指定了變化軸的最小值
const CFStringRef kCGFontVariationAxisMaxValue // 用於從變化軸字典中獲取最大變化軸值的鍵。使用此鍵獲得的值是一個`CFNumberRef`,它指定了變化軸的最大值
const CFStringRef kCGFontVariationAxisDefaultValue // 用於從變異軸字典中獲取預設變異軸值的鍵。使用此鍵獲得的值是一個`CFNumberRef`,它指定變數軸的預設值
Retain & Release
CGFontRef CGFontRetain(CGFontRef font); // Retain等同於CFRetain
CGFontRef CGFontRelease(CGFontRef font); // Release等同於CFRelease
建立CGFont

以下方法建立都需要呼叫CFRelease

CGFontRef CGFontCreateCopyWithVariations(CGFontRef font, CFDictionaryRef variations); //  複製
// variations 變體規範字典,包含與字型的變體軸名稱對應的鍵。字典中的每個鍵都是一個變異軸名稱。每個鍵的值是為表示為`CFNumber`物件的特定變化軸指定的值。變數中沒有指定變數軸名稱,則使用字型的當前值

CGFontRef CGFontCreateWithFontName(CFStringRef name) //  通過字型名字建立
//  注意 在核上下文繪製文字之前,必須通過呼叫函式`CGContextSetFont`將字型設定為當前圖形狀態

CGFontRef CGFontCreateWithDataProvider(CGDataProviderRef provider) // 從資料提供程式提供的資料建立字型物件
// 注意 在核心圖形上下文中繪製文字之前,必須通過呼叫函式`CGContextSetFontSize`將字型設定為當前圖形狀態
PostScript字型
CFStringRef CGFontCopyPostScriptName(CGFontRef font) // 獲取字型的`PostScript`名稱
bool CGFontCanCreatePostScriptSubset(CGFontRef font, CGFontPostScriptFormat format) // `Core Graphics`是否可以以`PostScript`格式建立字型的子集
CFDataRef CGFontCreatePostScriptSubset(CGFontRef font, CFStringRef subsetName, CGFontPostScriptFormat format, const CGGlyph *glyphs, size_t count, const CGGlyph *encoding) // 以指定的`PostScript`格式建立字型的子集
CFDataRef CGFontCreatePostScriptEncoding(CGFontRef font, const CGGlyph *encoding)  // 以指定的`PostScript`格式建立字型的子集
使用字型表
CFArrayRef CGFontCopyTableTags(CGFontRef font) // 返回與字型的字型表對應的標記陣列
// 返回陣列中的每個條目都是一個4位元組的值,表示一個TrueType或OpenType字型表標記。要以適合32位和64位架構的方式獲得索引k處的標記,需要使用類似於以下程式碼 : tag = (uint32_t)(uintptr_t)CFArrayGetValue(table, k);
CFDataRef CGFontCopyTableForTag(CGFontRef font, uint32_t tag)  // 返回與提供的標記對應的字型表
獲得字型資訊
CFTypeID CGFontGetTypeID(void) // 獲取TypeId
CFArrayRef CGFontCopyVariationAxes(CGFontRef font) // 返回字型的變體軸字典陣列
CFDictionaryRef CGFontCopyVariations(CGFontRef font) // 返回字型的變體規範字典
CFStringRef CGFontCopyFullName(CGFontRef font) // 獲取字型全名
int CGFontGetAscent(CGFontRef font) // 返回字型的上升率 ***上升是字型中字形基線以上的最大距離
int CGFontGetDescent(CGFontRef font) // 返回字型的下移 *** 下降是字型中字形基線以下的最大距離
int CGFontGetLeading(CGFontRef font) // 返回字型的前導 *** 字型中連續文字行之間的間距。該值以字形空間單位指定
int CGFontGetCapHeight(CGFontRef font) // 返回字型的帽高 *** 字型中字形的平直大寫字母頂部基線以上的距離
int CGFontGetXHeight(CGFontRef font) // 返回字型的x高度 *** 字型中字形的平直、非升序小寫字母(如x)頂部基線以上的距離
CGRect CGFontGetFontBBox(CGFontRef font) // 返回字型的邊框 *** 字型中所有字形的所有包圍框的聯合
CGFloat CGFontGetItalicAngle(CGFontRef font) // 返回字型的斜體角度 *** 字型的斜體角,從垂直方向逆時針角度測量
CGFloat CGFontGetStemV(CGFontRef font) // 字型中占主導地位的垂直字形的粗細
bool CGFontGetGlyphBBoxes(CGFontRef font, const CGGlyph *glyphs, size_t count, CGRect *bboxes) // 獲取陣列中每個字形的邊界框
CGGlyph CGFontGetGlyphWithGlyphName(CGFontRef font, CFStringRef name) // 字型物件關聯的字形名稱的字形
CFStringRef CGFontCopyGlyphNameForGlyph(CGFontRef font, CGGlyph glyph) // 指定字形的字形名稱
size_t CGFontGetNumberOfGlyphs(CGFontRef font) // 字形的數目
bool CGFontGetGlyphAdvances(CGFontRef font, const CGGlyph *glyphs, size_t count, int *advances) // 獲取所提供陣列中每個字形的前進寬度
int CGFontGetUnitsPerEm(CGFontRef font) // 字型的符號空間單元數

相關文章