Расширенная семантика рендеринга
Рендеринг загруженных страниц сохраняет состояние вложенных Form XObject, применяя группы прозрачности, soft mask, процедуры глифов Type 3 и декодирование видимых областей изображений с учётом разрешения
Штриховые обводки путей
Нативный рендеринг путей сохраняет полные dash-массивы и их фазу, включая массивы нечётной длины, дробные длины и штрихи нулевой длины с round или square caps; шаблон штриха перезапускается на каждом подпути
Сплошные обводки и отсечения в stroke-клипах градиентных паттернов проходят один общий путь ограниченной dash-геометрии, сохраняют соединения внутри непрерывных закрашенных участков и стыкуют участки через стартовую точку замкнутого контура
Длины штрихов учитывают средний масштаб текущей матрицы трансформации рендерера, а кривые разбиваются адаптивным упрощением в device-пространстве; закраска и отложенное отсечение по-прежнему работают с исходным неразбитым путём
Группы прозрачности
- Значения
/MatrixForm XObject компонуются с текущей матрицей трансформации до выполнения содержимого группы - Изолированные группы используют отдельную alpha-плоскость, чтобы чёрный контент оставался отличим от прозрачных пикселей
- Группы knockout заменяют вклад предыдущей группы в перекрывающихся закрашенных областях
- Содержимое группы стартует из blend mode Normal: blend mode, постоянная alpha и активная в момент
Dosoft mask применяются к группе как целому - Группа, нарисованная с другим blend mode, смешивает собственный цвет и alpha с фоном; неизолированная группа, чьи собственные graphics state смешиваются в обычном режиме, рисуется на чёрном и на белом, чтобы восстановить её alpha
- Группы нарезаются на tile размером до 768 пикселей, при этом отрисовка GDI, фаза halftone, вложенные группы, soft mask и композитинг работают в абсолютных координатах устройства
- Байты Form декодируются и токенизируются один раз до выполнения tile, а временные маски в пределах tile освобождаются перед следующим tile
- Вложенные группы поддерживаются с ограниченной рекурсией и полным восстановлением graphics state после каждого вызова Form
Soft mask
- Маски
/S /Alphaи/S /Luminosityвычисляются из группы маски - Группа маски рисуется с нормальным смешиванием (Normal), каким бы ни был blend mode у graphics state, который задаёт маску
- Маски luminosity разрешают
/CSгруппы прозрачности и взвешивают разрешённый цвет PDF-аппроксимацией DeviceGray, как делают распространённые просмотрщики; установитеRenderColorimetricLuminosityMasks, чтобы вместо этого брать колориметрический CIE Y для пространств на базе CIE /BCвалидируется по точному числу компонент пространства смешивания и поставляет сконвертированную luminosity вне закрашенного содержимого маски- Закраска Separation и DeviceN конвертируется через альтернативное пространство Lab или ICCBased, чтобы spot-компоненты не просачивались в soft mask
- Передаточные функции
/TRподдерживают sampled, exponential, stitching и PostScript calculator функции через общий вычислитель функций /SMask /Noneсбрасывает активную маску, аqиQсохраняют состояние маски как обычно- Скомпилированные маски переиспользуются, только когда совпадают исходный словарь, текущая матрица трансформации и rendering intent
Передаточные и 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;