image.rb 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. class Image
  2. attr_reader :layers
  3. attr_accessor :editormap
  4. def initialize(filename = nil)
  5. @editormap = EditorMap.new(true)
  6. @editormap.set_bounding_rect(CL_Rect.new(0, 0, 1024, 768))
  7. @editormap.set_background_color(CL_Color.new(255, 255, 255))
  8. @objectmap = ObjectLayer.new()
  9. @editormap.add_layer(@objectmap.to_layer())
  10. @layers = []
  11. if filename then
  12. load(filename)
  13. set_active_layer(0)
  14. else
  15. add_layer()
  16. set_active_layer(0)
  17. end
  18. end
  19. def set_active_layer(i)
  20. if (i >= 0 && i < @layers.size) then
  21. BitmapLayer.set_current(@layers[i])
  22. end
  23. end
  24. def add_layer(filename = nil)
  25. if filename then
  26. layer = BitmapLayer.new(make_pixelbuffer(filename))
  27. @layers.push(layer)
  28. @objectmap.add_object(layer.to_object())
  29. return layer
  30. else
  31. layer = BitmapLayer.new(1024, 768)
  32. @layers.push(layer)
  33. @objectmap.add_object(layer.to_object())
  34. return layer
  35. end
  36. end
  37. def layers_count()
  38. return @layers.size
  39. end
  40. def activate(workspace)
  41. workspace.set_map(@editormap)
  42. BitmapLayer.set_current(@layers[0])
  43. ObjectLayer.set_current(@objectmap)
  44. connect(@editormap.sig_change(), proc{$gui.on_map_change()})
  45. end
  46. def load(filename)
  47. tree = sexpr_read_from_file(filename)
  48. if tree == nil
  49. raise("Couldn't load level: %s" % filename)
  50. end
  51. # Skip flexlay-paint tag
  52. tree = tree[1..-1]
  53. puts "REst: #{tree.length}"
  54. while not tree.empty? do
  55. (tag, *data) = tree[0]
  56. puts "Tag: #{tag}"
  57. if tag == "layer" then
  58. puts "MUMU LAYER"
  59. parse_layer(data)
  60. end
  61. tree = tree[1..-1]
  62. puts "REst2: #{tree.length}"
  63. end
  64. set_active_layer(0)
  65. end
  66. def parse_layer(tree)
  67. layer = add_layer()
  68. while not tree.empty? do
  69. (tag, *data) = tree[0]
  70. if tag == "stroke" then
  71. parse_stroke(layer, data)
  72. end
  73. tree = tree[1..-1]
  74. end
  75. puts ""
  76. end
  77. def parse_stroke(layer, tree)
  78. stroke = Stroke.new()
  79. sprite_drawer = SpriteStrokeDrawer.new()
  80. # FIXME: insert loader for brush here
  81. DrawerProperties.current().set_brush(GeneratedBrush.new(BRUSH_SHAPE_CIRCLE,
  82. 32, # radius
  83. 2, # spikes
  84. 0.75, # hardness
  85. 1.0, # aspect
  86. 0).to_brush()) # angle
  87. sprite_drawer.set_color(CL_Color.new(0, 0, 0, 155))
  88. sprite_drawer.set_size(1.0)
  89. stroke.set_drawer(sprite_drawer.to_drawer())
  90. while not tree.empty? do
  91. (tag, *data) = tree[0]
  92. if tag == "dab" then
  93. time = get_value_from_tree(["time", "_"], data, 0)
  94. position = get_value_from_tree(["position"], data, [0, 0])
  95. pressure = get_value_from_tree(["pressure", "_"], data, 1.0)
  96. tilt = get_value_from_tree(["tilt", "_"], data, [0, 0])
  97. # FIXME: No tilt support
  98. stroke.add_dab(Dab.new(position[0].to_f, position[1].to_f, pressure.to_f))
  99. elsif tag == "drawer" then
  100. if data[0][0] == "sprite-stroke-drawer" then
  101. data = data[0][1..-1]
  102. mode = get_value_from_tree(["mode", "_"], data, SpriteStrokeDrawer::DM_NORMAL)
  103. spacing = get_value_from_tree(["spacing", "_"], data, 15.0)
  104. size = get_value_from_tree(["size", "_"], data, 1.0)
  105. color = get_value_from_tree(["color"], data, [0, 255, 0, 255])
  106. brush = get_value_from_tree(["brush", "generated-brush"], data, [])
  107. drawer = SpriteStrokeDrawer.new()
  108. drawer.set_spacing(spacing)
  109. drawer.set_mode(mode)
  110. drawer.set_size(size)
  111. drawer.set_color(CL_Color.new(color[0], color[1], color[2], color[3]))
  112. drawer.set_brush(GeneratedBrush.new(get_value_from_tree(["shape", "_"], brush, 0),
  113. get_value_from_tree(["radius", "_"], brush, 32),
  114. get_value_from_tree(["spikes", "_"], brush, 2),
  115. get_value_from_tree(["hardness", "_"], brush, 0.75),
  116. get_value_from_tree(["aspect-ratio", "_"], brush, 1.0),
  117. get_value_from_tree(["angle", "_"], brush, 0)).to_brush)
  118. stroke.set_drawer(drawer.to_drawer)
  119. else
  120. puts "Error: Unknown drawer: #{data[0][0]}"
  121. end
  122. end
  123. tree = tree[1..-1]
  124. end
  125. print "."
  126. $stdout.flush
  127. layer.add_stroke(stroke)
  128. end
  129. def save(filename)
  130. f = File.new(filename, "w")
  131. f.puts "(flexlay-paint"
  132. @layers.each { |layer|
  133. f.puts "(layer"
  134. layer.get_strokes().each{|stroke|
  135. f.puts " (stroke"
  136. # FIXME: This won't work with a real smartptr!
  137. sprite_stroke_drawer = SpriteStrokeDrawer.new(stroke.get_drawer())
  138. f.puts " (drawer (sprite-stroke-drawer"
  139. f.puts " (mode #{sprite_stroke_drawer.get_mode})"
  140. f.puts " (spacing #{sprite_stroke_drawer.get_spacing})"
  141. f.puts " (size #{sprite_stroke_drawer.get_size})"
  142. f.puts " (color "\
  143. "#{sprite_stroke_drawer.get_color.get_red} " \
  144. "#{sprite_stroke_drawer.get_color.get_green} " \
  145. "#{sprite_stroke_drawer.get_color.get_blue} " \
  146. "#{sprite_stroke_drawer.get_color.get_alpha})"
  147. # FIXME: This won't work with multilpe brush types
  148. brush = GeneratedBrush.new(sprite_stroke_drawer.get_brush())
  149. f.puts " (brush (generated-brush"
  150. f.puts " (shape #{brush.get_shape})"
  151. f.puts " (radius #{brush.get_radius})"
  152. f.puts " (spikes #{brush.get_spikes})"
  153. f.puts " (hardness #{brush.get_hardness})"
  154. f.puts " (aspect-ratio #{brush.get_aspect_ratio})"
  155. f.puts " (angle #{brush.get_angle})"
  156. f.puts " ))"
  157. f.puts " ))"
  158. stroke.get_dabs().each{|dab|
  159. f.puts " (dab"
  160. f.puts " (time #{dab.time})"
  161. f.puts " (position #{dab.pos.x} #{dab.pos.y})"
  162. f.puts " (pressure #{dab.pressure})"
  163. f.puts " (tilt #{dab.tilt.x} #{dab.tilt.y})"
  164. f.puts ")"
  165. }
  166. f.puts ")"
  167. }
  168. f.puts ")"
  169. }
  170. f.puts ")"
  171. f.close()
  172. end
  173. end
  174. # EOF #