Графика для Windows средствами DirectDraw
Шрифт:
• 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 поддерживает три функции, предназначенные для выполнения блиттинга:
• Blt
• BltBatch
• BltFast
Функция Blt выполняет всю основную работу. Она осуществляет классический блиттинг (простое копирование данных между поверхностями без применения специальных эффектов), а также поддерживает растяжение, повороты, зеркальные отображения и цветовые заливки. В случае применения Blt для поверхностей, связанных с объектом отсечения, выполняется блиттинг с отсечением.
Функция BltBatch не реализована в DirectX 5 (ее можно вызвать, но при этом ничего не произойдет). После реализации эта функция будет выполнять сразу несколько операций блиттинга, по возможности одновременно.
Функция BltFast является оптимизированным вариантом функции Blt. Повышение эффективности достигается за счет сокращения возможностей, поэтому BltFast не умеет выполнять специальные операции блиттинга, поддерживаемые функцией Blt. Кроме того, BltFast не выполняет отсечения. Тем не менее функция BltFast поддерживает блиттинг с использованием цветовых ключей источника и приемника. В сочетании с нестандартными алгоритмами отсечения функция BltFast обеспечивает выполнение самого быстрого и универсального блиттинга, которого можно добиться от DirectDraw. Нестандартный алгоритм отсечения будет реализован в главе 3.
Все три блит-функции в качестве аргументов получают две поверхности — источник и приемник. Также передаются дополнительные данные, более детально описывающие операцию блиттинга (например, положение копируемого участка на поверхности-приемнике). Там, где это возможно, функция выполняет блиттинг с аппаратным ускорением.
Функция Flip выполняет переключение страниц. При вызове Flip поверхность, ранее отображавшаяся на экране, становится невидимой, а вместо нее отображается вторичный буфер. Функция Flip действует лишь для поверхностей, созданных как переключаемые.
Необходимо учитывать, что настоящее (аппаратное) переключение страниц возможно не всегда. Для переключения страниц требуется видеопамять в объеме, достаточном для хранения двух полных экранов с данными. Если это требование не выполняется, вторичный буфер создается в системной памяти. В этом случае при вызове Flip вместо переключения страниц выполняется блиттинг — содержимое вторичного буфера из видеопамяти копируется на первичную поверхность. Это ведет к заметному снижению быстродействия, но в тех случаях, когда видеопамяти не хватает для настоящего переключения страниц, ничего другого не остается (не считая аварийного завершения программы). Если ваше приложение требует максимального быстродействия, можно запретить активизацию видеорежимов, в которых не удается организовать настоящее переключение страниц.
Две следующие функции предназначены для получения информации о ходе операций блиттинга и переключения:
• GetBltStatus
• GetFlipStatus
С помощью функции GetBltStatus можно определить, выполняется ли блиттинг в данный момент. Это может быть важно, поскольку копируемые поверхности не могут участвовать в других операциях. Функция показывает, занята ли данная поверхность в качестве источника или приемника блиттинга.