Display Lists and Print Production

HotPDF는 로드된 페이지 stream을 THPDFDisplayListInfo 메트릭과 content-object bounding box를 갖춘 재사용 가능한 THPDFPageDisplayList 인스턴스로 컴파일합니다

문서 렌더링은 컴파일된 list를 캐시하고, 호출자는 반복 실행이나 영역 객체 조회를 위해 독립 소유 list를 요청할 수 있습니다

공유 production 인터프리터

progressive가 아닌 bitmap, direct-DC, Form, display-list replay은 모두 연산자 순회와 취소 경계를 소유하는 HPDFInterpretContentTokensDevice로 사전 토큰화된 콘텐츠를 통과시킵니다

THPDFPageRenderer는 IHPDFContentOperatorDevice를 구현하므로 공유 순회가 완전한 그래픽, 텍스트, 리소스, 클리핑, pattern, 투명도, marked-content, 이미지 상태 기계를 호출하고, 프로덕션 렌더링이 더 작은 semantic 콜백 표면으로 축소되지 않습니다

display list는 stream이 컴파일되는 동안 연산자 token 인덱스를 캐시하고 그 인덱스만 재생해 반복 operand 스캔을 피합니다. THPDFPageDisplayList.OperatorCount와 THPDFDisplayListInfo.OperatorCount가 캐시된 명령 수를 노출합니다

IHPDFContentDevice만 구현한 semantic 디바이스는 능력 필터링 콜백을 유지하고, 완전 연산자 디바이스는 연산자마다 취소 체크포인트 하나와 함께 검증된 연산자를 한 번에 하나씩 받습니다

상한·동시 렌더링

THPDFRenderTileEvent는 호출자 크기 tile이나 가로 band를 한 번에 하나씩 받아 래스터 메모리 피크를 전체 페이지 크기와 무관하게 유지합니다

RenderLoadedPagesParallel은 디스플레이 리스트 컴파일과 재생을 겹쳐서 수행합니다. 전체 컴파일 barrier를 기다리지 않고 준비된 첫 페이지부터 시작하고, 제한된 워커들에 두 단계를 동적으로 분배하며, 입력 순서대로 THPDFBitmapArray를 반환합니다

컴파일은 display-list 캐시 잠금 밖에서 실행되고, 이중 검사 승인과 보호 use count 덕분에 무관한 페이지가 공개된 항목을 복제하거나 재생 중인 list를 내보내지 않고 동시에 컴파일됩니다

THPDFParallelRenderPipelineInfo는 캐시 히트, 컴파일, 완료, 컴파일/렌더 동시성 피크, 첫 결과 시점에 컴파일된 페이지 수, 첫 결과 지연, 총 경과 시간을 노출합니다

RenderLoadedPagesParallelOrdered는 호출 스레드에서 입력 순서대로 콜백을 전달하고 콜백이 반환된 뒤 빌린 bitmap을 해제합니다. 호출자가 고른 출력 깊이가 생산자 backpressure를 적용해 다음 필요 페이지 슬롯을 하나 예약하므로, 느린 앞선 페이지가 뒤 결과에 갇혀 교착되지 않습니다

순서화 스트리밍은 작업 출력 전체를 상주시키는 대신 워커당 display list와 활성 렌더를 최대 하나, 상한 completed-bitmap 큐만 유지합니다

플러그형 렌더 backend는 소유권 없는 문서 리소스 뷰로 같은 컴파일 list를 소비하므로 동기/병렬 경로가 페이지 콘텐츠 재파싱을 피하고, backend 능력이 호출 겹침 여부나 직렬 dispatch 필요 여부를 결정합니다

프로세스 전역 peak-memory 스케줄러가 이제 두 병렬 API를 모두 제한합니다. 가장 큰 페이지 추정치가 초기 워커 수를 줄이고, 클레임된 페이지는 추정 working set 전체를 예약하며, 순서화 출력은 콜백 전달까지 예약을 유지합니다

스케줄러 취소는 콜백 취소나 워커 실패 시 예산 대기자를 깨우고, 텔레메트리는 요청/실효 워커 수, 예약 가중치 피크, 지연 페이지, 누적 대기 시간을 노출합니다

