Condividi tramite


Uso delle modalità maschera CMY GDI a 8 bit per pixel

In Microsoft Windows 2000 la funzione HT_Get8BPPMaskPalette ha restituito tavolozze monocromatiche o CMY a 8 bit per pixel. In Windows XP e versioni successive questa funzione è stata modificata in modo che restituisca anche tavolozze CMY inverted-index quando il parametro Use8BPPMaskPal è impostato su TRUE. Il tipo di tavolozza restituito dipende dal valore archiviato in pPaletteEntry[0] quando viene chiamato HT_Get8BPPMaskPalette . Se pPaletteEntry[0] è impostato su 'RGB0', viene restituita una tavolozza di indici invertita. Se pPaletteEntry[0] è impostato su 0, viene restituita una normale tavolozza CMY.

Il motivo di questa modifica nel comportamento di HT_Get8BPPMaskPalette è che quando Windows GDI usa rop, che si basano sugli indici in una tavolozza e non sui colori della tavolozza, presuppone che l'indice 0 della tavolozza sia sempre nero e che l'ultimo indice sia sempre bianco. GDI non controlla le voci della tavolozza. Questa modifica in HT_Get8BPPMaskPalette garantisce l'output ROP corretto, anziché un risultato invertito.

Per correggere il comportamento ROP GDI, GDI in Windows XP e versioni successive supporta un formato di composizione speciale della tavolozza CMY in cui le voci della tavolozza della maschera CMY iniziano in corrispondenza dell'indice 255 (bianco) e funzionano fino all'indice 255 (nero) e funzionano fino a 255 (nero). Le modalità invertite cmy spostano anche tutte le voci di colore della maschera CMY al centro di una tavolozza completa di 256 voci, con l'inizio e la fine della tavolozza riempita con numeri uguali di voci nere e bianche.

Nota Nella discussione seguente, il termine modalità CMY si riferisce a una modalità supportata nell'implementazione precedente di HT_Get8BPPMaskPalette. Il termine modalità CMY_INVERTED fa riferimento alle modalità supportate solo in Windows XP e versioni successive GDI, in cui questa funzione inverte gli indici maschera di bit quando pPaletteEntry[0] è impostato su 'RGB0'.

I passaggi seguenti sono necessari per tutti i driver Windows XP e versioni successive che usano le modalità maschera CMY a metàtone di Windows GDI a 8 bit per pixel. Se si sviluppa un driver per Windows 2000, è consigliabile limitare l'uso del driver a tavolozze monocromatiche a 8 bit per pixel.

  1. Impostare il membro flHTFlags della struttura GDIINFO su HT_FLAG_INVERT_8BPP_BITMASK_IDX in modo che GDI esegua il rendering delle immagini in una delle modalità di CMY_INVERTED.

  2. Impostare pPaletteEntry[0] come indicato di seguito prima di una chiamata a HT_Get8BPPMaskPalette:

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

    A tale scopo, un chiamante deve usare la macro HT_SET_BITMASKPAL2RGB (definita in winddi.h). Di seguito è riportato un esempio che illustra l'uso di questa macro:

    HT_SET_BITMASKPAL2RGB(pPaletteEntry)
    

    In questo caso pPaletteEntry è il puntatore a PALETTEENTRY passato nella chiamata alla funzione HT_Get8BPPMaskPalette . Al termine dell'esecuzione di questa macro, pPaletteEntry[0] conterrà la stringa 'RGB0'.

  3. Controllare il parametro pPaletteEntry restituito dalla chiamata a HT_Get8BPPMaskPalette usando la macro HT_IS_BITMASKPALRGB , definita in winddi.h. Di seguito è riportato un esempio che illustra l'uso di questa macro.

    InvCMYSupported = HT_IS_BITMASKPALRGB(pPaletteEntry)
    

    In questa espressione pPaletteEntry è il puntatore a PALETTEENTRY passato alla funzione HT_Get8BPPMaskPalette . Se questa macro restituisce TRUE, GDI supporta le modalità di maschera di bit CMY invertita a 8 bit per pixel. Il chiamante deve usare una tabella di conversione per convertire gli indici della tavolozza in livelli di input penna. Per un esempio di funzione che genera questa tabella di conversione, vedere Conversione di indici halftone a 8 bit per pixel in livelli input penna .

    Se questa macro restituisce FALSE, la versione corrente di GDI non supporta le modalità di maschera di bit cmy invertita a 8 bit per pixel. In tal caso, GDI supporta solo le modalità non invertite di CMY precedenti.

