Инфраструктура предварительной анализии

Внимание

Современная платформа печати — это предпочтительный способ взаимодействия с принтерами Windows. Рекомендуется использовать драйвер класса "Входящие" Microsoft IPP вместе с приложениями поддержки печати (PSA), чтобы настроить возможности печати в Windows 10 и 11 для разработки устройств принтера.

Дополнительные сведения см. в статье "Современная платформа печати" и руководство по проектированию приложений поддержки печати.

Инфраструктура предварительной анализии — это механизм, с помощью которого Unidrv заставляет группироваться на задании печати, чтобы первый воспроизведение полосы каждой страницы было полосой, содержащей всю страницу. Преанализис не разрешает отрисовку и выполняется только для включения анализа объектов на странице перед отрисовкой объектов.

Чтобы разрешить преанализию полностраничной страницы, Unidrv сначала задает полную страницу поверхности устройства в функции DrvEnableSurface, а затем указывает, что первая группа — это размер всей страницы с помощью DrvQueryPerBandInfo. После завершения предварительной анализы Unidrv использует DrvQueryPerBandInfo для восстановления области вырезки обратно в его размер до включения преанализии; Unidrv впоследствии отрисовывается на этой поверхности. Из-за ограничений реализации GDI предварительная анализа может быть включена только в том случае, если режим N-up ONE_UP или если полоса отрисовки является всей страницей.

Следующий псевдокод иллюстрирует логику, используемую для преанализиса.

DrvEnableSurface
if( preanalysis enabled )
   Use dummy device surface
DrvStartDoc
For each physical page 
{
   DrvStartPage
   DrvStartBanding
   For each banding surface 
   {
      DrvQueryPerBandInfo
// Set sizlBand member of PERBANDINFO
      if( preanalysis_pass ) 
         pbi.sizlBand = {whole page}
      else 
         pbi.sizlBand = {normal band}
      Carry out rendering operations
      if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass ) {
         Call OEM hooks
         DrvNextBand
      }
      if ( ( preanalysis pass && OEM preanalysis enabled ) || !preanalysis_pass )
         Call OEMNextBand
      if( preanalysis pass ) {
         Disable preanalysis
         Switch from dummy device surface to real device surface
      }
      if( last band ) 
         Write end page character from GPD
   }  // for each banding surface

}  // for each physical page
DrvEndDoc

Так как функции предварительной анализии должны работать с текущими файлами описания универсального принтера (GPD) и подключаемыми модулями, текстовым z-порядком, обнаружением пустого диапазона и другими операциями реализуются невидимо с точки зрения мини-driver. Мини-driver может перехватывать DrvStartBanding и DrvNextBand, но он не получит первый вызов DrvNextBand, так как первый вызов DrvNextBand не включает никакой отрисовки. Подключаемый модуль получает первый вызов DrvNextBand, только если он задает флаг в GPD , который включает преанализис на уровне объекта OEM (*PreAnalysisOptions: 8). В этом случае подключаемый модуль должен подключить DrvStartBanding и DrvNextBand, а подключаемый модуль должен проверить параметр pptl функции DrvStartBanding. Если параметр pptl не имеет значения NULL, преанализис отключен. Если параметр pptl имеет значение NULL, указывающее начало передачи преанализиса. В этом случае подключаемый модуль должен предположить, что все вызовы DDIs для рисования DDIs, что подключаемый модуль подключился к результату передачи предварительной анализии. Преанализис завершается первым вызовом функции DrvNextBand, а отрисовка начинается после первого вызова функции DrvNextBand. Последующие вызовы этой функции будут содержать данные отрисовки.

*Режимы PreAnalysisOptions

Режим предварительной анализии управляется в файле GPD параметром *PreAnalysisOptions: n имя атрибута и параметр атрибута. В следующей таблице перечислены значения параметров, которые можно использовать с именем атрибута *PreAnalysisOptions . Для включения нескольких параметров можно объединить два или более этих значений.

Значение параметра 0

Отключите все режимы предварительной анализии.

1

Режим по умолчанию. Включите монохромный анализ текста z-порядка и оптимизацию пустого диапазона. Этот режим включен для устройств с скачиваемым шрифтом или поддержкой шрифта устройства и высоким разрешением (600 dpi или более поздней), 24 режимов отрисовки BPP.

2

Включите 1 оптимизацию BPP для обратных вызовов IPrintOemUni IPrintOemUni ImageProcessing 24.

4

Включите операции StretchBlt устройства.

8

Включите преданализу на уровне объектов OEM.

Анализ текста monochrome Z-Order с оптимизацией пустого диапазона

*PreAnalysisOptions: 1

