高级渲染语义
已加载页面渲染在应用透明度组、软蒙版、Type 3 字形程序和分辨率感知的可见图像区域解码时,保留嵌套 Form XObject 状态
虚线路径描边
原生路径渲染保留完整的虚线数组及其相位,包括奇数长度数组、小数长度,以及用圆头或方头线帽绘制的零长度虚线;虚线图案在每个子路径重新开始
纯色描边和渐变图案描边裁剪共享同一条有界虚线几何路径,在连续绘制区段内部保留连接,并在闭合轮廓起点处把各绘制区段连接起来
虚线长度沿用渲染器当前变换的平均缩放,曲线拆分则采用自适应的设备空间打平;填充绘制和待应用的裁剪继续使用未拆分的原始路径
透明度组
- Form XObject
/Matrix值在组内容运行前与当前变换矩阵合成 - 隔离组使用单独的 alpha 平面,使黑色内容与透明像素保持可区分
- Knockout 组在重叠的绘制区域替换先前的组贡献
- 组内容从 Normal 混合模式开始:在
Do时生效的混合模式、常量 alpha 和软蒙版作用于整个组 - 以其他混合模式绘制的组会把自身的颜色和 alpha 与背景混合;自身图形状态为 Normal 混合的非隔离组,会分别在黑底和白底上绘制以恢复其 alpha
- 组被拆分为有界的 768 像素平铺,而 GDI 绘制、半色调相位、嵌套组、软蒙版和合成保留绝对设备坐标
- Form 字节在平铺执行前解码并标记化一次,临时平铺本地蒙版在下一个平铺前释放
- 嵌套组支持有界递归,并在每次 Form 调用后完整恢复图形状态
软蒙版
/S /Alpha和/S /Luminosity蒙版从蒙版组求值- 无论设置蒙版的图形状态带什么混合模式,蒙版组都以 Normal 混合绘制
- 亮度蒙版解析透明度组
/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 字典选择独立的 /Red、/Green 和 /Blue 屏,带 /Gray 和必需的 /Default 回退,而每个选定的屏可以覆盖全局传递函数
验证后的阈值字节及其规范化几何共享每个渲染器上限为 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 解码器
渲染时,双向都至少是绘制尺寸两倍的已解码区域,会在绘制或缓存前用面积平均恰好缩到绘制尺寸;这样被画小的大图能装进解码缓存,画两次的组或重复的页面可以复用它,软蒙版也在该尺寸上逐像素应用。Stencil 图像蒙版保持全分辨率,公开的区域解码方法返回其文档所述尺寸
JPEG 2000 将解码器的原生区域 API 与 2 的幂分辨率级别结合,在波前重建和光栅扩展前同时满足两个目标尺寸
可平铺寻址的 JPEG 2000 码流还可以通过 THPDFJpeg2000Decoder.LoadTileFromByteArray 直接解码一个验证后的平铺,解码器暴露平铺网格元数据和输出字节限制
当原生区域与多个独立平铺相交时,LoadRegionFromByteArrayParallel 为每个工作线程分配私有 OpenJPEG 状态,并以确定性的行主序合成完成的栅格;取消、输出限制和有效的峰值内存预算可以停止调度或选择顺序回退
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;