Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1701 from pypeclub/feature/overscan_color_extract…
Browse files Browse the repository at this point in the history
…_review

Overscan color extract review
  • Loading branch information
iLLiCiTiT authored Jun 16, 2021
2 parents df37372 + 8e0080f commit 61f2e5a
Show file tree
Hide file tree
Showing 9 changed files with 115 additions and 29 deletions.
36 changes: 29 additions & 7 deletions openpype/plugins/publish/extract_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -986,9 +986,21 @@ def rescaling_filters(self, temp_data, output_def, new_repre):
output_width = output_def.get("width") or None
output_height = output_def.get("height") or None

# Overscal color
overscan_color_value = "black"
overscan_color = output_def.get("overscan_color")
if overscan_color:
bg_red, bg_green, bg_blue, _ = overscan_color
overscan_color_value = "#{0:0>2X}{1:0>2X}{2:0>2X}".format(
bg_red, bg_green, bg_blue
)
self.log.debug("Overscan color: `{}`".format(overscan_color_value))

# Convert overscan value video filters
overscan_crop = output_def.get("overscan_crop")
overscan = OverscanCrop(input_width, input_height, overscan_crop)
overscan = OverscanCrop(
input_width, input_height, overscan_crop, overscan_color_value
)
overscan_crop_filters = overscan.video_filters()
# Add overscan filters to filters if are any and modify input
# resolution by it's values
Expand Down Expand Up @@ -1158,9 +1170,10 @@ def rescaling_filters(self, temp_data, output_def, new_repre):
"scale={}x{}:flags=lanczos".format(
width_scale, height_scale
),
"pad={}:{}:{}:{}:black".format(
"pad={}:{}:{}:{}:{}".format(
output_width, output_height,
width_half_pad, height_half_pad
width_half_pad, height_half_pad,
overscan_color_value
),
"setsar=1"
])
Expand Down Expand Up @@ -1707,12 +1720,15 @@ class OverscanCrop:
item_regex = re.compile(r"([\+\-])?([0-9]+)(.+)?")
relative_source_regex = re.compile(r"%([\+\-])")

def __init__(self, input_width, input_height, string_value):
def __init__(
self, input_width, input_height, string_value, overscal_color=None
):
# Make sure that is not None
string_value = string_value or ""

self.input_width = input_width
self.input_height = input_height
self.overscal_color = overscal_color

width, height = self._convert_string_to_values(string_value)
self._width_value = width
Expand Down Expand Up @@ -1767,16 +1783,22 @@ def video_filters(self):

elif width >= self.input_width and height >= self.input_height:
output.append(
"pad={}:{}:(iw-ow)/2:(ih-oh)/2".format(width, height)
"pad={}:{}:(iw-ow)/2:(ih-oh)/2:{}".format(
width, height, self.overscal_color
)
)

elif width > self.input_width and height < self.input_height:
output.append("crop=iw:{}".format(height))
output.append("pad={}:ih:(iw-ow)/2:(ih-oh)/2".format(width))
output.append("pad={}:ih:(iw-ow)/2:(ih-oh)/2:{}".format(
width, self.overscal_color
))

elif width < self.input_width and height > self.input_height:
output.append("crop={}:ih".format(width))
output.append("pad=iw:{}:(iw-ow)/2:(ih-oh)/2".format(height))
output.append("pad=iw:{}:(iw-ow)/2:(ih-oh)/2:{}".format(
height, self.overscal_color
))

return output