Установка параметра *PreAnalysisOptions значение 1 позволяет Unidrv выполнять следующие операции:

  • Обнаружение проблем в z-порядке между текстовыми и графическими объектами в монохромных принтерах.

  • Выполните оптимизацию пустого диапазона.

Первая операция обрабатывает проблемы z-порядка, возникающие при загрузке текста на монохромный принтер позже перезаписывается или в противном случае взаимодействует с графическими объектами. Проблемы z-order часто вызваны графическими объектами, содержащими сложные клипы, так что Unidrv не может скачать белый прямоугольник, который очищает ранее скачанный текст.

Unidrv выполняет преанализис перед выполнением прохода отрисовки на каждой странице. Unidrv делает это, чтобы определить, будет ли любой текст наложен с помощью объекта передачи бит-блока (blt), использующего сложный клип, который не может быть имитирован. Таким образом, текст отображается на растровом рисунке поверхности, а не загружается напрямую, чтобы объекты, отрисованные позже, правильно взаимодействовали с текстом.

Кроме того, для устройств, которые не поддерживают белые прямоугольники, Unidrv проверяет наличие любого текста, наложенного blts, даже если они не содержат сложные клипы. Unidrv отрисовывает текст на поверхность, а не скачивает его непосредственно на принтер.

Следующие команды рисования проверяются на текст, который может быть наложен последующими blts:

Поэтому этот режим должен исправлять все проблемы z-порядка между текстовыми и заполненными объектами региона. Обратите внимание, что все еще могут возникнуть проблемы с текстом и наложенными строками. Эти ситуации не включаются, так как такое решение может привести к почти всем скачиванию текста, а не рисованию.

Эта функция не исправляет проблемы z-порядка, связанные с использованием шрифтов устройств. Если приложение или драйвер выбрали режим шрифта устройства, драйвер не может исправить эту проблему и не сможет отобразить шрифты устройств на поверхности.

Вторая операция позволяет Unidrv оптимизировать пустые регионы на странице. В этом режиме Unidrv пропускает пустые верхние и нижние поля, а также любые большие пустые области в середине страницы. Этот режим, предназначенный для использования в цветной печати, повышает производительность, минимизируя количество передач полос, необходимых для отрисовки страницы.

Во время прохождения предварительной анализии Unidrv определяет, где будет происходить рисование на странице. Оптимизация пустой полосы включена всякий раз, когда включена предварительная анализная обработка или если принтер использует 24 полосы отрисовки BPP при высоком разрешении (600 dpi или выше). Это должно привести к заметному повышению производительности на 24 BPP отрисовки для черниловых принтеров и не требует изменений существующих подключаемых модулей OEM.

Оптимизация черной полосы

*PreAnalysisOptions: 2  *% 1 bpp ImageProcessing bitmaps

Если для параметра *PreAnalysisOptions задано значение 2, Unidrv может использовать большую область с полосами BPP для отрисовки областей, содержащих только твердые черные объекты, а не отрисовку всей страницы на 24 BPP. Этот режим аналогичен оптимизации пустой полосы, за исключением того, что он также определяет твердые черные области (в отличие от цветовых областей) на странице. Только объекты, которые являются твердыми черными (без серых оттенков), можно отрисовывать в поверхности полосы BPP 1 BPP, так как полутон, настроенный для 24 цвета BPP, не отображается правильно в 1 BPP monochrome.

Unidrv создает две поверхности в функции DrvEnableSurface : одну для цвета и другую для 1 BPP monochrome. Unidrv использует одну и ту же память для каждой, поэтому дополнительная память не требуется. Предварительная проверка страницы определяет, содержит ли страница твердые черные или пустые области, для которых можно использовать большие полосы, чем для регионов, содержащих цвета. Только области цвета требуют использования меньшей области цветовой полосы.

Используя тот же объем памяти, поверхность монохромного BPP может быть 24 раза больше, чем 24 области цвета BPP. Таким образом, изображение, содержащее цвет только в середине страницы, можно разделить на три региона: верхний регион, регион, содержащий цвет, и нижний регион. Эти три области можно разделить следующим образом: верхний регион можно поместить в одну монохромную полосу, область, содержащая цвет, можно разделить на столько цветов, сколько необходимо для покрытия, и нижний регион можно поместить в одну монохромную полосу.

Для этой функции требуется OEM для поддержки обратного вызова IPrintOemUni ImageProcessing и обработки дампа растровых данных. Текущая поддержка подключаемого модуля OEM для обратного вызова IPrintOemUni ImageProcessing должна быть улучшена, чтобы принять либо 24 полосы BPP, либо 1 BPP твердые черные полосы.

