可插拔页面渲染后端

HotPDF 可以将已加载页面位图渲染路由到应用程序定义的后端,同时保留现有渲染器作为零配置默认值和可选回退

内置原生后端

PDF.UseNativeGDIRenderBackend;
Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);

THPDFNativeGDIRenderBackend 通过外部实现使用的同一公共后端契约暴露既有的 Windows 原生 GDI 渲染器

其能力声明 prbcNative、prbcDeterministic、prbcTransparency、prbcColourManagement 和 prbcThreadSafe,而不声明 prbcDeviceAcceleration

SIMD 扫描线后端

var
  Backend: IHPDFPageRenderBackend;
begin
  Backend := THPDFSIMDScanlineRenderBackend.Create;
  PDF.PageRenderBackend := Backend;
  Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);
end;

THPDFSIMDScanlineRenderBackend 先对完整编译后的 display list 做预检,然后通过 64 字节批处理和 16 字节向量尾部,把受支持的 DeviceRGB 或 DeviceGray 矩形填充直接写入最终的 32 位位图表面

复合矩形路径按非零或奇偶填充规则作为一次绘制操作处理,保留孔洞、变换后的子路径方向和此前已绘制的内容;光栅化在有界批次中检查取消,并丢弃部分完成的表面

该后端接受图形状态保存与恢复、正交缩放、平移与直角旋转矩阵、填充色变更、矩形、填充操作符和路径重置;文本、任意路径、描边、图像、透明度、裁剪、图案、shading、不受支持的色彩空间以及非正交变换会在位图分配之前拒绝

其能力声明 prbcSIMD、prbcThreadSafe 和 prbcDeterministic,不声称设备加速、透明度或色彩管理

prbcDeviceAcceleration

自定义后端契约

实现 IHPDFPageRenderBackend 并将其分配给 THotPDF.PageRenderBackend

THPDFPageRenderBackendRequest 提供请求的页面索引和 DPI、编译的 THPDFPageDisplayList 以及用于流、图像、字体、可选内容、颜色管理和取消的 THPDFRenderDocAccess 解析器

后端可以通过 THPDFPageDisplayList.GetToken 检查每个编译运算符,而无需重新解析页面内容

返回带新分配 TBitmap 的 True 以将位图所有权转移给 HotPDF;返回不带位图的 False 以拒绝请求

并发与回退

声明 prbcThreadSafe 的后端可以通过两个并行页面渲染管线并发运行

没有该能力的后端通过专用调用锁串行化,而显示列表编译保持并发

rbfpSoftwareFallback 用现有渲染器重试不可用、被拒绝或失败的后端请求,而 rbfpFail 抛出 EHPDFRenderBackend

更改后端会使内存中和持久的渲染页面缓存条目失效,因此来自不同渲染器的图像绝不会混合 IHPDFPageRenderBackendFailureInfo,或返回逐请求的诊断原因,使并发拒绝能为确切的渲染尝试保留原因

更换后端会使内存和持久化的已渲染页面缓存条目失效,因此不同渲染器产生的图像不会被混用

诊断与可视化门槛

THPDFRenderBackendStatistics 报告尝试、成功、失败、软件回退、串行化调用、运行时间、后端名称和最后失败原因

内置一致性夹具使用重叠透明度,并针对默认渲染器在 Win32 和 Win64 上声明最大 Delta E 0、alpha 合成 RGB 误差 0 和不同像素数 0

相关 API