Подключаемые render backend'ы страниц

HotPDF может направлять растровый рендеринг загруженных страниц через заданный приложением backend, сохраняя существующий рендерер как вариант по умолчанию без всякой настройки и как опциональный fallback

Встроенный нативный backend

PDF.UseNativeGDIRenderBackend;
Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);

THPDFNativeGDIRenderBackend открывает привычный нативный GDI-рендерер Windows через тот же публичный backend-контракт, которым пользуются внешние реализации

Его capabilities объявляют prbcNative, prbcDeterministic, prbcTransparency, prbcColourManagement и prbcThreadSafe, не заявляя prbcDeviceAcceleration

SIMD scanline backend

var
  Backend: IHPDFPageRenderBackend;
begin
  Backend := THPDFSIMDScanlineRenderBackend.Create;
  PDF.PageRenderBackend := Backend;
  Bitmap := PDF.RenderLoadedPageToBitmap(0, 144);
end;

THPDFSIMDScanlineRenderBackend предварительно прогоняет всю скомпилированную display list, а затем пишет поддерживаемые прямоугольные заливки DeviceRGB или DeviceGray прямо в финальную 32-битную bitmap-поверхность — блоками по 64 байта и 16-байтовыми векторными хвостами

Составные прямоугольные пути заливаются по правилу nonzero или even-odd одной операцией рисования с сохранением дырок, направления трансформированных подпутей и уже нарисованного содержимого; растеризация проверяет отмену ограниченными пачками и отбрасывает частичные поверхности

Backend принимает сохранение и восстановление graphics state, ортогональное масштабирование, матрицы переноса и поворота на прямой угол, смену цвета заливки, прямоугольники, операторы заливки и сброс path; текст, произвольные path, strokes, изображения, transparency, clipping, patterns, shadings, неподдерживаемые цветовые пространства и неортогональные трансформации отклоняются до выделения bitmap

Его capabilities объявляют prbcSIMD, prbcThreadSafe и prbcDeterministic, не заявляя device acceleration, transparency или colour management

THPDFSIMDRenderBackendStatistics сообщает прямые поверхности, отрисованные прямоугольники, векторные блоки, скалярные хвостовые пиксели и точный отклонённый оператор, если понадобился fallback

Контракт пользовательского backend

Реализуйте IHPDFPageRenderBackend и назначьте его в THotPDF.PageRenderBackend

THPDFPageRenderBackendRequest передаёт запрошенные индекс страницы и DPI, скомпилированную THPDFPageDisplayList и резолвер THPDFRenderDocAccess для stream'ов, изображений, шрифтов, optional content, colour management и отмены

Backend может рассматривать каждый скомпилированный оператор через THPDFPageDisplayList.GetToken, не перепарсируя содержимое страницы

Верните True с только что созданным TBitmap, чтобы передать владение bitmap в HotPDF; верните False без bitmap, чтобы отклонить запрос

Конкурентность и fallback

Backend'ы с prbcThreadSafe могут работать конкурентно в обоих параллельных конвейерах рендеринга страниц

Backend'ы без этой возможности сериализуются отдельным call lock, тогда как компиляция display list остаётся конкурентной

rbfpSoftwareFallback повторяет недоступный, отклонённый или неудачный backend-запрос существующим рендерером, а rbfpFail возбуждает EHPDFRenderBackend

Backend может опционально реализовать IHPDFPageRenderBackendFailureInfo или возвращать диагностическую причину по каждому запросу, чтобы при конкурентных отклонениях сохранялась причина именно той попытки рендеринга

Смена backend инвалидирует записи кеша отрисованных страниц — и в памяти, и на диске, — чтобы изображения от разных рендереров никогда не смешивались

Диагностика и визуальная проверка

THPDFRenderBackendStatistics сообщает попытки, успехи, сбои, software fallback, сериализованные вызовы, затраченное время, имя backend и последнюю причину отказа

Встроенная parity-фикстура использует перекрывающийся transparency и фиксирует максимальный Delta E 0, ошибку RGB альфа-композитинга 0 и число различающихся пикселей 0 относительно рендерера по умолчанию на Win32 и Win64

Связанные API