Class: Rixmap::Color

Inherits:
Data
  • Object
show all
Defined in:
src/rixmapcore.cxx,
src/rixmapcore.cxx

Overview

RGBカラー情報クラス.

Examples:

c0 = Rixmap::Color.new(16, 32, 48)        # RGBカラー
c1 = Rixmap::Color.new(16, 32, 48, 96)    # RGBAカラー
g0 = Rixmap::Color.new(128)               # グレースケール
g1 = Rixmap::Color.new(128, 128)          # グレースケール (αチャンネル付)
h0 = RIxmap::Color.new("#00BBCC")         # HTML色表現

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.new(html) ⇒ Rixmap::Color .new(luminance, alpha = 255) ⇒ Rixmap::Color .new(red, green, blue, alpha = 255) ⇒ Rixmap::Color

カラーオブジェクトを取得します. 作成されたインスタンスはGCで回収されるまでキャッシュされるため、 既存インスタンスがあればそれを返します.

Overloads:

  • .new(html) ⇒ Rixmap::Color

    Parameters:

    • html (String)

      HTMLによる色表現. この場合は透明度を指定できません.

  • .new(luminance, alpha = 255) ⇒ Rixmap::Color

    Parameters:

    • luminance (Integer)

      輝度値 (グレースケール値) この場合は #red, #green, #blue それぞれに同じ値が設定されます.

    • alpha (Integer) (defaults to: 255)

      透明度

  • .new(red, green, blue, alpha = 255) ⇒ Rixmap::Color

    Parameters:

    • red (Integer)

      赤要素値

    • green (Integer)

      緑要素値

    • blue (Integer)

      青要素値

    • alpha (Integer) (defaults to: 255)

      透明度

Returns:



1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
# File 'src/rixmapcore.cxx', line 1102

static VALUE Color_New(int argc, VALUE* argv, VALUE self) {
    // 引数解析
    VALUE arg0, arg1, arg2, arg3;
    rb_scan_args(argc, argv, "13", &arg0, &arg1, &arg2, &arg3);

    // 引数解析
    uint8_t red = 0, green = 0, blue = 0, alpha = 255;
    switch (argc) {
    case 1:     // HTML形式 or 輝度値のみ
        if (RB_TYPE_P(arg0, T_STRING)) {
            // HTML形式として解析する
            {
                long  codeSize = RSTRING_LEN(arg0);
                char* codeData = StringValueCStr(arg0);

                if (codeData[0] == '#') {
                    long codeLength = codeSize -1;
                    long codeValue = 0;
                    switch (codeLength) {
                    case 3:     // 3桁 (RGB各1桁表現)
                        codeValue = std::strtol(&(codeData[1]), NULL, 16);      // 16進数として解析
                        red   = (codeValue & 0x00000F00) >> 8;
                        green = (codeValue & 0x000000F0) >> 4;
                        blue  = (codeValue & 0x0000000F);
                        red   += (red   << 4);
                        green += (green << 4);
                        blue  += (blue  << 4);
                        break;

                    case 6:     // 6桁 (RGB各2桁表現
                        codeValue = std::strtol(&(codeData[1]), NULL, 16);
                        red   = (codeValue & 0x00FF0000) >> 16;
                        green = (codeValue & 0x0000FF00) >> 8;
                        blue  = (codeValue & 0x000000FF);
                        break;

                    default:
                        // HTMLカラーコードとしてはおかしい
                        rb_raise(rb_eArgError, "unexpected HTML Color: %s", codeData);
                        break;
                    }
                } else {
                    // 先頭が '#' で始まっていてほしい
                    rb_raise(rb_eArgError, "unexpected HTML Color: %s", codeData);
                }
            }
        } else {
            // 輝度値をRGBに設定
            {
                uint8_t luminance = ROUND2BYTE(NUM2INT(rb_Integer(arg0)));
                red   = luminance;
                green = luminance;
                blue  = luminance;
            }
        }
        break;
    case 2:     // 輝度値 + 透明度
        {
            uint8_t luminance = ROUND2BYTE(NUM2INT(rb_Integer(arg0)));
            red   = luminance;
            green = luminance;
            blue  = luminance;
            alpha = ROUND2BYTE(NUM2INT(rb_Integer(arg1)));
        }
        break;
    case 3:     // RGB値
        red   = ROUND2BYTE(NUM2INT(rb_Integer(arg0)));
        green = ROUND2BYTE(NUM2INT(rb_Integer(arg1)));
        blue  = ROUND2BYTE(NUM2INT(rb_Integer(arg2)));
        break;
    case 4:     // RGB + 透明度
        red   = ROUND2BYTE(NUM2INT(rb_Integer(arg0)));
        green = ROUND2BYTE(NUM2INT(rb_Integer(arg1)));
        blue  = ROUND2BYTE(NUM2INT(rb_Integer(arg2)));
        alpha = ROUND2BYTE(NUM2INT(rb_Integer(arg3)));
        break;
    default:
        // ココには来ないとは思う
        rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..4)", argc);
        break;
    }

    Rixmap::Color color(red, green, blue, alpha);
    return RixmapColorPool::Get(color);
}

