В высокопроизводительных графических приложениях обновление экрана обычно синхронизируется с процессом вертикальной развертки. Другими словами, первичную поверхность желательно обновлять в тот момент, когда монитор закончил очередное обновление экрана. В противном случае в одной части экрана будут отображаться новые данные, а в другой — старые. Подобный эффект называется расхождением (tearing). По умолчанию DirectDraw автоматически синхронизирует обновление экрана с завершением вертикальной развертки. В нестандартных ситуациях можно добиться синхронизации с помощью функций GetVerticalBlankStatus()и WaitForVerticalBlank().
Функция GetFourCCCodes()
Наш обзор интерфейса DirectDrawзавершается функцией GetFourCCCodes(). Она возвращает коды FourCC, поддерживаемые видеокартой. Коды FourCC используются для описания YUV-поверхностей, не относящихся к стандарту RGB. Мы не будем рассматривать такие поверхности, так как они выходят за рамки этой книги.
Интерфейсы DirectDrawSurface
Множественные интерфейсы DirectDrawSurface, как и интерфейсы DirectDraw, возникли из-за особенностей спецификации COM. В исходном варианте работа с поверхностями осуществлялась через интерфейс DirectDrawSurface. В DirectX 2 появились новые функциональные возможности, представленные интерфейсом DirectDrawSurface2, а в DirectX 5 возник интерфейс DirectDrawSurface3.
Хотя в этой книге вместо DirectDrawповсюду используется интерфейс DirectDraw2, для работы с поверхностями мы будем придерживаться исходного интерфейса DirectDrawSurface, потому что нововведения интерфейсов DirectDrawSurface2и DirectDrawSurface3не слишком важны. В оставшейся части книги термин интерфейс DirectDrawSurface будет обозначать все три интерфейса, если при этом не возникает двусмысленности.
Самый большой из всех интерфейсов DirectDraw, DirectDrawSurface, позволяет копировать и стирать содержимое поверхности, а также напрямую работать с ним из программы. В общей сложности он поддерживает 36 функций, перечисленных ниже (в алфавитном порядке):
• AddAttachedSurface()
• AddOverlayDirtyRect()
• Blt()
• BltBatch()
• BltFast()
• DeleteAttachedSurface()
• EnumAttachedSurfaces()
• EnumOverlayZOrders
• Flip
• GetAttachedSurface()
• GetBltStatus()
• GetCaps()
• GetClipper()
• GetColorKey()
• GetDC()
• GetDDInterface()
• GetFlipStatus()
• GetOverlayPosition()
• GetPalette()
• GetPixelFormat()
• GetSurfaceDesc()
• IsLost()
• Lock()
• PageLock()
• PageUnlock()
• ReleaseDC()
• Restore()
• SetClipper()
• SetColorKey()
• SetOverlayPosition()
• SetPalette()
• SetSurfaceDesc()
• Unlock()
• UpdateOverlay()
• UpdateOverlayDisplay()
• UpdateOverlayZOrder()
Функции описания поверхностей
Мы начнем с четырех функций, с помощью которых можно получить информацию о самой поверхности:
• GetCaps()
• GetPixelFormat()
• GetSurfaceDesc()
• SetSurfaceDesc()
Функция GetCaps()по аналогии с одноименной функцией интерфейса DirectDrawзаполняет структуру информацией о том, какие возможности поддерживаются данной поверхностью. В частности, в нее заносятся сведения о том, является ли данная поверхность первичной или внеэкранной, и где она находится — в системной или видеопамяти.
Функция GetPixelFormat()особенно важна при работе с поверхностями форматов High и True Color, поскольку формат пикселей может зависеть от видеокарты. Функция возвращает маски, которые определяют способ хранения отдельных цветовых составляющих.
Функция GetSurfaceDesc()возвращает описание поверхности. Сведения включают ширину и высоту поверхности, а также глубину пикселей. В описание поверхности также входит формат ее пикселей (в том же виде, что и получаемый с помощью функции GetPixelFormat()).
Функция SetSurfaceDesc()(появилась только в DirectX 5 и поддерживается только интерфейсом DirectDrawSurface3) позволяет задать значения некоторых атрибутов поверхности. Например, с ее помощью можно выбрать тип памяти, в которой должна находиться поверхность. Данная функция помогает реализовать нестандартную схему управления поверхностями.
Функции блиттинга
Интерфейс DirectDrawSurfaceподдерживает три функции, предназначенные для выполнения блиттинга:
Читать дальше