Compartilhar via


Usando modos de máscara CMY GDI de 8 bits por pixel

No Microsoft Windows 2000, a função HT_Get8BPPMaskPalette retornou paletas monocromáticas ou CMY de 8 bits por pixel. No Windows XP e posterior, essa função foi modificada para que ela também retorne paletas CMY de índice invertido quando o parâmetro Use8BPPMaskPal for definido como TRUE. O tipo de paleta retornada depende do valor armazenado em pPaletteEntry[0] quando HT_Get8BPPMaskPalette é chamado. Se pPaletteEntry[0] estiver definido como 'RGB0', uma paleta de índice invertido será retornada. Se pPaletteEntry[0] estiver definido como 0, uma paleta CMY normal será retornada.

O motivo dessa alteração no comportamento de HT_Get8BPPMaskPalette é que, quando o Windows GDI usa ROPs, que são baseados nos índices em uma paleta e não nas cores da paleta, ele pressupõe que o índice 0 da paleta é sempre preto e que o último índice é sempre branco. A GDI não marcar as entradas da paleta. Essa alteração no HT_Get8BPPMaskPalette garante a saída ROP correta, em vez de um resultado invertido.

Para corrigir o comportamento de ROP de GDI, o GDI no Windows XP e posterior dá suporte a um formato de composição de paleta CMY especial no qual as entradas da paleta de máscaras CMY começam no índice 255 (branco) e funcionam até o índice 0 (preto), em vez de iniciar no índice 0 (branco) e trabalhar até o índice 255 (preto). Os modos invertidos cmy também movem todas as entradas de cor de máscara CMY para o meio de uma paleta completa de 256 entradas, com o início e o fim da paleta acolchoados com números iguais de entradas em preto e branco.

Nota Na discussão a seguir, o termo modo CMY refere-se a um modo com suporte na implementação anterior do HT_Get8BPPMaskPalette. O termo modo CMY_INVERTED refere-se a modos com suporte apenas no Windows XP e GDI posterior, em que essa função inverte índices de máscara de bits quando pPaletteEntry[0] é definido como 'RGB0'.

As etapas a seguir são necessárias para todos os drivers do Windows XP e posteriores que usam os modos de máscara CMY de 8 bits por pixel do Windows GDI. Se você estiver desenvolvendo um driver para o Windows 2000, deverá limitar o uso do driver a paletas monocromáticas de 8 bits por pixel.

  1. Defina o membro flHTFlags da estrutura GDIINFO como HT_FLAG_INVERT_8BPP_BITMASK_IDX para que o GDI renderize imagens em um dos modos de CMY_INVERTED.

  2. Defina pPaletteEntry[0] da seguinte maneira antes de uma chamada para HT_Get8BPPMaskPalette:

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

    Para fazer isso, um chamador deve usar a macro HT_SET_BITMASKPAL2RGB (definida em winddi.h). Aqui está um exemplo mostrando o uso desta macro:

    HT_SET_BITMASKPAL2RGB(pPaletteEntry)
    

    Aqui pPaletteEntry é o ponteiro para PALETTEENTRY que foi passado na chamada para a função HT_Get8BPPMaskPalette . Quando essa macro concluir a execução, pPaletteEntry[0] conterá a cadeia de caracteres 'RGB0'.

  3. Verifique o parâmetro pPaletteEntry retornado da chamada para HT_Get8BPPMaskPalette usando a macro HT_IS_BITMASKPALRGB , que é definida em winddi.h. Aqui está um exemplo mostrando o uso dessa macro.

    InvCMYSupported = HT_IS_BITMASKPALRGB(pPaletteEntry)
    

    Nessa expressão, pPaletteEntry é o ponteiro para PALETTEENTRY que foi passado para a função HT_Get8BPPMaskPalette . Se essa macro retornar TRUE, a GDI oferecerá suporte aos modos de máscara de bits CMY invertidos de 8 bits por pixel. O chamador deve usar uma tabela de tradução para converter os índices de paleta em níveis de tinta. Consulte Traduzir índices de meio tom de 8 bits por pixel para níveis de tinta para obter um exemplo de uma função que gera essa tabela de tradução.

    Se essa macro retornar FALSE, a versão atual do GDI não oferecerá suporte aos modos de máscara de bits CMY invertidos de 8 bits por pixel. Nesse caso, a GDI dá suporte apenas aos modos cmy não convertidos mais antigos.

Para versões GDI que dão suporte aos modos de CMY_INVERTED de 8 bits por pixel, o significado do valor do parâmetro CMYMask passado para a função HT_Get8BPPMaskPalette foi alterado. A tabela a seguir resume as mudanças:

CMYMask
Valor
Índices do modo CMY
(pPaletteEntry[0] != 'RGB0')
Índices do modo CMY_INVERTED
(pPaletteEntry[0] == 'RGB0')

0

0: Branco

1 a 254: Cinza Claro -> Cinza Escuro
255: Preto

0 - Preto

1 a 254: Cinza Escuro -> Cinza Claro
255: Branco

1

0: Branco

1 a 123: 123 cores 5x5x5
124 a 255: Preto

0 a 65: Preto

66 a 189: 123 cores 5x5x5 mais uma duplicata. A entrada no índice 127 é copiada para o índice 128.
190 a 255: Branco
Os valores nos índices 127 e 128 são duplicados para garantir que o ROP XOR funcione corretamente.

2

0: Branco

1 a 214: 214 cores 6x6x6
215 a 255: Preto

0 a 20: Preto

21 a 234: 214 cores 6x6x6
235 a 255: Branco

