Display Lists y producción de impresión
HotPDF compila los streams de páginas cargadas en instancias reutilizables de THPDFPageDisplayList con métricas THPDFDisplayListInfo y bounding boxes de objetos de contenido
El render del documento cachea las listas compiladas, mientras que los callers pueden solicitar una lista de propiedad independiente para ejecución repetida o consultas regionales de objetos
Intérprete de producción compartido
El bitmap no progresivo, el direct-DC, el replay de Form y de display-list pasan todos el contenido pre-tokenizado por HPDFInterpretContentTokensDevice, que es dueño del recorrido de operadores y de las fronteras de cancelación
THPDFPageRenderer implementa IHPDFContentOperatorDevice, de modo que el recorrido compartido invoca su máquina de estados completa de gráficos, texto, recursos, clipping, patterns, transparencia, marked-content e imágenes, sin reducir el render de producción a la superficie de callbacks semánticos más pequeña
Las display lists cachean índices de tokens de operadores mientras los streams se compilan, y en el replay solo reproducen esos índices, evitando escaneos repetidos de operandos; THPDFPageDisplayList.OperatorCount y THPDFDisplayListInfo.OperatorCount exponen el conteo de comandos cacheados
Los dispositivos semánticos que implementan solo IHPDFContentDevice conservan callbacks filtrados por capacidades, mientras que los dispositivos de operadores completos reciben un operador validado a la vez con un checkpoint de cancelación por operador
Render acotado y concurrente
THPDFRenderTileEvent recibe un tile o una banda horizontal del tamaño del caller a la vez, manteniendo la memoria de raster pico independiente del tamaño completo de la página
RenderLoadedPagesParallel solapa la compilación de display lists con el playback, arranca la primera página lista sin esperar una barrera de compilación completa, balancea dinámicamente ambas etapas entre workers acotados, y devuelve un THPDFBitmapArray en el orden de entrada
La compilación corre fuera del lock de la caché de display lists, mientras que la admisión de doble comprobación y los conteos de uso protegidos permiten compilar páginas no relacionadas en concurrente sin duplicar entradas publicadas ni expulsar una lista durante el playback
THPDFParallelRenderPipelineInfo expone cache hits, compilaciones, finalizaciones, concurrencia pico de compilación y render, páginas compiladas al primer resultado, latencia del primer resultado y tiempo total transcurrido
RenderLoadedPagesParallelOrdered entrega los callbacks en orden de entrada en el thread llamador y libera cada bitmap prestado después de que el callback devuelve, mientras que una profundidad de salida elegida por el caller aplica backpressure al producer y reserva un slot para la siguiente página requerida, de modo que una página temprana lenta no pueda provocar un deadlock detrás de resultados posteriores
El streaming ordenado retiene como máximo una display list y un render activo por worker, más la cola acotada de bitmaps completados, en lugar de mantener residente la salida completa del trabajo
Los pluggable render backends consumen las mismas listas compiladas a través de una vista de recursos del documento sin propiedad, así que las vías síncrona y paralela evitan reparsear el contenido de la página, mientras que las capacidades del backend determinan si las llamadas pueden solaparse o requieren despacho serial
El scheduler de memoria pico de todo el proceso ahora limita ambas APIs paralelas: la estimación de la página más grande reduce el conteo inicial de workers, cada página reclamada reserva su working set estimado completo, y la salida ordenada retiene esa reserva durante la entrega de callbacks
La cancelación del scheduler despierta a los waiters de presupuesto ante la cancelación de un callback o el fallo de un worker, mientras que la telemetría expone los workers solicitados frente a los efectivos, el peso pico de reserva, las páginas retrasadas y el tiempo de espera agregado
RenderLoadedPageTilesParallel y RenderLoadedPageBandsParallel entregan tiles prestados en row-major o bandas de arriba hacia abajo entre workers aislados, mientras que cada worker es dueño de como máximo un tile y un tope de memoria de trabajo suministrado por el caller reduce la concurrencia antes del primer claim
Los contextos de render paralelo copian secuencias de tokens de glyph Type 3 inmutables y halftone threshold screens desde una única caché LRU acotada, preservando la propiedad local del renderer para el estado de gráficos mutable y los recursos GDI
SaveLoadedPageToPng, SaveLoadedPageToPngStream, SaveLoadedPagesToTiffBanded y SaveLoadedPagesToTiffStreamBanded consumen el mismo band renderer mediante encoders PNG o TIFF de streaming, así que las páginas muy grandes emiten salida comprimida fila por fila sin sostener un framebuffer completo, mientras que THPDFBandImageExportInfo reporta las bandas renderizadas, las filas codificadas, los workers, los bytes pico de reserva, los bytes de salida, el tiempo transcurrido y la cancelación
La decodificación de imágenes compartidas se coordina por separado para que el trabajo vectorial de la página siga siendo paralelo sin corromper las entradas de la caché de imágenes decodificadas
PrefetchLoadedPages precalienta entradas de raster con un cancellation token dedicado mientras compila y renderiza fuera del lock de la caché, y el render de páginas en primer plano hace preemption del worker antes de iniciar trabajo sensible a la latencia
THPDFLoadedPagePrefetchInfo reporta el trabajo programado, iniciado, completado, cacheado, renderizado, fallido, cancelado y con preemption en primer plano, junto con la latencia de cancelación última y pico
Controles de transparencia e impresión
El transparency flattening comprueba primero el conteo de transparencia de la display list y un techo de píxeles definido por el caller, luego reemplaza el pintado de la página con una imagen RGB calibrada comprimida con Flate sin pérdidas
Las páginas con colorantes Separation o DeviceN permanecen como contenido vectorial, con los colorantes detectados y el estado de preservación expuestos al caller
El renderer ejecuta transfer functions y diccionarios de halftone Type 1, 5, 6, 10 o 16 de ExtGState, preservando las RGB screens independientes y sus overrides de transfer a través de q y Q
THPDFInkCoverageInfo reporta la cobertura CMYK promedio, la cobertura máxima de área total y el número de píxeles por encima del umbral seleccionado
La salida de placas de proceso y de spot soporta colorantes DeviceCMYK, Separation y DeviceN
El color rewrite de páginas cargadas usa el mismo renderer completo para convertir páginas complejas a Gray, RGB o CMYK, retiene el contenido de página de color de dispositivo simple como vectores y aplica una política explícita de spot plates
THPDFTrappingInfo combina las declaraciones de trapping del documento, los metadatos de la página y diagnósticos estructurales del TrapNet
Flujo ICC
El transform de render puede combinar un source profile de PDF, un blend colour space, un proof profile, un output profile y un destino raster sRGB
Los cuatro rendering intents de ICC y la black-point compensation real se aplican de forma consistente a colores vectoriales y muestras de imagen en todo el pipeline
Los transforms completos se comparten entre las vías vectorial, de imagen, de página y de render paralelo a través de una caché LRU de 64 MiB thread-safe indexada por el contenido de los source, proof y output profiles, el rendering intent efectivo y la black-point compensation
El transparency flattening reutiliza el mismo pipeline de transform y luego emite tiles D65 CalRGB sin costuras bajo presupuestos de raster total y de píxeles por tile controlados por el caller
APIs principales
- Pluggable render backends
IHPDFContentOperatorDeviceHPDFInterpretContentTokensDeviceTHotPDF.CompileLoadedPageDisplayListTHPDFPageDisplayList.GetTokenTHPDFPageDisplayList.GetObjectTHPDFPageDisplayList.QueryObjectIndexesTHPDFPageDisplayList.PageObjectTHPDFPageDisplayList.ResourcesTHPDFPageDisplayList.MediaBoxTHotPDF.RenderLoadedPageTilesyRenderLoadedPageBandsTHotPDF.RenderLoadedPageTilesParallelyRenderLoadedPageBandsParallelTHPDFParallelTileRenderInfoTHotPDF.SaveLoadedPageToPngTHotPDF.SaveLoadedPageToPngStreamTHotPDF.SaveLoadedPagesToTiffBandedTHotPDF.SaveLoadedPagesToTiffStreamBandedTHPDFBandImageExportInfoTHotPDF.RendererSharedCacheMaxBytesTHotPDF.RenderLoadedPagesParallelTHotPDF.RenderLoadedPagesParallelOrderedTHPDFParallelRenderPipelineInfoTHotPDF.PrefetchLoadedPagesTHotPDF.GetLoadedPagePrefetchInfoTHPDFLoadedPagePrefetchInfoTHotPDF.FlattenLoadedPageTransparencyTHotPDF.FlattenLoadedPageComplexGraphicsTHotPDF.RenderLoadedPageSeparationPlateTHotPDF.GetLoadedPageSpotColorantsTHotPDF.RewriteLoadedPageColorsTHotPDF.AnalyzeLoadedPageInkCoverageTHotPDF.InspectLoadedPageTrappingTHotPDF.ConfigureRenderICCWorkflow