Semântica avançada de renderização
A renderização de páginas carregadas preserva o estado aninhado de Form XObjects enquanto aplica grupos de transparência, soft masks, procedimentos de glifos Type 3 e descodificação consciente da resolução de regiões de imagem visíveis
Traços de paths tracejados
A renderização nativa de paths preserva arrays de tracejado completos e a respetiva fase, incluindo arrays de comprimento ímpar, comprimentos fracionários e traços pintados de comprimento zero com terminações round ou square; o padrão de tracejado reinicia em cada subpath
Os traços de cor sólida e os clipes de traço de padrões em gradiente partilham um único caminho limitado de geometria de tracejado, retêm junções dentro de secções pintadas contínuas e juntam secções pintadas através do ponto inicial de um contorno fechado
Os comprimentos de tracejado retêm a escala média de transformação corrente do renderer, enquanto a divisão de curvas usa achatamento adaptativo no espaço de dispositivo; a pintura de fills e o recorte pendente continuam a usar o path original sem divisão
Grupos de transparência
- Os valores
/Matrixdo Form XObject são compostos com a matriz de transformação corrente antes de o conteúdo do grupo correr - Os grupos isolados usam um plano alfa separado, para que o conteúdo preto continue distinguível dos píxeis transparentes
- Os grupos knockout substituem a contribuição anterior do grupo nas áreas pintadas sobrepostas
- O conteúdo do grupo começa no blend mode Normal: o blend mode, o alfa constante e a soft mask em vigor em
Doaplicam-se ao grupo como um todo - Um grupo pintado com outro blend mode mistura a sua própria cor e o seu próprio alfa com o backdrop; um grupo não isolado cujos próprios estados gráficos misturam de forma normal é desenhado sobre preto e sobre branco para recuperar o alfa
- Os grupos são divididos em tiles delimitados de 768 píxeis, enquanto a pintura GDI, a fase de halftone, os grupos aninhados, as soft masks e a composição mantêm coordenadas de dispositivo absolutas
- Os bytes do Form são descodificados e tokenizados uma única vez antes da execução dos tiles, e as máscaras temporárias locais ao tile são libertadas antes do tile seguinte
- Os grupos aninhados são suportados com recursão delimitada e restauro completo do estado gráfico após cada invocação de Form
Máscaras suaves
- As máscaras
/S /Alphae/S /Luminositysão avaliadas a partir do grupo da máscara - O grupo da máscara é desenhado com mistura Normal, seja qual for o blend mode que o estado gráfico que define a máscara transporta
- As máscaras Luminosity resolvem o
/CSdo grupo de transparência e ponderam a cor resolvida com a aproximação DeviceGray do PDF, como fazem os visualizadores comuns; definaRenderColorimetricLuminosityMaskspara usar o CIE Y colorimétrico nos espaços baseados em CIE /BCé validado face ao número exato de componentes do espaço de mistura e fornece a luminosidade convertida fora do conteúdo pintado da máscara- A tinta Separation e DeviceN é convertida através do respetivo espaço alternativo Lab ou ICCBased, de modo que os componentes spot nunca vazem para uma soft mask
- As funções de transferência
/TRsuportam funções sampled, exponential, stitching e PostScript calculator através do avaliador de funções partilhado /SMask /Nonelimpa a máscara ativa, eqouQpreservam o estado da máscara normalmente- As máscaras compiladas só são reutilizadas quando o dicionário de origem, a matriz de transformação corrente e o rendering intent coincidem
Funções de transferência e amostradas
/TR2 tem precedência sobre /TR, uma única função aplica-se a todos os canais de saída RGB e um array de quatro funções aplica as três primeiras entradas de forma independente, preservando as entradas /Identity e /Default
Aplicar um novo estado de transferência substitui todos os canais de forma atómica, pelo que as entradas identity não conseguem herdar valores de lookup de um estado gráfico anterior
As funções sampled Type 0 suportam de uma a quatro dimensões de entrada e de saída, valores /BitsPerSample 1, 2, 4, 8, 12, 16, 24 e 32, mapeamentos /Encode invertidos ou diretos, intervalos /Decode independentes, interpolação multilinear, interpolação cúbica multidimensional e splines cúbicas naturais para dados /Order 3 unidimensionais
Os bytes de amostra descodificados, as dimensões validadas, os mapeamentos e as derivadas cúbicas partilham uma LRU de oito entradas, limitada a 64 MiB por thread de rendering, e as funções sobredimensionadas ou malformadas falham sem substituir parcialmente a lookup table de transferência ativa
Ecrãs de meio-tom
Os arrays de threshold Type 6, Type 10 e Type 16 são executados diretamente, com comprimentos descodificados exatos, thresholds de 16 bits em big-endian, comparação por componente aditivo e strips periódicas compactas que evitam expandir screens inclinados ou de dois retângulos
Type 5 dictionaries select independent /Red, /Green, and /Blue screens with /Gray and required /Default fallbacks, while each selected screen can override the global transfer function
Os bytes de threshold validados e a respetiva geometria normalizada partilham uma LRU de 64 entradas, limitada a 64 MiB por renderer; dimensões malformadas, alocações sobredimensionadas, dicionários Type 5 aninhados ou incoerências no comprimento do payload deixam todo o estado de screen ativo em modo continuous-tone
Type 3 glyphs
Os CharProcs Type 3 correm através do motor completo de operadores de conteúdo, com o âmbito de recursos corrente do font dictionary, suporte de Form, clipping, imagens, patterns e recursão delimitada
d0 e d1 fornecem as métricas do glifo, enquanto um procedimento d1 mantém a cor escolhida por quem chama, como exige o modelo de imagem do PDF
Os CharProcs repetidos reutilizam display lists descodificadas e tokenizadas quando o tipo de letra, o glifo, a matriz linear de dispositivo e o estado de cor coincidem; a translação continua dinâmica, pelo que caracteres repetidos em posições diferentes partilham uma só entrada
A LRU de cada renderer retém no máximo 256 entradas e 131.072 tokens, ignora qualquer CharProc com mais de 16.384 tokens e reporta o seu comportamento através de GetLastType3GlyphCacheStats
Regiões de imagem recortadas e reduzidas
Os image XObjects alinhados aos eixos pedem apenas os limites de origem visíveis e passam o tamanho visível em píxeis de dispositivo para o caminho de descodificação
Uma imagem com uma soft mask é descodificada por inteiro no tamanho a que é desenhada, e a sua máscara no mesmo tamanho, de modo que a máscara se mantenha alinhada com a imagem enquanto o recorte limita o que é pintado; as máscaras JPEG usam o descodificador DCT de tamanho reduzido
Ao renderizar, uma região descodificada com pelo menos o dobro do tamanho desenhado em ambas as direções é reduzida exatamente ao tamanho desenhado por média de área antes de ser desenhada ou colocada em cache; uma imagem grande desenhada pequena cabe então na cache de descodificação, pelo que um grupo desenhado duas vezes ou uma página repetida a reutiliza, e a sua soft mask é aplicada pixel a pixel nesse tamanho. As stencil image masks mantêm a resolução total, e os métodos públicos de descodificação de região devolvem os seus tamanhos documentados
O JPEG 2000 combina a API de região nativa do decoder com um nível de resolução em potência de dois, escolhido para satisfazer ambas as dimensões de destino antes da reconstrução wavelet e da expansão do raster
Os codestreams JPEG 2000 endereçáveis por tile também podem descodificar diretamente um tile validado através de THPDFJpeg2000Decoder.LoadTileFromByteArray, com os metadados da grelha de tiles e os limites de bytes de saída expostos pelo decoder
Quando uma região nativa interseta vários tiles independentes, LoadRegionFromByteArrayParallel atribui um estado OpenJPEG privado a cada worker e compõe os rasters concluídos em ordem row-major determinística; o cancelamento, os limites de saída e o orçamento efetivo de memória de pico podem interromper o agendamento ou selecionar o fallback sequencial
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;