Per le versioni GDI che supportano le modalità di CMY_INVERTED a 8 bit per pixel, il significato del valore del parametro CMYMask passato alla funzione HT_Get8BPPMaskPalette è stato modificato. La tabella seguente riepiloga le modifiche:

CMYMask
Valore
Indici in modalità CMY
(pPaletteEntry[0] != 'RGB0')
Indici in modalità CMY_INVERTED
(pPaletteEntry[0] == 'RGB0')

0

0: Bianco

Da 1 a 254: grigio chiaro --> Grigio scuro
255: Nero

0 - Nero

Da 1 a 254: grigio scuro --> Grigio chiaro
255: Bianco

1

0: Bianco

da 1 a 123: 123 colori 5x5x5
Da 124 a 255: Nero

Da 0 a 65: Nero

Da 66 a 189: 123 colori 5x5x5 più uno duplicato. La voce in corrispondenza dell'indice 127 viene copiata nell'indice 128.
Dal 190 al 255: Bianco
I valori in corrispondenza degli indici 127 e 128 vengono duplicati per garantire il corretto funzionamento dell'ROP XOR.

2

0: Bianco

da 1 a 214: 214 colori 6x6x6
Da 215 a 255: Nero

Da 0 a 20: Nero

Da 21 a 234: 214 colori 6x6x6
Da 235 a 255: Bianco

da 3 a 255

0: Bianco

Da 1 a 254: maschera di bit CxMxY
255: Nero
Nel prodotto precedente, C, M e Y rappresentano rispettivamente il numero di livelli di ciano, magenta e giallo.
Nota: per queste modalità, una combinazione valida non deve avere alcun livello di inchiostro ciano, magenta o giallo uguale a zero. Per una combinazione di questo tipo, HT_Get8BPPMaskPalette indica una condizione di errore restituendo una tavolozza con conteggio zero nel parametro pPaletteEntry .

0: Nero

