表示リストと印刷制作

HotPDF はロード済みページストリームを、THPDFDisplayListInfo メトリクスとコンテンツオブジェクト境界ボックスを持つ再利用可能な THPDFPageDisplayList インスタンスにコンパイルします

ドキュメントレンダリングはコンパイル済みリストをキャッシュし、呼び出し元は反復実行または領域オブジェクトクエリのために独立して所有されたリストを要求できます

境界付きおよび並行レンダリング

非プログレッシブビットマップ、direct-DC、Form、表示リスト再生はいずれも、事前トークン化済みコンテンツを HPDFInterpretContentTokensDevice に渡します。オペレータ走査とキャンセル境界は HPDFInterpretContentTokensDevice が担当します

THPDFPageRenderer は IHPDFContentOperatorDevice を実装しています。そのため共有走査は、グラフィックス・テキスト・リソース・クリッピング・パターン・透明度・マーク付きコンテンツ・画像の完全なステートマシンを呼び出せます。本番レンダリングをより小さなセマンティックコールバック面に縮小することはありません

表示リストは、ストリームのコンパイル時にオペレータトークンのインデックスをキャッシュし、再生ではそのインデックスだけを使います。オペランドの反復走査を避けられます。THPDFPageDisplayList.OperatorCount と THPDFDisplayListInfo.OperatorCount がキャッシュされたコマンド数を公開します

IHPDFContentDevice だけを実装するセマンティックデバイスは、ケイパビリティでフィルタされたコールバックを保持します。完全なオペレータデバイスは、検証済みのオペレータを 1 回に 1 つ受け取り、オペレータごとに 1 つのキャンセルチェックポイントを持ちます

透過と印刷制御

THPDFRenderTileEvent は呼び出し側が指定したサイズのタイルまたは水平バンドを一度に 1 つ受け取るため、ピークラスタメモリはページ全体のサイズに依存しません

RenderLoadedPagesParallel は display list のコンパイルと再生を重ね合わせて実行します。全ページのコンパイル完了を待つバリアなしで最初に準備できたページから再生を始め、両ステージを上限付きのワーカー間で動的に負荷分散し、入力順の THPDFBitmapArray を返します

コンパイルは表示リストキャッシュのロックの外で実行されます。二重チェック付きの登録と保護された使用カウントにより、公開済みエントリの重複や再生中のリスト追い出しを起こさずに、無関係なページを並行してコンパイルできます

THPDFParallelRenderPipelineInfo は、キャッシュヒット数・コンパイル数・完了数・コンパイルとレンダリングのピーク同時実行数・最初の結果までにコンパイルされたページ数・最初の結果までのレイテンシ・合計経過時間を公開します

RenderLoadedPagesParallelOrdered は、呼び出しスレッド上で入力順にコールバックを届け、コールバックが返った後に借り受けたビットマップを解放します。呼び出し側が選択した出力深度がプロデューサー側の背圧として働き、次に必要なページのスロットを 1 つ予約するため、遅い先行ページが後続の結果の背後でデッドロックすることはありません

順序付きストリーミングでは、ワーカーごとに表示リストと実行中レンダリングを最大 1 つ、それに上限付きの完成ビットマップキューだけを保持します。ジョブ出力全体を常駐させることはありません

Pluggable render backends は、所有権を持たないドキュメントリソースビューを通じて同じコンパイル済みリストを消費します。そのため同期 / 並列のどちらの経路でもページコンテンツの再パースが避けられ、呼び出しが重ねられるか直列ディスパッチが必要かはバックエンドのケイパビリティが決めます

プロセス全体のピークメモリスケジューラが、2 つの並列 API を両方制限するようになりました。最大のページ見積もりが初期ワーカー数を減らし、要求された各ページは推定ワーキングセット一式を予約し、順序付き出力ではコールバック配信までその予約を保持します

スケジューラのキャンセルは、コールバックのキャンセルやワーカー障害の際に予算待ちを目覚めさせ、テレメトリは要求ワーカー数と実効ワーカー数・ピーク予約ウェイト・遅延ページ・合計待ち時間を公開します

