Подключаемые 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