Instance Method Details

#==(argObject) ⇒ Boolean

オブジェクトと比較し、同じカラーかどうかを返します.

Parameters:

  • obj (Object)

    比較対象のオブジェクト

Returns:

  • (Boolean)

    同じカラーを表現しているならtrue



1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
# File 'src/rixmapcore.cxx', line 1246

static VALUE Color_operatorEquals(VALUE self, VALUE argObject) {
    if (RTEST(rb_obj_is_kind_of(argObject, cRixmapColor))) {
        Rixmap::ColorData* _this = rixmap_unwrap<Rixmap::ColorData>(self);
        Rixmap::ColorData* _that = rixmap_unwrap<Rixmap::ColorData>(argObject);

        if (*_this == *_that) {
            return Qtrue;
        } else {
            return Qfalse;
        }
    } else {
        return Qfalse;
    }
}

#[](argOffset) ⇒ Integer?

配列とみなし、指定ししたオフセットに対応する要素のバイトデータを取得します.

配列としての並びは #to_a を参照してください.

Parameters:

  • offset (Integer)

    取得オフセット

Returns:

  • (Integer, nil)

    対応するバイトデータ. 範囲外の場合はnil.

See Also:



1270
1271
1272
1273
1274
1275
1276
1277
1278
# File 'src/rixmapcore.cxx', line 1270

static VALUE Color_offsetGet(VALUE self, VALUE argOffset) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    size_t offset = NUM2ULONG(rb_Integer(argOffset));
    if (/* 0 <= offset && */ offset < 4) {
        return INT2FIX((*data)[offset]);
    } else {
        return Qnil;
    }
}

#alphaInteger

透明度を取得します.

Returns:

  • (Integer)

    透明度



1223
1224
1225
1226
# File 'src/rixmapcore.cxx', line 1223

static VALUE Color_getAlpha(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return INT2FIX(data->getAlpha());
}

#blueInteger

青要素値を取得します.

Returns:

  • (Integer)

    青要素値



1213
1214
1215
1216
# File 'src/rixmapcore.cxx', line 1213

static VALUE Color_getBlue(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return INT2FIX(data->getBlue());
}

#greenInteger

緑要素値を取得します.

Returns:

  • (Integer)

    緑要素値



1203
1204
1205
1206
# File 'src/rixmapcore.cxx', line 1203

static VALUE Color_getGreen(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return INT2FIX(data->getGreen());
}

#inspectString

オブジェクトとしての文字列表現を返します.

Returns:

  • (String)

    オブジェクト文字列表現



1316
1317
1318
1319
1320
1321
1322
1323
# File 'src/rixmapcore.cxx', line 1316

static VALUE Color_inspect(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return rb_enc_sprintf(
            rb_usascii_encoding(),
            "#<%s:%p red=%d, green=%d, blue=%d, alpha=%d>",
            rb_obj_classname(self), reinterpret_cast<void*>(self),
            data->getRed(), data->getGreen(), data->getBlue(), data->getAlpha());
}

#luminanceInteger

輝度値を取得します.

(#red + #green + #blue) / 3 と同じです.

Returns:

  • (Integer)

    輝度値



1235
1236
1237
1238
# File 'src/rixmapcore.cxx', line 1235

static VALUE Color_getLuminance(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return INT2FIX(data->getLuminance());
}

#redInteger

赤要素値を取得します.

Returns:

  • (Integer)

    赤要素値



1193
1194
1195
1196
# File 'src/rixmapcore.cxx', line 1193

static VALUE Color_getRed(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return INT2FIX(data->getRed());
}

#to_aArray<Integer>

各要素値を持った配列を返します.

配列の中身は [R, G, B, A] の並びになります.

Examples:

color = Rixmap::Color.new(10, 20, 30, 255)
color.to_a     #=> [10, 20, 30, 255]

Returns:

  • (Array<Integer>)

    要素配列

See Also:



1301
1302
1303
1304
1305
1306
1307
1308
1309
# File 'src/rixmapcore.cxx', line 1301

static VALUE Color_toArray(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    VALUE elems = rb_ary_new();
    rb_ary_store(elems, 0, INT2FIX(data->getRed()));
    rb_ary_store(elems, 1, INT2FIX(data->getGreen()));
    rb_ary_store(elems, 2, INT2FIX(data->getBlue()));
    rb_ary_store(elems, 3, INT2FIX(data->getAlpha()));
    return elems;
}

#to_iInteger

整数値に変換したカラー情報を返します.

Returns:

  • (Integer)

    カラーの整数値表現



1285
1286
1287
1288
# File 'src/rixmapcore.cxx', line 1285

static VALUE Color_toInteger(VALUE self) {
    Rixmap::ColorData* data = rixmap_unwrap<Rixmap::ColorData>(self);
    return ULONG2NUM(data->getValue());
}