Advanced Rendering Semantics
로드된 페이지 렌더링은 transparency group, soft mask, Type 3 glyph procedure, 해상도 인식 가시 이미지 영역 디코딩을 적용하면서 중첩 Form XObject 상태를 보존합니다
Dashed path strokes
네이티브 path 렌더링은 홀수 길이 배열, 소수 길이, round 또는 square cap을 가진 길이 0의 그려지는 dash까지 포함해 완전한 dash 배열과 그 위상을 보존하며, dash 패턴은 subpath마다 다시 시작됩니다
단색 stroke와 gradient pattern stroke 클립은 하나의 한계가 정해진 dash 지오메트리 경로를 공유하고, 연속된 그려지는 구간 내부의 join을 유지하며, 닫힌 윤곽선의 시작점을 넘어 그려지는 구간을 이어 줍니다
dash 길이는 렌더러의 현재 변환 평균 스케일을 유지하고, 곡선 분할은 적응형 디바이스 공간 평탄화를 사용합니다. fill 도색과 보류 중인 클리핑은 계속 원본의 분할되지 않은 path를 사용합니다
Transparency groups
- Form XObject
/Matrix값은 group 콘텐츠가 실행되기 전에 현재 변환 행렬과 합성됩니다 - isolated group은 별도 alpha 평면을 써서 검은 콘텐츠가 투명 픽셀과 구별되게 유지합니다
- knockout group은 겹치는 도색 영역에서 이전 group 기여를 대체합니다
- group 콘텐츠는 Normal blend mode에서 시작합니다.
Do시점에 유효한 blend mode, 고정 alpha, soft mask가 group 전체에 적용됩니다 - 다른 blend mode로 그려진 group은 자신의 색과 alpha를 backdrop과 블렌딩합니다. 자체 graphics state가 정상적으로 블렌딩되는 non-isolated group은 alpha를 복원하기 위해 검정 위와 흰 위에 그려집니다
- group는 상한 768픽셀 tile로 분할되지만 GDI 도색, halftone 위상, 중첩 group, soft mask, 합성은 절대 디바이스 좌표를 유지합니다
- Form 바이트는 tile 실행 전에 한 번 디코딩·토큰화되고, 임시 tile 로컬 마스크는 다음 tile 전에 해제됩니다
- 중첩 group은 상한 재귀와 Form 호출마다의 완전한 그래픽 상태 복원으로 지원됩니다
Soft masks
/S /Alpha와/S /Luminosity마스크는 mask group에서 평가됩니다- mask group을 설정하는 graphics state가 어떤 blend mode를 지니든, mask group은 Normal 블렌딩으로 그려집니다
- luminosity 마스크는 transparency group
/CS를 해석하고 해석된 색에 PDF DeviceGray 근사를 가중합니다. 일반 viewer가 그렇게 하기 때문입니다. CIE 기반 색공간에 색도 측정 CIE Y를 쓰려면 대신RenderColorimetricLuminosityMasks를 설정하세요 /BC는 정확한 blending-space 구성 요소 수와 대조 검증되고 도색된 mask 콘텐츠 밖의 변환 luminosity를 공급합니다- Separation/DeviceN 도색은 대체 Lab 또는 ICCBased 색공간을 통해 변환되어 spot 구성 요소가 soft mask로 새지 않습니다
/TRtransfer function은 공유 함수 평가기를 통해 sampled, exponential, stitching, PostScript calculator 함수를 지원합니다/SMask /None은 활성 마스크를 지우고q/Q는 평소처럼 mask 상태를 보존합니다- 컴파일된 마스크는 소스 딕셔너리, 현재 변환 행렬, rendering intent가 모두 일치할 때만 재사용됩니다
transfer 및 sampled function
/TR2가 /TR보다 우선하고, 단일 함수는 모든 RGB 출력 채널에 적용되며, 네 함수 배열은 처음 세 항목을 독립 적용하면서 /Identity와 /Default 항목을 유지합니다
새 transfer 상태를 적용하면 모든 채널이 원자적으로 교체되므로, identity 항목이 이전 그래픽 상태의 조회 값을 물려받을 수 없습니다
Type 0 sampled function은 1~4 입력/출력 차원, /BitsPerSample 값 1/2/4/8/12/16/24/32, 역/순방향 /Encode 매핑, 독립 /Decode 범위, 다중 선형 보간, 다차원 cubic 보간, 1차원 /Order 3 데이터의 natural cubic spline을 지원합니다
디코딩된 샘플 바이트, 검증된 차원, 매핑, 3차 도함수는 렌더링 스레드당 64MiB로 제한된 8항목 LRU를 공유하고, 과대하거나 malformed인 function은 활성 transfer 조회 테이블을 부분 교체하지 않은 채 실패합니다
Halftone screens
Type 6/10/16 threshold 배열은 정확히 디코딩된 길이, big-endian 16비트 threshold, 가산 구성 요소 비교, 기울어진 screen이나 두 사각형 screen을 펼치지 않는 컴팩트 주기 스트립으로 직접 실행됩니다
Type 5 딕셔너리는 /Gray와 필수 /Default 폴백과 함께 독립 /Red, /Green, /Blue screen을 고르며, 선택된 각 screen은 전역 transfer function을 재정의할 수 있습니다
검증된 threshold 바이트와 정규화된 지오메트리는 렌더러당 64MiB로 제한된 64항목 LRU를 공유하고, malformed 차원, 과대 할당, 중첩 Type 5 딕셔너리, 페이로드 길이 불일치는 활성 screen 상태 전체를 연속톤 모드로 둡니다
Type 3 glyphs
Type 3 CharProc는 폰트 딕셔너리의 현재 리소스 scope, Form 지원, 클리핑, 이미지, pattern, 상한 재귀와 함께 완전한 content operator 엔진으로 실행됩니다
d0와 d1은 glyph 메트릭을 공급하고, d1 procedure는 PDF imaging 모델이 요구하는 대로 호출자가 고른 색을 유지합니다
반복 CharProc는 폰트, glyph, 선형 디바이스 행렬, 색상 상태가 일치하면 디코딩·토큰화된 display list를 재사용합니다. 이동은 동적으로 남아 다른 위치의 반복 문자가 하나의 항목을 공유합니다
렌더러별 LRU는 최대 256항목과 131,072 token을 유지하고, 16,384 token을 넘는 CharProc은 우회하며, 동작을 GetLastType3GlyphCacheStats로 보고합니다
클리핑·다운스케일된 이미지 영역
축 정렬 image XObject는 가시 소스 바운드만 요청하고 가시 디바이스 픽셀 크기를 디코딩 경로에 넘깁니다
soft mask가 붙은 이미지는 그려지는 크기 그대로 통째로 디코딩되고, 마스크도 같은 크기로 디코딩됩니다. 클리핑이 그려지는 부분을 제한하는 동안 마스크가 이미지와 정렬을 유지하기 위해서입니다. JPEG 마스크는 축소 DCT 디코더를 씁니다
렌더링 시 양방향으로 그려지는 크기의 최소 두 배 이상인 디코딩된 region은 그려지거나 캐시되기 전에 면적 평균으로 정확히 그려지는 크기로 축소됩니다. 큰 이미지를 작게 그리면 decode cache에 들어가므로 두 번 그리는 group이나 반복 페이지가 이를 재사용하고, soft mask는 그 크기에서 픽셀 단위로 적용됩니다. stencil image mask는 전체 해상도를 유지하며, 공개 region 디코딩 메서드는 문서화된 크기를 반환합니다
JPEG 2000은 웨이블릿 재구성과 래스터 확장 전에 두 목표 차원을 모두 만족하도록 고른 2의 거듭제곱 해상도 레벨을 선택해 디코더의 네이티브 region API와 결합합니다
tile 주소 지정이 가능한 JPEG 2000 codestream은 THPDFJpeg2000Decoder.LoadTileFromByteArray로 검증된 tile 하나를 직접 디코딩할 수도 있고, tile 격자 메타데이터와 출력 바이트 한도는 디코더가 노출합니다
네이티브 region이 여러 독립 tile과 겹치면 LoadRegionFromByteArrayParallel은 워커별 전용 OpenJPEG 상태를 할당하고 완성된 래스터를 결정론적 행 우선 순서로 합성합니다. 취소, 출력 한도, 실효 peak-memory 예산이 스케줄링을 멈추거나 순차 폴백을 고를 수 있습니다
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;