Expand Down
6 changes: 6 additions & 0 deletions openpype/settings/defaults/project_settings/global.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@
]
},
"overscan_crop": "",
"overscan_color": [
0,
0,
0,
255
],
"width": 0,
"height": 0,
"bg_color": [
Expand Down
15 changes: 15 additions & 0 deletions openpype/settings/entities/color_entity.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,17 @@ class ColorEntity(InputEntity):
def _item_initalization(self):
self.valid_value_types = (list, )
self.value_on_not_set = [0, 0, 0, 255]
self.use_alpha = self.schema_data.get("use_alpha", True)

def set_override_state(self, *args, **kwargs):
super(ColorEntity, self).set_override_state(*args, **kwargs)
value = self._current_value
if (
not self.use_alpha
and isinstance(value, list)
and len(value) == 4
):
value[3] = 255

def convert_to_valid_type(self, value):
"""Conversion to valid type.
Expand Down Expand Up @@ -51,4 +62,8 @@ def convert_to_valid_type(self, value):
).format(value)
raise BaseInvalidValueType(reason, self.path)
new_value.append(item)

# Make sure
if not self.use_alpha:
new_value[3] = 255
return new_value
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,16 @@
"key": "overscan_crop",
"label": "Overscan crop"
},
{
"type": "label",
"label": "Overscan color is used when input aspect ratio is not same as output aspect ratio."
},
{
"type": "color",
"label": "Overscan color",
"key": "overscan_color",
"use_alpha": false
},
{
"type": "label",
"label": "Width and Height must be both set to higher value than 0 else source resolution is used."
Expand Down
8 changes: 5 additions & 3 deletions openpype/tools/settings/settings/color_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ def _on_click(self):
self._dialog.open()
return

dialog = ColorDialog(self.input_field.color(), self)
dialog = ColorDialog(
self.input_field.color(), self.entity.use_alpha, self
)
self._dialog = dialog

dialog.open()
Expand Down Expand Up @@ -120,12 +122,12 @@ def paintEvent(self, event):


class ColorDialog(QtWidgets.QDialog):
def __init__(self, color=None, parent=None):
def __init__(self, color=None, use_alpha=True, parent=None):
super(ColorDialog, self).__init__(parent)

self.setWindowTitle("Color picker dialog")

picker_widget = ColorPickerWidget(color, self)
picker_widget = ColorPickerWidget(color, use_alpha, self)

footer_widget = QtWidgets.QWidget(self)

Expand Down
55 changes: 36 additions & 19 deletions openpype/widgets/color_widgets/color_picker_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,12 @@
class ColorPickerWidget(QtWidgets.QWidget):
color_changed = QtCore.Signal(QtGui.QColor)

def __init__(self, color=None, parent=None):
def __init__(self, color=None, use_alpha=True, parent=None):
super(ColorPickerWidget, self).__init__(parent)

# Color triangle
color_triangle = QtColorTriangle(self)

alpha_slider_proxy = QtWidgets.QWidget(self)
alpha_slider = AlphaSlider(QtCore.Qt.Horizontal, alpha_slider_proxy)

alpha_slider_layout = QtWidgets.QHBoxLayout(alpha_slider_proxy)
alpha_slider_layout.setContentsMargins(5, 5, 5, 5)
alpha_slider_layout.addWidget(alpha_slider, 1)

# Eye picked widget
pick_widget = PickScreenColorWidget()
pick_widget.setMaximumHeight(50)
Expand All @@ -47,8 +40,6 @@ def __init__(self, color=None, parent=None):
color_view = ColorViewer(self)
color_view.setMaximumHeight(50)

alpha_inputs = AlphaInputs(self)

color_inputs_color = QtGui.QColor()
col_inputs_by_label = [
("HEX", HEXInputs(color_inputs_color, self)),
Expand All @@ -58,13 +49,17 @@ def __init__(self, color=None, parent=None):
]

layout = QtWidgets.QGridLayout(self)

empty_col = 1
label_col = empty_col + 1
input_col = label_col + 1
empty_widget = QtWidgets.QWidget(self)
empty_widget.setFixedWidth(10)
layout.addWidget(empty_widget, 0, empty_col)

layout.setColumnStretch(0, 1)
layout.setColumnStretch(input_col, 1)

row = 0
layout.addWidget(btn_pick_color, row, label_col)
layout.addWidget(color_view, row, input_col)
Expand All @@ -84,20 +79,41 @@ def __init__(self, color=None, parent=None):
layout.setRowStretch(row, 1)
row += 1

layout.addWidget(alpha_slider_proxy, row, 0)
alpha_label = None
alpha_slider_proxy = None
alpha_slider = None
alpha_inputs = None
if not use_alpha:
color.setAlpha(255)
else:
alpha_inputs = AlphaInputs(self)
alpha_label = QtWidgets.QLabel("Alpha", self)
alpha_slider_proxy = QtWidgets.QWidget(self)
alpha_slider = AlphaSlider(
QtCore.Qt.Horizontal, alpha_slider_proxy
)

alpha_slider_layout = QtWidgets.QHBoxLayout(alpha_slider_proxy)
alpha_slider_layout.setContentsMargins(5, 5, 5, 5)
alpha_slider_layout.addWidget(alpha_slider, 1)

layout.addWidget(alpha_slider_proxy, row, 0)

layout.addWidget(alpha_label, row, label_col)
layout.addWidget(alpha_inputs, row, input_col)

row += 1

layout.addWidget(QtWidgets.QLabel("Alpha", self), row, label_col)
layout.addWidget(alpha_inputs, row, input_col)
row += 1
layout.setRowStretch(row, 1)

color_view.set_color(color_triangle.cur_color)

color_triangle.color_changed.connect(self.triangle_color_changed)
alpha_slider.valueChanged.connect(self._on_alpha_slider_change)
pick_widget.color_selected.connect(self.on_color_change)
alpha_inputs.alpha_changed.connect(self._on_alpha_inputs_changed)
btn_pick_color.released.connect(self.pick_color)
if alpha_slider:
alpha_slider.valueChanged.connect(self._on_alpha_slider_change)
alpha_inputs.alpha_changed.connect(self._on_alpha_inputs_changed)

self.color_input_fields = color_input_fields
self.color_inputs_color = color_inputs_color
Expand Down Expand Up @@ -131,7 +147,8 @@ def color(self):
return self.color_view.color()

def set_color(self, color):
self.alpha_inputs.set_alpha(color.alpha())
if self.alpha_inputs:
self.alpha_inputs.set_alpha(color.alpha())
self.on_color_change(color)

def pick_color(self):
Expand Down Expand Up @@ -163,10 +180,10 @@ def _on_color_input_value_change(self):

def alpha_changed(self, value):
self.color_view.set_alpha(value)
if self.alpha_slider.value() != value:
if self.alpha_slider and self.alpha_slider.value() != value:
self.alpha_slider.setValue(value)

if self.alpha_inputs.alpha_value != value:
if self.alpha_inputs and self.alpha_inputs.alpha_value != value:
self.alpha_inputs.set_alpha(value)

def _on_alpha_inputs_changed(self, value):
Expand Down
2 changes: 2 additions & 0 deletions openpype/widgets/color_widgets/color_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ def draw_checkerboard_tile(piece_size=None, color_1=None, color_2=None):
if piece_size is None:
piece_size = 7

# Make sure piece size is not float
piece_size = int(piece_size)
if color_1 is None:
color_1 = QtGui.QColor(188, 188, 188)

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions website/docs/project_settings/settings_project_global.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ Profile may generate multiple outputs from a single input. Each output must defi
| "-10% -200px" | 1800px 800px |
| "-10% -0px" | 1800px 1000px |

- **`Overscan color`**
- Color of empty area caused by different aspect ratio of input and output.
- By default is set to black color.

- **`Letter Box`**
- **Enabled** - Enable letter boxes
- **Ratio** - Ratio of letter boxes
Expand All @@ -124,6 +128,14 @@ Profile may generate multiple outputs from a single input. Each output must defi
![global_extract_review_letter_box_settings](assets/global_extract_review_letter_box_settings.png)
![global_extract_review_letter_box](assets/global_extract_review_letter_box.png)

- **`Background color`**
- Background color can be used for inputs with possible transparency (e.g. png sequence).
- Input's without possible alpha channel are ignored all the time (e.g. mov).
- Background color slows down rendering process.
- set alpha to `0` to not use this option at all (in most of cases background stays black)
- other than `0` alpha will draw color as background


### IntegrateAssetNew

Saves information for all published subsets into DB, published assets are available for other hosts, tools and tasks after.
Expand Down

0 comments on commit 61f2e5a

Please sign in to comment.