ColorToPRGB

Converte il tipo color nel tipo uint per ottenere una rappresentazione ARGB premultiplied del colore - PRGB. Il formato colore PRGB viene utilizzato durante la creazione di risorse grafiche, output di testo e nella classe della libreria standard CCanvas con il formato colore COLOR_FORMAT_ARGB_RAW (i componenti non vengono elaborati dal terminale e devono essere preparati correttamente dall'utente).

uint  ColorToPRGB(
   color  clr,          // colore convertito in formato color
   uchar  alpha=255     // canale alfa che controlla la trasparenza del colore
   );

Parametri

clr

[in] Valore del colore in una variabile di tipo color.

alpha

[in] Valore del canale alfa, per ottenere il colore nel formato ARGB. È impostato da 0 (il colore del pixel sovrapposto non modifica affatto la visualizzazione del pixel sottostante) a 255 (il colore è sovrapposto completamente e si sovrappone al colore del pixel sottostante). La trasparenza del colore in termini percentuali viene calcolata come (1-alfa/255)*100%, cioè più basso è il valore del canale alfa, più trasparente è il colore.

Valore restituito

Rappresentazione del colore in formato ARGB, dove quattro byte di tipo uint contengono i valori Alfa, Rosso, Verde, Blu (canale alfa, rosso, verde, blu).

Nota

In cosa il PRGB differisce dall'ARGB?

Esistono due rappresentazioni comuni del colore RGBA con un canale alfa:

  • straight (normale) ARGB - RGB è memorizzato "così com'è", alfa è separato;
  • premultiplied (PRGB) - RGB è già moltiplicato per alfa.

La modalità COLOR_FORMAT_ARGB_RAW presuppone che i componenti colore siano già preparati correttamente e il terminale non li "normalizza/ricalcola". Pertanto, negli scenari in cui è previsto il colore premultiplied (premoltiplicato), è PRGB che dovrebbe essere passato, altrimenti potrebbero verificarsi artefatti/disallineamenti visivi durante il rendering.

Il colore PRGB viene calcolato con la formula:

R = R * A / 255

G = G * A / 255

B = B * A / 255

A = A 

Casi particolari:

  • quando alfa = 255 il risultato coincide con ColorToARGB(clr,255) (la moltiplicazione non cambia RGB);
  • quando alfa = 0 il risultato diventa 0x00000000 (pixel completamente trasparente, RGB = 0).

Esempio:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uchar alpha = 0x55// 0x55 = 85; trasparenza ~ (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)
   */
}

Vedi anche

Risorse, ColorToARGB, ResourceCreate(), TextOut(), Tipo color, Tipi char, short, int e long