RenderLoadedPageTilesParallel と RenderLoadedPageBandsParallel は、行優先のタイルまたは上から下へのバンドを、分離されたワーカー間で借用形式で届けます。各ワーカーが所有するのは最大 1 タイルで、呼び出し側指定のワーキングメモリ上限が、最初の要求より前に同時実行数を減らします

並列レンダリングのコンテキストは、不変の Type 3 グリフトークン列とハーフトーンのしきい値スクリーンを 1 つの上限付き LRU キャッシュからコピーします。可変のグラフィックス状態と GDI リソースについては、レンダラローカルの所有権を保持します

SaveLoadedPageToPng、SaveLoadedPageToPngStream、SaveLoadedPagesToTiffBanded、SaveLoadedPagesToTiffStreamBanded は、同じバンドレンダラーをストリーミング方式の PNG / TIFF エンコーダー経由で利用します。そのため非常に大きなページでも、完全なフレームバッファを保持せずに圧縮済みの出力を行単位で書き出せます。THPDFBandImageExportInfo には、レンダリング済みバンド数、エンコード済み行数、ワーカー数、ピーク時の予約バイト数、出力バイト数、経過時間、キャンセルの有無が報告されます

共有画像のデコードは別途調整されます。そのため、デコード済み画像キャッシュのエントリを壊さずに、ベクターのページ処理を並行して続けられます

PrefetchLoadedPages は、専用のキャンセルトークン付きでラスタのエントリをウォームアップします。コンパイルとレンダリングはキャッシュロックの外で行われ、レイテンシに敏感な処理を始める前に、フォアグラウンドのページレンダリングがワーカーを横取りします

THPDFLoadedPagePrefetchInfo は、予定・開始・完了・キャッシュ・レンダリング・失敗・キャンセル・フォアグラウンドに横取りされた処理の各件数に加えて、直近とピークのキャンセルレイテンシを報告します

ICC ワークフロー

透明度のフラット化では、まず表示リストの透明度カウントと呼び出し側指定のピクセル上限を確認し、その後でページの描画を無損失 Flate 圧縮のキャリブレーテッド RGB 画像へ置き換えます

Separation または DeviceN の色材を含むページはベクターコンテンツのまま残り、検出された色材と保持状態が呼び出し側に公開されます

レンダラーは ExtGState の transfer function と、Type 1、5、6、10、16 のハーフトーン辞書を実行します。独立した RGB スクリーンとその transfer function の上書きは、q と Q をまたいで保持されます

THPDFInkCoverageInfo は、平均 CMYK カバー率・最大合計面積カバー率・選択されたしきい値を超えるピクセル数を報告します

プロセス版とスポット版の出力は、DeviceCMYK・Separation・DeviceN の色材に対応します

Loaded-page colour rewrite は同じ完全なレンダラを使って複雑なページを Gray / RGB / CMYK へ変換します。単純なデバイスカラーのページコンテンツはベクターのまま保持し、明示的なスポット版ポリシーを適用します

THPDFTrappingInfo は、ドキュメントのトラッピング宣言・ページメタデータ・TrapNet の構造診断を組み合わせます

透明度と印刷の制御

レンダリング変換は、PDF ソースプロファイル・ブレンドカラースペース・ proof プロファイル・出力プロファイル・sRGB ラスタ出力先を組み合わせられます

4 つの ICC レンダリングインテントすべてと真のブラックポイント補正が、パイプライン全体でベクターカラーと画像サンプルに一貫して適用されます

完全な変換は、スレッドセーフな 64 MiB の LRU キャッシュを通じて、ベクター・画像・ページ・並列レンダリングの各経路で共有されます。キーはソース・proof / 出力プロファイルの内容・実効的なレンダリングインテント・ブラックポイント補正です

透明度のフラット化は同じ変換パイプラインを再利用した後、呼び出し側が制御する合計ラスタ予算とタイルごとのピクセル予算の下で、継ぎ目のない D65 CalRGB タイルを出力します

関連 API