Behandeln von Farbwerten für Pixelformate
Dieses Thema gilt für DirectX 7.0 und höher.
Ein Anzeigetreiber muss Eingabefarbwerte für die KLASSEN ARGB und YUV von Farbformaten konvertieren, da Anwendungen Farbfüll- und Löschvorgänge für Oberflächen mit diesen Formaten auf einheitliche Weise anfordern. Der Treiber muss jedoch direkt die Farbwerte aus anderen Klassenformaten verwenden. Beispielsweise verwenden Anwendungen A8R8G8B8 als einheitlichen Farbwert für alle Oberflächen, die höchstens 8 Bits für die Komponenten Alpha (A), Rot (R), Grün (G) und Blau (B) aufweisen; Der Treiber muss die A8R8G8B8-Farbe in den Farbwert konvertieren, der für das tatsächliche ARGB-Format spezifisch ist, indem die Bits mit der höchsten Bedeutung kopiert werden.
Der Anzeigetreiber empfängt Farbwerte, wenn er die D3DDP2OP_CLEAR- und D3DDP2OP_COLORFILL-Vorgangscodes in seiner D3dDrawPrimitives2-Funktion verarbeitet.
Der Anzeigetreiber kann den folgenden Code verwenden, um Farbwerte für die ARGB- und YUV-Klassenformate zu konvertieren:
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;
}
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für