Layer.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. from gi.repository import Gtk, GLib
  2. import PF2.VectorMask as VectorMask
  3. import cv2
  4. class Layer:
  5. def __init__(self, base, name, on_change):
  6. print("init", name)
  7. self.mask = VectorMask.VectorMask()
  8. self.tools = []
  9. self.tool_map = {}
  10. self.name = name
  11. self.enabled = True
  12. self.selected_tool = 0
  13. self.editable = not base
  14. self.opacity = 1.0
  15. self.selector_row = None
  16. self.tool_box = Gtk.FlowBox()
  17. self.tool_box.set_orientation(1)
  18. self.tool_stack = Gtk.Stack()
  19. self.tool_stack.set_transition_type(6)
  20. self.tool_stack.set_homogeneous(False)
  21. self.layer_changed = on_change
  22. def add_tool(self, tool):
  23. print("add tool", tool)
  24. self.tool_box.add(tool.tool_button)
  25. self.tool_stack.add(tool.widget)
  26. self.tool_map[tool.tool_button] = tool
  27. tool.tool_button.connect("clicked", self.on_tool_button_clicked)
  28. tool.connect_on_change(self.on_tool_change)
  29. self.tools += [tool,]
  30. if(len(self.tools) == 1):
  31. tool.tool_button.set_active(True)
  32. def on_tool_change(self, tool, prop):
  33. self.layer_changed(self)
  34. def on_tool_button_clicked(self, sender):
  35. if(sender.get_active()):
  36. self.tool_stack.set_visible_child(self.tool_map[sender].widget)
  37. for key in self.tool_map:
  38. if(key != sender):
  39. key.set_active(False)
  40. elif(self.tool_stack.get_visible_child() == self.tool_map[sender].widget):
  41. sender.set_active(True)
  42. def get_layer_dict(self):
  43. layerDict = {}
  44. # Get tool values
  45. toolDict = {}
  46. for tool in self.tools:
  47. toolDict[tool.id] = tool.get_properties_as_dict()
  48. layerDict["tools"] = toolDict
  49. layerDict["name"] = self.name
  50. layerDict["mask"] = self.mask.get_vector_mask_dict()
  51. layerDict["enabled"] = self.enabled
  52. layerDict["opacity"] = self.opacity
  53. return layerDict
  54. def set_from_layer_dict(self, dict):
  55. print("set_from_layer_dict", dict)
  56. # Load Tool Data
  57. for tool in self.tools:
  58. if(tool.id in dict["tools"]):
  59. GLib.idle_add(tool.load_properties, dict["tools"][tool.id])
  60. # The base layer only has tools.
  61. if(self.editable):
  62. # Load Mask Vectors
  63. self.mask.set_from_vector_mask_dict(dict["mask"])
  64. # Load Layer Name
  65. self.name = dict["name"]
  66. # Load Enabled State
  67. self.enabled = dict["enabled"]
  68. # Load Opacity Fraction
  69. self.opacity = dict["opacity"]
  70. def render_layer(self, baseImage, image, callback=None):
  71. # Only process if the layer is enabled
  72. if(self.enabled and self.opacity != 0.0):
  73. # We are passed a base image (original)
  74. # Make a copy of this to pass through the tools
  75. layer = baseImage.copy()
  76. # Process the Layer
  77. ntools = len(self.tools)
  78. count = 1
  79. for tool in self.tools:
  80. if (callback != None):
  81. # For showing progress
  82. callback(tool.name, ntools, count - 1)
  83. # Call the tool's image processing function
  84. layer = tool.on_update(layer)
  85. count += 1
  86. # Base layer needs no mask processing
  87. if(not self.editable):
  88. image = layer
  89. # Here we would blend with the mask
  90. else:
  91. mask_map = self.mask.get_mask_map()
  92. height, width = layer.shape[:2]
  93. mask_map = cv2.resize(mask_map, (width, height), interpolation=cv2.INTER_AREA)
  94. mask_map = mask_map * self.opacity
  95. inverted_map = (mask_map * -1) + 1
  96. for i in range(0,3):
  97. image[0:, 0:, i] = (layer[0:, 0:, i] * mask_map) + (image[0:, 0:, i] * inverted_map)
  98. return image
  99. def show_all(self):
  100. self.tool_box.show_all()
  101. self.tool_stack.show_all()
  102. for tool in self.tools:
  103. tool.widget.show_all()
  104. tool.tool_button.show_all()
  105. def reset_tools(self):
  106. for tool in self.tools:
  107. tool.reset()
  108. def set_size(self, width, height):
  109. self.mask.set_dimentions(width, height)
  110. def set_opacity(self, opacity):
  111. self.opacity = opacity
  112. self.on_tool_change(None, None)
  113. def set_enabled(self, enabled):
  114. self.enabled = enabled
  115. self.on_tool_change(None, None)