1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#! /usr/bin/env ruby
# -*- coding: UTF-8 -*-
#
require 'efl/evas'
#
include Efl
#
Evas::init
#
def create_canvas w, h
pixels = FFI::MemoryPointer.new :int, w*h
e = Evas::REvas.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::Evas::EngineInfoBufferStruct.new e.engine_info_get
einfo[:info][:depth_type] = Efl::Evas::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 = c.render_updates
Evas::render_updates_free updates
# FIXME needs EinaRectangle
# require 'efl/eina/eina_list'
# updates = Eina::EinaList.new c.render_updates
# 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::Evas::EngineInfoBufferStruct.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::REvasObject.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::REvasObject.new canvas.object_rectangle_add
r1.color = 255, 0, 0, 255
r1.move 10, 10
r1.resize 100, 100
r1.show
#
r2 = Evas::REvasObject.new canvas.object_rectangle_add
r2.color = 0, 128, 0, 128
r2.move 10, 10
r2.resize 50, 50
r2.show
#
r3 = Evas::REvasObject.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
|