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

Máscaras suaves

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;

APIs relacionadas