處理像素格式的色彩值
本主題適用于 DirectX 7.0 和更新版本。
顯示驅動程式必須以統一的方式,轉換 ARGB 和 YUV 類別色彩格式的輸入色彩值,因為應用程式會以統一的方式要求表面上的色彩填滿和清除作業。 不過,驅動程式必須直接使用來自其他類別格式的色彩值。 例如,應用程式會針對 Alpha (A) 、紅色 (R) 、綠色 (G) ,以及藍色 (B) 元件,使用 A8R8G8B8 做為統一色彩值;驅動程式必須藉由複製具有最高重要性的位,將 A8R8G8B8 色彩轉換成實際 ARGB 格式特有的色彩值。
當顯示驅動程式處理其 D3dDrawPrimitives2 函式中的D3DDP2OP_CLEAR和D3DDP2OP_COLORFILL作業代碼時,會接收色彩值。
顯示驅動程式可以使用下列程式碼來轉換 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 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應