進階轉譯語意
已載入頁面的轉譯保留巢狀 Form XObject 狀態,同時套用透明度群組、柔光遮罩、Type 3 字形程序,以及感知解析度的可見影像區域解碼
虛線路徑筆畫
原生路徑轉譯會保留完整的虛線陣列與其相位,包括奇數長度陣列、小數長度,以及用圓頭或方頭端點繪出的零長度虛段;虛線圖樣會在每個子路徑重新開始
單色筆畫與漸層圖樣筆畫剪裁共用同一條有界的虛線幾何路徑,在連續繪製區段內保留接合,並跨封閉輪廓的起點接合繪製區段
虛線長度保留轉譯器的平均目前變換縮放,曲線分割則採用自適應的裝置空間扁平化;填滿繪製與待處理剪裁仍使用未分割的原始路徑
透明度群組
- Form XObject 的
/Matrix值會在群組內容執行之前與目前的變換矩陣組成 - 隔離群組使用獨立的 alpha 平面,因此黑色內容仍可與透明像素區分
- 挖空群組會在重疊的繪製區域中取代先前群組的貢獻
- 群組內容從 Normal 混合模式開始:在
Do當下生效的混合模式、常數 alpha 與柔光遮罩會套用到整個群組 - 以其他混合模式繪製的群組,會把自己的顏色與 alpha 和背景混合;自身 graphics state 正常混合的非隔離群組,會分別畫在黑底與白底上以還原其 alpha
- 群組會分割為有界的 768 像素圖塊,同時 GDI 繪製、半色調相位、巢狀群組、柔光遮罩與合成仍保持絕對的裝置座標
- Form 位元組會在圖塊執行前解碼並做一次語彙分析,接著在下一塊之前釋放暫時的圖塊在地遮罩
- 巢狀群組支援有界的遞迴,並在每次 Form 呼叫之後完整還原圖形狀態
柔光遮罩
/S /Alpha與/S /Luminosity遮罩會從遮罩群組求值- 遮罩群組一律以 Normal 混合繪製,無論設定該遮罩的 graphics state 帶何種混合模式
- 明度遮罩會解析透明度群組的
/CS,並如常見檢視器的做法以 PDF DeviceGray 近似值為解析出的顏色加權;若要對以 CIE 為基礎的色彩空間改用色度 CIE Y,請設定RenderColorimetricLuminosityMasks /BC會依確切的混合空間元件數驗證,並在遮罩外繪製內容上提供轉換後的明度- 分色與 DeviceN 繪製會透過其替代 Lab 或 ICCBased 空間轉換,因此特別色的元件絕不會洩漏到柔光遮罩中
/TR傳輸函式透過共享的函式求值器支援取樣、指數、縫合與 PostScript 計算器函式/SMask /None會清除使用中的遮罩,而q或Q會正常保留遮罩狀態- 已編譯的遮罩只會於來源字典、目前變換矩陣與轉譯意圖全都相符時重用
傳輸與取樣函式
/TR2 優先於 /TR,單一函式套用到每個 RGB 輸出通道,而四函式陣列則獨立套用其前三項,同時保留 /Identity 與 /Default 項目
套用新的傳輸狀態會以原子方式取代每個通道,因此身分項目無法從較早的圖形狀態繼承查詢值
Type 0 取樣函式支援一到四個輸入與輸出維度、/BitsPerSample 值 1、2、4、8、12、16、24 與 32、反向或正向 /Encode 對應、獨立的 /Decode 範圍、多線性內插、多維立方內插,以及用於一維 /Order 3 資料的自然三次樣條
解碼後的取樣位元組、已驗證的維度、對應與立方導數共享每個轉譯執行緒加上限為 64 MiB 的八項目 LRU,而超大型或格式錯誤的函式則會失敗,而不會部分取代使用中的傳輸查詢表
半色調網屏
Type 6、Type 10 與 Type 16 閾值陣列會以確切的解碼長度、大端序 16 位元閾值、加法元件比較,以及避免擴充傾斜或雙矩形網屏的精簡週期性條紋直接執行
Type 5 字典以 /Gray 與必要的 /Default 遞補方式選取獨立的 /Red、/Green 與 /Blue 網屏,而每個選定的網屏都可以覆寫全域傳輸函式
已驗證的閾值位元組及其正規化幾何共享每個轉譯器上限為 64 MiB 的 64 項目 LRU,而格式錯誤的維度、超大型配置、巢狀 Type 5 字典或載入長度不符都會讓完整的使用中網屏狀態保持在連續色調模式
Type 3 字形
Type 3 CharProcs 以字型字典的目前資源範圍、Form 支援、裁切、影像、圖樣與有界遞迴,透過完整的內容運算子引擎執行
d0 與 d1 提供字形度量,而 d1 程序依 PDF 影像模型的要求保留呼叫端選取之色彩
當字型、字形、線性裝置矩陣與色彩狀態相符時,重複的 CharProcs 會重用已解碼並語彙分析過的顯示清單;平移保持動態,因此不同位置的相同字元可共享一個項目
每個轉譯器的 LRU 最多保留 256 個項目與 131,072 個符號、略過任何超過 16,384 個符號的 CharProc,並透過 GetLastType3GlyphCacheStats 回報其行為
裁切與縮小的影像區域
軸對齊的影像 XObject 只要求可見的來源邊界,並把可見的裝置像素大小傳入解碼路徑
帶柔光遮罩的影像會以繪製時的大小整張解碼,遮罩也以同樣大小解碼,遮罩因此與影像保持對齊,裁切只限制繪製範圍;JPEG 遮罩使用縮小尺寸的 DCT 解碼器
轉譯時,若解碼出的區域在兩個方向上都至少是繪製大小的兩倍,會先以面積平均縮到恰好繪製大小,再繪製或快取;畫得很小的大圖因此放得進解碼快取,畫兩次的群組或重複的頁面都能重用它,柔光遮罩也會在該尺寸下逐像素套用。模板影像遮罩保留完整解析度,公開的區域解碼方法仍回傳文件所載的尺寸
JPEG 2000 將解碼器的原生區域 API 與二次幕解析度層級結合,選取能同時滿足兩個目標維度的層級,再進行小波重建與點陣展開
可圖塊定址的 JPEG 2000 codestream 也可以透過 THPDFJpeg2000Decoder.LoadTileFromByteArray 直接解碼一個已驗證的圖塊,圖塊網格中繼資料與輸出位元組限制則由解碼器公開
當原生區域與多個獨立圖塊相交時,LoadRegionFromByteArrayParallel 會為每個工作執行緒指派私有的 OpenJPEG 狀態,並以確定性的列主序組成完成的點陣;取消、輸出限制與有效的尖峰記憶體預算可以停止排程或選擇循序遞補方案
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;