ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : カラー

SophiaFramework では、色の演算に関するクラスとして、単純な RGB 値で色を表すクラス (SFXRGBColor) 、ベベル矩形を描画するときに使用する複数の色をまとめたクラス (SFXBevelColor)、フレームを描画するときに使用するフレームの枠と影の色をまとめたクラス (SFXFrameColor) が提供されます。 ※ SophiaFramework では、RGBVAL 型ではなく SFXRGBColor クラスを使って色を表します。

SFXFrameColor クラスを使ってフレームを描画する

SFXFrameColor クラスは、フレームの枠と影の部分の色をまとめて管理するためのクラスです。

このクラスは SFXGraphics クラスでフレームを描画する場合に利用します。フレームの各部分の色について演算したり、フレーム全体について色演算できます。

※ 数値がオーバーフローする場合や、アンダーフローする場合は適切に処理されます。

SFXFrameColor クラスの使用方法
Void SFXColorExplainer::_SFXFrameColor(Void) const
{
    // フレーム色定数を準備する
    // ( 以下のフレーム色は、緑色の枠と赤色の影を表す )

    static SFXFrameColor::AtomRecConst frame = {
        {0x00, 0x00, 0xFF, 0x00}, {0x00, 0xFF, 0x00, 0x00}
    };
    SFXGraphicsPtr graphics;

    // グラフィック オブジェクトを取得する

    graphics = SFXGraphics::GetInstance();
    if (graphics != null) {

        // フレームを描画する
        // ( フレームは指定した矩形の外側に描画される )

        graphics->DrawFrame(SFXRectangle(20, 20, 40, 40), frame);

        // 画面をアップデートする

        graphics->Update();
    }
    return;
}
      

SFXBevelColor クラスを使ってべベル矩形を描画する

SFXBevelColor クラスは、ベベル矩形のライト・ベース・ダークの各部分の色をまとめて管理するためのクラスです。( 「ベベル矩形」とは立体的に見える長方形のことです。 )

このクラスは SFXGraphics クラスでベベル矩形を描画する場合に利用します。ベベル矩形の各部分の色について演算したり、全体について色演算できます。

※ 数値がオーバーフローする場合や、アンダーフローする場合は適切に処理されます。

SFXBevelColor クラスの使用方法
Void SFXColorExplainer::_SFXBevelColor(Void) const
{
    // 青色のベース色定数を準備する

    static SFXRGBColor::AtomRecConst color = {
        0x00, 0x88, 0x88, 0xFF
    };
    SFXRGBColor temp;
    SFXBevelColor bevel;
    SFXGraphicsPtr graphics;

    // べベル色のライト部分・ベース部分・ダーク部分を青色に設定する

    bevel.Set(color, color, color);

    // ライト部分の各要素に 0x66 を加算する

    bevel.AddLightRGB(0x66);

    // ダーク部分の各要素から 0x44 を減算する

    bevel.SubDarkRGB(0x44);

    // グラフィック オブジェクトを取得する

    graphics = SFXGraphics::GetInstance();
    if (graphics != null) {

        // べベル矩形を描画する

        graphics->FillBevelRectangle(SFXRectangle(20, 20, 40, 40), bevel);

        // べベル色のライト部分とダーク部分を入れ替える

        temp = bevel.GetLight();
        bevel.SetLight(bevel.GetDark());
        bevel.SetDark(temp);

        // べベル矩形を描画する

        graphics->FillBevelRectangle(SFXRectangle(24, 24, 32, 32), bevel);

        // 画面をアップデートする

        graphics->Update();
    }
    return;
}
      

SFXRGBColor クラスを使って色の演算を行う

SFXRGBColor クラスは RGB 値にあわせてアルファ値を管理するためのクラスです。

BREW では RGBVAL 型を使って色を表しますが、SophiaFramework では SFXRGBColor クラスを利用します。

このクラスを利用すると色の演算を簡単に行えます。たとえば、色を明るくする場合や暗くする場合など関数を呼び出すだけで色を調整できます。

※ 数値がオーバーフローする場合や、アンダーフローする場合は適切に処理されます。

SFXRGBColor クラスの使用方法
Void SFXColorExplainer::_SFXRGBColor(Void) const
{
    // 透明度の違う赤色を準備する
    // red1 変数は通常のコンストラクタでの初期化する
    // red2 変数は POD 構造体を利用した定数初期化する
    // ( RVCT for BREW では、red2 変数は定数として扱われるので
    //   実行時初期化を防止することが可能 )
    // コンストラクタを利用する場合は、左から RGBA の順序で記述する
    // POD 構造体を利用する場合は、左から ARGB の順序で記述する

    SFXRGBColor red1(0xFF, 0x00, 0x00, 0x00);
    static SFXRGBColor::AtomRecConst red2 = {
        0xFF, 0xFF, 0x00, 0x00
    };
    SFXRGBColor green;

    // Set() 関数を使用して緑色に設定する

    green.Set(0x00, 0xFF, 0x00, 0x00);
    TRACE("r = %02X, g = %02X, b = %02X, a = %02X", green.GetRed(), green.GetGreen(), green.GetBlue(), green.GetAlpha());

    // 各要素に値を加算する

    green.Add(0x88, 0x00, 0x88, 0x00);
    TRACE("r = %02X, g = %02X, b = %02X, a = %02X", green.GetRed(), green.GetGreen(), green.GetBlue(), green.GetAlpha());

    // 青色の要素から値を減算する

    green.SubBlue(0x44);
    TRACE("r = %02X, g = %02X, b = %02X, a = %02X", green.GetRed(), green.GetGreen(), green.GetBlue(), green.GetAlpha());

    // 各要素から値を減算する
    // ( 演算結果がアンダーフローするときは、自動的に最小値になる )

    green.Sub(0xFF, 0x00, 0xFF, 0x00);
    TRACE("r = %02X, g = %02X, b = %02X, a = %02X", green.GetRed(), green.GetGreen(), green.GetBlue(), green.GetAlpha());

    // 緑色の要素に値を加算する
    // ( 演算結果がオーバーフローするときは、自動的に最大値になる )

    green.AddGreen(0x44);
    TRACE("r = %02X, g = %02X, b = %02X, a = %02X", green.GetRed(), green.GetGreen(), green.GetBlue(), green.GetAlpha());

    // 全ての要素を比較する

    TRACE("red1.Equals(red2) = %s", (red1.Equals(red2)) ? ("true") : ("false"));

    // 赤・緑・青の要素だけを比較する

    TRACE("red1.EqualsRGB(red2) = %s", (red1.EqualsRGB(red2)) ? ("true") : ("false"));
    return;
}