RenderLoadedPageTilesParallel과 RenderLoadedPageBandsParallel은 격리된 워커에 걸쳐 빌려준 행 우선 tile이나 위→아래 band를 전달하고, 각 워커는 최대 하나의 tile을 소유하며 호출자 지정 working-memory 상한이 첫 클레임 전에 동시성을 줄입니다

병렬 렌더 컨텍스트는 불변 Type 3 glyph token 시퀀스와 halftone threshold screen을 하나의 상한 LRU 캐시에서 복사하고, mutable 그래픽 상태와 GDI 리소스는 렌더러 로컬 소유권을 유지합니다

SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded, SaveLoadedPagesToTiffStreamBanded는 스트리밍 PNG 또는 TIFF 인코더를 통해 같은 밴드 렌더러를 사용하므로, 매우 큰 페이지도 전체 프레임버퍼를 메모리에 두지 않고 압축된 출력을 행 단위로 내보냅니다. THPDFBandImageExportInfo는 렌더링된 밴드 수, 인코딩된 행 수, 워커 수, 최대 예약 바이트, 출력 바이트, 경과 시간, 취소 여부를 보고합니다

공유 이미지 디코딩은 별도 조정되어 벡터 페이지 작업이 decoded-image 캐시 항목을 망가뜨리지 않고 병렬로 유지됩니다

PrefetchLoadedPages는 전용 취소 token으로 래스터 항목을 워밍하면서 캐시 잠금 밖에서 컴파일·렌더하고, foreground 페이지 렌더링이 지연 민감 작업을 시작하기 전에 워커를 선점합니다

THPDFLoadedPagePrefetchInfo는 예약, 시작, 완료, 캐시, 렌더, 실패, 취소, foreground 선점된 작업과 마지막/피크 취소 지연을 보고합니다

투명도와 인쇄 제어

transparency 평탄화는 display-list 투명도 수와 호출자 정의 픽셀 상한을 먼저 확인한 뒤 페이지 도색을 무손실 Flate 압축 보정 RGB 이미지로 대체합니다

Separation/DeviceN colorant가 있는 페이지는 벡터 콘텐츠로 남고, 탐지된 colorant와 보존 상태가 호출자에게 노출됩니다

렌더러는 ExtGState의 전달 함수와 Type 1, 5, 6, 10, 16 halftone 사전을 실행하며, q와 Q를 거쳐도 독립적인 RGB 스크린과 그 전달 함수 오버라이드를 유지합니다

THPDFInkCoverageInfo는 평균 CMYK 커버리지, 최대 전체 면적 커버리지, 선택 threshold를 넘는 픽셀 수를 보고합니다

process/spot 판 출력은 DeviceCMYK, Separation, DeviceN colorant를 지원합니다

로드 페이지 색 재작성은 같은 완전 렌더러로 복잡한 페이지를 Gray/RGB/CMYK로 변환하면서 단순 디바이스 색 페이지 콘텐츠는 벡터로 유지하고 명시적 spot-판 policy를 적용합니다

THPDFTrappingInfo는 문서 trapping 선언, 페이지 메타데이터, TrapNet 구조 진단을 결합합니다

ICC workflow

렌더링 transform은 PDF source 프로파일, blend 색공간, proof 프로파일, output 프로파일, sRGB 래스터 destination을 결합할 수 있습니다

네 가지 ICC rendering intent와 진짜 black-point compensation이 파이프라인 전반에서 벡터 색상과 이미지 샘플에 일관되게 적용됩니다

완전한 transform은 source, proof, output 프로파일 내용, 실효 rendering intent, black-point compensation을 키로 하는 스레드 안전 64MiB LRU 캐시로 벡터, 이미지, 페이지, 병렬 렌더링 경로에 공유됩니다

transparency 평탄화는 같은 transform 파이프라인을 재사용한 뒤 호출자 제어 total-raster·tile별 픽셀 예산 안에서 이음새 없는 D65 CalRGB tile을 출력합니다

주요 API