Class: RbSDL2::RWObject

Inherits:
RWOps
  • Object
show all
Defined in:
lib/rb_sdl2/rw_ops/rw_object.rb

Defined Under Namespace

Classes: CloseCallback, ReadCallback, SeekCallback, SizeCallback, WriteCallback

Instance Method Summary collapse

Methods inherited from RWOps

#close, #closed?, open, #pos=, #read, #seek, #size, #tell, #to_ptr, #write

Constructor Details

#initialize(obj) ⇒ RWObject

obj 引数には Ruby の IO オブジェクトのように振る舞うオブジェクトを与える。 期待される振る舞いは close, read, seek, size, tell, write メソッド呼び出しに応答すること。 メソッドが無い場合やメソッドから例外が出た場合は SDL 側にエラー値を戻す。 autoclose 引数に true を与えた場合 close メソッドの呼び出し、GC の回収時に obj 引数に与えたオブジェクトを クローズする。 C のスコープへ渡す場合、ポインターが利用されている間 RWOps オブジェクトを生存させる必要がある。

Raises:



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/rb_sdl2/rw_ops/rw_object.rb', line 92

def initialize(obj)
  ptr = ::SDL.AllocRW
  raise RbSDL2Error if ptr.null?
  super(
    begin
      # メンバーの関数ポインターが NULL であってはならない。
      @st = ::SDL::RWops.new(ptr)
      # 引数に与えた proc 内で例外が出たときは SDL へ例外メッセージがセットされエラーを表す戻り値が渡される。
      # デバッグモードの時は Ruby 側へ例外を出す。
      # close_proc: 引数はなし。戻り値は無視される。RWops ポインタの開放を行う必要はない。
      # read_proc:  引数に読み出すバイト数。戻り値は文字列。
      # seek_proc:  引数に offset, whence。IO#seek を参照。戻り値は現在位置(IO#tell)。
      # size_proc:  引数はなし。戻り値はバイト数。不明な場合は何らかの例外を出す。
      # write_proc: 引数に書き込む文字列。戻り値は実際に書き込んだバイト数。
      @st[:close] = @close_callback = CloseCallback.new {} # obj.close しない。autoclose=false
      @st[:read] = @read_callback = ReadCallback.new { |length| obj.read(length) }
      @st[:seek] = @seek_callback = SeekCallback.new { |offset, whence| obj.seek(offset, whence); obj.tell }
      @st[:size] = @size_callback = SizeCallback.new { obj.size }
      @st[:write] = @write_callback = WriteCallback.new { |str| obj.write(str) }
      RWOpsPointer.new(ptr)
    rescue => e
      ::SDL.FreeRW(ptr)
      raise e
    end
  )
  @obj = obj
end

Instance Method Details

#__getobj__Object



120
# File 'lib/rb_sdl2/rw_ops/rw_object.rb', line 120

def __getobj__ = @obj

#inspectObject



122
123
124
# File 'lib/rb_sdl2/rw_ops/rw_object.rb', line 122

def inspect
  "#<#{self.class.name}:#{@obj.inspect}#{closed? ? " (closed)" : nil}>"
end