Расширенная семантика рендеринга

Рендеринг загруженных страниц сохраняет состояние вложенных Form XObject, применяя группы прозрачности, soft mask, процедуры глифов Type 3 и декодирование видимых областей изображений с учётом разрешения

Штриховые обводки путей

Нативный рендеринг путей сохраняет полные dash-массивы и их фазу, включая массивы нечётной длины, дробные длины и штрихи нулевой длины с round или square caps; шаблон штриха перезапускается на каждом подпути

Сплошные обводки и отсечения в stroke-клипах градиентных паттернов проходят один общий путь ограниченной dash-геометрии, сохраняют соединения внутри непрерывных закрашенных участков и стыкуют участки через стартовую точку замкнутого контура

Длины штрихов учитывают средний масштаб текущей матрицы трансформации рендерера, а кривые разбиваются адаптивным упрощением в device-пространстве; закраска и отложенное отсечение по-прежнему работают с исходным неразбитым путём

Группы прозрачности

Soft mask

Передаточные и sampled функции

/TR2 имеет приоритет над /TR, одна функция применяется ко всем выходным каналам RGB, а массив из четырёх функций применяет первые три элемента независимо и сохраняет элементы /Identity и /Default

Применение нового transfer-состояния атомарно заменяет каждый канал, поэтому записи identity не могут унаследовать lookup-значения от предыдущего graphics state

Sampled функции Type 0 поддерживают от одного до четырёх входных и выходных измерений, значения /BitsPerSample 1, 2, 4, 8, 12, 16, 24 и 32, прямые и обратные отображения /Encode, независимые диапазоны /Decode, мультилинейную интерполяцию, многомерную кубическую интерполяцию и естественные кубические сплайны для одномерных данных /Order 3

Декодированные байты сэмплов, валидированные измерения, отображения и кубические производные делят LRU на восемь записей с потолком 64 MiB на поток рендеринга, а чрезмерно большие или битые функции завершаются отказом без частичной замены активной transfer lookup-таблицы

Растры halftone

Пороговые массивы Type 6, Type 10 и Type 16 выполняются напрямую с точной декодированной длиной, 16-битными порогами в порядке big-endian, сравнением аддитивных компонент и компактными периодическими полосами, которые не разворачивают наклонные или двухпрямоугольные растры

Словари Type 5 выбирают независимые растры /Red, /Green и /Blue с fallback через /Gray и обязательный /Default, при этом каждый выбранный растр может переопределить глобальную передаточную функцию

Валидированные пороговые байты и их нормализованная геометрия делят LRU на 64 записи с потолком 64 MiB на рендерер, а битые измерения, чрезмерные аллокации, вложенные словари Type 5 или несовпадение длины payload оставляют полное активное состояние растра в режиме continuous tone

Глифы Type 3

CharProcs Type 3 выполняются полным движком content-операторов с текущей областью ресурсов словаря шрифта, поддержкой Form, отсечением, изображениями, pattern и ограниченной рекурсией

d0 и d1 задают метрики глифа, при этом процедура d1 сохраняет выбранный вызывающим кодом цвет, как требует PDF imaging model

Повторные CharProcs переиспользуют декодированные и токенизированные display-списки при совпадении шрифта, глифа, линейной device-матрицы и состояния цвета; перенос остаётся динамическим, поэтому повторяющиеся символы на разных позициях делят одну запись

LRU на рендерер хранит максимум 256 записей и 131,072 токена, обходит стороной любой CharProc выше 16,384 токенов и отчитывается о своём поведении через GetLastType3GlyphCacheStats

Отсечённые и уменьшенные области изображений

Выровненные по осям image XObject запрашивают только видимые границы источника и передают видимый размер в пикселях устройства в путь декодирования

Изображение с soft mask декодируется целиком в размере, в каком рисуется, а его маска — в том же размере, поэтому маска остаётся выровненной с изображением, пока отсечение ограничивает закрашиваемое; маски JPEG используют DCT-декодер уменьшенного размера

При рендеринге декодированная область, вдвое превосходящая рисуемый размер в обоих направлениях и больше, сжимается усреднением по площади точно до рисуемого размера до отрисовки или кэширования; крупное изображение, нарисованное мелко, тогда помещается в кэш декодирования, поэтому группа, нарисованная дважды, или повторная страница переиспользует его, а его soft mask применяется попиксельно в этом размере. Маски stencil-изображений сохраняют полное разрешение, а публичные методы декодирования областей возвращают задокументированные размеры

JPEG 2000 совмещает нативный region API декодера с уровнем разрешения степени двойки, подобранным так, чтобы покрыть обе целевые размерности до вейвлет-реконструкции и растрового расширения

Для tile-адресуемых codestream JPEG 2000 можно также декодировать один валидированный tile напрямую через THPDFJpeg2000Decoder.LoadTileFromByteArray; метаданные tile-grid и лимиты выходных байтов декодер отдаёт наружу

Когда нативная область пересекает несколько независимых tile, LoadRegionFromByteArrayParallel выдаёт каждому worker'у приватное состояние OpenJPEG и собирает готовые растры в детерминированном порядке row-major; отмена, лимиты вывода и эффективный бюджет пиковой памяти могут остановить планирование или выбрать последовательный fallback

Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
  Canvas.Draw(0, 0, Region);
finally
  Region.Free;
end;

Связанные API