Gestione dei valori di colore per i formati pixel
Questo argomento si applica a DirectX 7.0 e versioni successive.
Un driver di visualizzazione deve convertire i valori dei colori di input per le classi ARGB e YUV dei formati di colore perché le applicazioni richiedono operazioni di riempimento e cancellazione dei colori sulle superfici con questi formati in modo uniforme. Tuttavia, il driver deve usare direttamente i valori di colore di altri formati di classe. Ad esempio, le applicazioni usano A8R8G8B8 come valore di colore uniforme per tutte le superfici con al massimo 8 bit per i componenti alfa (A), rosso (R), verde (G) e blu (B); il driver deve convertire il colore A8R8G8B8 nel valore di colore specifico del formato ARGB effettivo copiando i bit con il significato più alto.
Il driver di visualizzazione riceve i valori di colore quando elabora i codici di operazione D3DDP2OP_CLEAR e D3DDP2OP_COLORFILL nella funzione D3dDrawPrimitives2 .
Il driver di visualizzazione può usare il codice seguente per convertire i valori di colore per i formati di classe ARGB e 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;
}
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per