Da 1 a 254: colori CxMxY centrati riempiti con nero all'inizio e bianco alla fine
Se CxMxY è un numero dispari, la voce in corrispondenza dell'indice 128 è un duplicato di quello in corrispondenza dell'indice 127.
255: Bianco
Nel prodotto precedente, C, M e Y rappresentano rispettivamente il numero di livelli di ciano, magenta e giallo.
Nota: Gli indici (C x M x Y) sono centrati nella tavolozza 256 voci. Vale a dire, ci sono numeri uguali di voci nere che spaziano l'estremità inferiore della tavolozza e le voci bianche che riempimentano l'estremità superiore.
Nota: per queste modalità, una combinazione valida non deve avere alcun livello di inchiostro ciano, magenta o giallo uguale a zero. Per una combinazione di questo tipo, HT_Get8BPPMaskPalette indica una condizione di errore restituendo una tavolozza con conteggio zero nel parametro pPaletteEntry .
  • Per un valore cmymask pari a 0 (scala grigia), il chiamante può elaborare la modalità CMY o la modalità CMY_INVERTED. Si noti, tuttavia, che gli INDIRIZZI DI gruppo GDI vengono elaborati correttamente solo nella modalità di CMY_INVERTED.

    Modalità CMY: gli indici da 0 a 255 rappresentano una scala grigia da bianco a nero.

    modalità CMY_INVERTED: gli indici da 0 a 255 rappresentano una scala grigia compresa tra il nero e il bianco.

  • Per qualsiasi valore valido di CMYMask compreso tra 1 e 255, il chiamante deve usare la funzione di esempio illustrata in Conversione di indici halftone a 8 bit per pixel in livelli input penna per convertire gli indici in livelli di input penna.

  • Per qualsiasi valore valido di CMYMask compreso tra 1 e 255, le modalità CMY_INVERTED rifornino le tavolozze con voci nere all'inizio della matrice e un numero uguale di voci bianche alla fine della matrice. Il centro della matrice viene riempito con gli altri colori. Ciò garantisce che tutte le 256 voci della tavolozza dei colori siano distribuite simmetricamente in modo che gli ROP GDI, che sono basati su indice, non basati sul colore, funzionino correttamente. I colori vengono distribuiti simmetricamente quando il colore in corrispondenza dell'indice N è l'inverso del colore in corrispondenza dell'indice (256 - N). Quando un colore e il suo inverso vengono stampati insieme, il risultato è nero. In altre parole, per un determinato colore e il suo inverso, i due livelli di inchiostro ciano aggiungono al livello massimo di inchiostro ciano, come fanno i due livelli di inchiostro magenta, e i due livelli di inchiostro giallo. I livelli di inchiostro risultanti corrispondono al nero.

    Per esempio; una tavolozza CMY con tre livelli ciascuno di ciano, magenta e giallo ha un totale di 27 (3 x 3 x 3) indici per i colori, tra cui nero e bianco. Poiché 27 è un numero dispari e poiché GDI richiede che una tavolozza in modalità CMY_INVERTED venga riempita con un numero uguale di voci bianche e nere, GDI duplica la voce in corrispondenza dell'indice centrale (indice 13 dei 27 colori). Con le voci in corrispondenza degli indici 13 e 14 ora la stessa tavolozza avrà ora 28 colori. Per riempire la tavolozza, GDI posiziona 114 voci nere all'inizio della tavolozza (indici da 0 a 113), posiziona i 28 colori in corrispondenza degli indici da 114 (nero) a 141 (bianco) e riempie le restanti 114 voci con bianco (indici da 142 a 255). Questo rende un totale di 256 voci (114 + 28 + 114 = 256 voci). Questo layout degli indici garantisce che venga eseguito correttamente il rendering di tutti gli indirizzi ROP. La funzione di esempio in Conversione di indici halftone a 8 bit per pixel in livelli input penna mostra come generare i livelli di input penna e una tabella di conversione dell'indice CMY332 di Windows 2000.

    La tabella seguente elenca i livelli ciano, magenta e giallo per la tavolozza 3 x 3 x 3 descritta nel paragrafo precedente. I 28 colori (27 colori della tavolozza originale più uno duplicato) sono incorporati al centro della tavolozza a 256 colori, con uguali quantità di riempimento nero all'inizio e riempimento bianco alla fine. La tavolozza è simmetrica, ovvero se i livelli di input penna in corrispondenza dell'indice N vengono aggiunti a quelli in corrispondenza dell'indice (256 - N), il risultato sarà nero (ciano, magenta e livelli gialli = 2).

    Indice tavolozza (indice 3x3x3) Livello ciano da 0 a 2 Magenta Level0 a 2 Livello giallo da 0 a 2

    da 0 a 113

    Nero

    2

    2

    2

    114 (0)

    Nero

    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)

    Copiato nell'indice 128

    1

    1

    1

    128 (14)

    Duplicato della voce in corrispondenza dell'indice 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

    Da 142 a 255

    White

    0

    0

    0

  • Se la tavolozza richiesta è una tavolozza in modalità CMY (non una tavolozza in modalità CMY_INVERTED), per i valori di CMYMask da 3 a 255, i bit di indice dei byte a 8 bit per pixel sottoposti a rendering hanno il significato seguente. In questo caso, i modelli di bit rappresentano i livelli di input penna che possono essere usati direttamente senza traslazione. Questo vale anche quando un indice byte in modalità CMY_INVERTED viene mappato alla modalità CMY usando il membro CMY332Idx di una tabella di conversione. Per altre informazioni, vedere Conversione di indici halftone a 8 bit per pixel in livelli input penna .
  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)