Freigeben über


Verwenden von 8-Bit-CMY-Maskenmodi für GDI pro Pixel

In Microsoft Windows 2000 hat die funktion HT_Get8BPPMaskPalette 8 Bit pro Pixel monochrome oder CMY-Paletten zurückgegeben. In Windows XP und höher wurde diese Funktion so geändert, dass sie auch INVERTED-Index-CMY-Paletten zurückgibt, wenn der Use8BPPMaskPal-Parameter auf TRUE festgelegt ist. Der Typ der zurückgegebenen Palette hängt vom Wert ab, der in pPaletteEntry[0] gespeichert ist, wenn HT_Get8BPPMaskPalette aufgerufen wird. Wenn pPaletteEntry[0] auf "RGB0" festgelegt ist, wird eine invertierte Indexpalette zurückgegeben. Wenn pPaletteEntry[0] auf 0 festgelegt ist, wird eine normale CMY-Palette zurückgegeben.

Der Grund für diese Änderung des Verhaltens von HT_Get8BPPMaskPalette ist, dass bei Verwendung von ROPs in Windows GDI, die auf den Indizes in einer Palette und nicht auf den Farben der Palette basieren, davon ausgegangen wird, dass Index 0 der Palette immer schwarz und der letzte Index immer weiß ist. GDI überprüft die Paletteneinträge nicht. Durch diese Änderung in HT_Get8BPPMaskPalette wird eine korrekte ROP-Ausgabe anstelle eines invertierten Ergebnisses sichergestellt.

Um das GDI-ROP-Verhalten zu korrigieren, unterstützt GDI in Windows XP und höher ein spezielles CMY-Palettenkompositionsformat, bei dem die CMY-Maskenpaletteneinträge bei Index 255 (weiß) beginnen und bis index 0 (schwarz) arbeiten, anstatt bei Index 0 (weiß) zu beginnen und bis Index 255 (schwarz) zu arbeiten. Die invertierten CMY-Modi verschieben auch alle CMY-Maskenfarbeinträge in die Mitte einer vollständigen 256-Einstiegspalette, wobei der Anfang und das Ende der Palette mit gleichen Schwarz- und Weißeinträgen gefüllt sind.

Hinweis In der folgenden Diskussion bezieht sich der Begriff CMY-Modus auf einen Modus, der in der vorherigen Implementierung von HT_Get8BPPMaskPalette unterstützt wurde. Der Begriff CMY_INVERTED Modus bezieht sich auf Modi, die nur unter Windows XP und höher GDI unterstützt werden, in denen diese Funktion Bitmaskenindizes umkehrt, wenn pPaletteEntry[0] auf "RGB0" festgelegt ist.

Die folgenden Schritte sind für alle Windows XP- und höher-Treiber erforderlich, die 8-Bit-pro-Pixel-CMY-Maskenmodi für Halbton von Windows GDI verwenden. Wenn Sie einen Treiber für Windows 2000 entwickeln, sollten Sie die Verwendung des Treibers auf 8-Bit-pro-Pixel-Monochrompaletten beschränken.

  1. Legen Sie den flHTFlags-Member der GDIINFO-Struktur auf HT_FLAG_INVERT_8BPP_BITMASK_IDX fest, damit GDI Bilder in einem der CMY_INVERTED-Modi rendert.

  2. Legen Sie pPaletteEntry[0] vor einem Aufruf von HT_Get8BPPMaskPalette wie folgt fest:

    pPaletteEntry[0].peRed   = 'R';
    pPaletteEntry[0].peGreen = 'G';
    pPaletteEntry[0].peBlue  = 'B';
    pPaletteEntry[0].peFlags = '0';
    

    Dazu sollte ein Aufrufer das makro HT_SET_BITMASKPAL2RGB (definiert in winddi.h) verwenden. Hier sehen Sie ein Beispiel für die Verwendung dieses Makros:

    HT_SET_BITMASKPAL2RGB(pPaletteEntry)
    

    Hier ist pPaletteEntry der Zeiger auf die PALETTEENTRY, die im Aufruf der HT_Get8BPPMaskPalette-Funktion übergeben wurde. Wenn die Ausführung dieses Makros abgeschlossen ist, enthält pPaletteEntry[0] die Zeichenfolge "RGB0".

  3. Überprüfen Sie den pPaletteEntry-Parameter , der vom Aufruf von HT_Get8BPPMaskPalette zurückgegeben wird, mithilfe des makros HT_IS_BITMASKPALRGB , das in winddi.h definiert ist. Hier sehen Sie ein Beispiel für die Verwendung dieses Makros.

    InvCMYSupported = HT_IS_BITMASKPALRGB(pPaletteEntry)
    

    In diesem Ausdruck ist pPaletteEntry der Zeiger auf die PALETTEENTRY, die an die funktion HT_Get8BPPMaskPalette übergeben wurde. Wenn dieses Makro TRUE zurückgibt , unterstützt GDI die invertierten CMY-Bitmaskenmodi mit 8 Bit pro Pixel. Der Aufrufer muss eine Übersetzungstabelle verwenden, um die Palettenindizes in Freihandebenen zu konvertieren. Ein Beispiel für eine Funktion, die diese Übersetzungstabelle generiert, finden Sie unter Übersetzen von 8-Bit-Halbtonindizes pro Pixel in Freihandebenen .

    Wenn dieses Makro FALSE zurückgibt, unterstützt die aktuelle Version von GDI die invertierten CMY-Bitmaskenmodi mit 8 Bit pro Pixel nicht. In diesem Fall unterstützt GDI nur die älteren nicht invertierten CMY-Modi.

