ColorToPRGB

color型をuintに変換して、色の前乗算ARGB表現(PRGB)を取得します。PRGBカラーフォーマットは、グラフィックリソースの作成時、 テキスト出力で使用され、CCanvas標準ライブラリクラスのカラーフォーマットCOLOR_FORMAT_ARGB_RAW(コンポーネントはターミナルで処理されず、ユーザーが正しく準備する必要があります)で使用されます。

uint  ColorToPRGB(
  color  clr,          // カラーフォーマットでの変換済みの色
  uchar  alpha=255     // 色の透明度を制御するアルファチャンネル
  );

パラメータ

clr

[in] color型の変数に格納されている値

alpha

[in] アルファチャンネルの値、カラーフォーマットARGBで色を取得するための値。0(重ねられたピクセルの色が下のピクセルの表示に全く影響しない)から255(色が完全に重なり、下のピクセルの色を覆う)までで設定されます。色の透明度(パーセンテージ)は「(1 - alpha/255) × 100%」で計算されます。つまりアルファチャンネルの値が小さいほど色は透明になります。

戻り値

ARGBフォーマットでの色表現。uint型の4バイトにアルファ、赤、緑、青(アルファチャンネル、赤、緑、青)の値が格納されます。

注意事項

PRGBはARGBとどう違うか?

アルファチャンネル付きのRGBAカラーには、一般的に2つの表現方法があります。

  • 直線(通常)ARGB – RGB は「そのまま」格納され、アルファは別扱い
  • 前乗算(PRGB)– RGB はすでにアルファ値で乗算されている

モードCOLOR_FORMAT_ARGB_RAWは、色の各コンポーネントがすでに正しく準備されており、ターミナルが「正規化/再計算」しないことを前提としています。したがって、前乗算カラーが期待される場合はPRGBを渡す必要があります。そうしないと描画中に視覚的なアーティファクトや不一致が発生する可能性があります。

PRGB色は次の式で計算されます。

R = R * A / 255

G = G * A / 255

B = B * A / 255

A = A

特別なケース:

  • アルファ = 255の場合、結果はColorToARGB(clr,255)と一致します(乗算してもRGBは変わらない)
  • アルファ = 0の場合、結果は0x00000000となります(完全に透明なピクセル、RGB = 0)

例:

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  uchar alpha = 0x55; // 0x55 = 85、透明度 ~ (255-85)/255 * 100% = 66.7%
  color c = clrWhite;
 
  PrintFormat("0x%%.8X - %s", c, ColorToString(c,true));
  PrintFormat("0x%.8X - ARGB (straight)", ColorToARGB(c, alpha));
  PrintFormat("0x%.8X - PRGB (premultiplied)", ColorToPRGB(c, alpha));
  /*
  0x00FFFFFF - clrWhite
  0x55FFFFFF - ARGB(直線)
  0x55555555 - PRGB(前乗算)
  */
}

参照

ResourcesColorToARGBResourceCreate()TextOut()Color型char、short、int、long型