Поддержка операций StretchBlt устройства

*PreAnalysisOptions: 4

Установка параметра *PreAnalysisOptions значение 4 позволяет Unidrv скачать вызовы DrvStretchBlt непосредственно на устройства, поддерживающие операции stretchblt.

Когда Unidrv создает 24 данные цвета BPP, все изображения stretchblt растянуты до разрешения устройства, что приводит к большому количеству растровых данных, которые необходимо скачать. Это может привести к замедлению производительности в дополнение к нехватке памяти на многих восточноазиатских принтерах.

Подключаемый модуль отрисовки мини-driver необходим для использования режима stretchblt, так как он должен подключить OEMStretchBlt и предоставить собственные команды загрузки изображений. Unidrv позволяет перехватчику OEMStretchBlt только при вызовах, которые можно скачать напрямую. Поэтому подключаемый модуль не отвечает за обработку проблем z-order. Подключаемый модуль должен напрямую скачать данные исходного образа, содержащиеся в вызовах OEMStretchBlt, которые он получает. Подключаемый модуль также имеет возможность переключения изображения обратно в Unidrv, если образ находится в формате, который подключаемый модуль не поддерживает или не может скачать.

Всякий раз, когда объекты загружаются непосредственно на устройство, а другие данные отображаются в системе, могут возникать проблемы z-порядка или несоответствия половины. В этом режиме используется преанализ, чтобы определить, какие растяжения можно скачать напрямую. Только растяжения, содержащие маску или сложное вырезка, будут рассматриваться для прямого скачивания. Если более поздний объект накладывает любой из растянутых объектов, которые рассматриваются для прямого скачивания, то никакие объекты не будут загружены напрямую. Этот принцип должен повысить производительность и убедиться, что изображение не включает полутон из системы и устройства, что приводит к низкому качеству выходных данных печати.

Преданализис на уровне объектов OEM

*PreAnalysisOptions: 8

Установка параметра *PreAnalysisOptions равным 8 позволяет изготовителю оборудования инициировать передачу предварительной проверки, чтобы все объекты на всей странице воспроизводились после вызова DrvStartBanding без учета размера полосы. Во время прохождения предварительной анализии не допускается рисование, но изготовители оборудования могут перехватывать все вызовы рисования DrvXxxx для анализа объектов на странице.

Функциональные возможности в этом режиме ориентированы на цветные черниловые принтеры, чтобы изготовители оборудования могли использовать объектную коррекцию цвета или отрисовку. Например, некоторые принтеры должны обрабатывать черные объекты по-разному, если они пересекаются с цветными объектами, а не черными объектами, которые появляются сами по себе. Другие изготовители оборудования могут потребовать половины для объектов stretchblt, отличных от объектов bitblt. Объекты Stretchblt могут находиться в любом формате графического файла, который поддерживает Windows, например .png или .jpg. Объекты Bitblt являются исключительно растровыми изображениями.

Если этот режим включен в GPD, Unidrv определяет поверхность как область с полосами, но вызывает первое воспроизведение всей страницы. Для этого Unidrv устанавливает окно клипа GDI на всю страницу. Unidrv позволяет подключать все команды рисования, но возвращаются перед выполнением любого рисунка. На следующих проходах Unidrv сбрасывает окно клипа обратно в обычный размер и полосы, как обычно.

Для перехвата drvStartBanding и DrvNextBanding требуются изготовители оборудования, если они включили этот режим в GPD. Они должны проверить параметр pptl функции DrvStartBanding, чтобы определить, может ли Unidrv включить преанализ в этом режиме на указанной странице. Если параметр pptl имеет значение NULL, то Unidrv включил преанализис. Unidrv использует параметр pptl , так как он не имеет значения на данный момент (он не был обновлен с позицией полосы. Для предварительной анализии позиция полосы всегда имеет значение (0, 0)). Если параметр pptl имеет значение NULL, изготовитель оборудования должен рассмотреть все вызовы рисования до первого drvNextBand, чтобы быть частью преанализиса и не должен разрешать рисование на поверхности.

Конец преанализии сигнализируется вызовом функции OEMNextBand . Параметр pptl , передаваемый OEMNextBand , не имеет значения NULL. Этот вызов используется только для возврата соответствующего значения pptl в Unidrv. Подключаемые модули могут самостоятельно задать значение pptl или вернуться в Unidrv (например, предыдущий пример псевдокода в начале этой статьи). Так как область перевязки, которую параметр pso OEMNextBand, указанный в первом вызове OEMNextBand, еще не отображался, подключаемый модуль не должен отправлять его содержимое на устройство.