3 a 255

0: Branco

1 a 254: máscara de bits de cor CxMxY
255: Preto
No produto acima, C, M e Y representam o número de níveis de ciano, magenta e amarelo, respectivamente.
Observação: para esses modos, uma combinação válida não deve ter nenhum dos níveis de tinta ciano, magenta ou amarelo igual a zero. Para essa combinação, HT_Get8BPPMaskPalette indica uma condição de erro retornando uma paleta de contagem zero em seu parâmetro pPaletteEntry .

0: Preto

1 a 254: cores CxMxY centralizados preenchidas com preto no início e branco no final
Se CxMxY for um número ímpar, a entrada no índice 128 será uma duplicata da do índice 127.
255: Branco
No produto acima, C, M e Y representam o número de níveis de ciano, magenta e amarelo, respectivamente.
Nota: Os índices (C x M x Y) são centralizados na paleta de 256 entradas. Ou seja, há números iguais de entradas pretas preenchendo a extremidade baixa da paleta e entradas brancas preenchendo a extremidade superior.
Observação: para esses modos, uma combinação válida não deve ter nenhum dos níveis de tinta ciano, magenta ou amarelo igual a zero. Para essa combinação, HT_Get8BPPMaskPalette indica uma condição de erro retornando uma paleta de contagem zero em seu parâmetro pPaletteEntry .
  • Para um valor de CMYMask de 0 (escala cinza), o chamador pode processar o modo CMY ou o modo CMY_INVERTED. No entanto, observe que os ROPs GDI são processados corretamente somente no modo CMY_INVERTED.

    Modo CMY: os índices de 0 a 255 representam uma escala cinza de branco para preto.

    modo CMY_INVERTED: os índices de 0 a 255 representam uma escala cinza que varia de preto a branco.

  • Para qualquer valor válido de CMYMask de 1 a 255, o chamador deve usar a função de exemplo mostrada em Traduzir índices de meio tom de 8 bits por pixel para níveis de tinta para converter índices em níveis de tinta.

  • Para qualquer valor válido de CMYMask de 1 a 255, os modos CMY_INVERTED preenchem as paletas com entradas pretas no início da matriz e um número igual de entradas brancas no final da matriz. O meio da matriz é preenchido com as outras cores. Isso garante que todas as 256 entradas da paleta de cores sejam distribuídas simétricamente para que os ROPs GDI, que são baseados em índice, não baseados em cores, funcionem corretamente. As cores são distribuídas simétricamente quando a cor no índice N é o inverso da cor no índice (256 – N). Quando uma cor e seu inverso são impressos juntos, o resultado é preto. Em outras palavras, para uma determinada cor e seu inverso, os dois níveis de tinta ciano adicionam ao nível máximo de tinta ciano, assim como os dois níveis de tinta magenta e os dois níveis de tinta amarela. Os níveis de tinta resultantes correspondem ao preto.

    Por exemplo; uma paleta CMY com três níveis cada um de ciano, magenta e amarelo tem um total de 27 (3 x 3 x 3) índices para cores, incluindo preto e branco. Como 27 é um número ímpar e, como o GDI exige que uma paleta de modo CMY_INVERTED seja preenchida com números iguais de entradas em preto e branco, o GDI duplica a entrada no índice intermediário (índice 13 das 27 cores). Com as entradas nos índices 13 e 14 agora iguais, a paleta agora terá 28 cores. Para preencher a paleta, a GDI coloca 114 entradas pretas no início da paleta (índices de 0 a 113), coloca as 28 cores nos índices 114 (preto) a 141 (branco) e preenche as 114 entradas restantes com branco (índices de 142 a 255). Isso totaliza 256 entradas (114 + 28 + 114 = 256 entradas). Esse layout dos índices garante que todos os ROPs sejam renderizados corretamente. A função de exemplo em Traduzir índices de meio tom de 8 bits por pixel para níveis de tinta mostra como gerar os níveis de tinta, bem como uma tabela de tradução de índice CMY332 do Windows 2000.

    A tabela a seguir lista os níveis ciano, magenta e amarelo para a paleta 3 x 3 x 3 discutida no parágrafo anterior. As 28 cores (27 cores originais da paleta mais uma duplicada) são inseridas no meio da paleta de 256 cores, com quantidades iguais de preenchimento preto no início e preenchimento branco no final. A paleta é simétrica, o que significa que, se os níveis de tinta no índice N forem adicionados àqueles no índice (256 - N), o resultado será preto (níveis ciano, magenta e amarelo = 2).

    Índice de paleta(índice 3x3x3) Nível ciano0 a 2 Magenta Level0 a 2 Nível Amarelo0 a 2

    0 a 113

    Preto

    2

    2

    2

    114 (0)

    Preto

    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)

    Copiado para o índice 128

    1

    1

    1

    128 (14)

    Duplicata de entrada no índice 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)

    Branca

    0

    0

    0

    142 a 255

    Branca

    0

    0

    0

  • Se a paleta solicitada for uma paleta de modo CMY (não uma paleta de modo CMY_INVERTED), para valores de CMYMask de 3 a 255, os bits de índice de 8 bits por pixel renderizados têm o seguinte significado. Nesse caso, os padrões de bit representam níveis de tinta que podem ser usados diretamente sem tradução. Isso também se aplica quando um índice de bytes do modo CMY_INVERTED é mapeado para o modo CMY usando um membro CMY332Idx de uma tabela de tradução. Consulte Traduzir índices de meio-tom de 8 bits por pixel para níveis de tinta para obter mais informações.
  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)