diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/test_evas.rb | 104 | 
1 files changed, 104 insertions, 0 deletions
diff --git a/test/test_evas.rb b/test/test_evas.rb new file mode 100644 index 0000000..516f35e --- /dev/null +++ b/test/test_evas.rb @@ -0,0 +1,104 @@ +#! /usr/bin/env ruby +# -*- coding: UTF-8 -*- +# +require 'efl/evas' +require 'efl/eina_list' +# +include Efl +# +Evas::init +# +def create_canvas w, h +    pixels = FFI::MemoryPointer.new :int, w*h +    e = Evas::Evas.new +    e.output_method_set Evas::render_method_lookup("buffer") +    e.output_viewport_set 0, 0, w, h +    e.output_size_set w, h +    einfo = Efl::FFI::EvasEngineInfoBuffer.new e.engine_info_get +    einfo[:info][:depth_type] = Efl::FFI::EVAS_ENGINE_BUFFER_DEPTH_ARGB32 +    einfo[:info][:dest_buffer] = pixels +    einfo[:info][:dest_buffer_row_bytes] = w * FFI::type_size(:int); +    einfo[:info][:use_color_key] = 0; +    einfo[:info][:alpha_threshold] = 0; +    einfo[:info][:func][:new_update_region] = nil #FFI::Pointer::NULL; +    einfo[:info][:func][:free_update_region] = nil #FFI::Pointer::NULL; +    e.engine_info_set einfo +    [e,pixels] +end +# +def destroy_canvas c, pixels +    pixels.free +    c.free +end +# +def draw_scene c +    updates = Eina::EinaList.new c.render_updates +    # FIXME needs EinaRectangle +#    updates.each do |u| +#        r = Eina::EinaRectangle.new u +#        puts "UPDATED REGION: pos: #{r[:x]}, #{r[:y]}    size: #{r[:w]}x#{r[:h]}" +#    end +    Evas::render_updates_free updates.ptr +end +# +def save_scene canvas, dest +    einfo = Efl::FFI::EvasEngineInfoBuffer.new canvas.engine_info_get +    w, h = canvas.output_size_get +     # PPM P6 format is dead simple to write: +    p = ::FFI::Pointer.new :int, einfo[:info][:dest_buffer] +    pixels_end = p + (w*h*::FFI.type_size(:int)) +    open(dest,'w') do |f| +        f << "P6\n#{w} #{h}\n255\n" +        while p != pixels_end +            i = p.read_int +            a = [ (i & 0xff0000)>>16, (i & 0x00ff00)>>8, (i & 0x0000ff) ] +            f << a.pack("ccc") +            p = p+::FFI.type_size(:int) +        end + +#    for (; pixels < pixels_end; pixels++) { +#        int r, g, b; +#        r = ((*pixels) & 0xff0000) >> 16; +#        g = ((*pixels) & 0x00ff00) >> 8; +#        b = (*pixels) & 0x0000ff; +#        fprintf(f, "%c%c%c", r, g, b); +#    } +    end +    puts "saved scene as '#{dest}'" +end +# +w = 320 +h = 240 +canvas, pixels = create_canvas w, h +# +bg = Evas::EvasObject.new canvas.object_rectangle_add +bg.color = 255, 255, 255, 255 +bg.move 0, 0 +bg.resize w, h +bg.show +# +draw_scene canvas +# +r1 = Evas::EvasObject.new canvas.object_rectangle_add +r1.color = 255, 0, 0, 255 +r1.move 10, 10 +r1.resize 100, 100 +r1.show +# +r2 = Evas::EvasObject.new canvas.object_rectangle_add +r2.color = 0, 128, 0, 128 +r2.move 10, 10 +r2.resize 50, 50 +r2.show +# +r3 = Evas::EvasObject.new canvas.object_rectangle_add +r3.color = 0, 128, 0, 255 +r3.move 60, 60 +r3.resize 50, 50 +r3.show +# +draw_scene canvas +save_scene canvas, '/tmp/ffi-efl-evas-buffer-simple-render.ppm' +destroy_canvas canvas, pixels +# +Evas::shutdown  | 
