структура DXGK_GDIARG_TRANSPARENTBLT (d3dkmddi.h)
Структура DXGK_GDIARG_TRANSPARENTBLT описывает характеристики операции аппаратного ускорения передачи битовых блоков (bitblt) GDI с прозрачностью.
Синтаксис
typedef struct _DXGK_GDIARG_TRANSPARENTBLT {
[in] RECT SrcRect;
[in] RECT DstRect;
UINT SrcAllocationIndex;
UINT DstAllocationIndex;
UINT Color;
UINT NumSubRects;
RECT *pSubRects;
D3DKM_TRANSPARENTBLTFLAGS Flags;
UINT SrcPitch;
} DXGK_GDIARG_TRANSPARENTBLT;
Члены
[in] SrcRect
Структура RECT , определяющая прямоугольную область для копирования. Этот прямоугольник задается в системе координат исходной поверхности и определяется двумя точками: верхней левой и нижней правой. Две точки, определяющие прямоугольник, всегда хорошо упорядочены.
Дополнительные сведения см. в разделе «Примечания».
[in] DstRect
Структура RECT , определяющая прямоугольную область для изменения. Этот прямоугольник задается в системе координат целевой поверхности и определяется двумя точками: верхней левой и нижней правой. Прямоугольник является эксклюзивным в нижнем правом углу; то есть его нижний и правый края не являются частью передачи битового блока. Две точки, определяющие прямоугольник, всегда хорошо упорядочены.
Прямоугольник назначения, определенный DstRect, может превышать границы целевой поверхности, но вложенные прямоугольники не могут. Кроме того, все вложенные прямоугольники гарантированно помещаются внутри целевой поверхности. Вложенные прямоугольники могут быть дополнительно ограничены ограничивающим прямоугольником, который меньше целевого прямоугольника.
Дополнительные сведения см. в разделе «Примечания».
SrcAllocationIndex
[in] Индекс элемента в списке выделения, указывающий выделение, на которое ссылается исходный прямоугольник SrcRect .
DstAllocationIndex
[in] Индекс элемента в списке выделения, указывающий выделение, на которое ссылается прямоугольник назначения DstRect .
Color
[in] Задает физический прозрачный цвет в исходной поверхности в 32-разрядном формате без знака ARGB (как определено значением D3DDDIFMT_A8R8G8B8 перечисления D3DDDIFORMAT ). Все пиксели на исходной поверхности, соответствующие прозрачному цвету, заданному цветом Color , не копируются.
NumSubRects
[in] Количество вложенных прямоугольников в пространстве поверхности назначения, ограниченном прямоугольником назначения DstRect .
pSubRects
[in] Указатель на вложенные прямоугольники в пространстве целевой поверхности.
Flags
[in] Структура D3DKM_TRANSPARENTBLTFLAGS , задающая возможности аппаратного ускорения прозрачной передачи битовых блоков адаптера дисплея.
SrcPitch
[in] Шаг исходной поверхности в байтах.
Комментарии
Прямоугольники, заданные членами SrcRect и DstRect , привязывают все вложенные прямоугольники в исходном и целевом пространствах поверхности соответственно. Подсистема ядра графики Microsoft DirectX никогда не запрашивает прозрачную передачу битовых блоков, если исходный и целевой прямоугольники перекрываются на одной поверхности.
Чтобы завершить операцию передачи прозрачного битового блока, цвет каждого пикселя в DstRect должен вычисляться по следующей формуле:
typedef DXGK_GDIARG_TRANSPARENTBLT tblt;
if (tblt.Flags.HonorAlpha)
{
if (SourceColor != tblt.Color)
{
DestinationColor = SourceColor;
}
}
else
{
if ((SourceColor & 0x00FFFFFF) != tblt.Color)
{
DestinationColor = SourceColor;
}
}
В этом случае значение 0x00FFFFFF в формате ARGB обозначает альфа = 0, поэтому альфа-смешивание не реализуется.
Если требуется операция передачи битового блока растяжения, коэффициенты растяжения x и y вычисляются соответственно как соотношения размеров x и y для DstRect и SrcRect. Кроме того, операция растяжения будет продолжаться так, как если бы задано значение COLORONCOLOR в Wingdi.h . При сжатии битовых блоков следует игнорировать достаточное количество пикселей, чтобы не комбинировать пиксели. При растягивая передачу битовых блоков пиксели должны реплицироваться.
Дополнительные сведения о прозрачной передаче битовых блоков см. в разделе Копирование растровых изображений.
При преобразовании вложенных прямоугольников в пространство исходной поверхности результат гарантированно будет находиться в пределах исходной поверхности. Преобразование координат вложенного прямоугольника на целевой поверхности в координаты в исходной поверхности определяется следующими формулами, где:
- (Xd, Yd) — это точка внутри вложенного прямоугольника
- (Xs, Ys) — это точка внутри исходного прямоугольника.
float Ws = SrcRect.right - SrcRect.left;
float Wd = DstRect.right - DstRect.left;
int Xs = round((Xd - DstRect.left + 0.5) * Ws/Wd + SrcRect.left - 0.5)
OR
int Xs = truncate((Xd - DstRect.left + 0.5) * Ws/Wd + SrcRect.left)
float Hs = SrcRect.bottom - SrcRect.top;
float Hd = DstRect.bottom - DstRect.top;
int Ys = round((Yd - DstRect.top + 0.5) * Hs/Hd + SrcRect.top - 0.5)
OR
int Ys = truncate((Yd - DstRect.top + 0.5) * Hs/Hd + SrcRect.top)
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 7 |
Верхняя часть | d3dkmddi.h (включая D3dkmddi.h) |