Display List และงานพิมพ์
HotPDF คอมไพล์ stream หน้าที่โหลดแล้วเป็น instance THPDFPageDisplayList ที่ใช้ซ้ำได้ พร้อม metrics THPDFDisplayListInfo และ bounding box ของ content object
การเรนเดอร์เอกสารแคช list ที่คอมไพล์แล้ว ขณะที่ผู้เรียกขอ list ที่เป็นเจ้าของอิสระสำหรับการ execute ซ้ำหรือการสอบถามอ็อบเจกต์ระดับภูมิภาคได้
อินเทอร์พรีเตอร์ที่ใช้ร่วมกันใน production
bitmap แบบไม่ progressive, direct-DC, Form กับ display-list replay ส่งเนื้อหาที่ tokenize ไว้แล้วผ่าน HPDFInterpretContentTokensDevice ซึ่งเป็นเจ้าของการเดิน operator และขอบเขตการยกเลิก
THPDFPageRenderer implement IHPDFContentOperatorDevice การเดินหน้าแบบแชร์จึงเรียก state machine ของ graphics, text, รีซอร์ส, clipping, pattern, transparency, marked-content กับรูปภาพของมันแบบครบวงจร โดยไม่ต้องหดการเรนเดอร์เชิงผลิตลงเหลือพื้นผิว callback เชิงความหมายที่เล็กกว่า
display list แคช index token ของ operator ระหว่าง stream ถูกคอมไพล์ แล้ว replay เฉพาะ index เหล่านั้น ตัดการสแกน operand ซ้ำทิ้ง THPDFPageDisplayList.OperatorCount กับ THPDFDisplayListInfo.OperatorCount เปิดเผยจำนวน command ที่แคชไว้
semantic device ที่ implement แค่ IHPDFContentDevice ยังได้ callback ที่ถูกกรองตามความสามารถ ขณะที่ operator device แบบเต็มจะได้ operator ที่ผ่านการตรวจหนึ่งตัวต่อครั้ง พร้อม checkpoint ยกเลิกหนึ่งจุดต่อ operator
การเรนเดอร์แบบจำกัดขอบเขตและแบบขนาน
THPDFRenderTileEvent รับ tile ขนาดที่ผู้เรียกกำหนดหรือ band แนวนอนหนึ่งชิ้นต่อครั้ง หน่วยความจำ raster สูงสุดจึงไม่ขึ้นกับขนาดหน้าเต็ม
RenderLoadedPagesParallel ซ้อนการคอมไพล์ display list กับการ playback เริ่มหน้าแรกที่พร้อมโดยไม่รอ barrier คอมไพล์เต็ม ถ่วงดุลทั้งสองสเตจข้าม worker แบบมีขอบเขตแบบไดนามิก และคืน THPDFBitmapArray ตามลำดับ input
การคอมไพล์ทำงานนอก lock ของ display-list cache ขณะที่การรับเข้าแบบ double-check กับ use count ที่ถูกปกป้อง ทำให้หน้าที่ไม่เกี่ยวกันคอมไพล์พร้อมกันได้ โดยไม่ทำ entry ที่เผยแพร่แล้วซ้ำหรือ evict list ระหว่าง playback
THPDFParallelRenderPipelineInfo เปิดเผย cache hit, จำนวนคอมไพล์, จำนวนเสร็จ, concurrency สูงสุดของสเตจคอมไพล์กับเรนเดอร์, จำนวนหน้าที่คอมไพล์แล้วตอนผลแรกออก, latency ของผลแรก และเวลารวมที่ใช้
RenderLoadedPagesParallelOrdered จัดส่ง callback ตามลำดับ input บน thread ผู้เรียก และปล่อย bitmap ที่ยืมมาแต่ละตัวหลัง callback คืน ขณะที่ความลึกเอาต์พุตที่ผู้เรียกเลือก บีบ backpressure ฝั่ง producer และจองช่องไว้หนึ่งช่องสำหรับหน้าถัดไปที่ต้องใช้ หน้าแรกที่ช้าจึงไม่เดดล็อกหลังผลลัพธ์หน้าหลัง
streaming แบบมีลำดับถือ display list กับการเรนเดอร์ที่ทำงานอยู่มากที่สุดหนึ่งชุดต่อ worker บวกคิว bitmap ที่เสร็จแล้วแบบมีขอบเขต แทนที่จะถือเอาต์พุตทั้งงานไว้ในหน่วยความจำ
Pluggable render backends กิน display list คอมไพล์แล้วชุดเดียวกัน ผ่าน view รีซอร์สเอกสารแบบไม่เป็นเจ้าของ เส้นทาง synchronous กับ parallel เลยไม่ต้อง parse เนื้อหาหน้าซ้ำ ขณะที่ความสามารถของ backend ตัดสินว่าจะทับกันได้หรือต้อง dispatch แบบเรียงลำดับ
scheduler peak-memory ระดับ process ตอนนี้กั้นทั้งสอง API แบบขนาน: ประมาณการหน้าที่ใหญ่ที่สุดหดจำนวน worker เริ่มต้น, หน้าที่อ้างสิทธิ์แต่ละหน้าจอง working set ที่ประมาณไว้เต็มจำนวน และเอาต์พุตแบบมีลำดับคง reservation นั้นไว้จนส่ง callback จบ
การยกเลิกของ scheduler จะปลุก waiter ของงบประมาณเมื่อ callback ถูกยกเลิกหรือ worker ล้ม ขณะที่ telemetry เปิดเผย worker ที่ขอเทียบกับที่มีผลจริง, น้ำหนัก reservation สูงสุด, หน้าที่ถูกเลื่อน และเวลารวมที่รอ
RenderLoadedPageTilesParallel กับ RenderLoadedPageBandsParallel ส่ง tile ตามแถวหรือ band จากบนลงล่างแบบยืมใช้ ข้าม worker ที่แยกจากกัน โดย worker แต่ละตัวถือ tile ได้มากที่สุดหนึ่งชิ้น และเพดาน working memory ที่ผู้เรียกให้จะหด concurrency ก่อนการอ้างสิทธิ์ชิ้นแรก
render context แบบขนานคัดลอก token sequence ของ glyph Type 3 กับ halftone threshold screen จาก LRU cache แบบมีขอบเขตชุดเดียว ขณะคงความเป็นเจ้าของระดับ renderer ไว้กับ graphics state ที่เปลี่ยนได้กับรีซอร์ส GDI
SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded และ SaveLoadedPagesToTiffStreamBanded กิน band renderer ตัวเดิมผ่าน encoder แบบ stream ของ PNG หรือ TIFF หน้าใหญ่มากจึงปล่อยเอาต์พุตที่บีบอัดทีละแถว โดยไม่ต้องถือ framebuffer ครบหน้า ขณะที่ THPDFBandImageExportInfo รายงาน band ที่เรนเดอร์, แถวที่ encode, worker, peak reservation bytes, ไบต์เอาต์พุต, เวลาที่ใช้ และการยกเลิก
การ decode รูปแบบแชร์ถูกประสานแยกต่างหาก งานเวกเตอร์ของหน้าจึงขนานต่อได้ โดยไม่ทำ entry ของแคชรูปที่ decode แล้วเสียหาย
PrefetchLoadedPages อุ่น entry raster ด้วย cancellation token แยก ขณะคอมไพล์กับเรนเดอร์นอก lock ของแคช และการเรนเดอร์หน้าที่ foreground จะ preempt worker ก่อนเริ่มงานที่ไวต่อ latency
THPDFLoadedPagePrefetchInfo รายงานงานที่จัดคิว, เริ่มแล้ว, เสร็จ, มีในแคช, เรนเดอร์แล้ว, ล้มเหลว, ถูกยกเลิก และถูก preempt โดย foreground พร้อม latency การยกเลิกล่าสุดกับสูงสุด
ความโปร่งใสและตัวควบคุมการพิมพ์
transparency flattening จะดูจำนวน transparency ของ display list กับเพดานพิกเซลที่ผู้เรียกกำหนดก่อน แล้วค่อยแทน paint ของหน้าด้วยรูป RGB ที่ calibrate และบีบอัดด้วย Flate แบบ lossless
หน้าที่มี colourant แบบ Separation หรือ DeviceN ยังอยู่เป็นเนื้อหาเวกเตอร์ โดยเปิดเผย colourant ที่ตรวจพบกับสถานะการคงอยู่ให้ผู้เรียกดู
renderer execute transfer function กับ halftone dictionary แบบ Type 1, 5, 6, 10 หรือ 16 จาก ExtGState ขณะคง RGB screen เป็นอิสระต่อกันกับ override ของ transfer ผ่าน q กับ Q
THPDFInkCoverageInfo รายงานค่าเฉลี่ย coverage ของ CMYK, coverage พื้นที่รวมสูงสุด และจำนวนพิกเซลที่เกิน threshold ที่เลือก
เอาต์พุต process plate กับ spot plate รองรับ colourant แบบ DeviceCMYK, Separation กับ DeviceN
Loaded-page colour rewrite ใช้ renderer เต็มรูปแบบชุดเดิม แปลงหน้าซับซ้อนเป็น Gray, RGB หรือ CMYK ขณะคงเนื้อหาหน้าที่ใช้ device colour ธรรมดาเป็นเวกเตอร์ และบังคับนโยบาย spot plate ที่ระบุชัด
THPDFTrappingInfo รวม declaration ของ trapping ระดับเอกสาร, metadata หน้า และ diagnostics เชิงโครงสร้างของ TrapNet
workflow ของ ICC
transform การเรนเดอร์รวม profile source ของ PDF, blend colour space, profile proof, profile output กับปลายทาง raster sRGB ได้พร้อมกัน
rendering intent แบบ ICC ทั้งสี่แบบกับ black-point compensation จริง ถูก apply อย่างสม่ำเสมอทั้งกับสีเวกเตอร์และ sample ของรูปข้าม pipeline
transform เต็มรูปถูกแชร์ข้ามเส้นทางเวกเตอร์, รูปภาพ, หน้า และการเรนเดอร์แบบขนาน ผ่าน LRU cache แบบ thread-safe 64 MiB ที่ key ด้วยเนื้อหาของ profile source, proof กับ output, rendering intent ที่มีผลจริง และ black-point compensation
transparency flattening ใช้ transform pipeline ชุดเดิมซ้ำ แล้วปล่อย tile CalRGB แบบ D65 ที่ไม่มีรอยต่อ ภายใต้งบประมาณ raster รวมกับพิกเซลต่อ tile ที่ผู้เรียกควบคุม
API หลัก
- Pluggable render backends
IHPDFContentOperatorDeviceHPDFInterpretContentTokensDeviceTHotPDF.CompileLoadedPageDisplayListTHPDFPageDisplayList.GetTokenTHPDFPageDisplayList.GetObjectTHPDFPageDisplayList.QueryObjectIndexesTHPDFPageDisplayList.PageObjectTHPDFPageDisplayList.ResourcesTHPDFPageDisplayList.MediaBoxTHotPDF.RenderLoadedPageTilesandRenderLoadedPageBandsTHotPDF.RenderLoadedPageTilesParallelกับRenderLoadedPageBandsParallelTHPDFParallelTileRenderInfoTHotPDF.SaveLoadedPageToPngTHotPDF.SaveLoadedPageToPngStreamTHotPDF.SaveLoadedPagesToTiffBandedTHotPDF.SaveLoadedPagesToTiffStreamBandedTHPDFBandImageExportInfoTHotPDF.RendererSharedCacheMaxBytesTHotPDF.RenderLoadedPagesParallelTHotPDF.RenderLoadedPagesParallelOrderedTHPDFParallelRenderPipelineInfoTHotPDF.PrefetchLoadedPagesTHotPDF.GetLoadedPagePrefetchInfoTHPDFLoadedPagePrefetchInfoTHotPDF.FlattenLoadedPageTransparencyTHotPDF.FlattenLoadedPageComplexGraphicsTHotPDF.RenderLoadedPageSeparationPlateTHotPDF.GetLoadedPageSpotColorantsTHotPDF.RewriteLoadedPageColorsTHotPDF.AnalyzeLoadedPageInkCoverageTHotPDF.InspectLoadedPageTrappingTHotPDF.ConfigureRenderICCWorkflow