Class: Rixmap::ImageIO::BaseImageIO

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

Overview

画像入出力処理のベースクラス.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) (private)

画像入出力実装クラスを初期化します.

オプションパラメータが指定されている場合は、キーをインスタンス変数名として値を設定していきます.

Parameters:

  • options (Hash) (defaults to: {})

    オプションパラメータ.



334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# File 'src/rixmapio.cxx', line 334

static VALUE BaseImageIO_initialize(int argc, VALUE* argv, VALUE self) {
    VALUE argOptions = Qnil;
    rb_scan_args(argc, argv, "01", &argOptions);

    VALUE objOptions = Qnil;
    if (NIL_P(argOptions)) {
        objOptions = rb_hash_new();
    } else {
        if (RB_TYPE_P(argOptions, T_HASH)) {
            objOptions = argOptions;
        } else {
#if HAVE_RB_HASH
            objOptions = rb_Hash(argOptions);
#else
            objOptions = rb_hash_new();
#endif
        }
    }

    VALUE keys = rb_funcall(objOptions, rb_intern("keys"), 0);
    VALUE ivPrefix = rb_str_new_cstr("@");
    long nkey = RARRAY_LEN(keys);
    for (long i = 0; i < nkey; i++) {
        VALUE key = rb_ary_entry(keys, i);
        VALUE val = rb_hash_lookup(objOptions, key);
        VALUE strKey = rb_String(key);
        VALUE ivName = rb_str_dup(ivPrefix);
        rb_str_concat(ivName, strKey);
        rb_ivar_set(self, rb_intern_str(ivName), val);
    }

    return self;
}

Class Method Details

.readable?(argMagic) ⇒ Boolean

画像の先頭バイトからその画像がこのクラスで読み込めるかを判定します.

Parameters:

  • magic (String)

    マジックバイトデータ

Returns:

  • (Boolean)

    読み込める形式の場合はtrue



311
312
313
# File 'src/rixmapio.cxx', line 311

static VALUE BaseImageIO_IsReadableStatic(VALUE klass, VALUE argMagic) {
    return Qfalse;
}

.writable?(argImage) ⇒ Boolean

指定画像がこのクラスで書き込めるかを判定します.

Parameters:

Returns:

  • (Boolean)

    書き込める形式の場合はtrue



321
322
323
# File 'src/rixmapio.cxx', line 321

static VALUE BaseImageIO_IsWritableStatic(VALUE klass, VALUE argImage) {
    return Qfalse;
}

Instance Method Details

#decode(data, options = {}) ⇒ Rixmap::Image

バイト列から画像を復元します.

復元処理は各フォーマット毎にサブクラスで実装してください.

Returns 復元された画像オブジェクト.

Parameters:

  • data (String)

    画像データが入っているバイト列データ.

  • options (Hash) (defaults to: {})

    実行時オプションパラメータ.

Returns:

Raises:

  • NotImplementedError バイト列からの復元処理が実装されていない場合.



418
419
420
# File 'src/rixmapio.cxx', line 418

static VALUE BaseImageIO_decode(int argc, VALUE* argv, VALUE self) {
    rb_raise(rb_eNotImpError, "%s#%s is not implemented", rb_obj_classname(self), rb_id2name(rb_frame_this_func()));
}

#encode(image, options = {}) ⇒ String

画像をバイト列へと変換します.

変換処理は各フォーマット毎にサブクラスで実装してください.

Returns 画像データを含むバイト列.

Parameters:

  • image (Rixmap::Image)

    変換対象の画像.

  • options (Hash) (defaults to: {})

    実行時のオプションパラメータ.

Returns:

  • (String)

    画像データを含むバイト列

Raises:

  • NotImplementedError バイト列への変換処理が実装されていない場合.



403
404
405
# File 'src/rixmapio.cxx', line 403

static VALUE BaseImageIO_encode(int argc, VALUE* argv, VALUE self) {
    rb_raise(rb_eNotImpError, "%s#%s is not implemented", rb_obj_classname(self), rb_id2name(rb_frame_this_func()));
}