Für GDI-Versionen, die die 8-Bit-pro-Pixel-CMY_INVERTED-Modi unterstützen, wurde die Bedeutung des CMYMask-Parameterwerts geändert, der an die HT_Get8BPPMaskPalette-Funktion übergeben wird. Die Änderungen sind in der folgenden Tabelle zusammengefasst:

CMYMask
Wert
CMY-Modusindizes
(pPaletteEntry[0] != 'RGB0')
CMY_INVERTED-Modus-Indizes
(pPaletteEntry[0] == 'RGB0')

0

0: Weiß

1 bis 254: Hellgrau --> Dunkelgrau
255: Schwarz

0 - Schwarz

1 bis 254: Dunkelgrau --> Hellgrau
255: Weiß

1

0: Weiß

1 bis 123: 123 5x5x5 Farben
124 bis 255: Schwarz

0 bis 65: Schwarz

66 bis 189: 123 5x5x5 Farben plus ein Duplikat. Der Eintrag am Index 127 wird in index 128 kopiert.
190 bis 255: Weiß
Die Werte bei den Indizes 127 und 128 werden dupliziert, um sicherzustellen, dass der XOR-ROP ordnungsgemäß funktioniert.

2

0: Weiß

1 bis 214: 214 6x6x6 Farben
215 bis 255: Schwarz

0 bis 20: Schwarz

21 bis 234: 214 Farben 6x6x6
235 bis 255: Weiß

3 bis 255

0: Weiß

1 bis 254: CxMxY-Farbbitmaske
255: Schwarz
Im obigen Produkt stellen C, M und Y die Anzahl der Zyan-, Magenta- und Gelbwerte dar.
Hinweis: Für diese Modi darf eine gültige Kombination keinen der Blau-, Magenta- oder Gelbfarbenwerte aufweisen, die gleich 0 (null) sind. Für eine solche Kombination gibt HT_Get8BPPMaskPalette eine Fehlerbedingung an, indem eine Nullanzahlpalette im pPaletteEntry-Parameter zurückgegeben wird.

0: Schwarz

