Обработка значений цвета для форматов пикселей
Этот раздел относится к DirectX 7.0 и более поздних версий.
Драйвер дисплея должен преобразовывать входные значения цвета для классов ARGB и YUV цветовых форматов, так как приложения запрашивают операции заливки и очистки цветов на поверхностях с этими форматами единым способом. Однако драйвер должен напрямую использовать значения цвета из других форматов классов. Например, приложения используют A8R8G8B8 в качестве равномерного значения цвета для всех поверхностей, имеющих не более 8 бит для альфа-компонентов (A), красного (R), зеленого (G) и синего (B) компонентов; Драйвер должен преобразовать цвет A8R8G8B8 в значение цвета, относящееся к фактическому формату ARGB, путем копирования битов с наивысшей важностью.
Драйвер отображения получает значения цвета при обработке кода D3DDP2OP_CLEAR и D3DDP2OP_COLORFILL операций в функции D3dDrawPrimitives2 .
Драйвер отображения может использовать следующий код для преобразования значений цвета для форматов классов ARGB и YUV:
DWORD Convert2N(DWORD Color, DWORD n)
{
return (Color * (1 << n)) / 256;
}
DWORD CPixel::ConvertFromARGB(D3DCOLOR InputColor,
D3DFORMAT OutputFormat)
{
DWORD Output = (DWORD) InputColor;
DWORD Alpha = InputColor >> 24;
DWORD Red = (InputColor >> 16) & 0x00ff;
DWORD Green = (InputColor >> 8) & 0x00ff;
DWORD Blue = InputColor & 0x00ff;
switch(OutputFormat) {
case D3DFMT_R8G8B8:
case D3DFMT_X8R8G8B8:
Output = InputColor & 0x00ffffff;
break;
case D3DFMT_A8R8G8B8:
Output = InputColor;
break;
case D3DFMT_R5G6B5:
Output = (Convert2N(Red,5) << 11) |
(Convert2N(Green,6) << 5) |
(Convert2N(Blue,5));
break;
case D3DFMT_X1R5G5B5:
Output = (Convert2N(Red,5) << 10) |
(Convert2N(Green,5) << 5) |
(Convert2N(Blue,5));
break;
case D3DFMT_A1R5G5B5:
Output = (Convert2N(Alpha, 1) << 15) |
(Convert2N(Red,5) << 10) |
(Convert2N(Green,5) << 5) |
(Convert2N(Blue,5));
break;
case D3DFMT_X4R4G4B4:
Output = (Convert2N(Red,4) << 8) |
(Convert2N(Green,4) << 4) |
(Convert2N(Blue,4));
break;
case D3DFMT_A4R4G4B4:
Output = (Convert2N(Alpha,4) << 12) |
(Convert2N(Red,4) << 8) |
(Convert2N(Green,4) << 4) |
(Convert2N(Blue,4));
break;
case D3DFMT_R3G3B2:
Output = (Convert2N(Red,3) << 5) |
(Convert2N(Green,3) << 2) |
(Convert2N(Blue,2));
break;
case D3DFMT_A8R3G3B2:
Output = (Alpha << 8) |
(Convert2N(Red,3) << 5) |
(Convert2N(Green,3) << 2) |
(Convert2N(Blue,2));
break;
case D3DFMT_A2B10G10R10:
Output = (Convert2N(Alpha,2) << 30) |
(Convert2N(Red,10)) |
(Convert2N(Green,10) << 10) |
(Convert2N(Blue,10) << 20);
break;
case D3DFMT_X8B8G8R8:
Output = (Convert2N(Red,8)) |
(Convert2N(Green,8) << 8) |
(Convert2N(Blue,8) << 16);
break;
case D3DFMT_A8B8G8R8:
Output = (Alpha << 24) |
(Convert2N(Red,8)) |
(Convert2N(Green,8) << 8) |
(Convert2N(Blue,8) << 16);
break;
#if (DXPIXELVER > 8)
case D3DFMT_A2R10G10B10:
Output = (Convert2N(Alpha,2) << 30) |
(Convert2N(Red,10) << 20) |
(Convert2N(Green,10) << 10) |
(Convert2N(Blue,10));
break;
#endif
case D3DFMT_UYVY:
#if (DXPIXELVER > 8)
case D3DFMT_R8G8_B8G8:
#endif
Output = (Red << 24) |
(Green << 16) |
(Red << 8) |
(Blue);
break;
case D3DFMT_YUY2:
#if (DXPIXELVER > 8)
case D3DFMT_G8R8_G8B8:
#endif
Output = (Green << 24) |
(Red << 16) |
(Blue << 8) |
(Red);
break;
case MAKEFOURCC('A', 'Y', 'U', 'V'):
case MAKEFOURCC('N', 'V', '1', '2'):
case MAKEFOURCC('Y', 'V', '1', '2'):
case MAKEFOURCC('I', 'C', 'M', '1'):
case MAKEFOURCC('I', 'C', 'M', '2'):
case MAKEFOURCC('I', 'C', 'M', '3'):
case MAKEFOURCC('I', 'C', 'M', '4'):
Output = InputColor;
break;
}
return Output;
}
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по