#open(path, options = {}) ⇒ Rixmap::Image

指定したパスから画像を読み込みます.

Returns 読み込まれた画像.

Parameters:

  • path (String)

    ファイルパス

  • options (Hash) (defaults to: {})

    実行時オプションパラメータ

Options Hash (options):

  • :length (Integer)

    読み込むファイルの長さ (バイト数)

  • :offset (Integer)

    読み込むファイルの位置

Returns:

See Also:



522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
# File 'src/rixmapio.cxx', line 522

static VALUE BaseImageIO_open(int argc, VALUE* argv, VALUE self) {
    VALUE argPath, argOptions;
    rb_scan_args(argc, argv, "11", &argPath, &argOptions);

    // 型チェックすべきか
    VALUE objPath    = rb_String(argPath);
    VALUE objOptions = Qnil;
    if (RB_TYPE_P(argOptions, T_HASH)) {
        objOptions = argOptions;
    } else {
        objOptions = rb_hash_new();
    }

    // オプションパラメータ
    VALUE optLength = rb_hash_lookup(objOptions, ID2SYM("length"));
    VALUE optOffset = rb_hash_lookup(objOptions, ID2SYM("offset"));
    VALUE objOffset = Qnil;
    if (NIL_P(optOffset)) {
        objOffset = INT2FIX(0);
    } else {
        objOffset = rb_Integer(optOffset);
    }

    // バイト列を取得
    VALUE klsIO = rb_path2class("IO");
    VALUE objBytes = rb_funcall(klsIO, rb_intern("binread"), 3, objPath, optLength, objOffset);

    // 画像を復元
    // TODO ココで発生する例外対処
    VALUE objImage = rb_funcall(self, rb_intern("decode"), 2, objBytes, objOptions);

    // 戻る
    return objImage;
}

#read(io, options = {}) ⇒ Rixmap::Image

指定されたストリームから画像を読み込みます.

Returns 読み込まれた画像.

Parameters:

  • io (IO, StringIO)

    読み込み用に開かれているストリームオブジェクト

  • options (Hash) (defaults to: {})

    実行時オプションパラメータ

Options Hash (options):

  • :length (Integer)

    読み込むバイト数

Returns:

See Also:



567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
# File 'src/rixmapio.cxx', line 567

static VALUE BaseImageIO_read(int argc, VALUE* argv, VALUE self) {
    VALUE argIO, argOptions;
    rb_scan_args(argc, argv, "11", &argIO, &argOptions);

    // 型チェック…?
    VALUE objIO      = argIO;
    VALUE objOptions = Qnil;
    if (RB_TYPE_P(argOptions, T_HASH)) {
        objOptions = argOptions;
    } else {
        objOptions = rb_hash_new();
    }

    // オプションパラメータ
    VALUE optLength = rb_hash_lookup(objOptions, ID2SYM("length"));

    // 読み込む
    VALUE objBytes = rb_funcall(objIO, rb_intern("read"), 1, optLength);

    // 復元
    VALUE objImage = rb_funcall(self, rb_intern("decode"), 2, objBytes, objOptions);

    // 戻る
    return objImage;
}

#readable?(argMagic) ⇒ Boolean

画像の先頭バイトからその画像がこのオブジェクトで読み込めるかどうかを判定します.

Parameters:

  • magic (String)

    マジックバイトデータ

Returns:

  • (Boolean)

    読み込める場合はtrue

See Also:



375
376
377
378
# File 'src/rixmapio.cxx', line 375

static VALUE BaseImageIO_isReadable(VALUE self, VALUE argMagic) {
    VALUE klass = rb_obj_class(self);
    return rb_funcall(klass, rb_intern("readable?"), 1, argMagic);
}

#save(path, image, options = {}) ⇒ Integer

指定したパスへ画像を書き出します.

Returns 書き込んだバイト数.

Parameters:

  • path (String)

    書き込み先ファイルパス

  • image (Rixmap::Image)

    書き込む画像オブジェクト.

  • options (Hash) (defaults to: {})

    実行時オプションパラメータ.

