ColorToPRGB

Converte o tipo color para o tipo uint para obter a representação premultiplied ARGB da cor, isto é, PRGB. PRGB O formato de cor é usado ao criar recurso gráfico, saída de texto e na classe da biblioteca padrão CCanvas com o formato de cor COLOR_FORMAT_ARGB_RAW (os componentes não são processados pelo terminal e devem ser corretamente preparados pelo usuário).

uint  ColorToPRGB(
   color  clr,          // cor a ser convertida no formato color
   uchar  alpha=255     // canal alfa que controla a transparência da cor
   );

Parâmetros

clr

[in] Valor da cor em uma variável do tipo color.

alpha

[in] Valor do canal alfa, para obter a cor no formato ARGB. É definido por um valor de 0 (a cor do pixel sobreposto não altera em nada a exibição do pixel subjacente) até 255 (a cor é aplicada totalmente e cobre a cor do pixel subjacente). A transparência da cor em porcentagem é calculada como (1-alpha/255)*100%, ou seja, quanto menor o valor do canal alfa, mais transparente é a cor.

Valor retornado

Representação da cor no formato ARGB, em que, nos quatro bytes do tipo uint, são gravados em ordem os valores Alfa, Red, Green, Blue (canal alfa, vermelho, verde, azul).

Observação

Em que o PRGB difere do ARGB?

Existem duas representações comuns de uma cor RGBA com canal alfa:

  • straight (normal) ARGB, o RGB é armazenado "como está", e o alfa separadamente;
  • premultiplied (PRGB), o RGB já foi multiplicado pelo alfa.

O modo COLOR_FORMAT_ARGB_RAW pressupõe que os componentes de cor já estejam corretamente preparados e o terminal não os "normaliza/não recalcula". Portanto, em cenários em que se espera uma cor premultiplied, é preciso passar exatamente PRGB; caso contrário, podem ocorrer artefatos visuais/divergências na renderização.

A cor PRGB é calculada pela fórmula:

R = R * A / 255

G = G * A / 255

B = B * A / 255

A = A 

Casos especiais:

  • quando alpha = 255, o resultado coincide com ColorToARGB(clr,255) (a pré-multiplicação não altera o RGB);
  • quando alpha = 0, o resultado se torna 0x00000000 (pixel totalmente transparente, RGB = 0).

Exemplo:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
 uchar alpha = 0x55// 0x55 = 85; transparência ~ (255-85)/255 * 100% = 66.7%
   color c = clrWhite;
 
   PrintFormat("0x%.8X - %s"cColorToString(c,true));
   PrintFormat("0x%.8X - ARGB (straight)"ColorToARGB(calpha));
   PrintFormat("0x%.8X - PRGB (premultiplied)"ColorToPRGB(calpha));
   /*
   0x00FFFFFF - clrWhite
   0x55FFFFFF - ARGB (straight)
   0x55555555 - PRGB (premultiplied)
   */
}

Veja também

Recursos, ColorToARGB, ResourceCreate(), TextOut(), Tipo color, Tipos char, short, int e long