1 bis 254: Zentrierte CxMxY-Farben mit Schwarz am Anfang und Weiß am Ende
Wenn CxMxY eine ungerade Zahl ist, ist der Eintrag am Index 128 ein Duplikat des Werts bei Index 127.
255: Weiß
Im obigen Produkt stellen C, M und Y die Anzahl der Zyan-, Magenta- und Gelbwerte dar.
Hinweis: Die Indizes (C x M x Y) werden in der Palette mit 256 Einträgen zentriert. Das heißt, es gibt gleich viele schwarze Einträge, die das untere Ende der Palette auffüllen, und weiße Einträge, die das High-End auffüllen.
Hinweis: Für diese Modi darf eine gültige Kombination keinen der Blau-, Magenta- oder Gelbfarbenwerte aufweisen, die gleich 0 (null) sind. Für eine solche Kombination gibt HT_Get8BPPMaskPalette eine Fehlerbedingung an, indem eine Nullanzahlpalette im pPaletteEntry-Parameter zurückgegeben wird.
  • Für den Wert CMYMask von 0 (Grauskala) kann der Aufrufer entweder den CMY-Modus oder den CMY_INVERTED-Modus verarbeiten. Beachten Sie jedoch, dass GDI-ROPs nur im CMY_INVERTED Modus ordnungsgemäß verarbeitet werden.

    CMY-Modus: Die Indizes 0 bis 255 stellen eine Grauskala von Weiß bis Schwarz dar.

    CMY_INVERTED Modus: Die Indizes 0 bis 255 stellen eine Grauskala von Schwarz bis Weiß dar.

  • Für jeden gültigen CMYMask-Wert von 1 bis 255 sollte der Aufrufer die Beispielfunktion verwenden, die unter Übersetzen von 8-Bit-Halbtonindizes pro Pixel in Freihandebenen gezeigt wird, um Indizes in Freihandebenen zu übersetzen.

  • Für jeden gültigen CMYMask-Wert von 1 bis 255 füllen die CMY_INVERTED Modi die Paletten mit schwarzen Einträgen am Anfang des Arrays und einer gleichen Anzahl weißer Einträge am Ende des Arrays. Die Mitte des Arrays wird mit den anderen Farben gefüllt. Dadurch wird sichergestellt, dass alle 256 Farbpaletteneinträge symmetrisch verteilt sind, sodass GDI-ROPs, die indexbasiert und nicht farbbasiert sind, ordnungsgemäß funktionieren. Die Farben werden symmetrisch verteilt, wenn die Farbe am Index N die Inverse der Farbe am Index (256 - N) ist. Wenn eine Farbe und ihre Inverse zusammen gedruckt werden, ist das Ergebnis schwarz. Anders ausgedrückt: Für eine bestimmte Farbe und ihre Inverse fügen die beiden Cyan-Tintenstufen den maximalen Cyan-Tintenwert hinzu, ebenso wie die beiden Magenta-Freihandwerte und die beiden gelben Tintenwerte. Die resultierenden Freihandwerte entsprechen Schwarz.

    Zum Beispiel; eine CMY-Palette mit jeweils drei Ebenen von Cyan, Magenta und Gelb hat insgesamt 27 (3 x 3 x 3) Indizes für Farben, einschließlich Schwarz und Weiß. Da 27 eine ungerade Zahl ist und GDI erfordert, dass eine CMY_INVERTED-Modus-Palette mit der gleichen Anzahl von schwarzen und weißen Einträgen aufgefüllt werden muss, dupliziert GDI den Eintrag am mittleren Index (Index 13 der 27 Farben). Da die Einträge bei den Indizes 13 und 14 jetzt gleich sind, verfügt die Palette nun über 28 Farben. Um die Palette zu füllen, platziert GDI 114 schwarze Einträge am Anfang der Palette (Indizes 0 bis 113), platziert die 28 Farben an den Indizes 114 (schwarz) bis 141 (weiß) und füllt die verbleibenden 114 Einträge mit Weiß (Indizes 142 bis 255). Dies macht insgesamt 256 Einträge (114 + 28 + 114 = 256 Einträge). Durch dieses Layout der Indizes wird sichergestellt, dass alle ROPs ordnungsgemäß gerendert werden. Die Beispielfunktion in Übersetzen von 8-Bit-Halbtonindizes pro Pixel in Freihandebenen zeigt, wie Sie die Freihandebenen sowie eine Windows 2000 CMY332-Indexübersetzungstabelle generieren.

    In der folgenden Tabelle sind die Cyan-, Magenta- und Gelbwerte für die im vorherigen Absatz beschriebene Palette 3 x 3 aufgeführt. Die 28 Farben (27 originale Palettenfarben plus ein Duplikat) sind in die Mitte der 256-Farbpalette eingebettet, wobei die gleiche Menge an schwarzem Abstand am Anfang und weißer Auffüllung am Ende ist. Die Palette ist symmetrisch, d. h., wenn die Freihandebenen bei Index N zu denen am Index (256 - N) hinzugefügt werden, ist das Ergebnis schwarz (Cyan-, Magenta- und Gelbebene = 2).

    Palettenindex(3x3x3 Index) Cyan Level0 bis 2 Magenta Level0 bis 2 Gelber Level0 bis 2

    0 bis 113

    Schwarz

    2

    2

    2

    114 (0)

    Schwarz

    2

    2

    2

    115 (1)

    2

    2

    1

    116 (2)

    2

    2

    0

    117 (3)

    2

    1

    2

    118 (4)

    2

    1

    1

    119 (5)

    2

    1

    0

    120 (6)

    2

    0

    2

    121 (7)

    2

    0

    1

    122 (8)

    2

    0

    0

    123 (9)

    1

    2

    2

    124 (10)

    1

    2

    1

    125 (11)

    1

    2

    0

    126 (12)

    1

    1

    2

    127 (13)

    In Index 128 kopiert

    1

    1

    1

    128 (14)

    Duplikat des Eintrags bei Index 127

    1

    1

    1

    129 (15)

    1

    1

    0

    130 (16)

    1

    0

    2

    131 (17)

    1

    0

    1

    132 (18)

    1

    0

    0

    133 (19)

    0

    2

    2

    134 (20)

    0

    2

    1

    135 (21)

    0

    2

    0

    136 (22)

    0

    1

    2

    137 (23)

    0

    1

    1

    138 (24)

    0

    1

    0

    139 (25)

    0

    0

    2

    140 (26)

    0

    0

    1

    141 (27)

    White

    0

    0

    0

    142 bis 255

    White

    0

    0

    0

  • Wenn die angeforderte Palette eine CMY-Moduspalette (keine CMY_INVERTED-Moduspalette) ist, haben die gerenderten 8-Bit-Byteindexbits für CMYMask von 3 bis 255 die folgende Bedeutung. In diesem Fall stellen die Bitmuster Freihandebenen dar, die direkt ohne Übersetzung verwendet werden können. Dies gilt auch, wenn ein CMY_INVERTED Modus-Byteindex mithilfe des CMY332Idx-Elements einer Übersetzungstabelle dem CMY-Modus zugeordnet wird. Weitere Informationen finden Sie unter Übersetzen von 8-Bit-Halbtonindizes pro Pixel in Freihandebenen .
  Bit     7 6 5 4 3 2 1 0
          |   | |   | | |
          +---+ +---+ +-+
            |     |    |
            |     |    +-- Yellow 0-3 (Max. 4 levels)
            |     |
            |     +-- Magenta 0-7 (Max. 8 levels)
            |
            +-- Cyan 0-7 (Max. 8 levels)