Options Hash (options):

  • :offset (Integer)

    ファイルの書き込み開始位置 (バイト数)

Returns:

  • (Integer)

    書き込んだバイト数

See Also:



433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
# File 'src/rixmapio.cxx', line 433

static VALUE BaseImageIO_save(int argc, VALUE* argv, VALUE self) {
    VALUE argPath, argImage, argOptions;
    rb_scan_args(argc, argv, "21", &argPath, &argImage, &argOptions);

    // 型チェックとか
    if (!RTEST(rb_obj_is_kind_of(argImage, cRixmapImage))) {
        rb_raise(rb_eArgError, "unexpected type of image: %s", rb_obj_classname(argImage));
    }
    VALUE objPath    = rb_String(argPath);
    VALUE objImage   = argImage;
    VALUE objOptions = Qnil;
    if (RB_TYPE_P(argOptions, T_HASH)) {
        objOptions = argOptions;
    } else {
        objOptions = rb_hash_new();
    }

    // 画像のエンコード
    // TODO ここで発生する例外の処理
    VALUE objData = rb_funcall(self, rb_intern("encode"), 2, objImage, objOptions);

    // ファイルの書き込み位置を確認
    VALUE optFileOffset = rb_hash_lookup(objOptions, ID2SYM(rb_intern("offset")));
    VALUE objFileOffset = Qnil;
    if (NIL_P(optFileOffset)) {
        objFileOffset = INT2FIX(0);
    } else {
        objFileOffset = rb_Integer(optFileOffset);
    }

    // 書き込み
    VALUE klsIO = rb_path2class("IO");
    VALUE objWroteBytes = rb_funcall(klsIO, rb_intern("binwrite"), 2, objPath, objData, objFileOffset);

    // 戻す
    return objWroteBytes;
}

#writable?(argImage) ⇒ Boolean

画像がこのオブジェクトで書き込めるかを判定します.

Parameters:

Returns:

  • (Boolean)

    書き込める形式の場合はtrue

See Also:



387
388
389
390
# File 'src/rixmapio.cxx', line 387

static VALUE BaseImageIO_isWritable(VALUE self, VALUE argImage) {
    VALUE klass = rb_obj_class(self);
    return rb_funcall(klass, rb_intern("writable?"), 1, argImage);
}

#write(io, image, options = {}) ⇒ Integer

指定したストリームへ画像を書き込みます.

Returns 書き込んだバイト数.

Parameters:

  • io (IO, StringIO)

    出力用に開かれているストリームオブジェクト

  • image (Rixmap::Image)

    対象画像オブジェクト

  • options (Hash) (defaults to: {})

    実行時オプションパラメータ

Returns:

  • (Integer)

    書き込んだバイト数

See Also:



481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
# File 'src/rixmapio.cxx', line 481

static VALUE BaseImageIO_write(int argc, VALUE* argv, VALUE self) {
    VALUE argIO, argImage, argOptions;
    rb_scan_args(argc, argv, "21", &argIO, &argImage, &argOptions);

    // 型チェックとか
    if (!RTEST(rb_obj_is_kind_of(argImage, cRixmapImage))) {
        rb_raise(rb_eArgError, "unexpected type of image: %s", rb_obj_classname(argImage));
    }
    VALUE objIO      = argIO;       // TODO 型チェックする
    VALUE objImage   = argImage;
    VALUE objOptions = Qnil;
    if (RB_TYPE_P(argOptions, T_HASH)) {
        objOptions = argOptions;
    } else {
        objOptions = rb_hash_new();
    }

    // 画像のエンコード
    // TODO ここで発生する例外の処理
    VALUE objData = rb_funcall(self, rb_intern("encode"), 2, objImage, objOptions);

    // FIXME ここまで #save と同じなのをどうにかしたいよね

    // 書き込む
    VALUE objWroteBytes = rb_funcall(objIO, rb_intern("write"), 1, objData);

    // 戻る
    return objWroteBytes;
}