Semántica de renderizado avanzada
El renderizado de páginas cargadas preserva el estado anidado de Form XObject mientras aplica grupos de transparencia, máscaras suaves, procedimientos de glifo Type 3 y decodificación de regiones de imagen visibles sensible a la resolución
Trazos discontinuos en trazados
El renderizado nativo de trazados conserva los arrays de dash completos y su fase, incluidos los arrays de longitud impar, las longitudes fraccionarias y los dashes pintados de longitud cero con caps redondos o cuadrados; el patrón de dash se reinicia en cada subtrazado
Los trazos de color sólido y los recortes de trazo con patrón de gradiente comparten una única ruta de geometría de dash acotada, conservan las uniones dentro de las secciones pintadas continuas y unen las secciones pintadas a través del punto de inicio de un contorno cerrado
Las longitudes de dash conservan la escala media de la transformación actual del renderizador, mientras que la división de curvas usa aplanado adaptativo en espacio de dispositivo; el pintado de rellenos y el recorte pendiente siguen usando el trazado original sin dividir
Grupos de transparencia
- Los valores
/Matrixde Form XObject se componen con la matriz de transformación actual antes de que se ejecute el contenido del grupo - Los grupos aislados usan un plano alfa separado para que el contenido negro siga siendo distinguible de los píxeles transparentes
- Los grupos knockout reemplazan la contribución del grupo anterior en las áreas pintadas superpuestas
- El contenido de un grupo arranca en el modo de fusión Normal: el modo de fusión, el alfa constante y la máscara suave vigentes en el momento de
Dose aplican al grupo en su conjunto - Un grupo pintado con otro modo de fusión mezcla su propio color y su propio alfa con el fondo; un grupo no aislado cuyos estados de gráficos internos se mezclan con normalidad se dibuja sobre negro y sobre blanco para recuperar su alfa
- Los grupos se dividen en teselas acotadas de 768 píxeles mientras el pintado GDI, la fase de semitono, los grupos anidados, las máscaras suaves y la composición conservan coordenadas de dispositivo absolutas
- Los bytes de Form se decodifican y tokenizan una vez antes de la ejecución de la tesela, y las máscaras temporales locales de tesela se liberan antes de la siguiente tesela
- Los grupos anidados se admiten con recursión acotada y restauración completa del estado de gráficos después de cada invocación de Form
Máscaras suaves
- Las máscaras
/S /Alphay/S /Luminosityse evalúan a partir del grupo de la máscara - El grupo de la máscara se dibuja con fusión Normal, sea cual sea el modo de fusión que lleve el estado de gráficos que define la máscara
- Las máscaras de luminosidad resuelven el
/CSdel grupo de transparencia y ponderan el color resuelto con la aproximación DeviceGray de PDF, como hacen los viewers habituales; establezcaRenderColorimetricLuminosityMaskspara usar el Y CIE colorimétrico en los espacios basados en CIE en su lugar /BCse valida contra el recuento exacto de componentes del espacio de fusión y suministra la luminosidad convertida fuera del contenido de máscara pintado- La pintura Separation y DeviceN se convierte mediante su espacio Lab o ICCBased alternativo para que los componentes de tinta plana nunca se filtren a una máscara suave
- Las funciones de transferencia
/TRadmiten funciones muestreadas, exponenciales, de costura y de calculadora PostScript mediante el evaluador de funciones compartido /SMask /Noneborra la máscara activa, yqoQconservan el estado de la máscara con normalidad- Las máscaras compiladas se reutilizan solo cuando el diccionario de origen, la matriz de transformación actual y la intención de renderizado coinciden
Funciones de transferencia y muestreadas
/TR2 tiene prioridad sobre /TR, una sola función se aplica a todos los canales de salida RGB, y un array de cuatro funciones aplica sus tres primeras entradas de forma independiente y conserva las entradas /Identity y /Default
Aplicar un nuevo estado de transferencia reemplaza cada canal de forma atómica, por lo que las entradas de identidad no pueden heredar valores de búsqueda de un estado de gráficos anterior
Las funciones muestreadas Type 0 admiten de una a cuatro dimensiones de entrada y salida, valores /BitsPerSample 1, 2, 4, 8, 12, 16, 24 y 32, asignaciones /Encode invertidas o directas, rangos /Decode independientes, interpolación multilineal, interpolación cúbica multidimensional y splines cúbicos naturales para datos unidimensionales /Order 3
Los bytes de muestra decodificados, las dimensiones validadas, las asignaciones y las derivadas cúbicas comparten una LRU de ocho entradas limitada a 64 MiB por hilo de renderizado, mientras que las funciones sobredimensionadas o malformadas fallan sin reemplazar parcialmente la tabla de búsqueda de transferencia activa
Pantallas de semitono
Las matrices de umbral Type 6, Type 10 y Type 16 se ejecutan directamente con longitudes decodificadas exactas, umbrales de 16 bits big-endian, comparación de componentes aditivos y tiras periódicas compactas que evitan expandir pantallas anguladas o de dos rectángulos
Los diccionarios Type 5 seleccionan pantallas /Red, /Green y /Blue independientes con reservas /Gray y /Default obligatorias, mientras que cada pantalla seleccionada puede anular la función de transferencia global
Los bytes de umbral validados y su geometría normalizada comparten una LRU de 64 entradas limitada a 64 MiB por renderizador, y las dimensiones malformadas, las asignaciones sobredimensionadas, los diccionarios Type 5 anidados o los desajustes de longitud de carga útil dejan el estado completo de pantalla activa en modo de tono continuo
Glifos Type 3
Los CharProcs Type 3 se ejecutan mediante el motor completo de operadores de contenido con el ámbito de recursos actual del diccionario de fuente, soporte de Form, recorte, imágenes, patrones y recursión acotada
d0 y d1 proporcionan métricas de glifo mientras que un procedimiento d1 mantiene el color seleccionado por el llamador según exige el modelo de imagen PDF
Los CharProcs repetidos reutilizan las listas de visualización decodificadas y tokenizadas cuando la fuente, el glifo, la matriz de dispositivo lineal y el estado de color coinciden; la traducción permanece dinámica para que los caracteres repetidos en diferentes posiciones compartan una entrada
La LRU por renderizador conserva como máximo 256 entradas y 131 072 tokens, omite cualquier CharProc por encima de 16 384 tokens e informa de su comportamiento mediante GetLastType3GlyphCacheStats
Regiones de imagen recortadas y reducidas
Los XObjects de imagen alineados con los ejes solicitan solo los límites de origen visibles y pasan el tamaño de píxel de dispositivo visible a la ruta de decodificación
Una imagen con una máscara suave se decodifica completa al tamaño con el que se dibuja, y su máscara al mismo tamaño, de modo que la máscara permanece alineada con la imagen mientras el recorte limita lo que se pinta; las máscaras JPEG usan el decodificador DCT de tamaño reducido
Al renderizar, una región decodificada que mida al menos el doble del tamaño dibujado en ambas direcciones se reduce exactamente al tamaño dibujado mediante promediado de área antes de dibujarse o guardarse en caché; así, una imagen grande dibujada pequeña cabe en la caché de decodificación, de forma que un grupo dibujado dos veces o una página repetida la reutiliza, y su máscara suave se aplica píxel a píxel a ese tamaño. Las máscaras de imagen stencil conservan su resolución completa, y los métodos públicos de decodificación de regiones devuelven sus tamaños documentados
JPEG 2000 combina la API de región nativa del decodificador con un nivel de resolución de potencia de dos seleccionado para cumplir ambas dimensiones de destino antes de la reconstrucción wavelet y la expansión de ráster
Los flujos de código JPEG 2000 direccionables por tesela también pueden decodificar una tesela validada directamente mediante THPDFJpeg2000Decoder.LoadTileFromByteArray, con metadatos de la cuadrícula de teselas y límites de bytes de salida expuestos por el decodificador
Cuando una región nativa intersecta varias teselas independientes, LoadRegionFromByteArrayParallel asigna estado OpenJPEG privado por trabajador y compone los rásteres completados en orden de fila principal determinista; la cancelación, los límites de salida y el presupuesto efectivo de memoria máxima pueden detener la programación o seleccionar la reserva secuencial
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;